.
*/
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
'
';
}
/**
* 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
);
}
}