google-code-prettify を使ってシンタックスハイライトする方法のメモ。
google-code-prettify の最も簡単な方法はオートローダーを使う方法で、以下をヘッダー部分に記述して、表示する部分を pre 要素で囲み、pre 要素に「prettyprint」というクラスを指定するだけ。
<script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
但し、オートローダを使う方法だとカスタマイズが難しいので google-code-prettify からファイルをダウンロードして使う方法について記述。
関連ページ:WordPressのショートコードでシンタックスハイライト
目次
google-code-prettify のページ(https://code.google.com/p/google-code-prettify/)の「Download」からファイルをダウンロード
「prettify-small-4-Mar-2013.tar.bz2」と「prettify-4-Mar-2013.tar.bz2」があるが、この例では「prettify-small-4-Mar-2013.tar.bz2」をダウンロード。
google-code-prettify からダウンロードした「prettify-small-4-Mar-2013.tar.bz2」を適当な解凍ソフト(Lhaplusなど)で解凍。以下は解凍したファイルの例。
解凍したファイル「prettify.js」と「prettify.css」を適当なところに配置。(この例では「prettify」というディレクトリに配置)
「prettify.js」は body の閉じタグの直前等で読み込む。(src のパスは環境に応じて変更)
更にスクリプトタグの中で prettyPrint() 関数を実行。
<script src="../prettify/prettify.js"></script> <script> prettyPrint(); </script> </body>
jQuery を使っていれば、以下のような感じ。
<script src="../prettify/prettify.js"></script>
<script>
jQuery(function($){
prettyPrint();
});
</script>
</body>
「prettify.css」は head 内で読み込む。(href のパスは環境に応じて変更)
<head> ・・・中略・・・ <link rel="stylesheet" href="../prettify/prettify.css"> </head>
google-code-prettify の基本的な使い方(英文)は以下のページにある。
google-code-prettify/GettingStarted
google-code-prettify のテーマギャラリーのページ(http://google-code-prettify.googlecode.com/svn/trunk/styles/index.html)で好みのスタイル(テーマ)を選択すると、そのスタイルが表示されるのでそれを利用。
この例では「Desert」を選択して利用。
表示されているスタイルをコピーして「prettify.css」の既存のスタイルを削除して、ペースト。
また、デフォルトでは行番号の表示は「5」の倍数のみが表示されるので、全ての番号を表示するにはCSSファイル「prettify.css」の最後の方にある li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none;} の部分の記述をコメントアウト。
ついでに、見栄えを変更するために以下を追加して行番号の横にライン(border-left)を出力して色とパディングを調整。
/*li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type: none;}*/
li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{border-left:solid 1px #EBB15E; padding-left:0.5em;color: #999;}
pre タグに prettyprint のクラスを付けて、シンタックスハイライト表示させたいソースコードを記述。
<pre class="prettyprint"> ソースコードを記述 </pre>
行番号を表示するには、クラス「linenums」を追加。
<pre class="prettyprint linenums"> ソースコードを記述 </pre>
特定の行番号から表示させるには「linenums:30(30行目が先頭)」のようにする。
<pre class="prettyprint linenums:30"> ソースコードを記述 </pre>
更に必要に応じて、div 要素で囲んでスタイルする。
<div class="prettifydiv">
<pre class="prettyprint linenums:3">
ソースコードを記述
</pre>
</div>
pre タグを使用するので「overflow: auto;」や「 white-space: pre-wrap; 」を指定。
スタイルの例(prettify.css)
/* desert scheme ported from vim to google prettify */
pre.prettyprint { display: block; background-color: #333 }
pre .nocode { background-color: none; color: #000 }
pre .str { color: #ffa0a0 } /* string - pink */
pre .kwd { color: #f0e68c; }
pre .com { color: #87ceeb } /* comment - skyblue */
pre .typ { color: #98fb98 } /* type - lightgreen */
pre .lit { color: #cd5c5c } /* literal - darkred */
pre .pun { color: #fff } /* punctuation */
pre .pln { color: #fff } /* plaintext */
pre .tag { color: #f0e68c; } /* html/xml tag - lightyellow */
pre .atn { color: #bdb76b; } /* attribute name - khaki */
pre .atv { color: #ffa0a0 } /* attribute value - pink */
pre .dec { color: #98fb98 } /* decimal - lightgreen */
/* Specify class=linenums on a pre to get line numbering */
ol.linenums{margin-top:0;margin-bottom:0;}
/*li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type: none;}*/
li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{border-left:solid 1px #EBB15E; padding-left:0.5em;color: #999;}
@media print {
pre.prettyprint { background-color: none }
pre .str, code .str { color: #060 }
pre .kwd, code .kwd { color: #006; font-weight: bold }
pre .com, code .com { color: #600; font-style: italic }
pre .typ, code .typ { color: #404; font-weight: bold }
pre .lit, code .lit { color: #044 }
pre .pun, code .pun { color: #440 }
pre .pln, code .pln { color: #000 }
pre .tag, code .tag { color: #006; font-weight: bold }
pre .atn, code .atn { color: #404 }
pre .atv, code .atv { color: #060 }
}
/* 以下は追加のスタイルの例 (環境に応じて)*/
.prettifydiv{
max-width: 650px;
margin: 1em 0 3em;
font-size: 14px;
}
pre.prettyprint {
margin: 10px 0;
border: none;
overflow: auto;
padding: 0 1em;
z-index : 10;
white-space: pre-wrap;
border-radius: 4px;
width: 95%;
}
pre.prettyprint ol {
padding-left: 1.8em;
padding: 1em 0 1em 1.8em;
}
CSS のシンタックスハイライトはダウンロード解凍した「lang-css.js」を使用すると、少し綺麗に表示してくれるみたい。
「lang-css.js」を追加で読み込み。(または、prettify.js に lang-css.js の内容を追加する。このほうがファイルを別々に読み込まなくて済む)
<script src="../prettify/prettify.js"></script> <script src="../prettify/lang-css.js"></script><!-- 追加 --> <script> prettyPrint(); </script> </body>
pre タグにクラス「lang-css」を追加。
<div class="prettifydiv">
<pre class="prettyprint lang-css">
pre.prettyprint { display: block; background-color: #333 }
pre .nocode { background-color: none; color: #000 }
pre .str { color: #ffa0a0 } /* string - pink */
pre .kwd { color: #f0e68c; }
pre .com { color: #87ceeb } /* comment - skyblue */
pre .typ { color: #98fb98 } /* type - lightgreen */
</pre>
</div>
「lang-css.js」を使用した場合の表示。
「lang-css.js」を使用しない場合の表示。
HTML の場合、そのままソースを記述してしまうと、HTML 要素として解釈されてしまうので、< や > は変換(エスケープ)しておく必要がある。
長い HTML の場合、いちいちエスケープして記述するのは面倒なので、「HTML Encoder / Decoder」のようなサービスを利用するか、以下(convert.html)のようなページを作成して、テキストエリアに入力した HTML ソースを変換して表示するというのも1つの方法。但し、これはあくまでローカル環境で使用するのを前提(マークアップやスタイル等は参考程度に)。
関連ページ:HTML ソースのエスケープ処理
convert.html convert.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>変換(エスケープ)処理</title>
<style>
#content {
margin: 20px auto;
width: 100%;
max-width: 900px;
}
h1 {
font-size: 20px;
}
textarea {
width: 95%;
margin: 10px auto;
}
#escapeHTML {
width: 95%;
border: 1px solid #ccc;
border-radius: 4px;
padding: 10px;
display: none;
background-color: #efefef;
font-family:"Lucida Console", Monaco, monospace;
white-space: pre-wrap;
overflow: auto;
}
</style>
</head>
<body>
<div id="content">
<h1>変換(エスケープ)処理</h1>
<p>HTML ソースを入力</p>
<div>
<textarea id="input" rows="10" cols="60">
</textarea>
</div>
<button id="convert">変換</button>
<button id="clear">クリア</button>
<div>
<pre id="escapeHTML"></pre>
</div>
</div>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script>
jQuery(function($){
var targets = ["&", "<", ">" ,'"', "'"];
var escapes = ["&", "<", ">", """, "'"];
$('#convert').click(function() {
var converted = $('#input').val();
for(var i=0; i<targets.length; i++){
converted = converted.replace(new RegExp(targets[i], 'g'), escapes[i]);
}
$('#escapeHTML').text(converted).css('display', 'block');
});
$('#clear').click(function() {
$('#input').val('');
$('#escapeHTML').text('').css('display', 'none');
});
});
</script>
</body>
</html>
テキストエリアに HTML ソースを入力して「変換」というボタンをクリックすると、エスケープされた文字列が表示される。
エスケープ対象の文字は「<」「>」「"」「'」「&」の5つ。