DiffMatchPatch.javaname.fraser.neil.plaintext. Sous licence Apache 2.0. Fournit la comparaison de texte synchrone (diff), la correspondance floue (match) et l'application de correctifs (patch) — les mêmes algorithmes qui alimentent Google Docs, Etherpad et la comparaison de révisions de Wikipédia. Utilisé par ProjectForge pour le suivi des modifications de texte et la comparaison de versions.name.fraser.neil.plaintext — le nom exact du package de la bibliothèque d'origineLa bibliothèque implémente trois algorithmes connexes, tous opérant sur du texte brut :
Calcule l'ensemble minimal de modifications pour transformer le texte1 en texte2. L'algorithme central est l'algorithme de diff de Myers (1986), qui trouve le script d'édition le plus court en utilisant une approche O(ND) en temps/espace où N est la somme des longueurs des chaînes et D est le nombre de différences.
DELETE, INSERT, EQUAL — chaque diff est une liste chaînée d'opérationsdiff_cleanupSemantic() rend les diffs lisibles par l'humain ; diff_cleanupEfficiency() optimise pour le traitement machine ; diff_cleanupMerge() fusionne les opérations adjacentes égales/de suppressionLocalise la meilleure correspondance approximative pour un motif dans un texte plus grand. Utilise l'algorithme Bitap (également connu sous le nom de shift-or ou algorithme de Baeza-Yates–Gonnet) qui :
Match_Threshold)Match_Distance) pour préférer les correspondances proches de l'emplacement attenduCrée des correctifs (représentations textuelles des diffs) qui peuvent être sérialisés, transmis et appliqués à d'autres textes :
@@ -début,longueur +début,longueur @@ contextePatch_Margin pour la correspondance)patch_apply() tente une correspondance floue lorsque le contexte exact ne correspond pas — utilise l'algorithme Match en interne| Champ | Valeur par défaut | Objectif |
|---|---|---|
Diff_Timeout | 1,0 seconde | Secondes maximales pour un calcul de diff avant de retourner un résultat partiel (0 = infini) |
Diff_EditCost | 4 | Coût d'une opération d'édition vide — des valeurs plus élevées produisent des diffs plus propres et moins fragmentés |
Match_Threshold | 0,5 | Seuil de correspondance floue (0,0 = exact, 1,0 = très lâche) |
Match_Distance | 1000 | Bonus de localité — distance en caractères de l'emplacement de correspondance attendu |
Patch_DeleteThreshold | 0,5 | À quel point les blocs de suppression doivent correspondre au contenu attendu pour être acceptés |
Patch_Margin | 4 | Nombre de caractères de contexte autour des morceaux de correctif |
Match_MaxBits | 32 | Largeur de bits pour l'algorithme Bitap (correspond à la taille d'un int Java) |
Les diffs sont représentés comme une LinkedList<Diff> où chaque Diff est une classe statique interne avec :
Operation operation — DELETE, INSERT ou EQUALString text — le segment de texte pour cette opérationUne optimisation pour les grands textes : convertit les lignes en caractères Unicode uniques, effectue le diff sur la représentation compressée, puis reconstruit la sortie au niveau des lignes. Cela réduit considérablement l'espace de comparaison pour le texte orienté ligne (par exemple, le code source).
java.io.UnsupportedEncodingExceptionjava.net.URLDecoder / URLEncoder — Pour encoder la sortie diff pour une transmission sécurisée via URLjava.util.* — Listes, Maps, ArrayLists, LinkedLists, motifs regexProjectForge intègre cette bibliothèque plutôt que de dépendre d'un JAR externe. Cela a probablement été fait parce que :
name.fraser.neil.plaintext) est distinct et sans conflitLinkedList pour le stockage des diff car les diffs sont principalement parcourus séquentiellement (pas en accès aléatoire) et l'algorithme ajoute/supprime fréquemment des éléments en tête/queue.48a93dedb Journal console coloré. Export UserGroupCache pour le débogage et la comparaison de travail maintenant. CollectionUtil amélioré. KotlinStringExtension.shortenMiddle() ajouté.