imported>AT
无编辑摘要
imported>Ericliu1912
依據編輯請求更新頁面 自Module:Lang/sandbox合并優枰版本90980088
 
(未显示4个用户的7个中间版本)
第1行: 第1行:
--[=[
--[=[


Lua support for the {{lang}}, {{langx}}, {{lang-??}}, and {{transliteration}} templates and replacement of various supporting templates.  
Lua support for the {{lang}}, {{langx}}, {{lang-??}}, and {{transliteration}} templates and replacement of various supporting templates.
 
-- 中文維基百科:加入了error_msgs,用於將所有報錯情形修改爲試圖顯示正常內容並附加預設不可見的錯誤報告。


]=]
]=]
第11行: 第13行:
local yesno = require ('Module:Yesno');
local yesno = require ('Module:Yesno');


local lang_data = mw.loadData ('Module:Lang/data' .. (mw.getCurrentFrame():getTitle():match ('/sandbox') or '')); -- language name override and transliteration tool-tip tables
local sandbox = (mw.getCurrentFrame():getTitle():match ('/sandbox') or ''); -- when called from a sandbox template or module load sandbox data and sandbox configuration
 
local lang_data =  mw.loadData ('Module:Lang/data' .. sandbox); -- language name override and transliteration tool-tip tables
local lang_name_table = lang_data.lang_name_table; -- language codes, names, regions, scripts, suppressed scripts
local lang_name_table = lang_data.lang_name_table; -- language codes, names, regions, scripts, suppressed scripts
local lang_table = lang_data.lang_name_table.lang;
local lang_table = lang_data.lang_name_table.lang;
第23行: 第27行:
local synonym_table = mw.loadData ('Module:Lang/ISO 639 synonyms'); -- ISO 639-2/639-2T code translation to 639-1 code
local synonym_table = mw.loadData ('Module:Lang/ISO 639 synonyms'); -- ISO 639-2/639-2T code translation to 639-1 code


local cfg = mw.loadData ('Module:Lang/configuration'); -- for internationalization
local cfg = mw.loadData ('Module:Lang/configuration' .. sandbox); -- for internationalization


local is_latn_data = mw.loadData ('Module:Lang/data/is latn data');
local is_latn_data = mw.loadData ('Module:Lang/data/is latn data');
第38行: 第42行:
local maint_cats = {}; -- maintenance categories go here
local maint_cats = {}; -- maintenance categories go here
local maint_msgs = {}; -- and their messages go here
local maint_msgs = {}; -- and their messages go here
local error_msgs = {}




第45行: 第51行:


local function make_error_span (template, msg)
local function make_error_span (template, msg)
return table.concat ({'<span style="color:#d33">', cfg.misc_text_t.error, ':', template, msg, '</span>'})
return table.concat ({'<span class="error" style="font-size: 1em;">', cfg.misc_text_t.error, ':', template, msg, '</span>'})
end
 
local function make_lang_error_span (msg)
return table.concat ({'<span class="lang-comment lang-comment-error" style="font-style: normal; display: none; margin-left: 0.3em; color: #33aa33;">', msg, '</span>'})
end
end


第81行: 第91行:
category = cfg.make_error_msg_t.lang_err_cat;
category = cfg.make_error_msg_t.lang_err_cat;
end
end
 
local category_link = ((0 == namespace or 10 == namespace) and not args_t.nocat) and substitute ('[[Category:$1]]', {category}) or '';
local category_link = ((0 == namespace or 10 == namespace) and not args_t.nocat) and substitute ('[[Category:$1]]', {category}) or '';
return substitute ('[$1] <span style="color:#d33">$2:{{$3}}:$4([[:Category:$5|$6]])</span>$7',
 
text = text or cfg.make_error_msg_t.undefined
if text == '' then
text = cfg.make_error_msg_t.empty
end
 
-- &#123;&#123;$3&#125;&#125; = {{$3}}
-- 防止特定情況下作爲模板展開
table.insert(error_msgs, substitute ('-{[$1]}-<span class="error" style="font-size: 1em; margin-left: 0.3em;">$2:&#123;&#123;$3&#125;&#125;:$4([[:Category:$5|$6]])</span>$7',
{
{
text or cfg.make_error_msg_t.undefined,
text,
cfg.misc_text_t.error,
cfg.misc_text_t.error,
template,
template,
第93行: 第111行:
category_link
category_link
})
})
)
return error_msgs[#error_msgs]
end
end
 


--[[--------------------------< P A R A M E T E R _ V A L I D A T E >------------------------------------------
--[[--------------------------< P A R A M E T E R _ V A L I D A T E >------------------------------------------
第102行: 第122行:
local function parameter_validate (args_t, template)
local function parameter_validate (args_t, template)
local err_msg = cfg.parameter_validate_t.invalid_param;
local err_msg = cfg.parameter_validate_t.invalid_param;
local ret = {}


if cfg.templates_t.lang == template then -- for {{lang}}
if cfg.templates_t.lang == template then -- for {{lang}}
第107行: 第129行:
if not cfg.known_params_t.params_lang_t[param] and -- unique {{lang}} parameters
if not cfg.known_params_t.params_lang_t[param] and -- unique {{lang}} parameters
not cfg.known_params_t.common_params_all_t[param] then -- common to all
not cfg.known_params_t.common_params_all_t[param] then -- common to all
return substitute (err_msg, {param}); -- <param> not found so abandon
table.insert(ret, substitute (err_msg, {param}))
end
end
end
end
第115行: 第137行:
not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}}
not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}}
not cfg.known_params_t.common_params_all_t[param] then -- common to all
not cfg.known_params_t.common_params_all_t[param] then -- common to all
return substitute (err_msg, {param}); -- <param> not found so abandon
table.insert(ret, substitute (err_msg, {param}))
end
end
end
end
第123行: 第145行:
not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}}
not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}}
not cfg.known_params_t.common_params_all_t[param] then -- common to all
not cfg.known_params_t.common_params_all_t[param] then -- common to all
return substitute (err_msg, {param}); -- <param> not found so abandon
table.insert(ret, substitute (err_msg, {param}))
end
end
end
end
end
end
 
if ret[1] then
return table.concat(ret, '、')
end
end
end


第146行: 第172行:
This function attempts to invert the italic markup a args.text by adding/removing leading/trailing italic markup
This function attempts to invert the italic markup a args.text by adding/removing leading/trailing italic markup
in args.text.  Like |italic=unset, |italic=invert disables automatic italic markup.  Individual leading/trailing
in args.text.  Like |italic=unset, |italic=invert disables automatic italic markup.  Individual leading/trailing
apostrophes are converted to their html numeric entity equivalent so that the new italic markup doesn't become
apostrophes are converted to their HTML numeric entity equivalent so that the new italic markup doesn't become
bold markup inadvertently.
bold markup inadvertently.


第171行: 第197行:
seg[3] = source:match ('.+(%f[\']\'\'+)$') or ''; -- get trailing markup, if any; ignore single quote
seg[3] = source:match ('.+(%f[\']\'\'+)$') or ''; -- get trailing markup, if any; ignore single quote


if '' ~= seg[1] and '' ~= seg[3] then -- extract the 'text'  
if '' ~= seg[1] and '' ~= seg[3] then -- extract the 'text'
seg[2] = source:match ('^\'\'+%f[^\'](.+)%f[\']\'\'+$') -- from between leading and trailing markup
seg[2] = source:match ('^\'\'+%f[^\'](.+)%f[\']\'\'+$') -- from between leading and trailing markup
elseif '' ~= seg[1] then
elseif '' ~= seg[1] then
第192行: 第218行:
Validates |italic= or |italics= assigned values.
Validates |italic= or |italics= assigned values.


When |italic= is set and has an acceptible assigned value, return the matching css font-style property value or,
When |italic= is set and has an acceptable assigned value, return the matching CSS font-style property value or,
for the special case 'default', return nil.
for the special case 'default', return nil.


When |italic= is not set, or has an unacceptible assigned value, return nil and a nil error message.
When |italic= is not set, or has an unacceptable assigned value, return nil and a nil error message.


When both |italic= and |italics= are set, returns nil and a 'conflicting' error message.
When both |italic= and |italics= are set, returns nil and a 'conflicting' error message.
第216行: 第242行:
local function validate_italic (args)
local function validate_italic (args)
local properties = {[cfg.keywords_t.affirmative] = 'italic', [cfg.keywords_t.negative] = 'normal', [cfg.keywords_t.unset] = 'inherit', [cfg.keywords_t.invert] = 'invert', [cfg.keywords_t.default] = nil};
local properties = {[cfg.keywords_t.affirmative] = 'italic', [cfg.keywords_t.negative] = 'normal', [cfg.keywords_t.unset] = 'inherit', [cfg.keywords_t.invert] = 'invert', [cfg.keywords_t.default] = nil};
 
local count = 0
local count = 0
for _, arg in pairs {'italic', 'italics', 'i'} do
for _, arg in pairs {'italic', 'italics', 'i'} do
第224行: 第250行:
end
end


if count > 1 then -- return nil and an error message if more than one is set
return properties[args.italic or args.italics or args.i], count > 1 and cfg.validate_italic_t.multi_italic or nil
return nil, cfg.validate_italic_t.multi_italic;
end
return properties[args.italic or args.italics or args.i], nil; -- return an appropriate value and a nil error message
end
end


