Question

Comment puis-je implémenter une fonction diff , telle que l'historique de révision des questions de Stack Overflow?

Était-ce utile?

La solution

Vous avez ici un exemple javascript de la mise en oeuvre d'un algorithme diff.

Basé sur:

P. Heckel, une technique pour isoler les différences entre les fichiers Comm. ACM, 21 (4), 264-268 (1978).

L’implémentation elle-même a deux fonctions, dont l’une est recommandée:

diffString( String oldFile, String newFile )

Cette méthode prend deux chaînes et calcule les différences entre elles. Le résultat final est le 'nouveauFichier' marqué avec HTML (pour signifier les suppressions de l'ancienFichier et les ajouts au nouveauFichier).

Autres conseils

Je trouverais le code de l’utilitaire de diffusion FreeBSD et l’utiliserais comme base. Il ne sert à rien de réinventer les roues lorsque la licence permet ce type de copie.

La plupart des algorithmes sont basés sur LCS: La plus longue sous-séquence commune . Il n'est pas évident de le mettre en œuvre de manière efficace. Vous trouverez probablement diverses implémentations sur le Net, pour différentes langues.

Je suppose que le seul moyen serait de comparer chaque caractère formant les 2 chaînes. Quelque chose comme ça:


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
   }
}

Ceci est juste un croquis de la façon dont je le ferais. Tout dépend de ce que vous voulez faire avec les données.

Si vous voulez un historique de révision, ne réinventez pas la roue à partir de diff. Il suffit de tout jeter dans le contrôle de version et d’utiliser ses fonctions de diff et de journalisation. Pour un historique simple et linéaire, il suffit de RCS . Vous pouvez également lancer le dernier canon et utiliser git .

La plupart des utilitaires diff font un diff ligne par ligne. Le débordement de pile fait un diff mot à mot. Pour cela, quelque chose comme wdiff est nécessaire. La plupart des systèmes de contrôle de version vous permettent de brancher l'utilitaire diff. En sortie de boîte, git diff --color-words est remarquablement proche de ce qui se fait ici. En manipulant un peu les paramètres, vous pouvez probablement le faire cracher quelque chose que vous pouvez ensuite transformer en une jolie page Web.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top