DiffMatchPatch.javaname.fraser.neil.plaintext. Licenciada bajo Apache License 2.0. Proporciona comparación de texto síncrona (diff), coincidencia difusa (match) y aplicación de parches (patch) — los mismos algoritmos que impulsan Google Docs, Etherpad y la comparación de revisiones de Wikipedia. Utilizada por ProjectForge para el seguimiento de cambios de texto y comparación de versiones.name.fraser.neil.plaintext — el nombre exacto del paquete de la biblioteca originalLa biblioteca implementa tres algoritmos relacionados, todos operando sobre texto plano:
Calcula el conjunto mínimo de ediciones para transformar texto1 en texto2. El algoritmo central es el algoritmo diff de Myers (1986), que encuentra el script de edición más corto utilizando un enfoque O(ND) en tiempo/espacio, donde N es la suma de las longitudes de las cadenas y D es el número de diferencias.
DELETE, INSERT, EQUAL — cada diff es una lista enlazada de operacionesdiff_cleanupSemantic() hace los diffs legibles para humanos; diff_cleanupEfficiency() optimiza para procesamiento automático; diff_cleanupMerge() fusiona operaciones adyacentes de igualdad/eliminaciónLocaliza la mejor coincidencia aproximada para un patrón dentro de un texto más grande. Utiliza el algoritmo Bitap (también conocido como shift-or o algoritmo Baeza-Yates–Gonnet) que:
Match_Threshold)Match_Distance) para preferir coincidencias cercanas a la ubicación esperadaCrea parches (representaciones textuales de diffs) que pueden ser serializados, transmitidos y aplicados a otros textos:
@@ -inicio,longitud +inicio,longitud @@ contextoPatch_Margin para la coincidencia)patch_apply() intenta la coincidencia difusa cuando el contexto exacto no coincide — utiliza internamente el algoritmo Match| Campo | Valor por defecto | Propósito |
|---|---|---|
Diff_Timeout | 1.0 segundos | Segundos máximos para un cálculo diff antes de devolver un resultado parcial (0 = infinito) |
Diff_EditCost | 4 | Costo de una operación de edición vacía — valores más altos producen diffs más limpios y menos fragmentados |
Match_Threshold | 0.5 | Umbral de coincidencia difusa (0.0 = exacto, 1.0 = muy flexible) |
Match_Distance | 1000 | Bonificación de localidad — distancia en caracteres desde la ubicación de coincidencia esperada |
Patch_DeleteThreshold | 0.5 | Qué tan cerca deben coincidir los bloques eliminados con el contenido esperado para ser aceptados |
Patch_Margin | 4 | Número de caracteres de contexto alrededor de los fragmentos del parche |
Match_MaxBits | 32 | Ancho de bits para el algoritmo Bitap (coincide con el tamaño de int en Java) |
Los diffs se representan como un LinkedList<Diff> donde cada Diff es una clase interna estática con:
Operation operation — DELETE, INSERT o EQUALString text — el segmento de texto para esta operaciónUna optimización para textos grandes: convierte líneas en caracteres Unicode únicos, realiza el diff en la representación comprimida y luego reconstruye la salida a nivel de línea. Esto reduce drásticamente el espacio de comparación para texto orientado a líneas (por ejemplo, código fuente).
java.io.UnsupportedEncodingExceptionjava.net.URLDecoder / URLEncoder — Para codificar la salida diff para transmisión segura en URLjava.util.* — Listas, Mapas, ArrayLists, LinkedLists, patrones regexProjectForge incrusta esta biblioteca en lugar de depender de ella como un JAR externo. Esto probablemente se hizo porque:
name.fraser.neil.plaintext) es distintivo y no entra en conflictoLinkedList para el almacenamiento de diffs porque los diffs se recorren principalmente de forma secuencial (no acceso aleatorio) y el algoritmo frecuentemente antepone/añade elementos.48a93dedb Registro de consola coloreado. UserGroupCache exportado para depuración y comparación de trabajo ahora. CollectionUtil mejorado. KotlinStringExtension.shortenMiddle() añadido.