-
Notifications
You must be signed in to change notification settings - Fork 592
/
generate-toc
executable file
·78 lines (62 loc) · 2.18 KB
/
generate-toc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/env node
'use strict';
var fs = require('fs'),
cheerio = require('cheerio'),
yamlFront = require('yaml-front-matter');
var URL = '{{site.baseurl}}/docs/';
var DIR = __dirname + '/../site/';
var DOCS_LAYOUT = DIR + '/_layouts/docs.html';
var COMPILED_DOCS = DIR + '/_site/docs';
var TOC = DIR + '/_includes/docs_toc.md';
var CONTENT_TAG = '.page-content';
var INNER_LINK_TAG = 'h2';
var writeStream = fs.createWriteStream(TOC, {flags: 'w'}); // w flag means overwrite existing file
writeStream.write('[//]: # (Auto-generated by scripts/generate-toc)\r\n');
// generate markdown for list item
function generateListItem(content, buffer) {
var indent = '';
for (var i = 0; i < buffer; i++) {
indent += ' ';
}
return `${indent}- ${content}`;
}
// generate markdown for anchor tag
function generateLink(title, page, local) {
return `[${title}](${URL}${page}.html${local || ''})`;
}
// parse Docs layout
fs.readFile(DOCS_LAYOUT, function(err, contents) {
if (err) {
throw err;
}
var front = yamlFront.loadFront(contents.toString());
var sidebar = front.sidebar; // docs sidebar, top level
function parseSidebar(sidebar, depth) {
for (const el of sidebar) {
// skip break and table of contents itself
if (!el.break && el.url !== 'toc') {
var page = `${COMPILED_DOCS}/${el.url}.html`;
// generate markdown for top level navigation
var link = generateLink(el.text, el.url);
var li = generateListItem(link, depth);
writeStream.write(li + '\r\n');
// build DOM
var $ = cheerio.load(fs.readFileSync(page).toString());
// iterate through links in DOM tree
$(CONTENT_TAG + ' ' + INNER_LINK_TAG).each(function() {
// generate markdown for in-page navigation
var hash = '#' + $(this).attr('id');
var link = generateLink($(this).text(), el.url, hash);
var li = generateListItem(link, depth + 1);
writeStream.write(li + '\r\n');
});
}
// recurse if there is a sub-sidebar
if (el['sub-sidebar'] !== undefined) {
parseSidebar(el['sub-sidebar'], depth + 1);
}
}
}
// begin parse
parseSidebar(sidebar, 0);
});