UNPKG

zhangdocs

Version:

Simple document generation tool. Dependence Node.js run.

137 lines (126 loc) 4.46 kB
var cheerio = require('cheerio'); var hljs = require("highlight.js"); // 注册常用的语言模块 hljs.registerLanguage('javascript', require('highlight.js/lib/languages/javascript')); hljs.registerLanguage('js', require('highlight.js/lib/languages/javascript')); hljs.registerLanguage('json', require('highlight.js/lib/languages/json')); hljs.registerLanguage('diff', require('highlight.js/lib/languages/diff')); hljs.registerLanguage('xml', require('highlight.js/lib/languages/xml')); hljs.registerLanguage('html', require('highlight.js/lib/languages/xml')); hljs.registerLanguage('css', require('highlight.js/lib/languages/css')); hljs.registerLanguage('python', require('highlight.js/lib/languages/python')); hljs.registerLanguage('bash', require('highlight.js/lib/languages/bash')); hljs.registerLanguage('shell', require('highlight.js/lib/languages/bash')); var log = console.log; module.exports = toc function toc(str,cb){ var option = {} $ = cheerio.load(str) // 代码高亮使用 highlight.js // 网站 http://adilapapaya.com/docs/highlight.js/#nodejs // 官网 https://highlightjs.org/ $('pre code').each(function(i, e) { var htstr,el = $(this),lang = el.attr('class'); // 处理 hljs 类名格式 if(lang && lang.indexOf('hljs ') === 0){ lang = lang.replace('hljs ',''); } else if(lang){ lang = lang.replace('lang-',''); } else { lang = ''; } if(lang){ try{ htstr = hljs.highlight($(this).text(), { language: lang }).value; }catch(e){ htstr = $(this).text(); } $(this).html(htstr); } }); // 1. markd模块 中文标题生成 ID bug; // 2. 序列号一个导航菜单 tocCreate($('h1,h2,h3,h4,h5,h6').attr('id',function(idx,elm){ return 't'+idx+$(this).text(); }).map(function(idx,itm){ return { title:$(itm).text(), tag:$(itm).get(0).tagName.replace(/^(h)/g,''), id:$(itm).attr('id') } }), function(op){ option.toc = op.tocHTML; option.tocJSON = op.tocJSON; }); $('h1,h2,h3,h4,h5,h6').each(function(i){ $(this).html($(this).text() + ' <a href="#'+'t'+i+ $(this).text() +'"> # </a>') }) //github 中的任务列表增强 $('ul li').each(function(idx,el){ var txt = $(this).html(); var chtml = ''; if(/^(\[x\])/.test(txt)){ chtml = 'checked="checked"'; }else if(/^(\[\ \])/.test(txt)){ chtml = ''; }; if(/^(\[x\]|\[\ \])/.test(txt)){ txt = txt.replace(/^(\[x\]|\[\ \])/g,'') $(this).html('').prepend('<input type="checkbox" class="task-list-item-checkbox" '+ chtml +' disabled="disabled">'+txt) $(this).addClass('task-list-item').parent().addClass('task-list-item'); }; }); // 回调返回 菜单静态页面 cb&&cb(option); // 返回HTML return $.html(); } // 树形菜单 - 序列化成JSON,生成 HTML // tocJSON 返回toc的JSON // tocHTML 返回toc的HTML静态页面 function tocCreate(arr,cb){ // console.log("message:arr",arr); var newArr = [] for (var i = 0; i < arr.length; i++) { if(i===0) newArr.push(arr[i]); else{ newArr = pushArr(newArr,arr[i]) } }; var html = tocCreatHTML(newArr); cb&&cb({ tocJSON:newArr, tocHTML:html }); } // 树形菜单 - 序列化成JSON function pushArr(_group,_new){ var last = _group[_group.length-1] var tag = last.tag if(tag === _new.tag || tag > _new.tag){ _group.push(_new) }else{ if(last.submenu){ pushArr(last.submenu,_new); }else{ last.submenu = []; last.submenu.push(_new); } } return _group; } // 树形菜单 - 生成HTML function tocCreatHTML(arr){ // console.log("arr:",arr); var str = '<ul>'; for (var i = 0; i < arr.length; i++) { toc_num = (i+1); str += '<li><a href="#' + arr[i].id +'">' + arr[i].title + '</a>'; if(arr[i].submenu){ str += tocCreatHTML(arr[i].submenu); } str += '</li>'; }; str += '</ul>'; return str; }