總網頁瀏覽量

咕狗大神

2011年11月29日 星期二

水銀的使用方法


  • 原始碼壓縮:hg archive -t zip xxx.zip
  • 複製一份:hg clone source targe
  • 取回資源庫: hg pull
  • 繳交資源庫: hg push
  • 貼標籤: hg tag xxx
  • 取回某一版本:hg checkout tagname


2011年11月25日 星期五

App & epub

常常會聽到人家問我,『喂~epub那麼麻煩,顯示又那麼呆板,幹麼不推App阿』,我每次聽到都覺得很煩,不是問題本身很煩,是沒辦法找到一個簡單地方式回答。今天想試著把思緒整理一下,看能不能寫出個子丑寅卯,我用問問題的方式來表達好了:

1. 什麼是 App?
Ans: App 應該是 Application 的縮寫,就是應用程式。在微軟的平台,應用程式多到不勝枚舉,就不多作解釋。但是 App 這三個字的火紅,主要是 App Store 來的吧。如果從這個角度,那麼 App 就局限於使用 iOS SDK/Mac SDK 所開發的應用程式了,請見維基百科

2. App 強在哪裡?
Ans: 這個問題應該沒什麼好回答,資訊系統上面能跑的都是應用程式,所有資訊系統可以呈現的,透過應用程式都能做到。所以強在『無所不能』,前提是『在系統所提供的開放功能之下』。所以系統沒給用的,就算應用程式也作不到。

3. 幹麼排斥 App?
Ans: 冤枉喔~我沒有排斥App阿~我本身就是靠寫程式吃飯的(至少過去十年,我沒寫程式就沒收入),怎麼會排斥 App 呢?但是我排斥『幫特定廠商牟利』,我想那些大廠已經賺很飽了,名氣也夠響亮,不需要我們幫忙打知名度吧?『什麼?寫App就是幫他們打知名度嗎?』,站在我的立場,是的。自由軟體每支都是App阿,誰排斥過誰?

4. epub 是什麼?
Ans: epub是一種文件檔案格式,就這樣。

5. epub 有什麼優點?
Ans: 考古題,自己找答案。

6. epub 有什麼缺點或限制?
Ans: 有檔案格式自然就需要讀檔程式。要看 doc 檔得裝 word、要看 pdf 檔得裝 pdf reader、所以要看 epub 檔自然得安裝 epub reader,這是限制,也可以說是相較於 App 的缺點。

7. App 很炫啊,epub 跟得上嗎?
Ans: 這個問題很深,首先要界定範圍喔,假如問問題的人是編輯者,那麼我要反問一句,怎麼讓文字有背景音樂?不知道?找會寫程式的人?如果我告訴你,只要照抄下面幾個字 < audio src="../abc.mp3" autoplay="autoplay" />,就會在背景撥放 abc.mp3 ,這樣炫嗎?我想要強調的是,App 跟 epub 是給不同的人使用的東西,App 一定要靠程式寫作,而 epub 很單純就是給編輯人員使用,而不需要任何寫程式的背景。App 很炫的原因前面講過了,它本身就是程式,程式可以在電腦上面做幾乎任何事。但是寫一本書,為什麼要靠寫程式的人才能編輯成冊呢?

8. 愛睡了,待續

2011年11月24日 星期四

Sigil 0.3.4.3 釋出了

從前幾天知道 0.3.4.2 有蟲以後,就開始惶惶不知終日,每天只想趕快抓蟲,其他事情都沒什麼心思。蟲是很快就發現了,問題是要想個方法,把蟲抓掉又不會影響到 0.3.4.2 的功能,這可真是頭痛。

昨天實在是沒招了,狠下心來決定對 HTMLTidy 這一大包進行拆解。不過這種東西拆完可能已經明年了,所以只好用絕招了,就是猜想他的架構,然後賭賭看我猜的對不對。

運氣不錯猜中了,所以我就把 audio, video 都加入了,這下子這兩個標籤就不會被洗掉了。測試完沒什麼問題,就打包囉~

這次也順便開放一個新功能,就是當儲存為 EPUB 3.0 格式,會跳出詢問框問你要不要檢視套裝文件內容,如果選擇要,就會出現編輯視窗,裡面有 package document 的內容可以修改。

以上~接下來可能要忙好一陣子的工作了,Sigil 暫時不會做功能新增。

2011年11月23日 星期三

你知道 Sigil 要增加一個標籤有多困難?


後記:2011-12-12
---------------------------
試了很久才發現,必須對 tidy-html 作修改,不然無法產生 xhtml1.1 以及 xhtml5 的 DOCTYPE

但是這個問題解決了,卻跑出一個 multi-thread 的 memory leak
繼續努力中







後記:2011-12-08
---------------------------
找到 W3C 後續發展的 HTML5-tidy ,正在試著裝上去
希望成功,那就徹底解決這個問題了


---------------------------
先寫步驟吧,以 audio 做例子:

1. tags.h
#define nodeIsAUDIO( node )      TagIsId( node, TidyTag_AUDIO )

