kero
Version:
<img src="http://tinper.org/assets/images/kero.png" width="120" style="max-width:100%;"/>
285 lines (248 loc) • 15.7 kB
JavaScript
var fs = require('fs');
var fse = require('fs-extra');
var path = require('path');
var yaml = require('js-yaml');
var async = require('async');
var ut = require('./utool.js')
var envPath = process.cwd();
var ymlPath = path.join(envPath, '_config.yml');
var ymlConfig = yaml.safeLoad(fs.readFileSync(ymlPath, 'utf8'));
var snipConfig = ymlConfig.snip_dir;
var sumFile = ymlConfig.snip_sum;
var srcFile = ymlConfig.source;
var readFile = ymlConfig.snip_index;
var snipPath = path.join(envPath, snipConfig);
var examplesPath = path.join(envPath, ymlConfig.example);
// 遍历根目录snipPath
async.auto({
docPath: function(cb) {
var dir = snipPath,
DIR = dir;
async.auto({
//获取组件列表
kits: function(cb) {
fs.readdir(dir, function(err, kits) {
kits = ut.rmdot(kits);
// copymdAry - 目录下直接拷贝,无需合并的部分,包含summary.md,readme.md,及没有实力的纯文档组件
var copymdAry = kits.filter(function(kit) {
return /\.md$/.test(kit)
})
// console.log(copymdAry)
// 排除Summary && README及单一文档组件外的组件名集合
var newkits = kits.filter(function(kit) {
return !(/\.md$/.test(kit))
})
/**
* 判断`.md`是否与文件件重名,报错
*/
var repeater = copymdAry.filter(function(ele) {
var basename = ele.replace(/\.md$/, '');
return (newkits.indexOf(basename) === -1) ? null : basename;
})
function RepeatError(ary) {
var repeatMenu = path.basename(dir);
console.log('%s目录下\n%s\n文件重复,请手动处理\n', repeatMenu, ary)
}
if (repeater.length != 0) {
throw new RepeatError(repeater);
}
/**
* copy 根目录下md文档(包括SUMMARY & README)
* 使用到全局变量: sumFile,readFile,snipConfig,srcFile
*/
var markCopy = function(dir, kits, file) {
var fillindex = kits.indexOf(file);
if (fillindex != -1) {
var copySnippet = path.join(dir, file);
var copySrc = copySnippet.replace(snipConfig, srcFile);
var data = fs.readFileSync(copySnippet, 'utf-8');
fse.ensureFileSync(copySrc);
fs.writeFileSync(copySrc, data, 'utf-8');
// console.log("copySnippet:",copySnippet,"...copySrc",copySrc)
}
}
copymdAry.forEach(function(file) {
markCopy(DIR, kits, file);
})
cb(null, newkits);
// kits value = [ breadcrumb','buttongroup','dropdown','tree' ...]
})
},
// 读取单一组件内容
readkit: ['kits', function(ele, cb) {
// ele为上一级返回的对象,key值为上一fun函数的函数名
// {kits:[ breadcrumb','buttongroup','dropdown','tree' ...]}
// 需要执行ele.kits
var kits = cb.kits;
var snipBase = ymlConfig.snip_base
var snipDemo = ymlConfig.snip_demo
// kit: 组件文件夹,如 button | navbar | ...
kits.forEach(function(kit, index) {
// 最后的回调使用到了此kit变量
var KIT = kit;
var kitpath = path.resolve(dir, kit)
var kitfiles = fs.readdirSync(kitpath);
var kitfiles = ut.rmdot(kitfiles);
// 最后修改
async.mapSeries(kitfiles, function(kfile, wholeback) {
var kpath;
var baseMd = null;
if (kfile === snipBase) {
// kpath: base.md路径,读取基本内容
kpath = path.join(kitpath, kfile)
var bdata = fs.readFileSync(kpath, 'utf-8');
baseMd = bdata;
wholeback(null, baseMd);
// fs.readFile(kpath,'utf-8',function(err,data){
// baseMd = data;
// wholeback(null, baseMd);
// })
} else if (kfile === snipDemo) {
// kpath: 单一demo路径.
// 进行读取排序,合并
kpath = path.join(kitpath, kfile)
// kpath: /Users/AYA/Desktop/work/tinper.org/snippets/neoui/component/gallery/demo
var demofile = fs.readdirSync(kpath, 'utf-8');
demofiles = ut.rmdot(demofile).sort();
// console.log(kpath,'----',demofiles)
// fs.readdir(kpath, function(err, files){
// var files = ut.rmdot(files).sort();
// mapSeries顺序执行以上 sort结果
async.mapSeries(demofiles, function(exfile, callback) {
var outexPath = path.join(examplesPath, kit + exfile + '.html');
var exPath = path.join(kpath, exfile);
// console.log(exPath);
// /Users/AYA/Desktop/work/tinper.org/snippets/neoui/global/utilities/demo/4-other-display
//start 示例文件夹遍历
var exfiles = fs.readdirSync(exPath, 'utf-8');
var files = ut.rmdot(exfiles).sort();
// fs.readdir(exPath, function(err,files){
// files为最终层级文件,如.html .md .css .js
// var files = ut.rmdot(files);
var baseDemo = [];
var demoMd = [];
var demoHtml = [];
var demoCss = [];
var demoJs = [];
var codeHtml = [];
var codeCss = [];
var codeJs = [];
var ctxPath = '//design.yonyoucloud.com/static/uui/latest';
var optBtn = '<button class="u-button u-button-block u-button-accent margin-top-15 codeOptBtn" ><i class="uf uf-arrow-down"></i>查看代码</button>';
var styles, htmls, scripts, tpl;
// react js代码
var beeScript = beeShow = [];
var codeFun = function(data) {
return '<div class="examples-code"><pre><code>\r\n' + data + '</code></pre>\r\n</div>\r\n';
}
// 处理js注释不显示星号问题
var jsCodeFun = function(data) {
return '<pre class="examples-code"><code>\r\n' + data + '</code></pre>\r\n';
}
// 转义pre > code 下的html标签
var codeHtmlFun = function(data) {
return '<div class="examples-code"><pre><code>\r\n' + data.replace(/\</g, '<') + '</code></pre>\r\n</div>\r\n';
}
//遍历demo文件夹start
// console.log('exPath',exPath);
async.mapSeries(files, function(item, cb) {
var filePath = path.join(exPath, item);
// console.log('filePath',filePath,"---files:",files);
// console.log("files:",files,'\npath',exPath);
var ts = fs.readFileSync(filePath, 'utf-8')
if (/\.md$/.test(filePath)) {
demoMd = ts;
cb(null, null)
} else if (/\.html$/.test(filePath)) {
htmls = ts;
//demoHtml = '<div class="example-content">' + ts + '</div>\r\n';
codeHtml = codeHtmlFun(ts);
cb(null, null)
} else if (/\.css$/.test(filePath)) {
styles = ts;
//demoCss = '<div class="example-content ex-hide"><style>\r\n' + ts + '\r\n</style></div>';
codeCss = codeFun(ts);
cb(null, null)
} else if (/\.js$/.test(filePath)) {
scripts = ts;
// demoJs = '\r\n<script>\r\n' + ts + '\r\n</script>\r\n';
codeJs = jsCodeFun(ts);
cb(null, null)
}
}, function(err, results) {
// console.log("exPath:",exPath,"\nfiles:",files,'\nbeeShow:'+ beeShow.length);
// baseDemo = '\r\n' + demoMd + '\r\n' +
// demoHtml + '\r\n' + demoCss + '\r\n' + demoJs + '\r\n' + beeScript + '<div class="ex-code-par">' + optBtn +
// codeHtml + '\r\n' + codeCss + '\r\n' + codeJs + '\r\n' + beeShow + '</div>';
baseDemo = '\r\n' + demoMd + '\r\n' +
codeHtml + '\r\n' + codeCss + '\r\n' + codeJs + '\r\n';
demoMd = [];
demoHtml = [];
demoCss = [];
demoJs = [];
codeHtml = [];
codeCss = [];
codeJs = [];
//写入examples文件夹中
tpl = [
'<!DOCTYPE html>\r\n',
'<html lang="en">\r\n',
'<head>\r\n',
'<meta charset="UTF-8">\r\n',
'<meta name="viewport" content="width=device-width, initial-scale=1">\r\n',
'<title>Title</title>\r\n',
'<link rel="stylesheet" href="//design.yonyoucloud.com/static/uploader/css/webuploader.css">\r\n',
'<link rel="stylesheet" href="' + ctxPath + '/css/font-awesome.css">\r\n',
'<link rel="stylesheet" type="text/css" href="' + ctxPath + '/css/u.css">\r\n',
'<link rel="stylesheet" type="text/css" href="' + ctxPath + '/css/tree.css">\r\n',
'<link rel="stylesheet" type="text/css" href="' + ctxPath + '/css/grid.css">\r\n',
'<style id="demo-style" media="screen">\r\n',
styles,
'</style>\r\n',
'</head>\r\n',
'<body style="background-color: #eceff1;margin-left: 20px;width: calc(100% - 20px );">\r\n',
htmls,
'<script src="//design.yonyoucloud.com/static/jquery/jquery-1.11.2.js"></script>\r\n',
'<script src="//design.yonyoucloud.com/static/uploader/js/webuploader.js"></script>\r\n',
'<script src="//design.yonyoucloud.com/static/knockout/knockout-3.2.0.debug.js"></script>\r\n',
'<script src="' + ctxPath + '/js/u-polyfill.js"></script>\r\n',
'<script src="' + ctxPath + '/js/u.js"></script>\r\n',
'<script src="' + ctxPath + '/js/u-tree.js"></script>\r\n',
'<script src="' + ctxPath + '/js/u-grid.js"></script>\r\n',
'<script src="//design.yonyoucloud.com/static/requirejs/require.debug.js"></script>\r\n',
'<script>\r\n',
scripts,
'</script>\r\n',
'</body>\r\n',
'</html>\r\n'
];
fs.writeFileSync(outexPath, tpl.join(""));
callback(null, baseDemo);
})
//遍历demo文件夹end
// })
//end 示例文件夹遍历
}, function(err, results) {
// 返回的数据以数组形式返回需要合并
var data = results.join('\r\n');
wholeback(null, data);
});
// })
}
}, function(err, results) {
// 返回的数据以数组形式返回需要合并
var data = results.join('\r\n');
// 调用 `DIR` & `KIT`
var srcMdir = DIR.replace(snipConfig, srcFile)
// console.log("srcMdir:",srcMdir,"\nkit:",kit);
var outdir = path.join(srcMdir, `${KIT}.md`);
var results = results.join('\r\n');
fse.ensureFile(outdir, function() {
fs.writeFile(outdir, results, 'utf-8')
});
})
})
}]
})
}
})