Passed
Push — main ( f9aaf7...4197a4 )
by Jonathan
14:34
created
app/Common/Hooks/AbstractHookCollector.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@
 block discarded – undo
57 57
      */
58 58
     public function name(): string
59 59
     {
60
-        return $this->module->name() . '-' .
60
+        return $this->module->name().'-'.
61 61
             mb_substr(str_replace('collector', '', mb_strtolower((new ReflectionClass($this))->getShortName())), 0, 64);
62 62
     }
63 63
 
Please login to merge, or discard this patch.
Indentation   +65 added lines, -65 removed lines patch added patch discarded remove patch
@@ -28,78 +28,78 @@
 block discarded – undo
28 28
  */
29 29
 abstract class AbstractHookCollector implements HookCollectorInterface, HookInterface
30 30
 {
31
-    /** @var Collection<THook> $hooks */
32
-    protected Collection $hooks;
31
+	/** @var Collection<THook> $hooks */
32
+	protected Collection $hooks;
33 33
 
34
-    private ModuleInterface $module;
34
+	private ModuleInterface $module;
35 35
 
36
-    /**
37
-     * Constructor for AbstractHookCollector
38
-     *
39
-     * @param ModuleInterface $module
40
-     */
41
-    public function __construct(ModuleInterface $module)
42
-    {
43
-        $this->hooks = new Collection();
44
-        $this->module = $module;
45
-    }
36
+	/**
37
+	 * Constructor for AbstractHookCollector
38
+	 *
39
+	 * @param ModuleInterface $module
40
+	 */
41
+	public function __construct(ModuleInterface $module)
42
+	{
43
+		$this->hooks = new Collection();
44
+		$this->module = $module;
45
+	}
46 46
 
47
-    /**
48
-     * {@inheritDoc}
49
-     * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookInterface::module()
50
-     */
51
-    public function module(): ModuleInterface
52
-    {
53
-        return $this->module;
54
-    }
47
+	/**
48
+	 * {@inheritDoc}
49
+	 * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookInterface::module()
50
+	 */
51
+	public function module(): ModuleInterface
52
+	{
53
+		return $this->module;
54
+	}
55 55
 
56
-    /**
57
-     * {@inheritDoc}
58
-     * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::name()
59
-     */
60
-    public function name(): string
61
-    {
62
-        return $this->module->name() . '-' .
63
-            mb_substr(str_replace('collector', '', mb_strtolower((new ReflectionClass($this))->getShortName())), 0, 64);
64
-    }
56
+	/**
57
+	 * {@inheritDoc}
58
+	 * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::name()
59
+	 */
60
+	public function name(): string
61
+	{
62
+		return $this->module->name() . '-' .
63
+			mb_substr(str_replace('collector', '', mb_strtolower((new ReflectionClass($this))->getShortName())), 0, 64);
64
+	}
65 65
 
66
-    /**
67
-     * {@inheritDoc}
68
-     * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::title()
69
-     */
70
-    abstract public function title(): string;
66
+	/**
67
+	 * {@inheritDoc}
68
+	 * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::title()
69
+	 */
70
+	abstract public function title(): string;
71 71
 
72
-    /**
73
-     * {@inheritDoc}
74
-     * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::description()
75
-     */
76
-    abstract public function description(): string;
72
+	/**
73
+	 * {@inheritDoc}
74
+	 * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::description()
75
+	 */
76
+	abstract public function description(): string;
77 77
 
78
-    /**
79
-     * {@inheritDoc}
80
-     * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::hookInterface()
81
-     */
82
-    abstract public function hookInterface(): string;
78
+	/**
79
+	 * {@inheritDoc}
80
+	 * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::hookInterface()
81
+	 */
82
+	abstract public function hookInterface(): string;
83 83
 
84
-    /**
85
-     * {@inheritDoc}
86
-     * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::register()
87
-     */
88
-    public function register(HookInterface $hook_instance, int $order): void
89
-    {
90
-        if ($this->hooks->has($order)) {
91
-            $this->hooks->splice($order + 1, 0, [$hook_instance]);
92
-        } else {
93
-            $this->hooks->put($order, $hook_instance);
94
-        }
95
-    }
84
+	/**
85
+	 * {@inheritDoc}
86
+	 * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::register()
87
+	 */
88
+	public function register(HookInterface $hook_instance, int $order): void
89
+	{
90
+		if ($this->hooks->has($order)) {
91
+			$this->hooks->splice($order + 1, 0, [$hook_instance]);
92
+		} else {
93
+			$this->hooks->put($order, $hook_instance);
94
+		}
95
+	}
96 96
 
97
-    /**
98
-     * {@inheritDoc}
99
-     * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::hooks()
100
-     */
101
-    public function hooks(): Collection
102
-    {
103
-        return $this->hooks->sortKeys();
104
-    }
97
+	/**
98
+	 * {@inheritDoc}
99
+	 * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookCollectorInterface::hooks()
100
+	 */
101
+	public function hooks(): Collection
102
+	{
103
+		return $this->hooks->sortKeys();
104
+	}
105 105
 }
Please login to merge, or discard this patch.
app/Common/GeoDispersion/GeoAnalysis/GeoAnalysisResultItem.php 1 patch
Indentation   +57 added lines, -57 removed lines patch added patch discarded remove patch
@@ -20,67 +20,67 @@
 block discarded – undo
20 20
  */
21 21
 class GeoAnalysisResultItem
22 22
 {
23
-    private GeoAnalysisPlace $place;
24
-    private int $count;
23
+	private GeoAnalysisPlace $place;
24
+	private int $count;
25 25
 
26
-    /**
27
-     * Constructor for GeoAnalysisResultItem
28
-     *
29
-     * @param GeoAnalysisPlace $place
30
-     * @param int $count
31
-     */
32
-    public function __construct(GeoAnalysisPlace $place, int $count = 0)
33
-    {
34
-        $this->place = $place;
35
-        $this->count = $count;
36
-    }
26
+	/**
27
+	 * Constructor for GeoAnalysisResultItem
28
+	 *
29
+	 * @param GeoAnalysisPlace $place
30
+	 * @param int $count
31
+	 */
32
+	public function __construct(GeoAnalysisPlace $place, int $count = 0)
33
+	{
34
+		$this->place = $place;
35
+		$this->count = $count;
36
+	}
37 37
 
38
-    /**
39
-     * Get the item key.
40
-     *
41
-     * @return string
42
-     */
43
-    public function key(): string
44
-    {
45
-        return $this->place->key();
46
-    }
38
+	/**
39
+	 * Get the item key.
40
+	 *
41
+	 * @return string
42
+	 */
43
+	public function key(): string
44
+	{
45
+		return $this->place->key();
46
+	}
47 47
 
48
-    /**
49
-     * Get the referenced GeoAnalysis Place
50
-     *
51
-     * @return GeoAnalysisPlace
52
-     */
53
-    public function place(): GeoAnalysisPlace
54
-    {
55
-        return $this->place;
56
-    }
48
+	/**
49
+	 * Get the referenced GeoAnalysis Place
50
+	 *
51
+	 * @return GeoAnalysisPlace
52
+	 */
53
+	public function place(): GeoAnalysisPlace
54
+	{
55
+		return $this->place;
56
+	}
57 57
 
58
-    /**
59
-     * Get the count of occurences of the GeoAnalysis Place in the analysis
60
-     *
61
-     * @return int
62
-     */
63
-    public function count(): int
64
-    {
65
-        return $this->count;
66
-    }
58
+	/**
59
+	 * Get the count of occurences of the GeoAnalysis Place in the analysis
60
+	 *
61
+	 * @return int
62
+	 */
63
+	public function count(): int
64
+	{
65
+		return $this->count;
66
+	}
67 67
 
68
-    /**
69
-     * Increment the count of occurrences of the GeoAnalysis Place in the analysis
70
-     *
71
-     * @return $this
72
-     */
73
-    public function increment(): self
74
-    {
75
-        $this->count++;
76
-        return $this;
77
-    }
68
+	/**
69
+	 * Increment the count of occurrences of the GeoAnalysis Place in the analysis
70
+	 *
71
+	 * @return $this
72
+	 */
73
+	public function increment(): self
74
+	{
75
+		$this->count++;
76
+		return $this;
77
+	}
78 78
 
79
-    /**
80
-     * Clone the item object
81
-     */
82
-    public function __clone()
83
-    {
84
-        $this->place = clone $this->place;
85
-    }
79
+	/**
80
+	 * Clone the item object
81
+	 */
82
+	public function __clone()
83
+	{
84
+		$this->place = clone $this->place;
85
+	}
86 86
 }
