diff --git a/Readme.md b/Readme.md index 551561d..78b9af5 100644 --- a/Readme.md +++ b/Readme.md @@ -97,7 +97,7 @@ Execution, trying TDD for the first time: - [ ] Consider using Swift for samhuri.net as well, and then making SiteGenerator a package that it uses ... then we can use Plot or pointfree.co's swift-html -- [ ] Replace remaining Ruby with Swift +- [x] Replace remaining Ruby with Swift - [x] Generate RSS feed (ditch mustache templates) diff --git a/SiteGenerator/Package.resolved b/SiteGenerator/Package.resolved index 79f7114..87ad4ee 100644 --- a/SiteGenerator/Package.resolved +++ b/SiteGenerator/Package.resolved @@ -36,15 +36,6 @@ "revision": "0e9a78d6584e3812cd9c09494d5c7b483e8f533c", "version": "0.13.1" } - }, - { - "package": "HTMLEntities", - "repositoryURL": "https://github.com/IBM-Swift/swift-html-entities.git", - "state": { - "branch": null, - "revision": "744c094976355aa96ca61b9b60ef0a38e979feb7", - "version": "3.0.14" - } } ] }, diff --git a/SiteGenerator/Package.swift b/SiteGenerator/Package.swift index f8df1cc..2c7224b 100644 --- a/SiteGenerator/Package.swift +++ b/SiteGenerator/Package.swift @@ -9,13 +9,11 @@ let package = Package( .macOS(.v10_15), ], dependencies: [ - .package(url: "https://github.com/IBM-Swift/swift-html-entities.git", from: "3.0.0"), .package(url: "https://github.com/johnsundell/ink.git", from: "0.1.0"), .package(url: "https://github.com/stencilproject/Stencil.git", from: "0.13.0"), ], targets: [ .target( name: "SiteGenerator", dependencies: [ - "HTMLEntities", "Ink", "Stencil", ]), diff --git a/SiteGenerator/Sources/SiteGenerator/Posts/Feeds/RSSFeedWriter.swift b/SiteGenerator/Sources/SiteGenerator/Posts/Feeds/RSSFeedWriter.swift index 2a9fe46..fde11c8 100644 --- a/SiteGenerator/Sources/SiteGenerator/Posts/Feeds/RSSFeedWriter.swift +++ b/SiteGenerator/Sources/SiteGenerator/Posts/Feeds/RSSFeedWriter.swift @@ -5,7 +5,6 @@ // Created by Sami Samhuri on 2019-12-10. // -import HTMLEntities import Foundation private struct FeedSite { @@ -47,9 +46,9 @@ final class RSSFeedWriter { func writeFeed(_ posts: [Post], site: Site, to targetURL: URL, with templateRenderer: TemplateRenderer) throws { let feedSite = FeedSite( - title: site.title.htmlEscape(useNamedReferences: true), - description: site.description?.htmlEscape(useNamedReferences: true), - url: site.url.absoluteString.htmlEscape(useNamedReferences: true) + title: site.title.escapedForXML(), + description: site.description?.escapedForXML(), + url: site.url.absoluteString.escapedForXML() ) let renderedPosts: [FeedPost] = try posts.map { post in let title = post.isLink ? "→ \(post.title)" : post.title @@ -63,19 +62,19 @@ final class RSSFeedWriter { }() let url = site.url.appendingPathComponent(post.path) return FeedPost( - title: title.htmlEscape(useNamedReferences: true), - date: post.date.rfc822.htmlEscape(useNamedReferences: true), - author: author.htmlEscape(useNamedReferences: true), - link: (post.link ?? url).absoluteString.htmlEscape(useNamedReferences: true), - guid: url.absoluteString.htmlEscape(useNamedReferences: true), + title: title.escapedForXML(), + date: post.date.rfc822.escapedForXML(), + author: author.escapedForXML(), + link: (post.link ?? url).absoluteString.escapedForXML(), + guid: url.absoluteString.escapedForXML(), body: try templateRenderer.renderTemplate(name: "feed-post.html", context: [ "post": post, - ]).htmlEscape(useNamedReferences: true) + ]).escapedForXML() ) } let feedXML = try templateRenderer.renderTemplate(name: "feed.xml", context: [ "site": feedSite, - "feedURL": site.url.appendingPathComponent(feedPath).absoluteString.htmlEscape(useNamedReferences: true), + "feedURL": site.url.appendingPathComponent(feedPath).absoluteString.escapedForXML(), "posts": renderedPosts, ]) let feedURL = targetURL.appendingPathComponent(feedPath) diff --git a/SiteGenerator/Sources/SiteGenerator/Posts/Feeds/String+EscapeXML.swift b/SiteGenerator/Sources/SiteGenerator/Posts/Feeds/String+EscapeXML.swift new file mode 100644 index 0000000..48c411b --- /dev/null +++ b/SiteGenerator/Sources/SiteGenerator/Posts/Feeds/String+EscapeXML.swift @@ -0,0 +1,17 @@ +// +// XMLEscape.swift +// SiteGenerator +// +// Created by Sami Samhuri on 2019-12-12. +// + +import Foundation + +extension String { + func escapedForXML() -> String { + replacingOccurrences(of: "&", with: "&") + .replacingOccurrences(of: "<", with: "<") + .replacingOccurrences(of: ">", with: ">") + .replacingOccurrences(of: "\"", with: """) + } +}