2006-08-04 (Friday) [長年日記]
■ GeSHi Plugin for tDiary
昨日の続きです.
似非拡張スーパーpre記法の正体はGeSHiプラグインなのでした.
その名の示すとおり,内部でGeSHi*1を呼び出すというインチキっぷり. まぁ,真面目にハイライトさせるとなるとコンパイラと同じようなことしなくちゃだもんね.時間があればRubyだけでできないこともないけど,ボクにはその気力はないです.すでにある車輪は使おうということで.
さっそくせっさくのプラグインを使ってソースコードを載せておきますね. ええと,リテラルが複雑な部分が若干バグるけど,それはボクのせいではなく,GeSHiのせいです.表示の問題だけで,内容には影響ないので,気にしないことにします.(ぶ
# geshi.rb # # GeSHi Plugin for tDiary # # Copyright (c) 2006 TAKANO Mitsuhiro <tak at no32.tk> # # You can redistribute it and/or modify it under GPL2. # def geshi_parse(src, lang) src = src.gsub(/([\'\\])/, '\\\\\1') geshi = <<-"GESHI" <?php include('geshi/geshi.php'); $source = '#{src}'; rtrim($source); $language = '#{lang}'; $path = 'geshi/geshi/'; $geshi = new GeSHi($source, $language, $path); echo $geshi->parse_code(); ?> GESHI IO.popen("/usr/bin/php", "r+") do |io| io.puts(geshi) io.close_write io.read end end def geshi(src = "", lang = '') geshi_parse(src.chomp, lang) end
ご覧の通り,パイプでGeSHiを使っているので,CLI版のPHPが必要です.
この条件さえ満たしていれば,プラグインのインストールは簡単です. まず,GeSHiのアーカイブを解凍するとあらわれるgeshiディレクトリをindex.rbと同じディレクトリに移動させます. んで,上のソースコードを plugin ディレクトリ以下にgeshi.rbなどの名前で保存するだけ.
使い方も簡単で,ヒアドキュメントを用いて以下のように書くことができます.
{{geshi <<'SRC', 'bash'
i in 1 2 3; do
echo $i
done
SRC
}}
実際の日記ではこんな風に色づけしてくれます.
i in 1 2 3; do echo $i done
うーむ.久々に Lightweight Language の価値を実感しました. わずか30行しか書いていないのにソースコードのハイライトができちゃったよ. ちょっと「オレ様ってSUGEEEE」気分です.
パイプラインを使ったプラグインはいろいろなことに応用できそうですなぁ. 巷にあふれているhoge2htmlを使えばいろいろなものを埋め込むことができそうです.
それでは,みなさま,Enjoy Hilight!!
元ネタやいただいた反応など
実は以前から構想はしていたんですよね. 色つけるの欲しいなー,GeSHiでやればうまくいくかね?と. ただきっかけがなかったので放置していたという...
ううむ.pure Rubyな実装ではないので,残念ながらHikiDocなどに埋め込むことは難しいかもしれません. 同じようなプラグインをHiki向けにも書いてみようかな.
*1 ハイライト表示をするためのPHPスクリプト
入れてみたよ! i in 1 2 3; do echo $i done なんか、takano32さんの所にあったサンプルコードをそのまま入れたら compile error (TDiary::Plugin#eval_src):63: can't find string "SRC" anywhere before EOF (TDiary::Plugin#eval_src):22: parse error, unexpected..









うは、コード短けえええええええええ
まさにLLパワー炸裂といったところかな.C言語で同じことをするコードを想像するとゾッとするよ.<br>っつーか,今気づいたけど,半分以上がPHPのコードだね.実質的にプラグインのコードはIO.popenだけだwww
tDiary version 2.1.4.20060719に追従したのでテスト