xref: /webtrees/resources/views/fact-gedcom-fields.phtml (revision 87d151aa1b9399ea87ad77b43872224555f1d926)
1<?php
2
3use Fisharebest\Webtrees\Elements\AbstractXrefElement;
4use Fisharebest\Webtrees\Elements\XrefSource;
5use Fisharebest\Webtrees\Gedcom;
6use Fisharebest\Webtrees\GedcomRecord;
7use Fisharebest\Webtrees\I18N;
8use Fisharebest\Webtrees\Registry;
9use Fisharebest\Webtrees\Source;
10use Fisharebest\Webtrees\Tree;
11
12/**
13 * @var string $gedcom
14 * @var string $parent e.g. "INDI:BIRT:DATE"
15 * @var Tree   $tree
16 */
17
18$hierarchy = explode(':', $parent);
19
20// Merge CONT records onto their parent line.
21$gedcom = preg_replace('/\n\d CONT ?/', "\r", $gedcom);
22
23preg_match_all('/^(\d+) (\w+) ?(.*)/m', $gedcom, $matches);
24[, $levels, $tags, $values] = $matches;
25$levels   = array_map(static fn (string $x): int => (int) $x, $levels);
26$keys     = array_keys($levels);
27$elements = [];
28
29$private_level = PHP_INT_MAX;
30
31foreach ($keys as $key) {
32    $hierarchy[$levels[$key]] = $tags[$key];
33    $full_tag                 = implode(':', array_slice($hierarchy, 0, 1 + $levels[$key]));
34    $elements[$key]           = Registry::elementFactory()->make($full_tag);
35
36    if ($elements[$key] instanceof AbstractXrefElement && preg_match('/^@(' . Gedcom::REGEX_XREF . ')@$/', $values[$key], $match) === 1) {
37        $record = Registry::gedcomRecordFactory()->make($match[1], $tree);
38
39        if ($record instanceof GedcomRecord && !$record->canShow()) {
40            $private_level = min($private_level, $levels[$key]);
41        }
42    }
43
44    if ($levels[$key] >= $private_level) {
45        $values[$key] = '';
46    } else {
47        $private_level = PHP_INT_MAX;
48    }
49}
50
51?>
52
53<?php if ($elements[0] instanceof XrefSource && preg_match('/^@(' . Gedcom::REGEX_XREF . ')@$/', $values[0], $match) === 1) : ?>
54    <?php $source = Registry::sourceFactory()->make($match[1], $tree) ?>
55    <?php if ($source instanceof Source) : ?>
56        <?php $id = Registry::idFactory()->id() ?>
57        <?php $expanded = $tree->getPreference('EXPAND_SOURCES') === '1' ?>
58        <div class="fact_SOUR">
59            <a href="#<?= e($id) ?>" role="button" data-bs-toggle="collapse" aria-controls="<?= e($id) ?>" aria-expanded="<?= $expanded ? 'true' : 'false' ?>">
60                <?= view('icons/expand') ?>
61                <?= view('icons/collapse') ?>
62             </a>
63
64            <?php $label = '<span class="label">' . I18N::translate('Source') . '</span>' ?>
65            <?php $value = '<span class="field" dir="auto"><a href="' . e($source->url()) . '">' . $source->fullName() . '</a></span>' ?>
66            <?= I18N::translate('%1$s: %2$s', $label, $value) ?>
67        </div>
68
69        <div id="<?= e($id) ?>" class="ps-4 collapse <?= $expanded ? 'show' : '' ?>">
70            <?php array_shift($keys) ?>
71            <?php foreach ($keys as $key) : ?>
72                <?php if ($values[$key] !== '') : ?>
73                    <?= $elements[$key]->labelValue(strtr($values[$key], ["\r" => "\n"]), $tree) ?>
74                <?php endif ?>
75            <?php endforeach ?>
76        </div>
77    <?php endif ?>
78<?php else : ?>
79    <?php foreach ($keys as $key) : ?>
80        <?php if ($values[$key] !== '') : ?>
81            <?= $elements[$key]->labelValue(strtr($values[$key], ["\r" => "\n"]), $tree) ?>
82        <?php endif ?>
83    <?php endforeach ?>
84<?php endif ?>
85