| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- const fs = require('fs');
- var path = require('path');
- 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:''
- }
- },
- 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>`;
- /**
- *
- * @param {text} sorce 替换 头部信息
- */
- function insert(sorce) {
- var insert = sorce.indexOf('</h1>');
- if (insert > -1) {
- return sorce.substring(0, insert) + '<i class="qrcode"><a :href="demourl"><span>请使用手机扫码体验</span><img :src="codeurl" alt=""></a></i>' + sorce.substring(insert, sorce.length);
- } else {
- return sorce
- }
- }
- ///创建一个空文件
- /**
- *
- * @param {string} output 输出路径
- * @param {string} sorce 文件源
- * @param {boole} ishasCode 是否需要二维码
- */
- function createdFile(output, sorce, ishasCode) {
- var pathSrc = output;
- if (!ishasCode) {
- var res = insert(sorce);
- } else {
- var res = sorce;
- }
- fs.open(pathSrc, "w+", (err, fd) => {
- var bufs = `<template><div @click="dsCode">
- <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);
- } else {
- console.log(pathSrc, ' typeof fd != number 请改正文件')
- }
- })
- }
- /**
- *
- * @param {string} filePath 监听路径
- * @param {*} outPath 输出路径
- * @param {*} nohead 是否有头文件
- */
- 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;
- }
- }
- 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 => {
- })
- 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转 其他格式类型
- function MdToHtml(commomOption) {
- // commomOption = options;
- //获取所有的md 转html的结果
- fileDisplay(commomOption.entry, commomOption.output, commomOption.nohead);
- }
- MdToHtml.prototype.apply = function (compiler) {
- // console.log(compiler,'lls')
- };
- module.exports = MdToHtml;
|