Module:Lang: Difference between revisions

better handling of ISO 639 special scope tags;
m (1 revision imported: Citation templates)
(better handling of ISO 639 special scope tags;)
Line 25: Line 25:
local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization
local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization


local this_wiki_lang = mw.language.getContentLanguage().code; -- get this wiki's language
local content_lang = mw.language.getContentLanguage();
local this_wiki_lang_tag = content_lang.code; -- get this wiki's language tag
local this_wiki_lang_dir = content_lang:getDir(); -- get this wiki's language direction


local initial_style_state; -- set by lang_xx_normal() and lang_xx_italic()
local initial_style_state; -- set by lang_xx_normal() and lang_xx_italic()
Line 419: Line 421:
table.insert (out, table.concat ({'[', args.text or 'undefined', '] '})); -- for error messages output args.text if available
table.insert (out, table.concat ({'[', args.text or 'undefined', '] '})); -- for error messages output args.text if available
table.insert (out, table.concat ({'<span style=\"font-size: 100%; font-style: normal;\" class=\"error\">Error: {{', template, '}}: '}));
table.insert (out, table.concat ({'<span style=\"color:#d33\">Error: {{', template, '}}: '}));
table.insert (out, msg);
table.insert (out, msg);
table.insert (out, table.concat ({' ([[:Category:', category, ' template errors|help]])'}));
table.insert (out, table.concat ({' ([[:Category:', category, ' template errors|help]])'}));
table.insert (out, '</span>');
table.insert (out, '</span>');
if (0 == namespace or 10 == namespace) and not args.nocat then -- categorize in article space (and template space to take care of broken usages)
if (0 == namespace or 10 == namespace) and not args.nocat then -- categorize in article space (and template space to take care of broken usages)
table.insert (out, table.concat ({'[[Category:', category, ' template errors]]'}));
table.insert (out, table.concat ({'[[Category:', category, ' template errors]]'}));
end
end
Line 464: Line 466:
if text:find ('^\n[%*:;#]') then -- look for list markup; list markup must begin at start of text
if text:find ('^\n[%*:;#]') then -- look for list markup; list markup must begin at start of text
if 'italic' == style then
if 'italic' == style then
return mw.ustring.gsub (text, '(\n[%*:;#]+)([^\n]+)', '%1<i>%2</i>'); -- insert italic markup at each list item
return text:gsub ('(\n[%*:;#]+)([^\n]+)', '%1<i>%2</i>'); -- insert italic markup at each list item
else
else
return text;
return text;
Line 510: Line 512:


table.insert (html, table.concat ({'<', tag})); -- open the <i>, <span>, or <div> html tag
table.insert (html, table.concat ({'<', tag})); -- open the <i>, <span>, or <div> html tag
code = code:gsub ('%-x%-.*', ''); -- strip private use subtag from code tag because meaningless outside of wikipedia
code = code:gsub ('%-x%-.*', ''); -- strip private use subtag from code tag because meaningless outside of wikipedia
table.insert (html, table.concat ({' lang="', code, '\"'})); -- add language attribute
table.insert (html, table.concat ({' lang="', code, '\"'})); -- add language attribute


if rtl or unicode.is_rtl(text) then
if (rtl or unicode.is_rtl(text)) and ('ltr' == this_wiki_lang_dir) then -- text is right-to-left on a left-to-right wiki
table.insert (html, ' dir="rtl"'); -- add direction attribute for right to left languages
table.insert (html, ' dir="rtl"'); -- add direction attribute for right-to-left languages
elseif not (rtl or unicode.is_rtl(text)) and ('rtl' == this_wiki_lang_dir) then -- text is left-to-right on a right-to-left wiki
table.insert (html, ' dir="ltr"'); -- add direction attribute for left-to-right languages
end
end


Line 532: Line 536:


if is_set (language) then
if is_set (language) then
table.insert (html, table.concat ({style_added, ' title=\"', language})); --start the title text
table.insert (html, table.concat ({style_added, ' title=\"', language})); -- start the title text
if language:find ('languages') then
if 'zxx' == code then -- special case for this tag
table.insert (html, ' text'); -- not a language so don't use 'language' in title text
elseif mw.ustring.find (language, 'languages', 1, true) then
table.insert (html, ' collective text'); -- for collective languages
table.insert (html, ' collective text'); -- for collective languages
else
else
Line 546: Line 552:
table.insert (html, table.concat ({'</', tag, '>'})); -- close the <i>, <span>, or <div> html tag
table.insert (html, table.concat ({'</', tag, '>'})); -- close the <i>, <span>, or <div> html tag


