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が付与されたファイルを出力するようにしました。(gulppipeに組み込めるようにしたかったのですが、知識不足のためやり方がわかりませんでした...)

追記: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を実行しないので、画面ロードの時間も少しは短縮されると思います。


関連記事

  • watchifyとgulpで自動コンパイルと差分更新をおこなう

    vuejsの開発環境を構築するでvueをビルドする環境を作成しました。今回は開発環境をさらに便利にするために、ファイルが変更されたら自動でビルドを実行し、ブラウザをリロードする処理を実装します。開発用...


  • swig|htmlのヘッダ・フッタの共通化などで実装を効率化する

    swigでhtmlの実装すれば、htmlのヘッダーやフッターの共通化などができ、htmlの管理・実装の効率が格段に上がります。swigとは、テンプレートエンジンの1つで、htmlの中に変数やif文やf...


  • 拡張メタ言語を使用して静的ホームページを簡単に作成する

    ちょっとしたホームページやブログを作成するとき、どのように作成しているでしょうか?最初はhtmlやcssをそのままテキストエディタなどで書いて作成していたが、ページ数が多くなるにつれ管理が大変になり、...


  • テンプレートエンジンのnunjucksとhighlight.js組み合わせる

    便利なテンプレートエンジンのnunjucksのテンプレートの中で、コードをシンタックスハイライト(色付け)する便利なライブラリのhighlight.jsを組み込む方法を紹介します。nunjucksのコ...


  • Nunjucksで独自のファンクションを実行する

    Nunjucksのテンプレートファイルに独自に定義した別ファイルのファンクションを実行する方法を紹介します。gulpでコンパイルする場合を想定しています。gulp-nunjucks-renderでNu...


  • Nunjucksの基本的な使い方 -extends,block,include-

    htmlのおすすめテンプレートエンジンNunjucksがとても便利なのですが、日本語のページがほとんど見当たらなかったので、基本的な使い方を紹介します。ホームページを作成していると、htmlのヘッダと...


  • npmのpackage.jsonを最新のバージョンに更新する

    package.jsonのパッケージを最新のバージョンに更新する方法を紹介します。npmは以下のコマンドを実行すれば、package.jsonに記載されているバージョンに更新されます。最新のバージョン...


  • less|cssに変数を使い実装を効率化する方法

    ホームページを作っていて、規模が大きくなっていくにつれ、気をつけていてもcssのソースはグチャグチャになってしまい、後で見返したときに「これはどこのスタイルだっけ?」となってしまうことがあると思います...


  • gulpの便利なタスク gulpfile.jsの記述例

    gulpの便利なおすすめプラグインで紹介したプラグインなどを利用したgulpの便利なタスクの実装例を紹介します。less,js,htmlのコンパイルや軽量化、watchとlivereload、エラー時...


  • gulp|watchやlivereloadのタスクを停止する方法

    gulpでwatchやlivereloadを停止したい場合、ctrl+Cで停止することができますが、sublime textやatomのプラグインからwatchなどを起動した場合、ctrl+Cで停止す...