.
*/
declare(strict_types=1);
namespace Fisharebest\Webtrees\Elements;
use Fisharebest\Webtrees\Gedcom;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Tree;
use Illuminate\Support\Str;
use Ramsey\Uuid\Uuid;
use function e;
use function explode;
use function preg_match;
use function strip_tags;
use function view;
/**
* NOTE can be text or an XREF.
*/
class NoteStructure extends SubmitterText
{
/**
* An edit control for this data.
*
* @param string $id
* @param string $name
* @param string $value
* @param Tree $tree
*
* @return string
*/
public function edit(string $id, string $name, string $value, Tree $tree): string
{
$submitter_text = new SubmitterText('');
$xref_note = new XrefNote('');
// Existing shared note.
if (preg_match('/^@' . Gedcom::REGEX_XREF . '@$/', $value)) {
return $xref_note->edit($id, $name, $value, $tree);
}
// Existing inline note.
if ($value !== '') {
return $submitter_text->edit($id, $name, $value, $tree);
}
$options = [
'inline' => I18N::translate('inline note'),
'shared' => I18N::translate('shared note'),
];
// New note - either inline or shared
return
'
' .
'
' .
view('components/radios-inline', ['name' => $id . '-options', 'options' => $options, 'selected' => 'inline']) .
'
' .
'
' .
$submitter_text->edit($id, $name, $value, $tree) .
'
' .
'
' .
$xref_note->edit($id . '-select', $name, $value, $tree) .
'
' .
'
' .
'';
}
/**
* Create a label/value pair for this element.
*
* @param string $value
* @param Tree $tree
*
* @return string
*/
public function labelValue(string $value, Tree $tree): string
{
// A note structure can contain an inline note or a linked to a shared note.
if (preg_match('/^@(' . Gedcom::REGEX_XREF . ')@$/', $value, $match) === 1) {
$note = Registry::noteFactory()->make($match[1], $tree);
if ($note === null) {
return parent::labelValue($value, $tree);
}
$value = $note->getNote();
$element = Registry::elementFactory()->make('NOTE');
$label = $element->label();
$html = $this->valueFormatted($value, $tree);
$first_line = '' . $note->fullName() . '';
$one_line_only = strip_tags($note->fullName()) === strip_tags($value);
} else {
$label = I18N::translate('Note');
$html = $this->valueFormatted($value, $tree);
[$first_line] = explode('
', strip_tags($html, ['
']));
$first_line = Str::limit($first_line, 100, I18N::translate('…'));
$one_line_only = !str_contains($html, '
') && mb_strlen($value) <= 100;
}
$id = 'collapse-' . Uuid::uuid4()->toString();
$expanded = $tree->getPreference('EXPAND_NOTES') === '1';
if ($one_line_only) {
return
'' .
I18N::translate('%1$s: %2$s', $label, $html) .
'
';
}
return
'' .
'' .
$html .
'
';
}
}