about summary refs log tree commit diff stats
path: root/templates
diff options
context:
space:
mode:
authorEmilio Ziniades2024-05-12 15:54:40 +0200
committerAlan Pearce2024-05-13 10:32:48 +0000
commitbaabcb634bdffb8623eacc410e8707a3b4afe2b5 (patch)
treecc19bc0ee1fc64ae834c2adac172435e27e4e99e /templates
parent2c9ca00042ec7c1a4da5ad927f19e8849e5ae96c (diff)
downloadzola-bearblog-baabcb634bdffb8623eacc410e8707a3b4afe2b5.tar.lz
zola-bearblog-baabcb634bdffb8623eacc410e8707a3b4afe2b5.tar.zst
zola-bearblog-baabcb634bdffb8623eacc410e8707a3b4afe2b5.zip
feat(table of contents): Add table of contents
This feature is disabled by default, but can be enabled/disabled
globally or per-page.

Zola already provides `page.toc`, this PR simply adds a macro
to recursively render that data in nested `ul`s.

It also establishes some configuration options to display it
and set a maximum headers level.
Diffstat (limited to 'templates')
-rw-r--r--templates/macros.html12
-rw-r--r--templates/page.html7
2 files changed, 19 insertions, 0 deletions
diff --git a/templates/macros.html b/templates/macros.html
new file mode 100644
index 0000000..2ad23e6
--- /dev/null
+++ b/templates/macros.html
@@ -0,0 +1,12 @@
+{% macro table_of_contents(toc, max_level) %}
+<ul>
+  {% for header in toc %}
+    <li>
+      <a href="{{ header.permalink | safe }}">{{ header.title }}</a>
+        {% if header.children and header.level < max_level %}
+          {{ self::table_of_contents(toc=header.children, max_level=max_level) }}
+        {% endif %}
+    </li>
+  {% endfor %}
+</ul>
+{% endmacro %}
diff --git a/templates/page.html b/templates/page.html
index 5c1a80b..2e2ef86 100644
--- a/templates/page.html
+++ b/templates/page.html
@@ -1,3 +1,4 @@
+{% import "macros.html" as macros %}
 {% extends "base.html" %}
 
 {% block title %}{{ page.title }} | {{ super() }}{% endblock %}
@@ -15,6 +16,12 @@
       </p>
     {%- endif %}
   {%- endif %}
+  {%- if config.extra.table_of_contents.show and not page.extra.hide_table_of_contents and page.toc %}
+    <details {%if config.extra.table_of_contents.visible_on_load %}open{% endif %}>
+      <summary>Table of Contents</summary>
+      {{ macros::table_of_contents(toc=page.toc, max_level=config.extra.table_of_contents.max_level) }}
+    </details>
+  {%- endif %}
   <main>
     {{ page.content | safe }}
   </main>