-
Notifications
You must be signed in to change notification settings - Fork 0
/
script.js
125 lines (108 loc) · 3.64 KB
/
script.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Function to extract title from markdown content
function extractTitle(content) {
const match = content.match(/^# (.+)$/m);
return match ? match[1] : 'Untitled';
}
// Function to create breadcrumb HTML
function createBreadcrumb(file, title) {
const parts = file.replace('.md', '').split('/');
let html = '<nav class="breadcrumb">';
// Always start with "Introduction" for now; to be fixed.
html += 'Introduction';
if (parts.length > 1) {
html += ' > ' + title;
}
html += '</nav>';
return html;
}
// Function to load Markdown
function loadMarkdown(file) {
fetch(`content/${file}`)
.then(response => response.text())
.then(text => {
const contentElement = document.getElementById('book-content');
const title = extractTitle(text);
const breadcrumb = createBreadcrumb(file, title);
const parsedContent = marked.parse(text);
contentElement.innerHTML = breadcrumb + parsedContent;
updateTableOfContents();
highlightCurrentSection(file);
})
.catch(error => {
console.error('Error loading markdown:', error);
document.getElementById('book-content').innerHTML =
'<p>Sorry, the content could not be loaded.</p>';
});
}
// Function to update the table of contents
function updateTableOfContents() {
const headings = document.querySelectorAll(
'#book-content h2, #book-content h3'
);
const toc = document.getElementById('table-of-contents');
toc.innerHTML = '';
headings.forEach((heading, index) => {
const link = document.createElement('a');
link.textContent = heading.textContent;
link.href = `#heading-${index}`;
heading.id = `heading-${index}`;
const listItem = document.createElement('li');
listItem.appendChild(link);
if (heading.tagName === 'H3') {
listItem.style.marginLeft = '20px';
}
toc.appendChild(listItem);
// Add smooth scrolling
link.addEventListener('click', e => {
e.preventDefault();
heading.scrollIntoView({ behavior: 'smooth' });
});
});
}
// Function to highlight the current section in the sidebar
function highlightCurrentSection(file) {
document.querySelectorAll('.sidebar ul li a').forEach(link => {
link.classList.remove('active');
if (link.getAttribute('data-file') === file) {
link.classList.add('active');
}
});
}
// Add event listeners to sidebar toggle links
document.querySelectorAll('.sidebar .toggle').forEach(toggle => {
toggle.addEventListener('click', function () {
this.classList.toggle('active');
const submenu = this.nextElementSibling;
submenu.style.display =
submenu.style.display === 'block' ? 'none' : 'block';
});
});
// Add event listeners to sidebar links to load Markdown
document.querySelectorAll('.sidebar ul li a').forEach(link => {
link.addEventListener('click', function (e) {
e.preventDefault();
const file = this.getAttribute('data-file');
loadMarkdown(file);
});
});
// Implement basic search functionality
document.getElementById('search').addEventListener('input', function (e) {
const query = e.target.value.toLowerCase();
const contentElement = document.getElementById('book-content');
const content = contentElement.innerText.toLowerCase();
if (query.length > 2) {
const regex = new RegExp(query, 'gi');
contentElement.innerHTML = contentElement.innerHTML.replace(
regex,
match => `<mark>${match}</mark>`
);
} else {
// Remove highlights if query is too short
contentElement.innerHTML = contentElement.innerHTML.replace(
/<mark>(.*?)<\/mark>/gi,
'$1'
);
}
});
// Initial load of the first content file
loadMarkdown('introduction/challenges.md');