Générer du html très diff en Python
j'ai deux morceaux de texte que je voudrais comparer et voir quels mots/lignes ont été ajoutés/supprimés/modifiés en Python (similaire à la sortie Diff D'un Wiki).
j'ai essayé difflib.HtmlDiff mais sa sortie est moins que jolie.
y a-t-il un moyen en Python (ou bibliothèque externe) qui générerait du HTML à l'apparence propre de la diff de deux ensembles de morceaux de texte? (pas seulement le niveau de la ligne, mais aussi les modifications de mot/caractère à l'intérieur d'une ligne)
6 réponses
il y a diff_prettyHtml()
dans la bibliothèque diff-match-patch de Google.
en général, si vous voulez qu'un HTML rende plus joli, vous le faites en ajoutant CSS.
par exemple, si vous générez le HTML comme ceci:
import difflib
import sys
fromfile = "xxx"
tofile = "zzz"
fromlines = open(fromfile, 'U').readlines()
tolines = open(tofile, 'U').readlines()
diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile)
sys.stdout.writelines(diff)
puis vous obtenez les fonds verts sur les lignes ajoutées, le jaune sur les lignes changées et le rouge sur supprimé. Si je faisais cela je prendrais prendre le HTML généré, extraire le corps, et le préfixer avec mon propre bloc manuscrit de HTML avec beaucoup de CSS pour le faire paraître bon. Je voudrais aussi probablement enlevez la table de légende et déplacez-la vers le haut ou mettez-la dans une div de sorte que CSS puisse le faire.
en fait, je voudrais sérieusement envisager de simplement réparer le module difflib (qui est écrit en python) pour générer un meilleur HTML et le rendre au projet. Si vous avez un expert CSS pour vous aider ou si vous en êtes un vous-même, s'il vous plaît envisager de le faire.
j'ai récemment posté un script python qui fait exactement ceci: diff2HtmlCompare (suivez le lien pour une capture d'écran). Sous le capot il enroule difflib et utilise des pygments pour mettre en évidence la syntaxe.
Une copie de ma propre réponse ici .
à propos DaisyDiff ( Java et PHP des versions disponibles).
les caractéristiques suivantes sont vraiment jolies:
- Fonctionne avec mal formé HTML qui peut être trouvé dans la "nature".
- le diffing est plus spécialisé en HTML que l'arbre XML diffère. Changer une partie d'un noeud texte n'entraînera pas de modification de l'ensemble du noeud.
- en plus de la différence visuelle par défaut, la source HTML peut être diffusée de manière cohérente.
- fournit des descriptions faciles à comprendre des changements.
- L'interface graphique par défaut permet de parcourir facilement les modifications à l'aide de raccourcis clavier et de liens.
essayez tout d'abord de nettoyer les deux de HTML par lxml.html, et le check la différence par difflib