18add1155SRico Sonntag<?php 23976b470SGreg Roach 38add1155SRico Sonntag/** 48add1155SRico Sonntag * webtrees: online genealogy 5242a7862SGreg Roach * Copyright (C) 2019 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 158add1155SRico Sonntag * along with this program. If not, see <http://www.gnu.org/licenses/>. 168add1155SRico Sonntag */ 178add1155SRico Sonntagdeclare(strict_types=1); 188add1155SRico Sonntag 198add1155SRico Sonntagnamespace Fisharebest\Webtrees\Statistics\Google; 208add1155SRico Sonntag 218add1155SRico Sonntaguse Fisharebest\Webtrees\I18N; 2293ccd686SRico Sonntaguse Fisharebest\Webtrees\Module\ModuleThemeInterface; 2393ccd686SRico Sonntaguse Fisharebest\Webtrees\Statistics\Service\ColorService; 248add1155SRico Sonntaguse Fisharebest\Webtrees\Tree; 258add1155SRico Sonntag 26*71378461SGreg Roachuse function count; 27*71378461SGreg Roach 288add1155SRico Sonntag/** 2993ccd686SRico Sonntag * A chart showing the top surnames. 308add1155SRico Sonntag */ 3193ccd686SRico Sonntagclass ChartCommonSurname 328add1155SRico Sonntag{ 338add1155SRico Sonntag /** 3493ccd686SRico Sonntag * @var ModuleThemeInterface 3593ccd686SRico Sonntag */ 3693ccd686SRico Sonntag private $theme; 3793ccd686SRico Sonntag 3893ccd686SRico Sonntag /** 3988de55fdSRico Sonntag * @var string 408add1155SRico Sonntag */ 4188de55fdSRico Sonntag private $surname_tradition; 428add1155SRico Sonntag 438add1155SRico Sonntag /** 4493ccd686SRico Sonntag * @var ColorService 4593ccd686SRico Sonntag */ 4693ccd686SRico Sonntag private $color_service; 4793ccd686SRico Sonntag 4893ccd686SRico Sonntag /** 498add1155SRico Sonntag * Constructor. 508add1155SRico Sonntag * 518add1155SRico Sonntag * @param Tree $tree 528add1155SRico Sonntag */ 538add1155SRico Sonntag public function __construct(Tree $tree) 548add1155SRico Sonntag { 55cab242e7SGreg Roach $this->theme = app(ModuleThemeInterface::class); 5693ccd686SRico Sonntag $this->surname_tradition = $tree->getPreference('SURNAME_TRADITION'); 5793ccd686SRico Sonntag $this->color_service = new ColorService(); 588add1155SRico Sonntag } 598add1155SRico Sonntag 608add1155SRico Sonntag /** 6188de55fdSRico Sonntag * Count up the different versions of a name and returns the one with the most matches. Takes 6288de55fdSRico Sonntag * different surname traditions into account. 638add1155SRico Sonntag * 6488de55fdSRico Sonntag * @param array $surns 658add1155SRico Sonntag * 6688de55fdSRico Sonntag * @return array [ name, count ] 678add1155SRico Sonntag */ 6888de55fdSRico Sonntag private function getTopNameAndCount(array $surns): array 6988de55fdSRico Sonntag { 708add1155SRico Sonntag $max_name = 0; 7188de55fdSRico Sonntag $count_per = 0; 728add1155SRico Sonntag $top_name = ''; 738add1155SRico Sonntag 748add1155SRico Sonntag foreach ($surns as $spfxsurn => $count) { 758add1155SRico Sonntag $per = $count; 768add1155SRico Sonntag $count_per += $per; 778add1155SRico Sonntag 788add1155SRico Sonntag // select most common surname from all variants 798add1155SRico Sonntag if ($per > $max_name) { 808add1155SRico Sonntag $max_name = $per; 818add1155SRico Sonntag $top_name = $spfxsurn; 828add1155SRico Sonntag } 838add1155SRico Sonntag } 848add1155SRico Sonntag 8588de55fdSRico Sonntag if ($this->surname_tradition === 'polish') { 868add1155SRico Sonntag // Most common surname should be in male variant (Kowalski, not Kowalska) 8788de55fdSRico Sonntag $top_name = preg_replace( 8888de55fdSRico Sonntag [ 898add1155SRico Sonntag '/ska$/', 908add1155SRico Sonntag '/cka$/', 918add1155SRico Sonntag '/dzka$/', 928add1155SRico Sonntag '/żka$/', 9388de55fdSRico Sonntag ], 9488de55fdSRico Sonntag [ 958add1155SRico Sonntag 'ski', 968add1155SRico Sonntag 'cki', 978add1155SRico Sonntag 'dzki', 988add1155SRico Sonntag 'żki', 9988de55fdSRico Sonntag ], 10088de55fdSRico Sonntag $top_name 10188de55fdSRico Sonntag ); 1028add1155SRico Sonntag } 1038add1155SRico Sonntag 10488de55fdSRico Sonntag return [ 10588de55fdSRico Sonntag $top_name, 10688de55fdSRico Sonntag $count_per 10788de55fdSRico Sonntag ]; 1088add1155SRico Sonntag } 1098add1155SRico Sonntag 11088de55fdSRico Sonntag /** 11188de55fdSRico Sonntag * Create a chart of common surnames. 11288de55fdSRico Sonntag * 11388de55fdSRico Sonntag * @param int $tot_indi The total number of individuals 11488de55fdSRico Sonntag * @param array $all_surnames The list of common surnames 11588de55fdSRico Sonntag * @param string|null $color_from 11688de55fdSRico Sonntag * @param string|null $color_to 11788de55fdSRico Sonntag * 11888de55fdSRico Sonntag * @return string 11988de55fdSRico Sonntag */ 12088de55fdSRico Sonntag public function chartCommonSurnames( 12188de55fdSRico Sonntag int $tot_indi, 12288de55fdSRico Sonntag array $all_surnames, 12388de55fdSRico Sonntag string $color_from = null, 12488de55fdSRico Sonntag string $color_to = null 12588de55fdSRico Sonntag ): string { 12688de55fdSRico Sonntag $chart_color1 = (string) $this->theme->parameter('distribution-chart-no-values'); 12788de55fdSRico Sonntag $chart_color2 = (string) $this->theme->parameter('distribution-chart-high-values'); 12888de55fdSRico Sonntag $color_from = $color_from ?? $chart_color1; 12988de55fdSRico Sonntag $color_to = $color_to ?? $chart_color2; 1308add1155SRico Sonntag 13188de55fdSRico Sonntag $tot = 0; 13288de55fdSRico Sonntag foreach ($all_surnames as $surn => $surnames) { 13388de55fdSRico Sonntag $tot += array_sum($surnames); 13488de55fdSRico Sonntag } 13588de55fdSRico Sonntag 13688de55fdSRico Sonntag $data = [ 13788de55fdSRico Sonntag [ 13888de55fdSRico Sonntag I18N::translate('Name'), 13988de55fdSRico Sonntag I18N::translate('Total') 14088de55fdSRico Sonntag ], 14188de55fdSRico Sonntag ]; 14288de55fdSRico Sonntag 14388de55fdSRico Sonntag foreach ($all_surnames as $surns) { 14488de55fdSRico Sonntag $data[] = $this->getTopNameAndCount($surns); 14588de55fdSRico Sonntag } 14688de55fdSRico Sonntag 14788de55fdSRico Sonntag $data[] = [ 14888de55fdSRico Sonntag I18N::translate('Other'), 14988de55fdSRico Sonntag $tot_indi - $tot 15088de55fdSRico Sonntag ]; 15188de55fdSRico Sonntag 1526ccdf4f0SGreg Roach $colors = $this->color_service->interpolateRgb($color_from, $color_to, count($data) - 1); 1538add1155SRico Sonntag 1548add1155SRico Sonntag return view( 15588de55fdSRico Sonntag 'statistics/other/charts/pie', 1568add1155SRico Sonntag [ 15788de55fdSRico Sonntag 'title' => null, 15888de55fdSRico Sonntag 'data' => $data, 15988de55fdSRico Sonntag 'colors' => $colors, 1608add1155SRico Sonntag ] 1618add1155SRico Sonntag ); 1628add1155SRico Sonntag } 1638add1155SRico Sonntag} 164