highlight.jsをローカルで実行してハイライトされたファイルを出力
ホームページやブログでプログラムのコードを掲載する際に、以下のようにコードをシンタックスハイライト(色付け)をすることがあると思います。
<canvas id="canvas" width="800px" height="600px" style="border:1px solid #000;background-color: #fffac;" ></canvas>
highlight.js
という便利なライブラリを使っていましたが、ページ表示時間のパフォーマンス向上のため、静的ホームページはgulp
などを使用し、ローカルで予め色づけした状態のhtmlを作成しようと思いました。(これからはamp html
対応に向けて、JavaScript
はなるべく使用しない方針で作成したほうがいいかもしれません)
node.js
最初は以下のようにgulp
のプラグインとして実行すると、色付けされた(色付けのclass
を付与された)html
を出力するような処理を実装しようとしました。
gulp.task('highlight', function(){
return gulp.src('対象のファイル')
.pipe(highlightjs())
.pipe(gulp.dest('出力先'));
});
しかし、調べてみてもいいプラグインが見つからなかったので、別の方法を探すことにしました。
node.js
のライブラリが用意されていますので、これを使用しました。
$ npm install highlight.js
そして以下のようなfunction
を実行し、色付けclass
が付与されたファイルを出力するようにしました。(gulp
のpipe
に組み込めるようにしたかったのですが、知識不足のためやり方がわかりませんでした...)
追記:pipe
に独自のファンクションを組み込む方法がわかりましたので、gulpのpipeで独自のファンクションを実行するで紹介しています。
var fs = require('fs');
var hljs = require('highlight.js');
function highlight(file, type){
var data = fs.readFileSync(file); //ファイルの内容を取得
//highlight(言語パターン, 内容)でクラスを付与したデータを返します
fs.writeFileSync('出力先', hljs.highlight(type, data.toString()).value);
}
}
例えば上記のファイルに対してhighlight
のファンクションを実行すると、以下のファイルが出力されます。
<span class="hljs-keyword">var</span> fs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'fs'</span>);
<span class="hljs-keyword">var</span> hljs = <span class="hljs-built_in">require</span>(<span class="hljs-string">'highlight.js'</span>);
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">highlight</span>(<span class="hljs-params">file, type</span>)</span>{
<span class="hljs-keyword">var</span> data = fs.readFileSync(file); <span class="hljs-comment">//ファイルの内容を取得</span>
<span class="hljs-comment">//highlight(言語パターン, 内容)でクラスを付与したデータを返します</span>
fs.writeFileSync(<span class="hljs-string">'出力先'</span>, hljs.highlight(type, data.toString()).value);
}
}
highlight.js
で色付けされるclass
が付与されたhtml
として出力されています。また、同時に<,>,&
などはhtmlでそのまま表示できるようエンコードされます。
出力された内容を以下のような形でclass="hljs"
を付与したタグで囲えば、シンタックスハイライト表示できるようになります。
<pre><code class="hljs">
<!-- ここに出力された内容をセット-->
`</pre>
classが付与されただけなので、以下のようにhighlight.js
で使用しているcssはこれまでどおり参照する必要があります。
<link rel="stylesheet" href="styles/default.css">
これでhighlight.js
に対応していない古いブラウザやJavaScript
がオフの環境でも、シンタックスハイライトをしたコードを表示できるようになりました。また、JavaScript
を実行しないので、画面ロードの時間も少しは短縮されると思います。