UNPKG

1.8 kBJavaScriptView Raw
1'use strict';
2
3var fs = require('fs'),
4 path = require('path'),
5 glob = require('glob'),
6 yaml = require('js-yaml'),
7 jade = require('gulp-jade'),
8 rename = require('gulp-rename'),
9 changed = require('gulp-changed'),
10 deepMerge = require('deepmerge');
11
12function push(obj, key, data) {
13 var parts = key.split('.');
14
15 while (parts.length > 1) {
16 var prop = parts.shift();
17
18 obj = obj[prop] || (obj[prop] = {});
19 }
20
21 prop = parts.shift();
22
23 obj[prop] = deepMerge(obj[prop] || {}, data);
24}
25
26module.exports = function(options) {
27 var src = path.join(options.paths.views.cwd, options.paths.views.glob),
28 dest = path.join(options.paths.dest, options.paths.views.dest);
29
30 function compile(stream, onError) {
31 var locals = {
32 data: options.data || {}
33 };
34
35 options.paths.data.src
36 .forEach(function(data_src) {
37 glob.sync(path.join(data_src, options.paths.data.glob))
38 .forEach(function(file) {
39 var keypath = path.relative(data_src, file)
40 .replace(/[\\\/]/g, '.')
41 .replace('.yml', '');
42
43 push(locals.data, keypath, yaml.load(fs.readFileSync(file)));
44 });
45 });
46
47 for (var fn in options.locals) {
48 locals[fn] = options.locals[fn];
49 }
50
51 return stream.pipe(jade({
52 pretty: true,
53 locals: locals,
54 basedir: process.cwd()
55 }).on('error', onError))
56 .pipe(rename(function(file) {
57 if (options.paths.views.ext !== '.html') {
58 file.extname = options.paths.views.ext;
59 }
60 }));
61 }
62
63 function ifChanged(stream, onError) {
64 return stream.pipe(changed(dest, {
65 extension: options.paths.views.ext
66 })).on('error', onError);
67 }
68
69 return {
70 src: src,
71 dest: dest,
72 pipe: compile,
73 check: ifChanged
74 };
75};