2. tags.c
#define VERS_ELEM_AUDIO      (xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|XB10)

static const Dict tag_defs[] =
{ /**增加下面這行 */
    { TidyTag_AUDIO,      "audio",      VERS_ELEM_AUDIO,      &TY_(W3CAttrsFor_AUDIO)[0],      (CM_BLOCK|CM_EMPTY),                           TY_(ParseEmpty),    NULL           },

3. tidynum.h
enum { /** 增加下面這行 */
    TidyTag_AUDIO,    /**< AUDIO */
} TidyTagId;


4. attrdict.h
extern const AttrVersion TY_(W3CAttrsFor_AUDIO)[];

5. attrdict.c

const AttrVersion TY_(W3CAttrsFor_AUDIO)[] =
{
  { TidyAttr_ACCESSKEY,      xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_AUTOPLAY,       xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|XB10 },
  { TidyAttr_CLASS,          xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|XB10 },
  { TidyAttr_CONTROLS,       xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|XB10 },
  { TidyAttr_DIR,            xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|xxxx|xxxx },
  { TidyAttr_ID,             xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|XB10 },
  { TidyAttr_LANG,           xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|xxxx|xxxx },
  { TidyAttr_LOOP,           xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|XB10 },
  { TidyAttr_OnCLICK,        xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_OnDBLCLICK,     xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_OnKEYDOWN,      xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_OnKEYPRESS,     xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_OnKEYUP,        xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_OnMOUSEDOWN,    xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_OnMOUSEMOVE,    xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_OnMOUSEOUT,     xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_OnMOUSEOVER,    xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_OnMOUSEUP,      xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_PRELOAD,        xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|XB10 },
  { TidyAttr_SDAPREF,        HT20|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx },
  { TidyAttr_SRC,            HT20|HT32|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|XB10 },
  { TidyAttr_STYLE,          xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_TABINDEX,       xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|xxxx },
  { TidyAttr_TITLE,          xxxx|xxxx|H40T|H41T|X10T|H40F|H41F|X10F|H40S|H41S|X10S|XH11|XB10 },
  { TidyAttr_XML_LANG,       xxxx|xxxx|xxxx|xxxx|X10T|xxxx|xxxx|X10F|xxxx|xxxx|X10S|XH11|XB10 },
  { TidyAttr_XMLNS,          xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|XH11|XB10 },
  { TidyAttr_UNKNOWN,        0                                                                },
};

6. 凡是沒有定義過的 attributes ,一律回到 tidynum.h 去增加
TidyAttr_PRELOAD,           /**< PRELOAD= */

大概就這樣~有夠麻煩

2011年11月22日 星期二

Sigil 0.3.4.2 有蟲

今天跑去逛電子書跑去逛電子書研究基地,發現不少人下載了 Sigil 0.3.4.2 來試驗,而且很多人反應有蟲,只要切章節就會當掉,這可真是嚇死人了,因為本來好好的被我改壞了~真是遜啊!

第一個反應就是因為我拿掉稽核的程式碼,由於原作者把稽核的程式碼包裝得很緊密,所以不只是稽核,還會順便洗標籤、縮排等,這部份我目前幾乎沒辦法拆解,所以之前釋出版本時,就直接把整包給取消掉,現在出問題,應該就表示某些補標籤、補內容的部份也包在這包裡面,真是好大一包喔~

所以唯一的辦法,就是把切章節的部份,加回那一大包,當然這也表示,如果原本的內容使用了 HTML5 專有的標籤,如: audio, video 等,那麼這些標籤會被洗掉。

我在這裡必須聲明,這並不是原作者功力不好,如果現在的時代還是 HTML4 + CSS 2.0 + EPUB 2.0.1,那麼我也會用這種一大包的方式,因為完全沒理由要把這包拆開。

也許有人會說,預留彈性不是很好嗎?說真的,寫了十幾年的程式,預留彈性往往等同於過度設計,幾乎不會用到那個彈性啦~

所以呢?未來有很長一段路要走,因為我必須把接近七八成的程式碼置換,同時必須調整整個架構,這真是龐大的工程。另外,這個編輯器有他的限制,所以不管怎麼努力,其實都會碰到頂,再也上不去。

但是這可是我自己選擇的,我只能堅持往前走囉~

2011年11月18日 星期五

Sigil 0.3.4.2 釋出了

經過了好一陣子的 trace code 以及新增功能, Sigil-0.3.4.2 終於可以釋出了。我把它放到 Source Forge ,網址: http://sourceforge.net/p/sigil4epub3

說真的,釋出這個版本其實非常陽春,號稱支援 epub 3.0 也僅止於 OCF 3.0 以及部份的 Publications 3.0 ,所以我想應該會有一堆人咒罵吧~

比較有用的大概是繁體中文的語言包,這次不像上次硬改掉 source code,而是採用 i18n 的作法,算是比較像樣的部分。

以後就靠我自己了,我希望強迫自己,每個月可以多一點功能,或者改善一些 bug,當然最好的狀況是有人願意一起討論與開發,但這只能隨緣了。