. */ declare(strict_types=1); namespace Fisharebest\Webtrees\SurnameTradition; use Fisharebest\Webtrees\Elements\NameType; use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Individual; use function array_filter; use function array_keys; use function array_map; use function implode; use function in_array; /** * All family members keep their original surname */ class DefaultSurnameTradition implements SurnameTraditionInterface { /** Extract a GIVN from a NAME */ protected const REGEX_GIVN = '~^(?[^/ ]+)~'; /** Extract a SPFX and SURN from a NAME */ protected const REGEX_SPFX_SURN = '~(?/(?[a-z’\']{0,4}(?: [a-z’\']{1,4})*) ?(?[^/]*)/)~'; /** Extract a simple SURN from a NAME */ protected const REGEX_SURN = '~(?/(?[^/]+)/)~'; /** Extract two Spanish/Portuguese SURNs from a NAME */ protected const REGEX_SURNS = '~/(?[^ /]+)(?: | y |/ /|/ y /)(?[^ /]+)/~'; /** * A default/empty name * * @return string */ public function defaultName(): string { return '//'; } /** * What name is given to a new child * * @param Individual|null $father * @param Individual|null $mother * @param string $sex * * @return array */ public function newChildNames(?Individual $father, ?Individual $mother, string $sex): array { return [ $this->buildName('//', ['TYPE' => NameType::TYPE_BIRTH]), ]; } /** * What name is given to a new parent * * @param Individual $child * @param string $sex * * @return array */ public function newParentNames(Individual $child, string $sex): array { return [ $this->buildName('//', ['TYPE' => NameType::TYPE_BIRTH]), ]; } /** * What names are given to a new spouse * * @param Individual $spouse * @param string $sex * * @return array */ public function newSpouseNames(Individual $spouse, string $sex): array { return [ $this->buildName('//', ['TYPE' => NameType::TYPE_BIRTH]), ]; } /** * Build a GEDCOM name record * * @param string $name * @param array $parts * * @return string */ protected function buildName(string $name, array $parts): string { $parts = array_filter($parts); $parts = array_map( static fn (string $tag, string $value): string => "\n2 " . $tag . ' ' . $value, array_keys($parts), $parts ); if ($name === '') { return '1 NAME' . implode($parts); } return '1 NAME ' . $name . implode($parts); } /** * Extract an individual's name. * * @param Individual|null $individual * * @return string */ protected function extractName(?Individual $individual): string { if ($individual instanceof Individual) { $fact = $individual ->facts(['NAME']) ->first(fn (Fact $fact): bool => in_array($fact->attribute('TYPE'), ['', NameType::TYPE_BIRTH, NameType::TYPE_CHANGE], true)); if ($fact instanceof Fact) { return $fact->value(); } } return ''; } }