Markdown syntax with GeSHi code highlighting added. Version: 0.2 Author: Gerard van Helden Author URI: http://melp.nl */ define('MARKDOWN_PARSER_CLASS', 'MarkdownGeshi_Parser'); require_once 'pastedown.php'; require_once 'wp-syntax/geshi/geshi.php'; class MarkdownGeshi_Parser extends MarkdownExtra_Parser { /** * The 'processing instruction' pattern for the code blocks parser. * Format is defined as : #!language@linenumber. The @linenumber * part is optional. * * Optional parameters are allowed past a semicolon. */ public $shebang = '/^ \s* \#!(?P\w+) (?:@(?P\d+))? \s* (?:;\s*(?P.*?)\s*)?\n (?P.*) /sx'; function hasShebang($code) { if(preg_match($this->shebang, $code, $m)) { return $m; } return false; } function _doCodeBlocks_callback($matches) { if($m = $this->hasShebang($matches[1])) { return $this->_doGeshi($m); } else { return parent::_doCodeBlocks_callback($matches); } } function _doFencedCodeBlocks_callback($matches) { if($m = $this->hasShebang($matches[2])) { return $this->_doGeshi($m); } else { return parent::_doFencedCodeBlocks_callback($matches); } } function _doGeshi($shebangMatch) { $language = $shebangMatch['lang']; $line = (int) (($shebangMatch['linenumber'] > 1) ? $shebangMatch['linenumber'] : 0); $codeblock = $shebangMatch['code']; $highlighter = new GeSHi($this->outdent(trim($codeblock)), $language); $highlighted = $highlighter->parse_code(); if($line) { preg_match('!^(\s*]+>)(.*)()!s', $highlighted, $m); $ret = '$0', $m[2] ); $ret .= ''; $ret = $m[1] . $ret . $m[3]; } else { $ret = $highlighted; } if($shebangMatch['params']) { $ret = $this->_processGeshiParams($ret, $shebangMatch['params']); } return "\n\n" . $this->hashBlock($ret) . "\n\n"; } function _processGeshiParams($highlighted, $params) { foreach(explode(',', $params) as $keyValuePair) { @list($key, $value) = array_map('trim', explode('=', $keyValuePair)); if($key && $value) { switch($key) { case 'gist': $highlighted = sprintf( '(GIST: %1$d)', $value ) . $highlighted ; break; } } } return $highlighted; } }