mdToVue.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. const fs = require('fs');
  2. var path = require('path');
  3. //marked转换工具
  4. let marked = require('marked');
  5. if (!marked) {
  6. console.log('you need npm i marked -D!');
  7. }
  8. // 基本配置文件信息
  9. let {version} = require("../package.json");
  10. //vue js脚本
  11. //获取所有文件列表
  12. let fileList = [];
  13. // maked文件配置
  14. var rendererMd = new marked.Renderer();
  15. //maked文件规则
  16. rendererMd.code = function (code, infostring, escaped) {
  17. var lang = (infostring || '').match(/\S*/)[0];
  18. if (this.options.highlight) {
  19. var out = this.options.highlight(code, lang);
  20. if (out != null && out !== code) {
  21. escaped = true;
  22. code = out;
  23. }
  24. }
  25. if (!lang) {
  26. return '<pre><code>'
  27. + (escaped ? code : escape(code, true))
  28. + '</code></pre>';
  29. }
  30. if (lang === 'html') {
  31. code = code.replace(/@latest/g, '@' + version)
  32. }
  33. return '<pre class="prettyprint"><span class="lang">' + lang + '</span><code class="'
  34. + this.options.langPrefix
  35. + escape(lang, true)
  36. + '">'
  37. + (escaped ? code : escape(code, true))
  38. + '</code><i class="copy" copy="copy" data-clipboard-action="copy" data-clipboard-target="code" title="复制代码"></i><i toast="toast" title="全屏"></i></pre>\n';
  39. };
  40. marked.setOptions({
  41. renderer: rendererMd,
  42. highlight: function (code) {
  43. return require('highlight.js').highlightAuto(code).value;
  44. },
  45. tables: true
  46. }, res => {
  47. })
  48. /**
  49. * 是否需要单独处理头部信息
  50. * @param {text} sorce 替换 头部信息
  51. */
  52. function insert(sorce) {
  53. var insert = sorce.indexOf('</h1>');
  54. if (insert > -1) {
  55. return sorce.substring(0, insert) + '<i class="qrcode"><a :href="demourl"><span>请使用手机扫码体验</span><img :src="codeurl" alt=""></a></i>' + sorce.substring(insert, sorce.length);
  56. } else {
  57. return sorce
  58. }
  59. }
  60. ///创建一个空文件
  61. /**
  62. * 修复中
  63. * @param {string} output 输出路径
  64. * @param {string} sorce 文件源
  65. * @param {boole} ishasCode 是否需要二维码
  66. */
  67. function createdFile(output, sorce, ishasCode) {
  68. var pathSrc = output;
  69. if (ishasCode) {
  70. var res = insert(sorce);
  71. } else {
  72. var res = sorce;
  73. }
  74. var bufs = `<template><div @click="dsCode">
  75. <div v-if="content" class="layer">
  76. <pre><span class="close-box" @click="closelayer"></span><div v-html="content"></div></pre>
  77. </div>`+ res + `</div></template><script>import root from '../root.js';
  78. export default {
  79. mixins:[root]
  80. }</script>`;
  81. fs.writeFile(pathSrc,bufs,'utf8',(err)=>{
  82. })
  83. }
  84. /**
  85. * 目录读取,找到跟文件
  86. * @fileSrc {string} 打开文件路径
  87. * @callback {fn} 结束后回调函数
  88. */
  89. function readDirRecur(fileSrc, callback) {
  90. fs.readdir(fileSrc, function(err, files) {
  91. var count = 0
  92. var checkEnd = function() {
  93. ++count == files.length && callback()
  94. }
  95. files.forEach(function(file) {
  96. var fullPath = fileSrc + '/' + file;
  97. fs.stat(fullPath, function(err, stats) {
  98. if (stats.isDirectory()) {
  99. return readDirRecur(fullPath, checkEnd);
  100. } else {
  101. /*not use ignore files*/
  102. if(file[0] == '.') {
  103. } else {
  104. fileList.push(fullPath)
  105. }
  106. checkEnd()
  107. }
  108. })
  109. })
  110. //为空时直接回调
  111. files.length === 0 && callback()
  112. })
  113. }
  114. /**
  115. * 判断是否位md文件 并进行操作
  116. * @src {string} 打开的文件目录
  117. */
  118. function ismd(src,callback){
  119. //判断文件类型是否是md文件
  120. let filedir = src;
  121. //return new Promise((resolve,reject)=>{
  122. if (/.md$/.test(filedir)) {
  123. //文件读取
  124. fs.readFile(filedir, 'utf-8', (err, data) => {
  125. let html = marked(data);
  126. let mdName = "";
  127. let opensName = filedir.replace(/(^.*\/|.md)/g,"");
  128. //如果是doc文件以前缀 为
  129. if (opensName === 'doc') {
  130. mdName = filedir.replace(/(^.*packages\/|\/doc\.md)/g,'');
  131. } else {
  132. //如果不是doc命名的文件
  133. mdName = opensName;
  134. }
  135. callback({
  136. mdName:mdName,
  137. html:html
  138. })
  139. });
  140. }
  141. }
  142. //文件监听
  143. function filelisten(){
  144. let fsWatcher = fs.watchFile(filedir, {
  145. persistent: true,
  146. persistent: 1000
  147. }, (err, data) => {
  148. // console.log(err,data,filedir);
  149. fs.readFile(filedir, 'utf-8', (err, data) => {
  150. let html = marked(data);
  151. let filedirarry = filedir.split('/');
  152. let fileNames = filedirarry[filedirarry.length - 2];
  153. createdFile(outPath + fileNames + '.vue', html, nohead)
  154. });
  155. });
  156. }
  157. /**
  158. * 文件转md
  159. * @param {obj}
  160. * @entry {string} 文件读取路径
  161. * @output {string} 文件输出路径
  162. * @needCode {boolen} 是否需要二维码 默认 true
  163. */
  164. function fileDisplay(param) {
  165. // 获取文件
  166. readDirRecur(param.entry, function(filePath) {
  167. //文件列表
  168. fileList.map(item=>{
  169. ismd(item,res=>{
  170. //res md文件处理结果
  171. createdFile(param.output + res.mdName + '.vue', res.html, param.needCode)
  172. })
  173. })
  174. });
  175. }
  176. //md转 其他格式类型
  177. /**
  178. *
  179. * @outPath {String} 输出的文件目录
  180. */
  181. function ishasOutFile(outPath,callback){
  182. fs.stat(outPath,(err,res)=>{
  183. if(err){
  184. fs.mkdir(outPath,erro=>{
  185. if(erro){
  186. }else{
  187. callback()
  188. }
  189. })
  190. }else{
  191. callback()
  192. }
  193. })
  194. }
  195. /**
  196. *
  197. * @param {entry} 文件读取路径
  198. * @param {output} 文件输出路径
  199. * @param {needCode} 是否需要二维码 默认 true
  200. */
  201. function MdToHtml(commomOption) {
  202. // 默认参数就这么多了,暂时没想到
  203. let params = {
  204. entry:'',
  205. output:'',
  206. needCode:true
  207. }
  208. params = Object.assign(params,commomOption);
  209. //检查输出路径
  210. ishasOutFile(params.output,()=>{
  211. //获取所有的md 转html的结果
  212. fileDisplay(params);
  213. });
  214. }
  215. //用于后期的扩展暂时没想到
  216. MdToHtml.prototype.apply = function (compiler) {
  217. // console.log(compiler,'lls')
  218. };
  219. module.exports = MdToHtml;