I am a former Ikiwiki user who wrote several plugins and patches related to MathML, SVG, and syntax highlighting. Some related links and notes are archived below.

Homepage: http://jblevins.org/


The following plugins are no longer maintained, but please feel free to use, modify, and redistribute them. Read the corresponding perldoc documentation for more details.

  • mdwn_itex - Works with the mdwn plugin to convert inline LaTeX expressions to MathML using itex2MML.

  • h1title - If present, use the leading level 1 Markdown header to set the page title and remove it from the page body.

  • code - Whole file and inline code snippet syntax highlighting via GNU Source-highlight. The list of supported file extensions is configurable.

  • metamail - a plugin for loading metadata from email-style headers at top of a file (e.g., title: Page Title or date: November 2, 2008 11:14 EST).

  • pandoc - Markdown page processing via Pandoc (a Haskell library for converting from one markup format to another). LaTeX and reStructuredText are optional.

  • path - Provides path-specific template conditionals such as IS_HOMEPAGE and IN_DIR_SUBDIR.

MathML and SVG support

So far, I've made some notes on sanitizing MathML and SVG via htmlscrubber on the svg todo item.

I've also worked out some content-negotiation issues. First of all, one needs to modify the default templates to use the XHTML+MathML+SVG doctype (see e.g., this patch). For most browsers, the content type of the pages should be application/xhtml+xml. The solution is easy if you want to just send application/xhtml+xml to everybody: just change the content type of .html files across the board.

However, if you want to support browsers that don't accept application/xhtml+xml (and those that will but say they don't, such as IE with the MathPlayer plugin), then one needs a mod_rewrite rule like the following:

RewriteCond %{HTTP_ACCEPT} application\/xhtml\+xml [OR]
RewriteCond %{HTTP_USER_AGENT} (W3C.*Validator|MathPlayer)
RewriteRule \.html$ - [T=application/xhtml+xml]

This solves the problem of MathML and inline SVG in static pages but some additional work is required for dynamically generated pages, like page previews, that are generated by ikiwiki.cgi. We need to allow ikiwiki.cgi to set the content type dynamically based on the HTTP_CONTENT_TYPE environment variable (e.g., with the following patch). Then, the following rewrite rules can pass the correct content type to ikiwiki:

RewriteCond %{HTTP_ACCEPT} application\/xhtml\+xml [OR]
RewriteCond %{HTTP_USER_AGENT} (W3C.*Validator|MathPlayer)
RewriteRule ikiwiki.cgi$ - [T=application/xhtml+xml]

One final critical issue is that a production-ready setup needs to implement some sort of on-the-fly error handling. If a user submits an invalid LaTeX expression or SVG code (not malicious, just invalid) and saves the page, then browsers like Firefox will halt processing of the page, preventing any further viewing or editing. A less than optimal solution is to force users to preview the page before saving. That way if someone introduces invalid XHTML then they can't save the page in the first place (unless they post directly to the right URL).