Gulp:从磁盘读取内容以插入模板

时间:2016-01-08 16:28:47

标签: gulp swig-template

我想在模板中读取,然后读入零个或多个包含要注入模板的内容的文件。模板和内容都在Markdown中。从少量的研究看起来Swig将提供一个我可以使用的轻量级标记

结果函数将如下所示:

function assembleCharacterDocument(slug) {
  return gulp.src('./templates/character-document.md')
    .pipe(files2obj(['characters/'+slug+'/*.md'])) // read content for the character
    .pipe(swig()) // == require('gulp-swig'); inject content into template 
    .pipe(md2pdf()) // convert Markdown to PDF - outside scope of this question
    .pipe(gulp.dest('./products/characters/'+slug+'.pdf'));
});

由于Swig为其替换数据采用了一个普通的旧对象,我希望每个进来的文件都将其文件名作为其对象中的键。因此,例如,我的替换数据对象将如下所示:

{
  "bio": content of characters/{slug}/bio.md,
  "profile": content of characters/{slug}/profile.md,
  "timeline": content of characters/{slug}/timeline.md,
  etc.
}

files2obj()的内容是什么?

2 个答案:

答案 0 :(得分:0)

试试gulp-swig。它是Gulp的Swig插件,适用于文件流,因此您不必构建对象或进行任何自定义操作。

他们的Github page也展示了gulp-data的一个很好的例子,这可能会对您有所帮助。

答案 1 :(得分:0)

我最终放弃了Gulp管道并直接使用fs文件系统方法来完成我的任务。 (为简洁起见,省略了依赖性。)

var templatePath = './templates/character-document.md';
var sourcePath = path.join("characters",charSlug);
var targetCombinedMarkdownPath = path.join('products',charSlug+'.md');

fs.readdir(sourcePath,function (err, files) {

  if (err) { throw err; }

  var data = {};
  files.forEach(function(f) {
    var check = /^(.*).md$/.exec(f);
    if (check) {
      data[check[1]] = fs.readFileSync(path.join(sourcePath,f),'utf8');
    }
  });

  var engine = swig.compileFile(templatePath);
  var combined = engine(data);

  fs.writeFileSync(targetCombinedMarkdownPath, combined);

  md2pdf({
    title: data.name || "CHARACTER NAME MISSING",
    source: [targetCombinedMarkdownPath],
    targetFilename: charSlug
  });

});