Skip to content

Commit d5417c7

Browse files
committed
fix: Fixed the generateTOC to not started with a nested <ul> when the first heading is an <h2>
1 parent ce307d8 commit d5417c7

File tree

2 files changed

+201
-73
lines changed

2 files changed

+201
-73
lines changed

Sources/SagaUtils/SwiftSoupTransformations.swift

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import SwiftSoup
55
public 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

Comments
 (0)