Related to uche's recent entry about PyBlosxom + CherryPy, I recently wrote a 4XSLT extension that compiles a 4Suite Repository RawFile (which holds a Markdown document) into an HTML 4.1 document on the fly. I'm using it to host a collaborative markdown-based Wiki.
The general idea to allow the Markdown document to reside in the repository and be editable by anyone (or specific users). The raw content of that document can be viewed with a different URL: http://metacognition.info/markdown-documents/RDFInterfaces.txt . That is the actual location of the file, the previous URL is actually a REST service setup with the 4Suite Server instance running on metacognition that listens for requests with a leading /markdown and redirects the request to a stylesheet that compiles the content of the file and returns an HTML document.
The relevant section of the server.xml document is below:
<Rule pattern='/markdown/(?P<doc>.*)' extra-args='path=/markdown-documents/\1' xslt-transform='/extensions/RenderMarkdown.xslt' />
This makes use of a feature in the 4Suite Repository Server architecture that allows you to register URL patterns to XSLT transformations. In this case, all incoming requests for paths with a leading /markdown are interpreted as a request to execute the stylesheet /extensions/RenderMarkdown.xslt with a top-level path parameter which is the full path to the markdown document (/markdown-documents/RDFInterfaces.txt in this case). For more on these capabilities, see: The architecture of 4Suite Web applications.
The rendering stylesheet is below:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:md="http://metacognition.info/extensions/markdown.dd#" xmlns:exsl="http://exslt.org/common" version="1.0" xmlns:ftext="http://xmlns.4suite.org/ext" xmlns:fcore="http://xmlns.4suite.org/4ss/score" extension-element-prefixes="exsl md fcore" exclude-result-prefixes="fcore ftext exsl md xsl"> <xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd"/> <xsl:param name="path"/> <xsl:param name="title"/> <xsl:param name="css"/> <xsl:template match="/"> <html> <head> <title><xsl:value-of select="$title"/></title> <link href="{$css}" type="text/css" rel="stylesheet"/> </head> <xsl:copy-of select="md:renderMarkdown(fcore:get-content($path))"/> </html> </xsl:template> </xsl:stylesheet>
This stylesheet makes use of a md:renderMarkdown extension function defined in the Python module below:
from pymarkdown import Markdown from Ft.Xml.Xslt import XsltElement,ContentInfo,AttributeInfo from Ft.Xml.XPath import Conversions from Ft.Xml import Domlette NS=U'http://metacognition.info/extensions/markdown.dd#' def RenderMarkdown(context, markDownString): markDownString=Conversions.StringValue(markDownString) rt="<body>%s</body>"%Markdown(markDownString) dom = Domlette.NonvalidatingReader.parseString(str(rt),"urn:uuid:Blah") return [dom.documentElement] ExtFunctions = { (NS, 'renderMarkdown'): RenderMarkdown, }
Notice that the stylesheet allows for the title and css to be specified as parameters to the original URL.
The markdown compilation mechanism is none other than the pymarkdown.py used by Copia.
For now, the Markdown documents can only be edited remotely by editors that know how to submit content over HTTP via PUT as well as handle HTTP authentication challenges if met with a 401 for a resource in the repository that isn't publicly available (in this day and age it's a shame there are only a few such editors - The one I use primarily is the Oxygen XML Editor).
I hope to later add a simple HTML-based form for live modification of the markdown documents which should complete the very simple framework for a markdown-based, 4Suite-enabled mini-Wiki.