我不确定最好的方法是什么。
我想从markdown文件中获取yaml
front matter
,然后在添加文件名时将其转换为json
,然后将它们合并到一个array
中json
档案。
E.g。文件bananas.md
和apples.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
个插件,但它们似乎没有完全符合我的需要,甚至合并,除非我遗漏了什么。
答案 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
功能! (也许我会在那段时间内继续工作。)
依赖关系包括:gulp
,gulp-front-matter
,gulp-filter
,event-stream
,stream-reduce
和gulp-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));
});