第234行: 第256行:
--[=[--------------------------< V A L I D A T E _ C A T _ A R G S >----------------------------------------------------------
--[=[--------------------------< V A L I D A T E _ C A T _ A R G S >----------------------------------------------------------


Default behavior of the {{lang}} and {{lang-??}} templates is to add categorization when the templates are used in mainspace.
Default behavior of the {{lang}} and {{lang-??}} templates is to add categorization when the templates are used in main space.
This default functionality may be suppressed by setting |nocat=yes or |cat=no.  This function selects one of these two parameters
This default functionality may be suppressed by setting |nocat=yes or |cat=no.  This function selects one of these two parameters
to control categorization.
to control categorization.
第255行: 第277行:
return;
return;
end
end
 
if false == yesno (args.cat) or true == yesno (args.nocat) then
if false == yesno (args.cat) or true == yesno (args.nocat) then
args.nocat = true; -- set to true when args.nocat is affirmative; nil else (as if the parameter were not set in the template)
args.nocat = true; -- set to true when args.nocat is affirmative; nil else (as if the parameter were not set in the template)
第285行: 第307行:
--[[--------------------------< F O R M A T _ I E T F _ T A G >------------------------------------------------
--[[--------------------------< F O R M A T _ I E T F _ T A G >------------------------------------------------


Prettify ietf tags to use recommended subtag formats:
Prettify IETF tags to use recommended subtag formats:
code: lower case
code: lower case
script: sentence case
script: sentence case
第291行: 第313行:
variant: lower case
variant: lower case
private: lower case prefixed with -x-
private: lower case prefixed with -x-
 
]]
]]


第300行: 第322行:
return table.concat ({code:lower(), 'x', private:lower()}, '-'); -- if private, all other tags ignored
return table.concat ({code:lower(), 'x', private:lower()}, '-'); -- if private, all other tags ignored
end
end
 
table.insert (out, code:lower());
table.insert (out, code:lower());
if is_set (script) then
if is_set (script) then
第310行: 第332行:
table.insert (out, region:upper());
table.insert (out, region:upper());
end
end
 
if is_set (variant) then
if is_set (variant) then
table.insert (out, variant:lower());
table.insert (out, variant:lower());
end
end
 
return table.concat (out, '-');
return table.concat (out, '-');
end
end
第333行: 第355行:
lang-region lang-region-variant
lang-region lang-region-variant
lang-script-region lang-script-region-variant
lang-script-region lang-script-region-variant
lang-x-private
lang-x-private
 
each of lang, script, region, variant, and private, when used, must be valid.
each of lang, script, region, variant, and private, when used, must be valid.


第348行: 第370行:


See http://www.rfc-editor.org/rfc/bcp/bcp47.txt section 2.1.
See http://www.rfc-editor.org/rfc/bcp/bcp47.txt section 2.1.
 
]]
]]


local function get_ietf_parts (source, args_script, args_region, args_variant)
local function get_ietf_parts (source, args_script, args_region, args_variant)
local code, script, region, variant, private; -- ietf tag parts
local code, script, region, variant, private; -- IETF tag parts


if not is_set (source) then
if not is_set (source) then
第358行: 第380行:
end
end


local pattern = { -- table of tables holding acceptibe ietf tag patterns and short names of the ietf part captured by the pattern
local override = { -- 簡寫轉換爲正確的語言標籤
['pinyin'] = 'zh-Latn-pinyin', -- 漢語拼音
['zhuyin'] = 'zh-Bopo', -- 注音符號
}
 
source = override[source] or source
 
local pattern = { -- table of tables holding acceptable IETF tag patterns and short names of the IETF part captured by the pattern
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 1 -  ll-Ssss-RR-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 1 -  ll-Ssss-RR-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 2 -  ll-Ssss-DDD-variant (where region is 3 digits; variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 2 -  ll-Ssss-DDD-variant (where region is 3 digits; variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 3 -  ll-Ssss-RR-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 3 -  ll-Ssss-RR-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 4 -  ll-Ssss-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 4 -  ll-Ssss-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters)
 
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d%d)$', 's', 'v'}, -- 5 -  ll-Ssss-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d%d)$', 's', 'v'}, -- 5 -  ll-Ssss-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'v'}, -- 6 -  ll-Ssss-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'v'}, -- 6 -  ll-Ssss-variant (where variant is 5-8 alnum characters)
 
{'^(%a%a%a?)%-(%a%a)%-(%d%d%d%d)$', 'r', 'v'}, -- 7 -  ll-RR-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%a%a)%-(%d%d%d%d)$', 'r', 'v'}, -- 7 -  ll-RR-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%d%d%d)%-(%d%d%d%d)$', 'r', 'v'}, -- 8 -  ll-DDD-variant (where region is 3 digits; variant is 4 digits)
{'^(%a%a%a?)%-(%d%d%d)%-(%d%d%d%d)$', 'r', 'v'}, -- 8 -  ll-DDD-variant (where region is 3 digits; variant is 4 digits)
{'^(%a%a%a?)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 9 -  ll-RR-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 9 -  ll-RR-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 10 - ll-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 10 - ll-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters)
 
{'^(%a%a%a?)%-(%d%d%d%d)$', 'v'}, -- 11 - ll-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%d%d%d%d)$', 'v'}, -- 11 - ll-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%w%w%w%w%w%w?%w?%w?)$', 'v'}, -- 12 - ll-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%w%w%w%w%w%w?%w?%w?)$', 'v'}, -- 12 - ll-variant (where variant is 5-8 alnum characters)
 
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)$', 's', 'r'}, -- 13 - ll-Ssss-RR
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)$', 's', 'r'}, -- 13 - ll-Ssss-RR
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)$', 's', 'r'}, -- 14 - ll-Ssss-DDD (region is 3 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)$', 's', 'r'}, -- 14 - ll-Ssss-DDD (region is 3 digits)
 
{'^(%a%a%a?)%-(%a%a%a%a)$', 's'}, -- 15 - ll-Ssss
{'^(%a%a%a?)%-(%a%a%a%a)$', 's'}, -- 15 - ll-Ssss
 
{'^(%a%a%a?)%-(%a%a)$', 'r'}, -- 16 - ll-RR
{'^(%a%a%a?)%-(%a%a)$', 'r'}, -- 16 - ll-RR
{'^(%a%a%a?)%-(%d%d%d)$', 'r'}, -- 17 - ll-DDD (region is 3 digits)
{'^(%a%a%a?)%-(%d%d%d)$', 'r'}, -- 17 - ll-DDD (region is 3 digits)
 
{'^(%a%a%a?)$'}, -- 18 - ll
{'^(%a%a%a?)$'}, -- 18 - ll
 
{'^(%a%a%a?)%-x%-(%w%w?%w?%w?%w?%w?%w?%w?)$', 'p'}, -- 19 - ll-x-pppppppp (private is 1-8 alnum characters)
{'^(%a%a%a?)%-x%-(%w%w?%w?%w?%w?%w?%w?%w?)$', 'p'}, -- 19 - ll-x-pppppppp (private is 1-8 alnum characters)
}
}


local t = {}; -- table of captures; serves as a translator between captured ietf tag parts and named variables
local t = {}; -- table of captures; serves as a translator between captured IETF tag parts and named variables


for i, v in ipairs (pattern) do -- spin through the pattern table looking for a match
for i, v in ipairs (pattern) do -- spin through the pattern table looking for a match
local c1, c2, c3, c4; -- captures in the 'pattern' from the pattern table go here
local c1, c2, c3, c4; -- captures in the 'pattern' from the pattern table go here
 
c1, c2, c3, c4 = source:match (pattern[i][1]); -- one or more captures set if source matches pattern[i])
c1, c2, c3, c4 = source:match (pattern[i][1]); -- one or more captures set if source matches pattern[i])
if c1 then -- c1 always set on match
if c1 then -- c1 always set on match
第402行: 第432行:
};
};
script = t.s or ''; -- translate table contents to named variables;
script = t.s or ''; -- translate table contents to named variables;
region = t.r or ''; -- absent table entries are nil so set named ietf parts to empty string for concatenation
region = t.r or ''; -- absent table entries are nil so set named IETF parts to empty string for concatenation
variant= t.v or '';
variant= t.v or '';
private = t.p or '';
private = t.p or '';
第414行: 第444行:


code = code:lower(); -- ensure that we use and return lower case version of this
code = code:lower(); -- ensure that we use and return lower case version of this
 
if not (override_table[code] or lang_table[code] or synonym_table[code] or lang_dep_table[code]) then
if not (override_table[code] or lang_table[code] or synonym_table[code] or lang_dep_table[code]) then
return nil, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_code, {code}); -- invalid language code, don't know about the others (don't care?)
return nil, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_code, {code}); -- invalid language code, don't know about the others (don't care?)
end
end


第431行: 第461行:
else
else
script = args_script or ''; -- use args.script if provided
script = args_script or ''; -- use args.script if provided
end  
end


if is_set (script) then
if is_set (script) then
script = script:lower(); -- ensure that we use and return lower case version of this
script = script:lower(); -- ensure that we use and return lower case version of this
if not script_table[script] then
if not script_table[script] then
return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_scr_code, {script, code}); -- language code ok, invalid script, don't know about the others (don't care?)
return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_scr_code, {script, code}); -- language code OK, invalid script, don't know about the others (don't care?)
end
end
end
end
if suppressed_table[script] then -- ensure that code-script does not use a suppressed script
if suppressed_table[script] then -- ensure that code-script does not use a suppressed script
if in_array (code, suppressed_table[script]) then
if in_array (code, suppressed_table[script]) then
return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.script_code, {script, code}); -- language code ok, script is suppressed for this code
return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.script_code, {script, code}); -- language code OK, script is suppressed for this code
end
end
end
end
第451行: 第481行:
else
else
region = args_region or ''; -- use args.region if provided
region = args_region or ''; -- use args.region if provided
end  
end


if is_set (region) then
if is_set (region) then
第459行: 第489行:
end
end
end
end
 
if is_set (variant) then
if is_set (variant) then
if is_set (args_variant) then
if is_set (args_variant) then
第466行: 第496行:
else
else
variant = args_variant or ''; -- use args.variant if provided
variant = args_variant or ''; -- use args.variant if provided
end  
end


if is_set (variant) then
if is_set (variant) then
第479行: 第509行:
elseif is_set (region) then -- if region set, there are some prefixes that require lang code and region (en-CA-newfound)
elseif is_set (region) then -- if region set, there are some prefixes that require lang code and region (en-CA-newfound)
if not in_array (code, variant_table[variant]['prefixes']) then -- first see if lang code is all that's required (en-oxendict though en-GB-oxendict is preferred)
if not in_array (code, variant_table[variant]['prefixes']) then -- first see if lang code is all that's required (en-oxendict though en-GB-oxendict is preferred)
if not in_array (table.concat ({code, '-', region}), variant_table[variant]['prefixes']) then -- now try for lang code and region (en-CA-newfound)
if not in_array (table.concat ({code, '-', region}), variant_table[variant]['prefixes']) then -- now try for lang code and region (en-CA-newfound)
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code_reg, {variant, code, region});
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code_reg, {variant, code, region});
end
end
第492行: 第522行:
if is_set (private) then
if is_set (private) then
private = private:lower(); -- ensure that we use and return lower case version of this
private = private:lower(); -- ensure that we use and return lower case version of this
if not override_table[table.concat ({code, '-x-', private})] then -- make sure private tag is valid; note that index  
if not override_table[table.concat ({code, '-x-', private})] then -- make sure private tag is valid; note that index
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_pri, {private});
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_pri, {private});
end
end
第537行: 第567行:


if text:find ('\n+') then -- look for any number of \n characters in text
if text:find ('\n+') then -- look for any number of \n characters in text
text = text:gsub ('([^\n])\n([^\n])', '%1 %2'); -- replace single newline characters with a space character which mimics mediawiki
text = text:gsub ('([^\n])\n([^\n])', '%1 %2'); -- replace single newline characters with a space character which mimics MediaWiki


if 'italic' == style then
if 'italic' == style then
text = text:gsub('[^\n]+', '<p><i>%1</i></p>'); -- insert p and italic markup tags at each impled p (two or more consecutive '\n\n' sequences)
text = text:gsub('[^\n]+', '<p><i>%1</i></p>'); -- insert p and italic markup tags at each implied p (two or more consecutive '\n\n' sequences)
else
else
text = text:gsub ('[^\n]+', '<p>%1</p>'); -- insert p markup at each impled p
text = text:gsub ('[^\n]+', '<p>%1</p>'); -- insert p markup at each implied p
text = text:gsub ('\n', ''); -- strip newline characters
text = text:gsub ('\n', ''); -- strip newline characters
end
end
第555行: 第585行:
Makes a <span title="<title text>"><content_text></span> or <div title="<title text>"><content_text></div> where
Makes a <span title="<title text>"><content_text></span> or <div title="<title text>"><content_text></div> where
<title text> is in the tool-tip in the wiki's local language and <content_text> is non-local-language text in
<title text> is in the tool-tip in the wiki's local language and <content_text> is non-local-language text in
html markup.  This because the lang= attibute applies to the content of its enclosing tag.
HTML markup.  This because the lang= attribute applies to the content of its enclosing tag.


<tag> holds a string 'div' or 'span' used to choose the correct wrapping tag.
<tag> holds a string 'div' or 'span' used to choose the correct wrapping tag.
第563行: 第593行:
local function title_wrapper_make (title_text, content_text, tag)
local function title_wrapper_make (title_text, content_text, tag)
local wrapper_t = {};
local wrapper_t = {};
 
table.insert (wrapper_t, table.concat ({'<', tag})); -- open opening wrapper tag
table.insert (wrapper_t, table.concat ({'<', tag})); -- open opening wrapper tag
table.insert (wrapper_t, ' title=\"'); -- begin title attribute
table.insert (wrapper_t, ' title=\"'); -- begin title attribute
第577行: 第607行:
--[[--------------------------< M A K E _ T E X T _ H T M L >--------------------------------------------------
--[[--------------------------< M A K E _ T E X T _ H T M L >--------------------------------------------------


Add the html markup to text according to the type of content that it is: <span> or <i> tags for inline content or
Add the HTML markup to text according to the type of content that it is: <span> or <i> tags for inline content or
<div> tags for block content
<div> tags for block content


第600行: 第630行:
end
end


if 'span' == tag then -- default html tag for inline content
if 'span' == tag then -- default HTML tag for inline content
if 'italic' == style then -- but if italic
if 'italic' == style then -- but if italic
tag = 'i'; -- change to <i> tags
tag = 'i'; -- change to <i> tags
第608行: 第638行:
end
end


table.insert (html_t, table.concat ({'<', tag})); -- open the <i>, <span>, or <div> html tag
table.insert (html_t, 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_t, table.concat ({' lang="', code, '\"'})); -- add language attribute
table.insert (html_t, table.concat ({' lang="', code, '\"'})); -- add language attribute


第632行: 第662行:
end
end


table.insert (html_t, table.concat ({style_added, '>'})); -- close the opening html tag
table.insert (html_t, table.concat ({style_added, '>'})); -- close the opening HTML tag
table.insert (html_t, text); -- insert the text
table.insert (html_t, text); -- insert the text


table.insert (html_t, table.concat ({'</', tag, '>'})); -- close the 'text' <i>, <span>, or <div> html tag
table.insert (html_t, table.concat ({'</', tag, '>'})); -- close the 'text' <i>, <span>, or <div> HTML tag


if is_set (language) then -- create a <title_text> string for the title= attribute in a wrapper span or div
if is_set (language) then -- create a <title_text> string for the title= attribute in a wrapper span or div
第650行: 第680行:
else
else
return table.concat (html_t);
return table.concat (html_t);
end
end
-- 中文版添加,实现#ifexist
local function page_exists (title)
local noError, titleObject = pcall (mw.title.new, title)
if not noError then
return false
else
if titleObject then
return titleObject.exists
else
return false
end
end
end
end
end
第661行: 第705行:
For English:
For English:
[[Category:Articles containing explicitly cited English-language text]]
[[Category:Articles containing explicitly cited English-language text]]
 
For ISO 639-2 collective languages (and for 639-1 bh):
For ISO 639-2 collective languages (and for 639-1 bh):
[[Category:Articles with text in <language> languages]]
[[Category:Articles with text in <language> languages]]
第667行: 第711行:
注意:此处有修改
注意:此处有修改


对于中文,则返回以下分类:
对于中文(zh、zh-*):
[[Category:含有明确引用中文的条目]]


对于非中文内容:
如果[[Module:Lang/data]]没有额外定义变体名称(即取得的语言名称是「中文」),则返回以下分类:
[[Category:含有明确引用中文的条目]]


如果是常用语言,则直接返回以下分类:
反之,则返回以下分类:
[[Category:含有<语言>的条目]](此处的<语言>为本模块内建)
[[Category:含有<变体>的条目]]


如果是非常用语言:
对于非中文内容:


如果存在对应语言的分类,则返回以下分类:
如果存在对应语言的分类,则返回以下分类:
[[Category:含有<语言>的条目]](此处的<语言>需读取数据库资料)
[[Category:含有<语言>的条目]]


反之,则返回以下分类:
反之,则返回以下分类:
[[Category:含有非中文内容的条目]]
[[Category:含有非中文内容的条目]]


]=]
]=]
-- 中文版添加,实现#ifexist
local function page_exists (title)
    local noError, titleObject = pcall (mw.title.new, title)
    if not noError then
        return false
    else
        if titleObject then
            return titleObject.exists
        else
            return false
        end
    end
end


local function make_category (code, language_name, nocat, name_get)
local function make_category (code, language_name, nocat, name_get)
第703行: 第733行:
return ''; -- return empty string for concatenation
return ''; -- return empty string for concatenation
end
end
    -- 中文版无
 
-- if mw.ustring.find (language_name, '语系', 1, true) then
-- 中文版无
-- return substitute ('[[$1 $2]]', {cfg.make_category_t.collective_cat, language_name});
-- if mw.ustring.find (language_name, '语系', 1, true) then
-- end
-- return substitute ('[[$1 $2]]', {cfg.make_category_t.collective_cat, language_name});
-- end
if this_wiki_lang_tag == code then
 
if this_wiki_lang_tag == code and language_name == '中文' then -- 名稱必須是「中文」
return substitute ('[[$1$2$3$4]]', { -- unique category name for the local language
return substitute ('[[$1$2$3$4]]', { -- unique category name for the local language
cfg.make_category_t.cat_prefix,
cfg.make_category_t.cat_prefix,
第715行: 第746行:
cfg.make_category_t.cat_postfix,
cfg.make_category_t.cat_postfix,
});
});
    elseif (page_exists (substitute ('$1$2$3', {
elseif (page_exists (substitute ('$1$2$3', {
        cfg.make_category_t.cat_prefix,
cfg.make_category_t.cat_prefix,
        language_name,
language_name,
        cfg.make_category_t.cat_postfix,
cfg.make_category_t.cat_postfix,
    })) ) then
}))) then
        return substitute ('[[$1$2$3]]', { -- category for individual languages
return substitute ('[[$1$2$3]]', { -- category for individual languages
cfg.make_category_t.cat_prefix,
cfg.make_category_t.cat_prefix,
language_name,
language_name,
cfg.make_category_t.cat_postfix,
cfg.make_category_t.cat_postfix,
});
});
    else