Please login to merge, or discard this patch.
app/Common/GeoDispersion/GeoAnalysis/GeoAnalysisPlace.php 1 patch
Indentation   +133 added lines, -133 removed lines patch added patch discarded remove patch
@@ -28,137 +28,137 @@
 block discarded – undo
28 28
  */
29 29
 class GeoAnalysisPlace
30 30
 {
31
-    /**
32
-     * The default place name for invalid places
33
-     * @var string INVALID_PLACE
34
-     */
35
-    private const INVALID_PLACE = '##INVALID##';
36
-
37
-    private Place $place;
38
-    private int $depth;
39
-    private bool $strict_depth;
40
-    private bool $is_excluded;
41
-
42
-    /**
43
-     * Constructor for GeoAnalysisPlace
44
-     *
45
-     * @param Tree $tree Default tree
46
-     * @param Place|null $place Place resulting from the analysis
47
-     * @param int $depth Place hierarchy depth defined by the geographical analysis view
48
-     * @param bool $strict_depth Checks whether places with a lower depth than defined should be flagged as invalid
49
-     */
50
-    public function __construct(Tree $tree, ?Place $place, int $depth, bool $strict_depth = false)
51
-    {
52
-        $this->depth = $depth;
53
-        $this->strict_depth = $strict_depth;
54
-        $this->place = $this->extractPlace($place, $depth, $strict_depth) ?? new Place('', $tree);
55
-        $this->is_excluded = false;
56
-    }
57
-
58
-    /**
59
-     * Process the provided Place to determine its status for further usage
60
-     *
61
-     * @param Place|null $place
62
-     * @param int $depth
63
-     * @param bool $strict_depth
64
-     * @return Place|NULL
65
-     */
66
-    private function extractPlace(?Place $place, int $depth, bool $strict_depth): ?Place
67
-    {
68
-        if ($place === null) {
69
-            return null;
70
-        }
71
-        if (mb_strlen($place->gedcomName()) === 0) {
72
-            return null;
73
-        }
74
-        $parts = $place->lastParts($depth);
75
-        if ($strict_depth && $parts->count() !== $depth) {
76
-            return new Place(self::INVALID_PLACE, $place->tree());
77
-        }
78
-        return new Place($parts->implode(', '), $place->tree());
79
-    }
80
-
81
-    /**
82
-     * Get the GeoAnalysis Place key
83
-     *
84
-     * @return string
85
-     */
86
-    public function key(): string
87
-    {
88
-        return $this->place->gedcomName();
89
-    }
90
-
91
-    /**
92
-     * Get the underlying Place object
93
-     *
94
-     * @return Place
95
-     */
96
-    public function place(): Place
97
-    {
98
-        return $this->place;
99
-    }
100
-
101
-    /**
102
-     * Check if the GeoAnalysis Place is in the Known status
103
-     *
104
-     * @return bool
105
-     */
106
-    public function isKnown(): bool
107
-    {
108
-        return !$this->isUnknown();
109
-    }
110
-
111
-    /**
112
-     * Check if the GeoAnalysis Place is in the Unknown status
113
-     *
114
-     * @return bool
115
-     */
116
-    public function isUnknown(): bool
117
-    {
118
-        return mb_strlen($this->place->gedcomName()) === 0;
119
-    }
120
-
121
-    /**
122
-     * Check if the GeoAnalysis Place is in the Invalid status
123
-     *
124
-     * @return bool
125
-     */
126
-    public function isInvalid(): bool
127
-    {
128
-        return $this->place->gedcomName() === self::INVALID_PLACE;
129
-    }
130
-
131
-    /**
132
-     * Check if the GeoAnalysis Place is in the Excluded status
133
-     *
134
-     * @return bool
135
-     */
136
-    public function isExcluded(): bool
137
-    {
138
-        return $this->isUnknown() || $this->isInvalid() || $this->is_excluded;
139
-    }
140
-
141
-    /**
142
-     * Set the GeoAnalysis Place status to Found, if the parameter is true
143
-     *
144
-     * @param bool $include
145
-     * @return $this
146
-     */
147
-    public function include(bool $include = true): self
148
-    {
149
-        $this->is_excluded = !$include;
150
-        return $this;
151
-    }
152
-
153
-    /**
154
-     * Set the GeoAnalysis Place status to Excluded, if the parameter is true
155
-     *
156
-     * @param bool $exclude
157
-     * @return $this
158
-     */
159
-    public function exclude(bool $exclude = true): self
160
-    {
161
-        $this->is_excluded = $exclude;
162
-        return $this;
163
-    }
31
+	/**
32
+	 * The default place name for invalid places
33
+	 * @var string INVALID_PLACE
34
+	 */
35
+	private const INVALID_PLACE = '##INVALID##';
36
+
37
+	private Place $place;
38
+	private int $depth;
39
+	private bool $strict_depth;
40
+	private bool $is_excluded;
41
+
42
+	/**
43
+	 * Constructor for GeoAnalysisPlace
44
+	 *
45
+	 * @param Tree $tree Default tree
46
+	 * @param Place|null $place Place resulting from the analysis
47
+	 * @param int $depth Place hierarchy depth defined by the geographical analysis view
48
+	 * @param bool $strict_depth Checks whether places with a lower depth than defined should be flagged as invalid
49
+	 */
50
+	public function __construct(Tree $tree, ?Place $place, int $depth, bool $strict_depth = false)
51
+	{
52
+		$this->depth = $depth;
53
+		$this->strict_depth = $strict_depth;
54
+		$this->place = $this->extractPlace($place, $depth, $strict_depth) ?? new Place('', $tree);
55
+		$this->is_excluded = false;
56
+	}
57
+
58
+	/**
59
+	 * Process the provided Place to determine its status for further usage
60
+	 *
61
+	 * @param Place|null $place
62
+	 * @param int $depth
63
+	 * @param bool $strict_depth
64
+	 * @return Place|NULL
65
+	 */
66
+	private function extractPlace(?Place $place, int $depth, bool $strict_depth): ?Place
67
+	{
68
+		if ($place === null) {
69
+			return null;
70
+		}
71
+		if (mb_strlen($place->gedcomName()) === 0) {
72
+			return null;
73
+		}
74
+		$parts = $place->lastParts($depth);
75
+		if ($strict_depth && $parts->count() !== $depth) {
76
+			return new Place(self::INVALID_PLACE, $place->tree());
77
+		}
78
+		return new Place($parts->implode(', '), $place->tree());
79
+	}
80
+
81
+	/**
82
+	 * Get the GeoAnalysis Place key
83
+	 *
84
+	 * @return string
85
+	 */
86
+	public function key(): string
87
+	{
88
+		return $this->place->gedcomName();
89
+	}
90
+
91
+	/**
92
+	 * Get the underlying Place object
93
+	 *
94
+	 * @return Place
95
+	 */
96
+	public function place(): Place
97
+	{
98
+		return $this->place;
99
+	}
100
+
101
+	/**
102
+	 * Check if the GeoAnalysis Place is in the Known status
103
+	 *
104
+	 * @return bool
105
+	 */
106
+	public function isKnown(): bool
107
+	{
108
+		return !$this->isUnknown();
109
+	}
110
+
111
+	/**
112
+	 * Check if the GeoAnalysis Place is in the Unknown status
113
+	 *
114
+	 * @return bool
115
+	 */
116
+	public function isUnknown(): bool
117
+	{
118
+		return mb_strlen($this->place->gedcomName()) === 0;
119
+	}
120
+
121
+	/**
122
+	 * Check if the GeoAnalysis Place is in the Invalid status
123
+	 *
124
+	 * @return bool
125
+	 */
126
+	public function isInvalid(): bool
127
+	{
128
+		return $this->place->gedcomName() === self::INVALID_PLACE;
129
+	}
130
+
131
+	/**
132
+	 * Check if the GeoAnalysis Place is in the Excluded status
133
+	 *
134
+	 * @return bool
135
+	 */
136
+	public function isExcluded(): bool
137
+	{
138
+		return $this->isUnknown() || $this->isInvalid() || $this->is_excluded;
139
+	}
140
+
141
+	/**
142
+	 * Set the GeoAnalysis Place status to Found, if the parameter is true
143
+	 *
144
+	 * @param bool $include
145
+	 * @return $this
146
+	 */
147
+	public function include(bool $include = true): self
148
+	{
149
+		$this->is_excluded = !$include;
150
+		return $this;
151
+	}
152
+
153
+	/**
154
+	 * Set the GeoAnalysis Place status to Excluded, if the parameter is true
155
+	 *
156
+	 * @param bool $exclude
157
+	 * @return $this
158
+	 */
159
+	public function exclude(bool $exclude = true): self
160
+	{
161
+		$this->is_excluded = $exclude;
162
+		return $this;
163
+	}
164 164
 }
