DiffMatchPatch.javaname.fraser.neil.plaintext eingebettet. Lizenziert unter Apache License 2.0. Bietet synchronen Textvergleich (Diff), unscharfe Suche (Match) und Patch-Anwendung (Patch) — dieselben Algorithmen, die Google Docs, Etherpad und Wikipedias Versionsvergleich antreiben. Wird von ProjectForge für Textänderungsverfolgung und Versionsvergleiche verwendet.name.fraser.neil.plaintext — der exakte Paketname aus der OriginalbibliothekDie Bibliothek implementiert drei verwandte Algorithmen, die alle auf Klartext operieren:
Berechnet die minimale Menge an Änderungen, um Text1 in Text2 zu überführen. Der Kernalgorithmus ist Myers' Diff-Algorithmus (1986), der das kürzeste Bearbeitungsskript mit einem O(ND)-Zeit-/Platzansatz findet, wobei N die Summe der Zeichenkettenlängen und D die Anzahl der Unterschiede ist.
DELETE, INSERT, EQUAL — jedes Diff ist eine verkettete Liste von Operationendiff_cleanupSemantic() macht Diffs menschenlesbar; diff_cleanupEfficiency() optimiert für die maschinelle Verarbeitung; diff_cleanupMerge() führt benachbarte Gleich-/Löschoperationen zusammenLokalisiert die beste ungefähre Übereinstimmung für ein Muster innerhalb eines größeren Textes. Verwendet den Bitap-Algorithmus (auch bekannt als Shift-Or oder Baeza-Yates–Gonnet-Algorithmus), der:
Match_Threshold)Match_Distance), um Übereinstimmungen in der Nähe der erwarteten Position zu bevorzugenErstellt Patches (Textdarstellungen von Diffs), die serialisiert, übertragen und auf andere Texte angewendet werden können:
@@ -start,length +start,length @@ contextPatch_Margin-Kontext für das Matching)patch_apply() versucht unscharfes Matching, wenn der exakte Kontext nicht übereinstimmt — verwendet intern den Match-Algorithmus| Feld | Standard | Zweck |
|---|---|---|
Diff_Timeout | 1,0 Sekunden | Maximale Sekunden für eine Diff-Berechnung, bevor ein Teilergebnis zurückgegeben wird (0 = unendlich) |
Diff_EditCost | 4 | Kosten einer leeren Bearbeitungsoperation — höhere Werte erzeugen sauberere, weniger fragmentierte Diffs |
Match_Threshold | 0,5 | Schwelle für unscharfe Übereinstimmungen (0,0 = exakt, 1,0 = sehr locker) |
Match_Distance | 1000 | Lokalitätsbonus — Entfernung in Zeichen von der erwarteten Übereinstimmungsposition |
Patch_DeleteThreshold | 0,5 | Wie genau Löschblöcke mit dem erwarteten Inhalt übereinstimmen müssen, um akzeptiert zu werden |
Patch_Margin | 4 | Kontextzeichenanzahl um Patch-Hunks herum |
Match_MaxBits | 32 | Bitbreite für den Bitap-Algorithmus (entspricht der Java-int-Größe) |
Diffs werden als LinkedList<Diff> dargestellt, wobei jedes Diff eine innere statische Klasse ist mit:
Operation operation — DELETE, INSERT oder EQUALString text — das Textsegment für diese OperationEine Optimierung für große Texte: Konvertiert Zeilen in eindeutige Unicode-Zeichen, führt das Diff auf der komprimierten Darstellung durch und rekonstruiert dann die Ausgabe auf Zeilenebene. Dies reduziert den Vergleichsraum für zeilenorientierten Text (z. B. Quellcode) drastisch.
java.io.UnsupportedEncodingExceptionjava.net.URLDecoder / URLEncoder — Zum Kodieren der Diff-Ausgabe für URL-sichere Übertragungjava.util.* — Listen, Maps, ArrayLists, LinkedLists, Regex-MusterProjectForge bettet diese Bibliothek ein, anstatt sie als externes JAR zu verwenden. Dies wurde wahrscheinlich aus folgenden Gründen getan:
name.fraser.neil.plaintext) ist eindeutig und konfliktfreiLinkedList für die Diff-Speicherung, da Diffs hauptsächlich sequenziell durchlaufen werden (kein wahlfreier Zugriff) und der Algorithmus häufig Elemente voranstellt/anhängt.48a93dedb Farbige Konsolenausgabe. UserGroupCache-Export zum Debuggen und Vergleichen von Arbeiten jetzt möglich. CollectionUtil verbessert. KotlinStringExtension.shortenMiddle() hinzugefügt.