else
return substitute ('[[$1$2$3]]', { -- 非中文内容
return substitute ('[[$1$2$3]]', { -- 非中文内容
cfg.make_category_t.cat_prefix,
cfg.make_category_t.cat_prefix,
cfg.make_category_t.cat_nonezh,
cfg.make_category_t.cat_nonezh,
第757行: 第788行:
local title_t = lang_data.translit_title_table; -- table of transliteration standards and the language codes and scripts that apply to those standards
local title_t = lang_data.translit_title_table; -- table of transliteration standards and the language codes and scripts that apply to those standards
local title_text = ''; -- tool tip text for title= attribute
local title_text = ''; -- tool tip text for title= attribute
 
std = std and std:lower(); -- lower case for table indexing
std = std and std:lower(); -- lower case for table indexing
 
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
title_text = language_name; -- write a generic tool tip
title_text = language_name; -- write a generic tool tip
        -- 中文版不需要
title_text = substitute ('$1$2', {title_text, cfg.lang_xx_t.romanization}); -- 中文版添加
-- if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name)
-- 中文版不需要
-- title_text = substitute ('$1-$2', {title_text, cfg.misc_text_t.language}); -- skip this text (individual and macro languages only)
-- if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name)
-- end
-- title_text = substitute ('$1-$2', {title_text, cfg.misc_text_t.language}); -- skip this text (individual and macro languages only)
-- title_text = substitute ('$1 $2', {title_text, mw.ustring.lower (cfg.engvar_t[engvar]['romanisz_lc'])}); -- finish the tool tip; use romanization when neither script nor standard supplied
-- end
-- title_text = substitute ('$1 $2', {title_text, mw.ustring.lower (cfg.engvar_t[engvar]['romanisz_lc'])}); -- finish the tool tip; use romanization when neither script nor standard supplied


elseif is_set (std) and is_set (tscript) then -- when both are specified
elseif is_set (std) and is_set (tscript) then -- when both are specified
第772行: 第804行:
if title_t[std][tscript] then -- and if script for that standard is legitimate
if title_t[std][tscript] then -- and if script for that standard is legitimate
if script_table[tscript] then
if script_table[tscript] then
title_text = substitute ('$1$2($3)$4', { -- add the appropriate text to the tool tip
title_text = substitute ('$1$2($3)$4', { -- add the appropriate text to the tool tip
title_text,
title_text,
title_t[std][tscript:lower()],
title_t[std][tscript:lower()],
第785行: 第817行:
end
end
else
else
return ''; -- invalid standard, setup for error message
return translit
end
end


elseif is_set (std) then -- translit-script not set, use language code
elseif is_set (std) then -- translit-script not set, use language code
if not title_t[std] then return ''; end -- invalid standard, setup for error message
if not title_t[std] then
return translit
end
 
if title_t[std][code] then -- if language code is in the table (transl may not provide a language code)
if title_t[std][code] then -- if language code is in the table (transl may not provide a language code)
title_text = substitute ('$1$2($3)$4', { -- add the appropriate text to the tool tip
title_text = substitute ('$1$2($3)$4', { -- add the appropriate text to the tool tip
title_text,
title_text,
title_t[std][code:lower()],
title_t[std][code:lower()],
第809行: 第843行:
else
else
if is_set (tscript) then
if is_set (tscript) then
title_text = substitute ('$1$2-$3$4', { -- write a script tool tip
title_text = substitute ('$1$2-$3$4', { -- write a script tool tip
title_text,
title_text,
language_name,
language_name,
第815行: 第849行:
cfg.make_translit_t.transliteration,
cfg.make_translit_t.transliteration,
});
});
            -- 中文版不需要          
-- 中文版不需要
-- elseif is_set (code) then
-- elseif is_set (code) then
-- if not mw.ustring.find (language_name, 'languages', 1, true) 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)
-- title_text = substitute ('$1-$2', { -- skip this text (individual and macro languages only)
-- title_text = substitute ('$1-$2', { -- skip this text (individual and macro languages only)
-- title_text,
-- title_text,
-- cfg.misc_text_t.language,
-- cfg.misc_text_t.language,
-- });
-- });
-- end
-- end
-- title_text = substitute ('$1 $2', { -- finish the tool tip
-- title_text = substitute ('$1 $2', { -- finish the tool tip
-- title_text,
-- title_text,
-- cfg.make_translit_t.transliteration,
-- cfg.make_translit_t.transliteration,
-- });
-- });
else
else
title_text = substitute ('$1$2', { -- generic tool tip (can we ever get here?)
title_text = substitute ('$1$2', { -- generic tool tip (can we ever get here?)
第842行: 第876行:
tag = '<span lang="%s-Latn">%s</span>'
tag = '<span lang="%s-Latn">%s</span>'
else
else
            tag = '<span style="font-style: %s" lang="%s-Latn">%s</span>' -- non-standard style, construct a span tag for it
tag = '<span style="font-style: %s" lang="%s-Latn">%s</span>' -- non-standard style, construct a span tag for it
            tag = string.format(tag, style, "%s", "%s")
tag = string.format(tag, style, "%s", "%s")
end
end
tag = string.format(tag, code, "%s")
tag = string.format(tag, code, "%s")
第849行: 第883行:
tag = '<span>%s</span>' -- when no language code: no lang= attribute, not italic ({{transliteration}} only)
tag = '<span>%s</span>' -- when no language code: no lang= attribute, not italic ({{transliteration}} only)
end
end
 
tag = string.format(tag, translit) -- add the translit text
tag = string.format(tag, translit) -- add the translit text
if '' == title_text then -- when there is no need for a tool-tip
if '' == title_text then -- when there is no need for a tool-tip
return tag; -- done
return tag; -- done
else
else
        -- 中文版不需要
-- 中文版不需要
-- title_text = cfg.engvar_sel_t.gb == engvar and title_text:gsub ('([Rr]omani)z', '%1s') or title_text; -- gb eng when engvar specifies gb eng; us eng else
-- title_text = cfg.engvar_sel_t.gb == engvar and title_text:gsub ('([Rr]omani)z', '%1s') or title_text; -- gb eng when engvar specifies gb eng; us eng else
return title_wrapper_make (title_text, tag, 'span'); -- wrap with a tool-tip span and done
return title_wrapper_make (title_text, tag, 'span'); -- wrap with a tool-tip span and done
end
end
第873行: 第907行:
local function validate_text (template, args)
local function validate_text (template, args)
if not is_set (args.text) then
if not is_set (args.text) then
return make_error_msg (cfg.validate_text_t.no_text, args, template);
make_error_msg (cfg.validate_text_t.no_text, args, template)
args.text = ''
return
end
end


if args.text:find ("%f[\']\'\'\'\'%f[^\']") or args.text:find ("\'\'\'\'\'[\']+") then -- because we're looking, look for 4 appostrophes or 6+ appostrophes
if args.text:find ("%f[\']\'\'\'\'%f[^\']") or args.text:find ("\'\'\'\'\'[\']+") then -- because we're looking, look for 4 appostrophes or 6+ appostrophes
return make_error_msg (cfg.validate_text_t.malformed_markup, args, template);
make_error_msg (cfg.validate_text_t.malformed_markup, args, template)
return
end
end


local style = args.italic;
local style = args.italic or args.italics or args.i;


if (cfg.keywords_t.unset ~= style) and (cfg.keywords_t.invert ~=style) then
-- 中文版修改:|italic=no 和未指定 |italic= 時不檢查斜體標記
if style and (cfg.keywords_t.unset ~= style) and (cfg.keywords_t.negative ~= style) and (cfg.keywords_t.invert ~= style) then
if args.text:find ("%f[\']\'\'%f[^\']") or args.text:find ("%f[\']\'\'\'\'\'%f[^\']") then -- italic but not bold, or bold italic
if args.text:find ("%f[\']\'\'%f[^\']") or args.text:find ("%f[\']\'\'\'\'\'%f[^\']") then -- italic but not bold, or bold italic
return make_error_msg (cfg.validate_text_t.italic_markup, args, template);
make_error_msg (cfg.validate_text_t.italic_markup, args, template)
return
end
end
end
end
第898行: 第937行:
local function render_maint (nocat)
local function render_maint (nocat)
local maint = {};
local maint = {};
 
if 0 < #maint_msgs then -- when there are maintenance messages
if 0 < #maint_msgs then -- when there are maintenance messages
table.insert (maint, table.concat ({'<span class="lang-comment" style="font-style: normal; display: none; color: #33aa33; margin-left: 0.3em;">'})); -- opening <span> tag
table.insert (maint, table.concat ({'<span class="lang-comment" style="font-style: normal; display: none; color: #33aa33; margin-left: 0.3em;">'})); -- opening <span> tag
for _, msg in ipairs (maint_msgs) do
for _, msg in ipairs (maint_msgs) do
table.insert (maint, table.concat ({msg, ''})); -- add message strings
table.insert (maint, table.concat ({msg, ''})); -- add message strings
end
end
table.insert (maint, '</span>'); -- close the span
table.insert (maint, '</span>'); -- close the span
end
end
 
if (0 < #maint_cats) and (0 == namespace) and not nocat then -- when there are maintenance categories; article namespace only
if (0 < #maint_cats) and (0 == namespace) and not nocat then -- when there are maintenance categories; article namespace only
for _, cat in ipairs (maint_cats) do
for _, cat in ipairs (maint_cats) do
第912行: 第951行:
end
end
end
end
 
return table.concat (maint);
return table.concat (maint);
end
end
第931行: 第970行:
if false == proto_param then -- when forced by |proto=no
if false == proto_param then -- when forced by |proto=no
return text:gsub ('^%**', ''); -- return text without splat prefix regardless of language name or existing splat prefix in text
return text:gsub ('^%**', ''); -- return text without splat prefix regardless of language name or existing splat prefix in text
elseif (language_name:find ('^原始') or (true == proto_param)) then -- language is a proto or forced by |proto=yes
elseif (language_name:find ('^原始') or (true == proto_param)) then -- language is a proto or forced by |proto=yes
return text:gsub ('^%**', '*'); -- prefix proto-language text with a splat; also removes duplicate prefixing splats
return text:gsub ('^%**', '*'); -- prefix proto-language text with a splat; also removes duplicate prefixing splats
end
end
 
return text:gsub ('^%*+', '*'); -- return text unmolested except multiple splats reduced to one splat
return text:gsub ('^%*+', '*'); -- return text unmolested except multiple splats reduced to one splat
end
end
第955行: 第994行:
--[[--------------------------< H T M L _ T A G _ S E L E C T >------------------------------------------------
--[[--------------------------< H T M L _ T A G _ S E L E C T >------------------------------------------------


Inspects content of and selectively trims text.  Returns text and the name of an appropriate html tag for text.
Inspects content of and selectively trims text.  Returns text and the name of an appropriate HTML tag for text.


If text contains:
If text contains:
\n\n text has implied <p>..</p> tags - trim leading and trailing whitespace and return  
\n\n text has implied <p>..</p> tags - trim leading and trailing whitespace and return
If text begins with list markup:
If text begins with list markup:
\n* unordered
\n* unordered
第966行: 第1,005行:
trim all leading whitespace except  \n and trim all trailing whitespace
trim all leading whitespace except  \n and trim all trailing whitespace


If text contains <poem>...</poem> stripmarker, return text unmodified and choose <div>..</div> tags because  
If text contains <poem>...</poem> stripmarker, return text unmodified and choose <div>..</div> tags because
the stripmarker is replaced with text wrapped in <div>..</div> tags.
the stripmarker is replaced with text wrapped in <div>..</div> tags.


第976行: 第1,015行:
local function html_tag_select (text)
local function html_tag_select (text)
local tag;
local tag;
 
if has_poem_tag (text) then -- contains poem stripmarker (we can't know the content of that)
if has_poem_tag (text) then -- contains poem stripmarker (we can't know the content of that)
tag = 'div'; -- poem replacement is in div tags so lang must use div tags
tag = 'div'; -- poem replacement is in div tags so lang must use div tags
第991行: 第1,030行:
tag = 'span'; -- so span is fine
tag = 'span'; -- so span is fine
end
end
 
return text, tag;
return text, tag;
end
end
第1,027行: 第1,066行:
local function language_name_get (ietf, code, cat)
local function language_name_get (ietf, code, cat)
ietf = ietf:lower(); -- ietf:lower() because format_ietf_tag() returns mixed case
ietf = ietf:lower(); -- ietf:lower() because format_ietf_tag() returns mixed case
 
local name; -- remains nil if not found
local name; -- remains nil if not found
 
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 tag
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 active tag/name table
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 -- try the iana deprecated tag/name table
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
第1,102行: 第1,141行:
while 1 do
while 1 do
idx_mid = math.ceil ((idx_bot + idx_top) / 2); -- get the mid-point in the <ranges_t> sequence
idx_mid = math.ceil ((idx_bot + idx_top) / 2); -- get the mid-point in the <ranges_t> sequence
if (target >= ranges_t[idx_mid][1]) and (target <= ranges_t[idx_mid][2]) then -- indexed range low value <= target <= indexed range high value
if (target >= ranges_t[idx_mid][1]) and (target <= ranges_t[idx_mid][2]) then -- indexed range low value <= target <= indexed range high value
return true; -- we found the range that holds the <target> character; return true
return true; -- we found the range that holds the <target> character; return true
 
elseif (target > ranges_t[idx_mid][2]) then -- is <target> > indexed range high value?
elseif (target > ranges_t[idx_mid][2]) then -- is <target> > indexed range high value?
idx_bot = idx_mid; -- adjust <idx_bot> up
idx_bot = idx_mid; -- adjust <idx_bot> up
第1,115行: 第1,154行:
break; -- here when we just evaluated the last range and <target> not found
break; -- here when we just evaluated the last range and <target> not found
end
end
 
if not flag and (idx_bot == idx_top) then -- set true just before we evaluate the last (highest) range in <ranges_t>
if not flag and (idx_bot == idx_top) then -- set true just before we evaluate the last (highest) range in <ranges_t>
flag = true;
flag = true;
第1,135行: 第1,174行:


TODO: when text has accept-as-written markup, return a non-boolean value to indicate that <text> is not wholly
TODO: when text has accept-as-written markup, return a non-boolean value to indicate that <text> is not wholly
latn script?  Use that return value to create non-Latn html lang= attribute because <text> isn't really
latn script?  Use that return value to create non-Latn HTML lang= attribute because <text> isn't really
latn so lang=und (undetermined)? or instead, omit the -Latn subtag? (without -latn need to force |italic=yes)
latn so lang=und (undetermined)? or instead, omit the -Latn subtag? (without -Latn need to force |italic=yes)


]]
]]
第1,160行: 第1,199行:
end
end


--[[--------------------------< 处 理 中 文 文 本 转 换 >--------------------------------------------------------------
该函数用于判断输入的语言代码是否属于中文(包括汉语方言),并决定是否需要禁用繁简转换。
功能:
- 如果语言代码指定为无变体的中文代码 `zh-` 和其他以汉字作为书写系统的汉语方言文字(如粤语、吴语、赣语、文言文等),则返回原文本,不做任何修改。
- 如果语言代码不属于中文或为中文变体(以 `zh-` 开头),则在文本外添加 `-{}-`,以阻止繁简转换。
参数:
- `code` (string): 语言代码(如 `"zh"`、`"gan"`、`"yue"`、`"en"`)。
- `text` (string): 需要处理的文本。
返回值:
- (string) 处理后的文本。
]]
local function chinese_conversion(code, text)
-- 定义属于中文及相关方言的语言代码
local chinese_codes = { zh = true, gan = true, wuu = true, yue = true, lzh = true, hsn = true }
if chinese_codes[code] then
return text
else
return '-{' .. text .. '}-'
end
end


--[[--------------------------< _ L A N G >--------------------------------------------------------------------
--[[--------------------------< _ L A N G >--------------------------------------------------------------------
第1,184行: 第1,252行:
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_msgs = {};
maint_msgs = {};
 
error_msgs = {}
 
validate_cat_args (args); -- determine if categorization should be suppressed
validate_cat_args (args); -- determine if categorization should be suppressed


if args[1] and args.code then
if args[1] and args.code then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'1', cfg.lang_t.conflict_n_param_types.code}), args, template);
make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'1', cfg.lang_t.conflict_n_param_types.code}), args, template)
else
args.code = args[1] or args.code; -- prefer args.code
end
end
args.code = args[1] or args.code; -- prefer args.code


if args[2] and args.text then
if args[2] and args.text then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'2', cfg.lang_t.conflict_n_param_types.text}), args, template);
make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'2', cfg.lang_t.conflict_n_param_types.text}), args, template)
else
args.text = args[2] or args.text; -- prefer args.text
end
end
args.text = args[2] or args.text; -- prefer args.text
validate_text (template, args)


msg = validate_text (template, args); -- ensure that |text= is set
args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate HTML tag with text trimmed accordingly
if is_set (msg) then -- msg is an already-formatted error message
return msg;
end
args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate html tag with text trimmed accordingly


args.rtl = args.rtl == cfg.keywords_t.affirmative; -- convert to boolean: 'yes' -> true, other values -> false
args.rtl = args.rtl == cfg.keywords_t.affirmative; -- convert to boolean: 'yes' -> true, other values -> false
第1,216行: 第1,281行:


if msg then
if msg then
return make_error_msg (msg, args, template);
make_error_msg (msg, args, template)
msg = nil
code = code or ''
end
end


local is_latn_text, pos, char;
local is_latn_text, pos, char;
is_latn_text, args.text, pos, char= is_latin (args.text, code); -- make a boolean
is_latn_text, args.text, pos, char= is_latin (args.text, code); -- make a boolean


msg = text_script_match_test (subtags.script, is_latn_text, pos, char)
msg = text_script_match_test (subtags.script, is_latn_text, pos, char)
if msg then -- if an error detected then there is an error message
if msg then -- if an error detected then there is an error message
return make_error_msg (msg, args, template);
make_error_msg (msg, args, template)
msg = nil
end
end


args.italic, msg = validate_italic (args);
args.italic, msg = validate_italic (args);
if msg then
if msg then
return make_error_msg (msg, args, template);
make_error_msg (msg, args, template)
msg = nil
end
end


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 is_latn_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 is_latn_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 = 'unset'; -- DEFAULT for {{lang}} templates is upright; but if latn script set for font-style:italic
args.italic = 'unset'; -- DEFAULT for {{lang}} templates is upright; but if latn script set for font-style:italic
else
else
args.italic = 'inherit'; -- italic not set; script not latn; inherit current style
args.italic = 'inherit'; -- italic not set; script not latn; inherit current style
end
end
end
end
 
if is_set (subtags.script) then -- if script set, override rtl setting
if is_set (subtags.script) then -- if script set, override rtl setting
if in_array (subtags.script, lang_data.rtl_scripts) then
if in_array (subtags.script, lang_data.rtl_scripts) then
第1,251行: 第1,320行:


args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles
args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles
language_name = language_name_get (args.code, code, true); -- get language name; try ietf tag first, then code w/o variant then code w/ variant
language_name = language_name_get (args.code, code, true) or ''; -- get language name; try IETF tag first, then code w/o variant then code w/ variant


if cfg.keywords_t.invert == args.italic and 'span' == tag then -- invert only supported for in-line content
if cfg.keywords_t.invert == args.italic and 'span' == tag then -- invert only supported for in-line content
第1,257行: 第1,326行:
end
end


    -- 中文版特化部分:为非中文文字禁用繁简转换,中文文字和其他以汉字作为书写系统的汉语方言文字启用繁简转换。
args.text = chinese_conversion (args.code, args.text) -- 中文版特化部分
if 'zh' == code then
args.text = args.text
elseif 'gan' == code then
args.text = args.text
elseif 'wuu' == code then
args.text = args.text
elseif 'yue' == code then
args.text = args.text
elseif 'lzh' == code then
args.text = args.text
elseif 'hsn' == code then
args.text = args.text
else
args.text = '-{' .. args.text .. '}-'
end


args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat
args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat
第1,279行: 第1,333行:
table.insert (out, make_category (code, language_name, args.nocat));
table.insert (out, make_category (code, language_name, args.nocat));
table.insert (out, render_maint (args.nocat)); -- maintenance messages and categories
table.insert (out, render_maint (args.nocat)); -- maintenance messages and categories
if not args.noerror and error_msgs[1] then
table.insert(out, make_lang_error_span(table.concat(error_msgs)))
end


return table.concat (out); -- put it all together and done
return table.concat (out); -- put it all together and done
第1,313行: 第1,371行:


local msg = parameter_validate (args_t, cfg.templates_t.lang); -- verify that all supplied parameters are supported by {{lang-??}}
local msg = parameter_validate (args_t, cfg.templates_t.lang); -- verify that all supplied parameters are supported by {{lang-??}}
if msg then
if args_t.noerror then
return make_error_msg (msg, args_t, cfg.templates_t.lang); -- when template has unsupported params, abandon with error message
msg = ''
else
msg = msg and make_lang_error_span(make_error_msg(msg, args_t, cfg.templates_t.lang)) or ''
end
end


return _lang (args_t);
return _lang (args_t) .. msg
end
end


第1,333行: 第1,393行:


if 'none' ~= args_t.label then -- if we want a label
if 'none' ~= args_t.label then -- if we want a label
table.insert (translation_t, '<small>'); -- open the <small> html tag
table.insert (translation_t, '<small>'); -- open the <small> HTML tag
if cfg.keywords_t.negative == args_t.link then
if cfg.keywords_t.negative == args_t.link then
table.insert (translation_t, cfg.translation_make_t.lit_xlation); -- unlinked form
table.insert (translation_t, cfg.translation_make_t.lit_xlation); -- unlinked form
第1,339行: 第1,399行:
table.insert (translation_t, make_wikilink (cfg.translation_make_t.lit_xlation)); -- linked form
table.insert (translation_t, make_wikilink (cfg.translation_make_t.lit_xlation)); -- linked form
end
end
table.insert (translation_t, "&thinsp;</small>"); -- close the <small> html tag
table.insert (translation_t, "</small>"); -- close the <small> HTML tag
end
end
table.insert (translation_t, table.concat ({'&#39;', args_t.translation, '&#39;'})); -- use html entities to avoid wiki markup confusion
table.insert (translation_t, table.concat ({'', args_t.translation, ''}));
return table.concat (translation_t); -- make a big string and done
return table.concat (translation_t); -- make a big string and done
end
end
第1,376行: 第1,436行:
|label = 'none' to suppress all labeling (language name, 'translit.', 'lit.')
|label = 'none' to suppress all labeling (language name, 'translit.', 'lit.')
any other text replaces language-name label - automatic wikilinking disabled
any other text replaces language-name label - automatic wikilinking disabled
 
for those {{lang-??}} templates that support transliteration (those templates where |text= is not entirely latn script):
for those {{lang-??}} templates that support transliteration (those templates where |text= is not entirely latn script):
|translit = text that is a transliteration of text
|translit = text that is a transliteration of text
第1,405行: 第1,465行:
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_msgs = {};
maint_msgs = {};
 
error_msgs = {}
 
local text_idx = (cfg.templates_t.langx == base_template) and 2 or 1; -- for {{langx}} 'text' positional parameter is '2'
local text_idx = (cfg.templates_t.langx == base_template) and 2 or 1; -- for {{langx}} 'text' positional parameter is '2'
local translit_idx = (cfg.templates_t.langx == base_template) and 3 or 2;
local translit_idx = (cfg.templates_t.langx == base_template) and 3 or 2;
第1,411行: 第1,473行:


if args[text_idx] and args.text then
if args[text_idx] and args.text then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {translit_idx, cfg.lang_t.conflict_n_param_types.text}), args, template);
make_error_msg (substitute (cfg.lang_t.conflict_n_param, {text_idx, cfg.lang_t.conflict_n_param_types.text}), args, template)
else
args.text = args[text_idx] or args.text; -- prefer positional 'text' parameter
end
end
args.text = args[text_idx] or args.text; -- prefer positional 'text' parameter


msg = validate_text (template, args); -- ensure that |text= is set, does not contain italic markup and is protected from improper bolding
validate_text (template, args)
if is_set (msg) then
return msg;
end


args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate html tag with text trimmed accordingly
args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate HTML tag with text trimmed accordingly


if args[translit_idx] and args.translit then
if args[translit_idx] and args.translit then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {translit_idx, cfg.lang_t.conflict_n_param_types.translit}), args, template);
make_error_msg (substitute (cfg.lang_t.conflict_n_param, {translit_idx, cfg.lang_t.conflict_n_param_types.translit}), args, template)
 
else
args.translit = args[translit_idx] or args.translit -- prefer positional 'translit' parameter
end
end
args.translit = args[translit_idx] or args.translit; -- prefer positional 'translit' parameter


if args[xlate_idx] and (args.translation or args.lit) then
if args[xlate_idx] and (args.translation or args.lit) then
return make_error_msg (substitute (cfg.lang_xx_t.conflict_n_lit, {translit_idx}), args, template);
make_error_msg (substitute (cfg.lang_xx_t.conflict_n_lit, {xlate_idx}), args, template)
elseif args.translation and args.lit then
elseif args.translation and args.lit then
return make_error_msg (cfg.lang_xx_t.conflict_lit, args, template);
make_error_msg (cfg.lang_xx_t.conflict_lit, args, template)
else
args.translation = args[xlate_idx] or args.translation or args.lit; -- prefer positional 'translation' parameter
end
end
args.translation = args[xlate_idx] or args.translation or args.lit; -- prefer positional 'translation' parameter


if args.links and args.link then
if args.links and args.link then
return make_error_msg (cfg.lang_xx_t.conflict_link, args, template);
make_error_msg (cfg.lang_xx_t.conflict_link, args, template)
else
args.link = args.link or args.links; -- prefer args.link
end
end
args.link = args.link or args.links; -- prefer args.link


validate_cat_args (args); -- determine if categorization should be suppressed
validate_cat_args (args); -- determine if categorization should be suppressed
第1,451行: 第1,505行:


if msg then -- if an error detected then there is an error message
if msg then -- if an error detected then there is an error message
return make_error_msg (msg, args, template);
make_error_msg (msg, args, template)
msg = nil
code = code or ''
end
end
 
if args.translit then
if args.translit then
local latn, pos, char;
local latn, pos, char;
latn, args.translit, pos, char = is_latin (args.translit, (('' ~= subtags.private) and (code .. '-x-' .. subtags.private)) or code);
latn, args.translit, pos, char = is_latin (args.translit, (('' ~= subtags.private) and (code .. '-x-' .. subtags.private)) or code);
if not latn then
if not latn then
return make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template);
make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template)
end
end
end
end
第1,467行: 第1,523行:
msg = text_script_match_test (subtags.script, is_latn_text, pos, char)
msg = text_script_match_test (subtags.script, is_latn_text, pos, char)
if msg then -- if an error detected then there is an error message
if msg then -- if an error detected then there is an error message
return make_error_msg (msg, args, template);
make_error_msg (msg, args, template)
msg = nil
end
end


args.italic, msg = validate_italic (args);
args.italic, msg = validate_italic (args);
if msg then
if msg then
return make_error_msg (msg, args, template);
make_error_msg (msg, args, template)
msg = nil
end
end
 
if cfg.templates_t.langx == base_template then -- auto-italics  for {{langx}} templates; adapted from {{lang}} (no support for poem tag)  
if cfg.templates_t.langx == base_template then -- auto-italics  for {{langx}} templates; adapted from {{lang}} (no support for poem tag)
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
args.italic = 'inherit'; -- italic not set; script not latn; inherit current style
args.italic = 'inherit'; -- italic not set; script not latn; inherit current style
end
end
 
else -- {{lang-xx}} does not do auto italics; retained for those wikis that don't support {{langx}}
else -- {{lang-xx}} does not do auto italics; retained for those wikis that don't support {{langx}}
if nil == args.italic then -- args.italic controls
if nil == args.italic then -- args.italic controls
args.italic = initial_style_state; -- here when |italic= and |script= not set; set for font-style:<initial_style_state>
args.italic = initial_style_state; -- here when |italic= and |script= not set; set for font-style:<initial_style_state>
end
end
end
end
 
if is_set (subtags.script) then -- if script set override rtl setting
if is_set (subtags.script) then -- if script set override rtl setting
if in_array (subtags.script, lang_data.rtl_scripts) then
if in_array (subtags.script, lang_data.rtl_scripts) then
第1,500行: 第1,558行:


args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles
args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles
language_name = language_name_get (args.code, code, true); -- get language name; try ietf tag first, then code w/o variant then code w/ variant
language_name = language_name_get (args.code, code, true) or ''; -- get language name; try IETF tag first, then code w/o variant then code w/ variant


category_name = language_name; -- category names retain IANA parenthetical diambiguators (if any)
category_name = language_name; -- category names retain IANA parenthetical diambiguators (if any)
第1,513行: 第1,571行:
table.insert (out, language_name); -- language name without wikilink
table.insert (out, language_name); -- language name without wikilink
else
else
            -- 中文版不需要
-- 中文版不需要
-- if mw.ustring.find (language_name, 'languages', 1, true) 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[args.code:lower()] then -- is ietf tag in article name over ride?
-- elseif lang_data.article_name[args.code:lower()] then -- is IETF tag in article name over ride?
-- table.insert (out, make_wikilink (lang_data.article_name[args.code:lower()], language_name)); -- language name with wikilink from override data
-- table.insert (out, make_wikilink (lang_data.article_name[args.code:lower()], language_name)); -- language name with wikilink from override data
if lang_data.article_name[code] then -- is language tag in article override
if lang_data.article_name[code] then -- is language tag in article override
table.insert (out, make_wikilink (lang_data.article_name[code], 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 name with wikilink
table.insert (out, make_wikilink (language_name)); -- language name with wikilink
end
end
end
end
第1,530行: 第1,588行:
args.text = invert_italics (args.text)
args.text = invert_italics (args.text)
end
end
   
 
    -- 中文版特化部分:为非中文文字禁用繁简转换,中文文字和其他以汉字作为书写系统的汉语方言文字启用繁简转换。
args.text = chinese_conversion (args.code, args.text) -- 中文版特化部分
if 'zh' == code then
args.text = args.text
elseif 'gan' == code then
args.text = args.text
elseif 'wuu' == code then
args.text = args.text
elseif 'yue' == code then
args.text = args.text
elseif 'lzh' == code then
args.text = args.text
elseif 'hsn' == code then
args.text = args.text
else
args.text = '-{' .. args.text .. '}-'
end


args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat
args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat
第1,562行: 第1,605行:
end
end


local translit_title_obj = mw.title.makeTitle (0, substitute ('$2$1',{cfg.lang_xx_t.romanization, translit_script_name})); -- make a title object; no engvar, article titles use US spelling
local translit_title_obj = mw.title.makeTitle (0, substitute ('$2$1',{cfg.lang_xx_t.romanization, translit_script_name})); -- make a title object; no engvar, article titles use US spelling
if translit_title_obj.exists and (cfg.keywords_t.negative ~= args.link) then
if translit_title_obj.exists and (cfg.keywords_t.negative ~= args.link) then
table.insert (out, make_wikilink (substitute ('$2$1', {cfg.lang_xx_t.romanization, translit_script_name or language_name}),
table.insert (out, make_wikilink (substitute ('$2$1', {cfg.lang_xx_t.romanization, translit_script_name or language_name}),
第1,571行: 第1,614行:


end
end
table.insert (out, '</small>'); -- close the small tag
table.insert (out, '</small>'); -- close the small tag
end
end
 
translit = make_translit (args.code, language_name, args.translit, args['translit-std'], args['translit-script'], nil)
translit = make_translit (args.code, language_name, args.translit, args['translit-std'], args['translit-script'], nil)
if is_set (translit) then
if is_set (translit) then
table.insert (out, translit);
table.insert (out, translit);
else
else
return make_error_msg (substitute ('$1:$2', {cfg.lang_xx_t.invalid_xlit_std, args['translit-std'] or '[missing]'}), args, template);
make_error_msg (substitute ('$1:$2', {cfg.lang_xx_t.invalid_xlit_std, args['translit-std'] or '[missing]'}), args, template)
end
end
 
elseif is_set (args.translit) and is_latn_text then -- when creating a transliteration of Latn script <text>
elseif is_set (args.translit) and is_latn_text then -- when creating a transliteration of Latn script <text>
return make_error_msg (cfg.lang_xx_t.xlit_of_latn, args, template); -- emit error message and abandon
make_error_msg (cfg.lang_xx_t.xlit_of_latn, args, template)
end
end


第1,588行: 第1,631行:
table.insert (out, translation_make (args));
table.insert (out, translation_make (args));
end
end
 
table.insert (out, make_category (code, category_name, args.nocat));
table.insert (out, make_category (code, category_name, args.nocat));
table.insert (out, render_maint(args.nocat)); -- maintenance messages and categories
table.insert (out, render_maint(args.nocat)); -- maintenance messages and categories
if not args.noerror and error_msgs[1] then
table.insert(out, make_lang_error_span(table.concat(error_msgs)))
end


return table.concat (out); -- put it all together and done
return table.concat (out); -- put it all together and done
第1,636行: 第1,683行:
local args = lang_xx_args_get (frame, cfg.templates_t.langxx);
local args = lang_xx_args_get (frame, cfg.templates_t.langxx);
args.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang_xx_italic|...}}
args.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang_xx_italic|...}}
 
local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}}
local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}}
if msg then
 
return make_error_msg (msg, args, cfg.templates_t.langxx); -- when template has unsupported params, abandon with error message
if args.noerror then
msg = ''
else
msg = msg and make_lang_error_span(make_error_msg(msg, args, cfg.templates_t.langxx)) or ''
end
end


initial_style_state = 'italic';
initial_style_state = args.italic_important and 'italic' or 'inherit'; -- 中文維基百科:忽略斜體(除非指定italic_important)
return _lang_xx (args, cfg.templates_t.langxx) .. '[[Category:使用Lang-xx模板的页面]]'; -- temporary category
return _lang_xx (args, cfg.templates_t.langxx) .. msg .. '[[Category:使用Lang-xx模板的页面]]'
end
end


第1,654行: 第1,704行:


local function _lang_xx_italic (args)
local function _lang_xx_italic (args)
initial_style_state = 'italic';
initial_style_state = args.italic_important and 'italic' or 'inherit'; -- 中文維基百科:忽略斜體(除非指定italic_important)
return _lang_xx (args, cfg.templates_t.langxx);
return _lang_xx (args, cfg.templates_t.langxx);
end
end
第1,670行: 第1,720行:


local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}}
local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}}
if msg then
 
