1 | 'use strict';
|
2 |
|
3 | var extend = require('extend-shallow');
|
4 | var typeOf = require('kind-of');
|
5 | var getEngine = require('./engine');
|
6 | var defaults = require('./defaults');
|
7 |
|
8 | module.exports = function(file, data, options) {
|
9 | if (data == null && options == null) {
|
10 | switch (typeOf(file)) {
|
11 | case 'object':
|
12 | data = file.data;
|
13 | options = {};
|
14 | break;
|
15 | case 'string':
|
16 | return file;
|
17 | default: {
|
18 | throw new TypeError('expected file to be a string or object');
|
19 | }
|
20 | }
|
21 | }
|
22 |
|
23 | var str = file.content;
|
24 | var opts = defaults(options);
|
25 | if (data == null) {
|
26 | if (!opts.data) {
|
27 | return file;
|
28 | }
|
29 | data = opts.data;
|
30 | }
|
31 |
|
32 | var language = file.language || opts.language;
|
33 | var engine = getEngine(language, opts);
|
34 | if (typeof engine.stringify !== 'function') {
|
35 | throw new TypeError('expected "' + language + '.stringify" to be a function');
|
36 | }
|
37 |
|
38 | data = extend({}, file.data, data);
|
39 | var open = opts.delimiters[0];
|
40 | var close = opts.delimiters[1];
|
41 | var matter = engine.stringify(data, options).trim();
|
42 | var buf = '';
|
43 |
|
44 | if (matter !== '{}') {
|
45 | buf = newline(open) + newline(matter) + newline(close);
|
46 | }
|
47 |
|
48 | if (typeof file.excerpt === 'string' && file.excerpt !== '') {
|
49 | if (str.indexOf(file.excerpt.trim()) === -1) {
|
50 | buf += newline(file.excerpt) + newline(close);
|
51 | }
|
52 | }
|
53 |
|
54 | return buf + newline(str);
|
55 | };
|
56 |
|
57 | function newline(str) {
|
58 | return str.slice(-1) !== '\n' ? str + '\n' : str;
|
59 | }
|