mdToVue.js 6.9 KB

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