diff --git a/Frameworks/Account/FeedFinder/FeedSpecifier.swift b/Frameworks/Account/FeedFinder/FeedSpecifier.swift index ebcfab616..009c39644 100644 --- a/Frameworks/Account/FeedFinder/FeedSpecifier.swift +++ b/Frameworks/Account/FeedFinder/FeedSpecifier.swift @@ -69,10 +69,10 @@ private extension FeedSpecifier { score = score + 50 } - if urlString.rs_caseInsensitiveContains("comments") { + if urlString.caseInsensitiveContains("comments") { score = score - 10 } - if urlString.rs_caseInsensitiveContains("rss") { + if urlString.caseInsensitiveContains("rss") { score = score + 5 } if urlString.hasSuffix("/feed/") { @@ -81,15 +81,15 @@ private extension FeedSpecifier { if urlString.hasSuffix("/feed") { score = score + 4 } - if urlString.rs_caseInsensitiveContains("json") { + if urlString.caseInsensitiveContains("json") { score = score + 6 } if let title = title { - if title.rs_caseInsensitiveContains("comments") { + if title.caseInsensitiveContains("comments") { score = score - 10 } - if title.rs_caseInsensitiveContains("json") { + if title.caseInsensitiveContains("json") { score = score + 1 } } diff --git a/Frameworks/Account/FeedFinder/HTMLFeedFinder.swift b/Frameworks/Account/FeedFinder/HTMLFeedFinder.swift index ff4baa2a2..e8f242a56 100644 --- a/Frameworks/Account/FeedFinder/HTMLFeedFinder.swift +++ b/Frameworks/Account/FeedFinder/HTMLFeedFinder.swift @@ -33,7 +33,7 @@ class HTMLFeedFinder { for oneBodyLink in bodyLinks { if linkMightBeFeed(oneBodyLink) { - let normalizedURL = oneBodyLink.urlString.rs_normalizedURL() + let normalizedURL = oneBodyLink.urlString.normalizedURL let oneFeedSpecifier = FeedSpecifier(title: oneBodyLink.text, urlString: normalizedURL, source: .HTMLLink) addFeedSpecifier(oneFeedSpecifier) } diff --git a/Frameworks/Account/Folder.swift b/Frameworks/Account/Folder.swift index 1420eb3de..2123da05b 100644 --- a/Frameworks/Account/Folder.swift +++ b/Frameworks/Account/Folder.swift @@ -183,9 +183,9 @@ extension Folder: OPMLRepresentable { } }() - let escapedTitle = nameForDisplay.rs_stringByEscapingSpecialXMLCharacters() + let escapedTitle = nameForDisplay.escapingSpecialXMLCharacters var s = "\n" - s = s.rs_string(byPrependingNumberOfTabs: indentLevel) + s = s.prepending(tabCount: indentLevel) var hasAtLeastOneChild = false @@ -196,11 +196,11 @@ extension Folder: OPMLRepresentable { if !hasAtLeastOneChild { s = "\n" - s = s.rs_string(byPrependingNumberOfTabs: indentLevel) + s = s.prepending(tabCount: indentLevel) return s } - s = s + NSString.rs_string(withNumberOfTabs: indentLevel) + "\n" + s = s + String(tabCount: indentLevel) + "\n" return s } diff --git a/Frameworks/Account/OPMLFile.swift b/Frameworks/Account/OPMLFile.swift index c070eaae2..a2cac7182 100644 --- a/Frameworks/Account/OPMLFile.swift +++ b/Frameworks/Account/OPMLFile.swift @@ -125,7 +125,7 @@ private extension OPMLFile { } func opmlDocument() -> String { - let escapedTitle = account.nameForDisplay.rs_stringByEscapingSpecialXMLCharacters() + let escapedTitle = account.nameForDisplay.escapingSpecialXMLCharacters let openingText = """ diff --git a/Frameworks/Account/WebFeed.swift b/Frameworks/Account/WebFeed.swift index df0679a13..179b7720d 100644 --- a/Frameworks/Account/WebFeed.swift +++ b/Frameworks/Account/WebFeed.swift @@ -43,7 +43,7 @@ public final class WebFeed: Feed, Renamable, Hashable { } set { if let url = newValue, !url.isEmpty { - metadata.homePageURL = url.rs_normalizedURL() + metadata.homePageURL = url.normalizedURL } else { metadata.homePageURL = nil @@ -256,16 +256,16 @@ extension WebFeed: OPMLRepresentable { if nameToUse == nil { nameToUse = "" } - let escapedName = nameToUse!.rs_stringByEscapingSpecialXMLCharacters() + let escapedName = nameToUse!.escapingSpecialXMLCharacters var escapedHomePageURL = "" if let homePageURL = homePageURL { - escapedHomePageURL = homePageURL.rs_stringByEscapingSpecialXMLCharacters() + escapedHomePageURL = homePageURL.escapingSpecialXMLCharacters } - let escapedFeedURL = url.rs_stringByEscapingSpecialXMLCharacters() + let escapedFeedURL = url.escapingSpecialXMLCharacters var s = "\n" - s = s.rs_string(byPrependingNumberOfTabs: indentLevel) + s = s.prepending(tabCount: indentLevel) return s } diff --git a/Frameworks/Articles/DatabaseID.swift b/Frameworks/Articles/DatabaseID.swift index 392ca1870..a8b4590e3 100644 --- a/Frameworks/Articles/DatabaseID.swift +++ b/Frameworks/Articles/DatabaseID.swift @@ -26,7 +26,7 @@ public func databaseIDWithString(_ s: String) -> String { return identifier } - let identifier = (s as NSString).rs_md5Hash() + let identifier = s.md5HashString databaseIDCache[s] = identifier return identifier } diff --git a/Frameworks/ArticlesDatabase/SearchTable.swift b/Frameworks/ArticlesDatabase/SearchTable.swift index 6bcbd36bd..0733611a6 100644 --- a/Frameworks/ArticlesDatabase/SearchTable.swift +++ b/Frameworks/ArticlesDatabase/SearchTable.swift @@ -33,7 +33,7 @@ final class ArticleSearchInfo: Hashable { lazy var bodyForIndex: String = { let s = preferredText.rsparser_stringByDecodingHTMLEntities() - return s.rs_string(byStrippingHTML: 0).rs_stringWithCollapsedWhitespace() + return s.strippingHTML().collapsingWhitespace }() init(articleID: String, title: String?, contentHTML: String?, contentText: String?, summary: String?, searchRowID: Int?) { diff --git a/Mac/CrashReporter/CrashReporter.swift b/Mac/CrashReporter/CrashReporter.swift index be0a8b9f5..28138fb94 100644 --- a/Mac/CrashReporter/CrashReporter.swift +++ b/Mac/CrashReporter/CrashReporter.swift @@ -30,7 +30,7 @@ struct CrashLog { return nil } self.content = s - self.contentHash = s.rs_md5Hash() + self.contentHash = s.md5HashString self.path = path self.modificationDate = modificationDate } diff --git a/Mac/MainWindow/AddFeed/AddFeedController.swift b/Mac/MainWindow/AddFeed/AddFeedController.swift index 167ffdf26..77071e7cd 100644 --- a/Mac/MainWindow/AddFeed/AddFeedController.swift +++ b/Mac/MainWindow/AddFeed/AddFeedController.swift @@ -99,7 +99,7 @@ private extension AddFeedController { var urlStringFromPasteboard: String? { if let urlString = NSPasteboard.urlString(from: NSPasteboard.general) { - return urlString.rs_normalizedURL() + return urlString.normalizedURL } return nil } diff --git a/Mac/MainWindow/AddFeed/AddFeedWindowController.swift b/Mac/MainWindow/AddFeed/AddFeedWindowController.swift index df5f87868..f5ed2c9e8 100644 --- a/Mac/MainWindow/AddFeed/AddFeedWindowController.swift +++ b/Mac/MainWindow/AddFeed/AddFeedWindowController.swift @@ -36,7 +36,7 @@ class AddFeedWindowController : NSWindowController { private var userEnteredTitle: String? { var s = nameTextField.stringValue - s = s.rs_stringWithCollapsedWhitespace() + s = s.collapsingWhitespace if s.isEmpty { return nil } @@ -93,7 +93,7 @@ class AddFeedWindowController : NSWindowController { @IBAction func addFeed(_ sender: Any?) { let urlString = urlTextField.stringValue - let normalizedURLString = (urlString as NSString).rs_normalizedURL() + let normalizedURLString = urlString.normalizedURL if normalizedURLString.isEmpty { cancelSheet() @@ -130,7 +130,7 @@ class AddFeedWindowController : NSWindowController { private extension AddFeedWindowController { private func updateUI() { - addButton.isEnabled = urlTextField.stringValue.rs_stringMayBeURL() + addButton.isEnabled = urlTextField.stringValue.mayBeURL } func cancelSheet() { diff --git a/Mac/MainWindow/Detail/DetailStatusBarView.swift b/Mac/MainWindow/Detail/DetailStatusBarView.swift index 0d1bfb6de..eea5f72d2 100644 --- a/Mac/MainWindow/Detail/DetailStatusBarView.swift +++ b/Mac/MainWindow/Detail/DetailStatusBarView.swift @@ -67,7 +67,7 @@ private extension DetailStatusBarView { func updateLinkForDisplay() { if let mouseoverLink = mouseoverLink, !mouseoverLink.isEmpty { - linkForDisplay = (mouseoverLink as NSString).rs_stringByStrippingHTTPOrHTTPSScheme() + linkForDisplay = mouseoverLink.strippingHTTPOrHTTPSScheme } else { linkForDisplay = nil diff --git a/Mac/MainWindow/NNW3/NNW3Document.swift b/Mac/MainWindow/NNW3/NNW3Document.swift index 1352a9634..9d7fbed7f 100644 --- a/Mac/MainWindow/NNW3/NNW3Document.swift +++ b/Mac/MainWindow/NNW3/NNW3Document.swift @@ -95,18 +95,18 @@ private struct NNW3Folder { extension NNW3Folder: OPMLRepresentable { func OPMLString(indentLevel: Int, allowCustomAttributes: Bool) -> String { - let t = title?.rs_stringByEscapingSpecialXMLCharacters() ?? "" + let t = title?.escapingSpecialXMLCharacters ?? "" guard let children = children else { // Empty folder. - return "\n".rs_string(byPrependingNumberOfTabs: indentLevel) + return "\n".prepending(tabCount: indentLevel) } - var s = "\n".rs_string(byPrependingNumberOfTabs: indentLevel) + var s = "\n".prepending(tabCount: indentLevel) for child in children { s += child.OPMLString(indentLevel: indentLevel + 1) } - s += "\n".rs_string(byPrependingNumberOfTabs: indentLevel) + s += "\n".prepending(tabCount: indentLevel) return s } } @@ -131,12 +131,12 @@ private struct NNW3Feed { extension NNW3Feed: OPMLRepresentable { func OPMLString(indentLevel: Int, allowCustomAttributes: Bool) -> String { - let t = title?.rs_stringByEscapingSpecialXMLCharacters() ?? "" - let p = homePageURL?.rs_stringByEscapingSpecialXMLCharacters() ?? "" - let f = feedURL?.rs_stringByEscapingSpecialXMLCharacters() ?? "" + let t = title?.escapingSpecialXMLCharacters ?? "" + let p = homePageURL?.escapingSpecialXMLCharacters ?? "" + let f = feedURL?.escapingSpecialXMLCharacters ?? "" var s = "\n" - s = s.rs_string(byPrependingNumberOfTabs: indentLevel) + s = s.prepending(tabCount: indentLevel) return s } diff --git a/Mac/MainWindow/Sidebar/PasteboardWebFeed.swift b/Mac/MainWindow/Sidebar/PasteboardWebFeed.swift index 1c84cb78b..31612ded9 100644 --- a/Mac/MainWindow/Sidebar/PasteboardWebFeed.swift +++ b/Mac/MainWindow/Sidebar/PasteboardWebFeed.swift @@ -37,9 +37,9 @@ struct PasteboardWebFeed: Hashable { let isLocalFeed: Bool init(url: String, webFeedID: String?, homePageURL: String?, name: String?, editedName: String?, accountID: String?, accountType: AccountType?) { - self.url = url.rs_normalizedURL() + self.url = url.normalizedURL self.webFeedID = webFeedID - self.homePageURL = homePageURL?.rs_normalizedURL() + self.homePageURL = homePageURL?.normalizedURL self.name = name self.editedName = editedName self.accountID = accountID @@ -93,7 +93,7 @@ struct PasteboardWebFeed: Hashable { } if let foundType = pasteboardType { if let possibleURLString = pasteboardItem.string(forType: foundType) { - if possibleURLString.rs_stringMayBeURL() { + if possibleURLString.mayBeURL { self.init(url: possibleURLString, webFeedID: nil, homePageURL: nil, name: nil, editedName: nil, accountID: nil, accountType: nil) return } diff --git a/Mac/MainWindow/Timeline/ArticlePasteboardWriter.swift b/Mac/MainWindow/Timeline/ArticlePasteboardWriter.swift index 351352b16..b962ba8e6 100644 --- a/Mac/MainWindow/Timeline/ArticlePasteboardWriter.swift +++ b/Mac/MainWindow/Timeline/ArticlePasteboardWriter.swift @@ -78,7 +78,7 @@ private extension ArticlePasteboardWriter { s += "\(summary)\n\n" } else if let html = article.contentHTML { - let convertedHTML = html.rs_stringByConvertingToPlainText() + let convertedHTML = html.convertingToPlainText() s += "\(convertedHTML)\n\n" } diff --git a/Mac/Preferences/General/GeneralPrefencesViewController.swift b/Mac/Preferences/General/GeneralPrefencesViewController.swift index 4a47f7ad4..57996a485 100644 --- a/Mac/Preferences/General/GeneralPrefencesViewController.swift +++ b/Mac/Preferences/General/GeneralPrefencesViewController.swift @@ -177,7 +177,7 @@ private struct RSSReader: Hashable { let name = (path as NSString).lastPathComponent self.name = name if name.hasSuffix(".app") { - self.nameMinusAppSuffix = name.rs_string(byStrippingSuffix: ".app", caseSensitive: false) + self.nameMinusAppSuffix = name.stripping(suffix: ".app") } else { self.nameMinusAppSuffix = name diff --git a/Mac/Scriptability/AppDelegate+Scriptability.swift b/Mac/Scriptability/AppDelegate+Scriptability.swift index 84bed12b1..68decde44 100644 --- a/Mac/Scriptability/AppDelegate+Scriptability.swift +++ b/Mac/Scriptability/AppDelegate+Scriptability.swift @@ -44,8 +44,8 @@ extension AppDelegate : AppDelegateAppleEvents { return } - let normalizedURLString = urlString.rs_normalizedURL() - if !normalizedURLString.rs_stringMayBeURL() { + let normalizedURLString = urlString.normalizedURL + if !normalizedURLString.mayBeURL { return } diff --git a/Shared/ArticleStyles/ArticleStylesManager.swift b/Shared/ArticleStyles/ArticleStylesManager.swift index df70605b3..ddc23b3f8 100644 --- a/Shared/ArticleStyles/ArticleStylesManager.swift +++ b/Shared/ArticleStyles/ArticleStylesManager.swift @@ -159,7 +159,7 @@ private func filenameWithStyleSuffixRemoved(_ filename: String) -> String { for oneSuffix in styleSuffixes { if filename.hasSuffix(oneSuffix) { - return (filename as NSString).rs_string(byStrippingSuffix: oneSuffix, caseSensitive: false) + return filename.stripping(suffix: oneSuffix) } } diff --git a/Shared/Data/ArticleStringFormatter.swift b/Shared/Data/ArticleStringFormatter.swift index 56364690f..4fb9249ae 100644 --- a/Shared/Data/ArticleStringFormatter.swift +++ b/Shared/Data/ArticleStringFormatter.swift @@ -65,8 +65,8 @@ struct ArticleStringFormatter { s = s.replacingOccurrences(of: "\r", with: "") s = s.replacingOccurrences(of: "\t", with: "") s = s.rsparser_stringByDecodingHTMLEntities() - s = s.rs_stringByTrimmingWhitespace() - s = s.rs_stringWithCollapsedWhitespace() + s = s.trimmingWhitespace + s = s.collapsingWhitespace let maxLength = 1000 if s.count < maxLength { @@ -89,9 +89,9 @@ struct ArticleStringFormatter { return cachedBody } var s = body.rsparser_stringByDecodingHTMLEntities() - s = s.rs_string(byStrippingHTML: 250) - s = s.rs_stringByTrimmingWhitespace() - s = s.rs_stringWithCollapsedWhitespace() + s = s.strippingHTML(maxCharacters: 250) + s = s.trimmingWhitespace + s = s.collapsingWhitespace if s == "Comments" { // Hacker News. s = "" } diff --git a/Shared/Exporters/OPMLExporter.swift b/Shared/Exporters/OPMLExporter.swift index c177431ef..cba135a17 100644 --- a/Shared/Exporters/OPMLExporter.swift +++ b/Shared/Exporters/OPMLExporter.swift @@ -14,7 +14,7 @@ struct OPMLExporter { static func OPMLString(with account: Account, title: String) -> String { - let escapedTitle = title.rs_stringByEscapingSpecialXMLCharacters() + let escapedTitle = title.escapingSpecialXMLCharacters let openingText = """ diff --git a/Shared/Extensions/RSImage-Extensions.swift b/Shared/Extensions/RSImage-Extensions.swift index 505079fbb..30a3d570b 100644 --- a/Shared/Extensions/RSImage-Extensions.swift +++ b/Shared/Extensions/RSImage-Extensions.swift @@ -6,7 +6,12 @@ // Copyright © 2019 Ranchero Software. All rights reserved. // -import Foundation +#if os(macOS) +import AppKit +#else +import UIKit +#endif + import RSCore extension RSImage { diff --git a/Shared/Favicons/FaviconDownloader.swift b/Shared/Favicons/FaviconDownloader.swift index a49ad6dfd..eee115711 100644 --- a/Shared/Favicons/FaviconDownloader.swift +++ b/Shared/Favicons/FaviconDownloader.swift @@ -114,7 +114,7 @@ final class FaviconDownloader { func favicon(withHomePageURL homePageURL: String) -> IconImage? { - let url = homePageURL.rs_normalizedURL() + let url = homePageURL.normalizedURL if let url = URL(string: homePageURL) { if url.host == "nnw.ranchero.com" { diff --git a/Shared/Favicons/SingleFaviconDownloader.swift b/Shared/Favicons/SingleFaviconDownloader.swift index cf871ab7b..a5e0a7e91 100644 --- a/Shared/Favicons/SingleFaviconDownloader.swift +++ b/Shared/Favicons/SingleFaviconDownloader.swift @@ -34,7 +34,7 @@ final class SingleFaviconDownloader { private let queue: DispatchQueue private var diskKey: String { - return (faviconURL as NSString).rs_md5Hash() + return faviconURL.md5HashString } init(faviconURL: String, homePageURL: String?, diskCache: BinaryDiskCache, queue: DispatchQueue) { diff --git a/Shared/Images/ImageDownloader.swift b/Shared/Images/ImageDownloader.swift index 289ef74fe..bfae2fce2 100644 --- a/Shared/Images/ImageDownloader.swift +++ b/Shared/Images/ImageDownloader.swift @@ -128,7 +128,7 @@ private extension ImageDownloader { func diskKey(_ url: String) -> String { - return (url as NSString).rs_md5Hash() + return url.md5HashString } func postImageDidBecomeAvailableNotification(_ url: String) { diff --git a/iOS/Add/AddWebFeedViewController.swift b/iOS/Add/AddWebFeedViewController.swift index e2f8a883f..4fb5484bf 100644 --- a/iOS/Add/AddWebFeedViewController.swift +++ b/iOS/Add/AddWebFeedViewController.swift @@ -30,9 +30,9 @@ class AddWebFeedViewController: UITableViewController, AddContainerViewControlle super.viewDidLoad() - if initialFeed == nil, let urlString = UIPasteboard.general.string as NSString? { - if urlString.rs_stringMayBeURL() { - initialFeed = urlString.rs_normalizedURL() + if initialFeed == nil, let urlString = UIPasteboard.general.string { + if urlString.mayBeURL { + initialFeed = urlString.normalizedURL } } @@ -73,7 +73,7 @@ class AddWebFeedViewController: UITableViewController, AddContainerViewControlle func add() { let urlString = urlTextField.text ?? "" - let normalizedURLString = (urlString as NSString).rs_normalizedURL() + let normalizedURLString = urlString.normalizedURL guard !normalizedURLString.isEmpty, let url = URL(string: normalizedURLString) else { delegate?.processingDidCancel() @@ -118,7 +118,7 @@ class AddWebFeedViewController: UITableViewController, AddContainerViewControlle } @objc func textDidChange(_ note: Notification) { - delegate?.readyToAdd(state: urlTextField.text?.rs_stringMayBeURL() ?? false) + delegate?.readyToAdd(state: urlTextField.text?.mayBeURL ?? false) } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {