Pergunta
Como posso implementar uma função diff
, como a história questão revisão do Stack Overflow?
Solução
Você tem aqui um javascript exemplo da implementação de um algoritmo diff.
Com base em:
P. Heckel, uma técnica para isolar as diferenças entre os arquivos Comm. ACM, 21, (4), 264--268 (1978).
A implementação, em si, tem duas funções, uma das quais é recomendado para uso:
diffString( String oldFile, String newFile )
Este método tem duas cordas e calcula as diferenças de cada um. O resultado final é o 'newFile' marcado com HTML (para significar ambas as deleções do velhoArquivo e adições ao newFile).
Outras dicas
eu iria encontrar o código para utilidade e utilização do FreeBSD diff que, como a linha de base. Não há nenhum ponto em rodas inventar re-quando a licença permite a este tipo de cópia.
A maioria dos algoritmos são baseados em LCS: livre Longest subsequência comum. Não é óbvio para implementá-lo de forma eficiente. Você provavelmente vai encontrar várias implementações na Net, para vários idiomas.
Eu acho que a única maneira seria comparar cada personagem formando as 2 strings. Algo parecido com isto:
void diff(String first,String second) {
int biggest = (first.length() > second.length()) ? first.length() : second.length();
for(int i = 0;i < biggest;i++) {
//compare each char from the longest string with each char from the shorter
// do something with them if they're not equal
}
}
Este é apenas um esboço de como eu faria isso. Tudo depende do que você quer fazer com os dados.
Se o que você quer é o histórico de revisões, não reinventar a roda a partir de diff. Apenas jogue tudo em controle de versão e utilizar as suas instalações diff e madeireiras. Para simples, história algo linear tão simples como RCS vai fazer. Ou você pode jogar o mais recente canhão para ele e usar git .
A maioria dos utilitários diff fazer uma comparação linha por linha. estouro de pilha faz um diff palavra por palavra. Para que algo como wdiff é necessário. A maioria dos sistemas de controle de versão permite que você conecte o diff. Fora da caixa, git diff --color-words
vem notavelmente perto o que é feito aqui. Com um pouco de mexer com as configurações que você provavelmente pode fazê-lo cuspir algo que você pode então fazer em uma página web bonito.