mdToVue.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. const fs = require('fs');
  2. var path = require('path');
  3. let marked = require('marked');
  4. let version =require("../src/config.json") ;
  5. if (!marked) {
  6. console.log('you need npm i marked -D!');
  7. }
  8. //let commomOption = null;
  9. //插入 默认的 script 标签
  10. let jsroot = `<script>export default {
  11. data(){
  12. return {
  13. content:'',
  14. codeurl:'',
  15. demourl:''
  16. }
  17. },
  18. methods:{
  19. closelayer(){
  20. this.content = '';
  21. },
  22. toast(e){
  23. const options = {
  24. noHeader:true,
  25. noFooter:true,
  26. content:e.target.parentElement.outerHTML
  27. }
  28. this.content = options.content;
  29. let copy = this.copy;
  30. new copy('.copy',{
  31. target:res => {
  32. return res.previousElementSibling
  33. }
  34. });
  35. },
  36. dsCode(e){
  37. let tag = e.target;
  38. if(tag.attributes.toast){
  39. this.toast(e)
  40. }
  41. }
  42. },
  43. mounted(){
  44. let that = this;
  45. let pre = document.querySelectorAll('pre');
  46. for(let i=0,item;item = pre[i];i++){
  47. item.classList.toggle('prettyprint');
  48. let creatC = document.createElement('i');
  49. creatC.setAttribute('copy','copy');
  50. creatC.setAttribute('data-clipboard-action','copy');
  51. creatC.setAttribute('data-clipboard-target','code');
  52. creatC.setAttribute('class','copy')
  53. let creatA = document.createElement('i');
  54. creatA.setAttribute('toast','toast');
  55. item.appendChild(creatC);
  56. item.appendChild(creatA);
  57. }
  58. let copy = this.copy;
  59. new copy('.copy',{
  60. target:res => {
  61. return res.previousElementSibling
  62. }
  63. });
  64. let demourl = 'http://nutui.jd.com/demo.html#'+that.$route.path;
  65. this.demourl = demourl;
  66. this.qrcode.toDataURL(demourl,{width:170},(err,url)=>{
  67. that.codeurl = url
  68. })
  69. }
  70. }
  71. </script>`;
  72. //插入
  73. function insert(sorce) {
  74. var insert = sorce.indexOf('</h1>');
  75. if (insert > -1) {
  76. return sorce.substring(0, insert) + '<i class="qrcode"><a :href="demourl"><span>请使用手机扫码体验</span><img :src="codeurl" alt=""></a></i>' + sorce.substring(insert, sorce.length);
  77. } else {
  78. return sorce
  79. }
  80. }
  81. ///创建一个空文件
  82. function createdFile(output, sorce,ishasCode) {
  83. var pathSrc = output;
  84. if(sorce.indexOf('latest')>0){
  85. console.log(version.version,'版本号')
  86. sorce = sorce.replace('latest',version.version)
  87. }
  88. if(!ishasCode){
  89. var res = insert(sorce);
  90. } else{
  91. var res = sorce;
  92. }
  93. fs.open(pathSrc, "w+", (err, fd) => {
  94. var bufs = `<template><div @click="dsCode">
  95. <div v-if="content" class="layer">
  96. <span class="close-box" @click="closelayer"></span>
  97. <div v-html="content"></div>
  98. </div>`+ res + '</div></template>' + jsroot;
  99. var buf = new Buffer(bufs);
  100. if( typeof fd == 'number'){
  101. fs.writeSync(fd, buf, 0, buf.length, 0);
  102. }else{
  103. console.log(pathSrc,' typeof fd != number 请改正文件')
  104. }
  105. })
  106. }
  107. function fileDisplay(filePath,outPath,nohead) {
  108. var rendererMd = new marked.Renderer();
  109. marked.setOptions({
  110. renderer: rendererMd,
  111. highlight: function (code) {
  112. return require('highlight.js').highlightAuto(code).value;
  113. },
  114. tables: true
  115. }, res => {
  116. })
  117. fs.readdir(filePath, (res, files) => {
  118. if (!res) {
  119. files.forEach(filename => {
  120. //获取当前文件绝对路径
  121. let filedir = path.join(filePath, filename);
  122. //文件写入
  123. fs.stat(filedir, (err, stats) => {
  124. if (!err) {
  125. if (stats.isDirectory()) {
  126. fileDisplay(filedir,outPath,nohead)
  127. } else {
  128. //判断文件类型是否是md文件
  129. if (/.md$/.test(filedir)) {
  130. //文件读取
  131. fs.readFile(filedir, 'utf-8', (err, data) => {
  132. let html = marked(data);
  133. let filedirarry = filedir.split('.');
  134. let fdurl = filedirarry[0];
  135. let fileNames = [];
  136. for (let i = fdurl.length - 1; i > -1; i--) {
  137. if (/[a-zA-Z]/.test(fdurl[i])) {
  138. fileNames.push(fdurl[i])
  139. } else {
  140. fileNames.push('-')
  141. }
  142. }
  143. let newName = fileNames.reverse().join('').split('-');
  144. let resName = '';
  145. if(newName.indexOf('doc')>-1){
  146. resName = newName[newName.length - 2]
  147. }else{
  148. resName = newName[newName.length - 1]
  149. }
  150. createdFile(outPath + '/' + resName + '.vue', html,nohead)
  151. });
  152. //文件监听
  153. let fsWatcher = fs.watchFile(filedir, {
  154. persistent: true,
  155. persistent: 1000
  156. }, (err, data) => {
  157. // console.log(err,data,filedir);
  158. fs.readFile(filedir, 'utf-8', (err, data) => {
  159. let html = marked(data);
  160. let filedirarry = filedir.split('/');
  161. let fileNames = filedirarry[filedirarry.length - 2];
  162. createdFile(outPath + '/' + fileNames + '.vue', html,nohead)
  163. });
  164. });
  165. }
  166. }
  167. }
  168. })
  169. })
  170. }
  171. })
  172. }
  173. //md转 其他格式类型
  174. function MdToHtml(commomOption) {
  175. // commomOption = options;
  176. //获取所有的md 转html的结果
  177. fileDisplay(commomOption.entry,commomOption.output,commomOption.nohead);
  178. }
  179. MdToHtml.prototype.apply = function (compiler) {
  180. // console.log(compiler,'lls')
  181. };
  182. module.exports = MdToHtml;