Skip to content

Commit e966cdb

Browse files
committed
Add table of contents
1 parent 627a03e commit e966cdb

4 files changed

Lines changed: 113 additions & 0 deletions

File tree

website/routes/doc.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## Documentation
22

3+
<div id="toc"></div>
4+
35
### Requirements
46

57
Zack! requirements are:

website/views/base.html.twig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,5 +95,14 @@
9595
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
9696
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/php.min.js"></script>
9797
<script>hljs.highlightAll();</script>
98+
<script src="/static/js/toc.js" type="text/javascript"></script>
99+
<script>
100+
window.addEventListener("load", function (event) {
101+
makeList({
102+
'target': '#toc', // Selector for element to place table of contents
103+
'parent': '.content' // Selector for element to parse headers from (default: 'body')
104+
});
105+
});
106+
</script>
98107
</body>
99108
</html>

website/web/static/css/styles.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,3 +446,7 @@ body {
446446
.content .endpoint-link--delete .endpoint-request-method {
447447
background-color: #f44336;
448448
}
449+
450+
#toc > ul {
451+
margin-bottom: 0;
452+
}

website/web/static/js/toc.js

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// See https://github.com/vincentlaucsb/js-toc
2+
3+
function snakeCase(text) {
4+
return text.toLowerCase().split(" ").join("_");
5+
}
6+
7+
function scanHeaders(parent) {
8+
if (parent === void 0) { parent = document.body; }
9+
var headers = parent.querySelectorAll("h3, h4, h5, h6");
10+
var processed = Object();
11+
var temp = new Array();
12+
for (var i = 0; i < headers.length; i++) {
13+
var h = headers[i];
14+
var processed_id = h.getAttribute("id");
15+
// No ID found
16+
if (!processed_id) {
17+
var snake_cased = snakeCase(h.innerText);
18+
if (snake_cased in processed) {
19+
processed_id = snake_cased + "_" + ++processed[snake_cased];
20+
}
21+
else {
22+
processed_id = snake_cased;
23+
processed[processed_id] = 1;
24+
}
25+
h.setAttribute("id", processed_id);
26+
}
27+
else {
28+
processed[processed_id] = 1;
29+
}
30+
temp.push({
31+
'level': parseInt(h.tagName[1]),
32+
'name': h.innerText,
33+
'id': processed_id
34+
});
35+
}
36+
return temp;
37+
}
38+
39+
function makeListItem(href, text) {
40+
// Generate a bullet point containing a link
41+
var link = document.createElement('a');
42+
link.setAttribute('href', href);
43+
link.innerHTML = text;
44+
var temp = document.createElement('li');
45+
temp.appendChild(link);
46+
return temp;
47+
}
48+
49+
function makeList(listParams) {
50+
if (listParams === void 0) {
51+
listParams = {
52+
'target': "",
53+
'parent': "body"
54+
};
55+
}
56+
var headers = scanHeaders(document.querySelector(listParams.parent));
57+
// Keep track of where we are in the list;
58+
var parents = [
59+
document.createElement("ul")
60+
];
61+
var currentLevel = null; // Used to determine when to indent/dedent list
62+
var prevBullet = null;
63+
for (var i in headers) {
64+
var currentParent = parents.slice(-1)[0];
65+
var tocItem = headers[i];
66+
var link = makeListItem("#" + tocItem.id, tocItem.name);
67+
// Add link text
68+
if (currentLevel) {
69+
var levelDiff = tocItem.level - currentLevel;
70+
if (levelDiff <= 0) {
71+
// Dedent (or stay the same)
72+
while (parents.length > 1 && levelDiff) {
73+
parents.pop();
74+
levelDiff++;
75+
}
76+
}
77+
else if (levelDiff > 0) {
78+
// Indent
79+
while (levelDiff) {
80+
var nextParent = document.createElement("ul");
81+
prevBullet.appendChild(nextParent);
82+
currentParent.appendChild(prevBullet);
83+
currentParent = nextParent;
84+
parents.push(nextParent);
85+
levelDiff--;
86+
}
87+
}
88+
// Update parent
89+
currentParent = parents.slice(-1)[0];
90+
}
91+
// Update
92+
currentLevel = tocItem.level;
93+
currentParent.appendChild(link);
94+
prevBullet = link;
95+
}
96+
var target = document.querySelector(listParams.target);
97+
target.appendChild(parents[0]);
98+
}

0 commit comments

Comments
 (0)