geshi.inc.php
Tag: PukiWiki Old Plugin Hack
コードハイライトプラグイン 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); } ?>


