Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace Doctrine\Inflector;
6
 
7
use RuntimeException;
8
 
9
use function chr;
10
use function function_exists;
11
use function lcfirst;
12
use function mb_strtolower;
13
use function ord;
14
use function preg_match;
15
use function preg_replace;
16
use function sprintf;
17
use function str_replace;
18
use function strlen;
19
use function strtolower;
20
use function strtr;
21
use function trim;
22
use function ucwords;
23
 
24
class 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
}