什么是 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 调用。嵌入链接(URL)
通过link() 添加 link facet。
uri 时,text 会被直接当作 URI 使用。
添加 hashtag
通过tag() 添加 hashtag facet。
构建复合文本
可以组合多个 facet 来生成富文本帖子。使用 Post::build() 的写法
与发帖的整合
与 Bluesky::post() 结合
与 Notification 通道结合
可以在BlueskyChannel 的 toBluesky() 方法中使用 Post::build()。
facets 的自动检测
也可以自动检测文本中的@mention、URL 和 #hashtag 并设置 facets。
添加自定义 facet
通过facet() 方法可以直接添加任意的 facet 数组。
字数限制与注意事项
字节偏移与 grapheme
AT Protocol 的 facet 索引以 UTF-8 字节偏移 指定。TextBuilder 内部使用 strlen() 计算字节数。
中文、日文、emoji 等多字节字符即使只有一个字符也会占用多个字节,所以偏移是按 字节数 而不是 字符数 计算的。
帖子字数限制
Bluesky 帖子的限制是 按 grapheme(显示字符数)最多 300 个字符。限制是按 grapheme 而非字节数计算,所以中文、日文也能写满 300 字符。TextBuilder 本身不做字数校验。如果发送超过 300 grapheme 的帖子,AT Protocol API 会返回错误。方法一览
Source: src/RichText/TextBuilder.php