Text::VimColor を使って chalow のソース表示に色をつける

  ソースコードを色付けする Perl モジュール Text::VimColor を使って chalow 表記の[src]... [/src]を色付けする方法.

- ソースコードを色付けする関数
  これを chalow の適当なところに貼り付けておく.cl.conf でも OK.
  tab 幅なんかはお好みで.

  PHP ファイルの場合に特別な処理をしているのは,PHP の場合は PHP タグ (<?php ... ?>) に囲まれていないと
  ソースに色をつけてくれない.そのためタグがついていない場合は一回タグをつけてあげてる.
  ASP とかもそうだと思う.

sub highlight {
    my ($filetype, $string) = @_;
    my $add_php_tag = 0;

    $filetype =~ s/^\s*(.*?)\s*$/$1/s;
    $string =~ s/^\s*(.*?)\s*$/$1/s;

    # PHP ファイルで PHP タグ (<?php...?>) がない場合は PHP タグを付加
    if ($filetype eq 'php') {
        if ($string !~ m/<\?/) {
            $string = "<?php\n" . $string . "\n?>";
            $add_php_tag = 1;
        }
    }

    my $syntax = Text::VimColor->new(
        filetype => $filetype,
        string => $string,
    );

    my $html = $syntax->html;
    chomp $html;

    # PHP ファイルで PHP タグを付加した場合は PHP タグを削除する
    if ($add_php_tag == 1) {
        $html =~ s!^<span class="synSpecial">&lt;\?php</span>\n!!m;
        $html =~ s!^<span class="synSpecial">\?&gt;</span>!!m;
    }

    # tab を &nbsp; 4 つ分に
    $html =~ s/\t/{'&nbsp;' x 4}/ge;
    # 2 つ以上のスペースを &nbsp; に
    $html =~ s/(  +)/{'&nbsp;' x length($1)}/ge;
    # 行末に <br /> を付加
    $html =~ s/$/<br \/>/mg;

    return $html;
}


- chalow を編集
  chalow には以下のパッチをあてる.

--- chalow-orig 2005-08-21 07:35:31.000000000 +0200
+++ chalow      2006-01-13 23:47:34.806132000 +0100
@@ -13,6 +13,7 @@
 use Time::Local;               # for 曜日
 use HTML::Template;
 use ChangeLogReader;
+use Text::VimColor;

 my $version = '1.0rc6';

@@ -1292,11 +1293,8 @@

     ### ソースエスケープ - "&" や "<" などを置換し pre を付ける
     $num_of_escaped_src = 0;
-    $$strp =~ s!\[src\](.*?)\[/src\]!
-       $escaped_src{++$num_of_escaped_src} = $1,
-       $escaped_src{$num_of_escaped_src} =~ s/&/&amp;/g,
-       $escaped_src{$num_of_escaped_src} =~ s/</&lt;/g,
-       $escaped_src{$num_of_escaped_src} =~ s/>/&gt;/g,
+    $$strp =~ s!\[src(.+?)?\](.*?)\[/src\]!
+       $escaped_src{++$num_of_escaped_src} = highlight($1, $2),
        sprintf("\x6\x13%d\x3", $num_of_escaped_src)!gsmxe;

     ### プラグインエスケープ
@@ -1312,7 +1310,7 @@
     ### プラグインアンエスケープ - 実行!
     $$strp =~ s|\x7\x13(\d+)\x3|eval($escaped_plugin{$1})|ge;
     ### ソースアンエスケープ - pre 追加
-    $$strp =~ s|\x6\x13(\d+)\x3|<pre>$escaped_src{$1}</pre>|g;
+    $$strp =~ s|\x6\x13(\d+)\x3|<p class="code">$escaped_src{$1}</p>|g;
     ### HTML アンエスケープ
     $$strp =~ s|\x5\x13(\d+)\x3|$escaped_string{$1}|g;
 }


- 使い方
  色付けするソースの種類がわからないといけないので,[src]記法を拡張した.
  書式は

[src ソースの種類
  :
[/src]

  ソースの種類を書く必要がある.これだけで OK.
  ソースの種類は vim が理解できるもの.Vim 6.3 の場合は

/usr/local/share/vim/vim63/syntax

  ここにあるものだと思う.ちなみに 408 種類ある.

  そして,これに対応した css ファイルは

Text-VimColor-0.09/lib/Text/VimColor/light.css

  にあるので,これを適当に編集して使う.

  あと,Text::VimColor を読んでみると vim を起動していることがわかった.
  なるほどね…

  サンプルはこのサイト.