README content.
+
diff --git a/Sources/App/Views/PackageController/PackageReadme+Model.swift b/Sources/App/Views/PackageController/PackageReadme+Model.swift index 677ab5067..315ca225b 100644 --- a/Sources/App/Views/PackageController/PackageReadme+Model.swift +++ b/Sources/App/Views/PackageController/PackageReadme+Model.swift @@ -56,6 +56,7 @@ extension PackageReadme { readmeElement.rewriteRelativeImages(to: repoTriple) readmeElement.rewriteRelativeLinks(to: repoTriple) readmeElement.fixInlineAnchors() + readmeElement.fixProtectedCachedImages() readmeElement.disableTurboOnLinks() return readmeElement } @@ -124,6 +125,21 @@ extension Element { } } + func fixProtectedCachedImages() { + do { + let imageElements = try select("img[data-canonical-src]") + for imageElement in imageElements { + let originalUrl = try imageElement.attr("data-canonical-src") + if originalUrl.hasPrefix("http") { + try imageElement.attr("src", originalUrl) + } + } + } catch { + // Errors are being intentionally eaten here. The worst that can happen if the + // HTML selection/parsing fails is that cached images don't get corrected. + } + } + func disableTurboOnLinks() { do { let linkElements = try select("a") diff --git a/Tests/AppTests/PackageReadmeModelTests.swift b/Tests/AppTests/PackageReadmeModelTests.swift index 9fb14bd98..d9a4cbfd8 100644 --- a/Tests/AppTests/PackageReadmeModelTests.swift +++ b/Tests/AppTests/PackageReadmeModelTests.swift @@ -130,6 +130,30 @@ class PackageReadmeModelTests: SnapshotTestCase { assertSnapshot(of: html, as: .lines) } + func test_Element_fixProtectedCachedImages() throws { + // setup + let element = Element.extractReadme(""" +
README content.
+README content.
+