Module:Lang: Difference between revisions
Richardpruen (talk | contribs) 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 | 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=\" | 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 | 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 | 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%-.*', ''); | 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 | 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 | ||
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 | 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 | 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 | 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()], ' (', 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 | 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 | name = override_table[ietf]; | ||
elseif override_table[code] then -- not there so try basic language | elseif override_table[code] then -- not there so try basic language tag | ||
name = override_table[code | name = override_table[code]; | ||
elseif lang_table[code] then -- shift to iana | elseif lang_table[code] then -- shift to iana active tag/name table | ||
name = lang_table[code | name = lang_table[code]; | ||
elseif lang_dep_table[code] then | elseif lang_dep_table[code] then -- try the iana deprecated tag/name table | ||
-- | name = lang_dep_table[code]; | ||
name = lang_dep_table[code | |||
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_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 | 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 | 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' | 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=\" | 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 | 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 | 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=\" | 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 | 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 | 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 | 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 | 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 | 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 ( | 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 = | local raw_code = args_t[1]; -- save a copy of the input IETF subtag | ||
local link = 'yes' == | local link = 'yes' == args_t.link; -- make a boolean | ||
local 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 = ( | 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=\" | 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 | ||