Gulp Front Matter + Markdown 通过 Nunjucks

Gulp Front Matter +Markdown through Nunjucks

我正在努力将一些简单的 Markdown 处理添加到我的 Gulp 流程中,但我无法完全让各个部分协同工作。我似乎错过了获取前端内容和确定要应用哪个 Nunjuck 模板之间的步骤。

这是我的 Gulp 文件中的部分:

gulp.task('pages:md', function() {
  gulp.src('./content/**/*.md')
    .pipe(frontMatter({ // optional configuration
      property: 'frontMatter', // property added to file object
      remove: true // should we remove front-matter header?
    }))
    .pipe(marked({
        // optional : marked options
    }))
    .pipe(nunjucks({
      // ?? Feels like I need to specify which template applies based on the front matter "layout" property?
    }))
    .pipe(gulp.dest('build/'))
});

降价文件如下所示:

---
title: Title
layout: layout.html
nav_active: home
---

...markdown content...

我觉得它的方向是正确的,但能否可视化前数据的去向以及如何将其暴露给 Nunjucks 渲染尚不清楚。有帮助吗?

您可能想看看插件 gulp-ssg. I don't know what it's worth, but it was mentionned in this issue 以供与您有相同问题的人使用。

不完全是您要查找的内容,但对于此类工作,我使用 metalsmith 取得了成功。例如,如果您像我一样对 JavaScript 资源进行更复杂的处理,您甚至可以将它与 gulp 混合使用。

您需要 gulp-wrap 和原始 nunjucks

gulp-nunjucks是一个编译nunjucks模板流的工具,但是你需要做的是将你的内容包装在一个nunjucks模板中,这就是gulp-wrap的作用。

尝试 npm install gulp-wrap nunjucks 除了其他设置,然后以下应该会起作用。

gulpfile

var gulp = require('gulp')
var wrap = require('gulp-wrap')
var frontMatter = require('gulp-front-matter')
var marked = require('gulp-marked')

var fs = require('fs')

gulp.task('pages:md', function() {
  gulp.src('./content/**/*.md')
    .pipe(frontMatter())
    .pipe(marked())
    .pipe(wrap(function (data) {
      return fs.readFileSync('path/to/layout/' + data.file.frontMatter.layout).toString()
    }, null, {engine: 'nunjucks'}))
    .pipe(gulp.dest('build/'))
});

降价

---
title: Title
layout: layout.nunjucks
nav_active: home
---

...markdown content...

layout.nunjucks

<h1>{{ file.frontMatter.title }}</h1>

<p>{{ contents }}</p>