UNPKG

15.7 kBJavaScriptView Raw
1var fs = require('fs');
2var fse = require('fs-extra');
3var path = require('path');
4var yaml = require('js-yaml');
5var async = require('async');
6var ut = require('./utool.js')
7
8var envPath = process.cwd();
9var ymlPath = path.join(envPath, '_config.yml');
10var ymlConfig = yaml.safeLoad(fs.readFileSync(ymlPath, 'utf8'));
11var snipConfig = ymlConfig.snip_dir;
12var sumFile = ymlConfig.snip_sum;
13
14var srcFile = ymlConfig.source;
15var readFile = ymlConfig.snip_index;
16var snipPath = path.join(envPath, snipConfig);
17var examplesPath = path.join(envPath, ymlConfig.example);
18
19// 遍历根目录snipPath
20async.auto({
21
22 docPath: function(cb) {
23
24 var dir = snipPath,
25 DIR = dir;
26 async.auto({
27 //获取组件列表
28 kits: function(cb) {
29 fs.readdir(dir, function(err, kits) {
30 kits = ut.rmdot(kits);
31
32 // copymdAry - 目录下直接拷贝,无需合并的部分,包含summary.md,readme.md,及没有实力的纯文档组件
33 var copymdAry = kits.filter(function(kit) {
34 return /\.md$/.test(kit)
35 })
36 // console.log(copymdAry)
37 // 排除Summary && README及单一文档组件外的组件名集合
38 var newkits = kits.filter(function(kit) {
39 return !(/\.md$/.test(kit))
40 })
41
42
43 /**
44 * 判断`.md`是否与文件件重名,报错
45 */
46 var repeater = copymdAry.filter(function(ele) {
47 var basename = ele.replace(/\.md$/, '');
48 return (newkits.indexOf(basename) === -1) ? null : basename;
49 })
50
51 function RepeatError(ary) {
52 var repeatMenu = path.basename(dir);
53 console.log('%s目录下\n%s\n文件重复,请手动处理\n', repeatMenu, ary)
54 }
55 if (repeater.length != 0) {
56 throw new RepeatError(repeater);
57 }
58
59 /**
60 * copy 根目录下md文档(包括SUMMARY & README)
61 * 使用到全局变量: sumFile,readFile,snipConfig,srcFile
62 */
63 var markCopy = function(dir, kits, file) {
64 var fillindex = kits.indexOf(file);
65 if (fillindex != -1) {
66 var copySnippet = path.join(dir, file);
67 var copySrc = copySnippet.replace(snipConfig, srcFile);
68 var data = fs.readFileSync(copySnippet, 'utf-8');
69 fse.ensureFileSync(copySrc);
70 fs.writeFileSync(copySrc, data, 'utf-8');
71 // console.log("copySnippet:",copySnippet,"...copySrc",copySrc)
72 }
73 }
74 copymdAry.forEach(function(file) {
75 markCopy(DIR, kits, file);
76 })
77
78 cb(null, newkits);
79 // kits value = [ breadcrumb','buttongroup','dropdown','tree' ...]
80
81 })
82 },
83 // 读取单一组件内容
84 readkit: ['kits', function(ele, cb) {
85 // ele为上一级返回的对象,key值为上一fun函数的函数名
86 // {kits:[ breadcrumb','buttongroup','dropdown','tree' ...]}
87 // 需要执行ele.kits
88 var kits = cb.kits;
89 var snipBase = ymlConfig.snip_base
90 var snipDemo = ymlConfig.snip_demo
91 // kit: 组件文件夹,如 button | navbar | ...
92 kits.forEach(function(kit, index) {
93 // 最后的回调使用到了此kit变量
94 var KIT = kit;
95
96 var kitpath = path.resolve(dir, kit)
97 var kitfiles = fs.readdirSync(kitpath);
98 var kitfiles = ut.rmdot(kitfiles);
99
100 // 最后修改
101 async.mapSeries(kitfiles, function(kfile, wholeback) {
102 var kpath;
103 var baseMd = null;
104
105 if (kfile === snipBase) {
106 // kpath: base.md路径,读取基本内容
107 kpath = path.join(kitpath, kfile)
108 var bdata = fs.readFileSync(kpath, 'utf-8');
109 baseMd = bdata;
110 wholeback(null, baseMd);
111 // fs.readFile(kpath,'utf-8',function(err,data){
112 // baseMd = data;
113 // wholeback(null, baseMd);
114 // })
115 } else if (kfile === snipDemo) {
116 // kpath: 单一demo路径.
117 // 进行读取排序,合并
118 kpath = path.join(kitpath, kfile)
119 // kpath: /Users/AYA/Desktop/work/tinper.org/snippets/neoui/component/gallery/demo
120 var demofile = fs.readdirSync(kpath, 'utf-8');
121
122 demofiles = ut.rmdot(demofile).sort();
123 // console.log(kpath,'----',demofiles)
124 // fs.readdir(kpath, function(err, files){
125 // var files = ut.rmdot(files).sort();
126 // mapSeries顺序执行以上 sort结果
127 async.mapSeries(demofiles, function(exfile, callback) {
128 var outexPath = path.join(examplesPath, kit + exfile + '.html');
129 var exPath = path.join(kpath, exfile);
130 // console.log(exPath);
131 // /Users/AYA/Desktop/work/tinper.org/snippets/neoui/global/utilities/demo/4-other-display
132 //start 示例文件夹遍历
133 var exfiles = fs.readdirSync(exPath, 'utf-8');
134 var files = ut.rmdot(exfiles).sort();
135 // fs.readdir(exPath, function(err,files){
136 // files为最终层级文件,如.html .md .css .js
137 // var files = ut.rmdot(files);
138 var baseDemo = [];
139 var demoMd = [];
140 var demoHtml = [];
141 var demoCss = [];
142 var demoJs = [];
143 var codeHtml = [];
144 var codeCss = [];
145 var codeJs = [];
146 var ctxPath = '//design.yyuap.com/static/uui/latest';
147 var optBtn = '<button class="u-button u-button-block u-button-accent margin-top-15 codeOptBtn" ><i class="uf uf-arrow-down"></i>查看代码</button>';
148
149 var styles, htmls, scripts, tpl;
150 // react js代码
151 var beeScript = beeShow = [];
152
153 var codeFun = function(data) {
154 return '<div class="examples-code"><pre><code>\r\n' + data + '</code></pre>\r\n</div>\r\n';
155 }
156 // 处理js注释不显示星号问题
157 var jsCodeFun = function(data) {
158 return '<pre class="examples-code"><code>\r\n' + data + '</code></pre>\r\n';
159 }
160 // 转义pre > code 下的html标签
161 var codeHtmlFun = function(data) {
162 return '<div class="examples-code"><pre><code>\r\n' + data.replace(/\</g, '&lt;') + '</code></pre>\r\n</div>\r\n';
163 }
164
165 //遍历demo文件夹start
166 // console.log('exPath',exPath);
167 async.mapSeries(files, function(item, cb) {
168 var filePath = path.join(exPath, item);
169 // console.log('filePath',filePath,"---files:",files);
170 // console.log("files:",files,'\npath',exPath);
171 var ts = fs.readFileSync(filePath, 'utf-8')
172 if (/\.md$/.test(filePath)) {
173
174 demoMd = ts;
175 cb(null, null)
176 } else if (/\.html$/.test(filePath)) {
177
178 htmls = ts;
179 //demoHtml = '<div class="example-content">' + ts + '</div>\r\n';
180 codeHtml = codeHtmlFun(ts);
181 cb(null, null)
182 } else if (/\.css$/.test(filePath)) {
183
184 styles = ts;
185 //demoCss = '<div class="example-content ex-hide"><style>\r\n' + ts + '\r\n</style></div>';
186 codeCss = codeFun(ts);
187 cb(null, null)
188 } else if (/\.js$/.test(filePath)) {
189
190 scripts = ts;
191 // demoJs = '\r\n<script>\r\n' + ts + '\r\n</script>\r\n';
192 codeJs = jsCodeFun(ts);
193 cb(null, null)
194 }
195
196 }, function(err, results) {
197 // console.log("exPath:",exPath,"\nfiles:",files,'\nbeeShow:'+ beeShow.length);
198 // baseDemo = '\r\n' + demoMd + '\r\n' +
199 // demoHtml + '\r\n' + demoCss + '\r\n' + demoJs + '\r\n' + beeScript + '<div class="ex-code-par">' + optBtn +
200 // codeHtml + '\r\n' + codeCss + '\r\n' + codeJs + '\r\n' + beeShow + '</div>';
201 baseDemo = '\r\n' + demoMd + '\r\n' +
202 codeHtml + '\r\n' + codeCss + '\r\n' + codeJs + '\r\n';
203 demoMd = [];
204 demoHtml = [];
205 demoCss = [];
206 demoJs = [];
207 codeHtml = [];
208 codeCss = [];
209 codeJs = [];
210
211 //写入examples文件夹中
212 tpl = [
213 '<!DOCTYPE html>\r\n',
214 '<html lang="en">\r\n',
215 '<head>\r\n',
216 '<meta charset="UTF-8">\r\n',
217 '<meta name="viewport" content="width=device-width, initial-scale=1">\r\n',
218 '<title>Title</title>\r\n',
219 '<link rel="stylesheet" href="//design.yyuap.com/static/uploader/css/webuploader.css">\r\n',
220 '<link rel="stylesheet" href="' + ctxPath + '/css/font-awesome.css">\r\n',
221 '<link rel="stylesheet" type="text/css" href="' + ctxPath + '/css/u.css">\r\n',
222 '<link rel="stylesheet" type="text/css" href="' + ctxPath + '/css/tree.css">\r\n',
223 '<link rel="stylesheet" type="text/css" href="' + ctxPath + '/css/grid.css">\r\n',
224 '<style id="demo-style" media="screen">\r\n',
225 styles,
226 '</style>\r\n',
227 '</head>\r\n',
228 '<body style="background-color: #eceff1;margin-left: 20px;width: calc(100% - 20px );">\r\n',
229 htmls,
230 '<script src="//design.yyuap.com/static/jquery/jquery-1.11.2.js"></script>\r\n',
231 '<script src="//design.yyuap.com/static/uploader/js/webuploader.js"></script>\r\n',
232 '<script src="//design.yyuap.com/static/knockout/knockout-3.2.0.debug.js"></script>\r\n',
233 '<script src="' + ctxPath + '/js/u-polyfill.js"></script>\r\n',
234 '<script src="' + ctxPath + '/js/u.js"></script>\r\n',
235 '<script src="' + ctxPath + '/js/u-tree.js"></script>\r\n',
236 '<script src="' + ctxPath + '/js/u-grid.js"></script>\r\n',
237 '<script src="//design.yyuap.com/static/requirejs/require.debug.js"></script>\r\n',
238 '<script>\r\n',
239 scripts,
240 '</script>\r\n',
241 '</body>\r\n',
242 '</html>\r\n'
243 ];
244 fs.writeFileSync(outexPath, tpl.join(""));
245 callback(null, baseDemo);
246 })
247 //遍历demo文件夹end
248
249 // })
250 //end 示例文件夹遍历
251
252 }, function(err, results) {
253 // 返回的数据以数组形式返回需要合并
254 var data = results.join('\r\n');
255 wholeback(null, data);
256 });
257
258 // })
259
260 }
261 }, function(err, results) {
262 // 返回的数据以数组形式返回需要合并
263 var data = results.join('\r\n');
264
265 // 调用 `DIR` & `KIT`
266 var srcMdir = DIR.replace(snipConfig, srcFile)
267 // console.log("srcMdir:",srcMdir,"\nkit:",kit);
268 var outdir = path.join(srcMdir, `${KIT}.md`);
269 var results = results.join('\r\n');
270
271 fse.ensureFile(outdir, function() {
272 fs.writeFile(outdir, results, 'utf-8')
273 });
274
275 })
276 })
277
278 }]
279
280 })
281
282 }
283
284})