diff --git a/slidify.js b/slidify.js
index 97d13fb..d5aa87b 100644
--- a/slidify.js
+++ b/slidify.js
@@ -2,6 +2,7 @@ window.addEventListener('load', init);
let slides;
let currentSlide;
+let topicList;
function init() {
slides = Array.from(document.querySelectorAll('article'));
@@ -9,6 +10,7 @@ function init() {
slides[i].id = `slide${i}`;
}
resumeOrGoToStart();
+ topicList = createTopicList();
document.addEventListener('keydown', onKeyPressed);
}
@@ -66,12 +68,15 @@ function onKeyPressed(event) {
case 35: // end
goToLastSlide();
break;
+ case 17: // ctrl
+ toggleTopicList();
+ break;
}
}
function showNextFragment() {
- let fragments = [... slides[currentSlide].querySelectorAll('.fragment')]
- let visible = [... slides[currentSlide].querySelectorAll('.fragment.visible')]
+ let fragments = [...slides[currentSlide].querySelectorAll('.fragment')]
+ let visible = [...slides[currentSlide].querySelectorAll('.fragment.visible')]
if (fragments.length == visible.length) {
return false;
@@ -90,4 +95,75 @@ function showPreviousFragment() {
visible[visible.length - 1].classList.remove('visible')
return true;
}
+}
+
+function getTopicListContent() {
+ let results = [...document.querySelectorAll('h1, h2, h3, h4, h5, h6')];
+ let resultHtml = '
';
+ let currentLevel = 1;
+
+ results.forEach(element => {
+ let node = element.nodeName;
+ let level = parseInt(node[node.length - 1]);
+
+ let parentElement = element.parentElement
+ while (parentElement.nodeName.toLowerCase() != 'article') {
+ parentElement = parentElement.parentElement;
+ }
+ let parentSlideID = parentElement.id;
+
+ if (level > currentLevel) {
+ resultHtml += `- ${element.textContent}
`;
+ currentLevel = level;
+ } else {
+ resultHtml += `- ${element.textContent}`;
+ }
+ })
+
+ return resultHtml + '
';
+}
+
+function createTopicList() {
+ let topicList = document.createElement(`div`);
+ topicList.innerHTML = getTopicListContent();
+ topicList.classList.add('topic-list')
+ document.body.appendChild(topicList);
+ topicList.style.position = 'fixed';
+ topicList.style.top = '4rem';
+ topicList.style.left = '50%';
+ topicList.style.transform = 'translateX(-50%)';
+ topicList.style.backgroundColor = 'white';
+ topicList.style.padding = '2rem';
+ topicList.style.width = '800px';
+ topicList.style.boxShadow = '0 5px 15px rgba(0, 0, 0, 0.3)';
+ topicList.style.maxHeight = 'calc(100vh - 8rem)';
+ topicList.style.visibility = 'hidden';
+
+ topicList.querySelectorAll('a').forEach(link => {
+ link.addEventListener('click', e => topicList.style.visibility = 'hidden');
+ })
+ return topicList;
+}
+
+let lastCtrlPress = null;
+
+function toggleTopicList() {
+ if (lastCtrlPress == null) {
+ lastCtrlPress = Date.now();
+ } else {
+ let now = Date.now();
+ if (now - lastCtrlPress < 400) {
+ lastCtrlPress = null;
+ if (topicList.style.visibility === 'visible') {
+ topicList.style.visibility = 'hidden';
+ } else {
+ topicList.style.visibility = 'visible';
+ }
+ } else {
+ lastCtrlPress = Date.now();
+ }
+ }
}
\ No newline at end of file