pixmicat - Rev 311

Subversion Repositories:
Rev:
Pixmicat! 內嵌樣板函式庫(Template-Embedded Library) 設計初稿暨說明書

修訂:
v060218:初稿公開
v060219:增加第三個語法:判斷敘述,並最佳化載入樣版的程式碼

起源:
一開始MySQL版首先設計出具有多重版面和樣板支援的版本,
使用了TinyButStrong作為樣板函式庫。
在先前為了樣板函式庫要選擇哪個而苦惱不已,
一開始的考量是Smarty,但是他太大(且學習不易,至少對我而言orz)
後來版友推薦了TinyButStrong(簡稱TBS)這套小樣板函式庫。
於是就開始使用了這套。

在實驗版Experimental:02中,正式實裝了樣板功能,
但是一是TBS是個功能強大的函式庫,二來是它的生成方式有點奇怪。
輸入完資料後直接一次性印出而非儲存至變數,且印出後無法對其操作。
這對連續生成靜態暫存頁面的futaba程式來說,是非常不適合的。
為了使用TBS,必須要生成物件、開啟並抓取緩衝區、關閉物件,
然後重複這樣的動作。用想的都知道效能上多少受到影響。
(記得當時的執行時間,未實裝樣板0.3秒,實裝樣板1.2秒的樣子)

於是興起自己寫樣板的念頭,
早在一開始沒考慮用Smarty的時候,我是打算用自製的方式。
因為其他樣板函式庫得符合多樣化的要求而具有眾多功能。
但是給Pixmicat!的話,基本上不需要那麼多功能。
頂多是Block Loop(區塊重複)和String Replace(字串取代)兩個動作就OK了。
(為了加強自訂性,還是加個判斷敘述吧)
剛好趁著Pixmicat!新更名的機會,把這自製樣板函式庫做出來。

語法:
因為只需要三個功能,所以也只有三種語法。
第一種是區塊:<!--&(區塊名稱)--> <!--/&(區塊名稱)-->
第二種是字串:{$(字串名稱)}
第三種是判斷:<!--&IF($(字串名稱),'(有字串則印出文字)','(沒字串則印出文字)')-->
*註:為了避免不小心發生取代錯誤的問題,名稱請全部大寫

而這些語法全部也只有定義幾個而已。
舉例來說,區塊語法只有三個。
<!--&MAIN--><!--/&MAIN-->
<!--&REPLY--><!--/&REPLY-->
<!--&SEPARATE--><!--/&SEPARATE-->
用這些標籤來標明發文、回應和分隔線的區塊。

第二種預先定義的有{$NO}, {$SUB}...等,
這些標籤會在生成靜態暫存頁面的時候自動取代為正確的顯示文字。

第二種標籤列表及含義:
{$NO} - 留言編號
{$IMG_BAR} - (有貼圖時) 圖片資訊列,顯示長寬大小用
{$IMG_SRC} - (有貼圖時) 圖片本體
{$SUB} - 留言標題
{$NAME} - 留言者名稱
{$NOW} - 留言時間
{$REPLYBTN} - (一般瀏覽時) 進入回應連結
{$COM} - 留言內文
{$WARN_OLD} - (提示文字) 此留言過舊即將被刪除
{$WARN_BEKILL} - (提示文字) 此留言的附加檔案即將被刪除
{$WARN_ENDREPLY} - (提示文字) 此留言禁止回應
{$WARN_HIDEPOST} - (提示文字) 此留言有幾篇回應已隱藏

第三種就是類似程式的if敘述,只實裝簡單的功能。
例如:<!--&IF($IMG_BAR,'<br />','')--> (注意,逗號旁沒有空格,文字用'單引號包住)
這是假如{$IMG_BAR}有值的話就印出<br />,否則什麼都不印。
這個語法應該可以做出比較多變化,但要有一點程式底子。
(基本上樣版的語言應該以簡單易學為主,不要搞的跟寫程式一樣複雜)

附註:
區區殺個雞幹嘛拿牛刀(Smarty, TBS,etc)呢?(汗)
所以我打算自己造一把鋒利的小刀(PTE),能殺雞就好。

因為是給Pixmicat!內部使用的函式庫,功能上盡量壓縮到最小,
當然最重要的效能方面一定是重點,這個我在寫函式庫的時候,
函式部份有作Benchmark,即是將函式以1000次為單位跑10遍,
取執行時間平均值來修正,藉此來最佳化程式碼。
斤斤計較的成果除了希望效率良好外,也希望功能上能達到想要的效果。

因為是自己寫的樣板,功能上難免有所不全,
在做樣板上當然不能像TBS, Smarty那樣變化多。
(事實上我自己在改樣版也發現很多綁死的地方orz)
未來可能會再加強吧,但無疑的此樣板絕對是以效能優先,其次是功能。