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+%-%a+$') then -- ll-Ssss-RR
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-RR
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; -- don't know what we got but it is malformed
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; -- invalid language code, don't know about the others (don't care?)
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 lang_name_table.script[script] then
if not script_name_table[script] then
return code, nil, nil; -- language code ok, invalid script, don't know about region (don't care?)
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 lang_name_table.region[region] then
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 -- and legitimate
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 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
-- end
if not is_set (language_name) then
-- 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 not is_set (language_name) then
-- 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 ' .. script or language_name, 'translit.'));
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>');