Gulp Yaml Front Matter to JSON添加文件名

时间:2014-07-25 00:00:51

标签: json yaml markdown gulp

我不确定最好的方法是什么。

我想从markdown文件中获取yaml front matter,然后在添加文件名时将其转换为json,然后将它们合并到一个arrayjson档案。

E.g。文件bananas.mdapples.md

---
title: Bananas
type: yellow
count:
  - 1
  - 2
---

# My Markdown File

apples.md

---
title: Apples
type: red
count:
  - 3
  - 4
---

# My Markdown File 2

转换为all.json

[{"title":"Bananas","type":"yellow","count":[1,2],"file":"bananas"},
{"title":"Apples","type":"red","count":[3,4],"file":"apples"}]

当然,没有回报,因为它会很紧凑。

我发现了一些gulp个插件,但它们似乎没有完全符合我的需要,甚至合并,除非我遗漏了什么。

1 个答案:

答案 0 :(得分:1)

更新,我创建了插件gulp-pluck,大大简化了流程。

以下是它的工作原理:

var gulp = require('gulp');
var data = require('gulp-data');
var pluck = require('gulp-pluck');
var frontMatter = require('gulp-front-matter');

gulp.task('front-matter-to-json', function(){
  return gulp.src('./posts/*.md')
  .pipe(frontMatter({property: 'meta'}))
  .pipe(data(function(file){
    file.meta.path = file.path;
  }))
  .pipe(pluck('meta', 'posts-metadata.json'))
  .pipe(data(function(file){
    file.contents = new Buffer(JSON.stringify(file.meta))
  }))
  .pipe(gulp.dest('dist'))
})

结束更新


好的,花点时间搞清楚这一点。 Gulp需要内置reduce功能! (也许我会在那段时间内继续工作。)

依赖关系包括:gulpgulp-front-mattergulp-filterevent-streamstream-reducegulp-rename

写在 LiveScript

gulp.task 'concatYaml' ->
   devDest = './dev/public/'
   gulp.src './src/posts/*.md'
      .pipe filter posted
      .pipe front-matter {property: 'meta'}
      .pipe es.map (file, cb) ->
         file.meta.name = path.basename file.path
         file.meta.url = toUrlPath file.meta.name
         cb null, file
      .pipe reduce ((acc, file) -> 
         | acc =>
            acc.meta.push file.meta
            acc
         | _ =>
            acc = file
            acc.meta = [file.meta]
            acc
      ), void
      .pipe es.map (file, cb) ->
         file.contents = new Buffer JSON.stringify file.meta
         cb null, file
      .pipe rename 'posts.json'
      .pipe gulp.dest devDest

JavaScript 等效:

gulp.task('concatYaml', function(){
  var devDest;
  devDest = './dev/public/';
  return gulp.src('./src/posts/*.md')
  .pipe(filter(posted))
  .pipe(frontMatter({ property: 'meta' }))
  .pipe(es.map(function(file, cb){
    file.meta.name = path.basename(file.path);
    file.meta.url = toUrlPath(file.meta.name);
    return cb(null, file);
  }))
  .pipe(reduce(function(acc, file){
    switch (false) {
    case !acc:
      acc.meta.push(file.meta);
      return acc;
    default:
      acc = file;
      acc.meta = [file.meta];
      return acc;
    }
  }, void 8))
  .pipe(es.map(function(file, cb){
    file.contents = new Buffer(JSON.stringify(file.meta));
    return cb(null, file);
  }))
  .pipe(rename('posts.json'))
  .pipe(gulp.dest(devDest));
});