summaryrefslogtreecommitdiff
path: root/vendor/doctrine/inflector
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/doctrine/inflector')
-rw-r--r--vendor/doctrine/inflector/LICENSE19
-rw-r--r--vendor/doctrine/inflector/README.md7
-rw-r--r--vendor/doctrine/inflector/composer.json41
-rw-r--r--vendor/doctrine/inflector/docs/en/index.rst226
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php24
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php66
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php507
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php52
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Language.php19
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php33
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php13
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php184
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php21
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php31
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php189
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php44
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php21
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php31
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php28
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php34
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php21
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php31
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php30
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php42
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php34
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php98
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php21
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php31
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php32
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php39
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php47
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php21
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php31
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php30
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php30
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php57
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php39
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php29
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php34
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php21
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php31
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php30
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php21
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php56
-rw-r--r--vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php10
45 files changed, 2456 insertions, 0 deletions
diff --git a/vendor/doctrine/inflector/LICENSE b/vendor/doctrine/inflector/LICENSE
new file mode 100644
index 0000000..8c38cc1
--- /dev/null
+++ b/vendor/doctrine/inflector/LICENSE
@@ -0,0 +1,19 @@
1Copyright (c) 2006-2015 Doctrine Project
2
3Permission is hereby granted, free of charge, to any person obtaining a copy of
4this software and associated documentation files (the "Software"), to deal in
5the Software without restriction, including without limitation the rights to
6use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7of the Software, and to permit persons to whom the Software is furnished to do
8so, subject to the following conditions:
9
10The above copyright notice and this permission notice shall be included in all
11copies or substantial portions of the Software.
12
13THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19SOFTWARE.
diff --git a/vendor/doctrine/inflector/README.md b/vendor/doctrine/inflector/README.md
new file mode 100644
index 0000000..6e3a97f
--- /dev/null
+++ b/vendor/doctrine/inflector/README.md
@@ -0,0 +1,7 @@
1# Doctrine Inflector
2
3Doctrine Inflector is a small library that can perform string manipulations
4with regard to uppercase/lowercase and singular/plural forms of words.
5
6[![Build Status](https://github.com/doctrine/inflector/workflows/Continuous%20Integration/badge.svg)](https://github.com/doctrine/inflector/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A4.0.x)
7[![Code Coverage](https://codecov.io/gh/doctrine/inflector/branch/2.0.x/graph/badge.svg)](https://codecov.io/gh/doctrine/inflector/branch/2.0.x)
diff --git a/vendor/doctrine/inflector/composer.json b/vendor/doctrine/inflector/composer.json
new file mode 100644
index 0000000..91d7707
--- /dev/null
+++ b/vendor/doctrine/inflector/composer.json
@@ -0,0 +1,41 @@
1{
2 "name": "doctrine/inflector",
3 "type": "library",
4 "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
5 "keywords": ["php", "strings", "words", "manipulation", "inflector", "inflection", "uppercase", "lowercase", "singular", "plural"],
6 "homepage": "https://www.doctrine-project.org/projects/inflector.html",
7 "license": "MIT",
8 "authors": [
9 {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"},
10 {"name": "Roman Borschel", "email": "roman@code-factory.org"},
11 {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"},
12 {"name": "Jonathan Wage", "email": "jonwage@gmail.com"},
13 {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"}
14 ],
15 "require": {
16 "php": "^7.2 || ^8.0"
17 },
18 "require-dev": {
19 "doctrine/coding-standard": "^11.0",
20 "phpstan/phpstan": "^1.8",
21 "phpstan/phpstan-phpunit": "^1.1",
22 "phpstan/phpstan-strict-rules": "^1.3",
23 "phpunit/phpunit": "^8.5 || ^9.5",
24 "vimeo/psalm": "^4.25 || ^5.4"
25 },
26 "autoload": {
27 "psr-4": {
28 "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
29 }
30 },
31 "autoload-dev": {
32 "psr-4": {
33 "Doctrine\\Tests\\Inflector\\": "tests/Doctrine/Tests/Inflector"
34 }
35 },
36 "config": {
37 "allow-plugins": {
38 "dealerdirect/phpcodesniffer-composer-installer": true
39 }
40 }
41}
diff --git a/vendor/doctrine/inflector/docs/en/index.rst b/vendor/doctrine/inflector/docs/en/index.rst
new file mode 100644
index 0000000..29866f4
--- /dev/null
+++ b/vendor/doctrine/inflector/docs/en/index.rst
@@ -0,0 +1,226 @@
1Introduction
2============
3
4The Doctrine Inflector has methods for inflecting text. The features include pluralization,
5singularization, converting between camelCase and under_score and capitalizing
6words.
7
8Installation
9============
10
11You can install the Inflector with composer:
12
13.. code-block:: console
14
15 $ composer require doctrine/inflector
16
17Usage
18=====
19
20Using the inflector is easy, you can create a new ``Doctrine\Inflector\Inflector`` instance by using
21the ``Doctrine\Inflector\InflectorFactory`` class:
22
23.. code-block:: php
24
25 use Doctrine\Inflector\InflectorFactory;
26
27 $inflector = InflectorFactory::create()->build();
28
29By default it will create an English inflector. If you want to use another language, just pass the language
30you want to create an inflector for to the ``createForLanguage()`` method:
31
32.. code-block:: php
33
34 use Doctrine\Inflector\InflectorFactory;
35 use Doctrine\Inflector\Language;
36
37 $inflector = InflectorFactory::createForLanguage(Language::SPANISH)->build();
38
39The supported languages are as follows:
40
41- ``Language::ENGLISH``
42- ``Language::FRENCH``
43- ``Language::NORWEGIAN_BOKMAL``
44- ``Language::PORTUGUESE``
45- ``Language::SPANISH``
46- ``Language::TURKISH``
47
48If you want to manually construct the inflector instead of using a factory, you can do so like this:
49
50.. code-block:: php
51
52 use Doctrine\Inflector\CachedWordInflector;
53 use Doctrine\Inflector\RulesetInflector;
54 use Doctrine\Inflector\Rules\English;
55
56 $inflector = new Inflector(
57 new CachedWordInflector(new RulesetInflector(
58 English\Rules::getSingularRuleset()
59 )),
60 new CachedWordInflector(new RulesetInflector(
61 English\Rules::getPluralRuleset()
62 ))
63 );
64
65Adding Languages
66----------------
67
68If you are interested in adding support for your language, take a look at the other languages defined in the
69``Doctrine\Inflector\Rules`` namespace and the tests located in ``Doctrine\Tests\Inflector\Rules``. You can copy
70one of the languages and update the rules for your language.
71
72Once you have done this, send a pull request to the ``doctrine/inflector`` repository with the additions.
73
74Custom Setup
75============
76
77If you want to setup custom singular and plural rules, you can configure these in the factory:
78
79.. code-block:: php
80
81 use Doctrine\Inflector\InflectorFactory;
82 use Doctrine\Inflector\Rules\Pattern;
83 use Doctrine\Inflector\Rules\Patterns;
84 use Doctrine\Inflector\Rules\Ruleset;
85 use Doctrine\Inflector\Rules\Substitution;
86 use Doctrine\Inflector\Rules\Substitutions;
87 use Doctrine\Inflector\Rules\Transformation;
88 use Doctrine\Inflector\Rules\Transformations;
89 use Doctrine\Inflector\Rules\Word;
90
91 $inflector = InflectorFactory::create()
92 ->withSingularRules(
93 new Ruleset(
94 new Transformations(
95 new Transformation(new Pattern('/^(bil)er$/i'), '\1'),
96 new Transformation(new Pattern('/^(inflec|contribu)tors$/i'), '\1ta')
97 ),
98 new Patterns(new Pattern('singulars')),
99 new Substitutions(new Substitution(new Word('spins'), new Word('spinor')))
100 )
101 )
102 ->withPluralRules(
103 new Ruleset(
104 new Transformations(
105 new Transformation(new Pattern('^(bil)er$'), '\1'),
106 new Transformation(new Pattern('^(inflec|contribu)tors$'), '\1ta')
107 ),
108 new Patterns(new Pattern('noflect'), new Pattern('abtuse')),
109 new Substitutions(
110 new Substitution(new Word('amaze'), new Word('amazable')),
111 new Substitution(new Word('phone'), new Word('phonezes'))
112 )
113 )
114 )
115 ->build();
116
117No operation inflector
118----------------------
119
120The ``Doctrine\Inflector\NoopWordInflector`` may be used to configure an inflector that doesn't perform any operation for
121pluralization and/or singularization. If will simply return the input as output.
122
123This is an implementation of the `Null Object design pattern <https://sourcemaking.com/design_patterns/null_object>`_.
124
125.. code-block:: php
126
127 use Doctrine\Inflector\Inflector;
128 use Doctrine\Inflector\NoopWordInflector;
129
130 $inflector = new Inflector(new NoopWordInflector(), new NoopWordInflector());
131
132Tableize
133========
134
135Converts ``ModelName`` to ``model_name``:
136
137.. code-block:: php
138
139 echo $inflector->tableize('ModelName'); // model_name
140
141Classify
142========
143
144Converts ``model_name`` to ``ModelName``:
145
146.. code-block:: php
147
148 echo $inflector->classify('model_name'); // ModelName
149
150Camelize
151========
152
153This method uses `Classify`_ and then converts the first character to lowercase:
154
155.. code-block:: php
156
157 echo $inflector->camelize('model_name'); // modelName
158
159Capitalize
160==========
161
162Takes a string and capitalizes all of the words, like PHP's built-in
163``ucwords`` function. This extends that behavior, however, by allowing the
164word delimiters to be configured, rather than only separating on
165whitespace.
166
167Here is an example:
168
169.. code-block:: php
170
171 $string = 'top-o-the-morning to all_of_you!';
172
173 echo $inflector->capitalize($string); // Top-O-The-Morning To All_of_you!
174
175 echo $inflector->capitalize($string, '-_ '); // Top-O-The-Morning To All_Of_You!
176
177Pluralize
178=========
179
180Returns a word in plural form.
181
182.. code-block:: php
183
184 echo $inflector->pluralize('browser'); // browsers
185
186Singularize
187===========
188
189Returns a word in singular form.
190
191.. code-block:: php
192
193 echo $inflector->singularize('browsers'); // browser
194
195Urlize
196======
197
198Generate a URL friendly string from a string of text:
199
200.. code-block:: php
201
202 echo $inflector->urlize('My first blog post'); // my-first-blog-post
203
204Unaccent
205========
206
207You can unaccent a string of text using the ``unaccent()`` method:
208
209.. code-block:: php
210
211 echo $inflector->unaccent('año'); // ano
212
213Legacy API
214==========
215
216The API present in Inflector 1.x is still available, but will be deprecated in a future release and dropped for 3.0.
217Support for languages other than English is available in the 2.0 API only.
218
219Acknowledgements
220================
221
222The language rules in this library have been adapted from several different sources, including but not limited to:
223
224- `Ruby On Rails Inflector <http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html>`_
225- `ICanBoogie Inflector <https://github.com/ICanBoogie/Inflector>`_
226- `CakePHP Inflector <https://book.cakephp.org/3.0/en/core-libraries/inflector.html>`_
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php
new file mode 100644
index 0000000..2d52908
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php
@@ -0,0 +1,24 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector;
6
7class CachedWordInflector implements WordInflector
8{
9 /** @var WordInflector */
10 private $wordInflector;
11
12 /** @var string[] */
13 private $cache = [];
14
15 public function __construct(WordInflector $wordInflector)
16 {
17 $this->wordInflector = $wordInflector;
18 }
19
20 public function inflect(string $word): string
21 {
22 return $this->cache[$word] ?? $this->cache[$word] = $this->wordInflector->inflect($word);
23 }
24}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php
new file mode 100644
index 0000000..166061d
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php
@@ -0,0 +1,66 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector;
6
7use Doctrine\Inflector\Rules\Ruleset;
8
9use function array_unshift;
10
11abstract class GenericLanguageInflectorFactory implements LanguageInflectorFactory
12{
13 /** @var Ruleset[] */
14 private $singularRulesets = [];
15
16 /** @var Ruleset[] */
17 private $pluralRulesets = [];
18
19 final public function __construct()
20 {
21 $this->singularRulesets[] = $this->getSingularRuleset();
22 $this->pluralRulesets[] = $this->getPluralRuleset();
23 }
24
25 final public function build(): Inflector
26 {
27 return new Inflector(
28 new CachedWordInflector(new RulesetInflector(
29 ...$this->singularRulesets
30 )),
31 new CachedWordInflector(new RulesetInflector(
32 ...$this->pluralRulesets
33 ))
34 );
35 }
36
37 final public function withSingularRules(?Ruleset $singularRules, bool $reset = false): LanguageInflectorFactory
38 {
39 if ($reset) {
40 $this->singularRulesets = [];
41 }
42
43 if ($singularRules instanceof Ruleset) {
44 array_unshift($this->singularRulesets, $singularRules);
45 }
46
47 return $this;
48 }
49
50 final public function withPluralRules(?Ruleset $pluralRules, bool $reset = false): LanguageInflectorFactory
51 {
52 if ($reset) {
53 $this->pluralRulesets = [];
54 }
55
56 if ($pluralRules instanceof Ruleset) {
57 array_unshift($this->pluralRulesets, $pluralRules);
58 }
59
60 return $this;
61 }
62
63 abstract protected function getSingularRuleset(): Ruleset;
64
65 abstract protected function getPluralRuleset(): Ruleset;
66}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php
new file mode 100644
index 0000000..610a4cf
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php
@@ -0,0 +1,507 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector;
6
7use RuntimeException;
8
9use function chr;
10use function function_exists;
11use function lcfirst;
12use function mb_strtolower;
13use function ord;
14use function preg_match;
15use function preg_replace;
16use function sprintf;
17use function str_replace;
18use function strlen;
19use function strtolower;
20use function strtr;
21use function trim;
22use function ucwords;
23
24class Inflector
25{
26 private const ACCENTED_CHARACTERS = [
27 'À' => 'A',
28 'Á' => 'A',
29 'Â' => 'A',
30 'Ã' => 'A',
31 'Ä' => 'Ae',
32 'Æ' => 'Ae',
33 'Å' => 'Aa',
34 'æ' => 'a',
35 'Ç' => 'C',
36 'È' => 'E',
37 'É' => 'E',
38 'Ê' => 'E',
39 'Ë' => 'E',
40 'Ì' => 'I',
41 'Í' => 'I',
42 'Î' => 'I',
43 'Ï' => 'I',
44 'Ñ' => 'N',
45 'Ò' => 'O',
46 'Ó' => 'O',
47 'Ô' => 'O',
48 'Õ' => 'O',
49 'Ö' => 'Oe',
50 'Ù' => 'U',
51 'Ú' => 'U',
52 'Û' => 'U',
53 'Ü' => 'Ue',
54 'Ý' => 'Y',
55 'ß' => 'ss',
56 'à' => 'a',
57 'á' => 'a',
58 'â' => 'a',
59 'ã' => 'a',
60 'ä' => 'ae',
61 'å' => 'aa',
62 'ç' => 'c',
63 'è' => 'e',
64 'é' => 'e',
65 'ê' => 'e',
66 'ë' => 'e',
67 'ì' => 'i',
68 'í' => 'i',
69 'î' => 'i',
70 'ï' => 'i',
71 'ñ' => 'n',
72 'ò' => 'o',
73 'ó' => 'o',
74 'ô' => 'o',
75 'õ' => 'o',
76 'ö' => 'oe',
77 'ù' => 'u',
78 'ú' => 'u',
79 'û' => 'u',
80 'ü' => 'ue',
81 'ý' => 'y',
82 'ÿ' => 'y',
83 'Ā' => 'A',
84 'ā' => 'a',
85 'Ă' => 'A',
86 'ă' => 'a',
87 'Ą' => 'A',
88 'ą' => 'a',
89 'Ć' => 'C',
90 'ć' => 'c',
91 'Ĉ' => 'C',
92 'ĉ' => 'c',
93 'Ċ' => 'C',
94 'ċ' => 'c',
95 'Č' => 'C',
96 'č' => 'c',
97 'Ď' => 'D',
98 'ď' => 'd',
99 'Đ' => 'D',
100 'đ' => 'd',
101 'Ē' => 'E',
102 'ē' => 'e',
103 'Ĕ' => 'E',
104 'ĕ' => 'e',
105 'Ė' => 'E',
106 'ė' => 'e',
107 'Ę' => 'E',
108 'ę' => 'e',
109 'Ě' => 'E',
110 'ě' => 'e',
111 'Ĝ' => 'G',
112 'ĝ' => 'g',
113 'Ğ' => 'G',
114 'ğ' => 'g',
115 'Ġ' => 'G',
116 'ġ' => 'g',
117 'Ģ' => 'G',
118 'ģ' => 'g',
119 'Ĥ' => 'H',
120 'ĥ' => 'h',
121 'Ħ' => 'H',
122 'ħ' => 'h',
123 'Ĩ' => 'I',
124 'ĩ' => 'i',
125 'Ī' => 'I',
126 'ī' => 'i',
127 'Ĭ' => 'I',
128 'ĭ' => 'i',
129 'Į' => 'I',
130 'į' => 'i',
131 'İ' => 'I',
132 'ı' => 'i',
133 'IJ' => 'IJ',
134 'ij' => 'ij',
135 'Ĵ' => 'J',
136 'ĵ' => 'j',
137 'Ķ' => 'K',
138 'ķ' => 'k',
139 'ĸ' => 'k',
140 'Ĺ' => 'L',
141 'ĺ' => 'l',
142 'Ļ' => 'L',
143 'ļ' => 'l',
144 'Ľ' => 'L',
145 'ľ' => 'l',
146 'Ŀ' => 'L',
147 'ŀ' => 'l',
148 'Ł' => 'L',
149 'ł' => 'l',
150 'Ń' => 'N',
151 'ń' => 'n',
152 'Ņ' => 'N',
153 'ņ' => 'n',
154 'Ň' => 'N',
155 'ň' => 'n',
156 'ʼn' => 'N',
157 'Ŋ' => 'n',
158 'ŋ' => 'N',
159 'Ō' => 'O',
160 'ō' => 'o',
161 'Ŏ' => 'O',
162 'ŏ' => 'o',
163 'Ő' => 'O',
164 'ő' => 'o',
165 'Œ' => 'OE',
166 'œ' => 'oe',
167 'Ø' => 'O',
168 'ø' => 'o',
169 'Ŕ' => 'R',
170 'ŕ' => 'r',
171 'Ŗ' => 'R',
172 'ŗ' => 'r',
173 'Ř' => 'R',
174 'ř' => 'r',
175 'Ś' => 'S',
176 'ś' => 's',
177 'Ŝ' => 'S',
178 'ŝ' => 's',
179 'Ş' => 'S',
180 'ş' => 's',
181 'Š' => 'S',
182 'š' => 's',
183 'Ţ' => 'T',
184 'ţ' => 't',
185 'Ť' => 'T',
186 'ť' => 't',
187 'Ŧ' => 'T',
188 'ŧ' => 't',
189 'Ũ' => 'U',
190 'ũ' => 'u',
191 'Ū' => 'U',
192 'ū' => 'u',
193 'Ŭ' => 'U',
194 'ŭ' => 'u',
195 'Ů' => 'U',
196 'ů' => 'u',
197 'Ű' => 'U',
198 'ű' => 'u',
199 'Ų' => 'U',
200 'ų' => 'u',
201 'Ŵ' => 'W',
202 'ŵ' => 'w',
203 'Ŷ' => 'Y',
204 'ŷ' => 'y',
205 'Ÿ' => 'Y',
206 'Ź' => 'Z',
207 'ź' => 'z',
208 'Ż' => 'Z',
209 'ż' => 'z',
210 'Ž' => 'Z',
211 'ž' => 'z',
212 'ſ' => 's',
213 '€' => 'E',
214 '£' => '',
215 ];
216
217 /** @var WordInflector */
218 private $singularizer;
219
220 /** @var WordInflector */
221 private $pluralizer;
222
223 public function __construct(WordInflector $singularizer, WordInflector $pluralizer)
224 {
225 $this->singularizer = $singularizer;
226 $this->pluralizer = $pluralizer;
227 }
228
229 /**
230 * Converts a word into the format for a Doctrine table name. Converts 'ModelName' to 'model_name'.
231 */
232 public function tableize(string $word): string
233 {
234 $tableized = preg_replace('~(?<=\\w)([A-Z])~u', '_$1', $word);
235
236 if ($tableized === null) {
237 throw new RuntimeException(sprintf(
238 'preg_replace returned null for value "%s"',
239 $word
240 ));
241 }
242
243 return mb_strtolower($tableized);
244 }
245
246 /**
247 * Converts a word into the format for a Doctrine class name. Converts 'table_name' to 'TableName'.
248 */
249 public function classify(string $word): string
250 {
251 return str_replace([' ', '_', '-'], '', ucwords($word, ' _-'));
252 }
253
254 /**
255 * Camelizes a word. This uses the classify() method and turns the first character to lowercase.
256 */
257 public function camelize(string $word): string
258 {
259 return lcfirst($this->classify($word));
260 }
261
262 /**
263 * Uppercases words with configurable delimiters between words.
264 *
265 * Takes a string and capitalizes all of the words, like PHP's built-in
266 * ucwords function. This extends that behavior, however, by allowing the
267 * word delimiters to be configured, rather than only separating on
268 * whitespace.
269 *
270 * Here is an example:
271 * <code>
272 * <?php
273 * $string = 'top-o-the-morning to all_of_you!';
274 * echo $inflector->capitalize($string);
275 * // Top-O-The-Morning To All_of_you!
276 *
277 * echo $inflector->capitalize($string, '-_ ');
278 * // Top-O-The-Morning To All_Of_You!
279 * ?>
280 * </code>
281 *
282 * @param string $string The string to operate on.
283 * @param string $delimiters A list of word separators.
284 *
285 * @return string The string with all delimiter-separated words capitalized.
286 */
287 public function capitalize(string $string, string $delimiters = " \n\t\r\0\x0B-"): string
288 {
289 return ucwords($string, $delimiters);
290 }
291
292 /**
293 * Checks if the given string seems like it has utf8 characters in it.
294 *
295 * @param string $string The string to check for utf8 characters in.
296 */
297 public function seemsUtf8(string $string): bool
298 {
299 for ($i = 0; $i < strlen($string); $i++) {
300 if (ord($string[$i]) < 0x80) {
301 continue; // 0bbbbbbb
302 }
303
304 if ((ord($string[$i]) & 0xE0) === 0xC0) {
305 $n = 1; // 110bbbbb
306 } elseif ((ord($string[$i]) & 0xF0) === 0xE0) {
307 $n = 2; // 1110bbbb
308 } elseif ((ord($string[$i]) & 0xF8) === 0xF0) {
309 $n = 3; // 11110bbb
310 } elseif ((ord($string[$i]) & 0xFC) === 0xF8) {
311 $n = 4; // 111110bb
312 } elseif ((ord($string[$i]) & 0xFE) === 0xFC) {
313 $n = 5; // 1111110b
314 } else {
315 return false; // Does not match any model
316 }
317
318 for ($j = 0; $j < $n; $j++) { // n bytes matching 10bbbbbb follow ?
319 if (++$i === strlen($string) || ((ord($string[$i]) & 0xC0) !== 0x80)) {
320 return false;
321 }
322 }
323 }
324
325 return true;
326 }
327
328 /**
329 * Remove any illegal characters, accents, etc.
330 *
331 * @param string $string String to unaccent
332 *
333 * @return string Unaccented string
334 */
335 public function unaccent(string $string): string
336 {
337 if (preg_match('/[\x80-\xff]/', $string) === false) {
338 return $string;
339 }
340
341 if ($this->seemsUtf8($string)) {
342 $string = strtr($string, self::ACCENTED_CHARACTERS);
343 } else {
344 $characters = [];
345
346 // Assume ISO-8859-1 if not UTF-8
347 $characters['in'] =
348 chr(128)
349 . chr(131)
350 . chr(138)
351 . chr(142)
352 . chr(154)
353 . chr(158)
354 . chr(159)
355 . chr(162)
356 . chr(165)
357 . chr(181)
358 . chr(192)
359 . chr(193)
360 . chr(194)
361 . chr(195)
362 . chr(196)
363 . chr(197)
364 . chr(199)
365 . chr(200)
366 . chr(201)
367 . chr(202)
368 . chr(203)
369 . chr(204)
370 . chr(205)
371 . chr(206)
372 . chr(207)
373 . chr(209)
374 . chr(210)
375 . chr(211)
376 . chr(212)
377 . chr(213)
378 . chr(214)
379 . chr(216)
380 . chr(217)
381 . chr(218)
382 . chr(219)
383 . chr(220)
384 . chr(221)
385 . chr(224)
386 . chr(225)
387 . chr(226)
388 . chr(227)
389 . chr(228)
390 . chr(229)
391 . chr(231)
392 . chr(232)
393 . chr(233)
394 . chr(234)
395 . chr(235)
396 . chr(236)
397 . chr(237)
398 . chr(238)
399 . chr(239)
400 . chr(241)
401 . chr(242)
402 . chr(243)
403 . chr(244)
404 . chr(245)
405 . chr(246)
406 . chr(248)
407 . chr(249)
408 . chr(250)
409 . chr(251)
410 . chr(252)
411 . chr(253)
412 . chr(255);
413
414 $characters['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy';
415
416 $string = strtr($string, $characters['in'], $characters['out']);
417
418 $doubleChars = [];
419
420 $doubleChars['in'] = [
421 chr(140),
422 chr(156),
423 chr(198),
424 chr(208),
425 chr(222),
426 chr(223),
427 chr(230),
428 chr(240),
429 chr(254),
430 ];
431
432 $doubleChars['out'] = ['OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th'];
433
434 $string = str_replace($doubleChars['in'], $doubleChars['out'], $string);
435 }
436
437 return $string;
438 }
439
440 /**
441 * Convert any passed string to a url friendly string.
442 * Converts 'My first blog post' to 'my-first-blog-post'
443 *
444 * @param string $string String to urlize.
445 *
446 * @return string Urlized string.
447 */
448 public function urlize(string $string): string
449 {
450 // Remove all non url friendly characters with the unaccent function
451 $unaccented = $this->unaccent($string);
452
453 if (function_exists('mb_strtolower')) {
454 $lowered = mb_strtolower($unaccented);
455 } else {
456 $lowered = strtolower($unaccented);
457 }
458
459 $replacements = [
460 '/\W/' => ' ',
461 '/([A-Z]+)([A-Z][a-z])/' => '\1_\2',
462 '/([a-z\d])([A-Z])/' => '\1_\2',
463 '/[^A-Z^a-z^0-9^\/]+/' => '-',
464 ];
465
466 $urlized = $lowered;
467
468 foreach ($replacements as $pattern => $replacement) {
469 $replaced = preg_replace($pattern, $replacement, $urlized);
470
471 if ($replaced === null) {
472 throw new RuntimeException(sprintf(
473 'preg_replace returned null for value "%s"',
474 $urlized
475 ));
476 }
477
478 $urlized = $replaced;
479 }
480
481 return trim($urlized, '-');
482 }
483
484 /**
485 * Returns a word in singular form.
486 *
487 * @param string $word The word in plural form.
488 *
489 * @return string The word in singular form.
490 */
491 public function singularize(string $word): string
492 {
493 return $this->singularizer->inflect($word);
494 }
495
496 /**
497 * Returns a word in plural form.
498 *
499 * @param string $word The word in singular form.
500 *
501 * @return string The word in plural form.
502 */
503 public function pluralize(string $word): string
504 {
505 return $this->pluralizer->inflect($word);
506 }
507}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php
new file mode 100644
index 0000000..a0740a7
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php
@@ -0,0 +1,52 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector;
6
7use Doctrine\Inflector\Rules\English;
8use Doctrine\Inflector\Rules\French;
9use Doctrine\Inflector\Rules\NorwegianBokmal;
10use Doctrine\Inflector\Rules\Portuguese;
11use Doctrine\Inflector\Rules\Spanish;
12use Doctrine\Inflector\Rules\Turkish;
13use InvalidArgumentException;
14
15use function sprintf;
16
17final class InflectorFactory
18{
19 public static function create(): LanguageInflectorFactory
20 {
21 return self::createForLanguage(Language::ENGLISH);
22 }
23
24 public static function createForLanguage(string $language): LanguageInflectorFactory
25 {
26 switch ($language) {
27 case Language::ENGLISH:
28 return new English\InflectorFactory();
29
30 case Language::FRENCH:
31 return new French\InflectorFactory();
32
33 case Language::NORWEGIAN_BOKMAL:
34 return new NorwegianBokmal\InflectorFactory();
35
36 case Language::PORTUGUESE:
37 return new Portuguese\InflectorFactory();
38
39 case Language::SPANISH:
40 return new Spanish\InflectorFactory();
41
42 case Language::TURKISH:
43 return new Turkish\InflectorFactory();
44
45 default:
46 throw new InvalidArgumentException(sprintf(
47 'Language "%s" is not supported.',
48 $language
49 ));
50 }
51 }
52}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Language.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Language.php
new file mode 100644
index 0000000..78c3cc7
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Language.php
@@ -0,0 +1,19 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector;
6
7final class Language
8{
9 public const ENGLISH = 'english';
10 public const FRENCH = 'french';
11 public const NORWEGIAN_BOKMAL = 'norwegian-bokmal';
12 public const PORTUGUESE = 'portuguese';
13 public const SPANISH = 'spanish';
14 public const TURKISH = 'turkish';
15
16 private function __construct()
17 {
18 }
19}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php
new file mode 100644
index 0000000..a58f43c
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php
@@ -0,0 +1,33 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector;
6
7use Doctrine\Inflector\Rules\Ruleset;
8
9interface LanguageInflectorFactory
10{
11 /**
12 * Applies custom rules for singularisation
13 *
14 * @param bool $reset If true, will unset default inflections for all new rules
15 *
16 * @return $this
17 */
18 public function withSingularRules(?Ruleset $singularRules, bool $reset = false): self;
19
20 /**
21 * Applies custom rules for pluralisation
22 *
23 * @param bool $reset If true, will unset default inflections for all new rules
24 *
25 * @return $this
26 */
27 public function withPluralRules(?Ruleset $pluralRules, bool $reset = false): self;
28
29 /**
30 * Builds the inflector instance with all applicable rules
31 */
32 public function build(): Inflector;
33}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php
new file mode 100644
index 0000000..2fdf535
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php
@@ -0,0 +1,13 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector;
6
7class NoopWordInflector implements WordInflector
8{
9 public function inflect(string $word): string
10 {
11 return $word;
12 }
13}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php
new file mode 100644
index 0000000..8bf02a2
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php
@@ -0,0 +1,184 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\English;
6
7use Doctrine\Inflector\Rules\Pattern;
8use Doctrine\Inflector\Rules\Substitution;
9use Doctrine\Inflector\Rules\Transformation;
10use Doctrine\Inflector\Rules\Word;
11
12class Inflectible
13{
14 /** @return Transformation[] */
15 public static function getSingular(): iterable
16 {
17 yield new Transformation(new Pattern('(s)tatuses$'), '\1\2tatus');
18 yield new Transformation(new Pattern('(s)tatus$'), '\1\2tatus');
19 yield new Transformation(new Pattern('(c)ampus$'), '\1\2ampus');
20 yield new Transformation(new Pattern('^(.*)(menu)s$'), '\1\2');
21 yield new Transformation(new Pattern('(quiz)zes$'), '\\1');
22 yield new Transformation(new Pattern('(matr)ices$'), '\1ix');
23 yield new Transformation(new Pattern('(vert|ind)ices$'), '\1ex');
24 yield new Transformation(new Pattern('^(ox)en'), '\1');
25 yield new Transformation(new Pattern('(alias)(es)*$'), '\1');
26 yield new Transformation(new Pattern('(buffal|her|potat|tomat|volcan)oes$'), '\1o');
27 yield new Transformation(new Pattern('(alumn|bacill|cact|foc|fung|nucle|radi|stimul|syllab|termin|viri?)i$'), '\1us');
28 yield new Transformation(new Pattern('([ftw]ax)es'), '\1');
29 yield new Transformation(new Pattern('(analys|ax|cris|test|thes)es$'), '\1is');
30 yield new Transformation(new Pattern('(shoe|slave)s$'), '\1');
31 yield new Transformation(new Pattern('(o)es$'), '\1');
32 yield new Transformation(new Pattern('ouses$'), 'ouse');
33 yield new Transformation(new Pattern('([^a])uses$'), '\1us');
34 yield new Transformation(new Pattern('([m|l])ice$'), '\1ouse');
35 yield new Transformation(new Pattern('(x|ch|ss|sh)es$'), '\1');
36 yield new Transformation(new Pattern('(m)ovies$'), '\1\2ovie');
37 yield new Transformation(new Pattern('(s)eries$'), '\1\2eries');
38 yield new Transformation(new Pattern('([^aeiouy]|qu)ies$'), '\1y');
39 yield new Transformation(new Pattern('([lr])ves$'), '\1f');
40 yield new Transformation(new Pattern('(tive)s$'), '\1');
41 yield new Transformation(new Pattern('(hive)s$'), '\1');
42 yield new Transformation(new Pattern('(drive)s$'), '\1');
43 yield new Transformation(new Pattern('(dive)s$'), '\1');
44 yield new Transformation(new Pattern('(olive)s$'), '\1');
45 yield new Transformation(new Pattern('([^fo])ves$'), '\1fe');
46 yield new Transformation(new Pattern('(^analy)ses$'), '\1sis');
47 yield new Transformation(new Pattern('(analy|diagno|^ba|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$'), '\1\2sis');
48 yield new Transformation(new Pattern('(tax)a$'), '\1on');
49 yield new Transformation(new Pattern('(c)riteria$'), '\1riterion');
50 yield new Transformation(new Pattern('([ti])a(?<!regatta)$'), '\1um');
51 yield new Transformation(new Pattern('(p)eople$'), '\1\2erson');
52 yield new Transformation(new Pattern('(m)en$'), '\1an');
53 yield new Transformation(new Pattern('(c)hildren$'), '\1\2hild');
54 yield new Transformation(new Pattern('(f)eet$'), '\1oot');
55 yield new Transformation(new Pattern('(n)ews$'), '\1\2ews');
56 yield new Transformation(new Pattern('eaus$'), 'eau');
57 yield new Transformation(new Pattern('^tights$'), 'tights');
58 yield new Transformation(new Pattern('^shorts$'), 'shorts');
59 yield new Transformation(new Pattern('s$'), '');
60 }
61
62 /** @return Transformation[] */
63 public static function getPlural(): iterable
64 {
65 yield new Transformation(new Pattern('(s)tatus$'), '\1\2tatuses');
66 yield new Transformation(new Pattern('(quiz)$'), '\1zes');
67 yield new Transformation(new Pattern('^(ox)$'), '\1\2en');
68 yield new Transformation(new Pattern('([m|l])ouse$'), '\1ice');
69 yield new Transformation(new Pattern('(matr|vert|ind)(ix|ex)$'), '\1ices');
70 yield new Transformation(new Pattern('(x|ch|ss|sh)$'), '\1es');
71 yield new Transformation(new Pattern('([^aeiouy]|qu)y$'), '\1ies');
72 yield new Transformation(new Pattern('(hive|gulf)$'), '\1s');
73 yield new Transformation(new Pattern('(?:([^f])fe|([lr])f)$'), '\1\2ves');
74 yield new Transformation(new Pattern('sis$'), 'ses');
75 yield new Transformation(new Pattern('([ti])um$'), '\1a');
76 yield new Transformation(new Pattern('(tax)on$'), '\1a');
77 yield new Transformation(new Pattern('(c)riterion$'), '\1riteria');
78 yield new Transformation(new Pattern('(p)erson$'), '\1eople');
79 yield new Transformation(new Pattern('(m)an$'), '\1en');
80 yield new Transformation(new Pattern('(c)hild$'), '\1hildren');
81 yield new Transformation(new Pattern('(f)oot$'), '\1eet');
82 yield new Transformation(new Pattern('(buffal|her|potat|tomat|volcan)o$'), '\1\2oes');
83 yield new Transformation(new Pattern('(alumn|bacill|cact|foc|fung|nucle|radi|stimul|syllab|termin|vir)us$'), '\1i');
84 yield new Transformation(new Pattern('us$'), 'uses');
85 yield new Transformation(new Pattern('(alias)$'), '\1es');
86 yield new Transformation(new Pattern('(analys|ax|cris|test|thes)is$'), '\1es');
87 yield new Transformation(new Pattern('s$'), 's');
88 yield new Transformation(new Pattern('^$'), '');
89 yield new Transformation(new Pattern('$'), 's');
90 }
91
92 /** @return Substitution[] */
93 public static function getIrregular(): iterable
94 {
95 yield new Substitution(new Word('atlas'), new Word('atlases'));
96 yield new Substitution(new Word('axis'), new Word('axes'));
97 yield new Substitution(new Word('axe'), new Word('axes'));
98 yield new Substitution(new Word('beef'), new Word('beefs'));
99 yield new Substitution(new Word('blouse'), new Word('blouses'));
100 yield new Substitution(new Word('brother'), new Word('brothers'));
101 yield new Substitution(new Word('cafe'), new Word('cafes'));
102 yield new Substitution(new Word('cave'), new Word('caves'));
103 yield new Substitution(new Word('chateau'), new Word('chateaux'));
104 yield new Substitution(new Word('niveau'), new Word('niveaux'));
105 yield new Substitution(new Word('child'), new Word('children'));
106 yield new Substitution(new Word('canvas'), new Word('canvases'));
107 yield new Substitution(new Word('cookie'), new Word('cookies'));
108 yield new Substitution(new Word('brownie'), new Word('brownies'));
109 yield new Substitution(new Word('corpus'), new Word('corpuses'));
110 yield new Substitution(new Word('cow'), new Word('cows'));
111 yield new Substitution(new Word('criterion'), new Word('criteria'));
112 yield new Substitution(new Word('curriculum'), new Word('curricula'));
113 yield new Substitution(new Word('demo'), new Word('demos'));
114 yield new Substitution(new Word('domino'), new Word('dominoes'));
115 yield new Substitution(new Word('echo'), new Word('echoes'));
116 yield new Substitution(new Word('epoch'), new Word('epochs'));
117 yield new Substitution(new Word('foot'), new Word('feet'));
118 yield new Substitution(new Word('fungus'), new Word('fungi'));
119 yield new Substitution(new Word('ganglion'), new Word('ganglions'));
120 yield new Substitution(new Word('gas'), new Word('gases'));
121 yield new Substitution(new Word('genie'), new Word('genies'));
122 yield new Substitution(new Word('genus'), new Word('genera'));
123 yield new Substitution(new Word('goose'), new Word('geese'));
124 yield new Substitution(new Word('graffito'), new Word('graffiti'));
125 yield new Substitution(new Word('hippopotamus'), new Word('hippopotami'));
126 yield new Substitution(new Word('hoof'), new Word('hoofs'));
127 yield new Substitution(new Word('human'), new Word('humans'));
128 yield new Substitution(new Word('iris'), new Word('irises'));
129 yield new Substitution(new Word('larva'), new Word('larvae'));
130 yield new Substitution(new Word('leaf'), new Word('leaves'));
131 yield new Substitution(new Word('lens'), new Word('lenses'));
132 yield new Substitution(new Word('loaf'), new Word('loaves'));
133 yield new Substitution(new Word('man'), new Word('men'));
134 yield new Substitution(new Word('medium'), new Word('media'));
135 yield new Substitution(new Word('memorandum'), new Word('memoranda'));
136 yield new Substitution(new Word('money'), new Word('monies'));
137 yield new Substitution(new Word('mongoose'), new Word('mongooses'));
138 yield new Substitution(new Word('motto'), new Word('mottoes'));
139 yield new Substitution(new Word('move'), new Word('moves'));
140 yield new Substitution(new Word('mythos'), new Word('mythoi'));
141 yield new Substitution(new Word('niche'), new Word('niches'));
142 yield new Substitution(new Word('nucleus'), new Word('nuclei'));
143 yield new Substitution(new Word('numen'), new Word('numina'));
144 yield new Substitution(new Word('occiput'), new Word('occiputs'));
145 yield new Substitution(new Word('octopus'), new Word('octopuses'));
146 yield new Substitution(new Word('opus'), new Word('opuses'));
147 yield new Substitution(new Word('ox'), new Word('oxen'));
148 yield new Substitution(new Word('passerby'), new Word('passersby'));
149 yield new Substitution(new Word('penis'), new Word('penises'));
150 yield new Substitution(new Word('person'), new Word('people'));
151 yield new Substitution(new Word('plateau'), new Word('plateaux'));
152 yield new Substitution(new Word('runner-up'), new Word('runners-up'));
153 yield new Substitution(new Word('safe'), new Word('safes'));
154 yield new Substitution(new Word('sex'), new Word('sexes'));
155 yield new Substitution(new Word('sieve'), new Word('sieves'));
156 yield new Substitution(new Word('soliloquy'), new Word('soliloquies'));
157 yield new Substitution(new Word('son-in-law'), new Word('sons-in-law'));
158 yield new Substitution(new Word('syllabus'), new Word('syllabi'));
159 yield new Substitution(new Word('testis'), new Word('testes'));
160 yield new Substitution(new Word('thief'), new Word('thieves'));
161 yield new Substitution(new Word('tooth'), new Word('teeth'));
162 yield new Substitution(new Word('tornado'), new Word('tornadoes'));
163 yield new Substitution(new Word('trilby'), new Word('trilbys'));
164 yield new Substitution(new Word('turf'), new Word('turfs'));
165 yield new Substitution(new Word('valve'), new Word('valves'));
166 yield new Substitution(new Word('volcano'), new Word('volcanoes'));
167 yield new Substitution(new Word('abuse'), new Word('abuses'));
168 yield new Substitution(new Word('avalanche'), new Word('avalanches'));
169 yield new Substitution(new Word('cache'), new Word('caches'));
170 yield new Substitution(new Word('criterion'), new Word('criteria'));
171 yield new Substitution(new Word('curve'), new Word('curves'));
172 yield new Substitution(new Word('emphasis'), new Word('emphases'));
173 yield new Substitution(new Word('foe'), new Word('foes'));
174 yield new Substitution(new Word('grave'), new Word('graves'));
175 yield new Substitution(new Word('hoax'), new Word('hoaxes'));
176 yield new Substitution(new Word('medium'), new Word('media'));
177 yield new Substitution(new Word('neurosis'), new Word('neuroses'));
178 yield new Substitution(new Word('save'), new Word('saves'));
179 yield new Substitution(new Word('wave'), new Word('waves'));
180 yield new Substitution(new Word('oasis'), new Word('oases'));
181 yield new Substitution(new Word('valve'), new Word('valves'));
182 yield new Substitution(new Word('zombie'), new Word('zombies'));
183 }
184}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php
new file mode 100644
index 0000000..85f92aa
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php
@@ -0,0 +1,21 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\English;
6
7use Doctrine\Inflector\GenericLanguageInflectorFactory;
8use Doctrine\Inflector\Rules\Ruleset;
9
10final class InflectorFactory extends GenericLanguageInflectorFactory
11{
12 protected function getSingularRuleset(): Ruleset
13 {
14 return Rules::getSingularRuleset();
15 }
16
17 protected function getPluralRuleset(): Ruleset
18 {
19 return Rules::getPluralRuleset();
20 }
21}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php
new file mode 100644
index 0000000..7ccc103
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php
@@ -0,0 +1,31 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\English;
6
7use Doctrine\Inflector\Rules\Patterns;
8use Doctrine\Inflector\Rules\Ruleset;
9use Doctrine\Inflector\Rules\Substitutions;
10use Doctrine\Inflector\Rules\Transformations;
11
12final class Rules
13{
14 public static function getSingularRuleset(): Ruleset
15 {
16 return new Ruleset(
17 new Transformations(...Inflectible::getSingular()),
18 new Patterns(...Uninflected::getSingular()),
19 (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions()
20 );
21 }
22
23 public static function getPluralRuleset(): Ruleset
24 {
25 return new Ruleset(
26 new Transformations(...Inflectible::getPlural()),
27 new Patterns(...Uninflected::getPlural()),
28 new Substitutions(...Inflectible::getIrregular())
29 );
30 }
31}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php
new file mode 100644
index 0000000..02257de
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php
@@ -0,0 +1,189 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\English;
6
7use Doctrine\Inflector\Rules\Pattern;
8
9final class Uninflected
10{
11 /** @return Pattern[] */
12 public static function getSingular(): iterable
13 {
14 yield from self::getDefault();
15
16 yield new Pattern('.*ss');
17 yield new Pattern('clothes');
18 yield new Pattern('data');
19 yield new Pattern('fascia');
20 yield new Pattern('fuchsia');
21 yield new Pattern('galleria');
22 yield new Pattern('mafia');
23 yield new Pattern('militia');
24 yield new Pattern('pants');
25 yield new Pattern('petunia');
26 yield new Pattern('sepia');
27 yield new Pattern('trivia');
28 yield new Pattern('utopia');
29 }
30
31 /** @return Pattern[] */
32 public static function getPlural(): iterable
33 {
34 yield from self::getDefault();
35
36 yield new Pattern('people');
37 yield new Pattern('trivia');
38 yield new Pattern('\w+ware$');
39 yield new Pattern('media');
40 }
41
42 /** @return Pattern[] */
43 private static function getDefault(): iterable
44 {
45 yield new Pattern('\w+media');
46 yield new Pattern('advice');
47 yield new Pattern('aircraft');
48 yield new Pattern('amoyese');
49 yield new Pattern('art');
50 yield new Pattern('audio');
51 yield new Pattern('baggage');
52 yield new Pattern('bison');
53 yield new Pattern('borghese');
54 yield new Pattern('bream');
55 yield new Pattern('breeches');
56 yield new Pattern('britches');
57 yield new Pattern('buffalo');
58 yield new Pattern('butter');
59 yield new Pattern('cantus');
60 yield new Pattern('carp');
61 yield new Pattern('cattle');
62 yield new Pattern('chassis');
63 yield new Pattern('clippers');
64 yield new Pattern('clothing');
65 yield new Pattern('coal');
66 yield new Pattern('cod');
67 yield new Pattern('coitus');
68 yield new Pattern('compensation');
69 yield new Pattern('congoese');
70 yield new Pattern('contretemps');
71 yield new Pattern('coreopsis');
72 yield new Pattern('corps');
73 yield new Pattern('cotton');
74 yield new Pattern('data');
75 yield new Pattern('debris');
76 yield new Pattern('deer');
77 yield new Pattern('diabetes');
78 yield new Pattern('djinn');
79 yield new Pattern('education');
80 yield new Pattern('eland');
81 yield new Pattern('elk');
82 yield new Pattern('emoji');
83 yield new Pattern('equipment');
84 yield new Pattern('evidence');
85 yield new Pattern('faroese');
86 yield new Pattern('feedback');
87 yield new Pattern('fish');
88 yield new Pattern('flounder');
89 yield new Pattern('flour');
90 yield new Pattern('foochowese');
91 yield new Pattern('food');
92 yield new Pattern('furniture');
93 yield new Pattern('gallows');
94 yield new Pattern('genevese');
95 yield new Pattern('genoese');
96 yield new Pattern('gilbertese');
97 yield new Pattern('gold');
98 yield new Pattern('headquarters');
99 yield new Pattern('herpes');
100 yield new Pattern('hijinks');
101 yield new Pattern('homework');
102 yield new Pattern('hottentotese');
103 yield new Pattern('impatience');
104 yield new Pattern('information');
105 yield new Pattern('innings');
106 yield new Pattern('jackanapes');
107 yield new Pattern('jeans');
108 yield new Pattern('jedi');
109 yield new Pattern('kin');
110 yield new Pattern('kiplingese');
111 yield new Pattern('knowledge');
112 yield new Pattern('kongoese');
113 yield new Pattern('leather');
114 yield new Pattern('love');
115 yield new Pattern('lucchese');
116 yield new Pattern('luggage');
117 yield new Pattern('mackerel');
118 yield new Pattern('Maltese');
119 yield new Pattern('management');
120 yield new Pattern('metadata');
121 yield new Pattern('mews');
122 yield new Pattern('money');
123 yield new Pattern('moose');
124 yield new Pattern('mumps');
125 yield new Pattern('music');
126 yield new Pattern('nankingese');
127 yield new Pattern('news');
128 yield new Pattern('nexus');
129 yield new Pattern('niasese');
130 yield new Pattern('nutrition');
131 yield new Pattern('offspring');
132 yield new Pattern('oil');
133 yield new Pattern('patience');
134 yield new Pattern('pekingese');
135 yield new Pattern('piedmontese');
136 yield new Pattern('pincers');
137 yield new Pattern('pistoiese');
138 yield new Pattern('plankton');
139 yield new Pattern('pliers');
140 yield new Pattern('pokemon');
141 yield new Pattern('police');
142 yield new Pattern('polish');
143 yield new Pattern('portuguese');
144 yield new Pattern('proceedings');
145 yield new Pattern('progress');
146 yield new Pattern('rabies');
147 yield new Pattern('rain');
148 yield new Pattern('research');
149 yield new Pattern('rhinoceros');
150 yield new Pattern('rice');
151 yield new Pattern('salmon');
152 yield new Pattern('sand');
153 yield new Pattern('sarawakese');
154 yield new Pattern('scissors');
155 yield new Pattern('sea[- ]bass');
156 yield new Pattern('series');
157 yield new Pattern('shavese');
158 yield new Pattern('shears');
159 yield new Pattern('sheep');
160 yield new Pattern('siemens');
161 yield new Pattern('silk');
162 yield new Pattern('sms');
163 yield new Pattern('soap');
164 yield new Pattern('social media');
165 yield new Pattern('spam');
166 yield new Pattern('species');
167 yield new Pattern('staff');
168 yield new Pattern('sugar');
169 yield new Pattern('swine');
170 yield new Pattern('talent');
171 yield new Pattern('toothpaste');
172 yield new Pattern('traffic');
173 yield new Pattern('travel');
174 yield new Pattern('trousers');
175 yield new Pattern('trout');
176 yield new Pattern('tuna');
177 yield new Pattern('us');
178 yield new Pattern('vermontese');
179 yield new Pattern('vinegar');
180 yield new Pattern('weather');
181 yield new Pattern('wenchowese');
182 yield new Pattern('wheat');
183 yield new Pattern('whiting');
184 yield new Pattern('wildebeest');
185 yield new Pattern('wood');
186 yield new Pattern('wool');
187 yield new Pattern('yengeese');
188 }
189}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php
new file mode 100644
index 0000000..05b535a
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php
@@ -0,0 +1,44 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\French;
6
7use Doctrine\Inflector\Rules\Pattern;
8use Doctrine\Inflector\Rules\Substitution;
9use Doctrine\Inflector\Rules\Transformation;
10use Doctrine\Inflector\Rules\Word;
11
12class Inflectible
13{
14 /** @return Transformation[] */
15 public static function getSingular(): iterable
16 {
17 yield new Transformation(new Pattern('/(b|cor|ém|gemm|soupir|trav|vant|vitr)aux$/'), '\1ail');
18 yield new Transformation(new Pattern('/ails$/'), 'ail');
19 yield new Transformation(new Pattern('/(journ|chev)aux$/'), '\1al');
20 yield new Transformation(new Pattern('/(bijou|caillou|chou|genou|hibou|joujou|pou|au|eu|eau)x$/'), '\1');
21 yield new Transformation(new Pattern('/s$/'), '');
22 }
23
24 /** @return Transformation[] */
25 public static function getPlural(): iterable
26 {
27 yield new Transformation(new Pattern('/(s|x|z)$/'), '\1');
28 yield new Transformation(new Pattern('/(b|cor|ém|gemm|soupir|trav|vant|vitr)ail$/'), '\1aux');
29 yield new Transformation(new Pattern('/ail$/'), 'ails');
30 yield new Transformation(new Pattern('/(chacal|carnaval|festival|récital)$/'), '\1s');
31 yield new Transformation(new Pattern('/al$/'), 'aux');
32 yield new Transformation(new Pattern('/(bleu|émeu|landau|pneu|sarrau)$/'), '\1s');
33 yield new Transformation(new Pattern('/(bijou|caillou|chou|genou|hibou|joujou|lieu|pou|au|eu|eau)$/'), '\1x');
34 yield new Transformation(new Pattern('/$/'), 's');
35 }
36
37 /** @return Substitution[] */
38 public static function getIrregular(): iterable
39 {
40 yield new Substitution(new Word('monsieur'), new Word('messieurs'));
41 yield new Substitution(new Word('madame'), new Word('mesdames'));
42 yield new Substitution(new Word('mademoiselle'), new Word('mesdemoiselles'));
43 }
44}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php
new file mode 100644
index 0000000..62e31f0
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php
@@ -0,0 +1,21 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\French;
6
7use Doctrine\Inflector\GenericLanguageInflectorFactory;
8use Doctrine\Inflector\Rules\Ruleset;
9
10final class InflectorFactory extends GenericLanguageInflectorFactory
11{
12 protected function getSingularRuleset(): Ruleset
13 {
14 return Rules::getSingularRuleset();
15 }
16
17 protected function getPluralRuleset(): Ruleset
18 {
19 return Rules::getPluralRuleset();
20 }
21}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php
new file mode 100644
index 0000000..6cd45bc
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php
@@ -0,0 +1,31 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\French;
6
7use Doctrine\Inflector\Rules\Patterns;
8use Doctrine\Inflector\Rules\Ruleset;
9use Doctrine\Inflector\Rules\Substitutions;
10use Doctrine\Inflector\Rules\Transformations;
11
12final class Rules
13{
14 public static function getSingularRuleset(): Ruleset
15 {
16 return new Ruleset(
17 new Transformations(...Inflectible::getSingular()),
18 new Patterns(...Uninflected::getSingular()),
19 (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions()
20 );
21 }
22
23 public static function getPluralRuleset(): Ruleset
24 {
25 return new Ruleset(
26 new Transformations(...Inflectible::getPlural()),
27 new Patterns(...Uninflected::getPlural()),
28 new Substitutions(...Inflectible::getIrregular())
29 );
30 }
31}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php
new file mode 100644
index 0000000..9747f91
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php
@@ -0,0 +1,28 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\French;
6
7use Doctrine\Inflector\Rules\Pattern;
8
9final class Uninflected
10{
11 /** @return Pattern[] */
12 public static function getSingular(): iterable
13 {
14 yield from self::getDefault();
15 }
16
17 /** @return Pattern[] */
18 public static function getPlural(): iterable
19 {
20 yield from self::getDefault();
21 }
22
23 /** @return Pattern[] */
24 private static function getDefault(): iterable
25 {
26 yield new Pattern('');
27 }
28}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php
new file mode 100644
index 0000000..1e952d8
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php
@@ -0,0 +1,34 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\NorwegianBokmal;
6
7use Doctrine\Inflector\Rules\Pattern;
8use Doctrine\Inflector\Rules\Substitution;
9use Doctrine\Inflector\Rules\Transformation;
10use Doctrine\Inflector\Rules\Word;
11
12class Inflectible
13{
14 /** @return Transformation[] */
15 public static function getSingular(): iterable
16 {
17 yield new Transformation(new Pattern('/re$/i'), 'r');
18 yield new Transformation(new Pattern('/er$/i'), '');
19 }
20
21 /** @return Transformation[] */
22 public static function getPlural(): iterable
23 {
24 yield new Transformation(new Pattern('/e$/i'), 'er');
25 yield new Transformation(new Pattern('/r$/i'), 're');
26 yield new Transformation(new Pattern('/$/'), 'er');
27 }
28
29 /** @return Substitution[] */
30 public static function getIrregular(): iterable
31 {
32 yield new Substitution(new Word('konto'), new Word('konti'));
33 }
34}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php
new file mode 100644
index 0000000..912ae41
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php
@@ -0,0 +1,21 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\NorwegianBokmal;
6
7use Doctrine\Inflector\GenericLanguageInflectorFactory;
8use Doctrine\Inflector\Rules\Ruleset;
9
10final class InflectorFactory extends GenericLanguageInflectorFactory
11{
12 protected function getSingularRuleset(): Ruleset
13 {
14 return Rules::getSingularRuleset();
15 }
16
17 protected function getPluralRuleset(): Ruleset
18 {
19 return Rules::getPluralRuleset();
20 }
21}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php
new file mode 100644
index 0000000..9902d35
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php
@@ -0,0 +1,31 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\NorwegianBokmal;
6
7use Doctrine\Inflector\Rules\Patterns;
8use Doctrine\Inflector\Rules\Ruleset;
9use Doctrine\Inflector\Rules\Substitutions;
10use Doctrine\Inflector\Rules\Transformations;
11
12final class Rules
13{
14 public static function getSingularRuleset(): Ruleset
15 {
16 return new Ruleset(
17 new Transformations(...Inflectible::getSingular()),
18 new Patterns(...Uninflected::getSingular()),
19 (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions()
20 );
21 }
22
23 public static function getPluralRuleset(): Ruleset
24 {
25 return new Ruleset(
26 new Transformations(...Inflectible::getPlural()),
27 new Patterns(...Uninflected::getPlural()),
28 new Substitutions(...Inflectible::getIrregular())
29 );
30 }
31}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php
new file mode 100644
index 0000000..5d8d3b3
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php
@@ -0,0 +1,30 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\NorwegianBokmal;
6
7use Doctrine\Inflector\Rules\Pattern;
8
9final class Uninflected
10{
11 /** @return Pattern[] */
12 public static function getSingular(): iterable
13 {
14 yield from self::getDefault();
15 }
16
17 /** @return Pattern[] */
18 public static function getPlural(): iterable
19 {
20 yield from self::getDefault();
21 }
22
23 /** @return Pattern[] */
24 private static function getDefault(): iterable
25 {
26 yield new Pattern('barn');
27 yield new Pattern('fjell');
28 yield new Pattern('hus');
29 }
30}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php
new file mode 100644
index 0000000..a5f0ef7
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php
@@ -0,0 +1,42 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules;
6
7use function preg_match;
8
9final class Pattern
10{
11 /** @var string */
12 private $pattern;
13
14 /** @var string */
15 private $regex;
16
17 public function __construct(string $pattern)
18 {
19 $this->pattern = $pattern;
20
21 if (isset($this->pattern[0]) && $this->pattern[0] === '/') {
22 $this->regex = $this->pattern;
23 } else {
24 $this->regex = '/' . $this->pattern . '/i';
25 }
26 }
27
28 public function getPattern(): string
29 {
30 return $this->pattern;
31 }
32
33 public function getRegex(): string
34 {
35 return $this->regex;
36 }
37
38 public function matches(string $word): bool
39 {
40 return preg_match($this->getRegex(), $word) === 1;
41 }
42}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php
new file mode 100644
index 0000000..e8d45cb
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php
@@ -0,0 +1,34 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules;
6
7use function array_map;
8use function implode;
9use function preg_match;
10
11class Patterns
12{
13 /** @var Pattern[] */
14 private $patterns;
15
16 /** @var string */
17 private $regex;
18
19 public function __construct(Pattern ...$patterns)
20 {
21 $this->patterns = $patterns;
22
23 $patterns = array_map(static function (Pattern $pattern): string {
24 return $pattern->getPattern();
25 }, $this->patterns);
26
27 $this->regex = '/^(?:' . implode('|', $patterns) . ')$/i';
28 }
29
30 public function matches(string $word): bool
31 {
32 return preg_match($this->regex, $word, $regs) === 1;
33 }
34}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php
new file mode 100644
index 0000000..0d41fe7
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php
@@ -0,0 +1,98 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Portuguese;
6
7use Doctrine\Inflector\Rules\Pattern;
8use Doctrine\Inflector\Rules\Substitution;
9use Doctrine\Inflector\Rules\Transformation;
10use Doctrine\Inflector\Rules\Word;
11
12class Inflectible
13{
14 /** @return Transformation[] */
15 public static function getSingular(): iterable
16 {
17 yield new Transformation(new Pattern('/^(g|)ases$/i'), '\1ás');
18 yield new Transformation(new Pattern('/(japon|escoc|ingl|dinamarqu|fregu|portugu)eses$/i'), '\1ês');
19 yield new Transformation(new Pattern('/(ae|ao|oe)s$/'), 'ao');
20 yield new Transformation(new Pattern('/(ãe|ão|õe)s$/'), 'ão');
21 yield new Transformation(new Pattern('/^(.*[^s]s)es$/i'), '\1');
22 yield new Transformation(new Pattern('/sses$/i'), 'sse');
23 yield new Transformation(new Pattern('/ns$/i'), 'm');
24 yield new Transformation(new Pattern('/(r|t|f|v)is$/i'), '\1il');
25 yield new Transformation(new Pattern('/uis$/i'), 'ul');
26 yield new Transformation(new Pattern('/ois$/i'), 'ol');
27 yield new Transformation(new Pattern('/eis$/i'), 'ei');
28 yield new Transformation(new Pattern('/éis$/i'), 'el');
29 yield new Transformation(new Pattern('/([^p])ais$/i'), '\1al');
30 yield new Transformation(new Pattern('/(r|z)es$/i'), '\1');
31 yield new Transformation(new Pattern('/^(á|gá)s$/i'), '\1s');
32 yield new Transformation(new Pattern('/([^ê])s$/i'), '\1');
33 }
34
35 /** @return Transformation[] */
36 public static function getPlural(): iterable
37 {
38 yield new Transformation(new Pattern('/^(alem|c|p)ao$/i'), '\1aes');
39 yield new Transformation(new Pattern('/^(irm|m)ao$/i'), '\1aos');
40 yield new Transformation(new Pattern('/ao$/i'), 'oes');
41 yield new Transformation(new Pattern('/^(alem|c|p)ão$/i'), '\1ães');
42 yield new Transformation(new Pattern('/^(irm|m)ão$/i'), '\1ãos');
43 yield new Transformation(new Pattern('/ão$/i'), 'ões');
44 yield new Transformation(new Pattern('/^(|g)ás$/i'), '\1ases');
45 yield new Transformation(new Pattern('/^(japon|escoc|ingl|dinamarqu|fregu|portugu)ês$/i'), '\1eses');
46 yield new Transformation(new Pattern('/m$/i'), 'ns');
47 yield new Transformation(new Pattern('/([^aeou])il$/i'), '\1is');
48 yield new Transformation(new Pattern('/ul$/i'), 'uis');
49 yield new Transformation(new Pattern('/ol$/i'), 'ois');
50 yield new Transformation(new Pattern('/el$/i'), 'eis');
51 yield new Transformation(new Pattern('/al$/i'), 'ais');
52 yield new Transformation(new Pattern('/(z|r)$/i'), '\1es');
53 yield new Transformation(new Pattern('/(s)$/i'), '\1');
54 yield new Transformation(new Pattern('/$/'), 's');
55 }
56
57 /** @return Substitution[] */
58 public static function getIrregular(): iterable
59 {
60 yield new Substitution(new Word('abdomen'), new Word('abdomens'));
61 yield new Substitution(new Word('alemão'), new Word('alemães'));
62 yield new Substitution(new Word('artesã'), new Word('artesãos'));
63 yield new Substitution(new Word('álcool'), new Word('álcoois'));
64 yield new Substitution(new Word('árvore'), new Word('árvores'));
65 yield new Substitution(new Word('bencão'), new Word('bencãos'));
66 yield new Substitution(new Word('cão'), new Word('cães'));
67 yield new Substitution(new Word('campus'), new Word('campi'));
68 yield new Substitution(new Word('cadáver'), new Word('cadáveres'));
69 yield new Substitution(new Word('capelão'), new Word('capelães'));
70 yield new Substitution(new Word('capitão'), new Word('capitães'));
71 yield new Substitution(new Word('chão'), new Word('chãos'));
72 yield new Substitution(new Word('charlatão'), new Word('charlatães'));
73 yield new Substitution(new Word('cidadão'), new Word('cidadãos'));
74 yield new Substitution(new Word('consul'), new Word('consules'));
75 yield new Substitution(new Word('cristão'), new Word('cristãos'));
76 yield new Substitution(new Word('difícil'), new Word('difíceis'));
77 yield new Substitution(new Word('email'), new Word('emails'));
78 yield new Substitution(new Word('escrivão'), new Word('escrivães'));
79 yield new Substitution(new Word('fóssil'), new Word('fósseis'));
80 yield new Substitution(new Word('gás'), new Word('gases'));
81 yield new Substitution(new Word('germens'), new Word('germen'));
82 yield new Substitution(new Word('grão'), new Word('grãos'));
83 yield new Substitution(new Word('hífen'), new Word('hífens'));
84 yield new Substitution(new Word('irmão'), new Word('irmãos'));
85 yield new Substitution(new Word('liquens'), new Word('liquen'));
86 yield new Substitution(new Word('mal'), new Word('males'));
87 yield new Substitution(new Word('mão'), new Word('mãos'));
88 yield new Substitution(new Word('orfão'), new Word('orfãos'));
89 yield new Substitution(new Word('país'), new Word('países'));
90 yield new Substitution(new Word('pai'), new Word('pais'));
91 yield new Substitution(new Word('pão'), new Word('pães'));
92 yield new Substitution(new Word('projétil'), new Word('projéteis'));
93 yield new Substitution(new Word('réptil'), new Word('répteis'));
94 yield new Substitution(new Word('sacristão'), new Word('sacristães'));
95 yield new Substitution(new Word('sotão'), new Word('sotãos'));
96 yield new Substitution(new Word('tabelião'), new Word('tabeliães'));
97 }
98}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php
new file mode 100644
index 0000000..bf12d54
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php
@@ -0,0 +1,21 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Portuguese;
6
7use Doctrine\Inflector\GenericLanguageInflectorFactory;
8use Doctrine\Inflector\Rules\Ruleset;
9
10final class InflectorFactory extends GenericLanguageInflectorFactory
11{
12 protected function getSingularRuleset(): Ruleset
13 {
14 return Rules::getSingularRuleset();
15 }
16
17 protected function getPluralRuleset(): Ruleset
18 {
19 return Rules::getPluralRuleset();
20 }
21}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php
new file mode 100644
index 0000000..897f177
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php
@@ -0,0 +1,31 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Portuguese;
6
7use Doctrine\Inflector\Rules\Patterns;
8use Doctrine\Inflector\Rules\Ruleset;
9use Doctrine\Inflector\Rules\Substitutions;
10use Doctrine\Inflector\Rules\Transformations;
11
12final class Rules
13{
14 public static function getSingularRuleset(): Ruleset
15 {
16 return new Ruleset(
17 new Transformations(...Inflectible::getSingular()),
18 new Patterns(...Uninflected::getSingular()),
19 (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions()
20 );
21 }
22
23 public static function getPluralRuleset(): Ruleset
24 {
25 return new Ruleset(
26 new Transformations(...Inflectible::getPlural()),
27 new Patterns(...Uninflected::getPlural()),
28 new Substitutions(...Inflectible::getIrregular())
29 );
30 }
31}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php
new file mode 100644
index 0000000..b8e988f
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php
@@ -0,0 +1,32 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Portuguese;
6
7use Doctrine\Inflector\Rules\Pattern;
8
9final class Uninflected
10{
11 /** @return Pattern[] */
12 public static function getSingular(): iterable
13 {
14 yield from self::getDefault();
15 }
16
17 /** @return Pattern[] */
18 public static function getPlural(): iterable
19 {
20 yield from self::getDefault();
21 }
22
23 /** @return Pattern[] */
24 private static function getDefault(): iterable
25 {
26 yield new Pattern('tórax');
27 yield new Pattern('tênis');
28 yield new Pattern('ônibus');
29 yield new Pattern('lápis');
30 yield new Pattern('fênix');
31 }
32}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php
new file mode 100644
index 0000000..39889b7
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php
@@ -0,0 +1,39 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules;
6
7class Ruleset
8{
9 /** @var Transformations */
10 private $regular;
11
12 /** @var Patterns */
13 private $uninflected;
14
15 /** @var Substitutions */
16 private $irregular;
17
18 public function __construct(Transformations $regular, Patterns $uninflected, Substitutions $irregular)
19 {
20 $this->regular = $regular;
21 $this->uninflected = $uninflected;
22 $this->irregular = $irregular;
23 }
24
25 public function getRegular(): Transformations
26 {
27 return $this->regular;
28 }
29
30 public function getUninflected(): Patterns
31 {
32 return $this->uninflected;
33 }
34
35 public function getIrregular(): Substitutions
36 {
37 return $this->irregular;
38 }
39}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php
new file mode 100644
index 0000000..9129460
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php
@@ -0,0 +1,47 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Spanish;
6
7use Doctrine\Inflector\Rules\Pattern;
8use Doctrine\Inflector\Rules\Substitution;
9use Doctrine\Inflector\Rules\Transformation;
10use Doctrine\Inflector\Rules\Word;
11
12class Inflectible
13{
14 /** @return Transformation[] */
15 public static function getSingular(): iterable
16 {
17 yield new Transformation(new Pattern('/ereses$/'), 'erés');
18 yield new Transformation(new Pattern('/iones$/'), 'ión');
19 yield new Transformation(new Pattern('/ces$/'), 'z');
20 yield new Transformation(new Pattern('/es$/'), '');
21 yield new Transformation(new Pattern('/s$/'), '');
22 }
23
24 /** @return Transformation[] */
25 public static function getPlural(): iterable
26 {
27 yield new Transformation(new Pattern('/ú([sn])$/i'), 'u\1es');
28 yield new Transformation(new Pattern('/ó([sn])$/i'), 'o\1es');
29 yield new Transformation(new Pattern('/í([sn])$/i'), 'i\1es');
30 yield new Transformation(new Pattern('/é([sn])$/i'), 'e\1es');
31 yield new Transformation(new Pattern('/á([sn])$/i'), 'a\1es');
32 yield new Transformation(new Pattern('/z$/i'), 'ces');
33 yield new Transformation(new Pattern('/([aeiou]s)$/i'), '\1');
34 yield new Transformation(new Pattern('/([^aeéiou])$/i'), '\1es');
35 yield new Transformation(new Pattern('/$/'), 's');
36 }
37
38 /** @return Substitution[] */
39 public static function getIrregular(): iterable
40 {
41 yield new Substitution(new Word('el'), new Word('los'));
42 yield new Substitution(new Word('papá'), new Word('papás'));
43 yield new Substitution(new Word('mamá'), new Word('mamás'));
44 yield new Substitution(new Word('sofá'), new Word('sofás'));
45 yield new Substitution(new Word('mes'), new Word('meses'));
46 }
47}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php
new file mode 100644
index 0000000..85084ca
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php
@@ -0,0 +1,21 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Spanish;
6
7use Doctrine\Inflector\GenericLanguageInflectorFactory;
8use Doctrine\Inflector\Rules\Ruleset;
9
10final class InflectorFactory extends GenericLanguageInflectorFactory
11{
12 protected function getSingularRuleset(): Ruleset
13 {
14 return Rules::getSingularRuleset();
15 }
16
17 protected function getPluralRuleset(): Ruleset
18 {
19 return Rules::getPluralRuleset();
20 }
21}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php
new file mode 100644
index 0000000..d739972
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php
@@ -0,0 +1,31 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Spanish;
6
7use Doctrine\Inflector\Rules\Patterns;
8use Doctrine\Inflector\Rules\Ruleset;
9use Doctrine\Inflector\Rules\Substitutions;
10use Doctrine\Inflector\Rules\Transformations;
11
12final class Rules
13{
14 public static function getSingularRuleset(): Ruleset
15 {
16 return new Ruleset(
17 new Transformations(...Inflectible::getSingular()),
18 new Patterns(...Uninflected::getSingular()),
19 (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions()
20 );
21 }
22
23 public static function getPluralRuleset(): Ruleset
24 {
25 return new Ruleset(
26 new Transformations(...Inflectible::getPlural()),
27 new Patterns(...Uninflected::getPlural()),
28 new Substitutions(...Inflectible::getIrregular())
29 );
30 }
31}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php
new file mode 100644
index 0000000..c26ebe9
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php
@@ -0,0 +1,30 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Spanish;
6
7use Doctrine\Inflector\Rules\Pattern;
8
9final class Uninflected
10{
11 /** @return Pattern[] */
12 public static function getSingular(): iterable
13 {
14 yield from self::getDefault();
15 }
16
17 /** @return Pattern[] */
18 public static function getPlural(): iterable
19 {
20 yield from self::getDefault();
21 }
22
23 /** @return Pattern[] */
24 private static function getDefault(): iterable
25 {
26 yield new Pattern('lunes');
27 yield new Pattern('rompecabezas');
28 yield new Pattern('crisis');
29 }
30}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php
new file mode 100644
index 0000000..471aff9
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php
@@ -0,0 +1,30 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules;
6
7final class Substitution
8{
9 /** @var Word */
10 private $from;
11
12 /** @var Word */
13 private $to;
14
15 public function __construct(Word $from, Word $to)
16 {
17 $this->from = $from;
18 $this->to = $to;
19 }
20
21 public function getFrom(): Word
22 {
23 return $this->from;
24 }
25
26 public function getTo(): Word
27 {
28 return $this->to;
29 }
30}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php
new file mode 100644
index 0000000..17ee296
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php
@@ -0,0 +1,57 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules;
6
7use Doctrine\Inflector\WordInflector;
8
9use function strtolower;
10use function strtoupper;
11use function substr;
12
13class Substitutions implements WordInflector
14{
15 /** @var Substitution[] */
16 private $substitutions;
17
18 public function __construct(Substitution ...$substitutions)
19 {
20 foreach ($substitutions as $substitution) {
21 $this->substitutions[$substitution->getFrom()->getWord()] = $substitution;
22 }
23 }
24
25 public function getFlippedSubstitutions(): Substitutions
26 {
27 $substitutions = [];
28
29 foreach ($this->substitutions as $substitution) {
30 $substitutions[] = new Substitution(
31 $substitution->getTo(),
32 $substitution->getFrom()
33 );
34 }
35
36 return new Substitutions(...$substitutions);
37 }
38
39 public function inflect(string $word): string
40 {
41 $lowerWord = strtolower($word);
42
43 if (isset($this->substitutions[$lowerWord])) {
44 $firstLetterUppercase = $lowerWord[0] !== $word[0];
45
46 $toWord = $this->substitutions[$lowerWord]->getTo()->getWord();
47
48 if ($firstLetterUppercase) {
49 return strtoupper($toWord[0]) . substr($toWord, 1);
50 }
51
52 return $toWord;
53 }
54
55 return $word;
56 }
57}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php
new file mode 100644
index 0000000..30dcd59
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php
@@ -0,0 +1,39 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules;
6
7use Doctrine\Inflector\WordInflector;
8
9use function preg_replace;
10
11final class Transformation implements WordInflector
12{
13 /** @var Pattern */
14 private $pattern;
15
16 /** @var string */
17 private $replacement;
18
19 public function __construct(Pattern $pattern, string $replacement)
20 {
21 $this->pattern = $pattern;
22 $this->replacement = $replacement;
23 }
24
25 public function getPattern(): Pattern
26 {
27 return $this->pattern;
28 }
29
30 public function getReplacement(): string
31 {
32 return $this->replacement;
33 }
34
35 public function inflect(string $word): string
36 {
37 return (string) preg_replace($this->pattern->getRegex(), $this->replacement, $word);
38 }
39}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php
new file mode 100644
index 0000000..b6a48fa
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php
@@ -0,0 +1,29 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules;
6
7use Doctrine\Inflector\WordInflector;
8
9class Transformations implements WordInflector
10{
11 /** @var Transformation[] */
12 private $transformations;
13
14 public function __construct(Transformation ...$transformations)
15 {
16 $this->transformations = $transformations;
17 }
18
19 public function inflect(string $word): string
20 {
21 foreach ($this->transformations as $transformation) {
22 if ($transformation->getPattern()->matches($word)) {
23 return $transformation->inflect($word);
24 }
25 }
26
27 return $word;
28 }
29}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php
new file mode 100644
index 0000000..a2bda0d
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php
@@ -0,0 +1,34 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Turkish;
6
7use Doctrine\Inflector\Rules\Pattern;
8use Doctrine\Inflector\Rules\Substitution;
9use Doctrine\Inflector\Rules\Transformation;
10use Doctrine\Inflector\Rules\Word;
11
12class Inflectible
13{
14 /** @return Transformation[] */
15 public static function getSingular(): iterable
16 {
17 yield new Transformation(new Pattern('/l[ae]r$/i'), '');
18 }
19
20 /** @return Transformation[] */
21 public static function getPlural(): iterable
22 {
23 yield new Transformation(new Pattern('/([eöiü][^aoıueöiü]{0,6})$/u'), '\1ler');
24 yield new Transformation(new Pattern('/([aoıu][^aoıueöiü]{0,6})$/u'), '\1lar');
25 }
26
27 /** @return Substitution[] */
28 public static function getIrregular(): iterable
29 {
30 yield new Substitution(new Word('ben'), new Word('biz'));
31 yield new Substitution(new Word('sen'), new Word('siz'));
32 yield new Substitution(new Word('o'), new Word('onlar'));
33 }
34}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php
new file mode 100644
index 0000000..c6cdebe
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php
@@ -0,0 +1,21 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Turkish;
6
7use Doctrine\Inflector\GenericLanguageInflectorFactory;
8use Doctrine\Inflector\Rules\Ruleset;
9
10final class InflectorFactory extends GenericLanguageInflectorFactory
11{
12 protected function getSingularRuleset(): Ruleset
13 {
14 return Rules::getSingularRuleset();
15 }
16
17 protected function getPluralRuleset(): Ruleset
18 {
19 return Rules::getPluralRuleset();
20 }
21}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php
new file mode 100644
index 0000000..ea564ac
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php
@@ -0,0 +1,31 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Turkish;
6
7use Doctrine\Inflector\Rules\Patterns;
8use Doctrine\Inflector\Rules\Ruleset;
9use Doctrine\Inflector\Rules\Substitutions;
10use Doctrine\Inflector\Rules\Transformations;
11
12final class Rules
13{
14 public static function getSingularRuleset(): Ruleset
15 {
16 return new Ruleset(
17 new Transformations(...Inflectible::getSingular()),
18 new Patterns(...Uninflected::getSingular()),
19 (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions()
20 );
21 }
22
23 public static function getPluralRuleset(): Ruleset
24 {
25 return new Ruleset(
26 new Transformations(...Inflectible::getPlural()),
27 new Patterns(...Uninflected::getPlural()),
28 new Substitutions(...Inflectible::getIrregular())
29 );
30 }
31}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php
new file mode 100644
index 0000000..ec1c37d
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php
@@ -0,0 +1,30 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules\Turkish;
6
7use Doctrine\Inflector\Rules\Pattern;
8
9final class Uninflected
10{
11 /** @return Pattern[] */
12 public static function getSingular(): iterable
13 {
14 yield from self::getDefault();
15 }
16
17 /** @return Pattern[] */
18 public static function getPlural(): iterable
19 {
20 yield from self::getDefault();
21 }
22
23 /** @return Pattern[] */
24 private static function getDefault(): iterable
25 {
26 yield new Pattern('lunes');
27 yield new Pattern('rompecabezas');
28 yield new Pattern('crisis');
29 }
30}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php
new file mode 100644
index 0000000..98e93ba
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php
@@ -0,0 +1,21 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector\Rules;
6
7class Word
8{
9 /** @var string */
10 private $word;
11
12 public function __construct(string $word)
13 {
14 $this->word = $word;
15 }
16
17 public function getWord(): string
18 {
19 return $this->word;
20 }
21}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php
new file mode 100644
index 0000000..12b2ed5
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php
@@ -0,0 +1,56 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector;
6
7use Doctrine\Inflector\Rules\Ruleset;
8
9use function array_merge;
10
11/**
12 * Inflects based on multiple rulesets.
13 *
14 * Rules:
15 * - If the word matches any uninflected word pattern, it is not inflected
16 * - The first ruleset that returns a different value for an irregular word wins
17 * - The first ruleset that returns a different value for a regular word wins
18 * - If none of the above match, the word is left as-is
19 */
20class RulesetInflector implements WordInflector
21{
22 /** @var Ruleset[] */
23 private $rulesets;
24
25 public function __construct(Ruleset $ruleset, Ruleset ...$rulesets)
26 {
27 $this->rulesets = array_merge([$ruleset], $rulesets);
28 }
29
30 public function inflect(string $word): string
31 {
32 if ($word === '') {
33 return '';
34 }
35
36 foreach ($this->rulesets as $ruleset) {
37 if ($ruleset->getUninflected()->matches($word)) {
38 return $word;
39 }
40
41 $inflected = $ruleset->getIrregular()->inflect($word);
42
43 if ($inflected !== $word) {
44 return $inflected;
45 }
46
47 $inflected = $ruleset->getRegular()->inflect($word);
48
49 if ($inflected !== $word) {
50 return $inflected;
51 }
52 }
53
54 return $word;
55 }
56}
diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php
new file mode 100644
index 0000000..b88b1d6
--- /dev/null
+++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php
@@ -0,0 +1,10 @@
1<?php
2
3declare(strict_types=1);
4
5namespace Doctrine\Inflector;
6
7interface WordInflector
8{
9 public function inflect(string $word): string;
10}