gulp nunjucksをコンパイルしてhtmlに変換する
gulp markdownを変換してnunjucksで扱うでfront-matter
やmarkdown
の内容をgulp-data
でデータとして渡すところまで実装しました。
nunjucks
で記載されたテンプレートエンジンをhtml
に変換します。
必要なパッケージをインストール
今回はnunjucks
のコンパイルにgulp-nunjucks-render
を使用します。
$ npm install --save-dev gulp-nunjucks-render
以下のようにすればnunjucks
で記載されたファイルのコンテンツをhtml
にコンパイルします。
gulpfile.babel.js
.pipe($.nunjucksRender())
gulp-nunjucks-renderの設定
特に設定をしなくても正しく動作するのですが、以下のような設定をおこなっておくとnunjucks
の実装がスムーズに進みます。
$.nunjucksRender()
の引数にoption
の値をセットすれば、設定が反映されます。
gulpfile.babel.js
const option = {}; //オプションを設定
// task処理一部抜粋
.pipe($.nunjucksRender(option))
自動エスケープの停止
nunjucksRender
はデフォルトで変数をエスケープします。
markdown
をコンパイルしたhtml
のデータを出力すると、html
のタグが全てエスケープされてしまうため、この機能をOFFにします。
gulpfile.babel.js
import gulp from 'gulp';
import gulpLoadPlugins from 'gulp-load-plugins';
const $ = gulpLoadPlugins();
const option = {
envOptions: {
autoescape: false
}
}; //オプションを設定
// task処理一部抜粋
.pipe($.nunjucksRender(option))
front-matterとmarkdownのデータを出力
gulp front-matterの内容をdataとして使用するとgulp markdownの内容をhtmlに変換するで取得したdata
をnunjucks
で使用します。
以下のようにタスクを設定します。
I gulpをES2015で実装するで紹介したように、gulpfile
はES2015
の記法で実装しています。
gulpfile.babel.js
import gulp from 'gulp';
import gulpLoadPlugins from 'gulp-load-plugins';
import marked from 'marked';
import hljs from 'highlight.js';
import fm from 'front-matter';
const $ = gulpLoadPlugins();
const option = {
envOptions: {
autoescape: false
}
}; //nunjucksの設定
// task処理一部抜粋
.pipe($.data((file) => {
const content = fm(String(file.contents));
// ファイルの内容を設定します(front-matterの記載部分を取り除く)
file.contents = new Buffer(content.body);
// front-matterの情報をデータとして返します
return { meta: content.attributes };
}))
.pipe($.data((file) => {
// html形式に変換します
const md = marked(String(file.contents), {
highlight: (code, lang, callback) => hljs.highlight(lang, code).value
});
// ファイルのコンテンツはnunjucksのテンプレートに置き換えます
// front-matterに未定義の場合はdefault.njkを読み込みます
file.contents = new Buffer(fs.readFileSync(file.data.meta.layout || 'default.njk').toString());
// html形式に変換したデータを返します
return { md }
}))
.pipe($.nunjucksRender(option))
nunjucks
のテンプレートを以下のようにして、data
の内容を出力します。
foo.njk
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<!--front-matterの情報を出力-->
<title>{{ meta.title }}</title>
<meta name="description" content="{{ meta.description }}">
</head>
<body>
<!--markdownの情報を出力-->
{{ md }}
</body>
</html>