. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Elements; use Fisharebest\Webtrees\Factories\MarkdownFactory; 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(); $label = I18N::translate('Shared note'); $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(MarkdownFactory::BREAK, strip_tags($html, ['br'])); $first_line = Str::limit($first_line, 100, I18N::translate('…')); $one_line_only = !str_contains($html, MarkdownFactory::BREAK); } $id = 'collapse-' . Uuid::uuid4()->toString(); $expanded = $tree->getPreference('EXPAND_NOTES') === '1'; if ($one_line_only) { $label = '' . $label . ''; $value = '' . $html . ''; return '
' . I18N::translate('%1$s: %2$s', $label, $value) . '
'; } return '
' . '' . view('icons/expand') . view('icons/collapse') . '' . '' . $label . ': ' . $first_line . '
' . '
' . $html . '
'; } }