. */ namespace Fisharebest\Webtrees\Module\BatchUpdate; use Fisharebest\Algorithm\MyersDiff; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Filter; use Fisharebest\Webtrees\Functions\FunctionsEdit; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Module\BatchUpdateModule; /** * Class BatchUpdateBasePlugin * * Each plugin should extend this class, and implement these two functions: * * bool doesRecordNeedUpdate($xref, $gedrec) * string updateRecord($xref, $gedrec) */ class BatchUpdateBasePlugin { /** @var bool User option; update change record */ public $chan = false; /** * Default is to operate on INDI records * * @return string[] */ public function getRecordTypesToUpdate() { return array('INDI'); } /** * Default option is just the "don't update CHAN record" */ public function getOptions() { $this->chan = Filter::getBool('chan'); } /** * Default option is just the "don't update CHAN record" * * @return string */ public function getOptionsForm() { return '
' . '' . '
' . FunctionsEdit::radioButtons('chan', array(0 => I18N::translate('no'), 1 => I18N::translate('yes')), ($this->chan ? 1 : 0), 'class="radio-inline" onchange="this.form.submit();"') . '
'; } /** * Default buttons are update and update_all * * @param string $xref * * @return string[] */ public function getActionButtons($xref) { if (Auth::user()->getPreference('auto_accept')) { return array( BatchUpdateModule::createSubmitButton(I18N::translate('Update'), $xref, 'update'), BatchUpdateModule::createSubmitButton(I18N::translate('Update all'), $xref, 'update_all'), ); } else { return array( BatchUpdateModule::createSubmitButton(I18N::translate('Update'), $xref, 'update'), ); } } /** * Default previewer for plugins with no custom preview. * * @param GedcomRecord $record * * @return string */ public function getActionPreview(GedcomRecord $record) { $old_lines = preg_split('/[\n]+/', $record->getGedcom()); $new_lines = preg_split('/[\n]+/', $this->updateRecord($record->getXref(), $record->getGedcom())); $algorithm = new MyersDiff; $differences = $algorithm->calculate($old_lines, $new_lines); $diff_lines = array(); foreach ($differences as $difference) { switch ($difference[1]) { case MyersDiff::DELETE: $diff_lines[] = self::decorateDeletedText($difference[0]); break; case MyersDiff::INSERT: $diff_lines[] = self::decorateInsertedText($difference[0]); break; default: $diff_lines[] = $difference[0]; } } return '
' . self::createEditLinks(implode("\n", $diff_lines)) . '
'; } /** * Decorate inserted text * * @param string $text * * @return string */ public static function decorateInsertedText($text) { return '' . $text . ''; } /** * Decorate deleted text * * @param string $text * * @return string */ public static function decorateDeletedText($text) { return '' . $text . ''; } /** * Converted gedcom links into editable links * * @param string $gedrec * * @return string */ public static function createEditLinks($gedrec) { return preg_replace( "/@([^#@\n]+)@/m", '@\\1@', $gedrec ); } }