プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

シンタックスハイライトする為のプログラム作ったった

 いい加減、ntex改め、Lamuriyanなんとかしないとな〜と手を付けようと思ったのですが、その前に前々から何とかしたいと思っていたソースコードのシンタックスハイライトのプログラムの改善に手を付けることにしました。
 まだ私以外の人が動かせるよう整備はしていないですが、Githubで公開しました。NHlight(GitHub)


Q: SyntaxHighlighter使えば良いじゃん?
A: なんでシンタックスハイライトの為にJavaScriptを有効にせにゃならんの?



 SyntaxHighlighterが市民権を得つつある現状を私は非常に嘆かわしく思っております。もっと、こうさ、プログラマーってのはアンチJavaScript、アンチFlash厨あるべきです。なんか、別に不必要なスクリプトが裏で動いてるって微妙に気持ち悪くない?あ、私だけ?

 そんなわけで、できる限りソースコードのハイライトはJavaScriptを使わずにやりたい。でも、もちろんソースコードをHTML形式に変換してコピーして貼り付けってのは面倒くさいから、HTMLにそのままソースコードを貼り付けたいってのは理解できます。でも、Lamuriyanで記事を書けば、Lamuriyanが自動で呼び出して変換してくれるので、ユーザーは単にソースコード貼り付けるだけでよい。なので、私がシンタックスハイライトプログラムを作る意味ってのは割とあります。

 あとSyntaxHighLighterについて、今のバージョンはよく知らないけど、昔のバージョンだと、単に正規表現でハイライトしてるだけだったので、構文解析が変で、不満たらたらでした。

 というわけで、真面目にトークン分割してからハイライト処理することにしました。流石に構文解析まではしてませんが、そのうち構文解析ぐらいできるようになりたいかな………


 いまのところ、Java,JavaScript,HTMLに対応しており、以下のような結果を出力できます。

 配色のセンスがないとかいわんで。てけとうに色づけしただけだから(^_^;)

  1. package testcode;
  2. import java.lang.*;
  3. public class Test{
  4.     public static void main(String[] args){
  5.         String  test = "あbc\"de";      //Stringとtestの間はタブ文字です
  6.         char    ch = '\n';              //charとchの間もタブ文字です
  7.         int     i = 10 + (int)20.9d;    //intとiの間もタブ文字です。
  8.         Test.class.getName();
  9.         Test test = new Test();
  10.         int k = 100<<10;
  11.     }
  12.     /**
  13.        here is
  14.        JavaDoc*
  15.      */
  16.     public Test(){
  17.         //singlecomment//
  18.         /*
  19.           long comment*
  20.         */
  21.     }
  22. }

 一年前に作ったやつはタブは空白固定長だったけど、今回は可変長にしたのと、全角半角の判定も真面目にやって空白長を調節してるので嬉しくなってついタブできちんと一揃えできるよってことを強調してしまいました。一部背景が赤いのは、自動でハイライトする以外にも、ユーザーが自分でハイライトする位置を決めることが出来るデモです。