1 | const async = require('async');
|
2 | const fs = require('fs');
|
3 | const path = require('path');
|
4 | const marked = require('marked');
|
5 | const utils = require('../utils');
|
6 | const request = require('request');
|
7 | const ejs = require('ejs');
|
8 | const he = require('he');
|
9 |
|
10 | module.exports = (section, meta, callback) => {
|
11 |
|
12 |
|
13 | async.parallel([
|
14 |
|
15 |
|
16 | async.apply((utils.isExternal(section.contentSrc)) ? getExternalContent : getContent, section),
|
17 |
|
18 |
|
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 |
|
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 |
|
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 |
|
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 |