Module:Lang: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
No edit summary |
No edit summary |
||
Line 34: | Line 34: | ||
local getArgs = require ('Module:Arguments').getArgs; |
local getArgs = require ('Module:Arguments').getArgs; |
||
local lang_name_table = require ('Module:Language/name/data'); |
local lang_name_table = require ('Module:Language/name/data'); |
||
local script_name_table = mw.loadData ('Module:Language/data/iana scripts'); |
|||
local region_name_table = mw.loadData ('Module:Language/data/iana regions'); |
|||
local variant_name_table = mw.loadData ('Module:Language/data/iana variants'); |
|||
local lang_data = mw.loadData ('Module:Lang/data'); -- language name override and transliteration tool-tip tables |
local lang_data = mw.loadData ('Module:Lang/data'); -- language name override and transliteration tool-tip tables |
||
Line 47: | Line 52: | ||
local function is_set( var ) |
local function is_set( var ) |
||
return not (var == nil or var == ''); |
return not (var == nil or var == ''); |
||
end |
|||
--[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- |
|||
Whether needle is in haystack |
|||
]] |
|||
local function in_array( needle, haystack ) |
|||
if needle == nil then |
|||
return false; |
|||
end |
|||
for n,v in ipairs( haystack ) do |
|||
if v == needle then |
|||
return n; |
|||
end |
|||
end |
|||
return false; |
|||
end |
end |
||
Line 71: | Line 95: | ||
local function get_ietf_parts (source) |
local function get_ietf_parts (source) |
||
local code; |
local code; |
||
local script; |
local script = ''; |
||
local region; |
local region = ''; |
||
local variant = ''; |
|||
if not is_set (source) then |
if not is_set (source) then |
||
return nil, nil, nil; |
return nil, nil, nil, nil; |
||
end |
end |
||
if source:match ('^%a+%-%a |
if source:match ('^%a+%-%a%a%a%a%-%a%a%-(%d%d%d%d+$') then -- ll-Ssss-RR-variant (where variant is 4 digits) |
||
code, script, region, variant = source:match ('^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%d%d%d%d)$'); |
|||
elseif source:match ('^%a+%-%a%a%a%a%-%a%a%-[%a%d][%a%d][%a%d][%a%d][%a%d]+$') then -- ll-Ssss-RR-variant (where variant is 5-8 alnum characters) |
|||
code, script, region, variant = source:match ('^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-([%a%d][%a%d][%a%d][%a%d][%a%d][%a%d]?[%a%d]?[%a%d]?)$'); |
|||
elseif source:match ('^%a+%-%a%a%a%a%-(%d%d%d%d+$') then -- ll-Ssss-variant (where variant is 4 digits) |
|||
code, script, variant = source:match ('^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d%d)$'); |
|||
elseif source:match ('^%a+%-%a%a%a%a%-[%a%d][%a%d][%a%d][%a%d][%a%d]+$') then -- ll-Ssss-variant (where variant is 5-8 alnum characters) |
|||
code, script, variant = source:match ('^(%a%a%a?)%-(%a%a%a%a)%-([%a%d][%a%d][%a%d][%a%d][%a%d][%a%d]?[%a%d]?[%a%d]?)$'); |
|||
elseif source:match ('^%a+%-%a%a%-(%d%d%d%d+$') then -- ll-RR-variant (where variant is 4 digits) |
|||
code, region, variant = source:match ('^(%a%a%a?)%-(%a%a)%-(%d%d%d%d)$'); |
|||
elseif source:match ('^%a+%-%a%a%-[%a%d][%a%d][%a%d][%a%d][%a%d]+$') then -- ll-RR-variant (where variant is 5-8 alnum characters) |
|||
code, region, variant = source:match ('^(%a%a%a?)%-(%a%a)%-([%a%d][%a%d][%a%d][%a%d][%a%d][%a%d]?[%a%d]?[%a%d]?)$'); |
|||
elseif source:match ('^%a+%-(%d%d%d%d+)$') then -- ll-variant (where variant is 4 digits) |
|||
code, variant = source:match ('^(%a%a%a?)%-(%d%d%d%d)$'); |
|||
elseif source:match ('^%a+%-[%a%d][%a%d][%a%d][%a%d][%a%d]+$') then -- ll-variant (where variant is 5-8 alnum characters) |
|||
code, variant = source:match ('^(%a%a%a?)%-([%a%d][%a%d][%a%d][%a%d][%a%d][%a%d]?[%a%d]?[%a%d]?)$'); |
|||
elseif source:match ('^%a+%-%a%a%a%a%-%a%a$') then -- ll-Ssss-RR |
|||
code, script, region = source:match ('^(%l%l%l?)%-(%u%l%l%l)%-(%u%u)$'); |
code, script, region = source:match ('^(%l%l%l?)%-(%u%l%l%l)%-(%u%u)$'); |
||
elseif source:match ('^%a+%-%a%a%a%a') then -- ll-Ssss |
|||
elseif source:match ('^%a+%-%a%a%a%a$') then -- ll-Ssss |
|||
code, script = source:match ('^(%l%l%l?)%-(%u%l%l%l)$'); |
code, script = source:match ('^(%l%l%l?)%-(%u%l%l%l)$'); |
||
region = ''; |
|||
elseif source:match ('^%a+%-%a%a$') then -- ll-RR |
elseif source:match ('^%a+%-%a%a$') then -- ll-RR |
||
code, region = source:match ('^(%l%l%l?)%-(%u%u)$'); |
code, region = source:match ('^(%l%l%l?)%-(%u%u)$'); |
||
script = ''; |
|||
elseif source:match ('^%a+$') then -- ll |
elseif source:match ('^%a+$') then -- ll |
||
code = source:match ('^(%l%l%l?)$'); |
code = source:match ('^(%l%l%l?)$'); |
||
script = ''; |
|||
region = ''; |
|||
else |
else |
||
return nil, nil, nil; |
return nil, nil, nil, nil; -- don't know what we got but it is malformed |
||
end |
end |
||
if not (lang_data.override[code] or lang_name_table.lang[code]) then |
if not (lang_data.override[code] or lang_name_table.lang[code]) then |
||
return nil, nil, nil; |
return nil, nil, nil, nil; -- invalid language code, don't know about the others (don't care?) |
||
end |
end |
||
if is_set (script) then |
if is_set (script) then |
||
if not |
if not script_name_table[script] then |
||
return code, nil, nil; |
return code, nil, nil, nil; -- language code ok, invalid script, don't know about the others (don't care?) |
||
end |
end |
||
end |
end |
||
if is_set (region) then |
if is_set (region) then |
||
if not |
if not region_name_table[region] then |
||
return code, script, nil; |
return code, script, nil, nil; |
||
end |
end |
||
end |
end |
||
if is_set (variant) then |
|||
return code, script, region; -- return the good bits |
|||
if not lang_name_table.variant[variant] then |
|||
return code, script, region, nil; |
|||
end |
|||
if not in_array (code, lang_name_table.variant[variant]['prefixes']) then |
|||
return code, script, region, nil; |
|||
end |
|||
end |
|||
return code, script, region, variant; -- return the good bits |
|||
end |
end |
||
Line 229: | Line 283: | ||
table.insert (tout, ' transliteration'); |
table.insert (tout, ' transliteration'); |
||
elseif is_set (std) and is_set (script) then -- when both are specified |
elseif is_set (std) and is_set (script) then -- when both are specified |
||
if title_table[std][script] then |
if title_table[std][script] then -- and legitimate |
||
table.insert (tout, title_table[std][script]); -- add the appropriate text to the tool tip |
table.insert (tout, title_table[std][script]); -- add the appropriate text to the tool tip |
||
else |
else |
||
Line 277: | Line 331: | ||
local out = {}; |
local out = {}; |
||
local language_name; |
local language_name; |
||
local code, script, region = get_ietf_parts (args.code); |
local code, script, region, variant = get_ietf_parts (args.code); |
||
-- if is_set (code) then |
|||
if lang_data.override[code] then |
-- if lang_data.override[code] then |
||
language_name = lang_data.override[code][1] |
-- language_name = lang_data.override[code][1] |
||
elseif lang_name_table.lang[code] then |
-- elseif lang_name_table.lang[code] then |
||
language_name = lang_name_table.lang[code][1]; -- table entries sometimes have multiple names, always take the first one |
-- language_name = lang_name_table.lang[code][1]; -- table entries sometimes have multiple names, always take the first one |
||
end |
-- end |
||
-- end |
|||
-- if not is_set (language_name) then |
|||
if not (code and script and region and variant) then |
|||
-- table.insert (out, '<span style="font-size:100%" class="error">error: unknown language code: '); |
|||
-- table.insert (out, args.code or 'missing'); |
|||
-- table.insert (out, '</span>'); |
|||
table.insert (out, make_error_msg (table.concat ({'unknown language code: ', args.code or 'missing'}))); |
table.insert (out, make_error_msg (table.concat ({'unknown language code: ', args.code or 'missing'}))); |
||
Line 304: | Line 355: | ||
end |
end |
||
if lang_data.override[code] then |
|||
language_name = lang_data.override[code][1] |
|||
elseif lang_name_table.lang[code] then |
|||
language_name = lang_name_table.lang[code][1]; -- table entries sometimes have multiple names, always take the first one |
|||
end |
|||
table.insert (out, make_text_span (args.code, args.text, args.rtl, nil, args.size)); -- italics set to nil here because not supporte by {{lang}} |
table.insert (out, make_text_span (args.code, args.text, args.rtl, nil, args.size)); -- italics set to nil here because not supporte by {{lang}} |
||
table.insert (out, make_category (args.code, language_name, args.nocat)); |
table.insert (out, make_category (args.code, language_name, args.nocat)); |
||
Line 340: | Line 397: | ||
local out = {}; |
local out = {}; |
||
local language_name; |
local language_name; |
||
local code, script, region = get_ietf_parts (args.code); |
local code, script, region, variant = get_ietf_parts (args.code); |
||
local translit_script; |
|||
if is_set (code) then |
|||
if lang_data.override[code] then |
|||
language_name = lang_data.override[code][1] |
|||
elseif lang_name_table.lang[code] then |
|||
language_name = lang_name_table.lang[code][1]; -- table entries sometimes have multiple names, always take the first one |
|||
end |
|||
end |
|||
local script = args.script or language_name; -- for translit prefer script of language |
|||
local translit; |
local translit; |
||
local translit_title; |
local translit_title; |
||
-- if is_set (code) then |
|||
-- if lang_data.override[code] then |
|||
-- table.insert (out, '<span style="font-size:100%" class="error">error: unknown language code: '); |
|||
-- language_name = lang_data.override[code][1] |
|||
-- table.insert (out, args.code or 'missing'); |
|||
-- elseif lang_name_table.lang[code] then |
|||
-- table.insert (out, '</span>'); |
|||
-- language_name = lang_name_table.lang[code][1]; -- table entries sometimes have multiple names, always take the first one |
|||
-- end |
|||
-- end |
|||
-- if not is_set (language_name) then |
|||
if not (code and script and region and variant) then |
|||
table.insert (out, make_error_msg (table.concat ({'unknown language code: ', args.code or 'missing'}))); |
table.insert (out, make_error_msg (table.concat ({'unknown language code: ', args.code or 'missing'}))); |
||
Line 370: | Line 425: | ||
end |
end |
||
if lang_data.override[code] then |
|||
language_name = lang_data.override[code][1] |
|||
elseif lang_name_table.lang[code] then |
|||
language_name = lang_name_table.lang[code][1]; -- table entries sometimes have multiple names, always take the first one |
|||
end |
|||
translit_script = args.script or language_name; -- for translit prefer script over language |
|||
if 'no' == args.link then |
if 'no' == args.link then |
||
table.insert (out, language_name); -- language name without wikilink |
table.insert (out, language_name); -- language name without wikilink |
||
Line 383: | Line 446: | ||
translit_title = mw.title.makeTitle (0, 'Romanization of ' .. language_name) |
translit_title = mw.title.makeTitle (0, 'Romanization of ' .. language_name) |
||
if translit_title.exists then |
if translit_title.exists then |
||
table.insert (out, make_wikilink ('Romanization of ' .. |
table.insert (out, make_wikilink ('Romanization of ' .. translit_script or language_name, 'translit.')); |
||
else |
else |
||
table.insert (out, '<abbr title="transliteration">translit.</abbr>'); |
table.insert (out, '<abbr title="transliteration">translit.</abbr>'); |