-
Notifications
You must be signed in to change notification settings - Fork 2
/
toc.js
81 lines (63 loc) · 2.06 KB
/
toc.js
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
79
80
81
/** Used to map characters to HTML entities. */
const htmlEscapes = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
}
/** Used to match HTML entities and HTML characters. */
const reUnescapedHtml = /[&<>"']/g
const reHasUnescapedHtml = RegExp(reUnescapedHtml.source)
function escape(string) {
return (string && reHasUnescapedHtml.test(string))
? string.replace(reUnescapedHtml, (chr) => htmlEscapes[chr])
: string
}
function tocHelper(content, options = {}) {
var headings = content.find('h1,h2,h3,h4,h5,h6');
if (!headings.length) return '';
var className = options.class || 'toc';
var listNumber = options.hasOwnProperty('list_number') ? options.list_number : true;
var result = '<ol class="' + className + '">';
var lastNumber = [0, 0, 0, 0, 0, 0];
var firstLevel = 0;
var lastLevel = 0;
var i = 0;
headings.each(function() {
var level = +this.tagName[1];
var id = $(this).attr('id');
var text = escape($(this).text());
lastNumber[level - 1]++;
for (i = level; i <= 5; i++) {
lastNumber[i] = 0;
}
if (firstLevel) {
for (i = level; i < lastLevel; i++) {
result += '</li></ol>';
}
if (level > lastLevel) {
result += '<ol class="' + className + '-child">';
} else {
result += '</li>';
}
} else {
firstLevel = level;
}
result += '<li class="' + className + '-item ' + className + '-level-' + level + '">';
result += '<a class="' + className + '-link" href="#' + id + '">';
if (listNumber) {
result += '<span class="' + className + '-number">';
for (i = firstLevel - 1; i < level; i++) {
result += '' + lastNumber[i] + '.';
}
result += '</span> ';
}
result += '<span class="' + className + '-text">' + text + '</span></a>';
lastLevel = level;
});
for (i = firstLevel - 1; i < lastLevel; i++) {
result += '</li></ol>';
}
return result;
}