DiffMatchPatch.javaname.fraser.neil.plaintext. Лицензия Apache License 2.0. Предоставляет синхронное сравнение текста (diff), нечёткое сопоставление (match) и применение патчей (patch) — те же алгоритмы, которые используются в Google Docs, Etherpad и сравнении версий Wikipedia. Используется ProjectForge для отслеживания изменений текста и сравнения версий.name.fraser.neil.plaintext — точное имя пакета из оригинальной библиотекиБиблиотека реализует три связанных алгоритма, все работают с обычным текстом:
Вычисляет минимальный набор правок для преобразования text1 в text2. Основной алгоритм — алгоритм различий Майерса (1986), который находит кратчайший сценарий редактирования, используя подход O(ND) по времени/памяти, где N — сумма длин строк, а D — количество различий.
DELETE, INSERT, EQUAL — каждое различие представляет собой связанный список операцийdiff_cleanupSemantic() делает различия удобочитаемыми; diff_cleanupEfficiency() оптимизирует для машинной обработки; diff_cleanupMerge() объединяет соседние операции равенства/удаленияНаходит наилучшее приблизительное совпадение шаблона в большом тексте. Использует алгоритм Bitap (также известный как shift-or или алгоритм Баэзы-Йейтса–Гонне), который:
Match_Threshold)Match_Distance), чтобы предпочитать совпадения рядом с ожидаемой позициейСоздаёт патчи (текстовые представления различий), которые можно сериализовать, передавать и применять к другим текстам:
@@ -start,length +start,length @@ контекстPatch_Margin для сопоставления)patch_apply() пытается выполнить нечёткое сопоставление, когда точный контекст не совпадает — внутренне использует алгоритм Match| Поле | По умолчанию | Назначение |
|---|---|---|
Diff_Timeout | 1.0 секунда | Максимальное время для вычисления diff перед возвратом частичного результата (0 = бесконечно) |
Diff_EditCost | 4 | Стоимость пустой операции редактирования — более высокие значения дают более чистые, менее фрагментированные различия |
Match_Threshold | 0.5 | Порог нечёткого сопоставления (0.0 = точное, 1.0 = очень неточное) |
Match_Distance | 1000 | Бонус за расположение — расстояние в символах от ожидаемой позиции совпадения |
Patch_DeleteThreshold | 0.5 | Насколько точно блоки удаления должны соответствовать ожидаемому содержимому для принятия |
Patch_Margin | 4 | Количество символов контекста вокруг фрагментов патча |
Match_MaxBits | 32 | Разрядность для алгоритма Bitap (соответствует размеру int в Java) |
Различия представлены как LinkedList<Diff>, где каждый Diff — это внутренний статический класс с:
Operation operation — DELETE, INSERT или EQUALString text — текстовый сегмент для этой операцииОптимизация для больших текстов: преобразует строки в уникальные символы Unicode, выполняет diff над сжатым представлением, затем восстанавливает вывод на уровне строк. Это значительно сокращает пространство сравнения для текстов, ориентированных на строки (например, исходный код).
java.io.UnsupportedEncodingExceptionjava.net.URLDecoder / URLEncoder — для кодирования вывода diff для безопасной передачи через URLjava.util.* — Lists, Maps, ArrayLists, LinkedLists, regex PatternsProjectForge встраивает эту библиотеку, а не использует её как внешний JAR. Вероятно, это сделано потому, что:
name.fraser.neil.plaintext) уникально и не вызывает конфликтовLinkedList для хранения diff, потому что различия в основном обходятся последовательно (не произвольный доступ), и алгоритм часто добавляет элементы в начало/конец.48a93dedb Цветной лог консоли. Экспорт UserGroupCache для отладки и сравнения работы теперь доступен. CollectionUtil улучшен. Добавлен KotlinStringExtension.shortenMiddle().