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()을 사용해 바이트 수를 계산합니다.
한국어·이모지 등 멀티바이트 문자는 한 글자라도 여러 바이트를 소비하므로, 글자 수가 아니라 바이트 수로 오프셋이 결정됩니다.
게시의 문자 수 제한
Bluesky의 게시는 grapheme(표시상의 글자 수)로 최대 300자입니다. 바이트 수가 아닌 grapheme로 제한되므로, 한국어에서도 300자를 쓸 수 있습니다.TextBuilder 자체는 문자 수 체크를 하지 않습니다. 300 grapheme를 초과하는 게시를 보내면 AT Protocol API가 에러를 반환합니다.메서드 목록
Source: src/RichText/TextBuilder.php