@@ -5,6 +5,7 @@ import SwiftSoup
55public func addHeadingAnchors( _ doc: Document ) throws {
66 let headings = try doc. select ( " h1, h2, h3 " )
77 for heading in headings {
8+ guard try heading. select ( " a[name] " ) . isEmpty ( ) else { continue }
89 let text = try heading. text ( )
910 let slug = text. slugified
1011 try heading. prepend ( " <a name= \" \( slug) \" ></a> " )
@@ -52,7 +53,9 @@ func _generateTOC(_ doc: Document, placeholder: String) throws {
5253 guard tagName != " p " else { continue }
5354
5455 let slug = text. slugified
55- try element. prepend ( " <a name= \" \( slug) \" ></a> " )
56+ if try element. select ( " a[name] " ) . isEmpty ( ) {
57+ try element. prepend ( " <a name= \" \( slug) \" ></a> " )
58+ }
5659
5760 if foundToc {
5861 let level : Int
@@ -76,26 +79,32 @@ func _generateTOC(_ doc: Document, placeholder: String) throws {
7679 try nav. addClass ( " toc " )
7780
7881 // Build nested list HTML
82+ let minLevel = tocEntries. map ( \. level) . min ( ) ?? 1
7983 var tocHTML = " "
8084 var currentLevel = 0
8185
8286 for entry in tocEntries {
83- if entry. level > currentLevel {
84- for _ in currentLevel ..< entry. level {
87+ let level = entry. level - minLevel + 1
88+
89+ if level > currentLevel {
90+ for _ in currentLevel ..< level {
8591 tocHTML += " <ul> "
8692 }
87- } else if entry . level < currentLevel {
88- for _ in entry . level ..< currentLevel {
89- tocHTML += " </ul> "
93+ } else if level < currentLevel {
94+ for _ in level ..< currentLevel {
95+ tocHTML += " </li></ ul> "
9096 }
97+ tocHTML += " </li> "
98+ } else if currentLevel > 0 {
99+ tocHTML += " </li> "
91100 }
92- currentLevel = entry . level
93- tocHTML += " <li><a href= \" # \( entry. slug) \" > \( entry. text) </a></li> "
101+ currentLevel = level
102+ tocHTML += " <li><a href= \" # \( entry. slug) \" > \( entry. text) </a> "
94103 }
95104
96- // Close remaining open lists
105+ // Close remaining open items and lists
97106 for _ in 0 ..< currentLevel {
98- tocHTML += " </ul> "
107+ tocHTML += " </li></ ul> "
99108 }
100109
101110 try nav. html ( tocHTML)
0 commit comments