### Movable Type 模版

- MOVABLE TYPE 模版

- 模版和標籤哲學
- 標籤種類
- 標籤語法
- 標籤屬性
- 情境的重要性
- 技術資訊

# MOVABLE TYPE 模版

## 模版和標籤哲學

在 Movable Type 的模版標籤背後，有兩個主要的概念：

- 情境是決定能否使用特定標籤的關鍵。

- 容器標籤代表著清單及條件，而變數標籤則代表著變數替換。

這兩點都會在後面詳加描述。對於其他出版管理系統的使用者、也就是那些更熟悉其他模版標籤的人來說，這裡有一些內部模型差異的注意事項：

- Blogger
  Movable Type 的模版標籤跟 Blogger 的精神很像。在 Blogger 裡，妳用 `<Blogger>` 標籤來圍繞文章項目清單；然後妳可以用 `<$Blog*$>` 標籤來代表變數替換。

  把這個模型轉成 Movable Type 相當容易。

  `<Blogger>` 標籤和 `</Blogger>` 標籤分別被換成 `<MTEntries>` 標籤及 `</MTEntries>` 標籤。

  `<$Blog*$>` 標籤被換成名稱很像的 `<$MTEntry*$>` 標籤。

  當然， Movable Type 的模版標籤比 Blogger 的還要多些，不過他們的內部模型非常地相似。

- Greymatter
  Greymatter 的模版標籤用了和 Movable Type 不同的內部模型；舉例來說，當妳想要在 Greymatter 的索引頁面裡插入妳所有文章項目的清單時，妳得插入 `{{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 用了現在出現於模版裡的內部模型呢？有兩個原因：

1. 最主要的原因是靈活度的考量。妳可以用 `<MTEntries>` 標籤來表示妳任何文章項目的清單，並且可以透過各種不同的手段，把這份清單變成任何妳想要的樣子。跟 Greymatter 的方法比較一下，後者的 `{{logbody}}` 標籤總是被完全相同的組成元件所定義樣式的文章項目清單所取代：這些組成元件是兩個 `Index Entry Templates` 模版的其中一個。

2. 妳可以少盯一些模版，而且可以在一個模版裡就組出整個頁面的板面安排。 Greymatter 的方法通常會把一個頁面拆成許多小片段，每一個小片段都是一個模版。在 Movable Type 的模版系統中，所有的組成元件都放在同一個地方，並且透過容器標籤來決定是否要囊括或重複。

（請注意上面這一段並不是在指責 Greymatter 的不是，我們祇不過是要試著描繪出兩者的不同，並解釋為什麼我們選擇了現在所用的這一套。）

## 標籤種類

Movable Type 模版是由許多特別的標籤，並嵌入標準的文字（或 HTML 在此也有可能）的片段。這一些標籤的集合可以分成兩群 -- 容器和變數：

- 容器標籤
  有些 MT 標籤是『容器』標籤，裡面可能裝有被稱為子模版的東西；其實就是一些文字片段和 MT 標籤，然後被包在另外兩個 MT 標籤：容器的開頭和容器的結尾之間。舉例來說，如果有個叫做 `<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 串聯模版早就裝進來啦）。

標籤自己本身並沒有寫死在分析程式（把文字編譯成零件的物件）裡；每一次分析程式找到一個標籤後，它就會內容物件有關標籤的類別為何、是否是個容器之類的。然後這個標籤就會增加到零件清單裡。

同樣地這些標籤也不是寫死在用來建造最後輸出的物件（其本質是轉譯程式）裡。這個物件也會跟內容物件溝通；對於每一個他所處理的物件，都會有一個匿名的副常式 -- 該副常式已經被以其創造之上的內容物件註祇過 -- 被喚起。這個副常式會傳回一整塊輸出，然後直接插入最後的輸出裡。

Copyright © 2001-2003 Six Apart. All Rights Reserved.