cherry-doc
Version:
markdown to doc
139 lines (111 loc) • 4.01 kB
JavaScript
/**
* @file 遍历所有md文件,生成data文件。
* @author zhangpeng53
*/
var fs = require('fs');
var path = require('path');
var walk = require('walk');
var yamlFront = require('yaml-front-matter');
var sh = require('child_process').execSync;
var chalk = require('chalk');
function fsExistsSync(path) {
try {
fs.accessSync(path, fs.F_OK);
} catch (e) {
return false;
}
return true;
}
module.exports = function walkMD(config) {
var dist = path.join(config.theme, '/tmp');
return new Promise(function (resolve, reject) {
var mdData = {};
var source = {};
function parseData(arr, category, page, rank, file) {
var key = category + "_" + page;
var have = !!arr.length;
have = arr.some(function (item) {
if (item.key === key) {
item.files[rank] = file;
return true;
}
return false;
});
if (!have) {
arr.push({
page: page,
key: key,
files: [file]
});
}
}
function writeFiles(data) {
for (var k in data) {
var category = data[k];
category.forEach(function (item) {
var key = item.key;
var outFile = '';
item.files.forEach(function (f) {
outFile += 'require(\'' + f + '\'),\n';
});
source[key] = './tmp/__' + key;
var out = 'module.exports = [\n' + outFile + ']';
fs.writeFileSync(dist + ('/__' + key + '.js'), out);
});
}
}
function walkdir() {
var walker = walk.walk(config.root);
walker.on('file', function (root, fileStats, next) {
var name = fileStats.name;
var ext = path.extname(name);
var basename = path.basename(name, config.ext);
var file = path.resolve('', root + '/' + name);
if (ext === config.ext) {
var input = fs.readFileSync(file, 'utf-8');
var yaml = yamlFront.loadFront(input, 'content');
// console.log(yaml);
var page = yaml.page;
var rank = yaml.rank;
var category = yaml.category;
if (!category) category = '__default__';
if (!rank) rank = 0;
if (category !== '__nav__') {
if (!mdData[category]) mdData[category] = [];
parseData(mdData[category], category, page, rank, file);
}
}
next();
});
walker.on('end', function () {
console.log(chalk.green('=========解析markdown========='));
console.log(chalk.green(JSON.stringify(mdData, null, 4)));
console.log(chalk.green('=========end========='));
writeFiles(mdData);
//将config 写入 文件
var data = {
md: mdData,
config: config,
source: source,
root: process.cwd()
};
fs.writeFileSync(dist + '/__md__.json', JSON.stringify(data, null, 4));
resolve();
});
walker.on('error', function (e) {
console.log(e);
reject(e);
});
}
walkdir();
});
};
;
var _temp = function () {
if (typeof __REACT_HOT_LOADER__ === 'undefined') {
return;
}
__REACT_HOT_LOADER__.register(sh, 'sh', 'src/walkmd.js');
__REACT_HOT_LOADER__.register(fsExistsSync, 'fsExistsSync', 'src/walkmd.js');
}();
;