1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
<?php
use Fisharebest\Webtrees\Elements\EmptyElement;
use Fisharebest\Webtrees\Registry;
use Fisharebest\Webtrees\Tree;
use Ramsey\Uuid\Uuid;
/**
* @var string $gedcom
* @var array<string> $hierarchy
* @var string $prefix
* @var Tree $tree
*/
preg_match_all('/^(\d+) (\w+) ?(.*)/m', $gedcom, $matches);
[, $levels, $tags, $values] = $matches;
$levels = array_map(static fn (string $x): int => (int) $x, $levels);
$keys = array_keys($levels);
$elements = [];
$ids = [];
$indent = [];
$collapse = [];
foreach ($keys as $num => $key) {
$hierarchy[$levels[$key]] = $tags[$key];
$full_tag = implode(':', array_slice($hierarchy, 0, 1 + $levels[$key]));
$elements[$key] = Registry::elementFactory()->make($full_tag);
$ids[$key] = Uuid::uuid4()->toString() . '-' . $full_tag;
// Does this element have any children?
$has_subtags = ($levels[$key + 1] ?? 0) > $levels[$key];
// Do these children have values?
$has_subtags_with_values = false;
for ($n = $key + 1; $n < count($keys) && $levels[$n] > $levels[$key]; ++$n) {
if ($values[$n] !== '') {
$has_subtags_with_values = true;
break;
}
}
$indent[$key] = $elements[$key]->collapseChildren() && $has_subtags;
$collapse[$key] = $num > 0 && $indent[$key] && !$has_subtags_with_values;
}
?>
<?php foreach ($keys as $key) : ?>
<?php if ($indent[$key - 1] ?? false) : ?>
<?php if ($collapse[$key - 1] ?? false) : ?>
<div id="collapse-<?= $key ?>" class="collapse ms-4 ps-4 border-start border-4">
<?php else : ?>
<div class="ms-4 ps-4 border-start border-4">
<?php endif ?>
<?php endif ?>
<?php if ($elements[$key] instanceof EmptyElement && $values[$key] === '') : ?>
<input type="hidden" name="<?= e($prefix) ?>levels[]" value="<?= $levels[$key] ?>">
<input type="hidden" name="<?= e($prefix) ?>tags[]" value="<?= e($tags[$key]) ?>">
<input type="hidden" name="<?= e($prefix) ?>values[]" value="">
<?php else : ?>
<div class="row form-group mb-3">
<label class="col-sm-3 col-form-label" for="<?= e($ids[$key]) ?>">
<?= $elements[$key]->label() ?>
<?php if ($collapse[$key]) : ?>
<button class="btn btn-link" data-bs-target="#collapse-<?= $key + 1 ?>" data-bs-toggle="collapse" aria-expanded="false" aria-controls="collapse-<?= $key + 1 ?>" type="button">
<?= view('icons/expand') ?>
<?= view('icons/collapse') ?>
</button>
<?php endif ?>
</label>
<div class="col-sm">
<input type="hidden" name="<?= e($prefix) ?>levels[]" value="<?= $levels[$key] ?>">
<input type="hidden" name="<?= e($prefix) ?>tags[]" value="<?= e($tags[$key]) ?>">
<?= $elements[$key]->edit($ids[$key], $prefix . 'values[]', strtr($values[$key], ["\r" => "\n"]), $tree) ?>
</div>
</div>
<?php endif ?>
<?php for ($n = $key; $levels[$n] >= ($levels[$key + 1] ?? $levels[0]); $n--) : ?>
<?php if ($indent[$n]) : ?>
<?php $indent[$n] = false ?>
</div>
<?php endif ?>
<?php if ($levels[$n] === ($levels[$key + 1] ?? $levels[0])) : ?>
<?php break; ?>
<?php endif ?>
<?php endfor ?>
<?php endforeach ?>
|