为 swift-markdown 提供 resultBuilder
支持。
在 swift-markdown 中构建 Markdown 的默认方式是使用 varargs 初始化器,例如 README.md 中的示例。
let document = Document(
Paragraph(
Text("This is a "),
Emphasis(
Text("paragraph."))))
如果能够使用类似 SwiftUI 的 "resultBuilder" 语法,岂不是很好,比如:
let document = Document {
Paragraph {
"This is a "
"paragraph"
.emphasis()
}
}
甚至可以使用像这样的控制结构:
let document = Document {
"Our Tasks:"
.font(.largeTitle)
List {
ForEach(todos) { todo in
Text(todo.title)
}
}
}
或者自定义 Markdown "视图":
struct TOC: DynamicMarkdownBlock {
let pages : [ Page ]
var body: [ MarkdownBlock ] {
"Table of Contents"
.font(.title)
ForEach(pages) { page in
Paragraph {
Text(page.title)
.font(.title2)
Text(page.abstract)
}
}
}
}
这就是我们在这里尝试的。
也许我们可以让它达到适合在 swift-markdown 本身发起 PR 的状态。
一个供好奇的人尝试的实验。仍在开发中。
目前还不清楚这个东西到底有多大用处。真的有在 Swift 中构建 Markdown 的用例吗? 😃
一个目标是/曾经是,不提出 resultBuilders 特有的协议/结构,而是直接附加到 swift-markdown 已经提供的协议/结构。
如果这是 Markdown 模块内部的,一些 hacky 的东西可以被删除(例如,因为可以访问 API)。
该实现也不必依赖于 SwiftUI 风格设置的类型安全性,因为 swift-markdown 协议不使用关联类型。此外,它不需要像 Binding
这样的双向设置。
缺少的功能
列表
也许可以从 SwiftBlocksUI 中使用更多东西(它生成 Slack JSON block 结构,但这些本质上只是花哨的 markdown)。
示例 Package.swift
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name : "MyWebsite",
products : [ .executable(name: "MyWebsite", targets: [ "MyWebsite" ]) ],
dependencies : [
.package(url: "https://github.com/DoccZz/SwiftMarkdownBuilder.git", from: "0.1.0")
],
targets: [
.target(name: "MyWebsite", dependencies: [
.product(name: "MarkdownBuilder", package: "SwiftMarkdownBuilder")
])
]
)
SwiftMarkdownBuilder 由 Always Right Institute 和 ZeeZide 提供。我们喜欢 反馈、GitHub 星星、酷炫的 合同工作,以及您能想到的任何形式的赞扬。