ソースコードに色をつける


2010年 12月 09日

ソースコードの色付けについて調べていたらよさそうなperlモジュールを見つけたので使ってみました。

CAPNを「syntax highlight」で検索したら簡単に見つかりました。
同様の機能をもつモジュールが多数登録されていますが、その中でも「Syntax::Highlight::Engine::Kate::*」というモジュールはプラグインでC、Perl、PythonとメジャーどころからAWK、Tcl_Tk、Prolog・・・と日本国内ローカルなものは除いておよそ思いつく言語にほとんど対応しています。
星も4つ半付いているので問題なさそうです。

サンプルを元に簡単なスクリプトを書いてみます。
サンプルではfontタグを付加しているところをspanに置き換えて、CSSでデザインをカスタマイズできるようにしました。

■スクリプト

■cssのサンプル


使い方
./hilight.pl {ソースファイル}

■上記スクリプトを表示
00001     #!/usr/bin/perl
00002     use strict;
00003     use warnings;
00004     use Syntax::Highlight::Engine::Kate::Perl;
00005     
00006     my $hl = new Syntax::Highlight::Engine::Kate::Perl(
00007       substitutions => {
00008         < => &lt;,
00009         > => &gt;,
00010         & => &amp;,
00011           => &nbsp;,
00012         \t => &nbsp;&nbsp;&nbsp;,
00013         \n => <BR>\n,
00014       },
00015       format_table => {
00016         Alert => [<span class=”code_perl_Alert”></span>],
00017         BaseN => [<span class=”code_perl_BaseN”></span>],
00018         BString => [<span class=”code_perl_BString”></span>],
00019         Char => [<span class=”code_perl_Char”></span>],
00020         Comment => [<span class=”code_perl_Comment”></span>],
00021         DataType => [<span class=”code_perl_DataType”></span>],
00022         DecVal => [<span class=”code_perl_DecVal”></span>],
00023         Error => [<span class=”code_perl_Error”></span>],
00024         Float => [<span class=”code_perl_Float”></span>],
00025         Function => [<span class=”code_perl_Function”></span>],
00026         IString => [<span class=”code_perl_IString”></span>],
00027         Keyword => [<span class=”code_perl_Keyword”></span>],
00028         Normal => [<span class=”code_perl_Normal”></span>],
00029         Operator => [<span class=”code_perl_Operator”></span>],
00030         Others => [<span class=”code_perl_Others”></span>],
00031         RegionMarker => [<span class=”code_perl_RegionMarker”></span>],
00032         Reserved => [<span class=”code_perl_Reserved”></span>],
00033         String => [<span class=”code_perl_String”></span>],
00034         Variable => [<span class=”code_perl_Variable”></span>],
00035         Warning => [<span class=”code_perl_Warning”></span>],
00036       },
00037     );
00038      
00039     my $cnt=1;
00040     print qq|<div class=”code_perl”>\n|;
00041     while (my $in = <>) {
00042       printf (qq|<span class=”code_perl_Line_Number”>%05d</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%s\n| ,$cnt ,$hl->highlightText($in));
00043       $cnt++;
00044     }
00045     print qq|</div>\n|;
00046     

デザインがダサいのはモジュールのせいではなく私のせいなので適当にcssを修正してください。
HTMLのタグの代わりにエスケープシーケンスを付加するようにすればコンソール上で色付きの表示できるかと思います。
今回はperlのコードで試しましたが各種言語対応できるように拡張子を判別してプラグインを切り替えるようにしたりしたら面白いかもしれません。