SyntaxHighlighterでTemplate Toolkitをハイライトする


これは結構大変だった。前回いじったshBrushPerl.jsと同じ場所1shBrushTT2.jsを置いても、それだけでは反映されない。次のファイルをいじる。

/mt/plugins/SyntaxHighlighter/lib/SyntaxHighlighter/Plugin.pm

# 149行目あたりに2行を追加
        'html'=>'shBrushXml',
        'xhtml'=>'shBrushXml',
        'tt' => 'shBrushTT2',
        'tt2' => 'shBrushTT2',
    );

これで後はHTMLヘッダーテンプレートに”tt2″を加えるだけだ。

<$mt:SyntaxHighlighterInclude brush="html,perl,jscript,bash,tt2,plain" theme="default"$>

肝心のshBrushTT2.jsの中身は次の通り。

SyntaxHighlighter.brushes.TT2 = function() {
    var funcs = 
        'undef unlink unpack unshift utime values vec ' +
        'wait waitpid warn write defined length repeat ' +
        'replace remove match search split chunk substr ' +
        'list hash size keys values items each pairs ' +
        'list sort nsort import defined exists delete ' +
        'size item first last size max defined reverse ' +
        'join grep sort nsort unshift push shift pop ' +
        'unique import merge slice splice hash format ' +
        'upper lower ucfirst lcfirst trim collapse ' +
        'html html_entity xml html_para html_break ' +
        'html_para_break html_line_break uri url indent ' +
        'truncate repeat remove replace redirect eval ' +
        'evaltt perl evalperl stdout stderr null';
    var keywords =
        'GET CALL SET DEFAULT INSERT INCLUDE PROCESS ' +
        'WRAPPER BLOCK IF UNLESS ELSIF ELSE SWITCH CASE ' +
        'FOREACH WHILE FILTER USE MACRO PERL RAWPERL TRY ' +
        'THROW CATCH FINAL NEXT LAST RETURN STOP CLEAR ' +
        'META TAGS DEBUG END Assert Autoformat CGI ' +
        'Datafile Date Directory DBI Dumper File Filter ' +
        'Format GD HTML Iterator Pod Scalar String Table ' +
        'URL Wrap XML';
    this.regexList = [
         { regex: /^#[^#]*$/g,    css: 'comments' }
        ,{ regex: /#.*$/gm,       css: 'comments' }
        ,{ regex: /\$\w+/g,       css: 'variable' }
        ,{ regex: /\${[.\w]+}/g,  css: 'variable' }
        ,{ regex: new RegExp(
                this.getKeywords( funcs ), 'gm')
            ,css: 'functions' }
        ,{ regex: new RegExp(
                this.getKeywords( keywords ), 'gm')
            ,css: 'keyword' }
        ,{ regex: SyntaxHighlighter.regexLib.doubleQuotedString
            ,css: 'string' }
        ,{ regex: SyntaxHighlighter.regexLib.singleQuotedString
            ,css: 'string' }
    ];
    this.forHtmlScript(
        { left: /\[%-?/g, right: /-?%\]/g } );
};
SyntaxHighlighter.brushes.TT2.prototype
    = new SyntaxHighlighter.Highlighter();
SyntaxHighlighter.brushes.TT2.aliases
    = ['tt', 'tt2'];

ちょっと面倒だったのは 2 種類のコメント。下に挙げた例のうち、1 つ目の複数行コ
メントはうまくハイライトできない場合がある2。解決できないものか……。後は
Template::Manualにある語句を適当にコピーしまくって完成した。……だが、まだ不満があった。次回へ続く。

<!-- いきなり"#"で始まれば全体がコメント -->
[%# これはコメントです
    これもコメントです
    これもコメントです
%]
<!-- Perlスタイルのコメント -->
[% # これはコメントです
   fig1 = 12345 # これはコメントです
   fig2 = 23456 # これもコメントです
%]
[%- # chompもおk
   INCLUDE inc/header.tt -%]
[% IF users %]
    <p class="msg">[% users.${me.id}.name %]</p>
[% END %][%# IF %]
[%- INCLUDE inc/footer.tt -%]

  1. /mt-static/plugins/SyntaxHighlighter/2.0/scripts/shBrushPerl.js 
  2. コメント中に“#”が出てくるとダメ 

コメントを残す