跳转到主要内容

什么是 TextBuilder

TextBuilder 是一个用来通过方法链构建 Bluesky AT Protocol 中 facets(富文本注解)的类。 Bluesky 的帖子正文本身是纯文本,但要显示 mention、链接、hashtag 时,必须一并发送 facets 数组来标记文本中位置(字节偏移)与类型。TextBuilder 会自动完成这些偏移计算和数组构造。

基本文本构建

TextBuilder::make()

通过 TextBuilder::make() 指定初始文本并创建实例。初始文本可省略。

text()

text() 将文本追加到末尾。

newLine()

添加换行。可通过 count 指定行数(默认: 1)。

toPost()

TextBuilder 实例转换为 Post record。可以直接传给 Bluesky::post()

Post::build()

也可以通过给 Post::build() 传闭包的方式使用,返回值就是 Post

添加 mention(@mention

通过 mention() 添加 mention facet。

自动解析 DID

省略 did 时会从 handle 自动解析 DID(会调用 Bluesky::resolveHandle())。

显式指定 DID

如果已经知道 DID,可以显式传入以避免 API 调用。
在生产环境中大量使用 mention 时,缓存 DID 可以减少 API 调用。

嵌入链接(URL)

通过 link() 添加 link facet。
省略 uri 时,text 会被直接当作 URI 使用。

添加 hashtag

通过 tag() 添加 hashtag facet。

构建复合文本

可以组合多个 facet 来生成富文本帖子。

使用 Post::build() 的写法

与发帖的整合

与 Bluesky::post() 结合

与 Notification 通道结合

可以在 BlueskyChanneltoBluesky() 方法中使用 Post::build()

facets 的自动检测

也可以自动检测文本中的 @mention、URL 和 #hashtag 并设置 facets。
detectFacets() 是基于正则表达式的检测。如果希望确保链接一定生效,明确调用 link() / mention() / tag() 更可靠。

添加自定义 facet

通过 facet() 方法可以直接添加任意的 facet 数组。

字数限制与注意事项

字节偏移与 grapheme

AT Protocol 的 facet 索引以 UTF-8 字节偏移 指定。TextBuilder 内部使用 strlen() 计算字节数。 中文、日文、emoji 等多字节字符即使只有一个字符也会占用多个字节,所以偏移是按 字节数 而不是 字符数 计算的。

帖子字数限制

Bluesky 帖子的限制是 按 grapheme(显示字符数)最多 300 个字符。限制是按 grapheme 而非字节数计算,所以中文、日文也能写满 300 字符。
TextBuilder 本身不做字数校验。如果发送超过 300 grapheme 的帖子,AT Protocol API 会返回错误。

方法一览

最后修改于 2026年7月18日