Skip to content

Commit

Permalink
Temporarily avoid using FoundationXML to unblock CI (#1090)
Browse files Browse the repository at this point in the history
* Temporarily avoid using FoundationXML to unblock CI

rdar://139494302

Co-authored-by: Sofía Rodríguez <[email protected]>

* Workaround an issue where the "references" codingPath component is missing

---------

Co-authored-by: Sofía Rodríguez <[email protected]>
  • Loading branch information
d-ronnqvist and sofiaromorales authored Nov 8, 2024
1 parent 784ba58 commit 6ace3ef
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 34 deletions.
48 changes: 14 additions & 34 deletions Sources/SwiftDocC/Infrastructure/Bundle Assets/SVGIDExtractor.swift
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
This source file is part of the Swift.org open source project

Copyright (c) 2022 Apple Inc. and the Swift project authors
Copyright (c) 2022-2024 Apple Inc. and the Swift project authors
Licensed under Apache License v2.0 with Runtime Library Exception

See https://swift.org/LICENSE.txt for license information
Expand All @@ -10,12 +10,6 @@

import Foundation

// On non-Darwin platforms, Foundation's XML support is vended as a separate module:
// https://github.com/apple/swift-corelibs-foundation/blob/main/Docs/ReleaseNotes_Swift5.md#dependency-management
#if canImport(FoundationXML)
import FoundationXML
#endif

/// A basic XML parser that extracts the first `id` attribute found in the given SVG.
///
/// This is a single-purpose tool and should not be used for general-purpose SVG parsing.
Expand All @@ -25,14 +19,19 @@ enum SVGIDExtractor {
/// Exposed for testing. The sibling `extractID(from: URL)` method is intended to be
/// used within SwiftDocC.
static func _extractID(from data: Data) -> String? {
let delegate = SVGIDParserDelegate()
let svgParser = XMLParser(data: data)
svgParser.delegate = delegate

// The delegate aborts the parsing when it finds the ID so the larger parsing operation is not "successful"
_ = svgParser.parse()

return delegate.id
// FIXME: Revert this and resume using XMLParser when rdar://138726860 is integrated into a Swift toolchain.
for capitalization in ["id", "ID", "Id", "iD"] {
guard let idAttributeRange = data.firstRange(of: Data(" \(capitalization)=\"".utf8), in: data.indices) else {
continue
}

guard let endQuote = data.firstRange(of: Data("\"".utf8), in: idAttributeRange.upperBound...) else {
continue
}

return String(data: data[idAttributeRange.endIndex ..< endQuote.lowerBound], encoding: .utf8)
}
return nil
}

/// Returns the first `id` attribute found in the given SVG, if any.
Expand All @@ -47,22 +46,3 @@ enum SVGIDExtractor {
return _extractID(from: data)
}
}

private class SVGIDParserDelegate: NSObject, XMLParserDelegate {
var id: String?

func parser(
_ parser: XMLParser,
didStartElement elementName: String,
namespaceURI: String?,
qualifiedName qName: String?,
attributes attributeDict: [String : String] = [:]
) {
guard let id = attributeDict["id"] ?? attributeDict["ID"] ?? attributeDict["iD"] ?? attributeDict["Id"] else {
return
}

self.id = id
parser.abortParsing()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,15 @@ public enum JSONPatchOperation: Codable {
/// - variantPatchOperation: The patch to apply.
/// - pointer: The pointer to the value to update.
public init<Value>(variantPatchOperation: VariantPatchOperation<Value>, pointer: JSONPointer) {
// FIXME: The latest Swift development snapshots (2024-10-30-a and later) is missing the "references" path component. (rdar://139446585)
// AFAICT it's the only path that's missing components, so we're working around that issue here.
// Since the only RenderNode coding paths that have include a topic reference (as its 2nd component) are
// modifications of topics in the "references" section, we can detect and workaround this issue by checking for a "doc://" prefix.
var pointer = pointer
if pointer.pathComponents.first?.hasPrefix("doc://") == true {
pointer = pointer.prependingPathComponents(["references"])
}

switch variantPatchOperation {
case .replace(let value):
self = .replace(pointer: pointer, encodableValue: value)
Expand Down
13 changes: 13 additions & 0 deletions Tests/SwiftDocCTests/Infrastructure/SVGIDExtractorTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,19 @@ class SVGIDExtractorTests: XCTestCase {
XCTAssertEqual(id, "plus-id")
}

do {
let id = extractIDFromSVG(
"""
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" id="plus-id">
<path d="M9.99 0c-5.461 0-9.99 4.539-9.99 10s4.539 10 10 10 10-4.53 10-10-4.539-10-10.010-10zM14.079 10.863h-3.226v3.049c0 0.589-0.323 0.97-0.873 0.97-0.559 0-0.853-0.401-0.853-0.97v-3.049h-3.216c-0.579 0-0.98-0.304-0.98-0.843 0-0.559 0.383-0.873 0.98-0.873h3.216v-3.246c0-0.569 0.294-0.97 0.853-0.97 0.549 0 0.873 0.383 0.873 0.97v3.246h3.226c0.599 0 0.97 0.314 0.97 0.873 0 0.539-0.391 0.843-0.97 0.843z"></path>
</svg>
"""
)

XCTAssertEqual(id, "plus-id")
}

do {
let id = extractIDFromSVG(
"""
Expand Down

0 comments on commit 6ace3ef

Please sign in to comment.