require('strict');
--
local err_msg =
local err_cat =
----------------------------< C O N F I G U R A T I O N >----------------------------------------------------
configuration setting for the various templates. keys to this table are the template names without spacing
local cfg =
--
local function error_message (template) local msg = : '); table.insert (msg, cfg[template].err_msg); table.insert (msg, ' (help)'); if 0
return table.concat (msg); end
--
local function renderer (args, formatting, extra2) local output; local index = 0; -- index into formatting local param_weight = ; -- binary parameter weights: [1] = english (8), [2] = japanese (4), [3] = romaji (2), [4] = extra (1)
for i=1, 5 do -- spin through args[1] – args[4] index = index + (args[i] and param_weight[i] or 0); -- calculate an index into formatting end
output = (0 ~= index) and string.format (formatting[index][1] and formatting[index][1], formatting[index][2][1], formatting[index][2][2], formatting[index][2][3], formatting[index][2][4]) or nil;
if extra2 then -- always just attached to the end (if there is an end) so not part of formatting output = output and (output .. ' ' .. extra2) or '<5p4n>' .. extra2; -- <5p4n> and 5p4n>: place holders for font-weight style spans; akin to stripmarkers, to be replaced end -- (nihongo and nihongo3) or removed (nihongo foot)
return output and (output .. '5p4n>') or ; -- where there is output, add secret tag closeend
----------------------------< R O M A N I Z E D _ K E R N >--------------------------------------------------
Add kerning when first or last character of romanized text contacts adjacent opening or closing paranthesis
In this example, without kerning, the romanized characters 'j' and 'V' are italicized so will contact the parentheses (jV)
local function romanized_kern (ret_string, romanized) if not romanized or (
local romanized_text = romanized:gsub ('%b<>', ):gsub ('\'\'+', ):gsub ('%[%[', ''):gsub ('%]%]', ); -- strip html tags
romanized = romanized:gsub ('([%(%)%.%%%+%-%*%?%[%^%$%]])', '%%%1'); -- escape lua pattern characters
local romanized_has_leading_paren = ret_string:match ('%(' .. romanized); -- has a value if (
local kern_lead_pattern = '^[jpy]'; -- list of characters that when italicized contact unitalicized leading parenthesis local kern_tail_pattern = '[dfijkltCEFHIJKMNPR-Z\'"%?!%]]$'; -- list of characters that when italicized contact unitalicized trailing parenthesis
local kern_right = '
(%1'; -- %1 isif romanized_has_leading_paren and romanized_text:match (kern_lead_pattern) then ret_string = ret_string:gsub ('%((' .. romanized .. ')', kern_right); -- replace plain '(' with kerned '(';
return ret_string; -- doneend
--
local function common (frame, template) local lang_module = require ('Module:Lang' .. (frame:getTitle:match ('/sandbox') or )); -- if this module is the sandbox, use Module:lang/sandbox; Module:Lang else
local args = require ('Module:Arguments').getArgs (frame); local english, native, romanized, extra, extra2 = args[1], args[2], args[3], args.extra or args[4], args.extra2 or args[5]; -- meaningful names args[4] = extra or args[4]; -- ensure that extra is 'positional' for use by renderer
local lead = 'yes'
if not (native or romanized) then -- not present, return an error message return error_message (template); end if native then native = lead and lang_module._lang_xx_inherit or lang_module._lang ; -- add ja script with/without language prefix end if romanized then romanized = (lead and english and (cfg[template].system_link .. ': ') or ) .. lang_module._transl or nil; end
local formatting =
local ret_string = renderer (args, formatting, extra2) ret_string = romanized_kern (ret_string, romanized); -- kern romanized text when appropriate ret_string = ret_string:gsub ('<5p4n>', '
'):gsub ('5p4n>', ''); -- replace 'secret' tags with proper tagsreturn ret_string; -- because gsub returns the number of replacements made as second return valueend
--
local function common_romanized_native_translated (frame, template) local lang_module = require ('Module:Lang' .. (frame:getTitle:match ('/sandbox') or )); -- if this module is the sandbox, use Module:lang/sandbox; Module:Lang else local args = require ('Module:Arguments').getArgs (frame); local english, native, romanized, extra, extra2 = args[1], args[2], args[3], args.extra or args[4], args.extra2 or args[5]; -- meaningful names args[4] = extra or args[4]; -- ensure that extra is 'positional' for use by renderer
if not (native or romanized) then -- not present, return an error message return error_message (template); end native = native and lang_module._lang or nil; romanized = romanized and lang_module._transl or nil; local formatting =
local ret_string = renderer (args, formatting, extra2) ret_string = ret_string:gsub ('<5p4n>', '
'):gsub ('5p4n>', ''); -- replace 'secret' tags with proper tags return ret_string; -- because gsub returns the number of replacements made as second return valueend--
local function common_native_romanized_translated (frame, template) local lang_module = require ('Module:Lang' .. (frame:getTitle:match ('/sandbox') or )); -- if this module is the sandbox, use Module:lang/sandbox; Module:Lang else local args = require ('Module:Arguments').getArgs (frame); local english, native, romanized, extra, extra2 = args[1], args[2], args[3], args.extra or args[4], args.extra2 or args[5]; -- meaningful names args[4] = extra or args[4]; -- ensure that extra is 'positional' for use by renderer
if not (native or romanized) then -- not present, return an error message return error_message (template); end native = native and lang_module._lang or nil; romanized = romanized and lang_module._transl or nil; local formatting =
local ret_string = renderer (args, formatting, extra2) ret_string = romanized_kern (ret_string, romanized); -- kern romanized text when appropriate ret_string = ret_string:gsub ('<5p4n>', '
'):gsub ('5p4n>', ''); -- replace 'secret' tags with proper tags return ret_string; -- because gsub returns the number of replacements made as second return valueend--
local function common_foot (frame, template) local lang_module = require ('Module:Lang' .. (frame:getTitle:match ('/sandbox') or )); -- if this module is the sandbox, use Module:lang/sandbox; Module:Lang else local args = require ('Module:Arguments').getArgs (frame); local english, native, romanized, extra, extra2 = args[1], args[2], args[3], args.extra or args[4], args.extra2 or args[5]; -- meaningful names args[4] = extra or args[4]; -- ensure that extra is 'positional' for use by renderer local post = args[6] or args.post; local group = args.group; local ref_name = args.ref_name local lead = 'yes'
if not (native or romanized) then -- not present, return an error message return error_message (template); end if native then native = lead and lang_module._lang_xx_inherit or lang_module._lang ; -- add ja script with/without language prefix end if romanized then romanized = (lead and (cfg[template].system_link .. ': ') or ) .. lang_module._transl or nil; end local formatting =
if english and post then -- rewrite english to include |post= english = english .. post; -- if english has a value append post else just post elseif post then english = post; -- english not set, use post elseif not english then -- neither are set english = ; -- make english an empty string for concatenation end
if native or romanized or extra or extra2 then -- no ref tag when none of these are set (it would be empty) local content = renderer (args, formatting, extra2); content = content:gsub ('<5p4n>', ):gsub ('5p4n>$', , 1); -- strip secret <5p4n> and 5p4n> tags added by renderer; spans not used by this template
if english:match ('\'\'+$') then -- if
return english .. frame:extensionTag ; -- english with attached reference tag else return english; -- nothing to be inside ref tag so just return english endend
--[=[-------------------------< N I H O N G O >----------------------------------------------------------------
Implement {{nihongo}} using Module:Lang for language and transliteration markup
{{Nihongo|<English>|<japanese>|<romaji>|<extra>|<extra2>|lead=yes}}
<English>, <japanese>, and <romaji> are positional parameters
<English>: rendered as presented; purports to be English translation of <kanji/kana>
<japanese>: Japanese language text using Japanese script; TODO: require?
<romaji>: Hepburn romanization (transliteration); TODO: in Module:Lang/data change tooltip text to 'Hepburn romanization'?
<extra> and <extra2> are positional or named: |extra= and |extra2=; mixing can be problematic
<extra> is rendered as presented preceeded with <comma><space>
<extra2> is rendered as presented preceeded with <space>
|lead=: takes one value 'yes'; renders language name same as {{lang-ja}} but also adds [[Hepburn romanization|Hepburn]]:
]=]
local function nihongo (frame) return common (frame, 'nihongo')end
--[=[-------------------------< N I H O N G O 3 >-------------------------------------------------------------- Implement {{nihongo3}} using Module:Lang for language and transliteration markup Similar to {{nihongo}} but changes rendered order and does not support |lead= {{Nihongo3|<English>|<japanese>|<romaji>|<extra>|<extra2>}} <English>, <japanese>, and <romaji> are positional parameters <English>: rendered as presented; purports to be English translation of <kanji/kana> <japanese>: Japanese language text using Japanese script; TODO: require? <romaji>: Hepburn romanization (transliteration); TODO: in Module:Lang/data change tooltip text to 'Hepburn romanization'? <extra> and <extra2> are positional or named: |extra= and |extra2=; mixing can be problematic <extra> is rendered as presented preceeded with <comma><space> <extra2> is rendered as presented preceeded with <space> ]=]
local function nihongo3 (frame) return common_romanized_native_translated (frame, 'nihongo3')end
--[=[-------------------------< N I H O N G O _ K R T >-------------------------------------------------------- Implement {{nihongo krt}} using Module:Lang for language and transliteration markup Similar to {{nihongo}} but changes rendered order and does not support |lead= {{Nihongo krt|<English>|<japanese>|<romaji>|<extra>|<extra2>}} <English>, <japanese>, and <romaji> are positional parameters <English>: rendered as presented; purports to be English translation of <kanji/kana> <japanese>: Japanese language text using Japanese script; TODO: require? <romaji>: Hepburn romanization (transliteration); TODO: in Module:Lang/data change tooltip text to 'Hepburn romanization'? <extra> and <extra2> are positional or named: |extra= and |extra2=; mixing can be problematic <extra> is rendered as presented preceeded with <comma><space> <extra2> is rendered as presented preceeded with <space> ]=]
local function nihongo_krt (frame) return common_native_romanized_translated (frame, 'nihongo krt')end
--[=[-------------------------< N I H O N G O _ F O O T >------------------------------------------------------
Implement {{nihongo_foot}} using Module:Lang for language and transliteration markup
{{Nihongo foot|<English>|<japanese>|<romaji>|<extra>|<extra2>|<post>|lead=yes|group}}
<English>, <japanese>, and <romaji> are positional parameters
<English>: rendered as presented; purports to be English translation of <kanji/kana>
<japanese>: Japanese language text using Japanese script; TODO: require?
<romaji>: Hepburn romanization (transliteration); TODO: in Module:Lang/data change tooltip text to 'Hepburn romanization'?
<extra> and <extra2> are positional or named: |extra= and |extra2=; mixing can be problematic
<extra> is rendered as presented preceeded with <comma><space>
<extra2> is rendered as presented preceeded with <space>
<post> is positional or named: |post= is a postscript character preceding the <ref>..</ref> tag (after <English>)
|lead=: takes one value 'yes'; renders language name same as {{lang-ja}} but also adds [[Hepburn romanization|Hepburn]]: