gulp markdownを変換してnunjucksで扱う
gulp markdownの内容をhtmlに変換するでmarkdown
ファイルの内容をhtml
に変換する方法を紹介しました。
実際に公開するhtml
ファイルの中身はmarkdown
から変換したhtml
の内容だけではなく、title
やdescription
などのmeta
タグやヘッダ、フッタなどの情報が必要です。
そのため、markdown
で変換した内容はdata
として次の処理に渡して、ファイルのコンテンツはnunjucks
のテンプレートに変換します。
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';
const $ = gulpLoadPlugins();
// task処理一部抜粋
.pipe($.data((file) => {
// html形式に変換します
const marked = marked(String(file.contents), {
highlight: (code, lang, callback) => hljs.highlight(lang, code).value
});
// ファイルのコンテンツはnunjucksのテンプレートに置き換えます
file.contents = new Buffer(fs.readFileSync('default.njk')).toString());
// html形式に変換したデータを返します
return marked
}))
front-matterでテンプレートファイルを定義
gulp front-matterの内容をdataとして使用するで紹介した方法で、nunjucks
のテンプレートファイルはmarkdown
の各ページ(ファイル)ごとに持たせます。
---
title: タイトル
layout: template123.njk
---
記事の内容
タスク処理は以下のようになります。front-matter
の情報はdata.meta
で参照できるようにしています。
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();
// 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 marked = 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 marked
}))
この段階でdata
にmarkdown
で記載したfront-matter
のデータとhtml
に変換されたmarkdown
のデータが入っています。
そしてファイルの中身はnunjucks
のテンプレートになっているので、最後にnunjucks
をhtml
に変換すれば、実際に公開するhtml
ファイルが作成されます。