プログラム・コードを Web ページに掲載する際,コードを pre タグでマークアップするのが一般的ではないだろうか。Syntax
いま現在の SyntaxHighlighter 最新バージョンは 3.0.83。ダウンロード・ページから syntax
使い方を簡単に説明すると以下のとおりである。Syntax
- プログラム・コードを掲載したい HTML(以下「対象ページ」)のヘッダ部に shCore
.js と shCore.css を読み込むよう指定する。 - 出力様式のタイプがテーマ Theme として管理されており,好みのものを選択して,そのスタイルシートを対象ページに指定する。一覧は Syntax
Highlighter - Themes にある。とくにこだわりがなければ標準 Theme: shTheme Default. css を指定しておけばよい。私は Eclipse Theme について表示色等カスタマイズしたものを shTheme Site. css として保存して使うことにした。 - 対象ページで掲載したいプログラム・コードの言語に応じて Syntax
Highlighter の JavaScript を選択し,それらを対象ページに指定する。JavaScript の一覧は Syntax Highlighter - Bundled Brushes にある。
上記までで対象ページのヘッダ部は以下のようなものとなる。ここではシェルスクリプト,XML(HTML 含む),Java,C/C++,Perl,JavaScript を扱うものとした。これは SyntaxHighlighter の出力例でもある。
<link type="text/css" rel="stylesheet" href="/sh/styles/shCore.css" /> <link type="text/css" rel="stylesheet" href="/sh/styles/shThemeDefault.css" /> <script type="text/javascript" src="/sh/scripts/shCore.js"></script> <script type="text/javascript" src="/sh/scripts/shBrushBash.js"></script> <script type="text/javascript" src="/sh/scripts/shBrushXml.js"></script> <script type="text/javascript" src="/sh/scripts/shBrushJava.js"></script> <script type="text/javascript" src="/sh/scripts/shBrushCpp.js"></script> <script type="text/javascript" src="/sh/scripts/shBrushPerl.js"></script> <script type="text/javascript" src="/sh/scripts/shBrushJScript.js"></script>
プログラム・コードは pre タグでマークアップする。class オプションに Syntax
<pre class="brush: perl; first-line: 1; tab-size: 4; highlight: null;"
title="xlstocsv.pl">
first-line: 1; は行番号の開始を 1 とするということである。行番号を出力したくない場合,gutter: false; を指定する。個別に行をハイライトしたいなら,highlight: [2, 4, 9]; のようにすればよい。プログラム・コードのマークアップが済んだら,最後に以下の JavaScript コードを書いておく。おまじないのようなものである。同一ページ内にいくつも Syntax
<script type="text/javascript">SyntaxHighlighter.all()</script>
昨日作成した Excel 一括 CSV 出力の Perl コードは,以下のように表示される。
#!/usr/bin/perl -w
# -*- coding: utf-8; mode: cperl; -*-
# Excel to CSV
use strict;
use utf8;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;
binmode STDOUT, ":utf8"; binmode STDERR, ":utf8";
($#ARGV < 0) && die "Usage: $0 xls-file\n";
my $fnm = $ARGV[0]; # Excel file name
my $ct = 0; # 出力行数
# Excel object
my $xls = Spreadsheet::ParseExcel->new();
my $fmt = Spreadsheet::ParseExcel::FmtJapan->new(); # 日本語あり
my $bko = $xls->parse($fnm, $fmt); # Excel Book object
my @wsa = $bko->worksheets(); # Worksheet object 配列
utf8::decode($fnm);
# ワークシート毎の処理
foreach my $ws (@wsa) {
my $wsnm = $ws->{"Name"};
my $mxrow = $ws->{"MaxRow"};
my $mxcol = $ws->{"MaxCol"};
print STDERR "*** $0 $fnm - sheet: $wsnm start.\n";
if ((defined $mxrow) && (defined $mxcol)) {
# 行毎の処理
for (my $row = 0; $row <= $mxrow; $row++) {
my $line = "";
# 列毎の処理
for (my $col = 0; $col <= $mxcol; $col++) {
# セル値をセット
my $cell = $ws->get_cell($row, $col);
$line .= $cell->value() if (defined $cell);
$line .= ",";
}
print "$line\n";
$ct++;
}
}
}
print STDERR "*** $0 from $fnm wrote $ct lines\n";
ただし,オリジナルの shBrushPerl.js では # 文字があるとそれ以降がすべてコメントとみなされてしまうので,$#ARGV など配列末添字番号変数の表示がおかしくなるので,上掲では少し訂正したものを用いた。53 行目の正規表現の先頭に [^\$] を追加し,以下のとおりに訂正した。
this.regexList = [
{ regex: new RegExp('[^\$]#[^!].*$', 'gm'), css: 'comments' },
{ regex: new RegExp('^\\s*#!.*$', 'gm'), css: 'preprocessor' },
ちょっと使ってみて制約があった。XML のタグのように < > で囲まれたテキストがあるとき,開始タグに対して終了タグがないと,終了タグが最後に強制的に付加されてしまう仕様のようである。空要素タグ < /> の場合も例外ではない。たとえば C/C++ の #include <stdio.h> の行をそのまま記述すると,終了タグを探しても当然ないので,ソースコード表示の最後に </stdio.h> なるゴミが出てしまうのである。私はまだ Syntax