@@ -25,22 +25,12 @@ public class HTMLResourceContentIterator : ContentIterator {
2525 . readAsString ( )
2626 . eraseToAnyError ( )
2727 . tryMap { try SwiftSoup . parse ( $0) }
28- . tryMap { document -> ContentParser in
29- let parser = ContentParser (
30- baseLocator: locator,
31- startElement: try locator. locations. cssSelector
32- . flatMap {
33- // The JS third-party library used to generate the CSS Selector sometimes adds
34- // :root >, which doesn't work with JSoup.
35- try document. select ( $0. removingPrefix ( " :root > " ) ) . first ( )
36- }
37- )
38- try document. traverse ( parser)
39- return parser
28+ . tryMap { document -> ( content: [ Content ] , startingIndex: Int ) in
29+ try ContentParser . parse ( document: document, locator: locator)
4030 }
4131
4232 content = result. map { $0. content }
43- startingIndex = result. map { $0. startIndex } . get ( or: 0 )
33+ startingIndex = result. map { $0. startingIndex } . get ( or: 0 )
4434 }
4535
4636 public func close( ) { }
@@ -72,6 +62,31 @@ public class HTMLResourceContentIterator : ContentIterator {
7262 }
7363
7464 private class ContentParser : NodeVisitor {
65+
66+ static func parse( document: Document , locator: Locator ) throws -> ( content: [ Content ] , startingIndex: Int ) {
67+ let parser = ContentParser (
68+ baseLocator: locator,
69+ startElement: try locator. locations. cssSelector
70+ . flatMap {
71+ // The JS third-party library used to generate the CSS Selector sometimes adds
72+ // :root >, which doesn't work with JSoup.
73+ try document. select ( $0. removingPrefix ( " :root > " ) ) . first ( )
74+ }
75+ )
76+ try document. traverse ( parser)
77+
78+ var result = (
79+ content: parser. content,
80+ startingIndex: parser. startIndex
81+ )
82+
83+ if locator. locations. progression == 1.0 {
84+ result. startingIndex = result. content. count - 1
85+ }
86+
87+ return result
88+ }
89+
7590 private let baseLocator : Locator
7691 private let startElement : Element ?
7792
@@ -87,7 +102,7 @@ public class HTMLResourceContentIterator : ContentIterator {
87102 private var currentCSSSelector : String ?
88103 private var ignoredNode : Node ?
89104
90- init ( baseLocator: Locator , startElement: Element ? ) {
105+ private init ( baseLocator: Locator , startElement: Element ? ) {
91106 self . baseLocator = baseLocator
92107 self . startElement = startElement
93108 }
0 commit comments