34 lines
1.5 KiB
Swift

import Foundation
import SwiftSoup
public enum AToZParser {
public static let baseSelector = "section.FilterComics_filterComics__9VGXB"
static let cardSelector = "a[data-analytics-type=\"feature_card\"]"
static let titleSelector = "h3"
static let bylineSelector = "h4"
static let imageSelector = "img"
static let updatedSelector = "span"
public static func parse(content: String) throws -> [Feature] {
let document = try SwiftSoup.parse(content)
let content = try element(from: document, selector: baseSelector)
let links = try content.select(cardSelector)
let features = try links.compactMap { card in
let identifier = try card.attr("href")
let title = try element(from: card, selector: titleSelector).text()
let byline = try element(from: card, selector: bylineSelector).text()
let image = try card.select(imageSelector).first().map { try $0.attr("src") }.flatMap { URL(string: $0) }
let span = try card.select(updatedSelector).first()
return Feature(identifier: identifier, title: title, byline: byline, imageURL: image, isUpdated: span != nil)
}
return features
}
static func element(from document: SwiftSoup.Element, selector: String) throws -> SwiftSoup.Element {
guard let result = try document.select(selector).first() else {
throw ParserError.missingElement(selector)
}
return result
}
}