From fb7caeb5ad129a8d04489e20109e2214a68fa54d Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Mon, 20 Jan 2025 11:08:55 -0800 Subject: [PATCH] Fix bad titles in an Atom feed. Fix #4422. --- .../Parser/FeedParser/Feeds/XML/AtomParser.swift | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Modules/Parser/Sources/Parser/FeedParser/Feeds/XML/AtomParser.swift b/Modules/Parser/Sources/Parser/FeedParser/Feeds/XML/AtomParser.swift index 223e0b027..d828e9e5e 100644 --- a/Modules/Parser/Sources/Parser/FeedParser/Feeds/XML/AtomParser.swift +++ b/Modules/Parser/Sources/Parser/FeedParser/Feeds/XML/AtomParser.swift @@ -35,6 +35,9 @@ final class AtomParser { private var parsingSource = false private var endFeedFound = false + private var depth = 0 + private var entryDepth = -1 + static func parsedFeed(urlString: String, data: Data) -> RSSFeed { let parser = AtomParser(urlString: urlString, data: data) @@ -293,6 +296,8 @@ extension AtomParser: SAXParserDelegate { public func saxParser(_ saxParser: SAXParser, xmlStartElement localName: XMLPointer, prefix: XMLPointer?, uri: XMLPointer?, namespaceCount: Int, namespaces: UnsafePointer?, attributeCount: Int, attributesDefaultedCount: Int, attributes: UnsafePointer?) { + depth += 1 + if endFeedFound { return } @@ -307,6 +312,7 @@ extension AtomParser: SAXParserDelegate { if SAXEqualTags(localName, XMLName.entry) { parsingArticle = true + entryDepth = depth addArticle() return } @@ -353,6 +359,10 @@ extension AtomParser: SAXParserDelegate { public func saxParser(_ saxParser: SAXParser, xmlEndElement localName: XMLPointer, prefix: XMLPointer?, uri: XMLPointer?) { + defer { + depth -= 1 + } + if SAXEqualTags(localName, XMLName.feed) { endFeedFound = true return @@ -417,9 +427,10 @@ extension AtomParser: SAXParserDelegate { else if SAXEqualTags(localName, XMLName.entry) { parsingArticle = false + entryDepth = -1 } - else if parsingArticle && !parsingSource { + else if parsingArticle && !parsingSource && depth == entryDepth + 1 { addArticleElement(saxParser, localName, prefix) }