return make_error_msg (msg, args, cfg.templates_t.langxx); -- when template has unsupported params, abandon with error message
if args.noerror then
msg = ''
else
msg = msg and make_lang_error_span(make_error_msg(msg, args, cfg.templates_t.langxx)) or ''
end
end


initial_style_state = 'inherit';
initial_style_state = 'inherit';
return _lang_xx (args, cfg.templates_t.langxx) .. '[[Category:使用Lang-xx模板的页面]]'; -- temporary category
return _lang_xx (args, cfg.templates_t.langxx) .. msg .. '[[Category:使用Lang-xx模板的页面]]'
end
end


第1,698行: 第1,751行:


local function _langx (args_t)
local function _langx (args_t)
local langx_data = mw.loadData ('Module:Lang/langx'); -- get necessary data  
local langx_data = mw.loadData ('Module:Lang/langx'); -- get necessary data
local rtl_t = langx_data.rtl_t; -- get list of language tags for languages that are rendered right-to-left
local rtl_t = langx_data.rtl_t; -- get list of language tags for languages that are rendered right-to-left
local link_t = langx_data.link_t; -- get list of language tags for {{lang-??}} templates that set |link=<something>
local link_t = langx_data.link_t; -- get list of language tags for {{lang-??}} templates that set |link=<something>
local size_t = langx_data.size_t; -- get list of language tags for {{lang-??}} templates that set |size=<something>
local size_t = langx_data.size_t; -- get list of language tags for {{lang-??}} templates that set |size=<something>
error_msgs = {}


