Module:Lang: Difference between revisions
From Vigyanwiki
Template>Trappist the monk No edit summary |
Template>Trappist the monk No edit summary |
||
Line 20: | Line 20: | ||
{{{1}}} iso language code - required | {{{1}}} iso language code - required | ||
{{{2}}} text - required | {{{2}}} text - required | ||
{{{rtl}}} if set to any value, set | {{{rtl}}} if set to any value, set rtl="rtl" attribute and inserts ‎ after the </span> tag | ||
{{{nocat}}} if set to any value, disables categorization | {{{nocat}}} if set to any value, disables categorization | ||
Line 30: | Line 30: | ||
require('Module:No globals'); | require('Module:No globals'); | ||
local p = {}; | |||
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 | |||
local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization | |||
Line 80: | Line 82: | ||
table.insert (span, '"'); | table.insert (span, '"'); | ||
if is_set (rtl) then | if is_set (rtl) then | ||
table.insert (span, ' | table.insert (span, ' rtl="rtl"'); -- for right to left languages | ||
end | end | ||
if is_set (size) then -- {{lang}} only | if is_set (size) then -- {{lang}} only | ||
Line 87: | Line 89: | ||
table.insert (span, '>'); -- close the opening span tag | table.insert (span, '>'); -- close the opening span tag | ||
if 'yes' == italic then | if 'yes' == italic then | ||
table.insert (span, table.concat ({"''", text, "''"})); | table.insert (span, table.concat ({"''", text, "''"})); -- text with italic markup | ||
else | else | ||
table.insert (span, text); | table.insert (span, text); -- DEFAULT: text is not italicized | ||
end | end | ||
table.insert (span, '</span>'); -- close the span | table.insert (span, '</span>'); -- close the span | ||
Line 99: | Line 101: | ||
end | end | ||
--[[--------------------------< M A K E _ C A T E G O R Y >---------------------------------------------------- | |||
]] | |||
local function make_category (code) | |||
local cat = {}; | |||
if 0 ~= namespace then -- only categorize in article space | |||
return ''; -- return empty string for concatenation | |||
end | |||
table.insert (cat, '[[Category:Articles containing '); | |||
-- if ('en' == code) or ('eng' == code) then | |||
-- table.insert (cat, 'explicitly cited English'); | |||
-- elseif 'art' == code then | |||
-- table.insert (cat, 'constructed') | |||
-- else | |||
end | |||
--[=[-------------------------< L A N G >---------------------------------------------------------------------- | --[=[-------------------------< L A N G >---------------------------------------------------------------------- | ||
{{#invoke:lang|lang|code={{{1}}}|text={{{2}}}| | {{#invoke:lang|lang|code={{{1}}}|text={{{2}}}|rtl={{{rtl}}}|size={{{size}}}|nocat={{{nocat}}}}} | ||
]=] | ]=] | ||
Line 110: | Line 133: | ||
local out = {}; | local out = {}; | ||
local language_name = lang_name_table.lang_iana[args.code][1]; -- table entries sometimes have multiple names, always take the first one | local language_name; | ||
if lang_name_table.lang_iana[args.code] then | |||
language_name = lang_name_table.lang_iana[args.code][1]; -- table entries sometimes have multiple names, always take the first one | |||
end | |||
if not is_set (language_name) then | if not is_set (language_name) then | ||
table.insert (out, '<span style="font-size:100%" class="error">error: unknown language code: '); | |||
table.insert (out, args.code); | |||
table.insert (out, '</span>'); | |||
if 0 ~= namespace then -- only categorize in article space | |||
table.insert (out, '[[Category:Articles containing unknown language template codes|'); | |||
table.insert (out, args.code); | |||
table.insert (out, ']]'); | |||
end | |||
return table.concat (out); -- emit an error message and category | |||
end | end | ||
table.insert (out, make_text_span (args.code, args.text, args. | 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}} | ||
return table.concat (out); -- put it all together and done | return table.concat (out); -- put it all together and done | ||
end | end | ||
Line 123: | Line 158: | ||
--[=[-------------------------< L A N G _ X X >---------------------------------------------------------------- | --[=[-------------------------< L A N G _ X X >---------------------------------------------------------------- | ||
{{#invoke:lang|lang_xx|code={{{1}}}|text={{{2}}}|link={{{links|{{{link}}}}}}| | {{#invoke:lang|lang_xx|code={{{1}}}|text={{{2}}}|link={{{links|{{{link}}}}}}|rtl={{{rtl}}}|nocat={{{nocat}}}|italic={{{italic}}}|lit={{{lit}}}}} | ||
]=] | ]=] | ||
Line 137: | Line 172: | ||
local out = {}; | local out = {}; | ||
local language_name = lang_name_table.lang_iana[args.code][1]; | local language_name; | ||
if lang_name_table.lang_iana[args.code] then | |||
language_name = lang_name_table.lang_iana[args.code][1]; -- table entries sometimes have multiple names, always take the first one | |||
end | |||
if not is_set (language_name) then | if not is_set (language_name) then | ||
table.insert (out, '<span style="font-size:100%" class="error">error: unknown language code: '); | |||
table.insert (out, args.code); | |||
table.insert (out, '</span>'); | |||
if 0 ~= namespace then -- only categorize in article space | |||
table.insert (out, '[[Category:Articles containing unknown language template codes|'); | |||
table.insert (out, args.code); | |||
table.insert (out, ']]'); | |||
end | |||
return table.concat (out); -- emit an error message and category | |||
end | end | ||
Revision as of 18:04, 1 November 2017
Documentation for this module may be created at Module:Lang/doc
--[=[
This is an experiment to see what is required to consolodate all of the myriad {{lang-xx}} templates
and their subtemplates into a single module with a data table
{{lang-es}} has parameters:
{{{1}}} text - required
{{{link}}} or {{{links}}} defaults to 'yes'
{{{lit}}} literal translation
{{language with name}} has parameters:
{{{1}}} iso language code - required
{{{2}}} language name in English - superfluous?
{{{3}}} text - required
{{{4}}} or {{{lit}}} literal translation
{{{link}}} or {{{links}}} set to 'no' disables '{{{2}} language' wikilinks
{{{rtl}}} passed through to {{lang}}
{{{nocat}}} passed through to {{lang}}
{{lang}} has parameters:
{{{1}}} iso language code - required
{{{2}}} text - required
{{{rtl}}} if set to any value, set rtl="rtl" attribute and inserts ‎ after the </span> tag
{{{nocat}}} if set to any value, disables categorization
How it works now:
1. {{lang-es}} receives text as {{{1}}} to which it adds italic markup, sets |links to {{{link}}} or {{{links}}} or yes, sets |lit to {{{lit}}}, and calls {{language with name}}. {{{rtl}}} ignored for this example
2. {{language with name}} renders [[Spanish language|Spanish]] ({{{links}}} not set) or Spanish ({{{links}}} set) and calls {{lang}}
3. {{lang}} wraps the text in the <span lang="es">text</span> and adds categorization
]=]
require('Module:No globals');
local p = {};
local getArgs = require('Module:Arguments').getArgs;
local lang_name_table = require ('Module:Language/name/data');
local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization
--[[--------------------------< I S _ S E T >------------------------------------------------------------------
Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string.
This function is global because it is called from both this module and from Date validation
]]
local function is_set( var )
return not (var == nil or var == '');
end
--[=[-------------------------< M A K E _ W I K I L I N K >----------------------------------------------------
Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only
link is provided, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an
empty string.
]=]
local function make_wikilink (link, display)
if is_set (link) then
if is_set (display) then
return table.concat ({'[[', link, '|', display, ']]'});
else
return table.concat ({'[[', link, ']]'});
end
else
return '';
end
end
--[[--------------------------< M A K E _ T E X T _ S P A N >--------------------------------------------------
]]
local function make_text_span (code, text, rtl, italic, size)
local span = {};
table.insert (span, '<span lang="'); -- open <span> tag
table.insert (span, code); -- language attribute
table.insert (span, '"');
if is_set (rtl) then
table.insert (span, ' rtl="rtl"'); -- for right to left languages
end
if is_set (size) then -- {{lang}} only
table.insert (span, table.concat ({' style="font-size:', size, ';"'}))
end
table.insert (span, '>'); -- close the opening span tag
if 'yes' == italic then
table.insert (span, table.concat ({"''", text, "''"})); -- text with italic markup
else
table.insert (span, text); -- DEFAULT: text is not italicized
end
table.insert (span, '</span>'); -- close the span
if is_set (rtl) then
table.insert (span, '‎'); -- make sure the browser knows that we're at the end of the rtl
end
return table.concat (span); -- put it all together and done
end
--[[--------------------------< M A K E _ C A T E G O R Y >----------------------------------------------------
]]
local function make_category (code)
local cat = {};
if 0 ~= namespace then -- only categorize in article space
return ''; -- return empty string for concatenation
end
table.insert (cat, '[[Category:Articles containing ');
-- if ('en' == code) or ('eng' == code) then
-- table.insert (cat, 'explicitly cited English');
-- elseif 'art' == code then
-- table.insert (cat, 'constructed')
-- else
end
--[=[-------------------------< L A N G >----------------------------------------------------------------------
{{#invoke:lang|lang|code={{{1}}}|text={{{2}}}|rtl={{{rtl}}}|size={{{size}}}|nocat={{{nocat}}}}}
]=]
function p.lang (frame)
local args = getArgs(frame);
local out = {};
local language_name;
if lang_name_table.lang_iana[args.code] then
language_name = lang_name_table.lang_iana[args.code][1]; -- table entries sometimes have multiple names, always take the first one
end
if not is_set (language_name) then
table.insert (out, '<span style="font-size:100%" class="error">error: unknown language code: ');
table.insert (out, args.code);
table.insert (out, '</span>');
if 0 ~= namespace then -- only categorize in article space
table.insert (out, '[[Category:Articles containing unknown language template codes|');
table.insert (out, args.code);
table.insert (out, ']]');
end
return table.concat (out); -- emit an error message and category
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}}
return table.concat (out); -- put it all together and done
end
--[=[-------------------------< L A N G _ X X >----------------------------------------------------------------
{{#invoke:lang|lang_xx|code={{{1}}}|text={{{2}}}|link={{{links|{{{link}}}}}}|rtl={{{rtl}}}|nocat={{{nocat}}}|italic={{{italic}}}|lit={{{lit}}}}}
]=]
function p.lang_xx (frame)
local args = getArgs(frame);
if not is_set (args.italic) then
args.italic = 'yes'; -- DEFAULT for {{lang-xx}} templates is to italicize
end
args.size = nil; -- size not supported in {{lang-xx}}
local out = {};
local language_name;
if lang_name_table.lang_iana[args.code] then
language_name = lang_name_table.lang_iana[args.code][1]; -- table entries sometimes have multiple names, always take the first one
end
if not is_set (language_name) then
table.insert (out, '<span style="font-size:100%" class="error">error: unknown language code: ');
table.insert (out, args.code);
table.insert (out, '</span>');
if 0 ~= namespace then -- only categorize in article space
table.insert (out, '[[Category:Articles containing unknown language template codes|');
table.insert (out, args.code);
table.insert (out, ']]');
end
return table.concat (out); -- emit an error message and category
end
if 'no' == args.link then
table.insert (out, language_name); -- language name without wikilink
else
table.insert (out, make_wikilink (language_name .. ' language', language_name)); -- language name with wikilink
end
table.insert (out, ': '); -- separator
table.insert (out, make_text_span (args.code, args.text, args.rtl, args.italic, args.size))
if is_set (args.lit) then -- translation (not supported in {{lang}})
table.insert (out, ', <small>');
table.insert (out, make_wikilink ('Literal translation', 'lit.'));
table.insert (out, " </small>'");
table.insert (out, args.lit);
table.insert (out, "'");
end
return table.concat (out); -- put it all together and done
end
return p;