const fs = require('fs'); var path = require('path'); //marked转换工具 let marked = require('marked'); if (!marked) { console.log('you need npm i marked -D!'); } // 基本配置文件信息 let {version} = require("../package.json"); //vue js脚本 //获取所有文件列表 let fileList = []; // maked文件配置 var rendererMd = new marked.Renderer(); //maked文件规则 rendererMd.code = function (code, infostring, escaped) { var lang = (infostring || '').match(/\S*/)[0]; if (this.options.highlight) { var out = this.options.highlight(code, lang); if (out != null && out !== code) { escaped = true; code = out; } } if (!lang) { return '
'
            + (escaped ? code : escape(code, true))
            + '
'; } if (lang === 'html') { code = code.replace(/@latest/g, '@' + version) } return '
' + lang + ''
        + (escaped ? code : escape(code, true))
        + '
\n'; }; marked.setOptions({ renderer: rendererMd, highlight: function (code) { return require('highlight.js').highlightAuto(code).value; }, tables: true }, res => { }) /** * 是否需要单独处理头部信息 * @param {text} sorce 替换 头部信息 */ function insert(sorce) { var insert = sorce.indexOf(''); if (insert > -1) { return sorce.substring(0, insert) + '请使用手机扫码体验' + sorce.substring(insert, sorce.length); } else { return sorce } } ///创建一个空文件 /** * 修复中 * @param {string} output 输出路径 * @param {string} sorce 文件源 * @param {boole} ishasCode 是否需要二维码 */ function createdFile(output, sorce, ishasCode) { var pathSrc = output; if (ishasCode) { var res = insert(sorce); } else { var res = sorce; } var bufs = ``; fs.writeFile(pathSrc,bufs,'utf8',(err)=>{ }) } /** * 目录读取,找到跟文件 * @fileSrc {string} 打开文件路径 * @callback {fn} 结束后回调函数 */ function readDirRecur(fileSrc, callback) { fs.readdir(fileSrc, function(err, files) { var count = 0 var checkEnd = function() { ++count == files.length && callback() } files.forEach(function(file) { var fullPath = fileSrc + '/' + file; fs.stat(fullPath, function(err, stats) { if (stats.isDirectory()) { return readDirRecur(fullPath, checkEnd); } else { /*not use ignore files*/ if(file[0] == '.') { } else { fileList.push(fullPath) } checkEnd() } }) }) //为空时直接回调 files.length === 0 && callback() }) } /** * 判断是否位md文件 并进行操作 * @src {string} 打开的文件目录 */ function ismd(src,callback){ //判断文件类型是否是md文件 let filedir = src; //return new Promise((resolve,reject)=>{ if (/.md$/.test(filedir)) { //文件读取 fs.readFile(filedir, 'utf-8', (err, data) => { let html = marked(data); let mdName = ""; let opensName = filedir.replace(/(^.*\/|.md)/g,""); //如果是doc文件以前缀 为 if (opensName === 'doc') { mdName = filedir.replace(/(^.*packages\/|\/doc\.md)/g,''); } else { //如果不是doc命名的文件 mdName = opensName; } callback({ mdName:mdName, html:html }) }); } } //文件监听 function filelisten(){ let fsWatcher = fs.watchFile(filedir, { persistent: true, persistent: 1000 }, (err, data) => { // console.log(err,data,filedir); fs.readFile(filedir, 'utf-8', (err, data) => { let html = marked(data); let filedirarry = filedir.split('/'); let fileNames = filedirarry[filedirarry.length - 2]; createdFile(outPath + fileNames + '.vue', html, nohead) }); }); } /** * 文件转md * @param {obj} * @entry {string} 文件读取路径 * @output {string} 文件输出路径 * @needCode {boolen} 是否需要二维码 默认 true */ function fileDisplay(param) { // 获取文件 readDirRecur(param.entry, function(filePath) { //文件列表 fileList.map(item=>{ ismd(item,res=>{ //res md文件处理结果 createdFile(param.output + res.mdName + '.vue', res.html, param.needCode) }) }) }); } //md转 其他格式类型 /** * * @outPath {String} 输出的文件目录 */ function ishasOutFile(outPath,callback){ fs.stat(outPath,(err,res)=>{ if(err){ fs.mkdir(outPath,erro=>{ if(erro){ }else{ callback() } }) }else{ callback() } }) } /** * * @param {entry} 文件读取路径 * @param {output} 文件输出路径 * @param {needCode} 是否需要二维码 默认 true */ function MdToHtml(commomOption) { // 默认参数就这么多了,暂时没想到 let params = { entry:'', output:'', needCode:true } params = Object.assign(params,commomOption); //检查输出路径 ishasOutFile(params.output,()=>{ //获取所有的md 转html的结果 fileDisplay(params); }); } //用于后期的扩展暂时没想到 MdToHtml.prototype.apply = function (compiler) { // console.log(compiler,'lls') }; module.exports = MdToHtml;