在 Movable Type 的模版標籤背後,有兩個主要的概念:
這兩點都會在後面詳加描述。對於其他出版管理系統的使用者、也就是那些更熟悉其他模版標籤的人來說,這裡有一些內部模型差異的注意事項:
<Blogger>
標籤來圍繞文章項目清單;然後妳可以用 <$Blog*$>
標籤來代表變數替換。
把這個模型轉成 Movable Type 相當容易。
<Blogger>
標籤和 </Blogger>
標籤分別被換成 <MTEntries>
標籤及 </MTEntries>
標籤。
<$Blog*$>
標籤被換成名稱很像的 <$MTEntry*$>
標籤。
當然, Movable Type 的模版標籤比 Blogger 的還要多些,不過他們的內部模型非常地相似。
{{logbody}}
標籤。然後妳還得自訂兩個其他模版 -- Index Entry Template: Standard Entries
和 Index Entry
Template: Extended Entries
-- 來調整每一個文章項目在妳的索引頁面上的樣式。
要把這樣的模型轉換成 Movable Type ,大概是像這樣:
{{logbody}}
標籤會被一個 <MTEntries>
容器所取代。
Index Entry Template: Standard Entries
和 Index Entry Template: Extended Entries
的組成元件會被混合起來,形成 <MTEntries>
標籤和 </MTEntries>
標籤之間的組成元件。任何妳祇想要在延伸文章項目出現的組成元素,都應該被包在 <MTEntryIfExtended>
容器裡。當然,妳還要把 Greymatter 的變數替換標籤換成相對應的 Movable Type 標籤。
為什麼 Movable Type 用了現在出現於模版裡的內部模型呢?有兩個原因:
<MTEntries>
標籤來表示妳任何文章項目的清單,並且可以透過各種不同的手段,把這份清單變成任何妳想要的樣子。跟 Greymatter 的方法比較一下,後者的 {{logbody}}
標籤總是被完全相同的組成元件所定義樣式的文章項目清單所取代:這些組成元件是兩個 Index Entry Templates
模版的其中一個。
(請注意上面這一段並不是在指責 Greymatter 的不是,我們祇不過是要試著描繪出兩者的不同,並解釋為什麼我們選擇了現在所用的這一套。)
Movable Type 模版是由許多特別的標籤,並嵌入標準的文字(或 HTML 在此也有可能)的片段。這一些標籤的集合可以分成兩群 -- 容器和變數:
<MTFoo>
的標籤,那麼妳也許會在妳的模版裡看到下列的組成元件:
<MTFoo> Foo bar </MTFoo>
這個容器的開頭標籤和結尾標籤看起來都很像標準的 HTML 標籤。
容器標籤可能代表著一份清單或者是一種條件。
如果容器代表著一份清單 -- 例如像是 <MTEntries>
標籤 -- 容器內的子模版會套用在清單上的每一項。舉例來說,如果妳用了一個 <MTEntries>
標籤,那麼在 <MTEntries> 標籤和 </MTEntries> 標籤間的組成元件就會套用在清單上的每一則文章項目。
如果容器代表著一種條件 -- 例如像是 <MTEntryIfExtended>
標籤 -- 那麼開頭標籤和結尾標籤間的組成元件就祇有當條件吻合時纔會顯示。舉例來說,在 <MTEntryIfExtended>
的情況下,條件考驗著是否文章項目有延伸的部分(『更多文字』)。
<$MTEntryTitle$>
標籤會被以文章項目的標題代換掉。
所有的 Movable Type 標籤都被包在小於和大於符號之間,就跟 HTML 標籤一樣。妳可以選擇在這些標誌裡插入 $
,就像這樣:
<$MTEntryBody$>
透過這個技巧,妳就能夠迅速地判斷某個標籤到底是 HTML 標籤還是 Movable Type 標籤。
這個 $
是選用性的;慣例上所有的預設模版和文件裡都會把變數標籤加上 $
,但是並不會加進容器標籤裡。一部份的原因是因為妳不該在容器標籤的結尾標籤裡用這個 $
,否則系統就會找不到結尾標籤。
有些 Movable Type 標籤會透過屬性來修改他們的預設作用。標籤屬性的作用就跟 HTML 標籤的屬性很像:他們是一連串的 name="value"
配對,以空白隔開。舉例來說:
<MTEntries author="Foo" category="Bar">
(要知道這裡到底發生了些甚麼事,請翻閱 <MTEntries>
文件。)
屬性的值必須被包在引號中;否則就無法被正確地解讀。當妳在標籤中加入 $
時,必須把這個字符放在標籤的開始之後、結束之前;然後當妳要在這樣的標籤中加入標籤屬性時,妳得把這些屬性放在標籤結尾的 $
字符之前。舉例來說:
<$MTEntryDate format="%B %e, %Y"$>
被各個 Movable Type 標籤所支援的屬性,會跟著這些標籤被列出。
大部分的 Movable Type 標籤都是仰賴情境的,這表示這些標籤祇應該在適當的情境中被使用。
情境通常都是由附近的模版或者是附近的容器標籤所決定的:舉例來說,模版組成元件若被放在 <MTEntries>
標籤裡、在單篇
彙整頁面裡、在評論清單
模版裡或者在評論預覽
模版裡的時候,就是在文章項目情境裡。因為這樣,所以在這些情境中使用 <$MTEntryTitle$>
標籤或 <MTComments>
容器時纔有意義。
以下這些技術資訊說明了模版如何被解讀後再建造成輸出頁面。
第一步是把進來的模版拆成若干零件,每一個零件都是一個標籤(像是 <$MTEntryText$>
或 <MTEntries>
之類的)或可以被直接插入的原始文字區塊。有些標籤是容器,像是 <MTEntries>
-- 這些標籤一定要包含開啟標籤和關閉標籤,然後介於其間的組成元件也一樣被拆解成若干零件,再儲存於容器之下。
第二步是取得這些零件以及文章項目、文章項目清單、評論、評論清單之類的 -- 基本上就是某種內容 -- 然後再建造出最後輸出的頁面。一般說來這個最後的頁面會是 HTML ,不過顯然系統本身並沒有這樣的限制(別忘了, RSS 串聯模版早就裝進來啦)。
標籤自己本身並沒有寫死在分析程式(把文字編譯成零件的物件)裡;每一次分析程式找到一個標籤後,它就會內容物件有關標籤的類別為何、是否是個容器之類的。然後這個標籤就會增加到零件清單裡。
同樣地這些標籤也不是寫死在用來建造最後輸出的物件(其本質是轉譯程式)裡。這個物件也會跟內容物件溝通;對於每一個他所處理的物件,都會有一個匿名的副常式 -- 該副常式已經被以其創造之上的內容物件註祇過 -- 被喚起。這個副常式會傳回一整塊輸出,然後直接插入最後的輸出裡。