if rtl then -- legacy; shouldn't be necessary because all of the rtl text is wrapped inside an html tag with dir="rtl" attribute
table.insert (html, '&lrm;'); -- make sure the browser knows that we're at the end of the rtl
end
return table.concat (html); -- put it all together and done
return table.concat (html); -- put it all together and done
end
end
Line 574: Line 577:
end
end


if language_name:find ('languages') then
if mw.ustring.find (language_name, 'languages', 1, true) then
return table.concat ({'[[Category:Articles with text in ', language_name, ']]'});
return table.concat ({'[[Category:Articles with text in ', language_name, ']]'});
end
end
Line 631: Line 634:
if not is_set (std) and not is_set (tscript) then -- when neither standard nor script specified
if not is_set (std) and not is_set (tscript) then -- when neither standard nor script specified
table.insert (tout, language_name); -- write a generic tool tip
table.insert (tout, language_name); -- write a generic tool tip
if not language_name:find ('languages') then -- collective language names (plural 'languages' is part of the name)
if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name)
table.insert (tout, '-language') -- skip this text (individual and macro languages only)
table.insert (tout, '-language') -- skip this text (individual and macro languages only)
end
end
Line 638: Line 641:
if title_table[std] then -- and if standard is legitimate
if title_table[std] then -- and if standard is legitimate
if title_table[std][tscript] then -- and if script for that standard is legitimate
if title_table[std][tscript] then -- and if script for that standard is legitimate
table.insert (tout, table.concat ({title_table[std][tscript:lower()], ' (', script_table[tscript][1], ' script) transliteration'})); -- add the appropriate text to the tool tip
if script_table[tscript] then
table.insert (tout, table.concat ({title_table[std][tscript:lower()], ' (', script_table[tscript], ' script) transliteration'})); -- add the appropriate text to the tool tip
else
table.insert (tout, title_table[std]['default']); -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard?
end
else
else
table.insert (tout, title_table[std]['default']); -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard?
table.insert (tout, title_table[std]['default']); -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard?
Line 650: Line 657:
if title_table[std][code] then -- if language code is in the table (transl may not provide a language code)
if title_table[std][code] then -- if language code is in the table (transl may not provide a language code)
-- table.insert (tout, table.concat ({title_table[std][code:lower()], ' (', lang_table[code][1], ' language) transliteration'})); -- add the appropriate text to the tool tip
table.insert (tout, table.concat ({title_table[std][code:lower()], ' (', language_name, ' language) transliteration'})); -- add the appropriate text to the tool tip
table.insert (tout, table.concat ({title_table[std][code:lower()], ' (', language_name, ' language) transliteration'})); -- add the appropriate text to the tool tip
else -- code doesn't match
else -- code doesn't match
Line 664: Line 670:
table.insert (tout, table.concat ({language_name, '-script transliteration'})); -- write a script tool tip
table.insert (tout, table.concat ({language_name, '-script transliteration'})); -- write a script tool tip
elseif is_set (code) then
elseif is_set (code) then
if not language_name:find ('languages') then -- collective language names (plural 'languages' is part of the name)
if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name)
table.insert (tout, '-language') -- skip this text (individual and macro languages only)
table.insert (tout, '-language') -- skip this text (individual and macro languages only)
end
end
Line 850: Line 856:
if override_table[ietf] then -- look for whole IETF tag in override table
if override_table[ietf] then -- look for whole IETF tag in override table
name = override_table[ietf][1];
name = override_table[ietf];
elseif override_table[code] then -- not there so try basic language code
elseif override_table[code] then -- not there so try basic language tag
name = override_table[code][1];
name = override_table[code];
elseif lang_table[code] then -- shift to iana code/name table
elseif lang_table[code] then -- shift to iana active tag/name table
name = lang_table[code][1]; -- table entries sometimes have multiple names, always take the first one
name = lang_table[code];
elseif lang_dep_table[code] then
elseif lang_dep_table[code] then -- try the iana deprecated tag/name table
-- if cat then
name = lang_dep_table[code];
-- table.insert (maint_cats, table.concat ({'Lang and lang-xx using deprecated ISO 639 codes|', code}));
-- table.insert (maint_msgs, table.concat ({'code: ', code, ' is deprecated'}));
-- end
name = lang_dep_table[code][1]; -- table entries sometimes have multiple names, always take the first one
end
end


