mirror of
https://github.com/Neetpone/ponepaste.git
synced 2025-03-12 22:50:07 +01:00
108 lines
3.3 KiB
PHP
108 lines
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 'markdown.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;
|
||
|
}
|
||
|
}
|