UNPKG

3.15 kBJavaScriptView Raw
1'use strict';
2
3var path = require('path')
4var yaml = require('yaml-js')
5var fs = require('fs')
6var mkdirp = require('mkdirp').sync
7var engine = require('../liquid')
8var md = require('../markdown')
9var _ = require('lodash')
10var debug = require('debug')('darko')
11var util = require('util')
12var Promise = require('bluebird')
13
14var readFile = Promise.promisify(fs.readFile)
15
16
17function liquid(tpl, site) {
18 // console.log('fda', tpl)
19 // https://github.com/sirlantis/grunt-liquid/blob/master/tasks/liquid.js#L34
20 var promise = engine.extParse(tpl, function(subFilepath, done) {
21 var includePath = path.join(site.cwd, '_includes', subFilepath)
22
23 Promise.some([
24 readFile(includePath, site.encoding),
25 readFile(includePath + '.md', site.encoding),
26 readFile(includePath + '.html', site.encoding)
27 ], 1)
28 .then(function(results) {
29 done(null, results[0])
30 })
31 .catch(done)
32 })
33
34 return promise
35}
36
37function markup(page) {
38 page.output = page.ext === '.md' ? md(page.content) : page.content
39 debug('Marked up ' + page.path)
40 return page
41}
42
43var _layouts = {}
44
45function layout(page) {
46 if (!page.layoutWas) page.layoutWas = page.layout
47 if (!page.layout || page.layout_ == page.layout) {
48 // Finished layout renderring, restore the original layout of current page
49 page.layout = page.layoutWas
50 page.layout_ = ''
51 return page
52 }
53 page.layout_ = page.layout
54
55 var site = page.site
56 // support .html layouts only, for now.
57 var lpath = path.join(site.cwd, '_layouts', page.layout) + '.html'
58 var lcache = _layouts[lpath]
59
60 if (!lcache) {
61 var lsource = fs.readFileSync(lpath, site.encoding)
62 var parts = lsource.split('---')
63 var matter
64
65 if (parts.length >= 3) {
66 matter = yaml.load(parts[1])
67 lsource = parts.slice(2).join('---')
68 }
69
70 lcache = _layouts[lpath] = {
71 promise: liquid(lsource, site),
72 matter: matter
73 }
74 }
75
76 return lcache.promise
77 .then(function(template) {
78 return template.render({
79 site: site,
80 page: page,
81 content: page.output
82 })
83 })
84 .then(function(res) {
85 page.output = res
86 if (lcache.matter) _.extend(page, lcache.matter)
87
88 return layout(page)
89 })
90}
91
92function render(page) {
93 fs.writeFileSync(page.dest, page.output)
94 debug('Generated ' + page.path)
95}
96
97
98module.exports = function writeTemplated(page) {
99 debug('Generating ' + page.path)
100
101 if (!fs.existsSync(path.dirname(page.dest))) {
102 mkdirp(path.dirname(page.dest))
103 }
104
105 return liquid(page.content, page.site)
106 .then(function(template) {
107 return template.render({
108 site: page.site,
109 page: page
110 })
111 })
112 .then(function(res) {
113 page.contentWas = page.content
114 page.content = res
115 return page
116 })
117 .then(markup)
118 .then(layout)
119 .then(render)
120 .then(function() {
121 page.content = page.contentWas
122 })
123 .catch(function(err) {
124 util.error('Failed to generate ' + page.path + ':')
125 if (process.argv.indexOf('--trace') > 0)
126 util.error(err.stack)
127 else
128 util.error(err.message)
129
130 throw err
131 })
132}