geshi.inc.php

Top > Old > Hack > geshi.inc.php

コードハイライトプラグイン geshi のハック -- 取り込んでもらいました

Table of Contents

config ファイルが少しだけ利用可能です。他は過去ログ

ダウンロード

変更箇所

  • ユーザー設定を 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(
-        '&lt;?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);
}

?>