2014-07-25 54 views
1

我不知道什麼是最好的方式去做這件事。Gulp Yaml前往JSON添加文件名

我想從一個降價文件得到yamlfront 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

更新,我創建了插件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')) 
}) 

末更新


OK,花時間來弄清楚這一點。 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)); 
});