Quelqu'un a-t-il un algorithme de diff pour le rendu HTML? [fermé]


85

Je suis intéressé à voir un bon algorithme de diff, éventuellement en Javascript, pour rendre un diff côte à côte de deux pages HTML. L'idée serait que le diff montre les différences du HTML rendu .

Pour clarifier, je veux pouvoir voir les différences côte à côte en tant que sortie rendue. Donc, si je supprime un paragraphe, la vue côte à côte saurait espacer correctement les choses.


@Josh exactement. Bien que cela montre peut-être le texte supprimé en rouge ou quelque chose du genre. L'idée est que si j'utilise un éditeur WYSIWYG pour mon contenu HTML, je ne veux pas avoir à passer au HTML pour faire des différences. Je veux le faire avec deux éditeurs WYSIWYG côte à côte peut-être. Ou au moins afficher les diffs côte à côte de manière conviviale.


1
Est-ce vraiment piraté de Microsoft? l'original? : D
Ahmed Khalaf

1
Cela ressemble à cette question: stackoverflow.com/questions/1061468/html-compare
rjmunro

2
Vieux fil, mais j'ai pensé que je donnerais mes 2 cents. J'en ai beaucoup parlé
onassar

2
@Haacked, avez-vous déjà trouvé une solution satisfaisante?
DG.

@Haacked Vous avez trouvé une solution fonctionnelle? J'ai essayé prettydiff.commais on dirait qu'il est cassé.
coding_idiot

Réponses:


17

Il existe une autre astuce intéressante que vous pouvez utiliser pour améliorer considérablement l'apparence d'un diff HTML rendu. Bien que cela ne résout pas complètement le problème initial, cela fera une différence significative dans l'apparence de vos différences HTML rendues.

Le HTML rendu côte à côte rendra très difficile l'alignement vertical de votre diff. L'alignement vertical est crucial pour comparer les différences côte à côte. Afin d'améliorer l'alignement vertical d'un diff côte à côte, vous pouvez insérer des éléments HTML invisibles dans chaque version du diff à des «points de contrôle» où le diff doit être aligné verticalement. Ensuite, vous pouvez utiliser un peu de JavaScript côté client pour ajouter un espacement vertical autour du point de contrôle jusqu'à ce que les côtés s'alignent verticalement.

Expliqué un peu plus en détail:

Si vous souhaitez utiliser cette technique, exécutez votre algorithme de diff et insérez un groupe de visibility:hidden <span>s ou de minuscules <div>s partout où vos versions côte à côte doivent correspondre, selon le diff. Ensuite, exécutez JavaScript qui trouve chaque point de contrôle (et son voisin côte à côte) et ajoute un espacement vertical au point de contrôle qui est plus haut (moins profond) sur la page. Maintenant, votre diff HTML rendu sera aligné verticalement jusqu'à ce point de contrôle, et vous pouvez continuer à réparer l'alignement vertical sur le reste de votre page côte à côte.


17

Au cours du week-end, j'ai posté un nouveau projet sur codeplex qui implémente un algorithme HTML diff en C #. L'algorithme d'origine a été écrit en Ruby. Je crois comprendre que vous cherchiez une implémentation JavaScript, peut-être en avoir une disponible en C # avec le code source pourrait vous aider à porter l'algorithme. Voici le lien si vous êtes intéressé: htmldiff.codeplex.com . Vous pouvez en savoir plus ici .

MISE À JOUR: Cette bibliothèque a été déplacée vers GitHub .


4
L'algorithme HTMLDiff a été porté en JavaScript (CoffeeScript), ici .
Florian Parain

Salut @pate, je crois que ces liens ne fonctionnent plus ...
Tiago Cardoso

@TiagoCardoso a supprimé mon commentaire daté.
Petrus Theron

@Rohland Bibliothèque géniale! Vraiment sauvé ma journée :)
Sirar Salih

2
@Florian Parain: Merci d'avoir partagé le lien vers github.com/tnwinc/htmldiff.js cela fonctionne très bien! Astuce pour tous ceux qui veulent la version JS, installez simplement via "npm install htmldiff" puis utilisez htmldiff.js dans le répertoire "src".
Elijah Lofgren

4

J'ai fini par avoir besoin de quelque chose de similaire il y a quelque temps. Pour que le HTML s'aligne côte à côte, vous pouvez utiliser deux iFrames, mais vous devrez ensuite lier leur défilement via javascript lorsque vous faites défiler (si vous autorisez le défilement).

Pour voir la différence, cependant, vous voudrez probablement utiliser la bibliothèque de quelqu'un d'autre. J'ai utilisé DaisyDiff , une bibliothèque Java, pour un projet similaire où mon client était content de voir un seul rendu HTML du contenu avec un balisage de type «suivi des modifications» MS Word.

HTH


daisydiff semble gentil
coding_idiot

4

Pensez à utiliser la sortie de liens ou de lynx pour restituer une version texte uniquement du html, puis différez-la.


2

Qu'en est-il de DaisyDiff ( versions Java et PHP disponibles).

Les fonctionnalités suivantes sont vraiment intéressantes:

  • Fonctionne avec du HTML mal formé qui peut être trouvé "dans la nature".
  • Le diffing est plus spécialisé en HTML que l'arborescence XML diffère. Changer une partie d'un nœud de texte n'entraînera pas la modification du nœud entier.
  • En plus de la différence visuelle par défaut, la source HTML peut être différente de manière cohérente.
  • Fournit des descriptions faciles à comprendre des modifications.
  • L'interface graphique par défaut permet de parcourir facilement les modifications via des raccourcis clavier et des liens.

1

Alors tu t'attends

<font face="Arial">Hi Mom</font>

et

<span style="font-family:Arial;">Hi Mom</span>

être considéré comme le même?

La sortie dépend beaucoup de l'agent utilisateur. Comme le suggère Ionut Anghelcovici , créez une image. Faites-en un pour chaque navigateur qui vous intéresse.




0

Pour les différences plus petites, vous pourrez peut-être faire une différence de texte normale, puis analyser les éléments manquants ou insérés pour voir comment le résoudre, mais pour toute différence plus importante, vous aurez du mal à le faire.

Par exemple, comment pourriez-vous détecter et montrer qu'une image alignée à gauche (flottant à gauche d'un paragraphe de texte) s'est soudainement alignée à droite?


0

L'utilisation d'un texte différent cassera sur les documents non triviaux. En fonction de ce que vous pensez être intuitif, XML diffère générera probablement des différences qui ne sont pas très bonnes pour le texte avec balisage. AFAIK, DaisyDiff est la seule librairie spécialisée en HTML. Cela fonctionne très bien pour un sous-ensemble de HTML.


0

Si vous travailliez avec Java et XHTML, XMLUnit vous permet de comparer deux documents XML via la classe org.custommonkey.xmlunit.DetailedDiff :

Compare et décrit toutes les différences entre deux documents XML. La comparaison de documents ne s'arrête pas une fois que la première différence irrécupérable est trouvée, contrairement à la classe Diff.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.