local msg = parameter_validate (args_t, cfg.templates_t.langx);
local msg = parameter_validate (args_t, cfg.templates_t.langx);
if msg then
if msg then
return make_error_msg (msg, args_t, cfg.templates_t.langx);
make_error_msg (msg, args_t, cfg.templates_t.langx)
msg = nil
end
end


args_t.code = args_t[1] or args_t.code; -- get the language tag; must be {{{1}}} or |code=
args_t.code = args_t[1] or args_t.code; -- get the language tag; must be {{{1}}} or |code=
if not args_t.code then
if not args_t.code then
return make_error_msg (cfg.get_ietf_parts_t.missing_lang_tag, args_t, cfg.templates_t.langx);
make_error_msg (cfg.get_ietf_parts_t.missing_lang_tag, args_t, cfg.templates_t.langx)
end
end
 
args_t.rtl = args_t.rtl or (rtl_t[args_t.code] and cfg.keywords_t.affirmative); -- prefer |rtl= in template call, use rtl_t else
args_t.rtl = args_t.rtl or (rtl_t[args_t.code] and cfg.keywords_t.affirmative); -- prefer |rtl= in template call, use rtl_t else
args_t.link = args_t.link or link_t[args_t.code]; -- prefer |link= in template call, use link_t felse
args_t.link = args_t.link or link_t[args_t.code]; -- prefer |link= in template call, use link_t felse
args_t.size = args_t.size or size_t[args_t.code]; -- prefer |size= in template call, use size_t else
args_t.size = args_t.size or size_t[args_t.code]; -- prefer |size= in template call, use size_t else
 
