TextMarkupKit

许多 iOS 应用程序允许你在 UITextView 中编写纯文本,并根据简单的规则格式化文本。TextMarkupKit 可以轻松地向任何 iOS 应用程序添加“边输入边格式化”功能。

它由几个相互关联的组件组成

  1. 一组组件允许你编写一个 解析表达式文法 (Parsing Expression Grammar, PEG) 来定义如何解析用户的输入。因为编写文法很困难,TextMarkupKit 允许你设计“可扩展文法”。可扩展文法具有显式的扩展点,人们可以在其中引入新规则,而不是从头开始编写整个语言文法。TextMarkupKit 还为 Markdown 语法的子集提供了一个可扩展文法,称为 MiniMarkdownGrammar。你可以通过为块或内联样式提供额外的解析规则来扩展 MiniMarkdownGrammar
  2. Dubroy & Warth 的 增量 Packrat 解析算法的实现,可在用户在 UITextView 中输入时高效地重新解析文本内容。
  3. 一个基于 -string 内容的解析树格式化 NSAttributedString 的系统。TextMarkupKit 的格式化支持是围绕类似 Markdown 的轻量级“人类标记语言”的需求设计的,而不是用于编程语言的语法高亮显示。除了更改与文本关联的属性之外,TextMarkupKit 的格式化规则还允许你转换显示的文本本身。例如,你可能选择在格式化列表时将空格更改为制表符,或者在某些模式下不显示特殊的格式分隔符,或者用实际的图像附件替换图像标记序列。TextMarkupKit 支持所有这些模式。
  4. 一种将格式化的 NSAttributedString 与 TextKit 有效集成的方式,使其可以与 UITextView 一起使用。

TextMarkupKit 为我的应用程序 Grail Diary 提供了解析/格式化支持。

安装

使用 Swift Package Manager 安装 TextMarkupKit

  dependencies: [
    .package(url: "https://github.com/bdewey/TextMarkupKit", from: "0.7.0"),
  ],

请注意,TextMarkupKit 尚未达到 1.0.0 版本 -- API 正在频繁且剧烈地变化,因为我正在采用为特定应用程序编写的代码以供通用使用。

使用 TextMarkupKit -- 绝对基础知识

虽然 TextMarkupKit 旨在支持自定义格式和自定义标记语言,但你可以开箱即用地使用 Markdown 的子集开始。使用 UIKit

import TextMarkupKit
import UIKit

// textStorage will hold the characters and formatting (determined by the markup rules).
//
// MiniMarkdownGrammar.defaultEditingStyle():
// - Tells `ParsedAttributedString` to use the rules of MiniMarkdownGrammar to parse the text
// - Provides a default set of formatters to style the parsed text.
let textStorage = ParsedAttributedString(string: "# Hello, world!\n", style: MiniMarkdownGrammar.defaultEditingStyle())

// MarkupFormattingTextView is a subclass of UITextView and you can use it anywhere you would use a UITextView.
let textView = MarkupFormattingTextView(parsedAttributedString: textStorage)

使用 SwiftUI

import SwiftUI
import TextMarkupKit

struct ContentView: View {
  @Binding var document: TextMarkupKitSampleDocument

  var body: some View {
    // `MarkupFormattedTextEditor` is a SwiftUI wrapper around `MarkupFormattingTextView` that commits its changes back to the
    // text binding when editing is complete. By default it uses `MiniMarkdownGrammar.defaultEditingStyle()`, but you can provide
    // a custom style with the `style:` parameter.
    MarkupFormattedTextEditor(text: $document.text)
  }
}

就是这样!你现在有一个视图,它将格式化纯文本并随着内容的变化自动调整。查看示例应用程序以查看实际效果。

TextMarkupKit Sample App

进一步阅读

由于这个项目最初是为个人使用而启动的,因此文档很少。在我构建它时,这是代码重要领域的概述。

解析

此外,ParsingRule.swift 定义了许多简单的规则,你可以组合这些规则来构建更复杂的规则来构建你的文法。

TextStorage