const path = require('path');
const fs = require('fs');
const nodeFilelist = require('node-filelist');
let { hashElement } = require('folder-hash');
let { version } = require("../package.json");
let marked = require('marked');
let contrast = require('./contrast');
let rimraf = require("rimraf");
if (!marked) {
console.log('you need npm i marked -D!');
}
class mdVue{
constructor(options){
let defaultSetting = {
needCode:true,
isbuild:true,
hasMarkList:true
};
this.options =Object.assign(defaultSetting,options);
this.rendererMd = new marked.Renderer();
this.marked = marked;
let _that = this;
this.Articlehead = "";
this.Articleheadcount = 0;
this.needHandleFiles = null;
this.cachePath = path.join("./cache",options.entry.split(path.sep).pop()+ '.cache');
this.codeHandle();
this.checkSelf().then(res=>{
// 检查要编译的文件
let ct = new contrast({
entry:this.options.entry
}).run().then(res=>{
_that.needHandleFiles = res;
_that.ishasOutFile(_that.options.output).then(res=>{
_that.star();
});
})
})
}
checkSelf(){
let _that = this;
return new Promise((resolve,reject)=>{
new contrast({
entry:path.join(__dirname,"mdToVue.js"),
include:["*.js"]
}).run().then(res=>{
if(JSON.stringify(res) != "{}"){
//有变动清除当前entry缓存,重新渲染
rimraf(_that.cachePath,err=>{
console.log(err)
resolve()
})
}else{
resolve()
}
})
})
}
apply(){}
star(){
let _that = this;
hashElement(_that.options.entry, {
folders: { exclude: ['.*', 'node_modules', 'test_coverage'] },
files: { include: ['*.md']},
matchBasename: true
}).then(hash => {
nodeFilelist.read([_that.options.entry],{"ext":'md'}, res => {
res.map(item =>{
let fileSplits = item.path.split(path.sep);
let fileName = fileSplits.pop();
if(_that.isDoc(fileName)){
fileName = fileSplits.pop();
}else{
fileName = fileName.replace(/\.md/,'');
}
if(_that.needHandleFiles[fileName]){
_that.read(item.path).then(res=>{
_that.headHandle();
_that.markHandle();
let html = _that.marked(res);
_that.write({
outsrc:_that.options.output,
name:fileName + '.vue',
html:html
});
})
}
});
});
})
}
isDoc(name){
return (name == "doc.md") ? true : false;
}
read(src){
return new Promise((resolve,reject)=>{
fs.readFile(src, 'utf-8', (err, data) => {
resolve(data)
})
})
}
write(param){
let _that = this;
return new Promise((resolve,reject)=>{
let outPath = path.join(param.outsrc,param.name);
let contexts = `
' + _that.Articlehead + '
' : '')+
`';
let codeHead = `
'
+ (escaped ? code : escape(code, true))
+ '';
}
if (lang === 'html') {
code = code.replace(/@latest/g, '@' + version)
}
return '' + lang + '' + (escaped ? code : escape(code, true)) + '