ripper 週末クッキング その4 できました

まず、いろいろ勘違いしてたところを訂正。
on__scanが返すイベントは、Parser Eventsじゃなくて、Lexer Eventsのほうだった。Lexerのほうが字句解析なんだから、スキャナーのon_scanでフックできるイベントはLexerのほうだよね。
そして、ハイライトするためには構文解析なんて必要なくて、字句解析のレベルでそのトークンが何かわかればよかった。なので、Parser Eventsじゃなくて、Lexer Eventsのほうを使った。
でも、字句解析レベルだとヒアドキュメント、文字列等の「その中に違う字句を持つけど、ひとくくりにして扱いたい部分」を自分で管理する必要があった。このへん、もしかしたらParser Eventsと組みあわせてやれば楽にできたのかもしれないけど。
というわけで、on__kw等の色付けに必要な部分のLexer Eventに対応するメソッドを書いて、状態管理の必要なところはon__scanの中で管理。状態遷移の管理がはいったので、on__scanがちょっと複雑になっちゃいました。

できたもの

それぞれ以下のような色付けをします。TAB幅は8に決めうちです。色はCSSを埋めこんで制御してるので適当にいじれば適当に変わります。

キーワード,演算子
定数
maroon
文字列,シンボル,正規表現リテラル,数字
グローバル/クラス/インスタンス変数
ヒアドキュメント
#ff00ff

今度は、Lexer EventだけじゃなくてParser Eventの処理が必要なのを作ってみないと駄目だな。


せっかくなのでソース自体をHTML化したやつをはりつけておこう。テスト用に変なのもまじってますが。
と思ったら、はてなではHTMLタグが無効化されるのかな?よくわからない。すこし格闘してみたが、最終的には
がちゃんと機能してくれないのであきらめ。
brを出力するのをやめて、pとCSSで制御するようにした。ふー。
はてな用にCSSを微調整してはりつけ。えらい苦労した。
そうか、よく考えたら一段階目の出力は抽象的な構造にしといて、はてなやらWikiやら普通のHTMLやら出力先によってシリアライザーを書きわけるべきだったか。