CulturefeedSlugger   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 268
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 0
Metric Value
wmc 6
lcom 1
cbo 0
dl 0
loc 268
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A slug() 0 37 3
B transliterate() 0 198 2
1
<?php
2
3
4
namespace CultuurNet\UDB3;
5
6
/**
7
 * Class CulturefeedSlugger
8
 *
9
 * Taken from the culturefeed Drupal module.
10
 */
11
class CulturefeedSlugger implements SluggerInterface
12
{
13
    /**
14
     * The maximum length the slug can have.
15
     *
16
     * @var int
17
     */
18
    protected $length;
19
20
    /**
21
     * The separator that will be used instead of whitespaces.
22
     *
23
     * @var string
24
     */
25
    protected $separator;
26
27
    /**
28
     * @param int $length
29
     *   The maximum length the slug can have.
30
     * @param string $separator
31
     *   The separator that will be used instead of whitespaces.
32
     */
33
    public function __construct($length = 50, $separator = '-')
34
    {
35
        $this->length = $length;
36
        $this->separator = $separator;
37
    }
38
39
    /**
40
     * @inheritdoc
41
     */
42
    public function slug($string)
43
    {
44
        // transliterate
45
        $string = $this->transliterate($string);
46
47
        // lowercase
48
        $string = strtolower($string);
49
50
        // replace non alphanumeric and non underscore characters by separator
51
        $string = preg_replace('/[^a-z0-9]/i', $this->separator, $string);
52
53
        // replace multiple occurrences of separator by one instance
54
        $string = preg_replace(
55
            '/' . preg_quote($this->separator) . '[' . preg_quote($this->separator) . ']*/',
56
            $this->separator,
57
            $string
58
        );
59
60
        // cut off to maximum length
61
        if ($this->length > -1 && strlen($string) > $this->length) {
62
            $string = substr($string, 0, $this->length);
63
        }
64
65
        // remove separator from start and end of string
66
        $string = preg_replace(
67
            '/' . preg_quote($this->separator) . '$/',
68
            '',
69
            $string
70
        );
71
        $string = preg_replace(
72
            '/^' . preg_quote($this->separator) . '/',
73
            '',
74
            $string
75
        );
76
77
        return $string;
78
    }
79
80
    private function transliterate(string $string): string
81
    {
82
        static $charMap;
83
        if (!$charMap) {
84
            $charMap = array(
85
                // Decompositions for Latin-1 Supplement
86
                chr(195) . chr(128) => 'A',
87
                chr(195) . chr(129) => 'A',
88
                chr(195) . chr(130) => 'A',
89
                chr(195) . chr(131) => 'A',
90
                chr(195) . chr(132) => 'A',
91
                chr(195) . chr(133) => 'A',
92
                chr(195) . chr(135) => 'C',
93
                chr(195) . chr(136) => 'E',
94
                chr(195) . chr(137) => 'E',
95
                chr(195) . chr(138) => 'E',
96
                chr(195) . chr(139) => 'E',
97
                chr(195) . chr(140) => 'I',
98
                chr(195) . chr(141) => 'I',
99
                chr(195) . chr(142) => 'I',
100
                chr(195) . chr(143) => 'I',
101
                chr(195) . chr(145) => 'N',
102
                chr(195) . chr(146) => 'O',
103
                chr(195) . chr(147) => 'O',
104
                chr(195) . chr(148) => 'O',
105
                chr(195) . chr(149) => 'O',
106
                chr(195) . chr(150) => 'O',
107
                chr(195) . chr(153) => 'U',
108
                chr(195) . chr(154) => 'U',
109
                chr(195) . chr(155) => 'U',
110
                chr(195) . chr(156) => 'U',
111
                chr(195) . chr(157) => 'Y',
112
                chr(195) . chr(159) => 's',
113
                chr(195) . chr(160) => 'a',
114
                chr(195) . chr(161) => 'a',
115
                chr(195) . chr(162) => 'a',
116
                chr(195) . chr(163) => 'a',
117
                chr(195) . chr(164) => 'a',
118
                chr(195) . chr(165) => 'a',
119
                chr(195) . chr(167) => 'c',
120
                chr(195) . chr(168) => 'e',
121
                chr(195) . chr(169) => 'e',
122
                chr(195) . chr(170) => 'e',
123
                chr(195) . chr(171) => 'e',
124
                chr(195) . chr(172) => 'i',
125
                chr(195) . chr(173) => 'i',
126
                chr(195) . chr(174) => 'i',
127
                chr(195) . chr(175) => 'i',
128
                chr(195) . chr(177) => 'n',
129
                chr(195) . chr(178) => 'o',
130
                chr(195) . chr(179) => 'o',
131
                chr(195) . chr(180) => 'o',
132
                chr(195) . chr(181) => 'o',
133
                chr(195) . chr(182) => 'o',
134
                chr(195) . chr(182) => 'o',
135
                chr(195) . chr(185) => 'u',
136
                chr(195) . chr(186) => 'u',
137
                chr(195) . chr(187) => 'u',
138
                chr(195) . chr(188) => 'u',
139
                chr(195) . chr(189) => 'y',
140
                chr(195) . chr(191) => 'y',
141
                // Decompositions for Latin Extended-A
142
                chr(196) . chr(128) => 'A',
143
                chr(196) . chr(129) => 'a',
144
                chr(196) . chr(130) => 'A',
145
                chr(196) . chr(131) => 'a',
146
                chr(196) . chr(132) => 'A',
147
                chr(196) . chr(133) => 'a',
148
                chr(196) . chr(134) => 'C',
149
                chr(196) . chr(135) => 'c',
150
                chr(196) . chr(136) => 'C',
151
                chr(196) . chr(137) => 'c',
152
                chr(196) . chr(138) => 'C',
153
                chr(196) . chr(139) => 'c',
154
                chr(196) . chr(140) => 'C',
155
                chr(196) . chr(141) => 'c',
156
                chr(196) . chr(142) => 'D',
157
                chr(196) . chr(143) => 'd',
158
                chr(196) . chr(144) => 'D',
159
                chr(196) . chr(145) => 'd',
160
                chr(196) . chr(146) => 'E',
161
                chr(196) . chr(147) => 'e',
162
                chr(196) . chr(148) => 'E',
163
                chr(196) . chr(149) => 'e',
164
                chr(196) . chr(150) => 'E',
165
                chr(196) . chr(151) => 'e',
166
                chr(196) . chr(152) => 'E',
167
                chr(196) . chr(153) => 'e',
168
                chr(196) . chr(154) => 'E',
169
                chr(196) . chr(155) => 'e',
170
                chr(196) . chr(156) => 'G',
171
                chr(196) . chr(157) => 'g',
172
                chr(196) . chr(158) => 'G',
173
                chr(196) . chr(159) => 'g',
174
                chr(196) . chr(160) => 'G',
175
                chr(196) . chr(161) => 'g',
176
                chr(196) . chr(162) => 'G',
177
                chr(196) . chr(163) => 'g',
178
                chr(196) . chr(164) => 'H',
179
                chr(196) . chr(165) => 'h',
180
                chr(196) . chr(166) => 'H',
181
                chr(196) . chr(167) => 'h',
182
                chr(196) . chr(168) => 'I',
183
                chr(196) . chr(169) => 'i',
184
                chr(196) . chr(170) => 'I',
185
                chr(196) . chr(171) => 'i',
186
                chr(196) . chr(172) => 'I',
187
                chr(196) . chr(173) => 'i',
188
                chr(196) . chr(174) => 'I',
189
                chr(196) . chr(175) => 'i',
190
                chr(196) . chr(176) => 'I',
191
                chr(196) . chr(177) => 'i',
192
                chr(196) . chr(178) => 'IJ',
193
                chr(196) . chr(179) => 'ij',
194
                chr(196) . chr(180) => 'J',
195
                chr(196) . chr(181) => 'j',
196
                chr(196) . chr(182) => 'K',
197
                chr(196) . chr(183) => 'k',
198
                chr(196) . chr(184) => 'k',
199
                chr(196) . chr(185) => 'L',
200
                chr(196) . chr(186) => 'l',
201
                chr(196) . chr(187) => 'L',
202
                chr(196) . chr(188) => 'l',
203
                chr(196) . chr(189) => 'L',
204
                chr(196) . chr(190) => 'l',
205
                chr(196) . chr(191) => 'L',
206
                chr(197) . chr(128) => 'l',
207
                chr(197) . chr(129) => 'L',
208
                chr(197) . chr(130) => 'l',
209
                chr(197) . chr(131) => 'N',
210
                chr(197) . chr(132) => 'n',
211
                chr(197) . chr(133) => 'N',
212
                chr(197) . chr(134) => 'n',
213
                chr(197) . chr(135) => 'N',
214
                chr(197) . chr(136) => 'n',
215
                chr(197) . chr(137) => 'N',
216
                chr(197) . chr(138) => 'n',
217
                chr(197) . chr(139) => 'N',
218
                chr(197) . chr(140) => 'O',
219
                chr(197) . chr(141) => 'o',
220
                chr(197) . chr(142) => 'O',
221
                chr(197) . chr(143) => 'o',
222
                chr(197) . chr(144) => 'O',
223
                chr(197) . chr(145) => 'o',
224
                chr(197) . chr(146) => 'OE',
225
                chr(197) . chr(147) => 'oe',
226
                chr(197) . chr(148) => 'R',
227
                chr(197) . chr(149) => 'r',
228
                chr(197) . chr(150) => 'R',
229
                chr(197) . chr(151) => 'r',
230
                chr(197) . chr(152) => 'R',
231
                chr(197) . chr(153) => 'r',
232
                chr(197) . chr(154) => 'S',
233
                chr(197) . chr(155) => 's',
234
                chr(197) . chr(156) => 'S',
235
                chr(197) . chr(157) => 's',
236
                chr(197) . chr(158) => 'S',
237
                chr(197) . chr(159) => 's',
238
                chr(197) . chr(160) => 'S',
239
                chr(197) . chr(161) => 's',
240
                chr(197) . chr(162) => 'T',
241
                chr(197) . chr(163) => 't',
242
                chr(197) . chr(164) => 'T',
243
                chr(197) . chr(165) => 't',
244
                chr(197) . chr(166) => 'T',
245
                chr(197) . chr(167) => 't',
246
                chr(197) . chr(168) => 'U',
247
                chr(197) . chr(169) => 'u',
248
                chr(197) . chr(170) => 'U',
249
                chr(197) . chr(171) => 'u',
250
                chr(197) . chr(172) => 'U',
251
                chr(197) . chr(173) => 'u',
252
                chr(197) . chr(174) => 'U',
253
                chr(197) . chr(175) => 'u',
254
                chr(197) . chr(176) => 'U',
255
                chr(197) . chr(177) => 'u',
256
                chr(197) . chr(178) => 'U',
257
                chr(197) . chr(179) => 'u',
258
                chr(197) . chr(180) => 'W',
259
                chr(197) . chr(181) => 'w',
260
                chr(197) . chr(182) => 'Y',
261
                chr(197) . chr(183) => 'y',
262
                chr(197) . chr(184) => 'Y',
263
                chr(197) . chr(185) => 'Z',
264
                chr(197) . chr(186) => 'z',
265
                chr(197) . chr(187) => 'Z',
266
                chr(197) . chr(188) => 'z',
267
                chr(197) . chr(189) => 'Z',
268
                chr(197) . chr(190) => 'z',
269
                chr(197) . chr(191) => 's',
270
                // Euro Sign
271
                chr(226) . chr(130) . chr(172) => 'E',
272
            );
273
        }
274
275
        // transliterate
276
        return strtr($string, $charMap);
277
    }
278
}
279