args_t[1] = nil; -- unset to mimic {{lang-??}} templates which set |code=xx
args_t[1] = nil; -- unset to mimic {{lang-??}} templates which set |code=xx
if not args_t.noerror and error_msgs[1] then
msg = make_lang_error_span(table.concat(error_msgs))
end


local lang_subtag = args_t.code; -- use only the base language subtag for unsupported tag test; some args_t.code are modified by |script= etc
local lang_subtag = args_t.code; -- use only the base language subtag for unsupported tag test; some args_t.code are modified by |script= etc
return _lang_xx (args_t, cfg.templates_t.langx);
return _lang_xx (args_t, cfg.templates_t.langx) .. (msg or '')
end
end


第1,731行: 第1,791行:
but {{langx}} has four:
but {{langx}} has four:


|  1 |  2 |  3 |  4
|  1 |  2 |  3 |  4
{{lang-xx |<text> |<transl> |<xlate> }}
{{lang-xx |<text> |<transl> |<xlate> }}
{{langx |<tag> |<text> |<transl> |<xlate> }}
{{langx |<tag> |<text> |<transl> |<xlate> }}


第1,741行: 第1,801行:


{{langx}} can't do that.  The initial version of {{langx}} relied on a list of language tags (inherit_t in ~/langx)
{{langx}} can't do that.  The initial version of {{langx}} relied on a list of language tags (inherit_t in ~/langx)
scraped from those {{lang-??}} templates that call lang_xx_inherit() to render text in upright font. Langx now
scraped from those {{lang-??}} templates that call lang_xx_inherit() to render text in upright font. langx() now
uses auto-italics code adapted from {{lang}} (doesn't support poem tags).
uses auto-italics code adapted from {{lang}} (doesn't support poem tags).


第1,748行: 第1,808行:
local function langx (frame)
local function langx (frame)
local args_t = lang_xx_args_get (frame, cfg.templates_t.langx); -- get the arguments; 'Langx' is the <base_template> used to decide which positional param is 'text', 'translit', 'lit'
local args_t = lang_xx_args_get (frame, cfg.templates_t.langx); -- get the arguments; 'Langx' is the <base_template> used to decide which positional param is 'text', 'translit', 'lit'
 
return _langx (args_t);
return _langx (args_t);
end
end
第1,778行: 第1,838行:


local function is_ietf_tag (frame)
local function is_ietf_tag (frame)
return _is_ietf_tag (getArgs (frame)[1]); -- args[1] is the ietf language tag to be tested; also get parent frame
return _is_ietf_tag (getArgs (frame)[1]); -- args[1] is the IETF language tag to be tested; also get parent frame
end
end


第1,791行: 第1,851行:


local function is_ietf_tag_frame (frame)
local function is_ietf_tag_frame (frame)
return _is_ietf_tag (getArgs (frame, {frameOnly = true,})[1]); -- args[1] is the ietf language tag to be tested; do not get parent frame
return _is_ietf_tag (getArgs (frame, {frameOnly = true,})[1]); -- args[1] is the IETF language tag to be tested; do not get parent frame
end
end


第1,815行: 第1,875行:
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
local language_name = '';
local language_name = '';
 
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
第1,823行: 第1,883行:


raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private
raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private
language_name = language_name_get (raw_code, code); -- get language name; try ietf tag first, then code w/o variant then code w/ variant
language_name = language_name_get (raw_code, code); -- get language name; try IETF tag first, then code w/o variant then code w/ variant


if 'yes' ~= args.raw then
if 'yes' ~= args.raw then
第1,832行: 第1,892行:
if mw.ustring.find (language_name, '语系', 1, true) then
if mw.ustring.find (language_name, '语系', 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[raw_code:lower()] then -- is ietf tag in article name override?
elseif lang_data.article_name[raw_code:lower()] then -- is IETF tag in article name override?
language_name = make_wikilink (lang_data.article_name[raw_code:lower()], label or language_name); -- language name with wikilink from override data
language_name = make_wikilink (lang_data.article_name[raw_code:lower()], label or language_name); -- language name with wikilink from override data
elseif lang_data.article_name[code] then -- is language tag in article name override?
elseif lang_data.article_name[code] then -- is language tag in article name override?
第1,851行: 第1,911行:
]]
]]


