Simple Template
Movable Type templates aren't too difficult to write, but they can be difficult to read. So I've whipped up another plugin to fix that. Simple Template is a plugin that provides an alternative syntax for Movable Type templates1.
Availability
You can download this plugin here: mtsimpletemplate-1_21.zip
Installation
To install, place the 'simpletemplate.pl' file in your Movable Type "plugins" directory. The 'simpletemplate.pm' file should be placed in a 'bradchoate' subdirectory underneath your Movable Type "extlib" directory. Your installation should look like this:
- (mt home)/plugins/simpletemplate.pl
- (mt home)/extlib/bradchoate/simpletemplate.pm
Refer to the Movable Type documentation for more information regarding plugins.
Description
This plugin provides an alternative format for your Movable Type templates.
Tags made available through this plugin:
<MTSimpleTemplate>- The container tag that translates the "simple" template format into a regular Movable Type template.<MTEval>- Container tag that allows you to use embedded expressions for any Movable Type tag.<MTSetVarBlock>- Similar to the SetVar tag, but is a container tag where the value is placed within the tag.
<MTSimpleTemplate>
The SimpleTemplate tag should be placed around your entire template so it can process it for the "simple" template syntax it offers.
These attributes are allowed:
- pragma
An optional parameter that allows you to define the character(s) used to indicate the Movable Type tag data. The default is '%'. - comment
An optional parameter that allows you to define the character(s) used to indicate comments within the template. The default is '#'. - no_build
If specified, the output from this tag will be the Movable Type template code it produces. Normally, the output is the compiled result of the template.
Usage
Here's a very simple Movable Type template:
<$MTEntryBody$> <MTIfEntryExtended>Extended text: <$MTEntryMore$></MTIfEntryExtended>
Here is the same thing in "simple" format:
<MTSimpleTemplate>
% EntryBody
% EntryIfExtended:
Extended text: ${EntryMore}
% :EntryIfExtended
</MTSimpleTemplate>
Note that there are two forms you can use to produce MT tags:
- Pragma format: a line starting with the '%' character (or you can customize this using the 'pragma' attribute of the SimpleTemplate tag) is seen as a Movable Type instruction. Exactly one MT tag may be produced per pragma. If the pragma line ends with ":" (or ``{'', ``('', ``['') it is considered an open MT tag. If the pragma starts with ":" (or "}", ")", "]") it is considered a closing tag.
- Inline format:
${Variable attribute="value"}
This is a simple way to express:<$MTVariable attribute="value"$>
Any Movable Type tags can be used with this -- you would just refer to them without the usual "MT" prefix.
Here's some more examples:
% Comments:
<div class="comments-body">
% CommentBody
<span class="comments-post">Posted by: ${CommentAuthorLink spam_protect="1"}
at ${CommentDate}</span>
</div>
% :Comments
This demonstrates line-continuation with Simple Templates. If the pragma ends with "\\" and the next line is a pragma line, then it gets concatenated together:
% EntryDate \ % format="%Y-%m-%dT%H:%M:%S"
becomes:
<$MTEntryDate format="%Y-%m-%dT%H:%M:%S"$>
Container tags should be written like this:
% EntryIfExtended: Something something... % :EntryIfExtended
or this:
% EntryIfExtended {
Something something...
% } EntryIfExtended
or this:
% EntryIfExtended {
Something something...
% }
Non-container tags (like <$MTEntryBody$>) can be written like this:
% EntryBody
or this:
${EntryBody}
Comments may be included (default comment character is '#') but the comment character must be at the start of the line (no spaces prior to it):
# This is a comment.
<MTEval>
Evaluates embedded expressions within any arbitrary MT tag.
Attributes:
- _tag
If specified, the Eval tag functions as a proxy for the tag identified. If unspecified, the Eval tag expects a single Movable Type tag to be enclosed within the Eval tag.
For global filters, you can pass attribute names like this:
<MTEval _tag="GetVar" name="something" 001lower_case="1" 002upper_case="1" />
This will cause the filters to be applied in the order they are numbered.
You can even duplicate the global filter attribute name/value pairs,
combining the operations in any order you wish.
Usage:
<MTSetVar name="lastn" value="5">
<MTEval _tag="Entries" lastn="[MTGetVar name='lastn']">
(Entry tags go here)
</MTEval>
Or:
<MTSetVar name="lastn" value="5">
<MTEval><MTEntries lastn="[MTGetVar name='lastn']">
(Entry tags go here)
</MTEntries></MTEval>
You can also use it for simple MT tags (non-container tags):
<MTSetVar name="lastn" value="5">
<MTSetVar name="variable" value="lastn">
<MTEval _tag="GetVar" name="[MTGetVar name='variable']" />
<MTSetVarBlock>
Allows you to define a complex string (multi-line, with tags and even Movable Type tags) for a variable.
- name
Name of variable to assign.
Usage:
<MTSetVarBlock name="my_info">
<p>This is a very long block of text that
I'm using to describe myself.</p>
<p>And so forth</p>
</MTSetVarBlock>
License
Released under the MIT license.
Changelog
- 1.21: Bugfix to wrapper <MTEval> support.
- 1.2: Added support for specifying multiple global filter attribute name/value pairs. They are also processed in the order specified.
Made the = sign following the attribute names optional.
Renamed the "no_compile" attribute to "no_build" (more accurate in
terminology). - 1.1: Added Eval and SetVarBlock tags. Implemented dynamic replacement of ${...} expressions within MT attributes.
Defined default attribute names for many tags that only have a single attribute or have 1 required attribute that drives their function. - 1.0: Initial release.
1 Personally, I like it -- but the "simpler" aspect of this is my opinion of course, not necessarily yours.
"Initial release" my ass ;)
Nice job, Brad. I am particularly excited about the comments. Yes, I know about the plugin which provides for comments, but you have to put a set of tags around it...
I haven't yet put the plugin to use but if I understand it correctly, the plugin translates the template on-the-fly and then produces the page meaning that you never see the normal MT tags at any point. This is bad if only because (for debugging or demonstration purposes) it makes it harder for a user to display his/her template for public consumption.
If used in conjunction, would the showtemplates or template plugins show the simpletemplate form or the MT-translated form? If the latter, then nevermind.
...although it might be nice to have an outputTemplateFile attribute that will write out the translated MT template to the file specified as its argument...
Anyway, good work, as always!
I am an idiot... The no_compile attribute does this, does it not? (slaps forehead) REALLY nice job, Brad..