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