Escopo: diff linha a linha, via LCS
Divide os dois textos em linhas e calcula a maior subsequência comum (LCS) entre eles — o mesmo princípio usado pelo diff/Git. Linhas fora desse conjunto comum aparecem como removidas (texto antigo) ou adicionadas (texto novo). É comparação por linha inteira, não por palavra ou caractere: mudar uma letra no meio de uma linha marca a linha toda como alterada. Complexidade O(n×m) — textos com dezenas de milhares de linhas podem ficar lentos.
Casos de uso
- Revisar o diff de um PR sem abrir o Git, colando a versão antiga e a nova de um arquivo
- Comparar duas versões de um contrato, config ou arquivo de ambiente (
.env, YAML) para achar o que mudou - Conferir se uma tradução ou texto gerado por IA divergiu do original linha a linha
- Checar edições em documentação ou changelog antes de publicar
Tudo roda no navegador via JavaScript — nada do conteúdo colado é enviado a um servidor.
Como o LCS decide o que mudou
Um diff não compara linha 1 com linha 1, linha 2 com linha 2. Se fizesse isso, inserir uma única linha no topo marcaria o arquivo inteiro como alterado.
O que o algoritmo faz é procurar a maior subsequência comum — o maior conjunto de linhas que aparece nos dois textos, na mesma ordem, ainda que não de forma contígua. Essas linhas são o "esqueleto" que os dois textos compartilham e ficam marcadas como inalteradas. Tudo que sobra do lado antigo é remoção; tudo que sobra do lado novo é inserção.
É o mesmo princípio do diff do Unix e do Git, e é por isso que o resultado costuma coincidir com o que você veria em um pull request.
Comparação por linha inteira
A granularidade aqui é a linha. Mudar uma letra no meio de uma frase marca a linha inteira como removida e a nova como adicionada — não há destaque do caractere específico que mudou.
Isso tem uma implicação prática relevante para texto corrido: um parágrafo longo que ocupa uma única linha aparece como totalmente reescrito mesmo que só uma palavra tenha mudado. Se você compara documentos em prosa e precisa enxergar a alteração exata, quebrar o texto em linhas mais curtas — uma frase por linha, por exemplo — melhora bastante a leitura do resultado.
Diferenças invisíveis
A causa mais frustrante de "está tudo marcado como diferente, mas parece igual" são caracteres que você não vê:
- Fim de linha. Windows usa CRLF, Unix e macOS usam LF. Um arquivo que passou por sistemas diferentes pode ter todas as linhas marcadas como alteradas.
- Espaço no fim da linha. Invisível na tela, contabilizado na comparação.
- Tabulação contra espaços. Renderizam parecido, são bytes distintos.
- Espaços não separáveis. Texto copiado de página web ou de editor de documentos frequentemente traz
U+00A0no lugar do espaço comum. - Acentos compostos. A letra "á" pode ser um único ponto de código ou a letra "a" seguida do acento combinante — visualmente idênticos, diferentes na comparação.
Quando o diff acusa mudança em toda parte sem motivo aparente, um desses é quase sempre o culpado.
Desempenho
O algoritmo tem complexidade O(n×m), onde n e m são as quantidades de linhas dos dois textos. Isso é confortável para arquivos de configuração, contratos e trechos de código, mas cresce rápido: dois arquivos de dezenas de milhares de linhas exigem centenas de milhões de comparações e podem travar a aba por alguns segundos.
Para arquivos muito grandes, o caminho é o diff ou o git diff na linha de comando, que usam variantes otimizadas do algoritmo.
Como todo o processamento acontece no seu navegador, dá para comparar contratos, arquivos de ambiente e código proprietário sem que nada saia da máquina. Para conferir se dois textos diferem apenas em acentuação, o removedor de acentos ajuda a normalizar antes da comparação.