MediaWiki
REL1_31
CustomUppercaseCollation.php
Go to the documentation of this file.
1
<?php
40
class
CustomUppercaseCollation
extends
NumericUppercaseCollation
{
41
43
private
$alphabet
;
44
46
private
$puaSubset
;
47
54
public
function
__construct
( array
$alphabet
,
Language
$lang
) {
55
if
( count(
$alphabet
) < 1 || count(
$alphabet
) >= 4096 ) {
56
throw
new
UnexpectedValueException(
"Alphabet must be < 4096 items"
);
57
}
58
$this->firstLetters =
$alphabet
;
59
// For digraphs, only the first letter is capitalized in input
60
$this->alphabet = array_map( [
$lang
,
'uc'
],
$alphabet
);
61
62
$this->puaSubset = [];
63
$len = count(
$alphabet
);
64
for
( $i = 0; $i < $len; $i++ ) {
65
$this->puaSubset[] =
"\xF3\xB3"
. chr( floor( $i / 64 ) + 128 ) . chr( ( $i % 64 ) + 128 );
66
}
67
68
// Sort these arrays so that any trigraphs, digraphs etc. are first
69
// (and they get replaced first in convertToPua()).
70
$lengths = array_map(
'mb_strlen'
, $this->alphabet );
71
array_multisort( $lengths, SORT_DESC, $this->firstLetters, $this->alphabet, $this->puaSubset );
72
73
parent::__construct(
$lang
);
74
}
75
76
private
function
convertToPua
( $string ) {
77
return
str_replace( $this->alphabet, $this->puaSubset, $string );
78
}
79
80
public
function
getSortKey
( $string ) {
81
return
$this->
convertToPua
( parent::getSortKey( $string ) );
82
}
83
84
public
function
getFirstLetter
( $string ) {
85
$sortkey = $this->
getSortKey
( $string );
86
87
// In case a title begins with a character from our alphabet, return the corresponding
88
// first-letter. (This also happens if the title has a corresponding PUA code in it, to avoid
89
// inconsistent behaviour. This class mostly assumes that people will not use PUA codes.)
90
$index = array_search( substr( $sortkey, 0, 4 ), $this->puaSubset );
91
if
( $index !==
false
) {
92
return
$this->firstLetters[ $index ];
93
}
94
95
// String begins with a character outside of our alphabet, fall back
96
return
parent::getFirstLetter( $string );
97
}
98
}
CustomUppercaseCollation
Resort normal UTF-8 order by putting a bunch of stuff in PUA.
Definition
CustomUppercaseCollation.php:40
CustomUppercaseCollation\getSortKey
getSortKey( $string)
Given a string, convert it to a (hopefully short) key that can be used for efficient sorting.
Definition
CustomUppercaseCollation.php:80
CustomUppercaseCollation\__construct
__construct(array $alphabet, Language $lang)
Definition
CustomUppercaseCollation.php:54
CustomUppercaseCollation\$alphabet
$alphabet
Definition
CustomUppercaseCollation.php:43
CustomUppercaseCollation\getFirstLetter
getFirstLetter( $string)
Given a string, return the logical "first letter" to be used for grouping on category pages and so on...
Definition
CustomUppercaseCollation.php:84
CustomUppercaseCollation\convertToPua
convertToPua( $string)
Definition
CustomUppercaseCollation.php:76
CustomUppercaseCollation\$puaSubset
$puaSubset
Definition
CustomUppercaseCollation.php:46
Language
Internationalisation code.
Definition
Language.php:35
NumericUppercaseCollation
Collation that orders text with numbers "naturally", so that 'Foo 1' < 'Foo 2' < 'Foo 12'.
Definition
NumericUppercaseCollation.php:35
UppercaseCollation\$lang
$lang
Definition
UppercaseCollation.php:25
includes
collation
CustomUppercaseCollation.php
Generated on Mon Nov 25 2024 15:34:37 for MediaWiki by
1.10.0