Skip to content

Commit

Permalink
修改
Browse files Browse the repository at this point in the history
  • Loading branch information
lilinsen committed Jan 23, 2019
1 parent 0671d4e commit a2fcb17
Show file tree
Hide file tree
Showing 2 changed files with 225 additions and 164 deletions.
321 changes: 157 additions & 164 deletions scripts/mdToVue.js
Original file line number Diff line number Diff line change
@@ -1,79 +1,56 @@
const fs = require('fs');
var path = require('path');
//marked转换工具
let marked = require('marked');
let package = require("../package.json");
if (!marked) {
console.log('you need npm i marked -D!');
}
//插入 默认的 script 标签
let jsroot = `<script>export default {
data(){
return {
content:'',
codeurl:'',
demourl:''
// 基本配置文件信息
let {version} = require("../package.json");
//vue js脚本
let jsroot = require('./mdtoVueroot');
//获取所有文件列表
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;
}
},
methods:{
closelayer(){
this.content = '';
},
toast(e){
const options = {
noHeader:true,
noFooter:true,
content:e.target.parentElement.outerHTML
}
this.content = options.content;
let copy = this.copy;
new copy('.copy',{
target:res => {
return res.previousElementSibling
}
});
},
dsCode(e){
let tag = e.target;
if(tag.attributes.toast){
this.toast(e)
}
}
},
mounted(){
//let that = this;
//let pre = document.querySelectorAll('pre');
// for(let i=0,item;item = pre[i];i++){
// item.classList.toggle('prettyprint');
// let creatC = document.createElement('i');
// creatC.setAttribute('copy','copy');
// creatC.setAttribute('data-clipboard-action','copy');
// creatC.setAttribute('data-clipboard-target','code');
// creatC.setAttribute('class','copy')
// let creatA = document.createElement('i');
// creatA.setAttribute('toast','toast');
// item.appendChild(creatC);
// item.appendChild(creatA);
// }
if (!lang) {
return '<pre><code>'
+ (escaped ? code : escape(code, true))
+ '</code></pre>';
}

this.$nextTick(()=>{
let copy = this.copy;
new copy('.copy',{
target:res => {
return res.previousElementSibling
}
});
let demourl = 'https://nutui.jd.com/demo.html#'+this.$route.path;
if (lang === 'html') {
code = code.replace(/@latest/g, '@' + version)
}

this.demourl = demourl;
this.qrcode.toDataURL(demourl,{width:170},(err,url)=>{
this.codeurl = url
});
});
}
}
</script>`;
return '<pre class="prettyprint"><span class="lang">' + lang + '</span><code class="'
+ this.options.langPrefix
+ escape(lang, true)
+ '">'
+ (escaped ? code : escape(code, true))
+ '</code><i class="copy" copy="copy" data-clipboard-action="copy" data-clipboard-target="code" title="复制代码"></i><i toast="toast" title="全屏"></i></pre>\n';
};
marked.setOptions({
renderer: rendererMd,
highlight: function (code) {
return require('highlight.js').highlightAuto(code).value;
},
tables: true
}, res => {

})
/**
*
* 是否需要单独处理头部信息
* @param {text} sorce 替换 头部信息
*/
function insert(sorce) {
Expand Down Expand Up @@ -106,6 +83,7 @@ function createdFile(output, sorce, ishasCode) {
<div v-if="content" class="layer">
<pre><span class="close-box" @click="closelayer"></span><div v-html="content"></div></pre>
</div>`+ res + '</div></template>' + jsroot;

var buf = new Buffer(bufs);
if (typeof fd == 'number') {
fs.writeSync(fd, buf, 0, buf.length, 0);
Expand All @@ -115,116 +93,131 @@ function createdFile(output, sorce, ishasCode) {

})
}

/**
*
* @param {string} filePath 监听路径
* @param {*} outPath 输出路径
* @param {*} nohead 是否有头文件
* 目录读取,找到跟文件
* @fileSrc {string} 打开文件路径
* @callback {fn} 结束后回调函数
*/
function fileDisplay(filePath, outPath, nohead) {
var rendererMd = new marked.Renderer();

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;
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)
}
}

if (!lang) {
return '<pre><code>'
+ (escaped ? code : escape(code, true))
+ '</code></pre>';
}

if (lang === 'html') {
code = code.replace(/@latest/g, '@' + package.version)
}

return '<pre class="prettyprint"><span class="lang">' + lang + '</span><code class="'
+ this.options.langPrefix
+ escape(lang, true)
+ '">'
+ (escaped ? code : escape(code, true))
+ '</code><i class="copy" copy="copy" data-clipboard-action="copy" data-clipboard-target="code" title="复制代码"></i><i toast="toast" title="全屏"></i></pre>\n';
};

marked.setOptions({
renderer: rendererMd,
highlight: function (code) {
return require('highlight.js').highlightAuto(code).value;
},
tables: true
}, res => {

checkEnd()
}
})
})
//为空时直接回调
files.length === 0 && callback()
})
fs.readdir(filePath, (res, files) => {
if (!res) {
files.forEach(filename => {
//获取当前文件绝对路径
let filedir = path.join(filePath, filename);
//文件写入
fs.stat(filedir, (err, stats) => {
if (!err) {
if (stats.isDirectory()) {
fileDisplay(filedir, outPath, nohead)
} else {
//判断文件类型是否是md文件
if (/.md$/.test(filedir)) {
//文件读取
fs.readFile(filedir, 'utf-8', (err, data) => {
let html = marked(data);
let filedirarry = filedir.split('.');
let fdurl = filedirarry[0];
let fileNames = [];
for (let i = fdurl.length - 1; i > -1; i--) {
if (/[a-zA-Z]/.test(fdurl[i])) {
fileNames.push(fdurl[i])
} else {
fileNames.push('-')
}
}
let newName = fileNames.reverse().join('').split('-');
let resName = '';
if (newName.indexOf('doc') > -1) {
resName = newName[newName.length - 2]
} else {
resName = newName[newName.length - 1]
}

createdFile(outPath + '/' + resName + '.vue', html, nohead)
});
//文件监听
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文件 并进行操作
* @src {string} 打开的文件目录
*/
function ismd(src){
//判断文件类型是否是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;
}
resolve({
mdName:mdName,
html:html
})
//创建文件

});
}else{
reject('nomd')
}
})


}
//文件监听
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).then(res=>{
//res md文件处理结果
createdFile(param.output + '/' + res.mdName + '.vue', res.html, param.needCode)
})
}
})
})
});
}
//md转 其他格式类型
/**
*
* @param {entry} 文件读取路径
* @param {output} 文件输出路径
* @param {needCode} 是否需要二维码 默认 true
*/
function MdToHtml(commomOption) {
// commomOption = options;
// 默认参数就这么多了,暂时没想到
let params = {
entry:'',
output:'',
needCode:true
}
params = Object.assign(params,commomOption);
//获取所有的md 转html的结果
fileDisplay(commomOption.entry, commomOption.output, commomOption.nohead);
fileDisplay(params);
}
//用于后期的扩展暂时没想到
MdToHtml.prototype.apply = function (compiler) {
// console.log(compiler,'lls')
};

module.exports = MdToHtml;
Loading

0 comments on commit a2fcb17

Please sign in to comment.