Fix bad titles in an Atom feed. Fix #4422.

This commit is contained in:
Brent Simmons 2025-01-20 11:08:55 -08:00
parent 2956ae6f2a
commit fb7caeb5ad

View File

@ -35,6 +35,9 @@ final class AtomParser {
private var parsingSource = false private var parsingSource = false
private var endFeedFound = false private var endFeedFound = false
private var depth = 0
private var entryDepth = -1
static func parsedFeed(urlString: String, data: Data) -> RSSFeed { static func parsedFeed(urlString: String, data: Data) -> RSSFeed {
let parser = AtomParser(urlString: urlString, data: data) 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<XMLPointer?>?, attributeCount: Int, attributesDefaultedCount: Int, attributes: UnsafePointer<XMLPointer?>?) { public func saxParser(_ saxParser: SAXParser, xmlStartElement localName: XMLPointer, prefix: XMLPointer?, uri: XMLPointer?, namespaceCount: Int, namespaces: UnsafePointer<XMLPointer?>?, attributeCount: Int, attributesDefaultedCount: Int, attributes: UnsafePointer<XMLPointer?>?) {
depth += 1
if endFeedFound { if endFeedFound {
return return
} }
@ -307,6 +312,7 @@ extension AtomParser: SAXParserDelegate {
if SAXEqualTags(localName, XMLName.entry) { if SAXEqualTags(localName, XMLName.entry) {
parsingArticle = true parsingArticle = true
entryDepth = depth
addArticle() addArticle()
return return
} }
@ -353,6 +359,10 @@ extension AtomParser: SAXParserDelegate {
public func saxParser(_ saxParser: SAXParser, xmlEndElement localName: XMLPointer, prefix: XMLPointer?, uri: XMLPointer?) { public func saxParser(_ saxParser: SAXParser, xmlEndElement localName: XMLPointer, prefix: XMLPointer?, uri: XMLPointer?) {
defer {
depth -= 1
}
if SAXEqualTags(localName, XMLName.feed) { if SAXEqualTags(localName, XMLName.feed) {
endFeedFound = true endFeedFound = true
return return
@ -417,9 +427,10 @@ extension AtomParser: SAXParserDelegate {
else if SAXEqualTags(localName, XMLName.entry) { else if SAXEqualTags(localName, XMLName.entry) {
parsingArticle = false parsingArticle = false
entryDepth = -1
} }
else if parsingArticle && !parsingSource { else if parsingArticle && !parsingSource && depth == entryDepth + 1 {
addArticleElement(saxParser, localName, prefix) addArticleElement(saxParser, localName, prefix)
} }