Skip to content

Commit d61b703

Browse files
committed
feat: support data-driven TOC headings
1 parent c607ca1 commit d61b703

File tree

4 files changed

+101
-136
lines changed

4 files changed

+101
-136
lines changed

exampleSite/hugo_stats.json

Lines changed: 47 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,6 @@
248248
"fa-activity",
249249
"fa-address-card",
250250
"fa-angle-left",
251-
"fa-angle-right",
252-
"fa-angles-left",
253-
"fa-angles-right",
254251
"fa-arrow-left",
255252
"fa-arrow-right",
256253
"fa-bootstrap",
@@ -611,6 +608,7 @@
611608
"width-md-auto"
612609
],
613610
"ids": [
611+
"_modals",
614612
"abbr",
615613
"about",
616614
"accordion",
@@ -681,16 +679,11 @@
681679
"docs",
682680
"documentation",
683681
"dropdown-nav-0",
684-
"dropdown-panel-05f2e5ae7cf8c0ab8a49ba311bdc4d7e",
685-
"dropdown-panel-256968d78244b40725f5d484ea340a5f",
686-
"dropdown-panel-29ba03d101604c5caa618293938833b1",
687-
"dropdown-panel-30c508a91fbd512d0bee6f976efc028c",
688-
"dropdown-panel-47c670e7ebc8dd6e57f5d70dde479a8b",
689-
"dropdown-panel-4c945acd0c9326daa6f433a64262c7a0",
690-
"dropdown-panel-552e42166b1b143d516aeccc1fbc7d32",
691-
"dropdown-panel-bf5b105df93a1545b2fc424e3ab1c654",
692-
"dropdown-panel-e5aba6d799885a8fd4208fade274e3a7",
693-
"dropdown-panel-fd6d8a3429e95196931cd8c08072abf3",
682+
"dropdown-panel-050a0480b2739af3444a7692d2ffabe4",
683+
"dropdown-panel-5b0475bb2ff0ff88359696e7f42ea140",
684+
"dropdown-panel-7dd85b0c0ed4b21f5f9f3d4123461dc5",
685+
"dropdown-panel-d3a1583185021c5589c2d1eee3e0a043",
686+
"dropdown-panel-d58afa5209f5ce67666e6a11f6c51c82",
694687
"eerste-artikel",
695688
"elements-type",
696689
"entity-relationship-diagram",
@@ -711,24 +704,16 @@
711704
"fab-whatsapp",
712705
"fab-x-twitter",
713706
"faq",
714-
"faq-726ff0b8b5ec9328cfef51994d523ad1",
715-
"faq-726ff0b8b5ec9328cfef51994d523ad1-heading-faq-726ff0b8b5ec9328cfef51994d523ad1",
716-
"faq-726ff0b8b5ec9328cfef51994d523ad1-item-0",
717-
"faq-726ff0b8b5ec9328cfef51994d523ad1-item-1",
718-
"faq-726ff0b8b5ec9328cfef51994d523ad1-item-2",
719-
"faq-c610e94909d8dd90e16cbcbc4cc3fe84",
720-
"faq-c610e94909d8dd90e16cbcbc4cc3fe84-heading-faq-c610e94909d8dd90e16cbcbc4cc3fe84",
721-
"faq-c610e94909d8dd90e16cbcbc4cc3fe84-item-0",
722-
"faq-c610e94909d8dd90e16cbcbc4cc3fe84-item-1",
723-
"faq-c610e94909d8dd90e16cbcbc4cc3fe84-item-2",
707+
"faq-2a15771251138b1ed59e44671a1ec0fb",
708+
"faq-2a15771251138b1ed59e44671a1ec0fb-heading-faq-2a15771251138b1ed59e44671a1ec0fb",
709+
"faq-2a15771251138b1ed59e44671a1ec0fb-item-0",
710+
"faq-2a15771251138b1ed59e44671a1ec0fb-item-1",
711+
"faq-2a15771251138b1ed59e44671a1ec0fb-item-2",
724712
"fas-1",
725713
"fas-2",
726714
"fas-3",
727715
"fas-address-card",
728716
"fas-angle-left",
729-
"fas-angle-right",
730-
"fas-angles-left",
731-
"fas-angles-right",
732717
"fas-arrow-left",
733718
"fas-arrow-right",
734719
"fas-chevron-right",
@@ -810,6 +795,7 @@
810795
"mermaid-diagrams",
811796
"messages-type",
812797
"mindmap",
798+
"modal-search",
813799
"more-type",
814800
"nav",
815801
"nav-0-0",
@@ -819,16 +805,11 @@
819805
"nav-0-btn-1",
820806
"nav-0-btn-2",
821807
"nav-nav-0",
822-
"nav-panel-05f2e5ae7cf8c0ab8a49ba311bdc4d7e",
823-
"nav-panel-256968d78244b40725f5d484ea340a5f",
824-
"nav-panel-29ba03d101604c5caa618293938833b1",
825-
"nav-panel-30c508a91fbd512d0bee6f976efc028c",
826-
"nav-panel-47c670e7ebc8dd6e57f5d70dde479a8b",
827-
"nav-panel-4c945acd0c9326daa6f433a64262c7a0",
828-
"nav-panel-552e42166b1b143d516aeccc1fbc7d32",
829-
"nav-panel-bf5b105df93a1545b2fc424e3ab1c654",
830-
"nav-panel-e5aba6d799885a8fd4208fade274e3a7",
831-
"nav-panel-fd6d8a3429e95196931cd8c08072abf3",
808+
"nav-panel-050a0480b2739af3444a7692d2ffabe4",
809+
"nav-panel-5b0475bb2ff0ff88359696e7f42ea140",
810+
"nav-panel-7dd85b0c0ed4b21f5f9f3d4123461dc5",
811+
"nav-panel-d3a1583185021c5589c2d1eee3e0a043",
812+
"nav-panel-d58afa5209f5ce67666e6a11f6c51c82",
832813
"navbar",
833814
"navbar-0-collapse",
834815
"navbar-mode",
@@ -838,66 +819,36 @@
838819
"notification",
839820
"over-mij",
840821
"overview",
841-
"panel-05f2e5ae7cf8c0ab8a49ba311bdc4d7e-0",
842-
"panel-05f2e5ae7cf8c0ab8a49ba311bdc4d7e-1",
843-
"panel-05f2e5ae7cf8c0ab8a49ba311bdc4d7e-2",
844-
"panel-05f2e5ae7cf8c0ab8a49ba311bdc4d7e-btn-0",
845-
"panel-05f2e5ae7cf8c0ab8a49ba311bdc4d7e-btn-1",
846-
"panel-05f2e5ae7cf8c0ab8a49ba311bdc4d7e-btn-2",
847-
"panel-256968d78244b40725f5d484ea340a5f-0",
848-
"panel-256968d78244b40725f5d484ea340a5f-1",
849-
"panel-256968d78244b40725f5d484ea340a5f-2",
850-
"panel-256968d78244b40725f5d484ea340a5f-btn-0",
851-
"panel-256968d78244b40725f5d484ea340a5f-btn-1",
852-
"panel-256968d78244b40725f5d484ea340a5f-btn-2",
853-
"panel-29ba03d101604c5caa618293938833b1-0",
854-
"panel-29ba03d101604c5caa618293938833b1-1",
855-
"panel-29ba03d101604c5caa618293938833b1-2",
856-
"panel-29ba03d101604c5caa618293938833b1-btn-0",
857-
"panel-29ba03d101604c5caa618293938833b1-btn-1",
858-
"panel-29ba03d101604c5caa618293938833b1-btn-2",
859-
"panel-30c508a91fbd512d0bee6f976efc028c-0",
860-
"panel-30c508a91fbd512d0bee6f976efc028c-1",
861-
"panel-30c508a91fbd512d0bee6f976efc028c-2",
862-
"panel-30c508a91fbd512d0bee6f976efc028c-btn-0",
863-
"panel-30c508a91fbd512d0bee6f976efc028c-btn-1",
864-
"panel-30c508a91fbd512d0bee6f976efc028c-btn-2",
865-
"panel-47c670e7ebc8dd6e57f5d70dde479a8b-0",
866-
"panel-47c670e7ebc8dd6e57f5d70dde479a8b-1",
867-
"panel-47c670e7ebc8dd6e57f5d70dde479a8b-2",
868-
"panel-47c670e7ebc8dd6e57f5d70dde479a8b-btn-0",
869-
"panel-47c670e7ebc8dd6e57f5d70dde479a8b-btn-1",
870-
"panel-47c670e7ebc8dd6e57f5d70dde479a8b-btn-2",
871-
"panel-4c945acd0c9326daa6f433a64262c7a0-0",
872-
"panel-4c945acd0c9326daa6f433a64262c7a0-1",
873-
"panel-4c945acd0c9326daa6f433a64262c7a0-2",
874-
"panel-4c945acd0c9326daa6f433a64262c7a0-btn-0",
875-
"panel-4c945acd0c9326daa6f433a64262c7a0-btn-1",
876-
"panel-4c945acd0c9326daa6f433a64262c7a0-btn-2",
877-
"panel-552e42166b1b143d516aeccc1fbc7d32-0",
878-
"panel-552e42166b1b143d516aeccc1fbc7d32-1",
879-
"panel-552e42166b1b143d516aeccc1fbc7d32-2",
880-
"panel-552e42166b1b143d516aeccc1fbc7d32-btn-0",
881-
"panel-552e42166b1b143d516aeccc1fbc7d32-btn-1",
882-
"panel-552e42166b1b143d516aeccc1fbc7d32-btn-2",
883-
"panel-bf5b105df93a1545b2fc424e3ab1c654-0",
884-
"panel-bf5b105df93a1545b2fc424e3ab1c654-1",
885-
"panel-bf5b105df93a1545b2fc424e3ab1c654-2",
886-
"panel-bf5b105df93a1545b2fc424e3ab1c654-btn-0",
887-
"panel-bf5b105df93a1545b2fc424e3ab1c654-btn-1",
888-
"panel-bf5b105df93a1545b2fc424e3ab1c654-btn-2",
889-
"panel-e5aba6d799885a8fd4208fade274e3a7-0",
890-
"panel-e5aba6d799885a8fd4208fade274e3a7-1",
891-
"panel-e5aba6d799885a8fd4208fade274e3a7-2",
892-
"panel-e5aba6d799885a8fd4208fade274e3a7-btn-0",
893-
"panel-e5aba6d799885a8fd4208fade274e3a7-btn-1",
894-
"panel-e5aba6d799885a8fd4208fade274e3a7-btn-2",
895-
"panel-fd6d8a3429e95196931cd8c08072abf3-0",
896-
"panel-fd6d8a3429e95196931cd8c08072abf3-1",
897-
"panel-fd6d8a3429e95196931cd8c08072abf3-2",
898-
"panel-fd6d8a3429e95196931cd8c08072abf3-btn-0",
899-
"panel-fd6d8a3429e95196931cd8c08072abf3-btn-1",
900-
"panel-fd6d8a3429e95196931cd8c08072abf3-btn-2",
822+
"panel-050a0480b2739af3444a7692d2ffabe4-0",
823+
"panel-050a0480b2739af3444a7692d2ffabe4-1",
824+
"panel-050a0480b2739af3444a7692d2ffabe4-2",
825+
"panel-050a0480b2739af3444a7692d2ffabe4-btn-0",
826+
"panel-050a0480b2739af3444a7692d2ffabe4-btn-1",
827+
"panel-050a0480b2739af3444a7692d2ffabe4-btn-2",
828+
"panel-5b0475bb2ff0ff88359696e7f42ea140-0",
829+
"panel-5b0475bb2ff0ff88359696e7f42ea140-1",
830+
"panel-5b0475bb2ff0ff88359696e7f42ea140-2",
831+
"panel-5b0475bb2ff0ff88359696e7f42ea140-btn-0",
832+
"panel-5b0475bb2ff0ff88359696e7f42ea140-btn-1",
833+
"panel-5b0475bb2ff0ff88359696e7f42ea140-btn-2",
834+
"panel-7dd85b0c0ed4b21f5f9f3d4123461dc5-0",
835+
"panel-7dd85b0c0ed4b21f5f9f3d4123461dc5-1",
836+
"panel-7dd85b0c0ed4b21f5f9f3d4123461dc5-2",
837+
"panel-7dd85b0c0ed4b21f5f9f3d4123461dc5-btn-0",
838+
"panel-7dd85b0c0ed4b21f5f9f3d4123461dc5-btn-1",
839+
"panel-7dd85b0c0ed4b21f5f9f3d4123461dc5-btn-2",
840+
"panel-d3a1583185021c5589c2d1eee3e0a043-0",
841+
"panel-d3a1583185021c5589c2d1eee3e0a043-1",
842+
"panel-d3a1583185021c5589c2d1eee3e0a043-2",
843+
"panel-d3a1583185021c5589c2d1eee3e0a043-btn-0",
844+
"panel-d3a1583185021c5589c2d1eee3e0a043-btn-1",
845+
"panel-d3a1583185021c5589c2d1eee3e0a043-btn-2",
846+
"panel-d58afa5209f5ce67666e6a11f6c51c82-0",
847+
"panel-d58afa5209f5ce67666e6a11f6c51c82-1",
848+
"panel-d58afa5209f5ce67666e6a11f6c51c82-2",
849+
"panel-d58afa5209f5ce67666e6a11f6c51c82-btn-0",
850+
"panel-d58afa5209f5ce67666e6a11f6c51c82-btn-1",
851+
"panel-d58afa5209f5ce67666e6a11f6c51c82-btn-2",
901852
"panels",
902853
"persona",
903854
"pie-chart",

layouts/_partials/assets/toc-parse-content.html

Lines changed: 52 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -46,45 +46,59 @@
4646
{{- $maxNumHeadings := or (.Site.Params.navigation.maxNumHeadings | int) 9 }}
4747

4848
{{- /* Render */}}
49-
{{- if and .Site.Params.navigation.toc (ge (len .Fragments.HeadingsMap) $minNumHeadings) }}
50-
<strong class="d-block h6 my-2 pt-4">{{ T "toc" }}:</strong>
51-
<nav class="toc">
52-
{{ $result := slice }}
53-
{{ range .Fragments.Headings }}
54-
{{ $result = $result | append (partial "inline/toc-item.html" (dict
55-
"base" $.RelPermalink
56-
"item" .
57-
"startLevel" $startLevel
58-
"endLevel" $endLevel
59-
"maxNumHeadings" $maxNumHeadings
60-
)) }}
61-
{{ end }}
49+
{{- if .Site.Params.navigation.toc }}
50+
{{- /* Check for custom headings in Page.Store or Page.Params, otherwise use Page.Fragments */}}
51+
{{- $customHeadings := .Page.Store.Get "Headings" }}
52+
{{- $customHeadingsMap := .Page.Store.Get "HeadingsMap" }}
53+
{{- if not $customHeadings }}
54+
{{- $customHeadings = .Page.Params.Headings }}
55+
{{- $customHeadingsMap = .Page.Params.HeadingsMap }}
56+
{{- end }}
6257

63-
{{ range $i, $v := $result }}
64-
{{ if eq $i $maxNumHeadings }}
65-
{{ partial "assets/button.html" (dict
66-
"id" "btnTOCShowMore"
67-
"collapse-id" "toc-collapse-items"
68-
"link-type" "link"
69-
"class" "toc-item"
70-
"title" (T "tocShowMore" (sub (len $result) $i))
71-
"spacing" false
72-
) }}
73-
<div class="collapse" id="toc-collapse-items">
58+
{{- $fragments := cond $customHeadings (dict "Headings" $customHeadings "HeadingsMap" $customHeadingsMap) .Page.Fragments }}
59+
60+
{{- with $fragments }}
61+
{{- if (ge (len .HeadingsMap) $minNumHeadings) }}
62+
<strong class="d-block h6 my-2 pt-4">{{ T "toc" }}:</strong>
63+
<nav class="toc">
64+
{{ $result := slice }}
65+
{{ range .Headings }}
66+
{{ $result = $result | append (partial "inline/toc-item.html" (dict
67+
"base" $.RelPermalink
68+
"item" .
69+
"startLevel" $startLevel
70+
"endLevel" $endLevel
71+
"maxNumHeadings" $maxNumHeadings
72+
)) }}
73+
{{ end }}
74+
75+
{{ range $i, $v := $result }}
76+
{{ if eq $i $maxNumHeadings }}
77+
{{ partial "assets/button.html" (dict
78+
"id" "btnTOCShowMore"
79+
"collapse-id" "toc-collapse-items"
80+
"link-type" "link"
81+
"class" "toc-item"
82+
"title" (T "tocShowMore" (sub (len $result) $i))
83+
"spacing" false
84+
) }}
85+
<div class="collapse" id="toc-collapse-items">
86+
{{ end }}
87+
{{ print $v | safeHTML }}
7488
{{ end }}
75-
{{ print $v | safeHTML }}
76-
{{ end }}
7789

78-
{{ if gt (len $result) $maxNumHeadings }}
79-
&nbsp;
80-
{{ partial "assets/button.html" (dict
81-
"id" "btnTOCShowLess"
82-
"collapse-id" "toc-collapse-items"
83-
"link-type" "link"
84-
"class" "toc-item"
85-
"title" (T "tocShowLess")
86-
"spacing" false
87-
) }}
88-
</div>{{ end }}
89-
</nav>
90+
{{ if gt (len $result) $maxNumHeadings }}
91+
&nbsp;
92+
{{ partial "assets/button.html" (dict
93+
"id" "btnTOCShowLess"
94+
"collapse-id" "toc-collapse-items"
95+
"link-type" "link"
96+
"class" "toc-item"
97+
"title" (T "tocShowLess")
98+
"spacing" false
99+
) }}
100+
</div>{{ end }}
101+
</nav>
102+
{{ end }}
103+
{{ end }}
90104
{{ end }}

layouts/single.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
{{- $blocks := $.Scratch.Get "blocks" -}}
33
{{- $breakpoint := $.Scratch.Get "breakpoint" -}}
44
{{- $sidebar := partial "page/sidebar" . -}}
5-
{{- $toc := partial "page/panel-toc" . -}}
65

76
{{ with $sidebar }}
87
<div class="offcanvas offcanvas-start" tabindex="-1" id="offcanvas-sidebar" aria-labelledby="offcanvas-label">
@@ -31,7 +30,7 @@ <h5 class="offcanvas-title" id="offcanvas-label">{{ strings.FirstUpper $.Section
3130
{{ .Render "footer" }}
3231
</div>
3332
<div class="col col-{{ $breakpoint.current }}-3 col-{{ $breakpoint.next }}-2 d-none d-{{ $breakpoint.current }}-block pt-5">
34-
{{ $toc | safeHTML }}
33+
{{ .Render "toc" }}
3534
</div>
3635
</div>
3736
</div>

layouts/toc.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{- partial "page/panel-toc" . | safeHTML -}}

0 commit comments

Comments
 (0)