Continue progress on AtomParser.

This commit is contained in:
Brent Simmons
2024-09-13 21:56:27 -07:00
parent f830008983
commit 28a6819901
2 changed files with 60 additions and 4 deletions

View File

@@ -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?) {

View File

@@ -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)
}
}
}