Uma execução do modelo de pesquisa multi-fonte produziu um bom relatório sobre instrumentos de investimento, e depois o imprimiu mal. Noventa e cinco marcadores no formato [^1] estavam dentro do texto corrido, e nove linhas no formato [^1]: se empilhavam embaixo. Tanto na web quanto no celular.
A causa é que notas de rodapé não fazem parte do markdown. É uma extensão, e nenhum dos dois motores de markdown que distribuímos — um na web, outro no celular — a implementa. Estávamos pedindo ao modelo exatamente esse formato, e depois exibindo como texto literal.
Um só reescritor, dois motores
Em vez de ensinar a mesma extensão para os dois renderizadores, os marcadores são reescritos antes de qualquer um dos dois vê-los, num link simples que os dois já exibem de forma idêntica. As definições são extraídas e devolvidas separadamente, e o que vinha depois delas permanece como o final do documento. Os colchetes ficam dentro do texto do link, então citações empilhadas se leem [1][2], não 12.
Na web, a citação é desenhada como sobrescrito, as definições são exibidas como uma lista com âncoras reais, clicar em uma rola até ela e pisca a linha, e o número na lista pula de volta para o primeiro lugar em que foi citada. Passar o mouse por cima mostra a definição sem mudar de lugar. No celular, os mesmos marcadores são desenhados na cor de destaque, e tocar em um rola o painel até a linha correspondente. Links que não são citações continuam abrindo num navegador, como antes.
Os cards de fontes abaixo de um relatório nunca foram afetados — eles vêm de outro lugar e sempre estiveram certos.
E no download
Um relatório que você baixa como .docx, .pdf ou .md passava por outro conversor, que imprimia os marcadores crus direto no documento. Uma especificação de documento não tem sobrescrito, então uma citação é impressa como [3], e cada definição abre sua própria linha começando com [3]. Linhas de continuação com recuo se juntam à sua definição. Os números no arquivo são os números da tela.
A primeira tentativa estava errada de um jeito para o qual já tínhamos proteção
A primeira versão transformava os números de nota de rodapé em simples links de fragmento — href="#fn-3". Sob o <base href="/"> que uma aplicação de página única precisa, um fragmento nu se resolve em relação à raiz do site, então o link aponta para a página inicial. O manipulador de clique cancelava a navegação, então funcionava — e continuaria funcionando até alguém mexer no manipulador.
Uma verificação que já tínhamos exatamente para esse padrão ficou vermelha na execução local antes do push. Os números agora são botões; eles rolam, movem o foco, e respeitam a preferência de movimento reduzido do leitor.