Mercurial > prosody-modules
annotate mod_xmllang_check/xmpplang.lib.lua @ 6562:5da6fb562df9 default tip
mod_unified_push: Fix push error handling (fixes #2000)
Use the error object that send_iq() passes
as an argument to it's reject callback instead of attempting
and failing to do the parsing in the callback itself.
| author | kmq |
|---|---|
| date | Mon, 06 Jul 2026 14:23:57 +0200 |
| parents | de3dc4297035 |
| children |
| rev | line source |
|---|---|
|
6401
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
1 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
2 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
3 local irregular = { |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
4 "en-GB-oed", "i-ami", "i-bnn", "i-default", "i-enochian", "i-hak", "i-klingon", "i-lux", "i-mingo", "i-navajo", "i-pwn", "i-tao", "i-tay", "i-tsu", "sgn-BE-FR", "sgn-BE-NL", "sgn-CH-DE" |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
5 }; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
6 local regular = { |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
7 "art-lojban", "cel-gaulish", "no-bok", "no-nyn", "zh-guoyu", "zh-hakka", "zh-min", "zh-min-nan", "zh-xiang" |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
8 }; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
9 local grandfathered = {}; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
10 for _, tag in ipairs(irregular) do |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
11 grandfathered[tag:lower()] = true; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
12 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
13 for _, tag in ipairs(regular) do |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
14 grandfathered[tag:lower()] = true; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
15 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
16 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
17 local function split_subtags(lower_s) |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
18 local subtags = {}; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
19 for subtag in lower_s:gmatch("[^%-]+") do -- split on hyphens |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
20 table.insert(subtags, subtag); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
21 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
22 return subtags; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
23 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
24 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
25 local function is_privateuse(lower_s) |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
26 if lower_s:sub(1, 2) ~= "x-" then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
27 -- print("privateuse: " .. lower_s .. " does not start with x-"); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
28 return false; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
29 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
30 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
31 -- only allow alphanum and hyphens from here on out |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
32 if lower_s:match("[^a-z0-9%-]") then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
33 -- print("privateuse: " .. lower_s .. " contains non-alphanum or hyphen"); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
34 return false; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
35 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
36 -- lets not allow any zero-len subtags |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
37 if lower_s:match("^%-") or lower_s:match("%-$") or lower_s:match("%-%-") then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
38 -- print("privateuse: " .. lower_s .. " contains zero-len subtags"); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
39 return false; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
40 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
41 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
42 local subtags = split_subtags(lower_s); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
43 -- print("privateuse subtags: " .. table.concat(subtags, "|")); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
44 if #subtags < 2 then return false; end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
45 for i = 1, #subtags do |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
46 if #subtags[i] < 1 or #subtags[i] > 8 or not subtags[i]:match("^[a-z0-9]+$") then return false; end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
47 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
48 -- print("privateuse: " .. lower_s .. " is valid"); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
49 return true; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
50 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
51 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
52 local function is_langtag(lower_s) |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
53 -- print("is_langtag: " .. lower_s); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
54 -- print(" lower_s:sub(-5): ".. lower_s:sub(-5)) |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
55 -- Remove the optional .utf8 suffix if it exists |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
56 if lower_s:sub(-6) == ".utf-8" then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
57 -- print("removing .utf-8 suffix"); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
58 lower_s = lower_s:sub(1, -7); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
59 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
60 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
61 -- at this point we have a hyphen-separated string of subtags, where subtags are alphanumeric |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
62 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
63 -- only allow alphanum and hyphens from here on out |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
64 if lower_s:match("[^a-z0-9%-]") then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
65 return false; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
66 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
67 -- lets not allow any zero-len subtags |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
68 if lower_s:match("^%-") or lower_s:match("%-$") or lower_s:match("%-%-") then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
69 return false; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
70 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
71 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
72 -- let's split on hyphens |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
73 local subtags = split_subtags(lower_s); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
74 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
75 -- we are now dealing with this pattern: language ( "-" script )? ( "-" region )? ( "-" variant )* ( "-" extension )* |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
76 -- we'll now process in order |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
77 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
78 -- Let's process "language" |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
79 -- print("processing language: " .. table.concat(subtags, "|")); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
80 local subtag = table.remove(subtags, 1); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
81 if not subtag or not subtag:match("^[a-z]+$") then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
82 return false; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
83 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
84 if #subtag == 2 or #subtag == 3 then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
85 -- we want to check for 0-3 instances of three-letter tags |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
86 for i = 1, 3 do |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
87 local subtag = subtags[1]; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
88 if subtag and #subtag == 3 and subtag:match("^[a-z]+$") then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
89 table.remove(subtags, 1); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
90 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
91 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
92 elseif #subtag >= 4 and #subtag <= 8 then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
93 -- passthrough |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
94 else |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
95 return false; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
96 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
97 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
98 -- Let's process optional: script = ALPHA{4}; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
99 -- print("processing script: " .. table.concat(subtags, "|")); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
100 subtag = subtags[1]; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
101 if subtag and #subtag == 4 and subtag:match("^[a-z]+$") then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
102 table.remove(subtags, 1); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
103 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
104 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
105 -- Let's process optional: region = ALPHA{2} | DIGIT{3}; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
106 -- print("processing region: " .. table.concat(subtags, "|")); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
107 subtag = subtags[1]; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
108 if subtag and ((#subtag == 2 and subtag:match("^[a-z][a-z]$")) or (#subtag == 3 and subtag:match("^[0-9][0-9][0-9]$"))) then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
109 table.remove(subtags, 1); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
110 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
111 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
112 -- Let's process zero or more: variant = alphanum{5,8} | ( DIGIT alphanum{3} ); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
113 while true do |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
114 local variant = subtags[1]; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
115 if not variant or (#variant < 4 or #variant > 8) then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
116 break; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
117 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
118 if #variant == 4 and not variant:match("^[0-9]") then return false; end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
119 table.remove(subtags, 1); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
120 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
121 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
122 -- print("processing extensions: " .. table.concat(subtags, "|")); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
123 -- Let's process zero or more: extension = singleton ( "-" alphanum{2,8} )+; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
124 while true do |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
125 local extension = subtags[1]; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
126 if not extension or extension == "x" then break; end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
127 if #extension ~= 1 then return false; end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
128 table.remove(subtags, 1); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
129 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
130 local part = subtags[1]; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
131 if not part or (#part < 2 or #part > 8) then return false; end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
132 table.remove(subtags, 1); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
133 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
134 while true do |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
135 part = subtags[1]; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
136 if not part or (#part < 2 or #part > 8) then break; end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
137 table.remove(subtags, 1); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
138 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
139 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
140 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
141 -- print("processing privateuse: " .. table.concat(subtags, "|")); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
142 -- Let's process optional: privateuse = "x"i ( "-" alphanum{1,8} )+; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
143 local privateuse = table.remove(subtags, 1); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
144 -- print("privateuse: " .. privateuse); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
145 if privateuse then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
146 if privateuse ~= "x" or #subtags < 1 then return false; end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
147 for i = 1, #subtags do |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
148 local part = subtags[i]; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
149 if #part < 1 or #part > 8 then return false; end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
150 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
151 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
152 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
153 return true; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
154 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
155 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
156 local function is_xmpplang(s) |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
157 local lower_s = s:lower(); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
158 if grandfathered[lower_s] then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
159 return true; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
160 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
161 -- print("checking privateuse: " .. lower_s); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
162 if is_privateuse(lower_s) then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
163 -- print("privateuse: " .. lower_s .. " is valid"); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
164 return true; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
165 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
166 -- print("checking langtag: " .. lower_s); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
167 if is_langtag(lower_s) then |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
168 return true; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
169 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
170 return false; |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
171 end |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
172 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
173 -- print("=== x-abc-def") |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
174 -- print(is_xmpplang("x-abc-def")); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
175 -- print("=== x-a-b-c-d-e") |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
176 -- print(is_xmpplang("x-a-b-c-d-e")); |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
177 |
|
de3dc4297035
mod_xmllang_check: Initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
178 return is_xmpplang; |
