TextBuilder とは
TextBuilder は、Bluesky の AT Protocol が定義する facets(リッチテキスト注釈)をメソッドチェーンで組み立てるためのクラスです。
Bluesky の投稿本文はプレーンテキストですが、メンション・リンク・ハッシュタグを表示するためにはテキスト中の位置(バイトオフセット)と種別を示す facets 配列を一緒に送る必要があります。TextBuilder はこのオフセット計算と配列構築を自動的に行います。
基本的なテキスト作成
TextBuilder::make()
TextBuilder::make() で初期テキストを指定してインスタンスを生成します。初期テキストは省略可能です。
text()
text() でテキストを末尾に追加します。
newLine()
改行を追加します。count で行数を指定できます(デフォルト: 1)。
toPost()
TextBuilder インスタンスを Post レコードに変換します。Bluesky::post() に直接渡せます。
Post::build()
Post::build() にクロージャを渡す方法でも使えます。戻り値が Post になります。
メンション(@mention)の追加
mention() でメンション facet を追加します。
DID の自動解決
did を省略すると、ハンドルから DID を自動解決します(Bluesky::resolveHandle() が呼ばれます)。
DID を明示指定
DID が既にわかっている場合は明示的に渡すことで API 呼び出しを回避できます。リンク(URL)の埋め込み
link() でリンク facet を追加します。
uri を省略すると text がそのまま URI として使われます。
ハッシュタグの追加
tag() でハッシュタグ 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() を使ってバイト数を計算しています。
日本語・絵文字などのマルチバイト文字は 1 文字でも複数バイトを消費するため、文字数ではなくバイト数でオフセットが決まります。
投稿の文字数制限
Bluesky の投稿は grapheme(表示上の文字数)で最大 300 文字です。バイト数ではなく grapheme で制限されるため、日本語でも 300 文字書けます。TextBuilder 自体は文字数チェックを行いません。300 grapheme を超える投稿を送ると AT Protocol API がエラーを返します。メソッド一覧
Source: src/RichText/TextBuilder.php