lilinsen 7 years ago
parent
commit
a2fcb170d9
2 changed files with 225 additions and 164 deletions
  1. 157 164
      scripts/mdToVue.js
  2. 68 0
      scripts/mdtoVueroot.js

+ 157 - 164
scripts/mdToVue.js

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

+ 68 - 0
scripts/mdtoVueroot.js

@@ -0,0 +1,68 @@
+//插入 默认的 script 标签
+let jsroot=  `<script>export default {
+    data(){
+        return {
+          content:'',
+          codeurl:'',
+          demourl:''
+        }
+      },
+      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);      
+    // }
+
+    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;
+
+        this.demourl = demourl;
+        this.qrcode.toDataURL(demourl,{width:170},(err,url)=>{
+            this.codeurl = url
+        });
+    });
+  }
+}
+</script>`;
+module.exports= jsroot ;