什麼是 TextBuilder
TextBuilder 是以方法鏈組合 Bluesky AT Protocol 所定義的 facets(富文字註記)的類別。
Bluesky 貼文本文為純文字,但若要顯示 mention、連結、hashtag,需要同時傳送標示文字中位置(位元組偏移)與種類的 facets 陣列。TextBuilder 會自動處理這些偏移計算與陣列建構。
基本文字建立
TextBuilder::make()
以TextBuilder::make() 指定初始文字並產生實體。初始文字可省略。
text()
以text() 於末尾追加文字。
newLine()
加入換行。可透過count 指定行數(預設:1)。
toPost()
將TextBuilder 實體轉換為 Post 記錄,可直接傳入 Bluesky::post()。
Post::build()
也可透過將閉包傳入Post::build() 的方式使用。回傳值為 Post。
加入 mention(@mention)
以 mention() 加入 mention facet。
DID 自動解析
若省略did,會從 handle 自動解析 DID(會呼叫 Bluesky::resolveHandle())。
明確指定 DID
若已知 DID,明確傳入即可避免 API 呼叫。嵌入連結(URL)
以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 等多位元組字元即使 1 個字元也會佔用多個位元組,因此偏移由位元組數而非字元數決定。
貼文字數限制
Bluesky 的貼文限制為 grapheme(顯示上的字數)最多 300 字元。限制以 grapheme 而非位元組數計,因此中文也可撰寫 300 字。TextBuilder 本身不執行字數檢查。若送出超過 300 grapheme 的貼文,AT Protocol API 會回傳錯誤。方法列表
Source:src/RichText/TextBuilder.php