vimcolor プラグインの改造
antipop2.0 のけんたろさんが公開された vimcolor プラグインを改造して使っているけれど、一つのエントリ内で複数の filetype を切り替えることができない不満があり、課題として保留していました。数日前にこの問題を解決できたので、公開します。
基本的な使い方は次のように、code 要素の class 属性に Vim の filetype オプションで指定可能な種類†1を指定してマークアップします。プラグインを通すと class 属性は取り除かれます。
<pre title="基本的な使い方"><code class="javascript">// JavaScript なので class 属性に javascript を指定
var hoge = "基本的な使い方";</code></pre>
MT のテンプレートでは<$MTEntryBody vim_color="php"$> のように vim_color 属性を指定することで、code 要素に class 属性がない場合のデフォルトを設定しておきます。よく使う filetype をデフォルトにしておくと良いでしょう。
サーバには Text::VimColor が必要です。コードに日本語などマルチバイトを用いると文字化けを起こしてしまう場合、Text::VimColor モジュールの強引な書き換えを行います。
Perl に関して経験が浅いので「とりあえず動けばいいや的コード」になってます。見る人が見ると無駄や正規表現のミスなどボロが出そうですが、ご指摘くだされば嬉しいです。
vimcolor.pl.txtVimColor plugin
package MT::Plugin::VimColor;
use strict;
use Text::VimColor;
use MT::Template::Context;
MT::Template::Context->add_global_filter(vim_color => \&syntax_mark);
sub syntax_mark {
my @strings = split /(.+?<\/code><\/pre>)/s, shift;
my $filetype = shift;
my $string = shift @strings;
foreach (@strings) {
my $syntax = Text::VimColor->new(filetype => s|(<pre[^>]*><code[^>]*?) class="(\w*)"([^>]*>.+?</code></pre>)|$1.$3|se ? $2: $filetype);
s|(<pre[^>]*?><code[^>]*?>\s*)(.+?)(\s*</code></pre>)|$1.$syntax->syntax_mark_string(unescape($2))->html.$3|se;
$string .= $_;
}
return $string;
}
sub unescape {
my $string = shift;
$string =~ s/"/"/g;
$string =~ s/</</g;
$string =~ s/>/>/g;
$string =~ s/&/&/g;
return $string;
}
1;
ところで Text::VimColor は空白文字までをも span 要素でマークアップしてしまいます。これにより、不要な空要素が生まれてしまうことがあるので HTML 的には少し不味いです。
vimcolor.pl のソースコードにミスがあったので少し修正しました。
ソースコードを少し修正しました。本質は全く変わっていませんです。
- †1
- :set filetype で指定できるソースの種類 ( html, css, javascript, perl, php, cpp, apache などなど )
- タグ
- Movable Type
- Perl
- plugins
- Vim
- 公開日時
- 2005-02-27T00:09:36+09:00 @673
- 更新日時
- 2005-06-12T02:20:21+09:00 @764
- Permalink URI & TrackBack URL
- http://blog.drry.jp/2005/02/27/0009
TrackBack ( 1 )
- VimColor plugin version 0.3 from drry+@->Weblog
- 2005-06-12T02:04:59+09:00 @673
- Text::VimColor 0.9 をインストールして、ついでに VimColor プラグイン version 0.3 を公開。
コメント