From 28a68199012b33b1e2a9937e08750d9b083fed10 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Fri, 13 Sep 2024 21:56:27 -0700 Subject: [PATCH] Continue progress on AtomParser. --- .../FeedParser/Feeds/XML/AtomParser.swift | 56 +++++++++++++++++++ .../FeedParser/Feeds/XML/RSSAuthor.swift | 8 +-- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/Modules/Parser/Sources/FeedParser/Feeds/XML/AtomParser.swift b/Modules/Parser/Sources/FeedParser/Feeds/XML/AtomParser.swift index 26aba2a61..368a7588a 100644 --- a/Modules/Parser/Sources/FeedParser/Feeds/XML/AtomParser.swift +++ b/Modules/Parser/Sources/FeedParser/Feeds/XML/AtomParser.swift @@ -35,7 +35,11 @@ final class AtomParser { private var parsingXHTML = false private var xhtmlString: String? + private var currentAuthor: RSSAuthor? + private var parsingAuthor = false + private var parsingArticle = false + private var parsingSource = false private var endFeedFound = false static func parsedFeed(with parserData: ParserData) -> RSSFeed { @@ -62,8 +66,22 @@ private extension AtomParser { private struct XMLName { static let entry = "entry".utf8CString + static let content = "content".utf8CString + static let summary = "summary".utf8CString + static let link = "link".utf8CString + static let feed = "feed".utf8CString + static let source = "source".utf8CString + static let author = "author".utf8CString } + func addFeedLink() { + + } + + func addFeedLanguage() { + + } + func addArticle() { let article = RSSArticle(feedURL) articles.append(article) @@ -126,6 +144,44 @@ extension AtomParser: SAXParserDelegate { return } + if SAXEqualTags(localName, XMLName.author) { + parsingAuthor = true + currentAuthor = RSSAuthor() + return + } + + if SAXEqualTags(localName, XMLName.source) { + parsingSource = true + return + } + + let isContentTag = SAXEqualTags(localName, XMLName.content) + let isSummaryTag = SAXEqualTags(localName, XMLName.summary) + + if parsingArticle && (isContentTag || isSummaryTag) { + + if isContentTag { + currentArticle?.language = xmlAttributes["xml:lang"] + } + + let contentType = xmlAttributes["type"]; + if contentType == "xhtml" { + parsingXHTML = true + xhtmlString = "" + return + } + } + + if !parsingArticle && SAXEqualTags(localName, XMLName.link) { + addFeedLink() + return + } + + if SAXEqualTags(localName, XMLName.feed) { + addFeedLanguage() + } + + saxParser.beginStoringCharacters() } public func saxParser(_ saxParser: SAXParser, xmlEndElement localName: XMLPointer, prefix: XMLPointer?, uri: XMLPointer?) { diff --git a/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSAuthor.swift b/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSAuthor.swift index a153ecb1e..9a5e70f88 100644 --- a/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSAuthor.swift +++ b/Modules/Parser/Sources/FeedParser/Feeds/XML/RSSAuthor.swift @@ -14,7 +14,7 @@ final class RSSAuthor { var avatarURL: String? var emailAddress: String? - init(name: String?, url: String?, avatarURL: String?, emailAddress: String?) { + init(name: String? = nil, url: String? = nil, avatarURL: String? = nil, emailAddress: String? = nil) { self.name = name self.url = url self.avatarURL = avatarURL @@ -25,11 +25,11 @@ final class RSSAuthor { convenience init(singleString: String) { if singleString.contains("@") { - self.init(name: nil, url: nil, avatarURL: nil, emailAddress: singleString) + self.init(emailAddress: singleString) } else if singleString.lowercased().hasPrefix("http") { - self.init(name: nil, url: singleString, avatarURL: nil, emailAddress: nil) + self.init(url: singleString) } else { - self.init(name: singleString, url: nil, avatarURL: nil, emailAddress: nil) + self.init(name: singleString) } } }