18add1155SRico Sonntag<?php 23976b470SGreg Roach 38add1155SRico Sonntag/** 48add1155SRico Sonntag * webtrees: online genealogy 589f7189bSGreg Roach * Copyright (C) 2021 webtrees development team 68add1155SRico Sonntag * This program is free software: you can redistribute it and/or modify 78add1155SRico Sonntag * it under the terms of the GNU General Public License as published by 88add1155SRico Sonntag * the Free Software Foundation, either version 3 of the License, or 98add1155SRico Sonntag * (at your option) any later version. 108add1155SRico Sonntag * This program is distributed in the hope that it will be useful, 118add1155SRico Sonntag * but WITHOUT ANY WARRANTY; without even the implied warranty of 128add1155SRico Sonntag * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 138add1155SRico Sonntag * GNU General Public License for more details. 148add1155SRico Sonntag * You should have received a copy of the GNU General Public License 1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>. 168add1155SRico Sonntag */ 17fcfa147eSGreg Roach 188add1155SRico Sonntagdeclare(strict_types=1); 198add1155SRico Sonntag 208add1155SRico Sonntagnamespace Fisharebest\Webtrees\Statistics\Google; 218add1155SRico Sonntag 228add1155SRico Sonntaguse Fisharebest\Webtrees\I18N; 2393ccd686SRico Sonntaguse Fisharebest\Webtrees\Module\ModuleThemeInterface; 2493ccd686SRico Sonntaguse Fisharebest\Webtrees\Statistics\Service\ColorService; 258add1155SRico Sonntaguse Fisharebest\Webtrees\Tree; 268add1155SRico Sonntag 2790a2f718SGreg Roachuse function app; 2871378461SGreg Roachuse function count; 2971378461SGreg Roach 308add1155SRico Sonntag/** 3193ccd686SRico Sonntag * A chart showing the top surnames. 328add1155SRico Sonntag */ 3393ccd686SRico Sonntagclass ChartCommonSurname 348add1155SRico Sonntag{ 358add1155SRico Sonntag /** 3693ccd686SRico Sonntag * @var ModuleThemeInterface 3793ccd686SRico Sonntag */ 3893ccd686SRico Sonntag private $theme; 3993ccd686SRico Sonntag 4093ccd686SRico Sonntag /** 4188de55fdSRico Sonntag * @var string 428add1155SRico Sonntag */ 4388de55fdSRico Sonntag private $surname_tradition; 448add1155SRico Sonntag 458add1155SRico Sonntag /** 4693ccd686SRico Sonntag * @var ColorService 4793ccd686SRico Sonntag */ 4893ccd686SRico Sonntag private $color_service; 4993ccd686SRico Sonntag 5093ccd686SRico Sonntag /** 518add1155SRico Sonntag * Constructor. 528add1155SRico Sonntag * 538add1155SRico Sonntag * @param Tree $tree 548add1155SRico Sonntag */ 558add1155SRico Sonntag public function __construct(Tree $tree) 568add1155SRico Sonntag { 57cab242e7SGreg Roach $this->theme = app(ModuleThemeInterface::class); 5893ccd686SRico Sonntag $this->surname_tradition = $tree->getPreference('SURNAME_TRADITION'); 5993ccd686SRico Sonntag $this->color_service = new ColorService(); 608add1155SRico Sonntag } 618add1155SRico Sonntag 628add1155SRico Sonntag /** 6388de55fdSRico Sonntag * Count up the different versions of a name and returns the one with the most matches. Takes 6488de55fdSRico Sonntag * different surname traditions into account. 658add1155SRico Sonntag * 6652664097SGreg Roach * @param array<string,int> $surns 678add1155SRico Sonntag * 6852664097SGreg Roach * @return array{0:string,1:int} 698add1155SRico Sonntag */ 7088de55fdSRico Sonntag private function getTopNameAndCount(array $surns): array 7188de55fdSRico Sonntag { 728add1155SRico Sonntag $max_name = 0; 7388de55fdSRico Sonntag $count_per = 0; 748add1155SRico Sonntag $top_name = ''; 758add1155SRico Sonntag 768add1155SRico Sonntag foreach ($surns as $spfxsurn => $count) { 778add1155SRico Sonntag $per = $count; 788add1155SRico Sonntag $count_per += $per; 798add1155SRico Sonntag 808add1155SRico Sonntag // select most common surname from all variants 818add1155SRico Sonntag if ($per > $max_name) { 828add1155SRico Sonntag $max_name = $per; 838add1155SRico Sonntag $top_name = $spfxsurn; 848add1155SRico Sonntag } 858add1155SRico Sonntag } 868add1155SRico Sonntag 8788de55fdSRico Sonntag if ($this->surname_tradition === 'polish') { 888add1155SRico Sonntag // Most common surname should be in male variant (Kowalski, not Kowalska) 8988de55fdSRico Sonntag $top_name = preg_replace( 9088de55fdSRico Sonntag [ 918add1155SRico Sonntag '/ska$/', 928add1155SRico Sonntag '/cka$/', 938add1155SRico Sonntag '/dzka$/', 948add1155SRico Sonntag '/żka$/', 9588de55fdSRico Sonntag ], 9688de55fdSRico Sonntag [ 978add1155SRico Sonntag 'ski', 988add1155SRico Sonntag 'cki', 998add1155SRico Sonntag 'dzki', 1008add1155SRico Sonntag 'żki', 10188de55fdSRico Sonntag ], 10288de55fdSRico Sonntag $top_name 10388de55fdSRico Sonntag ); 1048add1155SRico Sonntag } 1058add1155SRico Sonntag 10688de55fdSRico Sonntag return [ 107fc26b4f6SGreg Roach (string) $top_name, 108*0d047a8cSGreg Roach $count_per 10988de55fdSRico Sonntag ]; 1108add1155SRico Sonntag } 1118add1155SRico Sonntag 11288de55fdSRico Sonntag /** 11388de55fdSRico Sonntag * Create a chart of common surnames. 11488de55fdSRico Sonntag * 11588de55fdSRico Sonntag * @param int $tot_indi The total number of individuals 11688de55fdSRico Sonntag * @param array $all_surnames The list of common surnames 11788de55fdSRico Sonntag * @param string|null $color_from 11888de55fdSRico Sonntag * @param string|null $color_to 11988de55fdSRico Sonntag * 12088de55fdSRico Sonntag * @return string 12188de55fdSRico Sonntag */ 12288de55fdSRico Sonntag public function chartCommonSurnames( 12388de55fdSRico Sonntag int $tot_indi, 12488de55fdSRico Sonntag array $all_surnames, 12588de55fdSRico Sonntag string $color_from = null, 12688de55fdSRico Sonntag string $color_to = null 12788de55fdSRico Sonntag ): string { 12888de55fdSRico Sonntag $chart_color1 = (string) $this->theme->parameter('distribution-chart-no-values'); 12988de55fdSRico Sonntag $chart_color2 = (string) $this->theme->parameter('distribution-chart-high-values'); 13088de55fdSRico Sonntag $color_from = $color_from ?? $chart_color1; 13188de55fdSRico Sonntag $color_to = $color_to ?? $chart_color2; 1328add1155SRico Sonntag 13388de55fdSRico Sonntag $tot = 0; 13488de55fdSRico Sonntag foreach ($all_surnames as $surn => $surnames) { 13588de55fdSRico Sonntag $tot += array_sum($surnames); 13688de55fdSRico Sonntag } 13788de55fdSRico Sonntag 13888de55fdSRico Sonntag $data = [ 13988de55fdSRico Sonntag [ 14088de55fdSRico Sonntag I18N::translate('Name'), 14188de55fdSRico Sonntag I18N::translate('Total') 14288de55fdSRico Sonntag ], 14388de55fdSRico Sonntag ]; 14488de55fdSRico Sonntag 14588de55fdSRico Sonntag foreach ($all_surnames as $surns) { 14688de55fdSRico Sonntag $data[] = $this->getTopNameAndCount($surns); 14788de55fdSRico Sonntag } 14888de55fdSRico Sonntag 14988de55fdSRico Sonntag $data[] = [ 15088de55fdSRico Sonntag I18N::translate('Other'), 15188de55fdSRico Sonntag $tot_indi - $tot 15288de55fdSRico Sonntag ]; 15388de55fdSRico Sonntag 1546ccdf4f0SGreg Roach $colors = $this->color_service->interpolateRgb($color_from, $color_to, count($data) - 1); 1558add1155SRico Sonntag 15690a2f718SGreg Roach return view('statistics/other/charts/pie', [ 15788de55fdSRico Sonntag 'title' => null, 15888de55fdSRico Sonntag 'data' => $data, 15988de55fdSRico Sonntag 'colors' => $colors, 16065cf5706SGreg Roach 'language' => I18N::languageTag(), 16190a2f718SGreg Roach ]); 1628add1155SRico Sonntag } 1638add1155SRico Sonntag} 164