32nd Diary

過去の日記
today: , yesterday: , total:
2006年
8月
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

めーるあどれす:ruby -r base64 -e 'puts Base64.decode64("dGFrQG5vMzIudGs=")'


トップ «前の日記(2006-08-03 (Thursday)) 最新 次の日記(2006-08-05 (Saturday))» 編集

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スクリプト

Tags: Ruby Diary
本日のツッコミ(全3件) [ツッコミを入れる]
tyv (2006-08-04 (Friday) 23:57)

うは、コード短けえええええええええ

32 (2006-08-05 (Saturday) 08:09)

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

32 (2006-08-05 (Saturday) 09:09)

tDiary version 2.1.4.20060719に追従したのでテスト

[]
HsbtDiary:GeSHi Plugin for tDiary - 32nd diary (2006-08-04) (2006-08-05 (Saturday) 07:14)

入れてみたよ! i in 1 2 3; do echo $i done &nbsp; なんか、takano32さんの所にあったサンプルコードをそのまま入れたら compile error (TDiary::Plugin#eval_src):63: can't find string "SRC" anywhere before EOF (TDiary::Plugin#eval_src):22: parse error, unexpected..

本日のPingbacks(全0件)