在 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 串联模板早就装进来啦)。
标记自己本身并没有写死在分析程序(把文字编译成零件的对象)里;每一次分析程序找到一个标记后,它就会内容对象有关标记的类别为何、是否是个容器之类的。然后这个标记就会增加到零件清单里。
同样地这些标记也不是写死在用来建造最后输出的对象(其本质是转译程序)里。这个对象也会跟内容对象沟通;对于每一个他所处理的对象,都会有一个匿名的副例程 -- 该副例程已经被以其创造之上的内容对象注只过 -- 被唤起。这个副例程会传回一整块输出,然后直接插入最后的输出里。