许多 iOS 应用程序允许你在 UITextView
中编写纯文本,并根据简单的规则格式化文本。TextMarkupKit 可以轻松地向任何 iOS 应用程序添加“边输入边格式化”功能。
它由几个相互关联的组件组成
TextMarkupKit
还为 Markdown 语法的子集提供了一个可扩展文法,称为 MiniMarkdownGrammar
。你可以通过为块或内联样式提供额外的解析规则来扩展 MiniMarkdownGrammar
。UITextView
中输入时高效地重新解析文本内容。-string
内容的解析树格式化 NSAttributedString
的系统。TextMarkupKit 的格式化支持是围绕类似 Markdown 的轻量级“人类标记语言”的需求设计的,而不是用于编程语言的语法高亮显示。除了更改与文本关联的属性之外,TextMarkupKit 的格式化规则还允许你转换显示的文本本身。例如,你可能选择在格式化列表时将空格更改为制表符,或者在某些模式下不显示特殊的格式分隔符,或者用实际的图像附件替换图像标记序列。TextMarkupKit 支持所有这些模式。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
旨在支持自定义格式和自定义标记语言,但你可以开箱即用地使用 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)
}
}
就是这样!你现在有一个视图,它将格式化纯文本并随着内容的变化自动调整。查看示例应用程序以查看实际效果。
由于这个项目最初是为个人使用而启动的,因此文档很少。在我构建它时,这是代码重要领域的概述。
ParsingRule
是一个抽象基类。解析规则的任务是在特定偏移量评估输入文本并生成 ParsingResult
,这是一个结构体,指示ParsingRule
必须查看多少输入字符串才能做出成功/失败的决定。PackratGrammar
是一个协议,通过 ParsingRule
的图定义一个完整的文法。PackratGrammar
公开一个规则,start
,该规则将在尝试解析字符串时使用。MemoizationTable
实现了核心的增量 packrat 解析算法。此外,ParsingRule.swift
定义了许多简单的规则,你可以组合这些规则来构建更复杂的规则来构建你的文法。
DotRule
匹配任何字符。Characters
匹配由 CharacterSet
定义的任何字符。Literal
匹配一个字符串字面量。InOrder
接受一个子规则数组,如果每个子规则按顺序成功,则成功。Choice
也接受一个子规则数组,但匹配数组中第一个子规则。AssertionRule
接受一个子规则。如果其子规则成功,则它成功,但不消耗输入。NotAssertionRule
像 AssertionRule
一样,接受一个子规则。如果它的子规则失败,它将成功,反之亦然,并且永远不会消耗输入。RangeRule
接受一个子规则,并将尝试重复将该规则匹配到输入。如果子规则的成功重复次数在指定的范围内,则它成功。PieceTable
实现了 piece table 数据结构,用于高效的文本编辑。PieceTableString
是 NSMutableString
的一个子类,它使用 PieceTable
作为其内部存储。ParsedAttributedString
是 NSMutableAttributedString
的一个子类,它PieceTableString
进行字符存储;MemoizationTable
解析字符串并在每次更改时增量地重新解析字符串;ObjectiveCTextStorageWrapper
是一个 NSTextStorage
实现,允许你使用 ParsedAttributedString
作为 TextKit
(如 UITextView
)的后备存储。