122e73debSGreg Roach<?php 222e73debSGreg Roach 322e73debSGreg Roach/** 422e73debSGreg Roach * webtrees: online genealogy 522e73debSGreg Roach * Copyright (C) 2019 webtrees development team 622e73debSGreg Roach * This program is free software: you can redistribute it and/or modify 722e73debSGreg Roach * it under the terms of the GNU General Public License as published by 822e73debSGreg Roach * the Free Software Foundation, either version 3 of the License, or 922e73debSGreg Roach * (at your option) any later version. 1022e73debSGreg Roach * This program is distributed in the hope that it will be useful, 1122e73debSGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of 1222e73debSGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1322e73debSGreg Roach * GNU General Public License for more details. 1422e73debSGreg Roach * You should have received a copy of the GNU General Public License 1522e73debSGreg Roach * along with this program. If not, see <http://www.gnu.org/licenses/>. 1622e73debSGreg Roach */ 1722e73debSGreg Roach 1822e73debSGreg Roachdeclare(strict_types=1); 1922e73debSGreg Roach 2022e73debSGreg Roachnamespace Fisharebest\Webtrees\Http\RequestHandlers; 2122e73debSGreg Roach 2222e73debSGreg Roachuse Fisharebest\Algorithm\MyersDiff; 2322e73debSGreg Roachuse Fisharebest\Webtrees\Carbon; 2422e73debSGreg Roachuse Fisharebest\Webtrees\Gedcom; 2522e73debSGreg Roachuse Fisharebest\Webtrees\GedcomRecord; 2622e73debSGreg Roachuse Fisharebest\Webtrees\I18N; 2722e73debSGreg Roachuse Fisharebest\Webtrees\Services\DatatablesService; 2822e73debSGreg Roachuse Fisharebest\Webtrees\Services\PendingChangesService; 2922e73debSGreg Roachuse Fisharebest\Webtrees\Services\TreeService; 3022e73debSGreg Roachuse Fisharebest\Webtrees\Tree; 3122e73debSGreg Roachuse InvalidArgumentException; 3222e73debSGreg Roachuse Psr\Http\Message\ResponseInterface; 3322e73debSGreg Roachuse Psr\Http\Message\ServerRequestInterface; 3422e73debSGreg Roachuse Psr\Http\Server\RequestHandlerInterface; 3522e73debSGreg Roachuse stdClass; 3622e73debSGreg Roach 3722e73debSGreg Roachuse function e; 3822e73debSGreg Roachuse function explode; 3922e73debSGreg Roachuse function implode; 4022e73debSGreg Roachuse function preg_replace_callback; 4122e73debSGreg Roach 4222e73debSGreg Roach/** 4322e73debSGreg Roach * Find pending changes. 4422e73debSGreg Roach */ 4522e73debSGreg Roachclass PendingChangesLogData implements RequestHandlerInterface 4622e73debSGreg Roach{ 4722e73debSGreg Roach /** @var DatatablesService */ 4822e73debSGreg Roach private $datatables_service; 4922e73debSGreg Roach 5022e73debSGreg Roach /** @var MyersDiff */ 5122e73debSGreg Roach private $myers_diff; 5222e73debSGreg Roach 5322e73debSGreg Roach /** @var PendingChangesService */ 5422e73debSGreg Roach private $pending_changes_service; 5522e73debSGreg Roach 5622e73debSGreg Roach /** 5722e73debSGreg Roach * @param DatatablesService $datatables_service 5822e73debSGreg Roach * @param MyersDiff $myers_diff 5922e73debSGreg Roach * @param PendingChangesService $pending_changes_service 6022e73debSGreg Roach */ 6122e73debSGreg Roach public function __construct( 6222e73debSGreg Roach DatatablesService $datatables_service, 6322e73debSGreg Roach MyersDiff $myers_diff, 64*dce3fc17SGreg Roach PendingChangesService $pending_changes_service 6522e73debSGreg Roach ) { 6622e73debSGreg Roach $this->datatables_service = $datatables_service; 6722e73debSGreg Roach $this->myers_diff = $myers_diff; 6822e73debSGreg Roach $this->pending_changes_service = $pending_changes_service; 6922e73debSGreg Roach } 7022e73debSGreg Roach 7122e73debSGreg Roach /** 7222e73debSGreg Roach * @param ServerRequestInterface $request 7322e73debSGreg Roach * 7422e73debSGreg Roach * @return ResponseInterface 7522e73debSGreg Roach */ 7622e73debSGreg Roach public function handle(ServerRequestInterface $request): ResponseInterface 7722e73debSGreg Roach { 7822e73debSGreg Roach $tree = $request->getAttribute('tree'); 7922e73debSGreg Roach assert($tree instanceof Tree, new InvalidArgumentException()); 8022e73debSGreg Roach 8122e73debSGreg Roach $query = $this->pending_changes_service->changesQuery($request); 8222e73debSGreg Roach 8322e73debSGreg Roach $callback = function (stdClass $row) use ($tree): array { 8422e73debSGreg Roach $old_lines = explode("\n", $row->old_gedcom); 8522e73debSGreg Roach $new_lines = explode("\n", $row->new_gedcom); 8622e73debSGreg Roach 8722e73debSGreg Roach $differences = $this->myers_diff->calculate($old_lines, $new_lines); 8822e73debSGreg Roach $diff_lines = []; 8922e73debSGreg Roach 9022e73debSGreg Roach foreach ($differences as $difference) { 9122e73debSGreg Roach switch ($difference[1]) { 9222e73debSGreg Roach case MyersDiff::DELETE: 9322e73debSGreg Roach $diff_lines[] = '<del>' . $difference[0] . '</del>'; 9422e73debSGreg Roach break; 9522e73debSGreg Roach case MyersDiff::INSERT: 9622e73debSGreg Roach $diff_lines[] = '<ins>' . $difference[0] . '</ins>'; 9722e73debSGreg Roach break; 9822e73debSGreg Roach default: 9922e73debSGreg Roach $diff_lines[] = $difference[0]; 10022e73debSGreg Roach } 10122e73debSGreg Roach } 10222e73debSGreg Roach 10322e73debSGreg Roach // Only convert valid xrefs to links 10422e73debSGreg Roach $record = GedcomRecord::getInstance($row->xref, $tree); 10522e73debSGreg Roach 10622e73debSGreg Roach return [ 10722e73debSGreg Roach $row->change_id, 10822e73debSGreg Roach Carbon::make($row->change_time)->local()->format('Y-m-d H:i:s'), 10922e73debSGreg Roach I18N::translate($row->status), 11022e73debSGreg Roach $record ? '<a href="' . e($record->url()) . '">' . $record->xref() . '</a>' : $row->xref, 11122e73debSGreg Roach '<div class="gedcom-data" dir="ltr">' . 11222e73debSGreg Roach preg_replace_callback( 11322e73debSGreg Roach '/@(' . Gedcom::REGEX_XREF . ')@/', 11422e73debSGreg Roach static function (array $match) use ($tree): string { 11522e73debSGreg Roach $record = GedcomRecord::getInstance($match[1], $tree); 11622e73debSGreg Roach 11722e73debSGreg Roach return $record ? '<a href="' . e($record->url()) . '">' . $match[0] . '</a>' : $match[0]; 11822e73debSGreg Roach }, 11922e73debSGreg Roach implode("\n", $diff_lines) 12022e73debSGreg Roach ) . 12122e73debSGreg Roach '</div>', 12222e73debSGreg Roach $row->user_name, 12322e73debSGreg Roach $row->gedcom_name, 12422e73debSGreg Roach ]; 12522e73debSGreg Roach }; 12622e73debSGreg Roach 12722e73debSGreg Roach return $this->datatables_service->handle($request, $query, [], [], $callback); 12822e73debSGreg Roach } 12922e73debSGreg Roach} 130