. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Elements; use Fisharebest\Webtrees\Factories\MarkdownFactory; use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Note; 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 substr_count; 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 { $id = 'collapse-' . Uuid::uuid4()->toString(); $expanded = $tree->getPreference('EXPAND_NOTES') === '1'; // 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); } $label = '' . I18N::translate('Shared note') . ''; $value = $note->getNote(); $html = $this->valueFormatted($value, $tree); $first_line = '' . $note->fullName() . ''; // Shared note where the title is the same as the text if ($html === '

' . strip_tags($note->fullName()) . '

') { $value = '' . strip_tags($html) . ''; return I18N::translate('%1$s: %2$s', $label, $value); } return '
' . '' . view('icons/expand') . view('icons/collapse') . '' . '' . $label . ': ' . $first_line . '
' . '
' . $html . '
'; } $label = '' . I18N::translate('Note') . ''; $html = $this->valueFormatted($value, $tree); // Inline note with only one paragraph and inline markup? if ($html === strip_tags($html, ['a', 'em', 'p', 'strong']) && substr_count($html, '

') === 1) { $html = strip_tags($html, ['a', 'em', 'strong']); $value = '' . $html . ''; return I18N::translate('%1$s: %2$s', $label, $value); } $value = e(Note::firstLineOfTextFromHtml($html)); $value = '' . $value . ''; return '

' . '' . view('icons/expand') . view('icons/collapse') . '' . I18N::translate('%1$s: %2$s', $label, $value) . '
' . '
' . $html . '
'; } }