UNPKG

4.11 kBJavaScriptView Raw
1const async = require('async');
2const fs = require('fs');
3const path = require('path');
4const marked = require('marked');
5const utils = require('../utils');
6const request = require('request');
7const ejs = require('ejs');
8const he = require('he');
9
10module.exports = (section, meta, callback) => {
11
12 // Task flow control
13 async.parallel([
14
15 // Compile content for top level page
16 async.apply((utils.isExternal(section.contentSrc)) ? getExternalContent : getContent, section),
17
18 // Compile content for children if required
19 (cb) => async.map(section.children, (page, cb) => {
20 utils.isExternal(page.contentSrc) ? getExternalContent(page, cb) : getContent(page, cb)
21 }, cb)
22
23 ], done);
24
25 function getSnippet(str, data) {
26 var filename = path.join(meta.snippets, str);
27 var str = fs.readFileSync(filename, 'utf-8');
28 return ejs.compile(str, { filename: filename })(data);
29 }
30
31 // Compile snippet template
32 var snippet = function () {
33 var hasExtension = path.extname(arguments[0]);
34
35 if(arguments[0].constructor === Array) {
36
37 var templateArr = arguments[0].map((item) => {
38
39 if (path.extname(item.template)) {
40 return getSnippet(item.template, item.data);
41 } else {
42 return item.template;
43 }
44
45 });
46
47 var template = templateArr.join('\n\n');
48 } else if (hasExtension) {
49
50 var str = arguments[0];
51 var data = arguments[1] || {};
52 var template = getSnippet(str, data);
53
54 } else {
55 template = arguments[0];
56 }
57 //console.log(meta.scopeClass);
58 var output = `
59<div class="<%-styles['code-snippet']-%>">
60<div class="<%-styles['window-bar']-%>">
61 <div class="<%-styles.circles-%>"><span class="<%-styles.circle-%> <%-styles['circle-red']-%>"></span> <span class="<%-styles.circle-%> <%-styles['circle-yellow']-%>"></span> <span class="<%-styles.circle-%> <%-styles['circle-green']-%>"></span></div>
62</div>
63<div class="<%-styles['code-preview']-%>">
64<div class="${meta.isolateScopeCssWrapperClass}">
65<div class="${meta.isolateScopeCssClass}">${template}</div>
66</div>
67</div>
68<pre class="line-numbers"><code class="language-markup">${he.encode(template)}</code></pre>
69</div>`;
70
71 return output;
72 }
73
74 var render = function(str, data) {
75 var hasExtension = path.extname(arguments[0]);
76
77 if(arguments[0].constructor === Array) {
78 var templateArr = arguments[0].map((item) => {
79 if (path.extname(item.template)) {
80 return getSnippet(item.template, item.data);
81 } else {
82 return item.template;
83 }
84 });
85
86 var template = templateArr.join('\n\n');
87 } else if (hasExtension) {
88 var str = arguments[0];
89 var data = arguments[1] || {};
90 var template = getSnippet(str, data);
91 } else {
92 template = arguments[0];
93 }
94
95 return `<div class="<%-styles['render-preview']-%>">
96 <div class="${meta.isolateScopeCssWrapperClass}">
97 <div class="${meta.isolateScopeCssClass}">${template}</div>
98 </div></div>`;
99 }
100
101 // On complete handler
102 function done(err, result) {
103 if (err) {
104 callback(err);
105 } else {
106 callback(null, section)
107 }
108 }
109
110
111 function getContent(page, cb) {
112
113 if(page.processor) {
114
115 page.processorOutput.map((data, index) => {
116 page.contentCompiled.push(utils.wrap(marked(data), 'section', `${page.key}-${index}`));
117 });
118
119 cb();
120
121 } else {
122 async.forEachOf(page.fileDependencies, (src, index, cb) => {
123 fs.readFile(src, 'utf-8', (err, data) => {
124 if (err) {
125 cb(err);
126 } else {
127 page.contentCompiled[index] = utils.wrap(marked(ejs.render(data, { snippet: snippet, render: render })), 'section', `${page.key}-${index}`);
128 cb();
129 }
130 });
131 }, cb);
132 }
133 }
134
135 function getExternalContent(page, cb) {
136 request(page.contentSrc, function (error, response, data) {
137 if (!error && response.statusCode === 200) {
138 page.contentCompiled.push(utils.wrap(marked(data), 'section', `${page.key}`));
139 cb();
140 }
141 });
142 };
143
144}
\No newline at end of file