18add1155SRico Sonntag<?php 28add1155SRico Sonntag/** 38add1155SRico Sonntag * webtrees: online genealogy 4*242a7862SGreg 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; 218add1155SRico Sonntaguse Fisharebest\Webtrees\Statistics\AbstractGoogle; 228add1155SRico Sonntaguse Fisharebest\Webtrees\Tree; 238add1155SRico Sonntag 248add1155SRico Sonntag/** 258add1155SRico Sonntag * 268add1155SRico Sonntag */ 278add1155SRico Sonntagclass ChartCommonSurname extends AbstractGoogle 288add1155SRico Sonntag{ 298add1155SRico Sonntag /** 3088de55fdSRico Sonntag * @var string 318add1155SRico Sonntag */ 3288de55fdSRico Sonntag private $surname_tradition; 338add1155SRico Sonntag 348add1155SRico Sonntag /** 358add1155SRico Sonntag * Constructor. 368add1155SRico Sonntag * 378add1155SRico Sonntag * @param Tree $tree 388add1155SRico Sonntag */ 398add1155SRico Sonntag public function __construct(Tree $tree) 408add1155SRico Sonntag { 4188de55fdSRico Sonntag parent::__construct($tree); 4288de55fdSRico Sonntag 4388de55fdSRico Sonntag $this->surname_tradition = $this->tree->getPreference('SURNAME_TRADITION'); 448add1155SRico Sonntag } 458add1155SRico Sonntag 468add1155SRico Sonntag /** 4788de55fdSRico Sonntag * Count up the different versions of a name and returns the one with the most matches. Takes 4888de55fdSRico Sonntag * different surname traditions into account. 498add1155SRico Sonntag * 5088de55fdSRico Sonntag * @param array $surns 518add1155SRico Sonntag * 5288de55fdSRico Sonntag * @return array [ name, count ] 538add1155SRico Sonntag */ 5488de55fdSRico Sonntag private function getTopNameAndCount(array $surns): array 5588de55fdSRico Sonntag { 568add1155SRico Sonntag $max_name = 0; 5788de55fdSRico Sonntag $count_per = 0; 588add1155SRico Sonntag $top_name = ''; 598add1155SRico Sonntag 608add1155SRico Sonntag foreach ($surns as $spfxsurn => $count) { 618add1155SRico Sonntag $per = $count; 628add1155SRico Sonntag $count_per += $per; 638add1155SRico Sonntag 648add1155SRico Sonntag // select most common surname from all variants 658add1155SRico Sonntag if ($per > $max_name) { 668add1155SRico Sonntag $max_name = $per; 678add1155SRico Sonntag $top_name = $spfxsurn; 688add1155SRico Sonntag } 698add1155SRico Sonntag } 708add1155SRico Sonntag 7188de55fdSRico Sonntag if ($this->surname_tradition === 'polish') { 728add1155SRico Sonntag // Most common surname should be in male variant (Kowalski, not Kowalska) 7388de55fdSRico Sonntag $top_name = preg_replace( 7488de55fdSRico Sonntag [ 758add1155SRico Sonntag '/ska$/', 768add1155SRico Sonntag '/cka$/', 778add1155SRico Sonntag '/dzka$/', 788add1155SRico Sonntag '/żka$/', 7988de55fdSRico Sonntag ], 8088de55fdSRico Sonntag [ 818add1155SRico Sonntag 'ski', 828add1155SRico Sonntag 'cki', 838add1155SRico Sonntag 'dzki', 848add1155SRico Sonntag 'żki', 8588de55fdSRico Sonntag ], 8688de55fdSRico Sonntag $top_name 8788de55fdSRico Sonntag ); 888add1155SRico Sonntag } 898add1155SRico Sonntag 9088de55fdSRico Sonntag return [ 9188de55fdSRico Sonntag $top_name, 9288de55fdSRico Sonntag $count_per 9388de55fdSRico Sonntag ]; 948add1155SRico Sonntag } 958add1155SRico Sonntag 9688de55fdSRico Sonntag /** 9788de55fdSRico Sonntag * Create a chart of common surnames. 9888de55fdSRico Sonntag * 9988de55fdSRico Sonntag * @param int $tot_indi The total number of individuals 10088de55fdSRico Sonntag * @param array $all_surnames The list of common surnames 10188de55fdSRico Sonntag * @param string|null $color_from 10288de55fdSRico Sonntag * @param string|null $color_to 10388de55fdSRico Sonntag * 10488de55fdSRico Sonntag * @return string 10588de55fdSRico Sonntag */ 10688de55fdSRico Sonntag public function chartCommonSurnames( 10788de55fdSRico Sonntag int $tot_indi, 10888de55fdSRico Sonntag array $all_surnames, 10988de55fdSRico Sonntag string $color_from = null, 11088de55fdSRico Sonntag string $color_to = null 11188de55fdSRico Sonntag ): string { 11288de55fdSRico Sonntag $chart_color1 = (string) $this->theme->parameter('distribution-chart-no-values'); 11388de55fdSRico Sonntag $chart_color2 = (string) $this->theme->parameter('distribution-chart-high-values'); 11488de55fdSRico Sonntag $color_from = $color_from ?? $chart_color1; 11588de55fdSRico Sonntag $color_to = $color_to ?? $chart_color2; 1168add1155SRico Sonntag 11788de55fdSRico Sonntag $tot = 0; 11888de55fdSRico Sonntag foreach ($all_surnames as $surn => $surnames) { 11988de55fdSRico Sonntag $tot += array_sum($surnames); 12088de55fdSRico Sonntag } 12188de55fdSRico Sonntag 12288de55fdSRico Sonntag $data = [ 12388de55fdSRico Sonntag [ 12488de55fdSRico Sonntag I18N::translate('Name'), 12588de55fdSRico Sonntag I18N::translate('Total') 12688de55fdSRico Sonntag ], 12788de55fdSRico Sonntag ]; 12888de55fdSRico Sonntag 12988de55fdSRico Sonntag foreach ($all_surnames as $surns) { 13088de55fdSRico Sonntag $data[] = $this->getTopNameAndCount($surns); 13188de55fdSRico Sonntag } 13288de55fdSRico Sonntag 13388de55fdSRico Sonntag $data[] = [ 13488de55fdSRico Sonntag I18N::translate('Other'), 13588de55fdSRico Sonntag $tot_indi - $tot 13688de55fdSRico Sonntag ]; 13788de55fdSRico Sonntag 13888de55fdSRico Sonntag $colors = $this->interpolateRgb($color_from, $color_to, \count($data) - 1); 1398add1155SRico Sonntag 1408add1155SRico Sonntag return view( 14188de55fdSRico Sonntag 'statistics/other/charts/pie', 1428add1155SRico Sonntag [ 14388de55fdSRico Sonntag 'title' => null, 14488de55fdSRico Sonntag 'data' => $data, 14588de55fdSRico Sonntag 'colors' => $colors, 1468add1155SRico Sonntag ] 1478add1155SRico Sonntag ); 1488add1155SRico Sonntag } 1498add1155SRico Sonntag} 150