版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 蚃襖聿莇蕿羃膂薂袈羂芄蒞螄羈蒆薀螀羀膆蒃蚆罿羋蠆薂罿莁蒂袀羈肀蚇螆羇膃蒀螞肆芅蚅薈肅莇蒈袇肄肇芁袃肅艿薆蝿肅莂荿蚅肂肁薅薁肁膃莈衿肀芆薃螅腿莈莆蟻膈肈薁薇膇膀莄羆膇莂蝕袂膆蒅蒂螈膅膄蚈蚄螁芇蒁薀螁荿蚆衿袀聿葿螅衿膁蚄蝕袈莃蕆蚆袇蒆莀羅袆膅薆袁裊芇莈螇裊莀薄蚃襖聿莇蕿羃膂薂袈羂芄蒞螄羈蒆薀螀羀膆蒃蚆罿羋蠆薂罿莁蒂袀羈肀蚇螆羇膃蒀螞肆芅蚅薈肅莇蒈袇肄肇芁袃肅艿薆蝿肅莂荿蚅肂肁薅薁肁膃莈衿肀芆薃螅腿莈莆蟻膈肈薁薇膇膀莄羆
2、膇莂蝕袂膆蒅蒂螈膅膄蚈蚄螁芇蒁薀螁荿蚆衿袀聿葿螅衿膁蚄蝕袈莃蕆蚆袇蒆莀羅袆膅薆袁裊芇莈螇裊莀薄蚃襖聿莇蕿羃膂薂袈羂芄蒞螄羈蒆薀螀羀膆蒃蚆罿羋蠆薂罿莁蒂袀羈肀蚇螆羇膃蒀螞肆芅蚅薈肅莇蒈袇肄肇芁袃肅艿薆蝿肅莂荿蚅肂肁薅薁肁膃莈衿肀芆薃螅腿莈莆蟻膈肈薁薇膇膀莄羆膇莂蝕袂膆蒅蒂螈膅膄蚈蚄螁芇蒁薀螁荿蚆衿袀聿葿螅衿膁蚄蝕袈莃蕆蚆袇蒆莀羅袆膅薆袁裊芇莈螇裊莀薄蚃襖聿莇蕿羃膂薂袈羂芄蒞螄羈蒆薀螀羀膆蒃蚆罿羋蠆薂罿莁蒂袀羈肀蚇螆羇膃蒀螞肆芅蚅薈肅莇蒈袇
3、肄肇芁袃肅艿薆蝿肅莂荿蚅肂肁薅薁肁膃莈衿肀芆薃螅腿莈莆蟻膈肈薁薇膇膀莄羆膇莂蝕袂膆蒅蒂螈膅膄蚈蚄螁芇蒁薀螁荿蚆衿袀聿葿螅衿膁蚄蝕袈莃蕆蚆袇蒆莀</p><p> 學校名稱:北京理工大學</p><p> 院(系)名稱:計算機科學與工程系</p><p> 本科生學號:9709004</p><p> 嵌 入 式 瀏 覽 器 開 發(fā)&l
4、t;/p><p> 專 業(yè): 計算機軟件</p><p> 本科生姓名: 高波 </p><p> 指導教師姓名:張麗芬</p><p><b> 摘 要</b></p><p> 本文主要論述了嵌入式瀏覽器開發(fā)所涉及到的技術,對HTML詞法分析、瀏覽器JavaScript
5、支持、linux和gtk編程等做了詳細的分析和介紹,并對Netbit瀏覽器的開發(fā)進行了介紹,分析了主要的模塊的功能和組成,并給出了主要算法。</p><p> 還對典型的嵌入式瀏覽器進行了分析,包括Gzilla,Mozilla,Thunder和zen,總結了瀏覽器設計的技術要點和開發(fā)策略。</p><p> 另外,在論文開頭,介紹了目前嵌入式瀏覽器產品的發(fā)展現狀,嵌入式瀏覽器的組成和各
6、部份功能說明。</p><p> HTML詞法分析是著重討論的技術問題,給出了詳盡的數據結構,程序流程。</p><p> Netbit瀏覽器的開發(fā),是本論文的重點,分模塊進行了分析,提出了需要改進的地方,并給出了改進措施。</p><p> 關鍵詞:嵌入式瀏覽器,HTML詞法分析,Javascript,linux,gtk</p><p&g
7、t;<b> ABSTRACT</b></p><p> This paper is focused on the technology of embedded browser.Html scanner, JavaScript support for browser, linux and gtk programming are deeply discussed.and introduce
8、 the development of Netbit browser, analyse the main module of Netbit, the algorithm is presented. </p><p> what’s more, other typical embedded browsers are analysed, include Gzilla,Mozilla,Thunder and zen,
9、and summarize the important technology and the policy of browser development</p><p> In addition,at the head of the paper,introduce the present status of embedded browser product,the general form of embedde
10、d browser and description of the main parts.</p><p> HTML scanner is an important technological problem, the data structure and the flow of the program are presented.</p><p> The development o
11、f Netbit Browser is mainly discussed,and analysed by module,give the opinion to improve it.</p><p> KEY WORDS:</p><p> embedded browser,HTML token,Javascript,linux,gtk</p><p><
12、b> 目 錄</b></p><p> 引言………………………………………………………………5</p><p> 第一章 嵌入式瀏覽器設計概述 ………………………… 6</p><p> 1.1目前嵌入式瀏覽器產品的發(fā)展現狀 ……………………… 6</p><p> 1.2嵌入式瀏覽器的組成和各部份功能說明 ………
13、………… 8</p><p> 1.3開發(fā)難度分析 ……………………………………………… 9</p><p> 1.4開發(fā)的前期策劃 …………………………………………… 10</p><p> 第二章 HTML詞法分析器的設計及其應用 …………… 12</p><p> 2.1 Bit Token的組成及其功能 ……………………………
14、…12</p><p> 2.2 數據結構 ……………………………………………………12</p><p> 2.3 算法 …………………………………………………………13</p><p> 2.4詞法分析結果示意……………………………………………15</p><p> 2.5 HTML詞法分析的應用 ………………………………………15
15、</p><p> 第三章 瀏覽器JavaScript支持的實現 …………………18</p><p> 3.1基本的JavaScript 開發(fā)環(huán)境 ………………………………18</p><p> 3.2 JavaScript Engine …………………………………………18</p><p> 3.3 JavaScript與瀏覽器接合
16、 ………………………………… 19</p><p> 3.4 瀏覽器消息響應 …………………………………………… 21</p><p> 第四章 Linux程序開發(fā)技術及 GTK圖形程序開發(fā)…… 23</p><p> 4.1 Linux下的程序開發(fā)環(huán)境 ……………………………………23</p><p> 4.2 GTK圖形程序開發(fā)
17、……………………………………………29</p><p> 第五章 Netbit瀏覽器開發(fā)與分析 ……………………… 31</p><p> 5.1 Netbit 瀏覽器簡介 ………………………………………… 31</p><p> 5.2 Netbit Browser瀏覽器各部份的功能 …………………… 31</p><p> 5.3
18、 界面模塊………………………………………………………32</p><p> 5.4 控制模塊………………………………………………………34</p><p> 5.5詞法分析模塊… ………………………………………………34</p><p> 5.6使用PIXMAP的畫圖模塊………………………………………35 </p><p> 5.7
19、文本文件的顯示模塊…………………………………………36</p><p> 5.8 HTML文件的顯示模塊 ……………………………………… 37</p><p> 5.9 Netbit實際應用效果及比較 ……………………………… 40</p><p> 5.10 Netbit Browser的缺點分析及改進辦法 …………………44</p><
20、p> 5.11 Netbit Browser未來的展望 ………………………………48</p><p> 第六章 其它瀏覽器分析…………………………………… 50</p><p> 6.1 Dillo(Gzilla)瀏覽器分析 ……………………………… 50</p><p> 6.2 Thunder瀏覽器分析…………………………………………55<
21、;/p><p> 6.3 Mozilla瀏覽器分析…………………………………………56</p><p> 6.4 ZEN瀏覽器分析………………………………………………57</p><p> 6.5 瀏覽器分析工作的總結………………………………………58</p><p> 致 謝…………………………………………………………… 60<
22、/p><p> 參考文獻表………………………………………………………61</p><p><b> 引 言</b></p><p> 隨著計算機、網絡技術的迅猛發(fā)展,新型的高科技含量的電子產品層出不窮,遍及家電、生產、軍事等各個領域。嵌入式系統因其體積小,速度快而受到重視。在掌上電腦、PDA、手機、導航設備、信息家電領域嵌入式系統被廣泛采用
23、,這也是近期產品研發(fā)的熱點。嵌入式瀏覽器作為重要的嵌入式系統應用軟件,是不可或缺的。但目前,嵌入式瀏覽器產品的市場被少數國外大公司壟斷,眾多的小型嵌入式瀏覽器也尚處于發(fā)展期,而國內的自主技術的嵌入式瀏覽器更屈指可數,剛剛進入實用階段。迫切需要更多的人來關注嵌入式瀏覽器技術,開發(fā)中國自主知識產權的瀏覽器產品。</p><p> 本文闡述了嵌入式瀏覽器開發(fā)的關鍵技術,并詳細說明Netbit Browser的實際開發(fā)
24、過程,技術細節(jié)。并以網站的方式公布了其源代碼,為國內嵌入式瀏覽器的發(fā)展做了有益的嘗試。</p><p> 第一章 嵌入式瀏覽器設計概述</p><p> 1.1目前嵌入式瀏覽器產品的發(fā)展現狀</p><p> 1.1.1桌面瀏覽器簡介及其與嵌入式瀏覽器的區(qū)別:</p><p> 常見的桌面瀏覽器有微軟的Internet Explore
25、r,網景的Netscape,開放源碼的Mozilla,以及opera,mosaic,Hotjava,字符模式的lynx等。其中IE,Opera已有嵌入式版本,以上的大多數瀏覽器均有跨多平臺的版本。這些桌面型瀏覽器功能參差不齊,但大多能實現基本的瀏覽功能。其中IE與Netscape對HTML頁面的顯示效果均堪稱完美(對于XML,WML等標準的網頁瀏覽,本文不予討論)。</p><p> 與完美的瀏覽效果,功能豐富
26、,支持多種媒體格式和視音頻插件等優(yōu)點形成對立的是,這些瀏覽器龐大的體積和對機器配置的高要求。這也是桌面瀏覽器和嵌入式瀏覽器最大的區(qū)別。另外,桌面型瀏覽器通常是基于通用的操作系統,用于桌面電腦如PC機、MAC機等。而嵌入式瀏覽器通?;趯S孟到y。</p><p> 需要指出的是,我們在網上??吹降囊恍┧^的優(yōu)秀瀏覽器,如Netcaptor,魔裝網神,騰訊,颶風,Fantasia,金山WPS office的瀏覽器等
27、等,均為使用IE內核的瀏覽器,使用了多頁面多線程的方式,降低了系統資源的耗費,方便了瀏覽,但軟件本身沒有多少技術可言,可以用Delphi,VB等工具輕易開發(fā)出來(如果不要求完善的功能,只需簡單到拖一個IE控件過去就行了),這也體現了微軟的COM+及ActiveX技術的強大。</p><p> 1.1.2常見嵌入式瀏覽器</p><p> Internet Explorer for Wi
28、nCE,是IE的Windows CE版,這也意味著用戶為了使用它,必須選用基于WinCE平臺的產品,隨著微軟勢力在掌上終端領域的蔓延,WinCE版的IE必將大行其道。</p><p> Access Netfront,Access是日本的瀏覽器大廠,占據了大部份的日本瀏覽器市場,其產品廣泛應用于手持設備、機頂盒、游戲機等產品。其新推出的Netfront Linux版本可以免費下載,網址是:http://www.
29、access.co.jp/product/develop。經試用,發(fā)現Netfront瀏覽效果非常好,對中文的支持和表格的顯示效果,甚至超過Netscape 4.6 for Linux。而且支持鍵盤操作??梢允褂眉^鍵來選擇網址進行跳轉。但顯然為了簡化設計,Netfront使用了一定的權宜手段。比如它不支持使用<font>標記來設置字體,也不支持樣式表,所有字體的大小是固定的,但一般情況不易發(fā)現,不過由于Linux版本不是商
30、業(yè)性版本,無法就此推斷其他版本的特性。Netfront Linux版大小為1.9M,如再加以簡化(比如去掉一些圖片按鈕)可以做的更小。</p><p> Gzilla,現名Dillo,是基于Linux,使用GTK作為GUI平臺開發(fā)的瀏覽器,其開發(fā)目的也包含嵌入式的應用。是開放源碼項目。我們在設計Netbit Browser時主要參考了該瀏覽器的界面設計。該瀏覽器的缺點是不支持表格,布局過于簡單,不支持中文,瀏覽
31、效果比較差,優(yōu)點是網絡功能完善,支持cache緩沖,能夠支持多種圖片格式。網址是:http://www.gzilla.com。</p><p> Viewml,使用FLTK作為GUI平臺開發(fā)的瀏覽器,主要面向嵌入式的應用。是開放源碼項目。使用C++面向對象的設計。因為使用FLTK,所以可以在嵌入式的Micro Window平臺運行,該瀏覽器支持簡單的表格,界面還沒有做(只有一個主窗口),不支持中文,由于FLTK
32、的BUG比較多,我們在實際編譯時經常出錯,即使編譯通過,也常常是還沒運行就core dump了,但曾經由某人編譯成功,基本可用,網址是:http://www.viewml.com。</p><p> ZEN,一個并不知名的嵌入式瀏覽器,但卻十分優(yōu)秀,開放源碼項目,不僅支持表格,支持多種圖像格式,而且在設計上很有特色,將涉及到GUI平臺的部分獨立出來,用戶可以指定不同的GUI平臺運行,內置了對字符,SVGA和GT
33、K的支持,開發(fā)這只需按照相應規(guī)范編寫該軟件的涉及GUI的部份,就可以將其移植到其它GUI平臺,而無須對整個軟件進行修改。缺點是網絡功能比較弱,不支持多線程,另外其必須等到所有圖片下載完畢才開始布局,若某文件傳輸失敗則會導致死鎖,需用戶中斷。網址是:http://www.nocrew.org/software/zen/。</p><p> 以上主要介紹了開放源碼的嵌入式瀏覽器,因為其對本項目具有實際的參考價值。&
34、lt;/p><p> 1.1.3 嵌入式瀏覽器的應用領域</p><p> 嵌入式瀏覽器主要應用于手持終端和信息家電,例如掌上電腦、3G手機、網絡機頂盒、具有網絡功能的其它家電,如可上網的電冰箱等,另外,在軍事等領域也有一定的應用需求。</p><p> 1.2嵌入式瀏覽器的組成和各部份功能說明</p><p> 下面簡介主要的組成部份
35、,其設計原理后面將進行專門論述。</p><p> 1.2.1 詞法分析</p><p> 主要是針對HTML進行詞法分析,該詞法分析器實際是通用的,還可用于XML、WML的詞法分析,只需替換元素名稱即可。</p><p> HTML詞法分析是瀏覽器設計的基礎環(huán)節(jié)之一,也是整個設計過程中重要的前端工作,其數據結構的擬定與接下來的語法分析和布局算法密切相關,詞法
36、分析的效率與準確性、容錯性也關系到整個瀏覽器設計的質量。</p><p><b> 1.2.2語法分析</b></p><p> 在大型的瀏覽器中,語法分析通常是獨立的模塊,但在嵌入式瀏覽器中,語法分析通常是與布局混合在一起的,即一邊進行語法分析,一邊布局,不設立相應的數據結構來存儲語法分析的結果。語法分析對布局的算法有直接的指導意義。</p>&l
37、t;p><b> 1.2.3布局</b></p><p> 本文中的布局應理解為界面輸出前的預演和處理位置等信息的算法,而不是具體的畫圖和界面輸出。布局算法的好壞直接關系到界面的輸出效果,但布局算法也是要根據GUI所能實現的輸出效果來設計的,所以,GUI往往成為系統的瓶頸,如果GUI提供的支持有限,即使有再好的布局算法,也是紙上談兵,無用武之地。</p><p&
38、gt; 1.2.4 GUI及軟件界面</p><p> GUI是指圖形用戶界面,瀏覽器無疑是一個圖形函數庫的大需求者,選擇好的GUI環(huán)境實屬不易,為了能夠實現專有的功能,瀏覽器開發(fā)者往往還要對基礎的GUI庫進行包裝、改寫,甚至寫自己的控件。所有這些,是需要有專業(yè)的GUI庫開發(fā)經驗的專職人員來完成。</p><p> GUI的功勞第一在于軟件的操作界面,如窗口、菜單、工具條、滾動條等
39、。第二在于主瀏覽窗體中的圖形元素的輸出(通常以自畫控件的方式)。前者通常直接使用GUI庫中的已有控件,編程難度很小,后者主要利用基本的點線函數,編程難度比較大。</p><p> JavaScript支持</p><p> 實際上JavaScript的編譯器是開放源碼的,而且全世界通用,包括IE、Mozilla、Netscape等瀏覽器都使用相同的JavaScript的編譯器,但為何其
40、對JavaScript的支持不盡相同呢,這是因為JavaScript在瀏覽器里主要是用于操縱界面元素和與瀏覽器內部命令進行結合。這實際上是程序員努力的結果,而不是JavaScript編譯器的功勞。這其中的機制將在后面專門介紹。</p><p><b> IO</b></p><p> 主要是指通過HTTP協議或文件系統來讀取網頁內容,網絡部份超出了本論文的討論范圍
41、,不予詳述,后面將介紹與網絡部份的接口。</p><p> 以上主要按工作的性質進行分類,介紹了瀏覽器設計的主要幾個部份,但與實際開發(fā)工作的人員劃分不同,實際工作要考慮人員的實際能力和經驗,結合要實現的目標,對各部份的投入也有輕重緩急之分,比如,如果沒有詞法分析的先行實現,語法分析與布局都是紙上談兵。GUI平臺不確定,布局工作也無法展開。</p><p><b> 1.3開發(fā)
42、難度分析</b></p><p> 我們也可以看到,要設計效果較好的瀏覽器產品,決不是三五個人、兩三條槍就能辦到的,參與工作的人員不僅需要有相關經驗,還需要有一定的投入,一方面對程序員艱苦的工作給予鼓勵,另一方面也可能需要購買一些成熟的開發(fā)包,在基礎的開發(fā)平臺、測試平臺上也要有一定的投資,總的來說,開發(fā)自主技術的瀏覽器產品是有一定的風險的,這也是國內目前相關產品為數不多的原因。國外大公司在相關領域的
43、科研與實踐已很成熟,在大量投入之后,其產品已為廣大用戶所接受,國內的企業(yè)若從零做起,也很難追趕。因而買斷技術,加以改進也可以成為快速成長的一條道路。</p><p> 1.4開發(fā)的前期策劃</p><p> 以下的工作均是建立在大量的調查基礎上的。是瀏覽器開發(fā)前期準備工作所解決的問題。</p><p><b> 平臺的選取</b><
44、/p><p> 目前的商業(yè)化嵌入式操作系統功能完善,但使用費用高昂,使用Linux內核的嵌入式操作系統不僅功能強大,便于開發(fā)移植,而且費用低廉,基于Linux的嵌入式系統已日漸成熟,也有相應的窗口系統可以使用,我們使用PC上的Linux來進行瀏覽器開發(fā),是再好不過的了,軟件從PC移植到嵌入式設備只需重新編譯一下就可以了(前提是使用的函數庫、開發(fā)包同時具有PC和嵌入式的版本)。</p><p>
45、;<b> GUI的選取</b></p><p> GUI的選取是頗費腦筋的問題,一方面要考慮嵌入式系統是否有對應的版本,一方面要考慮該GUI的功能是否足夠實用。</p><p> 目前常見的基于Linux的GUI開發(fā)包主要有GTK、FLTK、QT、KDE等,其中FLTK有Micro Window的版本,是比較好的選擇,但使用FLTK開發(fā)的軟件還比較少,對于初學
46、者進入的難度更大,而且目前BUG較多,而GTK比較成熟,使用GTK的軟件比比皆是,資料也很豐富,我們的參考對象Gzilla也使用GTK,也就是說如果使用GTK,將有很好的原型進行參考,這使得GTK對于目前毫無GUI開發(fā)經驗的瀏覽器開發(fā)組而言,充滿了巨大的誘惑??紤]到GUI是可以成為獨立模塊的,如瀏覽器ZEN的設計,我們決定使用GTK,待時機成熟可換用其它平臺,也并非難事。</p><p> 在前期,我們也對FL
47、TK加以了研究,還嘗試了以FLTK為基礎構建GUI中間層的辦法,但由于工作量巨大,初步估算需2萬行程序,而不得不暫緩該計劃。建立GUI中間層在理論上是可行的,這樣,在必要時可以釜底抽薪,替換掉基礎的GUI平臺,應用軟件完全不需修改,但中間層與基礎層的接口要重寫,其工作量也很大,未必是核算的買賣。</p><p> 確定要實現的基本功能</p><p> 鑒于對瀏覽器開發(fā)難度的充分考慮,
48、以及現有人員的水平,擬定實現以下功能,以及需要考慮但暫不予實現的功能。</p><p><b> 需要實現的包括:</b></p><p> (1)界面:包括窗口,菜單,輸入框,工具條,滾動條等的支持。</p><p> (2)詞法分析:必須實現實用的HTML詞法分析,支持HTML4.0全部元素。</p><p&g
49、t; (3)實現簡單網頁的布局:實現對簡單網頁的查看。</p><p> (4)支持基本IO,支持采用線程的網絡傳輸。</p><p><b> 需要考慮的功能:</b></p><p> (1)JavaScript支持</p><p><b> (2)漢字支持</b></p
50、><p> (3)圖片格式支持</p><p><b> (4)表單支持</b></p><p> (5)頁面元素的消息響應</p><p><b> 人員分工</b></p><p> 由于情況的變動,造成了人員比較緊張,在前期準備工作中,人力充沛,使得收集的資
51、料比較完備,打下了較好的基礎。在后期簡化了目標,雖然人員減少,但也能夠實現主要的工作??紤]到網絡是比較獨立的部份,把它分出去由專人負責。</p><p> 第二章 HTML詞法分析器的設計及其應用</p><p> HTML詞法分析是瀏覽器設計的基礎環(huán)節(jié)之一,也是整個設計過程中重要的前端工作,其數據結構的擬定與接下來的語法分析和布局算法密切相關,詞法分析的效率與準確性、容錯性也關系到整
52、個瀏覽器設計的質量。</p><p> 下面將介紹一個HTML詞法分析器——Bit Token的設計思路。</p><p> Bit Token是Netbit Browser的HTML詞法分析器,使用標準C編程,Netbit Browser是基于Linux/Gtk的瀏覽器,開放源碼項目,網址是http://netbit_browser.myetang.com。</p>&
53、lt;p> Bit Token的組成及其功能</p><p> Bit Token作為Netbit Browser的詞法分析部份,負責對接收的HTML代碼進行詞法分析,主要的目的是提取網頁中元素的名稱及其屬性,并以恰當的形式(即按一定的數據結構)加以保存,也就是完成了將數據流離散化、結構化的過程。</p><p> 主要由以下幾個部分組成:</p><p&g
54、t; 初始化:完成對數據結構的初始化,主要是分配內存,變量賦初值。</p><p> 主體的數據流分析:逐字符的進行判斷,確定數據的歸屬類型。</p><p> 元素的分析:提取元素的名稱、屬性和值域。</p><p> 釋放:主要是對內存的釋放。</p><p><b> 數據結構</b></p>
55、<p> typedef struct BitTokenContext</p><p> {char * strBuffer; //當前正在處理的HTML代碼</p><p> int bufferLength;</p><p> int curPosition;</p><p> char * gl
56、obal_strBuffer; //全局HTML代碼</p><p> int global_bufferLength;</p><p> int global_curPosition;</p><p> BitTokenList *tokenList; //元素節(jié)點鏈表</p><p> BitTokenList *
57、tokenList_tail;</p><p> BitPTagListpTagList;//元素名稱表,指向靜態(tài)數據</p><p> }BitTokenContext,*BitPTokenContext;</p><p> BitTokenContext是用于存儲當前待分析網頁全局屬性的數據結構,其中TokenList是核心的元素節(jié)點鏈表。詞法分析的
58、目的就是生成這樣一個鏈表。下面給出該鏈表的數據結構,是很簡單的雙向鏈表。</p><p> typedef struct TokenList</p><p> { BitToken *token; //元素節(jié)點</p><p> struct TokenList *priou;</p><p> struct TokenList *
59、next;</p><p> }BitTokenList,*BitPTokenList;</p><p> 以下是元素節(jié)點的數據結構:</p><p> typedef struct BitToken</p><p> {int type; //節(jié)點類型,如定義的HTML_BODY,HTML_TXT等。</p>&l
60、t;p> char *pData; //如果是HTML_TXT型元素,則為其內容,否則為空</p><p> BOOL end; //是否是結束元素,如</body></p><p> BitTokenAttrList *attrList; //元素屬性鏈表,因為可能有多個屬性,所以使用鏈表存儲</p><p> BitTokenAtt
61、rList *attrList_tail;</p><p> }BitToken,*BitPToken;</p><p> 請注意,以上出現tail標記的指針變量,如BitTokenList * tokenList_tail等,其作用是用于保存鏈表結尾節(jié)點指針,便于在釋放內存時,直接找到鏈尾,提高了算法的效率。</p><p><b> 算法<
62、/b></p><p> 2.3.1 基本算法:</p><p> 首先介紹基本的算法:</p><p> (1) 從存儲網頁的字符串中,順序讀入一個字符</p><p> (2) 如果遇到 < ,認為遇到TAG(元素),處理該元素,使用函數Token_ConsumTag(),處理完畢后,指針移到該元素尾。</p&g
63、t;<p> (3) 如果遇到回車、空格,則跳過。</p><p> (4) 如果遇到 > ,則跳過(不應該出現此情況,為了容錯)。</p><p> (5) 如果非以上情況,則認為遇到文字,處理這段文字,使用函數Token_Consum_PlainText()。處理完畢,指針指向下一個元素首。</p><p> (6) 循環(huán)以上操作,直
64、到該網頁分析完畢。</p><p> 由此看來,主算法十分簡單而清晰,主要是Token_ConsumTag()和Token_Consum_PlainText()這兩個函數起關鍵作用,由于其中涉及到許多細節(jié)問題,此處不予詳述。</p><p> 2.3.2 算法效率與改進:</p><p> 采用以上的基本算法,是可用的,但當網頁比較大的時候,比如600K,該算
65、法的效率成倍下降,這主要是由于要處理的字符串太大,在內存中完成查找、替換、復制、移動等操作,響應時間明顯下降。對此的改進辦法就是分段進行詞法分析,不僅極大的提高了效率(在某些情況下約提高30倍),也有利于瀏覽器整體設計,因為當網頁較大時,若等待全部內容傳輸完畢,再一次性完成詞法分析和布局,用戶會感到等待時間過長,一般現在成熟的瀏覽器都采用邊傳輸,邊分析,邊顯示。</p><p> 分段進行詞法分析的算法復雜度明
66、顯增加,比如,當每段定為1024字節(jié),在第1024字節(jié)處,可能正好將一個完整元素截斷,按常規(guī)分析方法會造成錯誤。解決的辦法是,采用回溯,確認要分析的部份至少包含1個完整元素。</p><p> 具體做法是:判斷1024字節(jié)處是否為元素結束字符 ‘>’,如果不是,則判斷前一個字節(jié),直到找到元素結束字符為止,這樣可保證至少包含一個元素。</p><p> 采用分段進行詞法分析,實際每
67、次分析的代碼會不足1024字節(jié),余下的部份匯入到下一段的分析過程即可,直到所有內容被分析完畢。</p><p> 2.4詞法分析的結果</p><p> 下面是一段很簡單的HTML代碼。</p><p><b> <html></b></p><p> <img src=“go.gif” wid
68、th=200 height=100></p><p> <a HREF="http://www.263.net">首都在線</a></p><p><b> </html></b></p><p> 分析后,數據存儲結構如下</p><p><b&
69、gt; ?。?lt;/b></p><p> 可以看到,詞法分析的結果是一個元素節(jié)點鏈表,每個節(jié)點的屬性也形成了一個鏈表,元素節(jié)點是有先后順序的,元素屬性的先后順序是無所謂的。</p><p> 詞法分析將網頁的文本數據流以清晰的結構表現出來,這樣,在后面的應用中就可以很容易的遍歷各節(jié)點,并輕松地獲得各元素節(jié)點的屬性。</p><p> 2.5 HTML
70、詞法分析的應用</p><p> 2.5.1 應用舉例:</p><p> HTML詞法分析程序通常應用于瀏覽器設計、網頁制作軟件設計等領域,本人以一個使用VC開發(fā)的軟件“HTML智能分析”來舉例說明,下載網址:</p><p> http://netbit_browser.myetang.com/introduce.html。</p><
71、p> “HTML智能分析”同樣使用Bit Token詞法分析器,“HTML智能分析”是一個網頁信息提取、處理軟件。</p><p><b> 具有以下主要功能:</b></p><p> 1、智能提取網頁中的文字信息,智能排版,并可在進行編輯后保存。</p><p> 2、統計網頁的有關信息。</p><p&g
72、t; 3、根據用戶設置的版式,將分析和編輯的結果,自動生成新的網頁。</p><p> 用戶可使用該軟件來將HTML轉為TXT格式,其對HTML中文字內容的提取準確、快速、不含冗余信息,版式工整清晰,保持本來面貌。</p><p> 其主要設計思路是,在Bit Token詞法分析器的基礎上,結合瀏覽器布局的基本算法,對影響到TXT版面效果的元素進行處理。</p><
73、;p> 比如<PRE>標記,代表所包含的內容瀏覽器應不予分析,按TXT格式輸出,而如表格<TR>等元素則意味著需要換行。而在HTML中,在無<PRE>這種特殊情況時,回車都是忽略不記的。這就造成了矛盾。使用常規(guī)的簡單算法進行HTML到TXT的轉換無法解決這些問題。造成轉換后的版式“失真“。而“HTML智能分析”卻能很好的解決。</p><p> 由于“HTML智能分析
74、”使用了底層的詞法分析技術,還可以很容易的過濾掉<SCRIPT>與<STYLE>(樣式表)。并可以對網頁中的元素進行統計和語法校驗。</p><p> 以下是該程序的片斷:</p><p> pTtokenList=global_cx->tokenList; //取首節(jié)點</p><p> while(pTtokenList!=N
75、ULL) //循環(huán)直至處理完所有節(jié)點</p><p><b> {</b></p><p> switch(pTtokenList->token->type)</p><p> {//根據節(jié)點類型,做不同的處理</p><p> case HTML_TITLE: ……</p><p
76、> case HTML_TEXT: ……</p><p> default: ……</p><p> } //switch</p><p> pTtokenList=pTtokenList->next; //取下一個節(jié)點</p><p><b> } //while</b></p>
77、<p> 這段程序實際上就是一個簡單的語法分析和布局的過程。</p><p> 2.5.2 Bit Token在應用中存在的問題及修改意見</p><p> 由于HTML的標記多是成對出現的,并且存在<SCRIPT>這樣的特殊元素,其內容為Javascript程序,函數的字符串參數等可能包含其它的元素標記。例如語句:Alert(“<font>
78、is a tag”);</p><p> 因此,在詞法分析時要對<SCRIPT>標記進行特殊處理,遇到<SCRIPT>就應逐字符讀入后面的內容,直到遇到下一個</SCRIPT>標記。目前的Bit Token由于開發(fā)時間所限,未對其加以特殊處理,存在一些問題,但由于瀏覽器對Javascript的支持是較復雜的工作,目前的Netbit Browser尚不予實現,因而沒有導致明顯問
79、題,而“HTML智能分析”這個軟件只是需要對Javascript進行刪除操作,也不會造成影響。盡管如此,對<SCRIPT>的特殊處理還是有待完善,盡管這同時也會帶來一些問題,需要進行大量的測試,來保證新加入代碼的穩(wěn)定性。</p><p> 正如前面所述,HTML詞法分析是瀏覽器設計的基礎環(huán)節(jié)之一,但并非最重要和最具難度的環(huán)節(jié),若想開發(fā)出效果較好的瀏覽器產品,還要在布局和GUI設計上多下功夫。<
80、/p><p> 第三章 瀏覽器JavaScript支持的實現</p><p> 本部份主要針對Mozilla和Netscape瀏覽器源代碼的JavaScript部份進行了分析,闡述了瀏覽器Javascript實現的機制。</p><p> 3.1基本的JavaScript 開發(fā)環(huán)境</p><p> JavaScript Referenc
81、e與JavaScript API:</p><p> JavaScript Reference是Mozilla所使用JavaScript開發(fā)環(huán)境,是使用ANSI C的獨立的開發(fā)包,據Mozilla文檔介紹,該開發(fā)包涉及到超過160家公司的版權。而且被廣泛使用,實際已成為了進行JavaScript應用開發(fā)的標準平臺。</p><p> JavaScript Reference可以用于建立
82、包含JavaScript runtime的Library或 DLL。既可以編譯成小的 "shell" 程序(像早期的BASIC),又連接Library后生成交互式的JavaScript解釋器,也可以用來解釋.js 文件。由于使用了ANSI C編程,可以用VC、GCC等編譯器在不同平臺下編譯。</p><p> 生成的"shell" 程序,對比瀏覽器對JavaScript的
83、支持,相同之處是使用相同的包含JavaScript runtime的Library 或 DLL,我們把這部份相同的Library或 DLL稱為JavaScript API,我們實際開發(fā)JavaScript應用,也是在JavaScript API基礎上工作,而不用過多考慮其內部的實現。關于JavaScript API,參見JavaScript API詳解。JavaScript API實際就是Javscript解釋器的對外接口函數庫。<
84、;/p><p> JavaScript Engine</p><p> JavaScript Engine是瀏覽器開發(fā)者為了利用JavaScript API來實現實際應用而設立的中間層,用于初始化JavaScript環(huán)境,提供對JavaScript解釋、執(zhí)行的接口。瀏覽器主體程序的設計者可以通過JavaScript Engine,方便的實現各種應用,畢竟JavaScript API太基礎了
85、,直接使用不太方便。</p><p> 下面介紹JavaScript Engine的主要功能和實現方法。這也包含了利用JavaScript API進行應用的基本思路。</p><p><b> (1) 初始化:</b></p><p> 內存分配:rt=JS_Init(10000L);</p><p> 初始化c
86、x:cx = JS_NewContext(rt, STACK_CHUNK_SIZE);</p><p> 初始化globalObj:globalObj = JS_NewObject(cx, &globalClass, 0, 0);</p><p> 定義標準類:JS_InitStandardClasses(cx, globalObj);</p><p>
87、 定義系統函數:JS_DefineFunctions(cx, globalObj, g_functions);</p><p> 定義報錯函數:JS_SetErrorReporter(cx,JS_ErrorReporter);</p><p><b> 注冊其它類:</b></p><p> RegisterClassPoint(c
88、x,globalObj);</p><p> RegisterClassSize(cx,globalObj);</p><p> RegisterClassRect(cx,globalObj);</p><p> RegisterClassPolygon(cx,globalObj);</p><p> RegisterCla
89、ssColorKey(cx,globalObj);</p><p> RegisterClassTDTimer(cx,globalObj);</p><p> 初始化定時器:TDTimerListInit();</p><p> (2) 提供對JavaScript解釋、執(zhí)行的接口函數:</p><p> TD_EvaluateSc
90、ript(JSContext *cx,JSObject *obj, const char *bytes, uintN length,const char *filename, uintN lineno,jsval *rval)</p><p> JavaScript與瀏覽器接合</p><p> 基本概念:JavaScript操作HTML元素的常見方式</p><p
91、><b> 例:</b></p><p> <html><head></p><p> <script><!--</p><p> function ChangeImage(index)</p><p> {image0.src="a"+ind
92、ex+".gif";}</p><p> --></script></p><p><b> </head></b></p><p> <a onmouseover="ChangeImage(0);">軍人</a><br></p
93、><p> <a onmouseover="ChangeImage(1);">眼睛</a><br></p><p> <img id="image0" src="a0.gif"></img></p><p><b> </html
94、></b></p><p> 當鼠標移到文字上時,觸發(fā)事件mouseover,調用ChangeImage()函數,使得圖像源(SRC)發(fā)生變化,重新調入新圖片。</p><p> 由此產生兩個關鍵問題:</p><p> javascript如何獲取HTML元素的名稱和屬性。</p><p> javascript如
95、何改變HTML元素的屬性,并操作WIDGET重畫。</p><p> 下面分別闡述這兩個問題:</p><p> 首先介紹涉及到的瀏覽器流程:</p><p> 問題1解決:HTML元素作為Javascript對象進行注冊。</p><p> 注冊過程在BuildModel中進行。BuildModel的首要任務是將Token后的結點按
96、包含關系展成一棵樹。其次就是要將某些結點注冊為JavaScript對象。</p><p><b> 注冊的過程是:</b></p><p> 定義新對象:JSObject *proto;</p><p><b> 初始化該對象:</b></p><p> TD_JSXMLElementCla
97、ssInit(JS_GetGlobalContext(),</p><p> (void **)&proto))</p><p> 使用JS_DefineObject或JS_NewObject定義對象屬性:</p><p> 根據是否定義了該元素的名稱區(qū)別對待:</p><p> if(TD_XMLContentIsNamed
98、Item(aElement,&aName))</p><p> {parent = js_GetGlobalObject();</p><p> *aReturn=JS_DefineObject(JS_GetGlobalContext(),js_GetGlobalObject(),aName->mStr,&ElementClass,proto,JSPROP_EN
99、UMERATE);</p><p><b> }</b></p><p><b> else</b></p><p> {parent=aElement->parent->mScriptObject;</p><p> *aReturn = JS_NewObject(JS_Ge
100、tGlobalContext(), &ElementClass, proto, parent);</p><p><b> }</b></p><p><b> 將對象加入:</b></p><p> JS_SetPrivate(JS_GetGlobalContext(), (JSObject *)*aRet
101、urn, aElement);這樣,在編譯時,HTML元素的標識就能被Javascript編譯器識別,否則會報錯變量未定義。</p><p> 問題2解決:利用注冊給對象的函數實現操作符的功能化。</p><p> 具體可理解為:當image0.src=”1.gif”被執(zhí)行時,相當于為對象設置或改變屬性,此時SetElementProperty函數被調用(該函數在注冊該對象時由JSXM
102、LElementClassInit捆綁給該對象,其內容由用戶自己定義),SetElementProperty通過函數指針調用函數TD_JSXMLSetAtrByID,改變結點樹上結點屬性,并重新生成該節(jié)點對應的widget,重畫界面。</p><p> 問題3:如何建立Javascript對象與結點樹上結點的對應?</p><p> 解決: Javascript對象與結點樹是同時生成的
103、,它們的共同性質是結點具有相同屬性,Javascript對象根據ID屬性查找樹,找到要操作的對應結點。</p><p><b> 瀏覽器消息響應</b></p><p> 在主消息循環(huán)中調用TDWidgetProcessMsg,處理與widget有關消息。</p><p> 首先:取得當前焦點所在的widget</p>&l
104、t;p> pWidget=TDWidgetGetAtPoint(pThis->baseDoc.base.mWidget,pt,&index);</p><p> 處理該widget對該消息的響應。</p><p> 最后一般為調用JavaScript執(zhí)行,實現實際響應。</p><p> TDVOID TDWidgetDoAction(
105、TDPWidgetAction pAnchor)</p><p><b> {</b></p><p> jsval jval;</p><p> if(pAnchor)</p><p> TD_EvaluateScript(JS_GetGlobalContext(),js_GetGlobalObject(),&
106、lt;/p><p> pAnchor->mAction.mStr,pAnchor->mAction.mLength,TDNULL,0,&jval);</p><p><b> }</b></p><p> 其中pAnchor->mAction.mStr即為界面對象(widget)對應的JavaScript源碼,解釋執(zhí)
107、行的結果就是調用為該對象注冊的函數來重畫該widget,從而實現動態(tài)效果。</p><p> 第四章 Linux程序開發(fā)技術及 GTK圖形程序開發(fā)</p><p> Linux下的程序開發(fā)環(huán)境</p><p><b> 4.1.1基本知識</b></p><p> (1) 標準 (ANSI C, POSIX,
108、SVID, XPG, ...)ANSI C:這一標準是 ANSI(美國國家標準局)于 1989 年制定的 C 語言標準。 后來被 ISO(國際標準化組織)接受為標準,因此也稱為 ISO C。</p><p> POSIX:該標準最初由 IEEE 開發(fā)的標準族,部分已經被 ISO 接受為國際標準。</p><p> SVID:System V 的接口描述。System V 接口描述
109、(SVID)是描述 AT&T Unix System V 操作 系統的文檔,是對 POSIX 標準的擴展超集。</p><p> XPG:X/Open 可移植性指南。X/Open 可移植性指南(由 X/Open Company, Ltd.出版), 是比 POSIX 更為一般的標準。</p><p> (2) 函數庫和系統調用 glibc:眾所周知,C 語言并沒有為常見的操作
110、,例如輸入/輸出、內存管理,字符串操作等提供內置的支持。相反,這些功能一般由標準的“函數庫”來提供。GNU 的 C 函數庫,即 glibc,是 Linux 上最重要的函數庫,它定義了 ISO C 標準指定的所有的庫函數,以及由 POSIX 或其他 UNIX 操作系統變種指定的附加特色,還包括有與 GNU 系統相關的擴展。目前,流行的 Linux 系統使用 glibc 2.0 以上的版本。glibc 基于如下標準:ISO C: C 編程語
111、言的國際標準,即 ANSI C,POSIX,Berkeley Unix,SVID,XPG。</p><p> 其他重要函數庫:除 glibc 之外,流行的 Linux 發(fā)行版中還包含有一些其他的函數庫,這些函數庫具有重要地位,例如:GNU Libtool,CrackLib,LibGTop。圖形文件操作函數庫包括: libungif、libtiff、libpng、Imlib, libjpeg 等,可分別用來操作
112、GIF、TIFF、PNG、JPEG 以及其他一些格式圖形文件。</p><p><b> (3) 系統調用</b></p><p> 系統調用是操作系統提供給外部程序的接口。在 C 語言中,操作系統的系統調用通常通過函數調用的形式完成,在 Linux 系統中,系統調用函數定義在 glibc 中。</p><p> 談到系統調用時,需要
113、注意如下幾點:系統調用函數通常在成功時返回 0 值,不成功時返回非零值。errno 中包含有錯誤代碼。系統調用是一個非常耗時 的過程。(4) C 語言編程風格 良好的編程風格可以在許多方面幫助開發(fā)人員,可以增加代碼的可讀性,并幫助你理清頭緒。編程風格最能體現一個程序員的綜合素質。</p><p> 在 Linux 中,我們經??吹降氖嵌x非常簡單的函數接口和變量名稱。C 語言最初來自 UNIX 操作系統
114、,與 UNIX 的設計原則一樣,C 語言被廣泛認可和使用的一個重要原因是它的靈活性以及簡潔性。在利用 C 語言編寫程序時,應當符合其簡潔的設計原則,而不應當使用非常復雜的變量命名方法。Linus 為 Linux 內核定義的 C 語言編碼風格要點如下:</p><p> 縮進時,使用長度為 8 個字符寬的 Tab 鍵。如果程序的縮進超過 3 級,則應考慮重新設計程序。</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 多功能圖像瀏覽器制作畢業(yè)論文
- java瀏覽器課程設計--web瀏覽器開發(fā)
- 2017畢業(yè)論文-基于c#的圖片瀏覽器設計
- 瀏覽器內核詳解
- 瀏覽器內核詳解
- [vc++畢設]瀏覽器(論文+源碼)
- eclipse瀏覽器制作
- 瀏覽器內核介紹
- 設置默認瀏覽器
- 基于Android的DICOM瀏覽器的開發(fā).pdf
- 不動端瀏覽器設計
- 嵌入式瀏覽器的研究與開發(fā)
- 瀏覽器完美呈現藏文
- 速度 最快的瀏覽器
- 瀏覽器中的xml
- 可信網絡瀏覽器的研究與開發(fā).pdf
- 基于java網絡瀏覽器的開發(fā)與實現
- 基于android平臺的uc瀏覽器開發(fā)與實現
- qq瀏覽器產品介紹
- 實用PACS瀏覽器應用系統設計與開發(fā).pdf
評論
0/150
提交評論