18add1155SRico Sonntag<?php 28add1155SRico Sonntag/** 38add1155SRico Sonntag * webtrees: online genealogy 4242a7862SGreg Roach * Copyright (C) 2019 webtrees development team 58add1155SRico Sonntag * This program is free software: you can redistribute it and/or modify 68add1155SRico Sonntag * it under the terms of the GNU General Public License as published by 78add1155SRico Sonntag * the Free Software Foundation, either version 3 of the License, or 88add1155SRico Sonntag * (at your option) any later version. 98add1155SRico Sonntag * This program is distributed in the hope that it will be useful, 108add1155SRico Sonntag * but WITHOUT ANY WARRANTY; without even the implied warranty of 118add1155SRico Sonntag * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 128add1155SRico Sonntag * GNU General Public License for more details. 138add1155SRico Sonntag * You should have received a copy of the GNU General Public License 148add1155SRico Sonntag * along with this program. If not, see <http://www.gnu.org/licenses/>. 158add1155SRico Sonntag */ 168add1155SRico Sonntagdeclare(strict_types=1); 178add1155SRico Sonntag 188add1155SRico Sonntagnamespace Fisharebest\Webtrees\Statistics\Google; 198add1155SRico Sonntag 208add1155SRico Sonntaguse Fisharebest\Webtrees\I18N; 2193ccd686SRico Sonntaguse Fisharebest\Webtrees\Module\ModuleThemeInterface; 2293ccd686SRico Sonntaguse Fisharebest\Webtrees\Statistics\Service\ColorService; 238add1155SRico Sonntaguse Fisharebest\Webtrees\Tree; 248add1155SRico Sonntag 258add1155SRico Sonntag/** 2693ccd686SRico Sonntag * A chart showing the top surnames. 278add1155SRico Sonntag */ 2893ccd686SRico Sonntagclass ChartCommonSurname 298add1155SRico Sonntag{ 308add1155SRico Sonntag /** 3193ccd686SRico Sonntag * @var ModuleThemeInterface 3293ccd686SRico Sonntag */ 3393ccd686SRico Sonntag private $theme; 3493ccd686SRico Sonntag 3593ccd686SRico Sonntag /** 3688de55fdSRico Sonntag * @var string 378add1155SRico Sonntag */ 3888de55fdSRico Sonntag private $surname_tradition; 398add1155SRico Sonntag 408add1155SRico Sonntag /** 4193ccd686SRico Sonntag * @var ColorService 4293ccd686SRico Sonntag */ 4393ccd686SRico Sonntag private $color_service; 4493ccd686SRico Sonntag 4593ccd686SRico Sonntag /** 468add1155SRico Sonntag * Constructor. 478add1155SRico Sonntag * 488add1155SRico Sonntag * @param Tree $tree 498add1155SRico Sonntag */ 508add1155SRico Sonntag public function __construct(Tree $tree) 518add1155SRico Sonntag { 52*cab242e7SGreg Roach $this->theme = app(ModuleThemeInterface::class); 5393ccd686SRico Sonntag $this->surname_tradition = $tree->getPreference('SURNAME_TRADITION'); 5493ccd686SRico Sonntag $this->color_service = new ColorService(); 558add1155SRico Sonntag } 568add1155SRico Sonntag 578add1155SRico Sonntag /** 5888de55fdSRico Sonntag * Count up the different versions of a name and returns the one with the most matches. Takes 5988de55fdSRico Sonntag * different surname traditions into account. 608add1155SRico Sonntag * 6188de55fdSRico Sonntag * @param array $surns 628add1155SRico Sonntag * 6388de55fdSRico Sonntag * @return array [ name, count ] 648add1155SRico Sonntag */ 6588de55fdSRico Sonntag private function getTopNameAndCount(array $surns): array 6688de55fdSRico Sonntag { 678add1155SRico Sonntag $max_name = 0; 6888de55fdSRico Sonntag $count_per = 0; 698add1155SRico Sonntag $top_name = ''; 708add1155SRico Sonntag 718add1155SRico Sonntag foreach ($surns as $spfxsurn => $count) { 728add1155SRico Sonntag $per = $count; 738add1155SRico Sonntag $count_per += $per; 748add1155SRico Sonntag 758add1155SRico Sonntag // select most common surname from all variants 768add1155SRico Sonntag if ($per > $max_name) { 778add1155SRico Sonntag $max_name = $per; 788add1155SRico Sonntag $top_name = $spfxsurn; 798add1155SRico Sonntag } 808add1155SRico Sonntag } 818add1155SRico Sonntag 8288de55fdSRico Sonntag if ($this->surname_tradition === 'polish') { 838add1155SRico Sonntag // Most common surname should be in male variant (Kowalski, not Kowalska) 8488de55fdSRico Sonntag $top_name = preg_replace( 8588de55fdSRico Sonntag [ 868add1155SRico Sonntag '/ska$/', 878add1155SRico Sonntag '/cka$/', 888add1155SRico Sonntag '/dzka$/', 898add1155SRico Sonntag '/żka$/', 9088de55fdSRico Sonntag ], 9188de55fdSRico Sonntag [ 928add1155SRico Sonntag 'ski', 938add1155SRico Sonntag 'cki', 948add1155SRico Sonntag 'dzki', 958add1155SRico Sonntag 'żki', 9688de55fdSRico Sonntag ], 9788de55fdSRico Sonntag $top_name 9888de55fdSRico Sonntag ); 998add1155SRico Sonntag } 1008add1155SRico Sonntag 10188de55fdSRico Sonntag return [ 10288de55fdSRico Sonntag $top_name, 10388de55fdSRico Sonntag $count_per 10488de55fdSRico Sonntag ]; 1058add1155SRico Sonntag } 1068add1155SRico Sonntag 10788de55fdSRico Sonntag /** 10888de55fdSRico Sonntag * Create a chart of common surnames. 10988de55fdSRico Sonntag * 11088de55fdSRico Sonntag * @param int $tot_indi The total number of individuals 11188de55fdSRico Sonntag * @param array $all_surnames The list of common surnames 11288de55fdSRico Sonntag * @param string|null $color_from 11388de55fdSRico Sonntag * @param string|null $color_to 11488de55fdSRico Sonntag * 11588de55fdSRico Sonntag * @return string 11688de55fdSRico Sonntag */ 11788de55fdSRico Sonntag public function chartCommonSurnames( 11888de55fdSRico Sonntag int $tot_indi, 11988de55fdSRico Sonntag array $all_surnames, 12088de55fdSRico Sonntag string $color_from = null, 12188de55fdSRico Sonntag string $color_to = null 12288de55fdSRico Sonntag ): string { 12388de55fdSRico Sonntag $chart_color1 = (string) $this->theme->parameter('distribution-chart-no-values'); 12488de55fdSRico Sonntag $chart_color2 = (string) $this->theme->parameter('distribution-chart-high-values'); 12588de55fdSRico Sonntag $color_from = $color_from ?? $chart_color1; 12688de55fdSRico Sonntag $color_to = $color_to ?? $chart_color2; 1278add1155SRico Sonntag 12888de55fdSRico Sonntag $tot = 0; 12988de55fdSRico Sonntag foreach ($all_surnames as $surn => $surnames) { 13088de55fdSRico Sonntag $tot += array_sum($surnames); 13188de55fdSRico Sonntag } 13288de55fdSRico Sonntag 13388de55fdSRico Sonntag $data = [ 13488de55fdSRico Sonntag [ 13588de55fdSRico Sonntag I18N::translate('Name'), 13688de55fdSRico Sonntag I18N::translate('Total') 13788de55fdSRico Sonntag ], 13888de55fdSRico Sonntag ]; 13988de55fdSRico Sonntag 14088de55fdSRico Sonntag foreach ($all_surnames as $surns) { 14188de55fdSRico Sonntag $data[] = $this->getTopNameAndCount($surns); 14288de55fdSRico Sonntag } 14388de55fdSRico Sonntag 14488de55fdSRico Sonntag $data[] = [ 14588de55fdSRico Sonntag I18N::translate('Other'), 14688de55fdSRico Sonntag $tot_indi - $tot 14788de55fdSRico Sonntag ]; 14888de55fdSRico Sonntag 14993ccd686SRico Sonntag $colors = $this->color_service->interpolateRgb($color_from, $color_to, \count($data) - 1); 1508add1155SRico Sonntag 1518add1155SRico Sonntag return view( 15288de55fdSRico Sonntag 'statistics/other/charts/pie', 1538add1155SRico Sonntag [ 15488de55fdSRico Sonntag 'title' => null, 15588de55fdSRico Sonntag 'data' => $data, 15688de55fdSRico Sonntag 'colors' => $colors, 1578add1155SRico Sonntag ] 1588add1155SRico Sonntag ); 1598add1155SRico Sonntag } 1608add1155SRico Sonntag} 161