Diff de texto

Compare dois textos e veja exatamente o que mudou, na vista lado a lado ou unificada, por linha ou por palavra.

Toda a comparação acontece localmente no seu navegador. Nada sai do seu dispositivo.

Como o diff funciona

Comparar dois textos é um problema clássico da ciência da computação: encontrar o conjunto mínimo de edições que transforma um no outro. Esta ferramenta o resolve com o algoritmo da maior subseqüência comum (LCS): encontra a sequência mais longa de linhas (ou palavras) compartilhada pelos dois textos na mesma ordem, e tudo o resto é reportado como adição ou remoção. Sem servidor, sem rede: apenas seus dois textos e um pouco de programação dinâmica no seu navegador.

LCS algorithm
Dadas duas sequências, a LCS pergunta: qual é a subseqüência mais longa de elementos presentes em ambas, na mesma ordem? Resolvida com programação dinâmica em O(n·m): uma tabela onde cada célula guarda a melhor resposta para os prefixes até aquele ponto. Percorrendo a tabela de trás para frente obtém-se o alinhamento — as linhas iguais coincidem e o resto são adições e remoções. O famoso utilitário diff do Unix usa técnicas estreitamente relacionadas.
Nível de linha vs nível de palavra
O nível de linha executa uma passada de LCS sobre linhas inteiras: rápido e legível, mas uma edição de uma única palavra em uma linha longa aparece como "a linha inteira mudou". O nível de palavra adiciona uma segunda passada: os pares de linhas alterados são re-comparados palavra por palavra, para que o destaque aponte exatamente quais palavras se moveram. Pense nele como um zoom sobre as linhas marcadas pela primeira passada.
Usos típicos
Revisar mudanças de código entre duas versões, comparar rascunhos de um documento, detectar erros de digitação entre duas cópias de texto, ou verificar se uma mudança de arquivo de configuração fez exatamente o que você pretendia. Os contadores (linhas adicionadas / linhas removidas) dão uma estimativa rápida do tamanho da mudança antes de ler o detalhe.

Perguntas frequentes

Qual algoritmo o diff usa?

O núcleo é o clássico algoritmo da maior subseqüência comum (LCS). Os dois textos são divididos em linhas, e a LCS encontra o maior conjunto de linhas que aparece em ambos, na mesma ordem. Linhas do original que não estão no modificado são remoções; linhas do modificado que não estão no original são adições. A programação dinâmica calcula isso em O(n·m).

Qual é a diferença entre o nível de linha e o de palavra?

O nível de linha trata cada linha inteira como uma unidade: se qualquer caractere de uma linha mudou, a linha inteira é marcada como removida (vermelho) e a substituição como adicionada (verde). O nível de palavra primeiro alinha as linhas como de costume e depois re-compara os pares de linhas alteradas palavra por palavra com uma segunda passada de LCS, para que você veja exatamente quais palavras foram inseridas ou removidas dentro de uma linha.

Funciona com código?

Sim. Cole duas versões de uma função, um arquivo de configuração ou o antes/depois de um commit e a ferramenta mostra as linhas alteradas. O nível de palavra é especialmente útil para código porque identifica o token exato que mudou em uma linha de resto longa.

O que as cores significam?

O fundo verde marca conteúdo adicionado no texto modificado; o fundo vermelho marca conteúdo removido do original. O conteúdo sem alterações não tem fundo. Os contadores acima da vista mostram quantas linhas foram adicionadas e removidas.

Meu texto é enviado para algum lugar?

Não. Ambos os textos e todo o cálculo da LCS rodam como JavaScript na aba do seu navegador. Nada é enviado, transmitido ou armazenado — feche a página e está perdido.