Line 934: Line 936:
if nil == args.italic then -- nil when |italic= absent or not set or |italic=default; args.italic controls
if nil == args.italic then -- nil when |italic= absent or not set or |italic=default; args.italic controls
if ('latn' == subtags.script) or -- script is latn
if ('latn' == subtags.script) or -- script is latn
(this_wiki_lang ~= code and not is_set (subtags.script) and not has_poem_tag (args.text) and unicode.is_Latin (args.text)) then -- text not this wiki's language, no script specified and not in poem markup but is wholly latn script (auto-italics)
(this_wiki_lang_tag ~= code and not is_set (subtags.script) and not has_poem_tag (args.text) and unicode.is_Latin (args.text)) then -- text not this wiki's language, no script specified and not in poem markup but is wholly latn script (auto-italics)
args.italic = 'italic'; -- DEFAULT for {{lang}} templates is upright; but if latn script set for font-style:italic
args.italic = 'italic'; -- DEFAULT for {{lang}} templates is upright; but if latn script set for font-style:italic
else
else
Line 1,141: Line 1,143:
table.insert (out, language_name); -- language name without wikilink
table.insert (out, language_name); -- language name without wikilink
else
else
if language_name:find ('languages') then
if mw.ustring.find (language_name, 'languages', 1, true) then
table.insert (out, make_wikilink (language_name)); -- collective language name uses simple wikilink
table.insert (out, make_wikilink (language_name)); -- collective language name uses simple wikilink
elseif lang_data.article_name[code] then
elseif lang_data.article_name[code] then
table.insert (out, make_wikilink (lang_data.article_name[code][1], language_name)); -- language name with wikilink from override data
table.insert (out, make_wikilink (lang_data.article_name[code], language_name)); -- language name with wikilink from override data
else
else
table.insert (out, make_wikilink (language_name .. ' language', language_name)); -- language name with wikilink
table.insert (out, make_wikilink (language_name .. ' language', language_name)); -- language name with wikilink
Line 1,165: Line 1,167:
table.insert (out, '<small>');
table.insert (out, '<small>');
if script_table[args['translit-script']] then -- when |translit-script= is set, try to use the script's name
if script_table[args['translit-script']] then -- when |translit-script= is set, try to use the script's name
translit_script_name = script_table[args['translit-script'][1]];
translit_script_name = script_table[args['translit-script']];
else
else
translit_script_name = language_name; -- fall back on language name
translit_script_name = language_name; -- fall back on language name
Line 1,354: Line 1,356:
if msg then
if msg then
local template = (args['template'] and table.concat ({'{{', args['template'], '}}: '})) or ''; -- make template name (if provided by the template)
local template = (args['template'] and table.concat ({'{{', args['template'], '}}: '})) or ''; -- make template name (if provided by the template)
return table.concat ({'<span style=\"font-size: 100%; font-style: normal;\" class=\"error\">Error: ', template, msg, '</span>'});
return table.concat ({'<span style=\"color:#d33\">Error: ', template, msg, '</span>'});
end
end


Line 1,363: Line 1,365:


