|
|
@@ -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) {
|
|
|
@@ -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);
|
|
|
@@ -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;
|