difflib HTML-output auf Wort-basis?
Hi, ich möchte Texte vergleichen und dabei die Änderungen möglichst auf Basis von Wörtern angezeigt bekommen. Der Output soll dabei side-by-side sein, so wie difflib.HtmlDiff es erzeugt. Leider ist difflib.HtmlDiff zu grob, es markiert schnell große Bereiche als geändert, auch wenn sich darin nur in mehreren Zeilen ein paar Wörter geändert haben. Mein Ziel ist in etwas das, was emacs' ediff macht oder github (siehe z.B. https://github.com/htgoebel/gitflow/commit/381443a) Hat jemand einen Tipp für mich? -- Schönen Gruß Hartmut Goebel Dipl.-Informatiker (univ), CISSP, CSSLP Goebel Consult http://www.goebel-consult.de Monatliche Kolumne: http://www.cissp-gefluester.de/2011-02-fleisige-datensammler-fur-lukratives-... Blog: http://www.goebel-consult.de/blog/20050620 Goebel Consult ist Mitglied bei http://www.7-it.de/
Hi Hartmut, On 2013-04-30 12:27, Hartmut Goebel wrote:
ich möchte Texte vergleichen und dabei die Änderungen möglichst auf Basis von Wörtern angezeigt bekommen. Der Output soll dabei side-by-side sein, so wie difflib.HtmlDiff es erzeugt. Leider ist difflib.HtmlDiff zu grob, es markiert schnell große Bereiche als geändert, auch wenn sich darin nur in mehreren Zeilen ein paar Wörter geändert haben.
Mein Ziel ist in etwas das, was emacs' ediff macht oder github (siehe z.B. https://github.com/htgoebel/gitflow/commit/381443a)
Hat jemand einen Tipp für mich?
Trac [1] - in Python geschrieben - macht so etwas auch, siehe [2]. Möglicherweise kannst du sogar direkt Quelltext von Trac übernehmen. Ich hatte mir schon mal überlegt, wie man so etwas machen könnte und kam auf die Idee, für jedes Zeichen eine Zeile zu erzeugen und das Ergebnis zu "diffen". "Etwas knifflig" könnte die spätere Rück-Konvertierung in Zeilen sein. (Ich habe jetzt keine Ahnung, _wie_ knifflig tatsächlich. ;-) ) [1] http://trac.edgewall.org [2] http://ftputil.sschwarzer.net/trac/changeset/26c02d135501ab93dbe3d8d9ad13fe2... Viele Grüße Stefan
Hi, Am Dienstag, 30. April 2013 schrieb Stefan Schwarzer :
Hi Hartmut,
On 2013-04-30 12:27, Hartmut Goebel wrote:
ich möchte Texte vergleichen und dabei die Änderungen möglichst auf Basis von Wörtern angezeigt bekommen. Der Output soll dabei side-by-side sein, so wie difflib.HtmlDiff es erzeugt. Leider ist difflib.HtmlDiff zu grob, es markiert schnell große Bereiche als geändert, auch wenn sich darin nur in mehreren Zeilen ein paar Wörter geändert haben.
wir haben in Rietveld ein Modul, das ähnlichen Output erzeugt: https://code.google.com/p/rietveld/source/browse/codereview/intra_region_dif... Das hat ein paar Abhängigkeiten zur Applikation selbst, aber man müsste auch einiges übernehmen können. Beste Grüße, Andi
Mein Ziel ist in etwas das, was emacs' ediff macht oder github (siehe z.B. https://github.com/htgoebel/gitflow/commit/381443a)
Hat jemand einen Tipp für mich?
Trac [1] - in Python geschrieben - macht so etwas auch, siehe [2]. Möglicherweise kannst du sogar direkt Quelltext von Trac übernehmen.
Ich hatte mir schon mal überlegt, wie man so etwas machen könnte und kam auf die Idee, für jedes Zeichen eine Zeile zu erzeugen und das Ergebnis zu "diffen". "Etwas knifflig" könnte die spätere Rück-Konvertierung in Zeilen sein. (Ich habe jetzt keine Ahnung, _wie_ knifflig tatsächlich. ;-) )
[1] http://trac.edgewall.org [2] http://ftputil.sschwarzer.net/trac/changeset/26c02d135501ab93dbe3d8d9ad13fe2...
Viele Grüße Stefan _______________________________________________ python-de maillist - python-de@python.org javascript:; http://mail.python.org/mailman/listinfo/python-de
Um das ganze zu komplettieren, hier ist der diff2html code von moin2
http://hg.moinmo.in/moin/2.0/file/979c2ee641ac/MoinMoin/util/diff_html.py
Gruß
Reimar
2013/4/30 Andi Albrecht
Hi,
Am Dienstag, 30. April 2013 schrieb Stefan Schwarzer :
Hi Hartmut,
On 2013-04-30 12:27, Hartmut Goebel wrote:
ich möchte Texte vergleichen und dabei die Änderungen möglichst auf Basis von Wörtern angezeigt bekommen. Der Output soll dabei side-by-side sein, so wie difflib.HtmlDiff es erzeugt. Leider ist difflib.HtmlDiff zu grob, es markiert schnell große Bereiche als geändert, auch wenn sich darin nur in mehreren Zeilen ein paar Wörter geändert haben.
wir haben in Rietveld ein Modul, das ähnlichen Output erzeugt: https://code.google.com/p/rietveld/source/browse/codereview/intra_region_dif...
Das hat ein paar Abhängigkeiten zur Applikation selbst, aber man müsste auch einiges übernehmen können.
Beste Grüße,
Andi
Mein Ziel ist in etwas das, was emacs' ediff macht oder github (siehe z.B. https://github.com/htgoebel/gitflow/commit/381443a)
Hat jemand einen Tipp für mich?
Trac [1] - in Python geschrieben - macht so etwas auch, siehe [2]. Möglicherweise kannst du sogar direkt Quelltext von Trac übernehmen.
Ich hatte mir schon mal überlegt, wie man so etwas machen könnte und kam auf die Idee, für jedes Zeichen eine Zeile zu erzeugen und das Ergebnis zu "diffen". "Etwas knifflig" könnte die spätere Rück-Konvertierung in Zeilen sein. (Ich habe jetzt keine Ahnung, _wie_ knifflig tatsächlich. ;-) )
[1] http://trac.edgewall.org [2] http://ftputil.sschwarzer.net/trac/changeset/26c02d135501ab93dbe3d8d9ad13fe2...
Viele Grüße Stefan _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
_______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
Reimar Bauer, 30.04.2013 22:02:
2013/4/30 Andi Albrecht
Am Dienstag, 30. April 2013 schrieb Stefan Schwarzer :
On 2013-04-30 12:27, Hartmut Goebel wrote:
ich möchte Texte vergleichen und dabei die Änderungen möglichst auf Basis von Wörtern angezeigt bekommen. Der Output soll dabei side-by-side sein, so wie difflib.HtmlDiff es erzeugt. Leider ist difflib.HtmlDiff zu grob, es markiert schnell große Bereiche als geändert, auch wenn sich darin nur in mehreren Zeilen ein paar Wörter geändert haben.
Mein Ziel ist in etwas das, was emacs' ediff macht oder github (siehe z.B. https://github.com/htgoebel/gitflow/commit/381443a)
Hat jemand einen Tipp für mich?
Trac [1] - in Python geschrieben - macht so etwas auch, siehe [2]. Möglicherweise kannst du sogar direkt Quelltext von Trac übernehmen.
Ich hatte mir schon mal überlegt, wie man so etwas machen könnte und kam auf die Idee, für jedes Zeichen eine Zeile zu erzeugen und das Ergebnis zu "diffen". "Etwas knifflig" könnte die spätere Rück-Konvertierung in Zeilen sein. (Ich habe jetzt keine Ahnung, _wie_ knifflig tatsächlich. ;-) )
[1] http://trac.edgewall.org [2] http://ftputil.sschwarzer.net/trac/changeset/26c02d135501ab93dbe3d8d9ad13fe2...
wir haben in Rietveld ein Modul, das ähnlichen Output erzeugt: https://code.google.com/p/rietveld/source/browse/codereview/intra_region_dif...
Das hat ein paar Abhängigkeiten zur Applikation selbst, aber man müsste auch einiges übernehmen können.
Um das ganze zu komplettieren, hier ist der diff2html code von moin2
http://hg.moinmo.in/moin/2.0/file/979c2ee641ac/MoinMoin/util/diff_html.py
Klingt für mich jetzt erstmal so, als hätten sich einige Projekte da Arbeit ersparen können, wenn sie zusammen gearbeitet hätten. Aber vielleicht ist es dazu ja noch nicht zu spät. Stefan
Am 01.05.2013 06:30, schrieb Stefan Behnel:
On 2013-04-30 12:27, Hartmut Goebel wrote:
Entschuldigt bitte, dass ich mich erst heute wieder melde. Ich hatte anderes um die Ohren. Herzlichen Dank für die Anregungen. Ich habe mich für die Implementierung von MoinMoin entscheiden, weil ich damit am schnellsten zum Ziel zu gelangen dachte. Hier kurz meine Entscheidungsfindung: diff_html von MointMoin hat wenig Abhängigkeiten und einen klaren Einsprung-Punkt. Es liefert eine Liste von Tupeln mit Zeilennummern und den Texten. Daraus lässt sich sehr einfach einen HTML-Tabelle bauen, wie ich sie brauche. Die Schnittstelle von rietveld habe ich nicht binnen fünf Minuten verstanden. Nachdem ich die von MoinMoin schon hatte, sah ich wenig Sinn darin, es noch länger zu versuchen -- in der Zeit habe ich wahrscheinlich den benötigten Wrapper um den Output von MoinMoin diff_html geschrieben. Trac habe ich mir dann überhaupt nicht mehr angesehen.
Klingt für mich jetzt erstmal so, als hätten sich einige Projekte da Arbeit ersparen können, wenn sie zusammen gearbeitet hätten. Aber vielleicht ist es dazu ja noch nicht zu spät. Stefan
Das kann ich nur unterschreiben. Ich verstehe auch nicht, weshalb rietveld nicht auf der difflib aufsetzt -- vielleicht ist es älter als die (trac ist sicher älter). Die difflib zu verwenden, macht die Anwendung zudem flexibler. Man kann dann leicht den `Levenshtein`__ `String-Matcher`__ einbauen und damit "geringe" Unterschiede ausblenden. __`http://de.wikipedia.org/wiki/Levenshtein-Distanz` __`https://pypi.python.org/pypi/python-Levenshtein` -- Schönen Gruß Hartmut Goebel Dipl.-Informatiker (univ), CISSP, CSSLP Goebel Consult http://www.goebel-consult.de Monatliche Kolumne: http://www.cissp-gefluester.de/2011-02-fleisige-datensammler-fur-lukratives-... Blog: http://www.goebel-consult.de/blog/20060215 Goebel Consult ist Mitglied bei http://www.7-it.de/
Hartmut Goebel, 13.05.2013 15:32:
Am 01.05.2013 06:30, schrieb Stefan Behnel:
Klingt für mich jetzt erstmal so, als hätten sich einige Projekte da Arbeit ersparen können, wenn sie zusammen gearbeitet hätten. Aber vielleicht ist es dazu ja noch nicht zu spät. Stefan
Das kann ich nur unterschreiben. Ich verstehe auch nicht, weshalb rietveld nicht auf der difflib aufsetzt -- vielleicht ist es älter als die (trac ist sicher älter).
Rietveld ist wesentlich jünger als die difflib, auch als alle anderen hier erwähnten Tools. Meine Vermutung ist eher, dass es sich als Hervorkömmling aus Guidos "We Are Google" Zeit dem "Nicht Von Uns" Hirnschema unterordnen musste. Stefan
2013/5/14 Stefan Behnel
Hartmut Goebel, 13.05.2013 15:32:
Am 01.05.2013 06:30, schrieb Stefan Behnel:
Klingt für mich jetzt erstmal so, als hätten sich einige Projekte da Arbeit ersparen können, wenn sie zusammen gearbeitet hätten. Aber vielleicht ist es dazu ja noch nicht zu spät. Stefan
Das kann ich nur unterschreiben. Ich verstehe auch nicht, weshalb rietveld nicht auf der difflib aufsetzt -- vielleicht ist es älter als die (trac ist sicher älter).
Rietveld ist wesentlich jünger als die difflib, auch als alle anderen hier erwähnten Tools. Meine Vermutung ist eher, dass es sich als Hervorkömmling aus Guidos "We Are Google" Zeit dem "Nicht Von Uns" Hirnschema unterordnen musste.
Was ist denn das "Nicht Von Uns"-Hirnschema? intra_regio_diff ist schlichtweg ein Modul, dass als Hilfsmodul in einer Applikation entstanden ist, jetzt in dieser Applikation lebt und nie den Sprung zu einem allein stehenden Python-Modul geschafft hat, auch wenn dies möglich wäre. Ich denke, dass es in all den Python-Anwendungen da draußen tausende Module dieser Art gibt :) Beste Grüße, Andi
Stefan
_______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
Am 14.05.2013 um 07:42 schrieb Stefan Behnel:
Hartmut Goebel, 13.05.2013 15:32:
Am 01.05.2013 06:30, schrieb Stefan Behnel:
Klingt für mich jetzt erstmal so, als hätten sich einige Projekte da Arbeit ersparen können, wenn sie zusammen gearbeitet hätten. Aber vielleicht ist es dazu ja noch nicht zu spät. Stefan
Das kann ich nur unterschreiben. Ich verstehe auch nicht, weshalb rietveld nicht auf der difflib aufsetzt -- vielleicht ist es älter als die (trac ist sicher älter).
Rietveld ist wesentlich jünger als die difflib, auch als alle anderen hier erwähnten Tools. Meine Vermutung ist eher, dass es sich als Hervorkömmling aus Guidos "We Are Google" Zeit dem "Nicht Von Uns" Hirnschema unterordnen musste.
Wenn ich das richtig sehe, dann benutzt rietveld intern sehr wohl difflib, wenn auch nur difflib.SequenceMatcher und zwar hier: rietveld/codereview/engine.py rietveld/codereview/intra_region_diff.py rietveld/codereview/patching.py rietveld/codereview/patiencediff.py Allerdings benutzt es nicht difflib.HtmlDiff, was anscheinend der Stein des Anstoßes hier ist, richtig? Nun, vielleicht hat es nicht das gemacht, was der BDFL brauchte. Mich irritiert eher, das bei einem solchen Tool, das sich um die Ver- besserung der Codequalität verdient machen will, an keiner Stelle er- klärt wird, wofür der Name "Rietveld" steht? Ist es nach Gerrit Rietveld (einem Architekten) oder Hugo Rietveld (einem Physiker) benannt (beide Niederländer, klar), und warum? Oder hat jemand einfach seinen Namens- generator angeworfen? Gruß, Dinu
Dinu, Mich irritiert eher, das bei einem solchen Tool, das sich um die Ver-
besserung der Codequalität verdient machen will, an keiner Stelle er- klärt wird, wofür der Name "Rietveld" steht? Ist es nach Gerrit Rietveld (einem Architekten) oder Hugo Rietveld (einem Physiker) benannt (beide Niederländer, klar), und warum? Oder hat jemand einfach seinen Namens- generator angeworfen?
das wurde vom BDFL auf einer Konferenz verkündet, es ist nach dem Architekten Gerrit Rietveld benannt. Ist halt wie in allen großen Weltbewegungen, es reicht irgendwann nicht mehr, die Schrift alleine zu lesen, auch die Kommentare und die Protokolle der gesprochenen Worte des BDFL zählen zum Kanon. Gruß Harald -- GHUM GmbH Harald Armin Massa Spielberger Straße 49 70435 Stuttgart 0173/9409607 Amtsgericht Stuttgart, HRB 734971
Hi Dinu,
2013/5/16 Dinu Gherman
Am 14.05.2013 um 07:42 schrieb Stefan Behnel:
Hartmut Goebel, 13.05.2013 15:32:
Am 01.05.2013 06:30, schrieb Stefan Behnel:
Klingt für mich jetzt erstmal so, als hätten sich einige Projekte da Arbeit ersparen können, wenn sie zusammen gearbeitet hätten. Aber vielleicht ist es dazu ja noch nicht zu spät. Stefan
Das kann ich nur unterschreiben. Ich verstehe auch nicht, weshalb rietveld nicht auf der difflib aufsetzt -- vielleicht ist es älter als die (trac ist sicher älter).
Rietveld ist wesentlich jünger als die difflib, auch als alle anderen hier erwähnten Tools. Meine Vermutung ist eher, dass es sich als Hervorkömmling aus Guidos "We Are Google" Zeit dem "Nicht Von Uns" Hirnschema unterordnen musste.
Wenn ich das richtig sehe, dann benutzt rietveld intern sehr wohl difflib, wenn auch nur difflib.SequenceMatcher und zwar hier:
rietveld/codereview/engine.py rietveld/codereview/intra_region_diff.py rietveld/codereview/patching.py rietveld/codereview/patiencediff.py
Allerdings benutzt es nicht difflib.HtmlDiff, was anscheinend der Stein des Anstoßes hier ist, richtig? Nun, vielleicht hat es nicht das gemacht, was der BDFL brauchte.
Mich irritiert eher, das bei einem solchen Tool, das sich um die Ver- besserung der Codequalität verdient machen will, an keiner Stelle er- klärt wird, wofür der Name "Rietveld" steht? Ist es nach Gerrit Rietveld (einem Architekten) oder Hugo Rietveld (einem Physiker) benannt (beide Niederländer, klar), und warum? Oder hat jemand einfach seinen Namens- generator angeworfen?
die Namensgebung und das warum ist ausführlich im Projekt-Wiki beschrieben: https://code.google.com/p/rietveld/wiki/CodeReviewBackground Beste Grüße, Andi
Gruß,
Dinu
_______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
Andi Albrecht:
die Namensgebung und das warum ist ausführlich im Projekt-Wiki beschrieben: https://code.google.com/p/rietveld/wiki/CodeReviewBackground
Aha, na dann. Vielleicht bin ich da pedantisch, aber ich finde, so eine Information gehört in die Distribution, ins Readme. Oder so, wie es z.B. Django macht (in docs/faq/general.txt unter "What does "Django" mean, and how do you pronounce it?") oder Python selbst (Doc/faq/general.rst, unter "Why is it called Python?"). Aber wie gesagt, ich will das nicht zum Aufreger machen, auch wenn ich da vielleicht ein wenig der alten Schule anhänge... BTW, hat jemand mal versucht, für solche diffs ein bischen echte "rocket science" zu benutzen? Ich denke da an Sequenzanalysen aus dem Mol-Bio- Bereich, siehe biopython.org. Gruß, Dinu
Am 16.05.2013 17:37, schrieb Dinu Gherman:
Allerdings benutzt es nicht difflib.HtmlDiff, was anscheinend der Stein des Anstoßes hier ist, richtig?
Nee, das meinte ich nicht. Denn er Output von HtmlDiff ist ja genau *nicht* passend für das, was ich suchte. Das reitveld den SequenceMatcher verwendet habe ich schlicht übersehen. Wie geschrieben schien es mit zu aufwändig, das mit das Interface zu verstehen und habe mir Rietveld daher gar nicht so genau angesehen. -- Schönen Gruß Hartmut Goebel Dipl.-Informatiker (univ), CISSP, CSSLP Goebel Consult http://www.goebel-consult.de Monatliche Kolumne: http://www.cissp-gefluester.de/2011-08-horrorszenario-bring-your-own-device Blog: http://www.goebel-consult.de/blog/20050315 Goebel Consult ist Mitglied bei http://www.7-it.de/
participants (7)
-
Andi Albrecht
-
Dinu Gherman
-
Hartmut Goebel
-
Massa, Harald Armin
-
Reimar Bauer
-
Stefan Behnel
-
Stefan Schwarzer