geshi.inc.php
コードハイライトプラグイン geshi のハック -- 取り込んでもらいました
Table of Contents |
config ファイルが少しだけ利用可能です。他は過去ログ
ダウンロード
- plugin
- geshi.inc.php
- geshi_config
- geshi.inc.php
- init
変更箇所
- ユーザー設定を init/geshi.int.php で行えるように (plus, 本家ともに)
- PLUGIN_GESHI_LIB_DIR の最後に / は強制(pukiwiki 流儀)
- 行番号表示 PLUGIN_GESHI_LINE_NUMBERS を追加。実はテストしていない。
- ユーザー言語設定(色など)を適用できるように。
- geshi_user/php.php のようなものを用意する。geshi/geshi/php.php からコピーして編集する。
- geshi/geshi/php.php をそのまま編集しても良いが、init/geshi.ini.php と同様にユーザ設定を分離できる仕組み。
- geshi_user/{php.php,c.php,cpp.php} を用意した。php.php は http://www.php.net
ライクに。cpp は visual c++ ライクに。c は cpp のコピー。
- どの項目がどの意味をもつのかは、やはり geshi/geshi/php.php を覗くとわかりやすい。(コピー、編集するので必然的に覗いてくれるはず)
- STYLES だけにしぼっているのは、ただの容量削減。しぼれるように array_merge。
- php の highlight_string を使用するオプションを消去
- 違う設定項目が増えてユーザーを惑わすことになりそうなので。キャッシュもあるので早さはいらないだろう。
- キャッシュの命名規則を encode(ページ名).geshi1 -> encode(ページ名)_1.geshi
- 拡張子は共通しているからこそ拡張子なので
要望
- 強制キャッシュリセットオプション reset が欲しい。
- タイムスタンプを更新したくないときがあるので。
- plus のプレビューで保存すらしなくてもキャッシュリセットできて便利なのです。
ポイント
geshi のマニュアルでは色設定は
$geshi->set_keyword_group_style($group, $styles); $geshi->set_comments_style($group, $styles); $geshi->set_escape_characters_style($styles[, $preserve_defaults]); $geshi->set_symbols_style($styles[, $preserve_defaults]); $geshi->set_strings_style($styles[, $preserve_defaults]); $geshi->set_numbers_style($styles[, $preserve_defaults]); $geshi->set_methods_style($key, $styles, [, $preserve_defaults]);
のようにする、とあります。これはただの setter です。最初はこれを使用しようとしました。
私の方式ではそれらの関数は使わず、すっとばして
$geshi->language_data['STYLES'] = $language_data['STYLE'];
のように直接代入しています。(array_merge の部分)
設定を読み込んで、バラして、各々の関数を呼んで(そのために、keyword, comments の $group が言語毎にいくつあるか調べて)、とするよりはこちらのほうが明らかに簡潔に済みましたし、設定の形式を悩むまでもなく、言語設定オリジナル(geshi/geshi/php.php など)のコピーで済んだので、これが良いと思いました。
$group == 1 とはなんのことだ、というのも、geshi の言語設定ファイルをみないと正直わからないので、編集の際にコピーを強要するこのスタイルの場合、自然に中を覗くことになり、逆に設定したいユーザーにとってやさしいとも判断しました。
メモ
/* PHP pre {} Style for the overall code block: .de1 .de2 Default Styles (Others) .kw1 Keywords I (if, do, while etc) .kw2 Keywords II (null, true, false etc) .kw3 Keywords III Inbuilt Functions (echo, print etc) .kw4 Keywords IV Data Types (int, boolean etc) .co1 .co2 .coMULTI Comments (//, etc) .es0 Escaped Characters (\n, \t etc) .br0 Brackets ( ([{}]) etc) .st0 Strings ("foo" etc) .nu0 Numbers (1, -54, 2.5 etc) .me0 Methods (Foo.bar() etc) */
diff
--- ../../plugin/geshi.inc.php 2007-01-13 10:05:00.000000000 -0500 +++ geshi.inc.php 2007-01-24 13:58:13.234375000 -0500 @@ -3,31 +3,37 @@ /** * geshi.inc.php - Highlight the code using GeSHi library * + * Modified by sonots <http://note.sontos.com/?PukiWiki> + * * @author revulo * @licence http://www.gnu.org/licenses/gpl.html GPLv2 * @version 0.5 * @link http://www.revulo.com/PukiWiki/Plugin/GeSHi.html */ +if (! defined('INIT_DIR')) // if not Plus! + if (file_exists(DATA_HOME . 'init/geshi.ini.php')) + include_once(DATA_HOME . 'init/geshi.ini.php'); + // Directory path of GeSHi library -define('PLUGIN_GESHI_LIB_DIR', PLUGIN_DIR . 'geshi/'); +if (! defined('PLUGIN_GESHI_LIB_DIR')) + define('PLUGIN_GESHI_LIB_DIR', PLUGIN_DIR . 'geshi/'); + +// Directory path of GeSHi user language data (color) +if (! defined('PLUGIN_GESHI_USER_DIR')) + define('PLUGIN_GESHI_USER_DIR', PLUGIN_DIR . 'geshi_user/'); // Default language -define('PLUGIN_GESHI_DEFAULT_LANGUAGE', ''); +if (! defined('PLUGIN_DEFAULT_LANGUAGE')) + define('PLUGIN_GESHI_DEFAULT_LANGUAGE', ''); // Cache HTML of the highlighted code -define('PLUGIN_GESHI_CACHE', true); - -// Use built-in highlight_string() function to highlight PHP code -define('PLUGIN_GESHI_BUILTIN_HIGHLIGHT', false); - -// Configuration for highlight_string() function -define('PLUGIN_GESHI_HIGHLIGHT_COMMENT', '#FF8800'); -define('PLUGIN_GESHI_HIGHLIGHT_DEFAULT', '#0000BB'); -define('PLUGIN_GESHI_HIGHLIGHT_HTML', '#000000'); -define('PLUGIN_GESHI_HIGHLIGHT_KEYWORD', '#007700'); -define('PLUGIN_GESHI_HIGHLIGHT_STRING', '#DD0000'); +if (! defined('PLUGIN_GESHI_CACHE')) + define('PLUGIN_GESHI_CACHE', true); +// Display Line Numbers +if (! defined('PLUGIN_GESHI_LINE_NUMBERS')) + define('PLUGIN_GESHI_LINE_NUMBERS', false); function plugin_geshi_convert() { @@ -52,8 +58,6 @@ if ($language == '' || $language == 'pre') { $html = '<pre>' . htmlspecialchars($source) . '</pre>'; - } else if ($language == 'php' && PLUGIN_GESHI_BUILTIN_HIGHLIGHT) { - $html = plugin_geshi_highlight_php($source); } else if (PLUGIN_GESHI_CACHE == false) { $html = plugin_geshi_highlight_code($source, $language); } else { @@ -68,48 +72,23 @@ return $html; } -function plugin_geshi_highlight_php($source) -{ - ini_set('highlight.comment', PLUGIN_GESHI_HIGHLIGHT_COMMENT); - ini_set('highlight.default', PLUGIN_GESHI_HIGHLIGHT_DEFAULT); - ini_set('highlight.html', PLUGIN_GESHI_HIGHLIGHT_HTML); - ini_set('highlight.keyword', PLUGIN_GESHI_HIGHLIGHT_KEYWORD); - ini_set('highlight.string', PLUGIN_GESHI_HIGHLIGHT_STRING); - - if (strncmp($source, '<?', 2) != 0) { - $source = "<?php\n" . $source; - } - $html = highlight_string($source, true); - - $before = array( - '<?php<br />', - ">\n<", - 'code>', - '<font color="', - 'font>', - ); - $after = array( - '', - '><', - 'pre>', - '<span style="color: ', - 'span>', - ); - return str_replace($before, $after, $html); -} function plugin_geshi_highlight_code($source, $language) { if (!class_exists('GeSHi')) { - $dir = PLUGIN_GESHI_LIB_DIR; - if ($dir && substr($dir, -1) != '/') { - $dir .= '/'; - } - require_once $dir . 'geshi.php'; + require_once PLUGIN_GESHI_LIB_DIR . 'geshi.php'; } $geshi = new GeSHi($source, $language); -// $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS); + if (is_readable(PLUGIN_GESHI_USER_DIR . $geshi->language . '.php')) { + // $geshi->set_language_path(PLUGIN_GESHI_USER_DIR); // does overwrite + require(PLUGIN_GESHI_USER_DIR . $geshi->language . '.php'); + $geshi->language_data = + array_merge($geshi->language_data, $language_data); + } + if (PLUGIN_GESHI_LINE_NUMBERS === TRUE) { + $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS); + } return $geshi->parse_code(); } @@ -119,7 +98,7 @@ static $counts = array(); $page = $vars['page']; - return CACHE_DIR . encode($page) . '.geshi' . ++$counts[$page]; + return CACHE_DIR . encode($page) . '_' . ++$counts[$page] . '.geshi'; } function plugin_geshi_read_file($filename)
サンプル
<?php /** * phphighlight.inc.php - Highlight the code using highlight_string() function * * @author revulo * @licence http://www.gnu.org/licenses/gpl.html GPLv2 */ function plugin_phphighlight_convert() { $args = func_get_args(); $source = rtrim(end($args)); $html = highlight_string($source, true); $before = array( ">\n<", 'code>', '<font color="', 'font>', ); $after = array( '><', 'pre>', '<span style="color: ', 'span>', ); return str_replace($before, $after, $html); } ?>