Edgewall Software

Version 4 (modified by cmlenz, 18 years ago) (diff)

Add note about including not-well-formed XML

Comparing Markup to Kid

The template engine in Markup was heavily inspired by Kid (http://kid-templating.org).

Common concepts and features:

  • The same basic set of directives (excluding py:extends and py:layout)
  • Inline expressions using the ${expr} (or just $expr) syntax.
  • Expressions are real Python code, not some “crippled” mini language.
  • Stream-based processing model making heavy use of Python generators.
  • Different serialization methods, for example to produce XML or HTML output.

Differences include:

  • No generation of Python code for a template; the template is executed directly.
  • No support for <?python ?> processing instructions
  • Expressions are evaluated in a more flexible manner, meaning you can use e.g. dotted notation to access items in a dictionary, and the other way around (see the markup.eval module)
  • Proper scoping of variables. Names do not leak into outer scopes.
  • Use of XInclude and match templates instead of Kid's py:extends / py:layout directives
  • py:match directives use (basic) XPath expressions to match against input nodes, making match templates more powerful while keeping the syntax simple (see the markup.path module)
  • Additional directives py:choose / py:when / py:otherwise to better support multi-branch conditionals (aka if, else if, else).
  • It is possible to include markup that is not well-formed in the output (which you may need to do some cases). And if you need to include bad HTML markup but would like to still produce valid output, Markup provides a HTML-sanitizing stream filter.
  • Real (thread-safe) search path support
  • No dependency on ElementTree (due to the lack of position reporting)
  • The original location of parse events is kept throughout the processing pipeline, so that errors can be tracked back to a specific line/column in the template file

See also: MarkupFaq, MarkupPerformance