The MultiMarkdown ToC
Do you ever feel like you’re never finished? I do, and I’m not happy with the fact that I haven’t been able to make Scrivener trigger the mmd-xslt script following a compile to MultiMarkdown HTML. Fine. As with the original XML epiphany, I knew there had to be code to perform an XSLT transformation in PHP on the server. Certainly there is, and my content-doc.php content template has further evolved into an XSLT transformation powerhouse. If a custom variable is provided with a path to the XSLT file on disk, and that files exists, the code transforms the XML using the provided XSLT style sheet. Here is a snippet:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<code><header class="page-header"> <?php $title = get_the_title(); $docs_path = get_post_meta(get_the_ID(), 'docs_path', true); if($docs_path && file_exists($docs_path)) { libxml_use_internal_errors(true); $xml = simplexml_load_file($docs_path); foreach (libxml_get_errors() as $error) { error_log($error->message); } if($xml) { $title = $xml->head->title; $xslt_path = get_post_meta(get_the_ID(), 'xslt_path', true); if($xslt_path && file_exists($xslt_path)) { $xslt = simplexml_load_file($xslt_path); foreach (libxml_get_errors() as $error) { error_log($error->message); } if($xslt) { $proc = new XSLTProcessor; $proc->importStyleSheet($xslt); $xml = simplexml_import_dom($proc->transformToDoc($xml)); } } } } printf('<h1 class="entry-title">%s</h1>', $title); ?> </header><!-- .entry-header --> </code> |
Notes
Something to take note of in the PHP code. transformToDoc returns a DOMDocument object and the $xml variable contains a SimpleXMLElement object returned by the simplexml_load_file() method. If you recall, we insert the XML into the page by echoing the proper child element using the asXml() method. Therefore in order to leave that code intact, I import the DOMDocument back into $xml.