xref: /webtrees/app/SurnameTradition/PolishSurnameTradition.php (revision fd6c8c786edaa7cf7534ebe606cd8d58eec364cb)
1<?php
2/**
3 * webtrees: online genealogy
4 * Copyright (C) 2018 webtrees development team
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16namespace Fisharebest\Webtrees\SurnameTradition;
17
18/**
19 * Children take their father’s surname. Wives take their husband’s surname. Surnames are inflected to indicate an individual’s sex.
20 */
21class PolishSurnameTradition extends PaternalSurnameTradition implements SurnameTraditionInterface
22{
23    /** @var string[] Inflect a surname for females */
24    protected $inflect_female = [
25        'cki\b'  => 'cka',
26        'dzki\b' => 'dzka',
27        'ski\b'  => 'ska',
28        'żki\b'  => 'żka',
29    ];
30
31    /** @var string[] Inflect a surname for males */
32    protected $inflect_male = [
33        'cka\b'  => 'cki',
34        'dzka\b' => 'dzki',
35        'ska\b'  => 'ski',
36        'żka\b'  => 'żki',
37    ];
38
39    /**
40     * What names are given to a new child
41     *
42     * @param string $father_name A GEDCOM NAME
43     * @param string $mother_name A GEDCOM NAME
44     * @param string $child_sex   M, F or U
45     *
46     * @return string[] Associative array of GEDCOM name parts (SURN, _MARNM, etc.)
47     */
48    public function newChildNames(string $father_name, string $mother_name, string $child_sex): array
49    {
50        if (preg_match(self::REGEX_SURN, $father_name, $match)) {
51            if ($child_sex === 'F') {
52                return array_filter([
53                    'NAME' => $this->inflect($match['NAME'], $this->inflect_female),
54                    'SURN' => $this->inflect($match['SURN'], $this->inflect_male),
55                ]);
56            }
57
58            return array_filter([
59                'NAME' => $this->inflect($match['NAME'], $this->inflect_male),
60                'SURN' => $this->inflect($match['SURN'], $this->inflect_male),
61            ]);
62        }
63
64        return [
65            'NAME' => '//',
66        ];
67    }
68
69    /**
70     * What names are given to a new parent
71     *
72     * @param string $child_name A GEDCOM NAME
73     * @param string $parent_sex M, F or U
74     *
75     * @return string[] Associative array of GEDCOM name parts (SURN, _MARNM, etc.)
76     */
77    public function newParentNames(string $child_name, string $parent_sex): array
78    {
79        if ($parent_sex === 'M' && preg_match(self::REGEX_SURN, $child_name, $match)) {
80            return array_filter([
81                'NAME' => $this->inflect($match['NAME'], $this->inflect_male),
82                'SURN' => $this->inflect($match['SURN'], $this->inflect_male),
83            ]);
84        }
85
86        return [
87            'NAME' => '//',
88        ];
89    }
90
91    /**
92     * What names are given to a new spouse
93     *
94     * @param string $spouse_name A GEDCOM NAME
95     * @param string $spouse_sex  M, F or U
96     *
97     * @return string[] Associative array of GEDCOM name parts (SURN, _MARNM, etc.)
98     */
99    public function newSpouseNames(string $spouse_name, string $spouse_sex): array
100    {
101        if ($spouse_sex === 'F' && preg_match(self::REGEX_SURN, $spouse_name, $match)) {
102            return [
103                'NAME'   => '//',
104                '_MARNM' => $this->inflect($match['NAME'], $this->inflect_female),
105            ];
106        }
107
108        return [
109            'NAME' => '//',
110        ];
111    }
112}
113