Please login to merge, or discard this patch.
app/Common/GeoDispersion/GeoAnalysis/GeoAnalysisResult.php 2 patches
Indentation   +221 added lines, -221 removed lines patch added patch discarded remove patch
@@ -24,225 +24,225 @@
 block discarded – undo
24 24
  */
25 25
 class GeoAnalysisResult
26 26
 {
27
-    private string $description;
28
-    private int $order;
29
-    private int $unknown_count;
30
-    /**
31
-     * @var Collection<GeoAnalysisResultItem>
32
-     */
33
-    private Collection $places;
34
-
35
-    /**
36
-     * Constructor for GeoAnalysisResult
37
-     *
38
-     * @param string $description
39
-     * @param int $order
40
-     * @param Collection<GeoAnalysisResultItem> $places
41
-     * @param int $unknown
42
-     */
43
-    final public function __construct(
44
-        string $description,
45
-        int $order = 0,
46
-        Collection $places = null,
47
-        int $unknown = 0
48
-    ) {
49
-        $this->description = $description;
50
-        $this->order = $order;
51
-        $this->places = $places ?? new Collection();
52
-        $this->unknown_count = $unknown;
53
-    }
54
-
55
-    /**
56
-     * Get the category description
57
-     *
58
-     * @return string
59
-     */
60
-    public function description(): string
61
-    {
62
-        return $this->description;
63
-    }
64
-
65
-    /**
66
-     * Get the category order
67
-     *
68
-     * @return int
69
-     */
70
-    public function order(): int
71
-    {
72
-        return $this->order;
73
-    }
74
-
75
-    /**
76
-     * Add a place to the analysis result
77
-     *
78
-     * @param GeoAnalysisPlace $place
79
-     */
80
-    public function addPlace(GeoAnalysisPlace $place): void
81
-    {
82
-        if ($place->isKnown()) {
83
-            /** @var GeoAnalysisResultItem $item */
84
-            $item = $this->places->get($place->key(), new GeoAnalysisResultItem($place));
85
-            $this->places->put($item->key(), $item->increment());
86
-        } else {
87
-            $this->addUnknown();
88
-        }
89
-    }
90
-
91
-    /**
92
-     * Exclude a place from the analysis result
93
-     *
94
-     * @param GeoAnalysisPlace $place
95
-     */
96
-    public function exclude(GeoAnalysisPlace $place): void
97
-    {
98
-        /** @var GeoAnalysisResultItem|null $item */
99
-        $item = $this->places->get($place->key());
100
-        if ($item !== null) {
101
-            $item->place()->exclude();
102
-        }
103
-    }
104
-
105
-    /**
106
-     * Add an unknown place to the analysis result
107
-     */
108
-    public function addUnknown(): void
109
-    {
110
-        $this->unknown_count++;
111
-    }
112
-
113
-    /**
114
-     * Take a copy of the current analysis result
115
-     *
116
-     * @return static
117
-     */
118
-    public function copy(): self
119
-    {
120
-        return new static(
121
-            $this->description(),
122
-            $this->order(),
123
-            $this->places->map(fn(GeoAnalysisResultItem $item): GeoAnalysisResultItem => clone $item),
124
-            $this->countUnknown()
125
-        );
126
-    }
127
-
128
-    /**
129
-     * Merge the current analysis result with another.
130
-     * The current object is modified, not the second one.
131
-     *
132
-     * @param GeoAnalysisResult $other
133
-     * @return $this
134
-     */
135
-    public function merge(GeoAnalysisResult $other): self
136
-    {
137
-        $this->places->each(function (GeoAnalysisResultItem $item) use ($other): void {
138
-            if ($other->places->has($item->key())) {
139
-                $item->place()->exclude(
140
-                    $item->place()->isExcluded()
141
-                    && $other->places->get($item->key())->place()->isExcluded()
142
-                );
143
-            }
144
-        });
145
-
146
-        $other->places->each(function (GeoAnalysisResultItem $item): void {
147
-            if (!$this->places->has($item->key())) {
148
-                $this->addPlace($item->place());
149
-            }
150
-        });
151
-
152
-        return $this;
153
-    }
154
-
155
-    /**
156
-     * Get the count of Known places
157
-     *
158
-     * @return int
159
-     */
160
-    public function countKnown(): int
161
-    {
162
-        return $this->places->sum(fn(GeoAnalysisResultItem $item): int => $item->count()) ?? 0;
163
-    }
164
-
165
-    /**
166
-     * Get the count of Found places
167
-     *
168
-     * @return int
169
-     */
170
-    public function countFound(): int
171
-    {
172
-        return $this->places
173
-            ->reject(fn(GeoAnalysisResultItem $item): bool => $item->place()->isExcluded())
174
-            ->sum(fn(GeoAnalysisResultItem $item): int => $item->count()) ?? 0;
175
-    }
176
-
177
-    /**
178
-     * Get the count of Excluded places
179
-     *
180
-     * @return int
181
-     */
182
-    public function countExcluded(): int
183
-    {
184
-        return $this->places
185
-            ->filter(fn(GeoAnalysisResultItem $item): bool => $item->place()->isExcluded())
186
-            ->sum(fn(GeoAnalysisResultItem $item): int => $item->count()) ?? 0;
187
-    }
188
-
189
-    /**
190
-     * Get the count of Unknown places
191
-     *
192
-     * @return int
193
-     */
194
-    public function countUnknown(): int
195
-    {
196
-        return $this->unknown_count;
197
-    }
198
-
199
-    /**
200
-     * Get the count of the most represented Place in the analysis result
201
-     *
202
-     * @return int
203
-     */
204
-    public function maxCount(): int
205
-    {
206
-        return $this->places->max(fn(GeoAnalysisResultItem $item): int => $item->count()) ?? 0;
207
-    }
208
-
209
-    /**
210
-     * Get the list of Known places with their associated count
211
-     *
212
-     * @param bool $exclude_other
213
-     * @return Collection<GeoAnalysisResultItem>
214
-     */
215
-    public function knownPlaces(bool $exclude_other = false): Collection
216
-    {
217
-        if ($exclude_other) {
218
-            return $this->places->reject(fn(GeoAnalysisResultItem $item): bool => $item->place()->isExcluded());
219
-        }
220
-        return $this->places;
221
-    }
222
-
223
-    /**
224
-     * Get the list of Known places with their associated count.
225
-     * The list is sorted first by descending count, then by ascending Place name
226
-     *
227
-     * @param bool $exclude_other
228
-     * @return Collection<GeoAnalysisResultItem>
229
-     */
230
-    public function sortedKnownPlaces(bool $exclude_other = false): Collection
231
-    {
232
-        return $this->knownPlaces($exclude_other)->sortBy([
233
-            fn (GeoAnalysisResultItem $a, GeoAnalysisResultItem $b): int => $b->count() <=> $a->count(),
234
-            fn (GeoAnalysisResultItem $a, GeoAnalysisResultItem $b): int =>
235
-                I18N::comparator()($a->place()->place()->gedcomName(), $b->place()->place()->gedcomName())
236
-        ]);
237
-    }
238
-
239
-    /**
240
-     * Get the list of Excluded places
241
-     *
242
-     * @return Collection<GeoAnalysisResultItem>
243
-     */
244
-    public function excludedPlaces(): Collection
245
-    {
246
-        return $this->places->filter(fn(GeoAnalysisResultItem $item): bool => $item->place()->isExcluded());
247
-    }
27
+	private string $description;
28
+	private int $order;
29
+	private int $unknown_count;
30
+	/**
31
+	 * @var Collection<GeoAnalysisResultItem>
32
+	 */
33
+	private Collection $places;
34
+
35
+	/**
36
+	 * Constructor for GeoAnalysisResult
37
+	 *
38
+	 * @param string $description
39
+	 * @param int $order
40
+	 * @param Collection<GeoAnalysisResultItem> $places
41
+	 * @param int $unknown
42
+	 */
43
+	final public function __construct(
44
+		string $description,
45
+		int $order = 0,
46
+		Collection $places = null,
47
+		int $unknown = 0
48
+	) {
49
+		$this->description = $description;
50
+		$this->order = $order;
51
+		$this->places = $places ?? new Collection();
52
+		$this->unknown_count = $unknown;
53
+	}
54
+
55
+	/**
56
+	 * Get the category description
57
+	 *
58
+	 * @return string
59
+	 */
60
+	public function description(): string
61
+	{
62
+		return $this->description;
63
+	}
64
+
65
+	/**
66
+	 * Get the category order
67
+	 *
68
+	 * @return int
69
+	 */
70
+	public function order(): int
71
+	{
72
+		return $this->order;
73
+	}
74
+
75
+	/**
76
+	 * Add a place to the analysis result
77
+	 *
78
+	 * @param GeoAnalysisPlace $place
79
+	 */
80
+	public function addPlace(GeoAnalysisPlace $place): void
81
+	{
82
+		if ($place->isKnown()) {
83
+			/** @var GeoAnalysisResultItem $item */
84
+			$item = $this->places->get($place->key(), new GeoAnalysisResultItem($place));
85
+			$this->places->put($item->key(), $item->increment());
86
+		} else {
87
+			$this->addUnknown();
88
+		}
89
+	}
90
+
91
+	/**
92
+	 * Exclude a place from the analysis result
93
+	 *
94
+	 * @param GeoAnalysisPlace $place
95
+	 */
96
+	public function exclude(GeoAnalysisPlace $place): void
97
+	{
98
+		/** @var GeoAnalysisResultItem|null $item */
99
+		$item = $this->places->get($place->key());
100
+		if ($item !== null) {
101
+			$item->place()->exclude();
102
+		}
103
+	}
104
+
105
+	/**
106
+	 * Add an unknown place to the analysis result
107
+	 */
108
+	public function addUnknown(): void
109
+	{
110
+		$this->unknown_count++;
111
+	}
112
+
113
+	/**
114
+	 * Take a copy of the current analysis result
115
+	 *
116
+	 * @return static
117
+	 */
118
+	public function copy(): self
119
+	{
120
+		return new static(
121
+			$this->description(),
122
+			$this->order(),
123
+			$this->places->map(fn(GeoAnalysisResultItem $item): GeoAnalysisResultItem => clone $item),
124
+			$this->countUnknown()
125
+		);
126
+	}
127
+
128
+	/**
129
+	 * Merge the current analysis result with another.
130
+	 * The current object is modified, not the second one.
131
+	 *
132
+	 * @param GeoAnalysisResult $other
133
+	 * @return $this
134
+	 */
135
+	public function merge(GeoAnalysisResult $other): self
136
+	{
137
+		$this->places->each(function (GeoAnalysisResultItem $item) use ($other): void {
138
+			if ($other->places->has($item->key())) {
139
+				$item->place()->exclude(
140
+					$item->place()->isExcluded()
141
+					&& $other->places->get($item->key())->place()->isExcluded()
142
+				);
143
+			}
144
+		});
145
+
146
+		$other->places->each(function (GeoAnalysisResultItem $item): void {
147
+			if (!$this->places->has($item->key())) {
148
+				$this->addPlace($item->place());
149
+			}
150
+		});
151
+
152
+		return $this;
153
+	}
154
+
155
+	/**
156
+	 * Get the count of Known places
157
+	 *
158
+	 * @return int
159
+	 */
160
+	public function countKnown(): int
161
+	{
162
+		return $this->places->sum(fn(GeoAnalysisResultItem $item): int => $item->count()) ?? 0;
163
+	}
164
+
165
+	/**
166
+	 * Get the count of Found places
167
+	 *
168
+	 * @return int
169
+	 */
170
+	public function countFound(): int
171
+	{
172
+		return $this->places
173
+			->reject(fn(GeoAnalysisResultItem $item): bool => $item->place()->isExcluded())
174
+			->sum(fn(GeoAnalysisResultItem $item): int => $item->count()) ?? 0;
175
+	}
176
+
177
+	/**
178
+	 * Get the count of Excluded places
179
+	 *
180
+	 * @return int
181
+	 */
182
+	public function countExcluded(): int
183
+	{
184
+		return $this->places
185
+			->filter(fn(GeoAnalysisResultItem $item): bool => $item->place()->isExcluded())
186
+			->sum(fn(GeoAnalysisResultItem $item): int => $item->count()) ?? 0;
187
+	}
188
+
189
+	/**
190
+	 * Get the count of Unknown places
191
+	 *
192
+	 * @return int
193
+	 */
194
+	public function countUnknown(): int
195
+	{
196
+		return $this->unknown_count;
197
+	}
198
+
199
+	/**
200
+	 * Get the count of the most represented Place in the analysis result
201
+	 *
202
+	 * @return int
203
+	 */
204
+	public function maxCount(): int
205
+	{
206
+		return $this->places->max(fn(GeoAnalysisResultItem $item): int => $item->count()) ?? 0;
207
+	}
208
+
209
+	/**
210
+	 * Get the list of Known places with their associated count
211
+	 *
212
+	 * @param bool $exclude_other
213
+	 * @return Collection<GeoAnalysisResultItem>
214
+	 */
215
+	public function knownPlaces(bool $exclude_other = false): Collection
216
+	{
217
+		if ($exclude_other) {
218
+			return $this->places->reject(fn(GeoAnalysisResultItem $item): bool => $item->place()->isExcluded());
219
+		}
220
+		return $this->places;
221
+	}
222
+
223
+	/**
224
+	 * Get the list of Known places with their associated count.
225
+	 * The list is sorted first by descending count, then by ascending Place name
226
+	 *
227
+	 * @param bool $exclude_other
228
+	 * @return Collection<GeoAnalysisResultItem>
229
+	 */
230
+	public function sortedKnownPlaces(bool $exclude_other = false): Collection
231
+	{
232
+		return $this->knownPlaces($exclude_other)->sortBy([
233
+			fn (GeoAnalysisResultItem $a, GeoAnalysisResultItem $b): int => $b->count() <=> $a->count(),
234
+			fn (GeoAnalysisResultItem $a, GeoAnalysisResultItem $b): int =>
235
+				I18N::comparator()($a->place()->place()->gedcomName(), $b->place()->place()->gedcomName())
236
+		]);
237
+	}
238
+
239
+	/**
240
+	 * Get the list of Excluded places
241
+	 *
242
+	 * @return Collection<GeoAnalysisResultItem>
243
+	 */
244
+	public function excludedPlaces(): Collection
245
+	{
246
+		return $this->places->filter(fn(GeoAnalysisResultItem $item): bool => $item->place()->isExcluded());
247
+	}
248 248
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -134,7 +134,7 @@  discard block
 block discarded – undo
134 134
      */
135 135
     public function merge(GeoAnalysisResult $other): self
136 136
     {
137
-        $this->places->each(function (GeoAnalysisResultItem $item) use ($other): void {
137
+        $this->places->each(function(GeoAnalysisResultItem $item) use ($other): void {
138 138
             if ($other->places->has($item->key())) {
139 139
                 $item->place()->exclude(
140 140
                     $item->place()->isExcluded()
@@ -143,7 +143,7 @@  discard block
 block discarded – undo
143 143
             }
144 144
         });
145 145
 
146
-        $other->places->each(function (GeoAnalysisResultItem $item): void {
146
+        $other->places->each(function(GeoAnalysisResultItem $item): void {
147 147
             if (!$this->places->has($item->key())) {
148 148
                 $this->addPlace($item->place());
149 149
             }
@@ -230,8 +230,8 @@  discard block
 block discarded – undo
230 230
     public function sortedKnownPlaces(bool $exclude_other = false): Collection
231 231
     {
232 232
         return $this->knownPlaces($exclude_other)->sortBy([
233
-            fn (GeoAnalysisResultItem $a, GeoAnalysisResultItem $b): int => $b->count() <=> $a->count(),
234
-            fn (GeoAnalysisResultItem $a, GeoAnalysisResultItem $b): int =>
233
+            fn(GeoAnalysisResultItem $a, GeoAnalysisResultItem $b): int => $b->count() <=> $a->count(),
234
+            fn(GeoAnalysisResultItem $a, GeoAnalysisResultItem $b): int =>
235 235
                 I18N::comparator()($a->place()->place()->gedcomName(), $b->place()->place()->gedcomName())
236 236
         ]);
237 237
     }
Please login to merge, or discard this patch.
app/Common/GeoDispersion/Maps/SimpleFilesystemMap.php 1 patch
Indentation   +51 added lines, -51 removed lines patch added patch discarded remove patch
@@ -27,59 +27,59 @@
 block discarded – undo
27 27
  */
28 28
 class SimpleFilesystemMap implements MapDefinitionInterface
29 29
 {
30
-    private string $id;
31
-    private string $title;
32
-    private string $path;
33
-    private FilesystemReader $filesystem;
30
+	private string $id;
31
+	private string $title;
32
+	private string $path;
33
+	private FilesystemReader $filesystem;
34 34
 
35
-    /**
36
-     * Constructor for SimpleFilesystemMap
37
-     *
38
-     * @param string $id
39
-     * @param string $title
40
-     * @param FilesystemReader $filesystem
41
-     * @param string $path
42
-     */
43
-    public function __construct(string $id, string $title, FilesystemReader $filesystem, string $path)
44
-    {
45
-        $this->id = $id;
46
-        $this->title = $title;
47
-        $this->filesystem = $filesystem;
48
-        $this->path = $path;
49
-    }
35
+	/**
36
+	 * Constructor for SimpleFilesystemMap
37
+	 *
38
+	 * @param string $id
39
+	 * @param string $title
40
+	 * @param FilesystemReader $filesystem
41
+	 * @param string $path
42
+	 */
43
+	public function __construct(string $id, string $title, FilesystemReader $filesystem, string $path)
44
+	{
45
+		$this->id = $id;
46
+		$this->title = $title;
47
+		$this->filesystem = $filesystem;
48
+		$this->path = $path;
49
+	}
50 50
 
51
-    /**
52
-     * {@inheritDoc}
53
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapDefinitionInterface::id()
54
-     */
55
-    public function id(): string
56
-    {
57
-        return $this->id;
58
-    }
51
+	/**
52
+	 * {@inheritDoc}
53
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapDefinitionInterface::id()
54
+	 */
55
+	public function id(): string
56
+	{
57
+		return $this->id;
58
+	}
59 59
 
60
-    /**
61
-     * {@inheritDoc}
62
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapDefinitionInterface::title()
63
-     */
64
-    public function title(): string
65
-    {
66
-        return $this->title;
67
-    }
60
+	/**
61
+	 * {@inheritDoc}
62
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapDefinitionInterface::title()
63
+	 */
64
+	public function title(): string
65
+	{
66
+		return $this->title;
67
+	}
68 68
 
69
-    /**
70
-     * {@inheritDoc}
71
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapDefinitionInterface::features()
72
-     */
73
-    public function features(): array
74
-    {
75
-        $reader = new GeoJSONReader();
76
-        try {
77
-            $feature_collection = $reader->read($this->filesystem->read($this->path));
78
-            if ($feature_collection instanceof FeatureCollection) {
79
-                return $feature_collection->getFeatures();
80
-            }
81
-        } catch (Throwable $ex) {
82
-        }
83
-        return [];
84
-    }
69
+	/**
70
+	 * {@inheritDoc}
71
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapDefinitionInterface::features()
72
+	 */
73
+	public function features(): array
74
+	{
75
+		$reader = new GeoJSONReader();
76
+		try {
77
+			$feature_collection = $reader->read($this->filesystem->read($this->path));
78
+			if ($feature_collection instanceof FeatureCollection) {
79
+				return $feature_collection->getFeatures();
80
+			}
81
+		} catch (Throwable $ex) {
82
+		}
83
+		return [];
84
+	}
85 85
 }
Please login to merge, or discard this patch.
app/Common/GeoDispersion/Config/MapColorsConfig.php 2 patches
Indentation   +81 added lines, -81 removed lines patch added patch discarded remove patch
@@ -23,92 +23,92 @@
 block discarded – undo
23 23
  */
24 24
 class MapColorsConfig implements JsonSerializable
25 25
 {
26
-    private Color $default;
27
-    private Color $stroke;
28
-    private Color $max_value;
29
-    private Color $hover;
26
+	private Color $default;
27
+	private Color $stroke;
28
+	private Color $max_value;
29
+	private Color $hover;
30 30
 
31
-    /**
32
-     * Constructor for MapColorsConfig
33
-     *
34
-     * @param Color $default
35
-     * @param Color $stroke
36
-     * @param Color $max_value
37
-     * @param Color $hover
38
-     */
39
-    public function __construct(
40
-        Color $default,
41
-        Color $stroke,
42
-        Color $max_value,
43
-        Color $hover
44
-    ) {
45
-        $this->default = $default;
46
-        $this->stroke = $stroke;
47
-        $this->max_value = $max_value;
48
-        $this->hover = $hover;
49
-    }
31
+	/**
32
+	 * Constructor for MapColorsConfig
33
+	 *
34
+	 * @param Color $default
35
+	 * @param Color $stroke
36
+	 * @param Color $max_value
37
+	 * @param Color $hover
38
+	 */
39
+	public function __construct(
40
+		Color $default,
41
+		Color $stroke,
42
+		Color $max_value,
43
+		Color $hover
44
+	) {
45
+		$this->default = $default;
46
+		$this->stroke = $stroke;
47
+		$this->max_value = $max_value;
48
+		$this->hover = $hover;
49
+	}
50 50
 
51
-    /**
52
-     * Get the default color for the features
53
-     *
54
-     * @return Color
55
-     */
56
-    public function defaultColor(): Color
57
-    {
58
-        return $this->default;
59
-    }
51
+	/**
52
+	 * Get the default color for the features
53
+	 *
54
+	 * @return Color
55
+	 */
56
+	public function defaultColor(): Color
57
+	{
58
+		return $this->default;
59
+	}
60 60
 
61
-    /**
62
-     * Get the color for the features' strokes
63
-     *
64
-     * @return Color
65
-     */
66
-    public function strokeColor(): Color
67
-    {
68
-        return $this->stroke;
69
-    }
61
+	/**
62
+	 * Get the color for the features' strokes
63
+	 *
64
+	 * @return Color
65
+	 */
66
+	public function strokeColor(): Color
67
+	{
68
+		return $this->stroke;
69
+	}
70 70
 
71
-    /**
72
-     * Get the color for the features with the lowest count
73
-     *
74
-     * @return Color
75
-     */
76
-    public function minValueColor(): Color
77
-    {
78
-        return new Rgb(255, 255, 255);
79
-    }
71
+	/**
72
+	 * Get the color for the features with the lowest count
73
+	 *
74
+	 * @return Color
75
+	 */
76
+	public function minValueColor(): Color
77
+	{
78
+		return new Rgb(255, 255, 255);
79
+	}
80 80
 
81
-    /**
82
-     * Get the color for the features with the highest count
83
-     *
84
-     * @return Color
85
-     */
86
-    public function maxValueColor(): Color
87
-    {
88
-        return $this->max_value;
89
-    }
81
+	/**
82
+	 * Get the color for the features with the highest count
83
+	 *
84
+	 * @return Color
85
+	 */
86
+	public function maxValueColor(): Color
87
+	{
88
+		return $this->max_value;
89
+	}
90 90
 
91
-    /**
92
-     * Get the color for feature hovering
93
-     *
94
-     * @return Color
95
-     */
96
-    public function hoverColor(): Color
97
-    {
98
-        return $this->hover;
99
-    }
91
+	/**
92
+	 * Get the color for feature hovering
93
+	 *
94
+	 * @return Color
95
+	 */
96
+	public function hoverColor(): Color
97
+	{
98
+		return $this->hover;
99
+	}
100 100
 
101
-    /**
102
-     * {@inheritDoc}
103
-     * @see JsonSerializable::jsonSerialize()
104
-     */
105
-    public function jsonSerialize()
106
-    {
107
-        return [
108
-            'default'   => (string) $this->defaultColor()->toHex(),
109
-            'stroke'    => (string) $this->strokeColor()->toHex(),
110
-            'maxvalue'  => (string) $this->maxValueColor()->toHex(),
111
-            'hover'     => (string) $this->hoverColor()->toHex(),
112
-        ];
113
-    }
101
+	/**
102
+	 * {@inheritDoc}
103
+	 * @see JsonSerializable::jsonSerialize()
104
+	 */
105
+	public function jsonSerialize()
106
+	{
107
+		return [
108
+			'default'   => (string) $this->defaultColor()->toHex(),
109
+			'stroke'    => (string) $this->strokeColor()->toHex(),
110
+			'maxvalue'  => (string) $this->maxValueColor()->toHex(),
111
+			'hover'     => (string) $this->hoverColor()->toHex(),
112
+		];
113
+	}
114 114
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -105,10 +105,10 @@
 block discarded – undo
105 105
     public function jsonSerialize()
106 106
     {
107 107
         return [
108
-            'default'   => (string) $this->defaultColor()->toHex(),
109
-            'stroke'    => (string) $this->strokeColor()->toHex(),
110
-            'maxvalue'  => (string) $this->maxValueColor()->toHex(),
111
-            'hover'     => (string) $this->hoverColor()->toHex(),
108
+            'default'   => (string)$this->defaultColor()->toHex(),
109
+            'stroke'    => (string)$this->strokeColor()->toHex(),
110
+            'maxvalue'  => (string)$this->maxValueColor()->toHex(),
111
+            'hover'     => (string)$this->hoverColor()->toHex(),
112 112
         ];
113 113
     }
114 114
 }
Please login to merge, or discard this patch.
app/Common/GeoDispersion/Config/NullPlaceMapperConfig.php 1 patch
Indentation   +52 added lines, -52 removed lines patch added patch discarded remove patch
@@ -26,61 +26,61 @@
 block discarded – undo
26 26
  */
27 27
 class NullPlaceMapperConfig implements PlaceMapperConfigInterface
28 28
 {
29
-    /**
30
-     * {@inheritDoc}
31
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperConfigInterface::get()
32
-     */
33
-    public function get(string $key, $default = null)
34
-    {
35
-        return $default;
36
-    }
29
+	/**
30
+	 * {@inheritDoc}
31
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperConfigInterface::get()
32
+	 */
33
+	public function get(string $key, $default = null)
34
+	{
35
+		return $default;
36
+	}
37 37
 
38
-    /**
39
-     * {@inheritDoc}
40
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperConfigInterface::has()
41
-     */
42
-    public function has(string $key): bool
43
-    {
44
-        return false;
45
-    }
38
+	/**
39
+	 * {@inheritDoc}
40
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperConfigInterface::has()
41
+	 */
42
+	public function has(string $key): bool
43
+	{
44
+		return false;
45
+	}
46 46
 
47
-    /**
48
-     * {@inheritDoc}
49
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperConfigInterface::jsonDeserialize()
50
-     *
51
-     * @param mixed $config
52
-     * @return $this
53
-     */
54
-    public function jsonDeserialize($config): self
55
-    {
56
-        return $this;
57
-    }
47
+	/**
48
+	 * {@inheritDoc}
49
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperConfigInterface::jsonDeserialize()
50
+	 *
51
+	 * @param mixed $config
52
+	 * @return $this
53
+	 */
54
+	public function jsonDeserialize($config): self
55
+	{
56
+		return $this;
57
+	}
58 58
 
59
-    /**
60
-     * {@inheritDoc}
61
-     * @see JsonSerializable::jsonSerialize()
62
-     */
63
-    public function jsonSerialize()
64
-    {
65
-        return [];
66
-    }
59
+	/**
60
+	 * {@inheritDoc}
61
+	 * @see JsonSerializable::jsonSerialize()
62
+	 */
63
+	public function jsonSerialize()
64
+	{
65
+		return [];
66
+	}
67 67
 
68
-    /**
69
-     * {@inheritDoc}
70
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperConfigInterface::configContent()
71
-     */
72
-    public function configContent(ModuleInterface $module, Tree $tree): string
73
-    {
74
-        return '';
75
-    }
68
+	/**
69
+	 * {@inheritDoc}
70
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperConfigInterface::configContent()
71
+	 */
72
+	public function configContent(ModuleInterface $module, Tree $tree): string
73
+	{
74
+		return '';
75
+	}
76 76
 
77
-    /**
78
-     * {@inheritDoc}
79
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperConfigInterface::withConfigUpdate()
80
-     * @return $this
81
-     */
82
-    public function withConfigUpdate(ServerRequestInterface $request): self
83
-    {
84
-        return $this;
85
-    }
77
+	/**
78
+	 * {@inheritDoc}
79
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\PlaceMapperConfigInterface::withConfigUpdate()
80
+	 * @return $this
81
+	 */
82
+	public function withConfigUpdate(ServerRequestInterface $request): self
83
+	{
84
+		return $this;
85
+	}
86 86
 }
Please login to merge, or discard this patch.
app/Common/GeoDispersion/Config/MapViewConfig.php 1 patch
Indentation   +43 added lines, -43 removed lines patch added patch discarded remove patch
@@ -23,51 +23,51 @@
 block discarded – undo
23 23
  */
24 24
 class MapViewConfig implements MapViewConfigInterface
25 25
 {
26
-    private string $map_mapping_property;
27
-    private PlaceMapperConfigInterface $mapper_config;
26
+	private string $map_mapping_property;
27
+	private PlaceMapperConfigInterface $mapper_config;
28 28
 
29
-    /**
30
-     * Constructor for MapViewConfig
31
-     *
32
-     * @param string $map_mapping_property
33
-     * @param PlaceMapperConfigInterface $mapper_config
34
-     */
35
-    public function __construct(
36
-        string $map_mapping_property,
37
-        PlaceMapperConfigInterface $mapper_config = null
38
-    ) {
39
-        $this->map_mapping_property = $map_mapping_property;
40
-        $this->mapper_config = $mapper_config ?? new NullPlaceMapperConfig();
41
-    }
29
+	/**
30
+	 * Constructor for MapViewConfig
31
+	 *
32
+	 * @param string $map_mapping_property
33
+	 * @param PlaceMapperConfigInterface $mapper_config
34
+	 */
35
+	public function __construct(
36
+		string $map_mapping_property,
37
+		PlaceMapperConfigInterface $mapper_config = null
38
+	) {
39
+		$this->map_mapping_property = $map_mapping_property;
40
+		$this->mapper_config = $mapper_config ?? new NullPlaceMapperConfig();
41
+	}
42 42
 
43
-    /**
44
-     * {@inheritDoc}
45
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapViewConfigInterface::mapMappingProperty()
46
-     */
47
-    public function mapMappingProperty(): string
48
-    {
49
-        return $this->map_mapping_property;
50
-    }
43
+	/**
44
+	 * {@inheritDoc}
45
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapViewConfigInterface::mapMappingProperty()
46
+	 */
47
+	public function mapMappingProperty(): string
48
+	{
49
+		return $this->map_mapping_property;
50
+	}
51 51
 
52
-    /**
53
-     * {@inheritDoc}
54
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapViewConfigInterface::mapperConfig()
55
-     */
56
-    public function mapperConfig(): PlaceMapperConfigInterface
57
-    {
58
-        return $this->mapper_config;
59
-    }
52
+	/**
53
+	 * {@inheritDoc}
54
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapViewConfigInterface::mapperConfig()
55
+	 */
56
+	public function mapperConfig(): PlaceMapperConfigInterface
57
+	{
58
+		return $this->mapper_config;
59
+	}
60 60
 
61
-    /**
62
-     * {@inheritDoc}
63
-     * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapViewConfigInterface::with()
64
-     * @return static
65
-     */
66
-    public function with(string $mapping_property, PlaceMapperConfigInterface $mapper_config): self
67
-    {
68
-        $new = clone $this;
69
-        $new->map_mapping_property = $mapping_property;
70
-        $new->mapper_config = $mapper_config;
71
-        return $new;
72
-    }
61
+	/**
62
+	 * {@inheritDoc}
63
+	 * @see \MyArtJaub\Webtrees\Contracts\GeoDispersion\MapViewConfigInterface::with()
64
+	 * @return static
65
+	 */
66
+	public function with(string $mapping_property, PlaceMapperConfigInterface $mapper_config): self
67
+	{
68
+		$new = clone $this;
69
+		$new->map_mapping_property = $mapping_property;
70
+		$new->mapper_config = $mapper_config;
71
+		return $new;
72
+	}
73 73
 }
Please login to merge, or discard this patch.
app/Module/Certificates/Services/CertificateFilesystemService.php 2 patches
Indentation   +117 added lines, -117 removed lines patch added patch discarded remove patch
@@ -32,129 +32,129 @@
 block discarded – undo
32 32
  */
33 33
 class CertificateFilesystemService
34 34
 {
35
-    /**
36
-     * @var array<int,FilesystemOperator> $filesystem
37
-     */
38
-    private array $filesystem = [];
35
+	/**
36
+	 * @var array<int,FilesystemOperator> $filesystem
37
+	 */
38
+	private array $filesystem = [];
39 39
 
40
-    /**
41
-     * Get the filesystem containing certificates for a tree.
42
-     *
43
-     * @param Tree $tree
44
-     * @return FilesystemOperator
45
-     */
46
-    public function filesystem(Tree $tree): FilesystemOperator
47
-    {
48
-        if (!isset($this->filesystem[$tree->id()])) {
49
-            $cert_dir = $tree->getPreference('MAJ_CERTIF_ROOTDIR', 'certificates/');
50
-            $adapter   = new ChrootAdapter(Registry::filesystem()->data(), $cert_dir);
40
+	/**
41
+	 * Get the filesystem containing certificates for a tree.
42
+	 *
43
+	 * @param Tree $tree
44
+	 * @return FilesystemOperator
45
+	 */
46
+	public function filesystem(Tree $tree): FilesystemOperator
47
+	{
48
+		if (!isset($this->filesystem[$tree->id()])) {
49
+			$cert_dir = $tree->getPreference('MAJ_CERTIF_ROOTDIR', 'certificates/');
50
+			$adapter   = new ChrootAdapter(Registry::filesystem()->data(), $cert_dir);
51 51
 
52
-            $this->filesystem[$tree->id()] = new FileSystem($adapter);
53
-        }
54
-        return $this->filesystem[$tree->id()];
55
-    }
52
+			$this->filesystem[$tree->id()] = new FileSystem($adapter);
53
+		}
54
+		return $this->filesystem[$tree->id()];
55
+	}
56 56
 
57
-    /**
58
-     * Set the filesystem containing certificates for a tree.
59
-     *
60
-     * @param Tree $tree
61
-     * @param FilesystemOperator $filesystem
62
-     */
63
-    public function setFilesystem(Tree $tree, FilesystemOperator $filesystem): void
64
-    {
65
-        $this->filesystem[$tree->id()] = $filesystem;
66
-    }
57
+	/**
58
+	 * Set the filesystem containing certificates for a tree.
59
+	 *
60
+	 * @param Tree $tree
61
+	 * @param FilesystemOperator $filesystem
62
+	 */
63
+	public function setFilesystem(Tree $tree, FilesystemOperator $filesystem): void
64
+	{
65
+		$this->filesystem[$tree->id()] = $filesystem;
66
+	}
67 67
 
68
-    /**
69
-     * Create the Certificate object defined by a path on the filesystem.
70
-     *
71
-     * @param Tree $tree
72
-     * @param string $path
73
-     * @return Certificate|NULL
74
-     */
75
-    public function certificate(Tree $tree, string $path): ?Certificate
76
-    {
77
-        $filesystem = $this->filesystem($tree);
78
-        if ($filesystem->fileExists($path) && $this->isFileSupported($filesystem, $path)) {
79
-            return new Certificate($tree, $path);
80
-        }
81
-        return null;
82
-    }
68
+	/**
69
+	 * Create the Certificate object defined by a path on the filesystem.
70
+	 *
71
+	 * @param Tree $tree
72
+	 * @param string $path
73
+	 * @return Certificate|NULL
74
+	 */
75
+	public function certificate(Tree $tree, string $path): ?Certificate
76
+	{
77
+		$filesystem = $this->filesystem($tree);
78
+		if ($filesystem->fileExists($path) && $this->isFileSupported($filesystem, $path)) {
79
+			return new Certificate($tree, $path);
80
+		}
81
+		return null;
82
+	}
83 83
 
84
-    /**
85
-     * Get the cities (first-level folder) available in a the filesystem.
86
-     *
87
-     * @param Tree $tree
88
-     * @return string[]
89
-     */
90
-    public function cities(Tree $tree): array
91
-    {
92
-        $cities =  $this->filesystem($tree)
93
-            ->listContents('')
94
-            ->filter(fn (StorageAttributes $attributes): bool => $attributes->isDir())
95
-            ->map(fn (StorageAttributes $attributes): string => $attributes->path())
96
-            ->toArray();
97
-        usort($cities, I18N::comparator());
98
-        return $cities;
99
-    }
84
+	/**
85
+	 * Get the cities (first-level folder) available in a the filesystem.
86
+	 *
87
+	 * @param Tree $tree
88
+	 * @return string[]
89
+	 */
90
+	public function cities(Tree $tree): array
91
+	{
92
+		$cities =  $this->filesystem($tree)
93
+			->listContents('')
94
+			->filter(fn (StorageAttributes $attributes): bool => $attributes->isDir())
95
+			->map(fn (StorageAttributes $attributes): string => $attributes->path())
96
+			->toArray();
97
+		usort($cities, I18N::comparator());
98
+		return $cities;
99
+	}
100 100
 
101
-    /**
102
-     * Get the certificates available for a city (first-level folder).
103
-     *
104
-     * @param Tree $tree
105
-     * @param string $city
106
-     * @return Collection<Certificate>
107
-     */
108
-    public function certificatesForCity(Tree $tree, string $city): Collection
109
-    {
110
-        $filesystem = $this->filesystem($tree);
111
-        $certificates_paths = $filesystem->listContents($city)
112
-            ->filter(fn (StorageAttributes $attributes): bool  =>
113
-                $attributes->isFile() && $this->isFileSupported($filesystem, $attributes->path()))
114
-            ->map(fn (StorageAttributes $attributes): string => $attributes->path())
115
-            ->toArray();
116
-        usort($certificates_paths, I18N::comparator());
117
-        return collect($certificates_paths)->map(fn (string $path): Certificate => new Certificate($tree, $path));
118
-    }
101
+	/**
102
+	 * Get the certificates available for a city (first-level folder).
103
+	 *
104
+	 * @param Tree $tree
105
+	 * @param string $city
106
+	 * @return Collection<Certificate>
107
+	 */
108
+	public function certificatesForCity(Tree $tree, string $city): Collection
109
+	{
110
+		$filesystem = $this->filesystem($tree);
111
+		$certificates_paths = $filesystem->listContents($city)
112
+			->filter(fn (StorageAttributes $attributes): bool  =>
113
+				$attributes->isFile() && $this->isFileSupported($filesystem, $attributes->path()))
114
+			->map(fn (StorageAttributes $attributes): string => $attributes->path())
115
+			->toArray();
116
+		usort($certificates_paths, I18N::comparator());
117
+		return collect($certificates_paths)->map(fn (string $path): Certificate => new Certificate($tree, $path));
118
+	}
119 119
 
120
-    /**
121
-     * Get the certificates available for a city (first-level folder), containing a specified text.
122
-     *
123
-     * @param Tree $tree
124
-     * @param string $city
125
-     * @param string $contains
126
-     * @return Collection<Certificate>
127
-     */
128
-    public function certificatesForCityContaining(Tree $tree, string $city, string $contains): Collection
129
-    {
130
-        $filesystem = $this->filesystem($tree);
131
-        $certificates_paths = $filesystem->listContents($city)
132
-            ->filter(fn (StorageAttributes $attributes): bool  =>
133
-                $attributes->isFile() && $this->isFileSupported($filesystem, $attributes->path())
134
-                && mb_stripos($attributes->path(), $contains) !== false)
135
-            ->map(fn (StorageAttributes $attributes): string => $attributes->path())
136
-            ->toArray();
137
-        usort($certificates_paths, I18N::comparator());
138
-        return collect($certificates_paths)->map(fn (string $path): Certificate => new Certificate($tree, $path));
139
-    }
120
+	/**
121
+	 * Get the certificates available for a city (first-level folder), containing a specified text.
122
+	 *
123
+	 * @param Tree $tree
124
+	 * @param string $city
125
+	 * @param string $contains
126
+	 * @return Collection<Certificate>
127
+	 */
128
+	public function certificatesForCityContaining(Tree $tree, string $city, string $contains): Collection
129
+	{
130
+		$filesystem = $this->filesystem($tree);
131
+		$certificates_paths = $filesystem->listContents($city)
132
+			->filter(fn (StorageAttributes $attributes): bool  =>
133
+				$attributes->isFile() && $this->isFileSupported($filesystem, $attributes->path())
134
+				&& mb_stripos($attributes->path(), $contains) !== false)
135
+			->map(fn (StorageAttributes $attributes): string => $attributes->path())
136
+			->toArray();
137
+		usort($certificates_paths, I18N::comparator());
138
+		return collect($certificates_paths)->map(fn (string $path): Certificate => new Certificate($tree, $path));
139
+	}
140 140
 
141
-    /**
142
-     * Check if a file on the filesystem is supported by the certificate module.
143
-     *
144
-     * @param FilesystemOperator $filesystem
145
-     * @param string $path
146
-     * @return bool
147
-     */
148
-    protected function isFileSupported(FilesystemOperator $filesystem, string $path): bool
149
-    {
150
-        try {
151
-            $mime = $filesystem->mimeType($path);
152
-            return Registry::cache()->array()->remember(
153
-                'maj-certif-supportedfiles-' . $mime,
154
-                fn (): bool => app(CertificateImageFactory::class)->isMimeTypeSupported($mime)
155
-            );
156
-        } catch (UnableToRetrieveMetadata | FilesystemException $ex) {
157
-        }
158
-        return false;
159
-    }
141
+	/**
142
+	 * Check if a file on the filesystem is supported by the certificate module.
143
+	 *
144
+	 * @param FilesystemOperator $filesystem
145
+	 * @param string $path
146
+	 * @return bool
147
+	 */
148
+	protected function isFileSupported(FilesystemOperator $filesystem, string $path): bool
149
+	{
150
+		try {
151
+			$mime = $filesystem->mimeType($path);
152
+			return Registry::cache()->array()->remember(
153
+				'maj-certif-supportedfiles-' . $mime,
154
+				fn (): bool => app(CertificateImageFactory::class)->isMimeTypeSupported($mime)
155
+			);
156
+		} catch (UnableToRetrieveMetadata | FilesystemException $ex) {
157
+		}
158
+		return false;
159
+	}
160 160
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -47,7 +47,7 @@  discard block
 block discarded – undo
47 47
     {
48 48
         if (!isset($this->filesystem[$tree->id()])) {
49 49
             $cert_dir = $tree->getPreference('MAJ_CERTIF_ROOTDIR', 'certificates/');
50
-            $adapter   = new ChrootAdapter(Registry::filesystem()->data(), $cert_dir);
50
+            $adapter = new ChrootAdapter(Registry::filesystem()->data(), $cert_dir);
51 51
 
52 52
             $this->filesystem[$tree->id()] = new FileSystem($adapter);
53 53
         }
@@ -89,10 +89,10 @@  discard block
 block discarded – undo
89 89
      */
90 90
     public function cities(Tree $tree): array
91 91
     {
92
-        $cities =  $this->filesystem($tree)
92
+        $cities = $this->filesystem($tree)
93 93
             ->listContents('')
94
-            ->filter(fn (StorageAttributes $attributes): bool => $attributes->isDir())
95
-            ->map(fn (StorageAttributes $attributes): string => $attributes->path())
94
+            ->filter(fn(StorageAttributes $attributes): bool => $attributes->isDir())
95
+            ->map(fn(StorageAttributes $attributes): string => $attributes->path())
96 96
             ->toArray();
97 97
         usort($cities, I18N::comparator());
98 98
         return $cities;
@@ -109,12 +109,12 @@  discard block
 block discarded – undo
109 109
     {
110 110
         $filesystem = $this->filesystem($tree);
111 111
         $certificates_paths = $filesystem->listContents($city)
112
-            ->filter(fn (StorageAttributes $attributes): bool  =>
112
+            ->filter(fn(StorageAttributes $attributes): bool  =>
113 113
                 $attributes->isFile() && $this->isFileSupported($filesystem, $attributes->path()))
114
-            ->map(fn (StorageAttributes $attributes): string => $attributes->path())
114
+            ->map(fn(StorageAttributes $attributes): string => $attributes->path())
115 115
             ->toArray();
116 116
         usort($certificates_paths, I18N::comparator());
117
-        return collect($certificates_paths)->map(fn (string $path): Certificate => new Certificate($tree, $path));
117
+        return collect($certificates_paths)->map(fn(string $path): Certificate => new Certificate($tree, $path));
118 118
     }
119 119
 
120 120
     /**
@@ -129,13 +129,13 @@  discard block
 block discarded – undo
129 129
     {
130 130
         $filesystem = $this->filesystem($tree);
131 131
         $certificates_paths = $filesystem->listContents($city)
132
-            ->filter(fn (StorageAttributes $attributes): bool  =>
132
+            ->filter(fn(StorageAttributes $attributes): bool  =>
133 133
                 $attributes->isFile() && $this->isFileSupported($filesystem, $attributes->path())
134 134
                 && mb_stripos($attributes->path(), $contains) !== false)
135
-            ->map(fn (StorageAttributes $attributes): string => $attributes->path())
135
+            ->map(fn(StorageAttributes $attributes): string => $attributes->path())
136 136
             ->toArray();
137 137
         usort($certificates_paths, I18N::comparator());
138
-        return collect($certificates_paths)->map(fn (string $path): Certificate => new Certificate($tree, $path));
138
+        return collect($certificates_paths)->map(fn(string $path): Certificate => new Certificate($tree, $path));
139 139
     }
140 140
 
141 141
     /**
@@ -150,8 +150,8 @@  discard block
 block discarded – undo
150 150
         try {
151 151
             $mime = $filesystem->mimeType($path);
152 152
             return Registry::cache()->array()->remember(
153
-                'maj-certif-supportedfiles-' . $mime,
154
-                fn (): bool => app(CertificateImageFactory::class)->isMimeTypeSupported($mime)
153
+                'maj-certif-supportedfiles-'.$mime,
154
+                fn(): bool => app(CertificateImageFactory::class)->isMimeTypeSupported($mime)
155 155
             );
156 156
         } catch (UnableToRetrieveMetadata | FilesystemException $ex) {
157 157
         }
Please login to merge, or discard this patch.