メインコンテンツへスキップ

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 呼び出しを回避できます。
本番環境でメンションを多用する場合は、DID をキャッシュしておくと API 呼び出しを削減できます。

リンク(URL)の埋め込み

link() でリンク facet を追加します。
uri を省略すると text がそのまま URI として使われます。

ハッシュタグの追加

tag() でハッシュタグ 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() を使ってバイト数を計算しています。 日本語・絵文字などのマルチバイト文字は 1 文字でも複数バイトを消費するため、文字数ではなくバイト数でオフセットが決まります。

投稿の文字数制限

Bluesky の投稿は grapheme(表示上の文字数)で最大 300 文字です。バイト数ではなく grapheme で制限されるため、日本語でも 300 文字書けます。
TextBuilder 自体は文字数チェックを行いません。300 grapheme を超える投稿を送ると AT Protocol API がエラーを返します。

メソッド一覧

最終更新日 2026年4月26日