Na manhã de 21 de setembro, o repositório libprisma — a biblioteca que o Telegram usa para colorir blocos de código em mensagens — recebeu doze alterações em apenas três horas. Foram adicionados Tolk, a linguagem principal de smart contracts do TON, atualizados os definidores para Tact e FunC, e, pela primeira vez desde 20 de novembro de 2023, o arquivo principal foi recompilado — o mesmo que os aplicativos leem ao iniciar.
Por enquanto, isso ainda não é visível nos aplicativos. Cada cliente carrega sua própria cópia da tabela de linguagens, e todas as três versões estão datadas de 2023.

Como o Telegram colora o código
O bloco de código em uma mensagem é analisado pelo próprio cliente, não pelo servidor. Responsável por isso é o libprisma — uma portagem da biblioteca web Prism.js para C++, lançada pelo Telegram no outono de 2023. As regras de linguagem são geradas a partir de dois locais: do pacote Prism.js e de arquivos específicos escritos diretamente no repositório, onde estão as linguagens TON. Esses arquivos passam por normalização, são combinados e compilados em um único arquivo binário chamado grammars.dat. O cliente carrega esse arquivo ao iniciar e, a partir daí, consulta-o para identificar tokens em cada bloco de código — palavras-chave, strings, comentários, etc.
Esse arquivo é, na verdade, a lista completa de linguagens suportadas. Se uma linguagem não estiver na tabela, o bloco permanece como texto monoespaciado cinza — mesmo que o autor tenha marcado corretamente com tolk após três acentos graves.
No Android, o funcionamento é diferente: o motor Prism foi reescrito em Java, e a tabela está em um arquivo próprio, codelng.gzip, que chegou com a versão 10.2 no final de outubro de 2023. A diferença entre os motores de expressões regulares — Boost em C++ e java.util.regex em Java — acabou sendo a principal causa de o número de alterações chegar a doze, e não apenas duas.
Por que as linguagens TON ainda aparecem cinzas
Elas permanecem cinzas não porque ninguém tenha escrito regras para elas. As definições de quatro linguagens — Tact, FunC, Fift e TL-B — foram incluídas nos fontes do libprisma em maio de 2024. Quatro meses depois, foram adicionadas atualizações: Tact passou da versão 1.2.0 para 1.6.0, e FunC foi reescrito por completo, de 0.2.0 para 0.4.4.
Nenhuma dessas mudanças chegou aos aplicativos — e a culpa não está nos aplicativos. As regras de linguagem vivem no repositório como arquivos comuns, mas os clientes leem uma tabela binária compilada a partir delas. Essa tabela foi compilada pela última vez em 20 de novembro de 2023, seis meses antes do primeiro código TON chegar ao repositório. Tudo o que foi adicionado depois ficou nos fontes e nunca foi distribuído.
A compilação é feita por um workflow no GitHub Actions, que parou de rodar desde então: o GitHub retirou do uso a ação actions/upload-artifact@v3, fazendo com que a tarefa fosse marcada como falha antes mesmo de executar o primeiro passo. A atualização de Tact e FunC ficou pendente por dois anos.
Tolk é uma história à parte. A linguagem surgeu como evolução do FunC e agora é recomendada na documentação do TON, enquanto o próprio FunC foi movido para o grupo de linguagens obsoletas. O Tolk foi proposto no repositório em maio de 2026 e permaneceu como rascunho com a anotação de que primeiro era preciso definir como distribuir essa atualização para todos os clientes.
O que aconteceu em 21 de setembro
Primeiro, consertaram o processo de compilação. As versões das ações foram atualizadas, o Node 18 foi substituído pelo 22, e a tarefa voltou a rodar — manualmente e automaticamente sempre que as regras mudam — gerando um pull request com a tabela recompilada. Depois, aceitaram o Tolk e as atualizações de Tact e FunC.
Durante a atualização, foi encontrada uma falha: o FunC não estava sendo colorido corretamente. A regra para operadores-função (_+_, _<=>_ e outros, onde os sublinhados indicam os espaços para argumentos) era gerada a partir de outra regra, e a verificação final exigia um espaço exatamente na posição onde deveria estar o sublinhado de fechamento — condição impossível de ser atendida, fazendo com que a regra nunca fosse acionada.
As demais alterações não envolvem TON, mas explicam por que uma única tabela serve para dois motores. O Boost lê expressões por bytes e não entende a sintaxe \uXXXX: dentro de um conjunto de caracteres, essa notação se transforma em uma sequência de caracteres ASCII aleatórios. No Dhall, isso fez com que o conjunto de operadores devorasse a primeira letra de cada nome de tipo, e o quantificador ∀ não era destacado em nenhuma linguagem onde estava definido. A serialização da tabela cortava o byte mais significativo de caracteres fora dos primeiros 256, fazendo com que o símbolo • do BQN chegasse como aspas duplas, ∞ como caractere de controle e π como a letra À.
A terceira correção trata da diferença entre motores. O \v é compilado de formas diferentes em cada um: em um, é um único caractere de tabulação vertical; no outro, é todo o conjunto de espaços verticais junto com a quebra de linha. Isso fazia com que valores em arquivos ini escapassem do final da linha. Como a verificação "compila?" não detecta esse problema, agora a tabela é recompilada para cada pull request, e cada uma das quase quatro mil expressões é testada nos dois motores.
Quando isso será visto nos aplicativos
Nenhum dos clientes tem uma data definida para a atualização. As tabelas não são baixadas em tempo real do repositório — cada um carrega sua própria cópia, e todas são mais antigas que o primeiro código TON no libprisma.
| Cliente | Origem da tabela | Data da cópia |
|---|---|---|
| Telegram Desktop | fork do libprisma, fixado como submódulo | abril de 2024, tabela interna — novembro de 2023 |
| Telegram para iOS | arquivo grammars.dat no próprio repositório do cliente | 31 de outubro de 2023 |
| Telegram para Android | arquivo codelng.gzip nos recursos do aplicativo | 28 de outubro de 2023 |
Atualizar a cópia é responsabilidade de cada equipe de desenvolvimento. No rascunho do Tolk, isso está explícito: o pull request aguarda resposta sobre como distribuir a nova tabela para todos os aplicativos. Enquanto não houver resposta, blocos marcados com tolk, tact ou func continuarão aparecendo na conversa exatamente como estavam ontem.



