声明式文本工具包 (Declarative Text Kit)

Build Status Platforms Documentation

一个 Swift DSL,用于修改文本缓冲区。

目标

一次性表达多个更改的意图。

我们用声明式 DSL 替换过程式代码来实现这一点。

代表用户对文本视图进行更改并提供正确的撤销支持,通常需要:

  1. 修改选定的范围,例如,到单词边界,
  2. 检查选定的范围是否可修改(如果不可修改则中止),
  3. 对文本执行更改 -- 从后向前开始,以避免使即将进行的更改的索引失效,
  4. 通知文本视图更改已在范围内完成。

如果您想一次修改文本中的多个位置,仅索引反转就使代码更难理解。

看起来像这样

将用户的选择扩展到整行,然后将文本包装在 GitHub 风格的 Markdown 围栏代码块中,并将插入点放在开头的三个反引号之后

buffer.evaluate(in: buffer.selectedRange) { selectedRange in
    // Expand selection to the whole block (full lines).
    Select(LineRange(selectedRange)) { lineRange in
        // In that range, attempt to wrap the selected text
        // in two lines to make it a code block.
        // (Abort if the text view doesn't permit changes.)
        Modifying(lineRange) { rangeToWrap in
            Insert(rangeToWrap.location) { Line("```") }
            Insert(rangeToWrap.endLocation) { Line("```") }
        }

        // Move insertion point to the
        // position after the opening backticks
        Select(lineRange.location + length(of: "```"))
    }
}

Documentation

方法

我们操作 文本缓冲区 的抽象来执行更改。

这使得可以在多个缓冲区上一次性使用声明式 API,而无需将文本放入 UI 组件进行渲染。

NSTextView 是一个缓冲区。 您可以使用此声明式 API 对屏幕上的文本视图进行更改。

您还可以使用纯内存缓冲区对不想渲染的内容进行文本修改。 这使您能够将多个文件读入应用程序中的缓冲区,并使用声明式 API 更改其内容,同时仅在文本视图中渲染单个选定的文件。

许可证

版权所有 © 2024 Christian Tietze。 版权所有。 根据 MIT 许可证分发。

请参阅 LICENSE 文件。