SwiftMarkdownBuilder

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)。

在 Swift 包中使用

示例 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") 
    ])
  ]
)

SwiftMarkdownBuilderAlways Right InstituteZeeZide 提供。我们喜欢 反馈、GitHub 星星、酷炫的 合同工作,以及您能想到的任何形式的赞扬。