Skip to main content

Qué es TextBuilder

TextBuilder es la clase para construir mediante encadenamiento de métodos los facets (anotaciones de rich text) que define el AT Protocol de Bluesky. El cuerpo de las publicaciones de Bluesky es texto plano, pero para mostrar menciones, enlaces y hashtags hay que enviar además un array facets que indica la posición (byte offset) y el tipo dentro del texto. TextBuilder calcula automáticamente esos offsets y construye el array.

Creación básica de texto

TextBuilder::make()

Crea una instancia indicando el texto inicial con TextBuilder::make(). El texto inicial se puede omitir.

text()

Con text() se añade texto al final.

newLine()

Añade un salto de línea. Con count puedes indicar el número de líneas (por defecto: 1).

toPost()

Convierte la instancia de TextBuilder en un record Post. Se puede pasar directamente a Bluesky::post().

Post::build()

También puedes usar Post::build() pasándole una clausura. Devuelve un Post.

Añadir menciones (@mention)

Con mention() se añade un facet de mención.

Resolución automática del DID

Si omites did, se resuelve automáticamente a partir del handle (se llama a Bluesky::resolveHandle()).

Indicar el DID explícitamente

Si ya conoces el DID, puedes pasarlo explícitamente para evitar la llamada a la API.
Si vas a usar muchas menciones en producción, cachea los DIDs para reducir las llamadas a la API.

Incluir enlaces (URL)

Con link() se añade un facet de enlace.
Si omites uri, se usa text como URI tal cual.

Añadir hashtags

Con tag() se añade un facet de hashtag.

Construir texto compuesto

Puedes combinar varios facets para crear textos de publicación enriquecidos.

Escritura con Post::build()

Integración con publicaciones

Combinado con Bluesky::post()

Combinado con el canal de Notification

En el método toBluesky() de BlueskyChannel puedes usar Post::build().

Detección automática de facets

También puedes detectar automáticamente @mention, URLs y #hashtag dentro del texto y añadir los facets.
detectFacets() se basa en expresiones regulares. Si quieres asegurar el enlace, es más fiable usar explícitamente link(), mention() o tag().

Añadir facets personalizados

Con el método facet() puedes añadir directamente un array de facet arbitrario.

Límite de caracteres y consideraciones

Byte offsets y graphemes

El índice de facet del AT Protocol se especifica en byte offsets UTF-8. Internamente TextBuilder usa strlen() para calcular el número de bytes. Los caracteres multibyte como el japonés o los emojis consumen varios bytes por carácter, así que el offset se determina por bytes, no por caracteres.

Límite de caracteres por publicación

Las publicaciones de Bluesky tienen un máximo de 300 caracteres en graphemes (caracteres visibles). El límite se aplica en graphemes, no en bytes, así que puedes escribir hasta 300 caracteres incluso en japonés.
El propio TextBuilder no verifica el número de caracteres. Si envías una publicación con más de 300 graphemes, la API del AT Protocol devolverá un error.

Lista de métodos

Última modificación el 13 de julio de 2026