forked from navelpluisje/metalsmith-include
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
101 lines (72 loc) · 2.45 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
var debug = require('debug')('metalsmith-include');
var each = require('async').each;
var marked = require('marked');
/**
* Expose `plugin`.
*/
module.exports = plugin;
/**
* Metalsmith plugin to run files through any template in a template `dir`.
*
* @param {String or Object} options
* @property {String} deletePartials Whether or not to delete files that are indicated as partials. `false` means don't delete them. Defaults to `true`.
* @property {String} default (optional)
* @property {String} directory (optional)
* @property {String} engine
* @property {String} inPlace (optional)
* @property {String} pattern (optional)
* @return {Function}
*/
function plugin(opts) {
opts = opts || {};
var included = {};
return function (files, metalsmith, done) {
var _files = copy(files);
each(Object.keys(files), convert, done);
function convert(filename, done) {
debug('checking %s for includes', filename);
var file = _files[filename];
var includes = Object.keys(file.include || {});
debug('adding %s included files', includes.length);
each(includes, include, done);
function include(name, done) {
var filename = file.include[name];
var property = {
overwritten: false,
value: undefined
};
var resolvedFilename = resolve(filename);
if(!included[filename]) {
if(!resolvedFilename) return done(new Error("Unknown file "+filename));
included[filename] = _files[resolvedFilename];
if(_files[resolvedFilename].partial && opts.deletePartials !== false) {
debug('removing %s from files', resolvedFilename);
delete files[resolvedFilename];
}
}
debug('adding %s to includes as `%s`', resolvedFilename, name);
file[name] = marked(String(included[filename].contents));
done();
}
}
// resolve a filename in the files object
// if there isn't a match, assume it was provided without an extension
function resolve(name) {
var filenames = Object.keys(_files);
if(~filenames.indexOf(name)) return name;
var re = new RegExp("^" + name + "\\..+$");
for(var i=0; i<filenames.length; i++) {
if(re.test(filenames[i])) return filenames[i];
}
return false;
}
};
}
// naive shallow copy
function copy(obj) {
var newObj = {};
for(var p in obj) {
newObj[p] = obj[p];
}
return newObj;
}