ponepaste/includes/geshi/pastedown.php
aftercase 5b2e3d5177 Initial commit
Initial commit
2021-07-10 19:18:17 +01:00

108 lines
No EOL
3.3 KiB
PHP

<?php
/*
Plugin Name: Markdown Geshi
Plugin URI: http://github.com/drm/Markdown_Geshi
Description: <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> 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<lang>\w+)
(?:@(?P<linenumber>\d+))?
\s*
(?:;\s*(?P<params>.*?)\s*)?\n
(?P<code>.*)
/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*<pre[^>]+>)(.*)(</pre>)!s', $highlighted, $m);
$ret = '<ol';
if($line) {
$ret .= ' start="' . $line .'"';
}
$ret .= '>';
$ret .= preg_replace(
'/.+(\n|$)/',
'<li>$0</li>',
$m[2]
);
$ret .= '</ol>';
$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(
'<cite class="gist">(GIST: <a href="https://gist.github.com/%1$d" target="_blank">%1$d</a>)</cite>',
$value
)
. $highlighted
;
break;
}
}
}
return $highlighted;
}
}