跳到內容

Swift

IllusionMarkdown 是 MDI 的 Swift Package Manager 發行套件;產品與 import module 都叫作 MDI

import MDI

Swift 會透過精簡的 C ABI 將解析和轉譯交給 Rust 的 mdi-core,不會重作語法,因此所有綁定共用同一份語法、文件 IR、診斷與 renderer。

Package.swift 加入相依套件,並讓使用它的 target 相依於 MDI 產品:

dependencies: [
.package(url: "https://github.com/illusions-lab/MDI.git", from: "2.0.2"),
]
// target 的 dependencies:
.product(name: "MDI", package: "MDI")

二進位套件支援 macOS 13+ 與 iOS 15+,包含 Apple Silicon 與適用的 Intel simulator。

let result = try MDI.parse("# 見出し\n\n{東京|とうきょう}で第^12^話")
print(result.irVersion) // "1.0"
print(result.capabilities.mdi) // true
print(result.diagnostics)

result.document 是無損的 MDIJSONValue 樹;可用 .object.array.string.number.bool.null pattern matching 取用節點。MDISourceSpan 使用 UTF-8 byte offset。

let html = try MDI.renderHTML("{東京|とうきょう} ^12^")
let mdi = try MDI.serialize("{東京|とうきょう} ^12^")
let text = try MDI.renderText("# Title")
let epub: Data = try MDI.renderEPUB("# Chapter")
let docx: Data = try MDI.renderDOCX("# Chapter")

EPUB 與 DOCX 回傳 ZIP 格式的 Data,請以對應副檔名寫入檔案。

所有公開 API 都可能拋出 MDIErrorMDIError.core 表示 Rust core 回傳的失敗,MDIError.invalidWireFormat 表示無效或不支援的 native 回應。

do {
let html = try MDI.renderHTML(source)
print(html)
} catch let error as MDIError {
print(error.localizedDescription)
}

repository 的 swift/Package.swift 是本機開發用 package。CI 會建置 XCFramework、跑 XCTest,並對 swift/Sources/MDI 強制 90% line coverage、上傳 Codecov。release workflow 會建立 manifest pull request;該 PR 合併後才發布核准的 artifact。它使用 GitHub Actions 內建 token,不需要 PAT 或第二個 repository。