Трехстороннее слияние в JavaScript или PHP
Кто-нибудь знает о реализации трехстороннего слияния с открытым исходным кодом в JavaScript или PHP? Я хочу объединить простые текстовые файлы без необходимости полагаться на двоичные файлы на стороне сервера.
Я нашел несколько решений для создания различий, но без реализации слияния.
4 ответа
Синхротрон выглядит хорошо. Например, посмотрите демонстрацию трехстороннего слияния и обработки конфликтов.
Не совсем трехстороннее слияние, но Google "Библиотеки Diff Match и Patch предлагают надежные алгоритмы для выполнения операций, необходимых для синхронизации простого текста". И реализация доступна в Java, JavaScript, C++, C#, Lua и Python.
Только что закончил свою работу над таким js- и php-инструментом. Посмотрите и наслаждайтесь:
https://github.com/Krassmus/Textmerger
Вам просто нужно написать
var merged = Textmerger.get().merge(original, mytext, theirtext);
или в PHP
$merged = Textmerger::get()->merge($original, $mytext, $theirtext);
и вы сделали.
Обнаружив, что пакеты npm 3-way-merge и Three-way-merge (основные из них, которые появляются в результатах поиска по запросу «three-way merge npm») не работают должным образом и не поддерживаются, я наткнулся на это гораздо больше, более полезный
https://www.npmjs.com/package/diff3
В итоге мы написали наше решение так:
var diff3 = require('diff3');
var mergeData = diff3(sourceArray, originalArray, targetArray);
var result = mergeData.map(({ok, conflict}) => {
if (ok) {
return ok;
}
else if (conflict) {
return [
'<<<<<<< target',
...conflict.b,
'>>>>>>> target',
'<<<<<<< source',
...conflict.a,
'>>>>>>> source'
];
}
}).flat();