|
1 |
| -var gulp = require('gulp'); |
2 |
| -var markdown = require('gulp-markdown'); |
3 |
| -var livereload = require('gulp-livereload'); |
4 |
| -var renderer = new markdown.marked.Renderer(); |
5 |
| -var map = require('map-stream'); |
6 |
| -var hljs = require('./highlight.min.js'); |
7 |
| -var minimist = require('minimist'); |
| 1 | +const gulp = require('gulp'); |
| 2 | +const markdown = require('gulp-markdown'); |
| 3 | +const livereload = require('gulp-livereload'); |
| 4 | +const renderer = new markdown.marked.Renderer(); |
| 5 | +const map = require('map-stream'); |
| 6 | +const hljs = require('./highlight.min.js'); |
| 7 | +const minimist = require('minimist'); |
| 8 | +const uuidv4 = require('uuid/v4'); |
| 9 | +const fs = require("fs"); |
| 10 | +const Mustache = require('mustache'); |
8 | 11 |
|
9 | 12 | var argsObj = minimist(process.argv.slice(3), {
|
10 | 13 | string: ['path', 'title'],
|
@@ -38,20 +41,27 @@ function pushLevel(model, level, escapedText) {
|
38 | 41 | }
|
39 | 42 | }
|
40 | 43 |
|
41 |
| -function fmtToc(model) { |
42 |
| - var tmp = '<ol class="order">' |
| 44 | +function fmtToc(model, isFirst, name) { |
| 45 | + var tmp = null; |
| 46 | + if (isFirst) { |
| 47 | + tmp = '<ul class="list-unstyled components">'; |
| 48 | + } else { |
| 49 | + var id = uuidv4(); |
| 50 | + tmp = '<li><a href="#' + id + '" data-toggle="collapse" aria-expanded="false">' + name + '</a><ul class="collapse list-unstyled" id="' + id + '"><li><a href="#' + name + '">' + name + '</a></li>'; |
| 51 | + } |
43 | 52 | if (model.length > 0) {
|
44 | 53 | model.forEach(function(e, i) {
|
45 |
| - var tt = '<li class="order"><a href="#' + e.name + '" >' + e.name + '</a>'; |
| 54 | + var tt = null; |
46 | 55 | if (e.sub.length > 0) {
|
47 |
| - tt = tt + fmtToc(e.sub) + '</li>'; |
| 56 | + tt = fmtToc(e.sub, false, e.name); |
48 | 57 | } else {
|
49 |
| - tt = tt + '</li>'; |
| 58 | + tt = '<li><a href="#' + e.name + '">' + e.name + '</a></li>'; |
50 | 59 | }
|
51 | 60 | tmp = tmp + tt;
|
52 | 61 | });
|
53 | 62 | }
|
54 |
| - return tmp + '</ol>'; |
| 63 | + |
| 64 | + return isFirst ? tmp + '</ul>' : tmp + '</ul></li>'; |
55 | 65 | }
|
56 | 66 | renderer.heading = function(text, level) {
|
57 | 67 | var escapedText = text.toLowerCase().replace(/[^a-zA-Z\u4e00-\u9fa5]+/g, '-');
|
@@ -79,22 +89,22 @@ var options = {
|
79 | 89 | renderer: renderer
|
80 | 90 | }
|
81 | 91 |
|
| 92 | +var styleDefaultData = fs.readFileSync("style.css", "utf-8"); |
| 93 | +var templateHtml = fs.readFileSync('template.html', 'utf-8'); |
| 94 | +var styleCustomData = '.code{padding: 2px 4px;font-size: 90%;color: #c7254e;background-color: #f9f2f4;border-radius: 4px;}'; |
82 | 95 |
|
83 | 96 | gulp.task('tohtml', function() {
|
84 | 97 | return gulp.src(mdPath)
|
85 | 98 | .pipe(markdown(options))
|
86 | 99 | .pipe(map(function(file, cb) {
|
87 | 100 | var fileContents = file.contents.toString();
|
88 |
| - fileContents = '<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>' + title + '</title>' + |
89 |
| - '<link rel="stylesheet" href="https://cdn.bootcss.com/highlight.js/9.12.0/styles/vs.min.css"><script src="https://cdn.bootcss.com/highlight.js/9.12.0/highlight.min.js"></script><script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>' + |
90 |
| - '<style>.code{padding: 2px 4px;font-size: 90%;color: #c7254e;background-color: #f9f2f4;border-radius: 4px;} .post{padding-top: 20px;margin-left: 380px;padding-bottom: 60px;max-width: 960px;}' + |
91 |
| - ' ol.order{ counter-reset: item } li.order{ display: block } li.order:before { content: counters(item, ".") " "; counter-increment: item } ' + |
92 |
| - ' .toc{position:fixed;width:350px;left:20px;top:20px;bottom:20px;height 600px;overflow-y:scroll;}' + |
93 |
| - '</style>' + |
94 |
| - '</head><body><div class="toc"><h3>目录:</h3>' + fmtToc(tocmodel) + '</div><div class="post">' + |
95 |
| - fileContents + |
96 |
| - '</div><script>hljs.initHighlightingOnLoad();$("li>code,p > code").addClass("code");' + |
97 |
| - '</script></body></html>'; |
| 101 | + fileContents = Mustache.render(templateHtml, { |
| 102 | + title: title, |
| 103 | + content: fileContents, |
| 104 | + toc: fmtToc(tocmodel, true), |
| 105 | + styleDefault: styleDefaultData, |
| 106 | + styleCustom: styleCustomData |
| 107 | + }); |
98 | 108 | file.contents = new Buffer(fileContents);
|
99 | 109 | //清空历史数据
|
100 | 110 | tocmodel = [];
|
|
0 commit comments