# HG changeset patch # User Dan # Date 1202688004 18000 # Node ID c715631f809a90cf2401dffd119bfb485deeeec1 # Parent 441963e5b07a3d4bffa6dfbb86c262d2b69f629e First working commit. Works using .... Supports all languages supported by default in GeSHi diff -r 441963e5b07a -r c715631f809a plugins/GeSHi.php --- a/plugins/GeSHi.php Sun Feb 10 18:10:52 2008 -0500 +++ b/plugins/GeSHi.php Sun Feb 10 19:00:04 2008 -0500 @@ -0,0 +1,126 @@ + tag support +$plugins->attachHook('text_wiki_construct', 'geshi_disable_tw_code($this);'); + +function geshi_disable_tw_code($tw) +{ + $tw->disable[] = 'Code'; + foreach ( $tw->rules as $i => $rule ) + { + if ( $rule == 'Code' ) + { + unset($tw->rules[$i]); + return true; + } + } +} + +// Prevent tags from being stripped or sanitized (the plugin will handle all sanitation) +$plugins->attachHook('render_sanitize_pre', 'geshi_strip_code($text, $geshi_code_blocks, $random_id);'); +$plugins->attachHook('render_sanitize_post', 'geshi_restore_code($text, $geshi_code_blocks, $random_id);'); + +function geshi_strip_code(&$text, &$codeblocks, $random_id) +{ + global $geshi_supported_formats; + $codeblocks = array(); + $sf = '(' . implode('|', $geshi_supported_formats) . ')'; + preg_match_all('/([\w\W]*?)<\/code>/ms', $text, $matches); + + // for debug + /* + if ( strstr($text, '' . htmlspecialchars(print_r($matches, true)) . '
' . htmlspecialchars($text) . '
' . htmlspecialchars('/([\w\W]*?)<\/code>/')); + */ + + foreach ( $matches[0] as $i => $match ) + { + $codeblocks[$i] = array( + 'match' => $match, + 'lang' => $matches[1][$i], + 'code' => $matches[2][$i] + ); + $text = str_replace_once($match, "{GESHI_BLOCK:$i:$random_id}", $text); + } +} + +function geshi_restore_code(&$text, &$codeblocks, $random_id) +{ + foreach ( $codeblocks as $i => $match ) + { + $text = str_replace_once("{GESHI_BLOCK:$i:$random_id}", $match['match'], $text); + } +} + +// Formatter hook - where the actual highlighting is performed +$plugins->attachHook('render_wikiformat_veryearly', 'geshi_strip_code($text, $codeblocks, $random_id);'); +$plugins->attachHook('render_wikiformat_post', 'geshi_perform_highlight($result, $codeblocks, $random_id);'); + +function geshi_perform_highlight(&$text, &$codeblocks, $random_id) +{ + static $did_header_tweak = false; + if ( !$did_header_tweak ) + { + $did_header_tweak = true; + global $template; + $template->add_header(' + '); + } + if ( !defined('GESHI_ROOT') ) + define('GESHI_ROOT', ENANO_ROOT . '/plugins/geshi/'); + + require_once ( GESHI_ROOT . '/base.php' ); + + foreach ( $codeblocks as $i => $match ) + { + $lang =& $match['lang']; + $code =& $match['code']; + + $geshi = new GeSHi($code, $lang, null); + $geshi->set_header_type(GESHI_HEADER_PRE); + // $geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS); + $geshi->set_overall_class('geshi_highlighted'); + $parsed = $geshi->parse_code(); + + $text = str_replace_once("{GESHI_BLOCK:$i:$random_id}", $parsed, $text); + } +} diff -r 441963e5b07a -r c715631f809a plugins/geshi/geshi/html.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/geshi/geshi/html.php Sun Feb 10 19:00:04 2008 -0500 @@ -0,0 +1,255 @@ + 'HTML', + 'COMMENT_SINGLE' => array(), + 'COMMENT_MULTI' => array(''), + 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE, + 'QUOTEMARKS' => array("'", '"'), + 'ESCAPE_CHAR' => '', + 'KEYWORDS' => array( + 1 => array( + ), + 2 => array( + '<a>', '<abbr>', '<acronym>', '<address>', '<applet>', + '<a', '<abbr', '<acronym', '<address', '<applet', + '</a>', '</abbr>', '</acronym>', '</address>', '</applet>', + '</a', '</abbr', '</acronym', '</address', '</applet', + + '<base>', '<basefont>', '<bdo>', '<big>', '<blockquote>', '<body>', '<br>', '<button>', '<b>', + '<base', '<basefont', '<bdo', '<big', '<blockquote', '<body', '<br', '<button', '<b', + '</base>', '</basefont>', '</bdo>', '</big>', '</blockquote>', '</body>', '</br>', '</button>', '</b>', + '</base', '</basefont', '</bdo', '</big', '</blockquote', '</body', '</br', '</button', '</b', + + '<caption>', '<center>', '<cite>', '<code>', '<colgroup>', '<col>', + '<caption', '<center', '<cite', '<code', '<colgroup', '<col', + '</caption>', '</center>', '</cite>', '</code>', '</colgroup>', '</col>', + '</caption', '</center', '</cite', '</code', '</colgroup', '</col', + + '<dd>', '<del>', '<dfn>', '<dir>', '<div>', '<dl>', '<dt>', + '<dd', '<del', '<dfn', '<dir', '<div', '<dl', '<dt', + '</dd>', '</del>', '</dfn>', '</dir>', '</div>', '</dl>', '</dt>', + '</dd', '</del', '</dfn', '</dir', '</div', '</dl', '</dt', + + '<em>', + '<em', + '</em>', + '</em', + + '<fieldset>', '<font>', '<form>', '<frame>', '<frameset>', + '<fieldset', '<font', '<form', '<frame', '<frameset', + '</fieldset>', '</font>', '</form>', '</frame>', '</frameset>', + '</fieldset', '</font', '</form', '</frame', '</frameset', + + '<h1>', '<h2>', '<h3>', '<h4>', '<h5>', '<h6>', '<head>', '<hr>', '<html>', + '<h1', '<h2', '<h3', '<h4', '<h5', '<h6', '<head', '<hr', '<html', + '</h1>', '</h2>', '</h3>', '</h4>', '</h5>', '</h6>', '</head>', '</hr>', '</html>', + '</h1', '</h2', '</h3', '</h4', '</h5', '</h6', '</head', '</hr', '</html', + + '<iframe>', '<ilayer>', '<img>', '<input>', '<ins>', '<isindex>', '<i>', + '<iframe', '<ilayer', '<img', '<input', '<ins', '<isindex', '<i', + '</iframe>', '</ilayer>', '</img>', '</input>', '</ins>', '</isindex>', '</i>', + '</iframe', '</ilayer', '</img', '</input', '</ins', '</isindex', '</i', + + '<kbd>', + '<kbd', + '&t;/kbd>', + '</kbd', + + '<label>', '<legend>', '<link>', '<li>', + '<label', '<legend', '<link', '<li', + '</label>', '</legend>', '</link>', '</li>', + '</label', '</legend', '</link', '</li', + + '<map>', '<meta>', + '<map', '<meta', + '</map>', '</meta>', + '</map', '</meta', + + '<noframes>', '<noscript>', + '<noframes', '<noscript', + '</noframes>', '</noscript>', + '</noframes', '</noscript', + + '<object>', '<ol>', '<optgroup>', '<option>', + '<object', '<ol', '<optgroup', '<option', + '</object>', '</ol>', '</optgroup>', '</option>', + '</object', '</ol', '</optgroup', '</option', + + '<param>', '<pre>', '<p>', + '<param', '<pre', '<p', + '</param>', '</pre>', '</p>', + '</param', '</pre', '</p', + + '<q>', + '<q', + '</q>', + '</q', + + '<samp>', '<script>', '<select>', '<small>', '<span>', '<strike>', '<strong>', '<style>', '<sub>', '<sup>', '<s>', + '<samp', '<script', '<select', '<small', '<span', '<strike', '<strong', '<style', '<sub', '<sup', '<s', + '</samp>', '</script>', '</select>', '</small>', '</span>', '</strike>', '</strong>', '</style>', '</sub>', '</sup>', '</s>', + '</samp', '</script', '</select', '</small', '</span', '</strike', '</strong', '</style', '</sub', '</sup', '</s', + + '<table>', '<tbody>', '<td>', '<textarea>', '<text>', '<tfoot>', '<thead>', '<th>', '<title>', '<tr>', '<tt>', + '<table', '<tbody', '<td', '<textarea', '<text', '<tfoot', '<tfoot', '<thead', '<th', '<title', '<tr', '<tt', + '</table>', '</tbody>', '</td>', '</textarea>', '</text>', '</tfoot>', '</thead', '</tfoot', '</th>', '</title>', '</tr>', '</tt>', + '</table', '</tbody', '</td', '</textarea', '</text', '</tfoot', '</tfoot', '</thead', '</th', '</title', '</tr', '</tt', + + '<ul>', '<u>', + '<ul', '<u', + '</ul>', '</ul>', + '</ul', '</u', + + '<var>', + '<var', + '</var>', + '</var', + + '>', '<' + ), + 3 => array( + 'abbr', 'accept-charset', 'accept', 'accesskey', 'action', 'align', 'alink', 'alt', 'archive', 'axis', + 'background', 'bgcolor', 'border', + 'cellpadding', 'cellspacing', 'char', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'classid', 'clear', 'code', 'codebase', 'codetype', 'color', 'cols', 'colspan', 'compact', 'content', 'coords', + 'data', 'datetime', 'declare', 'defer', 'dir', 'disabled', + 'enctype', + 'face', 'for', 'frame', 'frameborder', + 'headers', 'height', 'href', 'hreflang', 'hspace', 'http-equiv', + 'id', 'ismap', + 'label', 'lang', 'language', 'link', 'longdesc', + 'marginheight', 'marginwidth', 'maxlength', 'media', 'method', 'multiple', + 'name', 'nohref', 'noresize', 'noshade', 'nowrap', + 'object', 'onblur', 'onchange', 'onclick', 'ondblclick', 'onfocus', 'onkeydown', 'onkeypress', 'onkeyup', 'onload', 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onreset', 'onselect', 'onsubmit', 'onunload', + 'profile', 'prompt', + 'readonly', 'rel', 'rev', 'rowspan', 'rows', 'rules', + 'scheme', 'scope', 'scrolling', 'selected', 'shape', 'size', 'span', 'src', 'standby', 'start', 'style', 'summary', + 'tabindex', 'target', 'text', 'title', 'type', + 'usemap', + 'valign', 'value', 'valuetype', 'version', 'vlink', 'vspace', + 'width' + ) + ), + 'SYMBOLS' => array( + '/', '=' + ), + 'CASE_SENSITIVE' => array( + GESHI_COMMENTS => false, + 1 => false, + 2 => false, + 3 => false, + ), + 'STYLES' => array( + 'KEYWORDS' => array( + 1 => 'color: #b1b100;', + 2 => 'color: #000000; font-weight: bold;', + 3 => 'color: #000066;' + ), + 'COMMENTS' => array( + 'MULTI' => 'color: #808080; font-style: italic;' + ), + 'ESCAPE_CHAR' => array( + 0 => 'color: #000099; font-weight: bold;' + ), + 'BRACKETS' => array( + 0 => 'color: #66cc66;' + ), + 'STRINGS' => array( + 0 => 'color: #ff0000;' + ), + 'NUMBERS' => array( + 0 => 'color: #cc66cc;' + ), + 'METHODS' => array( + ), + 'SYMBOLS' => array( + 0 => 'color: #66cc66;' + ), + 'SCRIPT' => array( + 0 => 'color: #00bbdd;', + 1 => 'color: #ddbb00;', + 2 => 'color: #009900;' + ), + 'REGEXPS' => array( + ) + ), + 'URLS' => array( + 1 => '', + 2 => 'http://december.com/html/4/element/{FNAME}.html', + 3 => '' + ), + 'OOLANG' => false, + 'OBJECT_SPLITTERS' => array( + ), + 'REGEXPS' => array( + ), + 'STRICT_MODE_APPLIES' => GESHI_ALWAYS, + 'SCRIPT_DELIMITERS' => array( + 0 => array( + ' '>' + ), + 1 => array( + '&' => ';' + ), + 2 => array( + '<' => '>' + ) + ), + 'HIGHLIGHT_STRICT_BLOCK' => array( + 0 => false, + 1 => false, + 2 => true + ), + 'TAB_WIDTH' => 4 +); + +?> diff -r 441963e5b07a -r c715631f809a plugins/geshi/geshi/html4strict.php --- a/plugins/geshi/geshi/html4strict.php Sun Feb 10 18:10:52 2008 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,255 +0,0 @@ - 'HTML', - 'COMMENT_SINGLE' => array(), - 'COMMENT_MULTI' => array(''), - 'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE, - 'QUOTEMARKS' => array("'", '"'), - 'ESCAPE_CHAR' => '', - 'KEYWORDS' => array( - 1 => array( - ), - 2 => array( - '<a>', '<abbr>', '<acronym>', '<address>', '<applet>', - '<a', '<abbr', '<acronym', '<address', '<applet', - '</a>', '</abbr>', '</acronym>', '</address>', '</applet>', - '</a', '</abbr', '</acronym', '</address', '</applet', - - '<base>', '<basefont>', '<bdo>', '<big>', '<blockquote>', '<body>', '<br>', '<button>', '<b>', - '<base', '<basefont', '<bdo', '<big', '<blockquote', '<body', '<br', '<button', '<b', - '</base>', '</basefont>', '</bdo>', '</big>', '</blockquote>', '</body>', '</br>', '</button>', '</b>', - '</base', '</basefont', '</bdo', '</big', '</blockquote', '</body', '</br', '</button', '</b', - - '<caption>', '<center>', '<cite>', '<code>', '<colgroup>', '<col>', - '<caption', '<center', '<cite', '<code', '<colgroup', '<col', - '</caption>', '</center>', '</cite>', '</code>', '</colgroup>', '</col>', - '</caption', '</center', '</cite', '</code', '</colgroup', '</col', - - '<dd>', '<del>', '<dfn>', '<dir>', '<div>', '<dl>', '<dt>', - '<dd', '<del', '<dfn', '<dir', '<div', '<dl', '<dt', - '</dd>', '</del>', '</dfn>', '</dir>', '</div>', '</dl>', '</dt>', - '</dd', '</del', '</dfn', '</dir', '</div', '</dl', '</dt', - - '<em>', - '<em', - '</em>', - '</em', - - '<fieldset>', '<font>', '<form>', '<frame>', '<frameset>', - '<fieldset', '<font', '<form', '<frame', '<frameset', - '</fieldset>', '</font>', '</form>', '</frame>', '</frameset>', - '</fieldset', '</font', '</form', '</frame', '</frameset', - - '<h1>', '<h2>', '<h3>', '<h4>', '<h5>', '<h6>', '<head>', '<hr>', '<html>', - '<h1', '<h2', '<h3', '<h4', '<h5', '<h6', '<head', '<hr', '<html', - '</h1>', '</h2>', '</h3>', '</h4>', '</h5>', '</h6>', '</head>', '</hr>', '</html>', - '</h1', '</h2', '</h3', '</h4', '</h5', '</h6', '</head', '</hr', '</html', - - '<iframe>', '<ilayer>', '<img>', '<input>', '<ins>', '<isindex>', '<i>', - '<iframe', '<ilayer', '<img', '<input', '<ins', '<isindex', '<i', - '</iframe>', '</ilayer>', '</img>', '</input>', '</ins>', '</isindex>', '</i>', - '</iframe', '</ilayer', '</img', '</input', '</ins', '</isindex', '</i', - - '<kbd>', - '<kbd', - '&t;/kbd>', - '</kbd', - - '<label>', '<legend>', '<link>', '<li>', - '<label', '<legend', '<link', '<li', - '</label>', '</legend>', '</link>', '</li>', - '</label', '</legend', '</link', '</li', - - '<map>', '<meta>', - '<map', '<meta', - '</map>', '</meta>', - '</map', '</meta', - - '<noframes>', '<noscript>', - '<noframes', '<noscript', - '</noframes>', '</noscript>', - '</noframes', '</noscript', - - '<object>', '<ol>', '<optgroup>', '<option>', - '<object', '<ol', '<optgroup', '<option', - '</object>', '</ol>', '</optgroup>', '</option>', - '</object', '</ol', '</optgroup', '</option', - - '<param>', '<pre>', '<p>', - '<param', '<pre', '<p', - '</param>', '</pre>', '</p>', - '</param', '</pre', '</p', - - '<q>', - '<q', - '</q>', - '</q', - - '<samp>', '<script>', '<select>', '<small>', '<span>', '<strike>', '<strong>', '<style>', '<sub>', '<sup>', '<s>', - '<samp', '<script', '<select', '<small', '<span', '<strike', '<strong', '<style', '<sub', '<sup', '<s', - '</samp>', '</script>', '</select>', '</small>', '</span>', '</strike>', '</strong>', '</style>', '</sub>', '</sup>', '</s>', - '</samp', '</script', '</select', '</small', '</span', '</strike', '</strong', '</style', '</sub', '</sup', '</s', - - '<table>', '<tbody>', '<td>', '<textarea>', '<text>', '<tfoot>', '<thead>', '<th>', '<title>', '<tr>', '<tt>', - '<table', '<tbody', '<td', '<textarea', '<text', '<tfoot', '<tfoot', '<thead', '<th', '<title', '<tr', '<tt', - '</table>', '</tbody>', '</td>', '</textarea>', '</text>', '</tfoot>', '</thead', '</tfoot', '</th>', '</title>', '</tr>', '</tt>', - '</table', '</tbody', '</td', '</textarea', '</text', '</tfoot', '</tfoot', '</thead', '</th', '</title', '</tr', '</tt', - - '<ul>', '<u>', - '<ul', '<u', - '</ul>', '</ul>', - '</ul', '</u', - - '<var>', - '<var', - '</var>', - '</var', - - '>', '<' - ), - 3 => array( - 'abbr', 'accept-charset', 'accept', 'accesskey', 'action', 'align', 'alink', 'alt', 'archive', 'axis', - 'background', 'bgcolor', 'border', - 'cellpadding', 'cellspacing', 'char', 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'classid', 'clear', 'code', 'codebase', 'codetype', 'color', 'cols', 'colspan', 'compact', 'content', 'coords', - 'data', 'datetime', 'declare', 'defer', 'dir', 'disabled', - 'enctype', - 'face', 'for', 'frame', 'frameborder', - 'headers', 'height', 'href', 'hreflang', 'hspace', 'http-equiv', - 'id', 'ismap', - 'label', 'lang', 'language', 'link', 'longdesc', - 'marginheight', 'marginwidth', 'maxlength', 'media', 'method', 'multiple', - 'name', 'nohref', 'noresize', 'noshade', 'nowrap', - 'object', 'onblur', 'onchange', 'onclick', 'ondblclick', 'onfocus', 'onkeydown', 'onkeypress', 'onkeyup', 'onload', 'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onreset', 'onselect', 'onsubmit', 'onunload', - 'profile', 'prompt', - 'readonly', 'rel', 'rev', 'rowspan', 'rows', 'rules', - 'scheme', 'scope', 'scrolling', 'selected', 'shape', 'size', 'span', 'src', 'standby', 'start', 'style', 'summary', - 'tabindex', 'target', 'text', 'title', 'type', - 'usemap', - 'valign', 'value', 'valuetype', 'version', 'vlink', 'vspace', - 'width' - ) - ), - 'SYMBOLS' => array( - '/', '=' - ), - 'CASE_SENSITIVE' => array( - GESHI_COMMENTS => false, - 1 => false, - 2 => false, - 3 => false, - ), - 'STYLES' => array( - 'KEYWORDS' => array( - 1 => 'color: #b1b100;', - 2 => 'color: #000000; font-weight: bold;', - 3 => 'color: #000066;' - ), - 'COMMENTS' => array( - 'MULTI' => 'color: #808080; font-style: italic;' - ), - 'ESCAPE_CHAR' => array( - 0 => 'color: #000099; font-weight: bold;' - ), - 'BRACKETS' => array( - 0 => 'color: #66cc66;' - ), - 'STRINGS' => array( - 0 => 'color: #ff0000;' - ), - 'NUMBERS' => array( - 0 => 'color: #cc66cc;' - ), - 'METHODS' => array( - ), - 'SYMBOLS' => array( - 0 => 'color: #66cc66;' - ), - 'SCRIPT' => array( - 0 => 'color: #00bbdd;', - 1 => 'color: #ddbb00;', - 2 => 'color: #009900;' - ), - 'REGEXPS' => array( - ) - ), - 'URLS' => array( - 1 => '', - 2 => 'http://december.com/html/4/element/{FNAME}.html', - 3 => '' - ), - 'OOLANG' => false, - 'OBJECT_SPLITTERS' => array( - ), - 'REGEXPS' => array( - ), - 'STRICT_MODE_APPLIES' => GESHI_ALWAYS, - 'SCRIPT_DELIMITERS' => array( - 0 => array( - ' '>' - ), - 1 => array( - '&' => ';' - ), - 2 => array( - '<' => '>' - ) - ), - 'HIGHLIGHT_STRICT_BLOCK' => array( - 0 => false, - 1 => false, - 2 => true - ), - 'TAB_WIDTH' => 4 -); - -?>