if link then -- when |link=yes, wikilink the language name
if link then -- when |link=yes, wikilink the language name
if language_name:find ('languages') then
if mw.ustring.find (language_name, 'languages', 1, true) then
language_name = make_wikilink (language_name, label); -- collective language name uses simple wikilink
language_name = make_wikilink (language_name, label); -- collective language name uses simple wikilink
elseif lang_data.article_name[code] then
elseif lang_data.article_name[code] then
language_name = make_wikilink (lang_data.article_name[code][1], label or language_name); -- language name with wikilink from override data
language_name = make_wikilink (lang_data.article_name[code], label or language_name); -- language name with wikilink from override data
else
else
language_name = make_wikilink (language_name .. ' language', label or language_name); -- language name with wikilink
language_name = make_wikilink (language_name .. ' language', label or language_name); -- language name with wikilink
Line 1,418: Line 1,420:
template = table.concat ({'{{', args['template'], '}}: '}); -- make template name (if provided by the template)
template = table.concat ({'{{', args['template'], '}}: '}); -- make template name (if provided by the template)
end
end
return table.concat ({'<span style=\"font-size: 100%; font-style: normal;\" class=\"error\">Error: ', template, msg, '</span>'});
return table.concat ({'<span style=\"color:#d33\">Error: ', template, msg, '</span>'});
end
end


Line 1,470: Line 1,472:
args.text = args[2]; -- get the transliterated text
args.text = args[2]; -- get the transliterated text
else
else
if args[1] and args[1]:match ('^%a%a%a?%a?$') then -- args[2] missing; is args[1] a code or its it the transliterated text?
if args[1] and args[1]:match ('^%a%a%a?%a?$') then -- args[2] missing; is args[1] a code or is it the transliterated text?
return make_error_msg ('no text', args, 'Transl'); -- args[1] is a code so we're missing text
return make_error_msg ('no text', args, 'Transl'); -- args[1] is a code so we're missing text
else
else
Line 1,499: Line 1,501:


if override_table[args.code] then -- is code a language code defined in the override table?
if override_table[args.code] then -- is code a language code defined in the override table?
language_name = override_table[args.code][1];
language_name = override_table[args.code];
elseif lang_table[args.code] then -- is code a language code defined in the standard language code tables?
elseif lang_table[args.code] then -- is code a language code defined in the standard language code tables?
language_name = lang_table[args.code][1];
language_name = lang_table[args.code];
elseif lang_dep_table[args.code] then -- is code a language code defined in the deprecated language code tables?
elseif lang_dep_table[args.code] then -- is code a language code defined in the deprecated language code tables?
language_name = lang_dep_table[args.code][1];
language_name = lang_dep_table[args.code];
elseif script_table[args.code] then -- if here, code is not a language code; is it a script code?
elseif script_table[args.code] then -- if here, code is not a language code; is it a script code?
language_name = script_table[args.code][1];
language_name = script_table[args.code];
script = args.code; -- code was an ISO 15924 script so use that instead
script = args.code; -- code was an ISO 15924 script so use that instead
args.code = ''; -- unset because not a language code
args.code = ''; -- unset because not a language code
Line 1,537: Line 1,539:
]]
]]


local function _category_from_tag (args)
local function _category_from_tag (args_t)
local subtags = {}; -- IETF subtags script, region, variant, and private
local subtags = {}; -- IETF subtags script, region, variant, and private
local raw_code = args[1]; -- save a copy of the input IETF subtag
local raw_code = args_t[1]; -- save a copy of the input IETF subtag
local link = 'yes' == args['link']; -- make a boolean
local link = 'yes' == args_t.link; -- make a boolean
local label = args.label;
local label = args_t.label;
local code; -- the language code
local code; -- the language code
local msg; -- gets an error message if IETF language tag is malformed or invalid
local msg; -- gets an error message if IETF language tag is malformed or invalid
Line 1,548: Line 1,550:
code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (raw_code);
code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (raw_code);
if msg then
if msg then
local template = (args['template'] and table.concat ({'{{', args['template'], '}}: '})) or ''; -- make template name (if provided by the template)
local template = (args_t.template and table.concat ({'{{', args_t.template, '}}: '})) or ''; -- make template name (if provided by the template)
return table.concat ({'<span style=\"font-size: 100%; font-style: normal;\" class=\"error\">Error: ', template, msg, '</span>'});
return table.concat ({'<span style=\"color:#d33\">Error: ', template, msg, '</span>'});
end
end


Line 1,556: Line 1,558:
category_name = make_category (code, category_name, nil, true):gsub ('[%[%]]', '');
category_name = make_category (code, category_name, nil, true):gsub ('[%[%]]', '');


return category_name;
if link then
return table.concat ({'[[:', category_name, ']]'});
else
return category_name;
end
end
end