toc.html (4075B)
1 {{- $headers := findRE "<h[1-6].*?>(.|\n])+?</h[1-6]>" .Content -}} 2 {{- $has_headers := ge (len $headers) 1 -}} 3 {{- if $has_headers -}} 4 <details class="toc" {{if (.Param "TocOpen") }} open{{ end }}> 5 <summary accesskey="c" title="(Alt + C)"> 6 <span class="title">{{- i18n "toc" | default "Table of Contents" }}</span> 7 </summary> 8 9 <div class="inner"> 10 {{- if (.Param "UseHugoToc") }} 11 {{- .TableOfContents -}} 12 {{- else }} 13 {{- $largest := 6 -}} 14 {{- range $headers -}} 15 {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}} 16 {{- $headerLevel := len (seq $headerLevel) -}} 17 {{- if lt $headerLevel $largest -}} 18 {{- $largest = $headerLevel -}} 19 {{- end -}} 20 {{- end -}} 21 22 {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}} 23 24 {{- $.Scratch.Set "bareul" slice -}} 25 <ul> 26 {{- range seq (sub $firstHeaderLevel $largest) -}} 27 <ul> 28 {{- $.Scratch.Add "bareul" (sub (add $largest .) 1) -}} 29 {{- end -}} 30 {{- range $i, $header := $headers -}} 31 {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}} 32 {{- $headerLevel := len (seq $headerLevel) -}} 33 34 {{/* get id="xyz" */}} 35 {{- $id := index (findRE "(id=\"(.*?)\")" $header 9) 0 }} 36 37 {{- /* strip id="" to leave xyz, no way to get regex capturing groups in hugo */ -}} 38 {{- $cleanedID := replace (replace $id "id=\"" "") "\"" "" }} 39 {{- $header := replaceRE "<h[1-6].*?>((.|\n])+?)</h[1-6]>" "$1" $header -}} 40 41 {{- if ne $i 0 -}} 42 {{- $prevHeaderLevel := index (findRE "[1-6]" (index $headers (sub $i 1)) 1) 0 -}} 43 {{- $prevHeaderLevel := len (seq $prevHeaderLevel) -}} 44 {{- if gt $headerLevel $prevHeaderLevel -}} 45 {{- range seq $prevHeaderLevel (sub $headerLevel 1) -}} 46 <ul> 47 {{/* the first should not be recorded */}} 48 {{- if ne $prevHeaderLevel . -}} 49 {{- $.Scratch.Add "bareul" . -}} 50 {{- end -}} 51 {{- end -}} 52 {{- else -}} 53 </li> 54 {{- if lt $headerLevel $prevHeaderLevel -}} 55 {{- range seq (sub $prevHeaderLevel 1) -1 $headerLevel -}} 56 {{- if in ($.Scratch.Get "bareul") . -}} 57 </ul> 58 {{/* manually do pop item */}} 59 {{- $tmp := $.Scratch.Get "bareul" -}} 60 {{- $.Scratch.Delete "bareul" -}} 61 {{- $.Scratch.Set "bareul" slice}} 62 {{- range seq (sub (len $tmp) 1) -}} 63 {{- $.Scratch.Add "bareul" (index $tmp (sub . 1)) -}} 64 {{- end -}} 65 {{- else -}} 66 </ul> 67 </li> 68 {{- end -}} 69 {{- end -}} 70 {{- end -}} 71 {{- end }} 72 <li> 73 <a href="#{{- $cleanedID -}}" aria-label="{{- $header | plainify | safeHTML -}}">{{- $header | plainify | safeHTML -}}</a> 74 {{- else }} 75 <li> 76 <a href="#{{- $cleanedID -}}" aria-label="{{- $header | plainify | safeHTML -}}">{{- $header | plainify | safeHTML -}}</a> 77 {{- end -}} 78 {{- end -}} 79 <!-- {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}} --> 80 {{- $firstHeaderLevel := $largest }} 81 {{- $lastHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers (sub (len $headers) 1)) 1) 0)) }} 82 </li> 83 {{- range seq (sub $lastHeaderLevel $firstHeaderLevel) -}} 84 {{- if in ($.Scratch.Get "bareul") (add . $firstHeaderLevel) }} 85 </ul> 86 {{- else }} 87 </ul> 88 </li> 89 {{- end -}} 90 {{- end }} 91 </ul> 92 {{- end }} 93 </div> 94 </details> 95 {{- end }}