討厭的是,Webkit/Gtk+用Glib這裡的bug沒有fix。
唯一的workaround是在每一個Webkit/Gtk+程式都加上這一行:
g_thread_init (NULL);
強迫將thread啟動,如此可以避免前述的bug.
找到這個workaround也花了很多時間...
2009年12月28日 星期一
2009年12月24日 星期四
webkit & gnome
討厭的是,webkit 1.15.4版本竟然需要 gnome 2.28以上的版本,該版本是2009年12月才release,我用的debian stable版當然還沒用這一版本的gnome,要花一些時間弄清楚如何安裝gnome 2.28。
這一部份一定要記住,因為未來為了mobile device去port webkit時,也會被這樣的問題困住...
這一部份一定要記住,因為未來為了mobile device去port webkit時,也會被這樣的問題困住...
layout engine
評估可以用什麼layout engine.因為想在未來使用clutter,來處理animation,可以有很fancy的使用者界面。加上clutter是唯一系統化的處理在Linux上的'touch & signature'的工具,應該是未來mobile device使用者介面有機會成為king的工具。所以一開始就鎖定clutter+openGL+GTK+。
最初考慮用 gtkhtml來layout xhtml的內容,但survey了一陣子才發現gtkhtml已經phase out了,被webkit所取代,原本不想用webkit,主要是因為webkit最早是由apple提供,是用object-c所撰寫,但在評估了其他的layout engine後,看來沒什麼選擇。
開始讀object-c的manual,開始嘗試build webkit from scratch。再慢慢了解layout engine的細節...
webkit是android採用的mobile browser,也是iPhone採用的mobile browser,應該要花一點時間弄清楚,也會是在為自己的技術能量做累積。
最初考慮用 gtkhtml來layout xhtml的內容,但survey了一陣子才發現gtkhtml已經phase out了,被webkit所取代,原本不想用webkit,主要是因為webkit最早是由apple提供,是用object-c所撰寫,但在評估了其他的layout engine後,看來沒什麼選擇。
開始讀object-c的manual,開始嘗試build webkit from scratch。再慢慢了解layout engine的細節...
webkit是android採用的mobile browser,也是iPhone採用的mobile browser,應該要花一點時間弄清楚,也會是在為自己的技術能量做累積。
2009年12月9日 星期三
libxml中的relaxNG validation
正嘗試了解libxml中處理relaxNG的validaion部份。若這個部份可以好好利用,應該可以達成之前所想像的,基於relaxNG的文法,generate出一個parser供程式用來parse相對應的xml檔。在電子書的例子中,就是給幾個epub的relaxNG檔,然後能產生幾個相對應的parser,被reader用來讀取/validate電子書籍的正確性。
libxml中的relaxNG validation是透過API: xmlTextReaderRelaxNGValidate(reader, rng)來呼叫。reader則是透過 API:xmlReaderForFile(xmlfilename, encoding ,parse options)來建立,reader是一個xmlTextReader的data structure,defined in xmlreader.c中。
看來是先將rng轉成一個內部的struct,再以這個struct來parse xml檔。還要再看看。
libxml中的relaxNG validation是透過API: xmlTextReaderRelaxNGValidate(reader, rng)來呼叫。reader則是透過 API:xmlReaderForFile(xmlfilename, encoding ,parse options)來建立,reader是一個xmlTextReader的data structure,defined in xmlreader.c中。
看來是先將rng轉成一個內部的struct,再以這個struct來parse xml檔。還要再看看。
2009年10月26日 星期一
relaxNG
總算想清楚了。
relaxNG就像是yacc中的文法(grammar),我應該寫個小程式,將讀入的relaxNG產生一個.c檔,這個.c檔將像是一個state-machine,順著relaxNG所定義的文法來parse新讀入的檔案,確定該檔案有無follow relaxNG所定義的文法。至於若符合時應該做什麼動作,屬於meta層級的事,再透過在relaxNG文法中的特別格式,可能可以參考relaxNGCC的作法,用 的方法加在.c檔中。
希望這種模式會成功。
有趣的是,將文法轉成.c檔,及.c檔中處理讀入的xml檔,都將使用libxml,meta-language及language層次都預設了libxml,寫來應該會好玩。
這個讀relaxNG產生.c檔的程式,寫完應該可以opensource出去,讓更多對xml grammar(如relaxNG)的無力可以被改變。否則每次都是先對讀入的XML檔,先走過一次tree後check整株tree是否合於文法,再開始重頭走一次tree,在對的地方做一些對的事,這種重覆walk-tree的作法真令人生厭。希望前述的作法可以讓整個xml parsing有效率...
relaxNG就像是yacc中的文法(grammar),我應該寫個小程式,將讀入的relaxNG產生一個.c檔,這個.c檔將像是一個state-machine,順著relaxNG所定義的文法來parse新讀入的檔案,確定該檔案有無follow relaxNG所定義的文法。至於若符合時應該做什麼動作,屬於meta層級的事,再透過在relaxNG文法中的特別格式,可能可以參考relaxNGCC的作法,用
希望這種模式會成功。
有趣的是,將文法轉成.c檔,及.c檔中處理讀入的xml檔,都將使用libxml,meta-language及language層次都預設了libxml,寫來應該會好玩。
這個讀relaxNG產生.c檔的程式,寫完應該可以opensource出去,讓更多對xml grammar(如relaxNG)的無力可以被改變。否則每次都是先對讀入的XML檔,先走過一次tree後check整株tree是否合於文法,再開始重頭走一次tree,在對的地方做一些對的事,這種重覆walk-tree的作法真令人生厭。希望前述的作法可以讓整個xml parsing有效率...
2009年10月21日 星期三
xml namespace
xml的namespace好像是一件容易令人困惑的定義,其實很簡單。
為了要讓一份xml文件可以被正確解讀,xml依著什麼樣的規範,意謂著這是一份描寫化學反應、食譜、電子書、網頁等等,都由namespace來確定。一份完全沒有namespace定義的xml檔,將完全無法被解讀。namespace定義的方式就是透過xmlns="..."來處理。
namespace在xml中還扮演另一個角色,即qualify tag。xml文件中可能會有其他的定義需求,如epub格式中的package檔,就需要要metadata的相關定義,該定義可能來自某一個組織的共識,也有一定的約定俗成的規矩,若package中使用的tag與metadata中的tag衝突,該如何處理?最簡單的方式就是給metadata一個namespace,然後所有metadata用到的tag都用xx:tag的方式處理。xx表示為了metadata範圍需要所定義的namespace。然後透過 xmlns:xx="...."的方式定義xx這個新的namespace。而這個namespace的範圍只有在他出現的這個tag中。所以任何他的子tag或attr都可以看見他。類似於一般程式中的binding概念。
為了要讓一份xml文件可以被正確解讀,xml依著什麼樣的規範,意謂著這是一份描寫化學反應、食譜、電子書、網頁等等,都由namespace來確定。一份完全沒有namespace定義的xml檔,將完全無法被解讀。namespace定義的方式就是透過xmlns="..."來處理。
namespace在xml中還扮演另一個角色,即qualify tag。xml文件中可能會有其他的定義需求,如epub格式中的package檔,就需要要metadata的相關定義,該定義可能來自某一個組織的共識,也有一定的約定俗成的規矩,若package中使用的tag與metadata中的tag衝突,該如何處理?最簡單的方式就是給metadata一個namespace,然後所有metadata用到的tag都用xx:tag的方式處理。xx表示為了metadata範圍需要所定義的namespace。然後透過 xmlns:xx="...."的方式定義xx這個新的namespace。而這個namespace的範圍只有在他出現的這個tag中。所以任何他的子tag或attr都可以看見他。類似於一般程式中的binding概念。
2009年10月14日 星期三
開啟ePUB的起點
ePUB格式的閱讀,是從開啟.epub檔後,META-INF這個目錄中的container.xml開始。
這個檔案必需要有下列資訊:
1. root level element: with attributes version="1.0", xmlns="urn:oasis:tc:opendocument:xmlns:container"
2. 第二階的element:可以specify多個,但必需至少要有一個有attributes media-type="application/oebps-package+xml"。
META-INF目錄還可以有下列幾個檔案,但不是必要的:
1.manifest.xml
2.metadata.xml
3.signatures.xml
4.encryption.xml
ePUB還強制要求encryption只能用w3的模式。
這整個模式是否可行,需要再想想。
這個檔案必需要有下列資訊:
1. root level element:
2. 第二階的element:
META-INF目錄還可以有下列幾個檔案,但不是必要的:
1.manifest.xml
2.metadata.xml
3.signatures.xml
4.encryption.xml
ePUB還強制要求encryption只能用w3的模式。
這整個模式是否可行,需要再想想。
2009年10月13日 星期二
xml的parsing
開始要準備做電子書閱讀器的軟體了。
電子書閱讀器所鎖定電子書籍的格式是ePUB的格式,其實就是xhtml放電子書籍的內容,xml放電子書籍的meta data,然後package起來成為可讀的電子書籍。
這就需要大量的xml parsing的工具。
開始找可以用的open source工具,也考慮是否該自己利用yacc/lex寫個parser。
後來放棄自己寫parser的想法,原因反而是字型編碼。
lex中所scan出的token,其實是ascii的token。ePUB中的xml,放的會是電子書籍的meta data,其中就會有中文(採用utf-8編碼),但lex無法scan非token的本文,放在 間的描述性文字,如何可成為被scan的token?與一般程式相近的,大概只能用string。
想來想去,還是決定用現成的eXpat package。雖然對event-driven的expat是否能好好處理電子書籍的頁面有些猶疑,但先這樣做做看吧!
電子書閱讀器所鎖定電子書籍的格式是ePUB的格式,其實就是xhtml放電子書籍的內容,xml放電子書籍的meta data,然後package起來成為可讀的電子書籍。
這就需要大量的xml parsing的工具。
開始找可以用的open source工具,也考慮是否該自己利用yacc/lex寫個parser。
後來放棄自己寫parser的想法,原因反而是字型編碼。
lex中所scan出的token,其實是ascii的token。ePUB中的xml,放的會是電子書籍的meta data,其中就會有中文(採用utf-8編碼),但lex無法scan非token的本文,放在
想來想去,還是決定用現成的eXpat package。雖然對event-driven的expat是否能好好處理電子書籍的頁面有些猶疑,但先這樣做做看吧!
訂閱:
文章 (Atom)