EN · DE · RU · FR · ES

#1873 : DiffMatchPatch.java

projectforge-common/src/main/java/name/fraser/neil/plaintext/DiffMatchPatch.java Bibliothèque tierce (intégrée) — Google diff-match-patch, projectforge-common/src/main/java/name/fraser/neil/plaintext/DiffMatchPatch.java 2464 lignes · 1638 code · 688 commentaires · 138 vides
La bibliothèque d'algorithmes diff-match-patch de Google par Neil Fraser, intégrée directement dans ProjectForge sous le package d'origine name.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.

Architecture

Origine et licence

Aperçu de l'algorithme

La bibliothèque implémente trois algorithmes connexes, tous opérant sur du texte brut :

1. Diff — Algorithme de différence O(ND) de Myers

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.

2. Match — Algorithme Bitap (Shift-Or)

Localise 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 :

3. Patch — Format de diff unifié + application floue

Crée des correctifs (représentations textuelles des diffs) qui peuvent être sérialisés, transmis et appliqués à d'autres textes :

Paramètres de configuration clés

ChampValeur par défautObjectif
Diff_Timeout1,0 secondeSecondes maximales pour un calcul de diff avant de retourner un résultat partiel (0 = infini)
Diff_EditCost4Coût d'une opération d'édition vide — des valeurs plus élevées produisent des diffs plus propres et moins fragmentés
Match_Threshold0,5Seuil de correspondance floue (0,0 = exact, 1,0 = très lâche)
Match_Distance1000Bonus de localité — distance en caractères de l'emplacement de correspondance attendu
Patch_DeleteThreshold0,5À quel point les blocs de suppression doivent correspondre au contenu attendu pour être acceptés
Patch_Margin4Nombre de caractères de contexte autour des morceaux de correctif
Match_MaxBits32Largeur de bits pour l'algorithme Bitap (correspond à la taille d'un int Java)

Structure de données : Diff (classe interne)

Les diffs sont représentés comme une LinkedList<Diff> où chaque Diff est une classe statique interne avec :

Assistant interne : LinesToCharsResult

Une 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).

Imports

Utilisation dans ProjectForge

ProjectForge intègre cette bibliothèque plutôt que de dépendre d'un JAR externe. Cela a probablement été fait parce que :

  1. La bibliothèque est stable et change rarement (la dernière mise à jour significative était le port Java vers 2010)
  2. L'intégration évite les problèmes de gestion des dépendances
  3. Le nom du package (name.fraser.neil.plaintext) est distinct et sans conflit
  4. Elle peut avoir des modifications personnalisées pour les besoins spécifiques de ProjectForge (bien que le code semble être le port standard)
DiffMatchPatch est utilisé pour suivre les modifications apportées aux champs de texte dans les objets de données de ProjectForge — montrant ce qui a changé entre les versions d'une adresse, d'une description de projet ou d'un autre contenu textuel.

La bibliothèque a été portée dans plusieurs langages (Python, JavaScript, Java, C++, C#, Lua, Dart). La version Java utilise LinkedList 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.

Historique Git

48a93dedb Journal console coloré. Export UserGroupCache pour le débogage et la comparaison de travail maintenant. CollectionUtil amélioré. KotlinStringExtension.shortenMiddle() ajouté.