版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于嵌入式系統(tǒng)的瀏覽器設(shè)計(jì)與實(shí)現(xiàn)學(xué)生:xx 指導(dǎo)老師:xx摘要:隨著計(jì)算機(jī)、網(wǎng)絡(luò)技術(shù)的迅猛發(fā)展,新型的高科技含量的電子產(chǎn)品層出不窮,遍及家電、生產(chǎn)、軍事等各個(gè)領(lǐng)域。嵌入式系統(tǒng)因其體積小,速度快而受到重視。在掌上電腦、PDA、手機(jī)、導(dǎo)航設(shè)備、信息家電領(lǐng)域嵌入式系統(tǒng)被廣泛采用,這也是近期產(chǎn)品研發(fā)的熱點(diǎn)。嵌入式瀏覽器作為重要的嵌入式系統(tǒng)應(yīng)用軟件,是不可或缺的。本文主要論述了嵌入式瀏覽器開發(fā)所涉及到的技術(shù),對(duì)HTML詞法分析、瀏覽器JavaScript支持、linux和gtk編程等做了詳細(xì)的分析和介紹,并對(duì)Netbit瀏覽器的開發(fā)進(jìn)行了介紹,分析了主要的模塊的功能和組成,并給出了主要算法。介紹了目前嵌入式瀏覽器產(chǎn)品的發(fā)展現(xiàn)狀,嵌入式瀏覽器的組成和各部份功能說明。HTML詞法分析是著重討論的技術(shù)問題,給出了詳盡的數(shù)據(jù)結(jié)構(gòu),程序流程。Netbit瀏覽器的開發(fā),是本論文的重點(diǎn),分模塊進(jìn)行了分析,提出了需要改進(jìn)的地方,并給出了改進(jìn)措施。關(guān)鍵詞:嵌入式瀏覽器,HTML詞法分析,Javascript,linux,gtkThedesignandimplementationofbrowserBasedonembeddedsystemStudent:xxguideInstructor:xxSummary:withthecomputer,therapiddevelopmentofInternettechnology,thenewhigh-techelectronicproductemergeinendlessly,throughoutthehomeappliance,production,militaryandotherfields.Theembeddedsystembecauseofitssmallvolume,fasterandmoreattention.InaPDA,PDA,mobilephones,navigationequipment,informationhomeappliancesfieldembeddedsystemtobeusedextensively,thisisthehotspotintheresearchofproducts.Embeddedbrowserasanimportantmeansofembeddedsystemsoftwareapplication,isindispensable.Thispaperdiscussestheembeddedbrowserdevelopmentinvolvedintechnology,toHTMLbrowserJavaScriptmorphologyanalysis,supportandLinuxandGTKprogrammingetctodoadetailedanalysisandintroduced,andthedevelopmentofNetbitbrowsersareintroduced,analyzedthemainmodulefunctionandcomposition,andgivesthemainalgorithms.Introducesthepresentembeddedbrowserproductdevelopmentpresentsituation,embeddedbrowsercompositionanddifferentpartsoffunctionalspecification.HTMLlexicalanalysisarediscussedemphaticallythetechnicalproblems,andgivesthedetaileddatastructure,processes.Netbitbrowserdevelopment,isthekey,thisthesispointsmoduleareanalyzedandsomeareasinneedofimprovement,andgivesthemeasurestoimprove.Keywords:embeddedHTMLbrowsers,lexicalanalysis,Javascript,Linux,GTK目錄1引言 71.1目前嵌入式瀏覽器產(chǎn)品的發(fā)展現(xiàn)狀 71.2課程設(shè)計(jì)任務(wù)和主要內(nèi)容 82HTML詞法分析器的設(shè)計(jì)及其應(yīng)用 92.1 BitToken的組成及其功能 92.2 數(shù)據(jù)結(jié)構(gòu) 92.3 算法 102.4HTML詞法分析的應(yīng)用 113瀏覽器JavaScript支持的實(shí)現(xiàn) 123.1JavaScriptEngine 123.2JavaScript與瀏覽器接合 133.3瀏覽器的響應(yīng) 134Netbit瀏覽器開發(fā)與分析 154.1NetbitBrowser瀏覽器各部份的功能 154.2各模塊的實(shí)現(xiàn) 154.3Netbit實(shí)際應(yīng)用效果及比較 234.4NetbitBrowser的缺點(diǎn)分析及改進(jìn)辦法 275總結(jié) 29致謝 30參考文獻(xiàn) 31 1引言隨著計(jì)算機(jī)、網(wǎng)絡(luò)技術(shù)的迅猛發(fā)展,新型的高科技含量的電子產(chǎn)品層出不窮,遍及家電、生產(chǎn)、軍事等各個(gè)領(lǐng)域。嵌入式系統(tǒng)因其體積小,速度快而受到重視。在掌上電腦、PDA、手機(jī)、導(dǎo)航設(shè)備、信息家電領(lǐng)域嵌入式系統(tǒng)被廣泛采用,這也是近期產(chǎn)品研發(fā)的熱點(diǎn)。嵌入式瀏覽器作為重要的嵌入式系統(tǒng)應(yīng)用軟件,是不可或缺的。但目前,嵌入式瀏覽器產(chǎn)品的市場(chǎng)被少數(shù)國(guó)外大公司壟斷,眾多的小型嵌入式瀏覽器也尚處于發(fā)展期,而國(guó)內(nèi)的自主技術(shù)的嵌入式瀏覽器更屈指可數(shù),剛剛進(jìn)入實(shí)用階段。迫切需要更多的人來關(guān)注嵌入式瀏覽器技術(shù),開發(fā)中國(guó)自主知識(shí)產(chǎn)權(quán)的瀏覽器產(chǎn)品。本文闡述了嵌入式瀏覽器開發(fā)的關(guān)鍵技術(shù),并詳細(xì)說明NetbitBrowser的實(shí)際開發(fā)過程,技術(shù)細(xì)節(jié)。初步實(shí)現(xiàn)了預(yù)期目標(biāo),經(jīng)改善后可投入使用。1.1目前嵌入式瀏覽器產(chǎn)品的發(fā)展現(xiàn)狀常見的桌面瀏覽器有微軟的InternetExplorer,網(wǎng)景的Netscape,開放源碼的Mozilla,以及opera,mosaic,Hotjava,字符模式的lynx等。其中IE,Opera已有嵌入式版本,以上的大多數(shù)瀏覽器均有跨多平臺(tái)的版本。這些桌面型瀏覽器功能參差不齊,但大多能實(shí)現(xiàn)基本的瀏覽功能。其中IE與Netscape對(duì)HTML頁面的顯示效果均堪稱完美(對(duì)于XML,WML等標(biāo)準(zhǔn)的網(wǎng)頁瀏覽,本文不予討論)。與完美的瀏覽效果,功能豐富,支持多種媒體格式和視音頻插件等優(yōu)點(diǎn)形成對(duì)立的是,這些瀏覽器龐大的體積和對(duì)機(jī)器配置的高要求。這也是桌面瀏覽器和嵌入式瀏覽器最大的區(qū)別。另外,桌面型瀏覽器通常是基于通用的操作系統(tǒng),用于桌面電腦如PC機(jī)、MAC機(jī)等。而嵌入式瀏覽器通常基于專用系統(tǒng)。需要指出的是,我們?cè)诰W(wǎng)上常看到的一些所謂的優(yōu)秀瀏覽器,如Netcaptor,騰訊,颶風(fēng),F(xiàn)antasia,金山WPSoffice的瀏覽器等等,均為使用IE內(nèi)核的瀏覽器,使用了多頁面多線程的方式,降低了系統(tǒng)資源的耗費(fèi),方便了瀏覽,但軟件本身沒有多少技術(shù)可言,可以用Delphi,VB等工具輕易開發(fā)出來(如果不要求完善的功能,只需簡(jiǎn)單到拖一個(gè)IE控件過去就行了),這也體現(xiàn)了微軟的COM+及ActiveX技術(shù)的強(qiáng)大。嵌入式瀏覽器主要應(yīng)用于手持終端和信息家電,例如掌上電腦、3G手機(jī)、網(wǎng)絡(luò)機(jī)頂盒、具有網(wǎng)絡(luò)功能的其它家電,如可上網(wǎng)的電冰箱等,另外,在軍事等領(lǐng)域也有一定的應(yīng)用需求。目前的商業(yè)化嵌入式操作系統(tǒng)功能完善,但使用費(fèi)用高昂,使用Linux內(nèi)核的嵌入式操作系統(tǒng)不僅功能強(qiáng)大,便于開發(fā)移植,而且費(fèi)用低廉,基于Linux的嵌入式系統(tǒng)已日漸成熟,也有相應(yīng)的窗口系統(tǒng)可以使用,我們使用PC上的Linux來進(jìn)行瀏覽器開發(fā),是再好不過的了,軟件從PC移植到嵌入式設(shè)備只需重新編譯一下就可以了(前提是使用的函數(shù)庫、開發(fā)包同時(shí)具有PC和嵌入式的版本)。1.2課程設(shè)計(jì)任務(wù)和主要內(nèi)容需要實(shí)現(xiàn)的包括:(1) 界面:包括窗口,菜單,輸入框,工具條,滾動(dòng)條等的支持。(2) 詞法分析:必須實(shí)現(xiàn)實(shí)用的HTML詞法分析,支持HTML4.0全部元素。(3) 實(shí)現(xiàn)簡(jiǎn)單網(wǎng)頁的布局:實(shí)現(xiàn)對(duì)簡(jiǎn)單網(wǎng)頁的查看。(4) 支持基本IO,支持采用線程的網(wǎng)絡(luò)傳輸。需要考慮的功能:(1) JavaScript支持(2) 漢字支持(3) 圖片格式支持(4) 表單支持(5) 頁面元素的消息響應(yīng)2HTML詞法分析器的設(shè)計(jì)及其應(yīng)用HTML詞法分析是瀏覽器設(shè)計(jì)的基礎(chǔ)環(huán)節(jié)之一,也是整個(gè)設(shè)計(jì)過程中重要的前端工作,其數(shù)據(jù)結(jié)構(gòu)的擬定與接下來的語法分析和布局算法密切相關(guān),詞法分析的效率與準(zhǔn)確性、容錯(cuò)性也關(guān)系到整個(gè)瀏覽器設(shè)計(jì)的質(zhì)量。2.1 BitToken的組成及其功能BitToken作為NetbitBrowser的詞法分析部份,負(fù)責(zé)對(duì)接收的HTML代碼進(jìn)行詞法分析,主要的目的是提取網(wǎng)頁中元素的名稱及其屬性,并以恰當(dāng)?shù)男问剑窗匆欢ǖ臄?shù)據(jù)結(jié)構(gòu))加以保存,也就是完成了將數(shù)據(jù)流離散化、結(jié)構(gòu)化的過程。主要由以下幾個(gè)部分組成:(1)初始化:完成對(duì)數(shù)據(jù)結(jié)構(gòu)的初始化,主要是分配內(nèi)存,變量賦初值。(2)主體的數(shù)據(jù)流分析:逐字符的進(jìn)行判斷,確定數(shù)據(jù)的歸屬類型。(3)元素的分析:提取元素的名稱、屬性和值域。(4)釋放:主要是對(duì)內(nèi)存的釋放。2.2 數(shù)據(jù)結(jié)構(gòu)typedefstructBitTokenContext{char*strBuffer; //當(dāng)前正在處理的HTML代碼intbufferLength;intcurPosition;char*global_strBuffer; //全局HTML代碼intglobal_bufferLength;intglobal_curPosition;BitTokenList*tokenList; //元素節(jié)點(diǎn)鏈表BitTokenList*tokenList_tail;BitPTagList pTagList; //元素名稱表,指向靜態(tài)數(shù)據(jù)}BitTokenContext,*BitPTokenContext;BitTokenContext是用于存儲(chǔ)當(dāng)前待分析網(wǎng)頁全局屬性的數(shù)據(jù)結(jié)構(gòu),其中TokenList是核心的元素節(jié)點(diǎn)鏈表。詞法分析的目的就是生成這樣一個(gè)鏈表。下面給出該鏈表的數(shù)據(jù)結(jié)構(gòu),是很簡(jiǎn)單的雙向鏈表。typedefstructTokenList{BitToken*token; //元素節(jié)點(diǎn)structTokenList*priou;structTokenList*next;}BitTokenList,*BitPTokenList;以下是元素節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu):typedefstructBitToken{inttype; //節(jié)點(diǎn)類型,如定義的HTML_BODY,HTML_TXT等。char*pData;//如果是HTML_TXT型元素,則為其內(nèi)容,否則為空BOOLend; //是否是結(jié)束元素,如</body>BitTokenAttrList*attrList;//元素屬性鏈表,因?yàn)榭赡苡卸鄠€(gè)屬性,所以使用鏈表存儲(chǔ)BitTokenAttrList*attrList_tail;}BitToken,*BitPToken;2.3 算法基本算法:首先介紹基本的算法:(1)從存儲(chǔ)網(wǎng)頁的字符串中,順序讀入一個(gè)字符(2)如果遇到<,認(rèn)為遇到TAG(元素),處理該元素,使用函數(shù)Token_ConsumTag(),處理完畢后,指針移到該元素尾。(3)如果遇到回車、空格,則跳過。(4)如果遇到>,則跳過(不應(yīng)該出現(xiàn)此情況,為了容錯(cuò))。(5)如果非以上情況,則認(rèn)為遇到文字,處理這段文字,使用函數(shù)Token_Consum_PlainText()。處理完畢,指針指向下一個(gè)元素首。(6)循環(huán)以上操作,直到該網(wǎng)頁分析完畢。算法效率與改進(jìn):采用以上的基本算法,是可用的,但當(dāng)網(wǎng)頁比較大的時(shí)候,比如600K,該算法的效率成倍下降,這主要是由于要處理的字符串太大,在內(nèi)存中完成查找、替換、復(fù)制、移動(dòng)等操作,響應(yīng)時(shí)間明顯下降。對(duì)此的改進(jìn)辦法就是分段進(jìn)行詞法分析,不僅極大的提高了效率(在某些情況下約提高30倍),也有利于瀏覽器整體設(shè)計(jì),因?yàn)楫?dāng)網(wǎng)頁較大時(shí),若等待全部?jī)?nèi)容傳輸完畢,再一次性完成詞法分析和布局,用戶會(huì)感到等待時(shí)間過長(zhǎng),一般現(xiàn)在成熟的瀏覽器都采用邊傳輸,邊分析,邊顯示。2.4HTML詞法分析的應(yīng)用HTML詞法分析程序通常應(yīng)用于瀏覽器設(shè)計(jì)、網(wǎng)頁制作軟件設(shè)計(jì)等領(lǐng)域,本人以一個(gè)使用VC開發(fā)的軟件“HTML智能分析”來舉例說明,“HTML智能分析”同樣使用BitToken詞法分析器,“HTML智能分析”是一個(gè)網(wǎng)頁信息提取、處理軟件。具有以下主要功能:1、智能提取網(wǎng)頁中的文字信息,智能排版,并可在進(jìn)行編輯后保存。2、統(tǒng)計(jì)網(wǎng)頁的有關(guān)信息。3、根據(jù)用戶設(shè)置的版式,將分析和編輯的結(jié)果,自動(dòng)生成新的網(wǎng)頁。其主要設(shè)計(jì)思路是,在BitToken詞法分析器的基礎(chǔ)上,結(jié)合瀏覽器布局的基本算法,對(duì)影響到TXT版面效果的元素進(jìn)行處理。3瀏覽器JavaScript支持的實(shí)現(xiàn)3.1JavaScriptEngineJavaScriptEngine是瀏覽器開發(fā)者為了利用JavaScriptAPI來實(shí)現(xiàn)實(shí)際應(yīng)用而設(shè)立的中間層,用于初始化JavaScript環(huán)境,提供對(duì)JavaScript解釋、執(zhí)行的接口。瀏覽器主體程序的設(shè)計(jì)者可以通過JavaScriptEngine,方便的實(shí)現(xiàn)各種應(yīng)用,畢竟JavaScriptAPI太基礎(chǔ)了,直接使用不太方便。下面介紹JavaScriptEngine的主要功能和實(shí)現(xiàn)方法。這也包含了利用JavaScriptAPI進(jìn)行應(yīng)用的基本思路。(1)初始化:內(nèi)存分配:rt=JS_Init(10000L);初始化cx:cx=JS_NewContext(rt,STACK_CHUNK_SIZE);初始化globalObj:globalObj=JS_NewObject(cx,&globalClass,0,0);定義標(biāo)準(zhǔn)類:JS_InitStandardClasses(cx,globalObj);定義系統(tǒng)函數(shù):JS_DefineFunctions(cx,globalObj,g_functions);定義報(bào)錯(cuò)函數(shù):JS_SetErrorReporter(cx,JS_ErrorReporter);注冊(cè)其它類:RegisterClassPoint (cx,globalObj);RegisterClassSize (cx,globalObj);RegisterClassRect (cx,globalObj);RegisterClassPolygon (cx,globalObj);RegisterClassColorKey (cx,globalObj);RegisterClassTDTimer (cx,globalObj);初始化定時(shí)器:TDTimerListInit();(2)提供對(duì)JavaScript解釋、執(zhí)行的接口函數(shù):TD_EvaluateScript(JSContext*cx,JSObject*obj,constchar*bytes,uintNlength,constchar*filename,uintNlineno,jsval*rval)3.2JavaScript與瀏覽器接合基本概念:JavaScript操作HTML元素的常見方式例:<html><head><script><!--functionChangeImage(index){image0.src="a"+index+".gif";}--></script></head><aonmouseover="ChangeImage(0);"></a><br><aonmouseover="ChangeImage(1);">眼睛</a><br><imgid="image0"src="a0.gif"></img></html>當(dāng)鼠標(biāo)移到文字上時(shí),觸發(fā)事件mouseover,調(diào)用ChangeImage()函數(shù),使得圖像源(SRC)發(fā)生變化,重新調(diào)入新圖片。3.3瀏覽器消息響應(yīng)在主消息循環(huán)中調(diào)用TDWidgetProcessMsg,處理與widget有關(guān)消息。首先:取得當(dāng)前焦點(diǎn)所在的widgetpWidget=TDWidgetGetAtPoint(pThis->baseDoc.base.mWidget,pt,&index);處理該widget對(duì)該消息的響應(yīng)。最后一般為調(diào)用JavaScript執(zhí)行,實(shí)現(xiàn)實(shí)際響應(yīng)。TDVOIDTDWidgetDoAction(TDPWidgetActionpAnchor){ jsvaljval; if(pAnchor) TD_EvaluateScript(JS_GetGlobalContext(),js_GetGlobalObject(),pAnchor->mAction.mStr,pAnchor->mAction.mLength,TDNULL,0,&jval);}其中pAnchor->mAction.mStr即為界面對(duì)象(widget)對(duì)應(yīng)的JavaScript源碼,解釋執(zhí)行的結(jié)果就是調(diào)用為該對(duì)象注冊(cè)的函數(shù)來重畫該widget,從而實(shí)現(xiàn)動(dòng)態(tài)效果。4Netbit瀏覽器開發(fā)與分析控制模塊界面模塊PIXMAP畫圖模塊4.1NetbitBrowser瀏覽器各部份的功能控制模塊界面模塊PIXMAP畫圖模塊HTML文件顯示模塊文本文件顯示模塊詞法分析模塊IO模塊HTML文件顯示模塊文本文件顯示模塊詞法分析模塊IO模塊(1)主程序:用于初始化。(2)界面模塊:窗口、菜單、工具條、滾動(dòng)條等的初始化。(3)控制模塊:負(fù)責(zé)命令的響應(yīng),消息的處理,是軟件控制的中樞。(4)IO模塊:包括http和文件操作。(5)詞法分析模塊:HTML的詞法分析。(6)文本文件的顯示模塊:對(duì)Plaintext顯示的處理,也包含相應(yīng)的布局算法。(7)HTML文件的顯示模塊:在Netbitbrowser中使用了語法分析與布局同時(shí)進(jìn)行的方式,由此模塊來驅(qū)動(dòng)HTML文件的顯示。(8)使用PIXMAP的畫圖模塊:是實(shí)際輸出采用的方法,被6、7模塊調(diào)用。4.2各模塊的實(shí)現(xiàn)1、界面模塊:(1)interface.c,interface.h:用于界面的初始化和定制。主要的函數(shù)說明:voida_Interface_init(void);界面初始化的主函數(shù)voida_Interface_status(BrowserWindow*bw,constchar*format,...);設(shè)置狀態(tài)欄內(nèi)容。voida_Interface_openfile_dialog(BrowserWindow*bw);文件打開對(duì)話框voida_Interface_set_Page_title(BrowserWindow*bw,char*title);設(shè)置窗口標(biāo)題。voida_Interface_entry_open_url(GtkWidget*widget,BrowserWindow*bw);打開網(wǎng)址輸入欄輸入的網(wǎng)址。BrowserWindow*a_Interface_new_browser_window(gintwidth,gintheight);新建瀏覽窗口,是很重要的函數(shù),在其中創(chuàng)建了所有的界面控件,并對(duì)按鈕等進(jìn)行了消息綁定。(2)menu.c,menu.h主要函數(shù):GtkWidget*a_Menu_mainbar_new(BrowserWindow*bw);定義了主菜單項(xiàng),并進(jìn)行了消息綁定(3)browser.h定義了重要的窗口結(jié)構(gòu)如下:struct_BrowserWindow{/*主窗口的widgets*/GtkWidget*main_window;GtkWidget*back_button;GtkWidget*forw_button;GtkWidget*stop_button;GtkWidget*location;GtkWidget*location_button;GtkWidget*status;/*鍵盤控制表*/GtkAccelGroup*accel_group;/*工具條按鈕*/GtkWidget*back_menuitem;GtkWidget*forw_menuitem;GtkWidget*stop_menuitem;/*主文檔widget.(用于繪制HTML或其它)*/GtkWidget*layout;/*當(dāng)前光標(biāo)類型*/GdkCursorTypeCursorType;/*對(duì)話框widgets*/GtkWidget*open_dialog_window;GtkWidget*open_dialog_entry;GtkWidget*openfile_dialog_window;GtkWidget*quit_dialog_window;/*指向保存詞法分析結(jié)果的數(shù)據(jù)結(jié)構(gòu)*/BitTokenContext*global_cx;/*文件類型:htmlorplaintext*/gintfile_type;};2、控制模塊:command.c,command.h主要的函數(shù)說明:voida_Commands_openfile_callback(GtkWidget*widget,gpointerclient_data);打開文件的對(duì)話框voida_Commands_openurl_callback(GtkWidget*widget,gpointerclient_data);打開URLvoida_Commands_close_callback(GtkWidget*widget,gpointerclient_data);關(guān)閉窗口voida_Commands_exit_callback(GtkWidget*widget,gpointerclient_data);退出程序voida_Commands_viewsource_callback(GtkWidget*widget,gpointerclient_data);查看HTML源碼voida_Commands_reload_callback(GtkWidget*widget,gpointerclient_data);刷新當(dāng)前網(wǎng)頁voida_Commands_home_callback(GtkWidget*widget,gpointerclient_data);顯示主頁voida_Commands_helphome_callback(GtkWidget*widget,gpointerclient_data);顯示幫助nav.h,nav.c:是命令對(duì)應(yīng)的與網(wǎng)頁操作有關(guān)的具體實(shí)施主要的函數(shù)說明:voida_Nav_push(BrowserWindow*bw,constchar*);按URL打開一個(gè)網(wǎng)址或文件,具有對(duì)不完整URL的兼容性。voida_Nav_reload(BrowserWindow*bw);刷新當(dāng)前網(wǎng)頁voida_Nav_open_splash(BrowserWindow*bw,char*str);打開起始頁(內(nèi)置頁面)3詞法分析模塊:詞法分析的原理和算法在前面已有詳述。BitToken.c,BitToken.h主要的函數(shù)說明:BitTokenContext*Bit_NewContext();創(chuàng)建新的全局結(jié)構(gòu)intBit_Tokenize(BitTokenContext*global_cx);局部詞法分析voidBit_BeginToken(BitTokenContext*global_cx);全局詞法分析intBit_DestroyToken(BitTokenContext*global_cx);釋放內(nèi)存char*Token_ReadUntil(BitTokenContext*global_cx,char*sUntil);重要的字符處理函數(shù),讀取到指定字符后結(jié)束char*Token_GetAttribute(BitTokenContext*global_cx);取元素屬性voidToken_ConvertIfNeed(char*aString);轉(zhuǎn)義字串的處理intToken_ConsumTag(BitTokenContext*global_cx);處理元素intToken_Consum_PlainText(BitTokenContext*global_cx);處理文本voidBit_ShowTokenResult(BitTokenContext*global_cx);顯示分析結(jié)果voidBit_SaveTokenResult(BitTokenContext*global_cx,char*filename);保存分析結(jié)果BitHtmlDtd.h,BitHtmlDtd.c用于存儲(chǔ)HTML4.0元素的名稱和屬性。BitTokenList.h,BitTokenList.c元素鏈表相關(guān)BitTokenAttrList.h,BitTokenAttrList.c元素屬性鏈表相關(guān)BitStr.h,BitStr.c字符串處理函數(shù)4、文本文件的顯示模塊:plain.c,plain.hchar*Plain_handle_tabs(constchar*str)將TAB轉(zhuǎn)為空格。voida_Plain_write(GtkLayout*display,char*Buf1,gintBufSize)主要函數(shù)下面介紹一下文本顯示的算法。指定默認(rèn)字體font=gdk_font_load("-adobe-helvetica-medium-r-normal--14-*-*-*-*-*-iso8859-1");通過預(yù)布局來計(jì)算頁面的長(zhǎng)度:while(i<BufSize){j=0;while(line_size<SCREEN_WIDTH-20&&Buf[i]!='\n'){str[j]=Buf[i];line_size+=gdk_char_width(font,str[j]);j++;i++;}str[j]='\0';if(Buf[i]=='\n')i++;x=X_START;line_size=x;y+=16;}創(chuàng)建PIXMAPpixmap_new(drawing_area,SCREEN_WIDTH,y);gc=gdk_gc_new(drawing_area->window);進(jìn)行真實(shí)的畫圖。pixmap_repaint(drawing_area);輸出到PIXMAP并顯示5、HTML文件的顯示模塊:這部份是整個(gè)瀏覽器最重要的部份之一,綜合了語法分析與HTML的布局、輸出,其算法的好壞直接關(guān)系到網(wǎng)頁的顯示效果。主要流程:while(pTtokenList!=NULL){…………switch(pTtokenList->token->type){caseHTML_TITLE: …………break;caseHTML_TEXT: …………break; ………… …………default: ………break;}//switchpTtokenList=pTtokenList->next;}//while可以看到,這部份與語詞分析結(jié)合的十分緊密,利用詞法分析的結(jié)果,遍歷各元素節(jié)點(diǎn),取出其元素屬性,根據(jù)一定的布局算法來進(jìn)行布局。例如:當(dāng)遇到title元素時(shí),就使用gtk函數(shù)來設(shè)定窗口標(biāo)題為指定標(biāo)題gtk_window_set_title(GTK_WINDOW(bw->main_window),pTtokenList->token->pData);其中pTtokenList->token->pData即為詞法分析分析出的標(biāo)題內(nèi)容。由于程序結(jié)構(gòu)十分簡(jiǎn)單清晰,大部份元素的處理都簡(jiǎn)單易懂,參考源程序即可,下面主要針對(duì)<font>和相關(guān)標(biāo)記對(duì)字體的設(shè)置闡述其算法。由于<font>標(biāo)記允許嵌套,所以使用了棧來對(duì)font元素進(jìn)行管理,例如以下的HTML代碼:<fontsize=4color=#0000FF>Thisprogramisnot<b>freesoftware</b>;youcanredistributeitand/ormodifyitunderthetermsofthe<fontsize=5color=FF0000>GNUGeneralPublicLicense</font>aspublishedbytheFreeSoftwareFoundation;eitherversion2oftheLicense,or(atyouroption)anylaterversion.</font>顯示的效果應(yīng)為GNUGeneralPublicLicense的字號(hào)為5,顏色為FF0000,即紅色;freesoftware應(yīng)為粗體,受首尾兩個(gè)呼應(yīng)的font標(biāo)記約束,其它字字號(hào)均為4,顏色為0000FF,由于freesoftware只被<b></b>這一對(duì)加粗符號(hào)約束,所以其顏色應(yīng)受首尾的font標(biāo)記的約束,即應(yīng)為0000FF。這種嵌套的約束方式帶來了HTML元素管理的混亂,也容易產(chǎn)生冗余的HTML代碼,但既然標(biāo)準(zhǔn)是這么定的,也只能想辦法加以解決,固然現(xiàn)在隨著樣式表的廣泛采用,font已面臨壽終正寢,但仍然大量存在,特別在對(duì)字體的顏色的設(shè)置,使用font標(biāo)記很方便。棧式管理的主要算法詳解:voidhtml_open_font(GtkWidget*widget,char*style_str,char*color_str,char*size_str,inthtml_element,intinsert_to_list);該函數(shù)用于指定當(dāng)前的字體屬性,其參數(shù)包括style,color,size,以及改變字體屬性的元素的名稱,intinsert_to_list用于標(biāo)記此字體屬性是否入棧,通常是入棧的。4.3Netbit實(shí)際應(yīng)用效果及比較下圖為Netbitbrowser運(yùn)行時(shí)的界面,所打開的頁面源代碼如下:<html><body><h1><fontcolor=#FF00FF><b>NetbitBrowserVersion0.0.1Demo</b></font></h1><hr><h4>License</h4><p><fontsize=4color=#0000FF>Thisprogramisnot<b>freesoftware</b>;youcanredistributeitand/ormodifyitunderthetermsofthe<fontsize=5color=FF0000>GNUGeneralPublicLicense</font>aspublishedbytheFreeSoftwareFoundation;eitherversion2oftheLicense,or(atyouroption)anylaterversion.</font><hr><h3>DesignbasedonGTK,bysogoandce!</h3></body></html>以下為主菜單以下為工具條輸入網(wǎng)頁的URL,即可進(jìn)行訪問。以下為打開文件對(duì)話框以下為查看HTML源碼對(duì)話框下面對(duì)比NetbitBrowser,看看其它瀏覽器查看此網(wǎng)頁的效果。以下為KDE瀏覽該網(wǎng)頁的效果以下為GZILLA瀏覽該網(wǎng)頁的效果,GZILLA對(duì)字體顏色的處理比較差,只有黑色的字體。對(duì)字號(hào)的支持也不好。以下為Netscape顯示該網(wǎng)頁的效果,Netscape默認(rèn)背景色是灰色。IE查看該網(wǎng)頁的效果,字體不同是由于IE設(shè)置的默認(rèn)字體不同。可以看到,在對(duì)簡(jiǎn)單英文網(wǎng)頁的支持效果上看,NetbitBrowser,已接近于成熟瀏覽器的水平,甚至優(yōu)于一些小型的嵌入式瀏覽器如GZILLA,Netfront,但在復(fù)雜頁面的顯示上還有較大的差距??梢缘贸龅慕Y(jié)論是,NetbitBrowser0.0.1Demo版已經(jīng)具有了一定的實(shí)用價(jià)值,但要對(duì)其進(jìn)行完善,工作量還很巨大。對(duì)比Netscape,IE的漫長(zhǎng)的開發(fā)歷史和巨大的資金投入,NetbitBrowser的未來依然生死未卜。4.4NetbitBrowser的缺點(diǎn)分析及改進(jìn)辦法基礎(chǔ)的GUI設(shè)計(jì)上存在缺陷:NetbitBrowser目前的頁面輸出實(shí)際上還采用了簡(jiǎn)單的畫圖機(jī)制,無法在主窗體內(nèi)放置如按鈕、編輯框、單選框等控件,也無法處理頁面元素的消息響應(yīng),(NetbitBrowser0.0.1-013版已進(jìn)行了改進(jìn)),而使用GTK作為開發(fā)平臺(tái)是完全可以實(shí)現(xiàn)這些要求的,GZILLA就是最好的實(shí)例,它通過對(duì)現(xiàn)有控件的組合,開發(fā)了自己的文檔視圖控件,實(shí)現(xiàn)了上述功能。但之所以目前沒有采用先進(jìn)的文檔視控件,是因?yàn)橐獙?shí)現(xiàn)這樣
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 度沙子運(yùn)輸合同范本
- 工地施工鋼筋班組承包合同
- 游泳館勞務(wù)承包合同常用范本
- 門面租賃合同簡(jiǎn)易范本
- 銷售人員提成合同
- 物業(yè)管理的合作與協(xié)同
- 外籍人員雇傭合同
- 甲基轉(zhuǎn)移酶SUV39H2促進(jìn)前列腺癌增殖、侵襲和轉(zhuǎn)移的機(jī)制研究
- 家具定制合約三篇
- 考慮兩類沖擊的退化系統(tǒng)的預(yù)防維修策略研究
- 人工智能大模型
- 極簡(jiǎn)統(tǒng)計(jì)學(xué)(中文版)
- 2024年資格考試-對(duì)外漢語教師資格證筆試參考題庫含答案
- 2024年4月自考02382管理信息系統(tǒng)答案及評(píng)分參考
- (蘇版)初三化學(xué)上冊(cè):第2單元課題1空氣
- 2023年12月廣東珠海市軌道交通局公開招聘工作人員1人筆試近6年高頻考題難、易錯(cuò)點(diǎn)薈萃答案帶詳解附后
- 腹腔鏡腎上腺腫瘤切除術(shù)查房護(hù)理課件
- 專題23平拋運(yùn)動(dòng)臨界問題相遇問題類平拋運(yùn)和斜拋運(yùn)動(dòng)
- 超聲科醫(yī)德醫(yī)風(fēng)制度內(nèi)容
- 高三開學(xué)收心班會(huì)課件
- 蒸汽換算計(jì)算表
評(píng)論
0/150
提交評(píng)論