1 | 'use strict';
|
2 |
|
3 | var path = require('path')
|
4 | var yaml = require('yaml-js')
|
5 | var fs = require('fs')
|
6 | var mkdirp = require('mkdirp').sync
|
7 | var engine = require('../liquid')
|
8 | var md = require('../markdown')
|
9 | var _ = require('lodash')
|
10 | var debug = require('debug')('darko')
|
11 | var util = require('util')
|
12 | var Promise = require('bluebird')
|
13 |
|
14 | var readFile = Promise.promisify(fs.readFile)
|
15 |
|
16 |
|
17 | function liquid(tpl, site) {
|
18 |
|
19 |
|
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 |
|
37 | function markup(page) {
|
38 | page.output = page.ext === '.md' ? md(page.content) : page.content
|
39 | debug('Marked up ' + page.path)
|
40 | return page
|
41 | }
|
42 |
|
43 | var _layouts = {}
|
44 |
|
45 | function layout(page) {
|
46 | if (!page.layoutWas) page.layoutWas = page.layout
|
47 | if (!page.layout || page.layout_ == page.layout) {
|
48 |
|
49 | page.layout = page.layoutWas
|
50 | page.layout_ = ''
|
51 | return page
|
52 | }
|
53 | page.layout_ = page.layout
|
54 |
|
55 | var site = page.site
|
56 |
|
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 |
|
92 | function render(page) {
|
93 | fs.writeFileSync(page.dest, page.output)
|
94 | debug('Generated ' + page.path)
|
95 | }
|
96 |
|
97 |
|
98 | module.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 | }
|