Passed
Push — master ( 95ab87...2ec9ce )
by Claudio
08:23
created

SorterBuilder::quaternaryStrength()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 5
ccs 0
cts 4
cp 0
crap 2
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Budgegeria\IntlSort;
6
7
use Budgegeria\IntlSort\Sorter\Asc;
8
use Budgegeria\IntlSort\Sorter\Desc;
9
use Budgegeria\IntlSort\Sorter\Key;
10
use Budgegeria\IntlSort\Sorter\Sorter;
11
use Collator;
12
13
class SorterBuilder
14
{
15
    /**
16
     * @var Collator
17
     */
18
    private $collator;
19
20
    /**
21
     * @var bool
22
     */
23
    private $isAsc = true;
24
25
    /**
26
     * @var bool
27
     */
28
    private $isKeySort = false;
29
30
    public function __construct(string $locale)
31
    {
32
        $this->collator = new Collator($locale);
33
    }
34
35
    public function enableFrenchCollation() : self
36
    {
37
        $this->collator->setAttribute(Collator::FRENCH_COLLATION, Collator::ON);
38
39
        return $this;
40
    }
41
42
    public function disableFrenchCollation() : self
43
    {
44
        $this->collator->setAttribute(Collator::FRENCH_COLLATION, Collator::OFF);
45
46
        return $this;
47
    }
48
49
    public function lowerCaseFirst() : self
50
    {
51
        $this->collator->setAttribute(Collator::CASE_FIRST, Collator::LOWER_FIRST);
52
53
        return $this;
54
    }
55
56
    public function upperCaseFirst() : self
57
    {
58
        $this->collator->setAttribute(Collator::CASE_FIRST, Collator::UPPER_FIRST);
59
60
        return $this;
61
    }
62
63
    public function removeCaseFirst() : self
64
    {
65
        $this->collator->setAttribute(Collator::CASE_FIRST, Collator::OFF);
66
67
        return $this;
68
    }
69
70
    public function enableNormalizationMode() : self
71
    {
72
        $this->collator->setAttribute(Collator::NORMALIZATION_MODE, Collator::ON);
73
74
        return $this;
75
    }
76
77
    public function disableNormalizationMode() : self
78
    {
79
        $this->collator->setAttribute(Collator::NORMALIZATION_MODE, Collator::OFF);
80
81
        return $this;
82
    }
83
84
    public function enableHiraganaQuaternaryMode() : self
85
    {
86
        $this->collator->setAttribute(Collator::HIRAGANA_QUATERNARY_MODE, Collator::ON);
87
88
        return $this;
89
    }
90
91
    public function disableHiraganaQuaternaryMode() : self
92
    {
93
        $this->collator->setAttribute(Collator::HIRAGANA_QUATERNARY_MODE, Collator::OFF);
94
95
        return $this;
96
    }
97
98
    public function enableNumericCollation() : self
99
    {
100
        $this->collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
101
102
        return $this;
103
    }
104
105
    public function disableNumericCollation() : self
106
    {
107
        $this->collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::OFF);
108
109
        return $this;
110
    }
111
112
    public function enableCaseLevel() : self
113
    {
114
        $this->collator->setAttribute(Collator::CASE_LEVEL, Collator::ON);
115
116
        return $this;
117
    }
118
119
    public function disableCaseLevel() : self
120
    {
121
        $this->collator->setAttribute(Collator::CASE_LEVEL, Collator::OFF);
122
123
        return $this;
124
    }
125
126
    public function nonIgnorableAlternateHandling() : self
127
    {
128
        $this->collator->setAttribute(Collator::ALTERNATE_HANDLING, Collator::NON_IGNORABLE);
129
130
        return $this;
131
    }
132
133
    public function shiftedAlternateHandling() : self
134
    {
135
        $this->collator->setAttribute(Collator::ALTERNATE_HANDLING, Collator::SHIFTED);
136
137
        return $this;
138
    }
139
140
    /**
141
     * Ignore accents and case
142
     */
143
    public function primaryStrength() : self
144
    {
145
        $this->collator->setStrength(Collator::PRIMARY);
146
147
        return $this;
148
    }
149
150
    /**
151
     * Ignore case, consider accents
152
     */
153
    public function secondaryStrength() : self
154
    {
155
        $this->collator->setStrength(Collator::SECONDARY);
156
157
        return $this;
158
    }
159
160
    /**
161
     * Consider accents and case
162
     */
163
    public function tertiaryStrength() : self
164
    {
165
        $this->collator->setStrength(Collator::TERTIARY);
166
167
        return $this;
168
    }
169
170
    /**
171
     * Like tertiary, but also considers whitespace, punctuation, and symbols differently when
172
     * used with {@see shiftedAlternateHandling()} or {@see enableHiraganaQuaternaryMode()}
173
     */
174
    public function quaternaryStrength() : self
175
    {
176
        $this->collator->setStrength(Collator::QUATERNARY);
177
178
        return $this;
179
    }
180
181
    public function identicalStrength() : self
182
    {
183
        $this->collator->setStrength(Collator::IDENTICAL);
184
185
        return $this;
186
    }
187
188
    public function orderByAsc() : self
189
    {
190
        $this->isAsc = true;
191
192
        return $this;
193
    }
194
195
    public function orderByDesc() : self
196
    {
197
        $this->isAsc = false;
198
199
        return $this;
200
    }
201
202
    public function orderByKeys() : self
203
    {
204
        $this->isKeySort = true;
205
206
        return $this;
207
    }
208
209
    public function orderByValues() : self
210
    {
211
        $this->isKeySort = false;
212
213
        return $this;
214
    }
215
216
    public function getSorter() : Sorter
217
    {
218
        if ($this->isKeySort) {
219
            $sorter = new Key($this->collator);
220
        } else {
221
            $sorter = new Asc($this->collator, Collator::SORT_STRING);
222
        }
223
224
        if (! $this->isAsc) {
225
            $sorter = new Desc($sorter);
226
        }
227
228
        return $sorter;
229
    }
230
}