diff options
Diffstat (limited to 'inc/3rdparty/htmlpurifier/HTMLPurifier/AttrDef/Lang.php')
-rw-r--r-- | inc/3rdparty/htmlpurifier/HTMLPurifier/AttrDef/Lang.php | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/inc/3rdparty/htmlpurifier/HTMLPurifier/AttrDef/Lang.php b/inc/3rdparty/htmlpurifier/HTMLPurifier/AttrDef/Lang.php new file mode 100644 index 00000000..6ad0f799 --- /dev/null +++ b/inc/3rdparty/htmlpurifier/HTMLPurifier/AttrDef/Lang.php | |||
@@ -0,0 +1,86 @@ | |||
1 | <?php | ||
2 | |||
3 | /** | ||
4 | * Validates the HTML attribute lang, effectively a language code. | ||
5 | * @note Built according to RFC 3066, which obsoleted RFC 1766 | ||
6 | */ | ||
7 | class HTMLPurifier_AttrDef_Lang extends HTMLPurifier_AttrDef | ||
8 | { | ||
9 | |||
10 | /** | ||
11 | * @param string $string | ||
12 | * @param HTMLPurifier_Config $config | ||
13 | * @param HTMLPurifier_Context $context | ||
14 | * @return bool|string | ||
15 | */ | ||
16 | public function validate($string, $config, $context) | ||
17 | { | ||
18 | $string = trim($string); | ||
19 | if (!$string) { | ||
20 | return false; | ||
21 | } | ||
22 | |||
23 | $subtags = explode('-', $string); | ||
24 | $num_subtags = count($subtags); | ||
25 | |||
26 | if ($num_subtags == 0) { // sanity check | ||
27 | return false; | ||
28 | } | ||
29 | |||
30 | // process primary subtag : $subtags[0] | ||
31 | $length = strlen($subtags[0]); | ||
32 | switch ($length) { | ||
33 | case 0: | ||
34 | return false; | ||
35 | case 1: | ||
36 | if (!($subtags[0] == 'x' || $subtags[0] == 'i')) { | ||
37 | return false; | ||
38 | } | ||
39 | break; | ||
40 | case 2: | ||
41 | case 3: | ||
42 | if (!ctype_alpha($subtags[0])) { | ||
43 | return false; | ||
44 | } elseif (!ctype_lower($subtags[0])) { | ||
45 | $subtags[0] = strtolower($subtags[0]); | ||
46 | } | ||
47 | break; | ||
48 | default: | ||
49 | return false; | ||
50 | } | ||
51 | |||
52 | $new_string = $subtags[0]; | ||
53 | if ($num_subtags == 1) { | ||
54 | return $new_string; | ||
55 | } | ||
56 | |||
57 | // process second subtag : $subtags[1] | ||
58 | $length = strlen($subtags[1]); | ||
59 | if ($length == 0 || ($length == 1 && $subtags[1] != 'x') || $length > 8 || !ctype_alnum($subtags[1])) { | ||
60 | return $new_string; | ||
61 | } | ||
62 | if (!ctype_lower($subtags[1])) { | ||
63 | $subtags[1] = strtolower($subtags[1]); | ||
64 | } | ||
65 | |||
66 | $new_string .= '-' . $subtags[1]; | ||
67 | if ($num_subtags == 2) { | ||
68 | return $new_string; | ||
69 | } | ||
70 | |||
71 | // process all other subtags, index 2 and up | ||
72 | for ($i = 2; $i < $num_subtags; $i++) { | ||
73 | $length = strlen($subtags[$i]); | ||
74 | if ($length == 0 || $length > 8 || !ctype_alnum($subtags[$i])) { | ||
75 | return $new_string; | ||
76 | } | ||
77 | if (!ctype_lower($subtags[$i])) { | ||
78 | $subtags[$i] = strtolower($subtags[$i]); | ||
79 | } | ||
80 | $new_string .= '-' . $subtags[$i]; | ||
81 | } | ||
82 | return $new_string; | ||
83 | } | ||
84 | } | ||
85 | |||
86 | // vim: et sw=4 sts=4 | ||