local function name_from_tag (frame) -- entry point from an {{#invoke:Lang|name_from_tag|<ietf tag>|link=<yes>|template=<template name>}}
local function name_from_tag (frame) -- entry point from an {{#invoke:Lang|name_from_tag|<IETF tag>|link=<yes>|template=<template name>}}
return _name_from_tag (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame
return _name_from_tag (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame
end
end
第1,858行: 第1,918行:
--[[--------------------------< _ T A G _ F R O M _ N A M E >--------------------------------------------------
--[[--------------------------< _ T A G _ F R O M _ N A M E >--------------------------------------------------


Returns the ietf language tag associated with the language name.  Spelling of language name must be correct
Returns the IETF language tag associated with the language name.  Spelling of language name must be correct
according to the spelling in the source tables.  When a standard language name has a parenthetical disambiguator,
according to the spelling in the source tables.  When a standard language name has a parenthetical disambiguator,
that disambiguator must be omitted (they are not present in the data name-to-tag tables).
that disambiguator must be omitted (they are not present in the data name-to-tag tables).
第1,870行: 第1,930行:


if args[1] and '' ~= args[1] then
if args[1] and '' ~= args[1] then
local data = mw.loadData ('Module:Lang/tag from name' .. (mw.getCurrentFrame():getTitle():match ('/sandbox') or '')); -- get the reversed data tables TODO: change when going live
local data = mw.loadData ('Module:Lang/tag from name' .. sandbox); -- get the reversed data tables TODO: change when going live
local lang = args[1]:lower(); -- allow any-case for the language name (speeling must till be correct)
local lang = args[1]:lower(); -- allow any-case for the language name (speeling must till be correct)
local tag = data.rev_override_table[lang] or data.rev_lang_table[lang] or data.rev_lang_dep_table[lang]; -- get the code; look first in the override then in the standard
local tag = data.rev_override_table[lang] or data.rev_lang_table[lang] or data.rev_lang_dep_table[lang]; -- get the code; look first in the override then in the standard
第1,900行: 第1,960行:
local function tag_from_name (frame) -- entry point from an {{#invoke:Lang|tag_from_name|<language name>|link=<yes>|template=<template name>}}
local function tag_from_name (frame) -- entry point from an {{#invoke:Lang|tag_from_name|<language name>|link=<yes>|template=<template name>}}
local result, _ = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by is_lang_name()
local result, _ = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by is_lang_name()
return result;
return result;
end
end


第1,912行: 第1,972行:
local function is_lang_name (frame)
local function is_lang_name (frame)
local _, result = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by tag_from_name()
local _, result = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by tag_from_name()
return result and true or nil;
return result and true or nil;
end
end


第1,932行: 第1,992行:
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_msgs = {};
maint_msgs = {};
 
error_msgs = {}
 
if is_set (args[3]) then -- [3] set when {{transliteration|code|standard|text}}
if is_set (args[3]) then -- [3] set when {{transliteration|code|standard|text}}
args.text = args[3]; -- get the transliterated text
args.text = args[3]; -- get the transliterated text
第1,938行: 第2,000行:


if not title_table[args.translit_std] then
if not title_table[args.translit_std] then
return make_error_msg (substitute (cfg.transl_t.unrecog_xlit_std, {args.translit_std}), args, template);
make_error_msg (substitute (cfg.transl_t.unrecog_xlit_std, {args.translit_std}), args, template)
args.translit_std = nil
end
end
else
else
第1,946行: 第2,009行:
if args[1] and (args[1]:match ('^%a%a%a?%a?$') or -- args[2] missing; is args[1] a language or script tag or is it the transliterated text?
if args[1] and (args[1]:match ('^%a%a%a?%a?$') or -- args[2] missing; is args[1] a language or script tag or is it the transliterated text?
args[1]:match ('^%a%a%a?%-x%-')) then -- or is args[1] a private-use tag
args[1]:match ('^%a%a%a?%-x%-')) then -- or is args[1] a private-use tag
return make_error_msg (cfg.transl_t.no_text, args, template); -- args[1] is a code so we're missing text
make_error_msg (cfg.transl_t.no_text, args, template) -- args[1] is a code so we're missing text
args.text = ''
else
else
args.text = args[1]; -- args[1] is not a code so we're missing that; assign args.text for error message
make_error_msg (cfg.transl_t.missing_lang_scr, args, template)
return make_error_msg (cfg.transl_t.missing_lang_scr, args, template);
args.text = ''
end
end
end
end
end
end


if is_set (args[1]) then -- IANA language code used for html lang= attribute; or ISO 15924 script code
if is_set (args[1]) then -- IANA language code used for HTML lang= attribute; or ISO 15924 script code
if args[1]:match ('^%a%a%a?%a?$') or args[1]:match ('^%a%a%a?%-x%-') then -- args[1] has correct form?
if args[1]:match ('^%a%a%a?%a?$') or args[1]:match ('^%a%a%a?%-x%-') then -- args[1] has correct form?
args.code = args[1]:lower(); -- use the language/script code; only (2, 3, or 4 alpha characters) or private-use; lower case because table indexes are lower case
args.code = args[1]:lower(); -- use the language/script code; only (2, 3, or 4 alpha characters) or private-use; lower case because table indexes are lower case
else
else
return make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args[1]}), args, template); -- invalid language / script code
make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args[1]}), args, template) -- invalid language / script code
args.code = ''
end
end
else
else
return make_error_msg (cfg.transl_t.missing_lang_scr, args, template); -- missing language / script code so quit
make_error_msg (cfg.transl_t.missing_lang_scr, args, template) -- missing language / script code
args.code = ''
end
end


第1,967行: 第2,033行:
is_latn_text, args.text, pos, char= is_latin (args.text, args.code); -- is latn text? strip accept-as-written markup
is_latn_text, args.text, pos, char= is_latin (args.text, args.code); -- is latn text? strip accept-as-written markup
if not is_latn_text then -- when text is not latn
if not is_latn_text then -- when text is not latn
return make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template); -- abandon with error message
make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template)
end
end


第1,973行: 第2,039行:
args.italic, msg = validate_italic (args);
args.italic, msg = validate_italic (args);
if msg then
if msg then
return make_error_msg (msg, args, template);
make_error_msg (msg, args, template)
msg = nil
end
end
 
if 'italic' == args.italic then -- 'italic' when |italic=yes; because that is same as absent or not set and |italic=default
if 'italic' == args.italic then -- 'italic' when |italic=yes; because that is same as absent or not set and |italic=default
args.italic = nil; -- set to nil;  
args.italic = nil; -- set to nil;
end
end


第1,992行: 第2,059行:
args.code = ''; -- unset because not a language code
args.code = ''; -- unset because not a language code
else
else
return make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args.code}), args, template); -- invalid language / script code
make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args.code}), args, template) -- invalid language / script code
language_name = args.code
end
end
-- here only when all parameters passed to make_translit() are valid
-- here only when all parameters passed to make_translit() are valid
return make_translit (args.code, language_name, args.text, args.translit_std, script, args.italic);
 
if not args.noerror and error_msgs[1] then
msg = make_lang_error_span(table.concat(error_msgs))
end
 
return make_translit (args.code, language_name, args.text, args.translit_std, script, args.italic) .. (msg or '')
end
end


第2,028行: 第2,101行:
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
local category_name = '';
local category_name = '';
 
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
第2,036行: 第2,109行:


raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private
raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private
category_name = language_name_get (raw_code, code); -- get language name; try ietf tag first, then code w/o variant then code w/ variant
category_name = language_name_get (raw_code, code); -- get language name; try IETF tag first, then code w/o variant then code w/ variant
category_name = make_category (code, category_name, nil, true):gsub ('[%[%]]', '');
category_name = make_category (code, category_name, nil, true):gsub ('[%[%]]', '');


第2,053行: 第2,126行:
]]
]]


local function category_from_tag (frame) -- entry point from an {{#invoke:Lang|category_from_tag|<ietf tag>|template=<template name>}}
local function category_from_tag (frame) -- entry point from an {{#invoke:Lang|category_from_tag|<IETF tag>|template=<template name>}}
return _category_from_tag (getArgs (frame)); -- pass-on the args table, nothing else; getArgs() so we also get parent frame
return _category_from_tag (getArgs (frame)); -- pass-on the args table, nothing else; getArgs() so we also get parent frame
end
end
第2,062行: 第2,135行:


return {
return {
category_from_tag = category_from_tag,
category_from_tag = category_from_tag, -- frame entry points when this module is #invoke:ed into templates/wikitext
lang = lang, -- entry point for {{lang}}
lang = lang, -- entry point for {{lang}}
langx = langx, -- entry point for {{langx}}
langx = langx, -- entry point for {{langx}}
第2,070行: 第2,143行:
is_ietf_tag_frame = is_ietf_tag_frame,
is_ietf_tag_frame = is_ietf_tag_frame,
is_lang_name = is_lang_name,
is_lang_name = is_lang_name,
tag_from_name = tag_from_name, -- returns ietf tag associated with language name
tag_from_name = tag_from_name, -- returns IETF tag associated with language name
name_from_tag = name_from_tag, -- used for template documentation; possible use in ISO 639 name from code templates
name_from_tag = name_from_tag, -- used for template documentation; possible use in ISO 639 name from code templates
transl = transl, -- entry point for {{transliteration}}
transl = transl, -- entry point for {{transliteration}}
 
_category_from_tag = _category_from_tag, -- entry points when this module is require()d into other modules
_category_from_tag = _category_from_tag, -- API entry points when this module is require()d into other modules
_lang = _lang,
_lang = _lang,
_langx = _langx,
_langx = _langx,
第2,081行: 第2,154行:
_is_ietf_tag = _is_ietf_tag,
_is_ietf_tag = _is_ietf_tag,
get_ietf_parts = get_ietf_parts,
get_ietf_parts = get_ietf_parts,
_tag_from_name = _tag_from_name,  
_tag_from_name = _tag_from_name,
_name_from_tag = _name_from_tag,
_name_from_tag = _name_from_tag,
_transl = _transl,
_transl = _transl,
_translation_make = translation_make,
_translation_make = translation_make,
};
};