Module:User:TAKASUGI Shinji/zh/sandbox
Appearance
- This module sandbox lacks a documentation subpage. Please create it.
- Useful links: root page • root page’s subpages • links • transclusions • testcases • sandbox of
local M = {}
local m_data = mw.loadData('Module:zh/data')
local m_skeys = nil
local len = mw.ustring.len
local cmn_pron = nil
local py_detone={
['ā']='a',['á']='a',['ǎ']='a',['à']='a',
['ō']='o',['ó']='o',['ǒ']='o',['ò']='o',
['ē']='e',['é']='e',['ě']='e',['è']='e',
['ī']='i',['í']='i',['ǐ']='i',['ì']='i',
['ū']='u',['ú']='u',['ǔ']='u',['ù']='u',
['ǖ']='ü',['ǘ']='ü',['ǚ']='ü',['ǜ']='ü'
};
local pos_aliases_title={
['n']='Noun', ['pn']='Proper noun', ['propn']='Proper noun', ['pron']='Pronoun', --things related to nouns
['v']='Verb', ['a']='Adjective', ['adj']='Adjective', ['adv']='Adverb', --other main POSes
['prep']='Preposition', ['postp']='Postposition', ['conj']='Conjunction', --sentence modifiers
['part']='Particle', ['suf']='Suffix', --word modifiers
['prov']='Proverb', ['id']='Idiom', ['ch']='Idiom', ['cy']='Idiom', ['ph']='Phrase', ['intj']='Interjection', --more than one word
['cl']='Classifier', ['num']='Numeral', ['abb']='Abbreviation', ['deter']='Determiner' --other
};
local pos_aliases_head={
['n']='noun', ['pn']='proper noun', ['propn']='proper noun', ['v']='verb', ['a']='adj', --main POSes
['postp']='post', ['conj']='con', ['part']='particle', ['pron']='pronoun', --sentence modifiers and word modifiers
['prov']='proverb', ['id']='idiom', ['ch']='idiom', ['cy']='idiom', ['ph']='phrase', ['intj']='interj', --more than one word
['abb']='abbr', ['cl']='classifier', ['deter']='det' --other
};
local function replace_chars(s, tab)
local output = {}
for cp in mw.ustring.gcodepoint(s) do
local ch = mw.ustring.char(cp)
table.insert(output, tab[ch] or ch)
end
return table.concat(output)
end
function M.sortkey_conv(f)
local rs = type(f) == 'table' and f.args[1] or f
local ch = mw.ustring.sub(rs,1,1)
ch = m_data.sortkeys[ch] or ch
return ch .. mw.ustring.sub(rs,2,mw.ustring.len(rs))
end
function M.py_detone(f)
local text = type(f) == 'table' and f.args[1] or f
return replace_chars(text, py_detone)
end
function M.py_transf(f)
local text = type(f) == 'table' and f.args[1] or f
if mw.ustring.match(text, '[āōēīūǖ]') then
text = text .. '1'
elseif mw.ustring.match(text, '[áóéíúǘ]') then
text = text .. '2'
elseif mw.ustring.match(text, '[ǎǒěǐǔǚ]') then
text = text .. '3'
elseif mw.ustring.match(text, '[àòèìùǜ]') then
text = text .. '4'
end
text = replace_chars(text, py_detone)
return text
end
function M.tone_determ(f)
local text = type(f) == 'table' and f.args[1] or f
if mw.ustring.match(text, '[āōēīūǖ]') then
return '1'
elseif mw.ustring.match(text, '[áóéíúǘ]') then
return '2'
elseif mw.ustring.match(text, '[ǎǒěǐǔǚ]') then
return '3'
elseif mw.ustring.match(text, '[àòèìùǜ]') then
return '4'
else
return '5'
end
end
function M.ts_determ(f)
local text = type(f) == 'table' and f.args[1] or f
for cp in mw.ustring.gcodepoint(text) do
local ch = mw.ustring.char(cp)
if m_data.ts[ch] then return 'trad' end
if m_data.st[ch] then return 'simp' end
end
return 'both'
end
function M.ts(f)
local text = type(f) == 'table' and f.args[1] or f
text = replace_chars(text, m_data.ts)
return text
end
function M.st(f)
local text = type(f) == 'table' and f.args[1] or f
text = replace_chars(text, m_data.st)
return text
end
function M.py(text,comp,pos,p,is_erhua)
if not is_erhua then is_erhua = false end
if type(text) == 'table' then text,comp,pos,p,is_erhua = text.args[1],text.args[2],text.args[3],text.args[4],text.args[5] end
comp = comp or ''
local q = {}
local sum = 0
textconv = M.ts(text)
len = mw.ustring.len(text)
if is_erhua then len = len - 1 end
text = ''
if comp ~= '' and comp ~= '12' and comp ~= '21' and not ((pos == 'cy' or pos == 'Idiom' or pos == 'idiom') and len == 4) and not is_erhua then
for i = 1,mw.ustring.len(comp) do
sum = sum + tonumber(mw.ustring.sub(comp,i,i))
q[sum] = 'y'
end
end
if not p then p={} end
local initial = true
for i = 1,len do
if p[i] and p[i] ~= '' then --pronunciation supplied
text = text .. p[i]
else
local char = mw.ustring.sub(textconv,i,i)
char = m_data.py[char] or char
if is_erhua or initial or not mw.ustring.find(char,'^[aoeāōēáóéǎǒěàòè]') then
text = text .. char
else
text = text .. "'" .. char
end
if char ~= mw.ustring.sub(textconv,i,i) then
initial = false
else
initial = true
end
end
if q[i] == 'y' and i ~= len and not is_erhua then text = text .. ' ' end
end
if is_erhua == true then text = text .. 'r' end
if pos == 'pn' or pos == 'propn' then
characters = mw.text.split(text,' ')
for i=1,#characters do
characters[i] = mw.language.getContentLanguage():ucfirst(characters[i])
end
text = table.concat(characters,' ')
end
return text
end
function M.py_er(text,comp,pos,p)
return M.py(text,comp,pos,p,true)
end
function M.pytemp(text,comp,pos,p,is_erhua)
if not is_erhua then is_erhua = false end
if type(text) == 'table' then text,comp,pos = text.args[1],text.args[2],text.args[3] or 'n' end
comp = comp or ''
local q = {}
local sum = 0
textconv = M.ts(text)
len = mw.ustring.len(text)
if is_erhua == true then
len = len - 1
textconv = mw.ustring.sub(textconv,1,len)
end
text = ''
if comp ~= '' and comp ~= '12' and comp ~= '21' and not is_erhua then
for i = 1,mw.ustring.len(comp) do
sum = sum + tonumber(mw.ustring.sub(comp,i,i))
q[sum] = 'y'
end
end
if not p then p={} end
for i = 1,len do
if p[i] and p[i] ~= '' then --pronunciation supplied
text = text .. p[i]
else
local char = mw.ustring.sub(textconv,i,i)
if mw.ustring.find(char,'[一不期績绩蹟跡迹嵌框微突帆藩擊击夾夹鞠拈夕汐昔惜息危椰濤涛叔寂馴驯築筑質质播究菌矻識识穴膜餾馏企辱署偽伪蹈諷讽斂敛坊樸朴儲储剖檔档髮轍辙賜赐堤壑酵括懾慑蝸蜗淆攜携崖癌暫暂蟄蛰驟骤液血酪嘌覲幀蕁曳]') then
text = text .. char
else
char = m_data.py[char] or char
if i ~= 1 and mw.ustring.find(char,'^[aoeāōēáóéǎǒěàòè]') then
char = "'" .. char
end
text = text .. char
end
end
if q[i] == 'y' and i ~= len and not is_erhua then text = text .. ' ' end
end
text = mw.ustring.gsub(text," '"," ")
if pos == 'pn' or pos == 'propn' then
characters = mw.text.split(text,' ')
for i=1,#characters do
characters[i] = mw.language.getContentLanguage():ucfirst(characters[i])
end
text = table.concat(characters,' ')
end
return text
end
function M.pytemp_er(text,comp,pos,p)
return M.pytemp(text,comp,pos,p,true)
end
function M.pywordconv(text,p)
if type(text) == 'table' then text = text.args[1] end
textconv = M.ts(text)
len = mw.ustring.len(text)
text = ''
if not p then p={} for i=1,20 do p[i]='' end end
for i = 1,len do
if p[i] ~= '' then
text = text .. M.py_transf(p[i])
else
char = mw.ustring.sub(textconv,i,i)
cpy = m_data.py[char] or char
text = text .. M.py_transf(cpy)
end
end
return text
end
function M.pywordconv_er(text,p)
if type(text) == 'table' then text = text.args[1] end
len = mw.ustring.len(text) - 1
textconv = mw.ustring.sub(M.ts(text),1,len)
text = ''
if not p then p={} for i=1,20 do p[i]='' end end
for i = 1,len do
if p[i] ~= '' then
if i == len then p[i] = p[i] .. 'r' end
text = text .. M.py_transf(p[i])
else
char = mw.ustring.sub(textconv,i,i)
cpy = m_data.py[char] or char
if i == len then cpy = cpy .. 'r' end
text = text .. M.py_transf(cpy)
end
end
return text
end
function M.decomp(text,comp)
if type(text) == 'table' then text,comp = text.args[1],text.args[2] or '' end
comp = comp or tostring(mw.ustring.len(text))
local num = tonumber(comp)
char = mw.ustring.sub(text,num,num)
return char
end
function M.compdecomp(title,comp)
if type(title) == 'table' then title,comp = title.args[1],title.args[2] end
comp = comp or ''
local start = 1
local finish = 1
local sum = 0
local text = ''
local p={}
textlen = mw.ustring.len(title)
if comp == '' then
for i = 1,textlen do
comp = comp .. '1'
end
end
for i = 1,mw.ustring.len(comp) do
p[i] = tonumber(mw.ustring.sub(comp,i,i))
sum = sum + p[i]
end
if sum ~= textlen then
comp = ''
for j = 1,textlen do
p[j] = tonumber(1)
comp = comp .. '1'
end
end
for i = 1,mw.ustring.len(comp) do
if i ~= 1 then start = start + p[i-1] end
finish = start + p[i] - 1
text = (text .. '[[' .. mw.ustring.sub(title,start,finish) .. ']]')
end
return text
end
function M.compdecompetym(title,comp)
if type(title) == 'table' then title,comp = title.args[1],title.args[2] end
comp = comp or ''
local start = 1
local finish = 1
local sum = 0
local text = ''
local p={}
textlen = mw.ustring.len(title)
if comp == '' then
for i = 1,textlen do
comp = (comp .. '1')
end
end
for i = 1,mw.ustring.len(comp) do
p[i] = tonumber(mw.ustring.sub(comp,i,i))
sum = sum + p[i]
end
if sum ~= textlen then
comp = ''
for j = 1,textlen do
p[j] = tonumber(1)
comp = (comp .. '1')
end
end
for i = 1,mw.ustring.len(comp) do
if i ~= 1 then start = start + p[i-1] end
finish = start + p[i] - 1
if i ~= 1 then text = (text .. '|') end
text = (text .. mw.ustring.sub(title,start,finish))
end
return text
end
function M.hzbox(title,comp,e)
if type(title) == 'table' then title,comp = title.args[1],title.args[2] end
local id = M.ts_determ(title)
local text = '{{zh-forms'
if e and e ~= "" then text = text .. '|' .. e end
if id == 'simp' then
text = text .. '|t=' .. M.st(title)
elseif id == 'trad' then
text = text .. '|s=' .. M.ts(title)
end
text = text .. ((comp and comp ~= "") and ('|type=' .. comp) or '')
return text .. '}}'
end
function M.hzbox_er(title)
if type(title) == 'table' then title = title.args[1] end
len = mw.ustring.len(title)
if mw.ustring.sub(title,len,len) == '兒' then id = 'trad' else id = 'simp' end
title = mw.ustring.sub(title,1,len-1)
text = '{{zh-hanzi-box|'
if id == 'simp' then
text = (text .. '[[' .. title .. ']][[儿]]|[[' .. M.st(title) .. '兒]]}}')
else
text = (text .. '[[' .. M.ts(title) .. '儿]]|[[' .. title .. ']][[兒]]}}')
end
return text
end
function M.sort(title)
if type(title) == 'table' then title = title.args[1] end
local text = ''
len = mw.ustring.len(title)
title = M.ts(title)
for i = 1,len do
charpy = mw.ustring.sub(title,i,i)
charpy = m_data.py[charpy] or charpy
text = text .. M.py_transf(charpy)
end
return text
end
function M.postitle(pos)
pos = pos or ''
if pos == '' then pos = 'n' end
return pos_aliases_title[pos] or pos
end
function M.poshead(pos)
pos = pos or ''
if pos == '' then pos = 'n' end
return pos_aliases_head[pos] or pos
end
function M.skeys(title)
if m_skeys == nil then m_skeys = mw.loadData('Module:zh/data/skeys') end
if type(title) == 'table' then title = title.args[1] end
text = mw.ustring.sub(title,1,1)
text = m_skeys.skeys[text] or text
return text
end
function M.chardecomp(title)
if type(title) == 'table' then title = title.args[1] end
text = mw.text.split(title,"")
return table.concat(text,"|")
end
function M.semantics(text,name,sem)
if sem[1] and sem[1] ~= '' then
text = (text .. '\n\n====' .. name .. '====')
if name == 'Derived terms' then
text = text .. '\n{{zh-der'
for i = 1, #sem do
text = text .. '|' .. sem[i]
end
text = text .. '}}'
else
for i = 1, #sem do
text = text .. '\n* {{zh-l|' .. sem[i] .. '}}'
end
end
end
return text
end
function M.create_er(f)
return M.create(f,true)
end
local function checkpos(pos)
for poscode,posname in pairs(pos_aliases_head) do
if pos == posname then
return poscode
end
end
for poscode,posname in pairs(pos_aliases_title) do
if pos == posname then
return poscode
end
end
return pos
end
function M.headword(title,comp,pos,is_erhua)
if not is_erhua then is_erhua = false end
is_table = (type(title) == 'table')
p = {}
for i=4,23 do table.insert(p,(is_table and title.args[i] or '')) end
if type(title) == 'table' then title,comp,pos = title.args[1],title.args[2],title.args[3] end
text = '{{zh-' .. M.poshead(pos) .. '|'
id = M.ts_determ(title)
if id == 'both' then text = text .. 'ts' elseif id == 'simp' then text = text .. 's' else text = text .. 't' end
if is_erhua then
text = text .. '|pin=' .. M.py_er(title,comp,pos,p) .. '|pint=' .. M.pywordconv_er(title,p)
if id == 'simp' then
text = text .. '|tra=' .. M.st(title) .. '|sim=' .. title
else
text = text .. '|tra=' .. title .. '|sim=' .. M.ts(title)
end
text = text .. '}}\n\n# {{erhua form'
if def ~= '' then text = text .. '|' .. def end
else
text = text .. '|pin=' .. M.py(title,comp,pos,p) .. '|pint=' .. M.pywordconv(title,p)
if id == 'simp' then
text = text .. '|tra=' .. M.st(title) .. '|sim=' .. title
elseif id == 'trad' then
text = text .. '|tra=' .. title .. '|sim=' .. M.ts(title)
end
end
return text .. '}}'
end
function M.link(frame,mention,args,pagename)
args = args or frame:getParent().args
pagename = pagename or mw.title.getCurrentTitle().text
if args[2] and mw.ustring.match(args[2], '[一-龯㐀-䶵]') then
gloss = args[4] or ''
tr = args[3] or ''
text = args[1] .. '/' .. args[2]
else
text = args[1] or ''
if not args['gloss'] or args['gloss'] == '' then
if args[2] and (mw.ustring.match(args[2], '[āōēīūǖáóéíúǘǎǒěǐǔǚàòèìùǜâêîôû̍ⁿ]') or mw.ustring.match(args[2], '[bcdfghjklmnpqrstwz]h?y?[aeiou][aeiou]?[iumnptk]?g?[1-9]')) then
tr = args[2] or ''
gloss = args[3] or ''
else
tr = ''
gloss = args[2] or ''
end
else
tr = args[2] or ''
gloss = args['gloss']
end
end
if args['tr'] and args['tr'] ~= '' then
tr = args['tr']
gloss = gloss or args[2] or ''
end
if text ~= '' and not text:match('[%[%]]') then
word = mw.text.split(text,"/",true)
if #word == 1 and M.ts_determ(word[1]) == 'trad' and not mw.ustring.match(word[1], '%*') then
table.insert(word, M.ts(word[1]))
end
if tr == '' and word[1] and mw.title.new(word[1]).exists and text ~= pagename then
content = mw.title.new(word[1]):getContent()
content = mw.ustring.gsub(content, ",([^ ])", ";%1")
template = mw.ustring.match(content, "{{zh%-pron[^}]*|m=([^};|\n]+)")
if template and template ~= "" then
if cmn_pron == nil then
cmn_pron = require("Module:cmn-pron")
end
tr = cmn_pron.str_analysis(template, 'link')
end
end
for i = 1,#word do
word[i] = mw.ustring.gsub(word[i], '%*', '')
if mention then
word[i] = '<i class="Hani mention" lang="zh">[[' .. word[i] .. '#Chinese|' .. word[i] .. ']]</i>'
--[[ (disabled to allow links to, for example, a link to 冥王星#Chinese from 冥王星#Japanese. 18 May, 2016)
elseif word[i] == pagename then
word[i] = '<span class="Hani" lang="zh"><b>' .. word[i] .. '</b></span>'
]]
else
word[i] = '<span class="Hani" lang="zh">[[' .. word[i] .. '#Chinese|' .. word[i] .. ']]</span>'
end
end
text = table.concat(word,"/")
elseif text:match('[%[%]]') or text == pagename then
if mention then
text = '<i class="Hani mention" lang="zh">' .. text .. '</i>'
else
text = '<span class="Hani" lang="zh">' .. text .. '</span>'
end
end
if tr == '-' then
tr = '' -- allow translit to be disabled: remove translit if it is "-", just like normal {{l}}
end
if tr ~= '' or gloss ~= '' then
text = text .. ' ('
if tr ~= '' then
text = text .. '<span class="tr"><i>' .. tr .. '</i></span>'
if gloss ~= '' then
text = text .. ', '
end
end
if gloss ~= '' then
text = text .. '“' .. gloss .. '”'
end
text = text .. ')'
end
return text
end
function M.mention(frame)
return M.link(frame,true)
end
function M.check_pron(text, variety, length, entry_creation)
if type(text) == 'table' then text, variety = text.args[1], text.args[2] end
if not text then
return
end
startpoint, address = { ['yue'] = 51, ['hak'] = 19968, ['nan'] = 19968 }, { ['yue'] = 'Jyutping_word/%03d', ['hak'] = 'hak-pron/%02d', ['nan'] = 'nan-pron/%03d' }
unit = 1000
first_char = mw.ustring.sub(text, 1, 1)
codepoints = { ['simp'] = mw.ustring.codepoint(first_char), ['trad'] = mw.ustring.codepoint(M.st(first_char)) }
texts = { ['simp'] = text, ['trad'] = M.st(text) }
local result = false
for identity, codepoint in pairs(codepoints) do
if length == 1 and variety == "yue" then
success, data = pcall(mw.loadData, 'Module:zh/data/Jyutping character')
else
page_index = math.floor((codepoint - startpoint[variety]) / unit)
success, data = pcall(mw.loadData,
('Module:zh/data/' .. address[variety]):format(page_index)
)
end
if success then
result = data[texts[identity]] or false
else
result = false
end
if result then
if variety == "nan" and entry_creation then
result = mw.ustring.gsub(result, "%-á%-", "-仔-")
result = mw.ustring.gsub(result, "%-á/", "-仔/")
result = mw.ustring.gsub(result, "%-á$", "-仔")
result = mw.ustring.gsub(result, "^(.+)%-%1%-%1$", "(%1)")
result = mw.ustring.gsub(result, "^(.+)%-%1%-%1([%-%/])", "(%1)%2")
result = mw.ustring.gsub(result, "([%-%/])(.+)%-%1%-%1$", "%1(%2)")
result = mw.ustring.gsub(result, "([%-%/])(.+)%-%1%-%1([%-%/])", "%1(%2)%3")
end
return result
end
end
return result
end
function M.nan_for_bot()
text = mw.title.getCurrentTitle().text
result = M.check_pron(text, 'nan')
if result then
return '\n|mn=' .. result
else
return
end
end
function M.der(frame)
local m_columns = require("Module:columns")
local args = frame:getParent().args
local pagename = mw.title.getCurrentTitle().text
local result = {}
for i, word in ipairs(args) do
table.insert(result, M.link(frame,nil,{ word },pagename))
end
return m_columns.create_table((mw.ustring.len(pagename) > 1 and 2 or 3), result, 1, "#F5F5FF", (#result > 72 and 1 or 0), "Derived terms",
"Derived terms from <span lang=\"zh\" class=\"Hani\">" .. pagename .. "</span>",
math.floor(80 / (mw.ustring.len(pagename) > 1 and 2 or 3)), "* ", nil)
end
local lang_abbrev = {
['m'] = 'Mandarin',
['c'] = 'Cantonese', ['g'] = 'Gan', ['h'] = 'Hakka', ['j'] = 'Jin',
['md'] = 'Min Dong', ['mn'] = 'Min Nan', ['mn-t'] = 'Teochew',
['w'] = 'Wu', ['x'] = 'Xiang',
}
function M.cls(frame)
local args = frame:getParent().args
local result = {}
for i, combination in ipairs(args) do
part = mw.text.split(combination, ":")
if #part == 2 then
local dialect = { "" }
local function annotate(main_text, annotation)
return "<span style=\"border-bottom: 1px dotted #000; cursor:help\" " ..
"title=\"" .. annotation .. "\"><i>" .. main_text .. "</i></span>"
end
for variety in mw.text.gsplit(part[1], ",") do
table.insert(dialect, annotate(variety, lang_abbrev[variety]))
end
note = table.concat(dialect, " ")
else
note = false
end
table.insert(result, mw.getCurrentFrame():expandTemplate{ title = "Template:zh-l",
args = { "*" .. (part[2] or part[1]) }, tr = "-" } .. (note or ""))
end
return " <small><span style=\"background:#EDFFFF\">(Classifier: " .. table.concat(result, "; ") .. ")</span></small>"
end
function M.newDer(frame)
local title = mw.title.getCurrentTitle().text
local wordlist = require("Module:zh/data/wordlist").list
local args = frame:getParent().args
local result = {}
local limit = args["limit"] and tonumber(args["limit"]) or false
args["limit"] = nil
for _, arg in ipairs(args) do
table.insert(result, arg)
end
for _, word in ipairs(wordlist) do
if mw.ustring.match(word, title) and word ~= title and not (len(title) == 1 and len(word) > (limit or 4)) then
table.insert(result, word)
end
end
local hash, res = {}, {}
for _, element in ipairs(result) do
if not hash[element] then
res[#res + 1] = element
hash[element] = true
end
end
return "{{zh-der|" .. table.concat(res, "|") .. "}}"
end
function M.create(f,is_erhua)
if not is_erhua then is_erhua = false end
local title = mw.title.getCurrentTitle().text
local params = {
["type"] = {}, ["comp"] = {alias_of = "type"},
[1] = {list = true, allow_holes = true},
["pos"] = {list = true, allow_holes = true},
["def"] = {list = true, allow_holes = true},
["e1"] = {list = "e"}, ["etym1"] = {list = "etym"}, ["etymology1"] = {list = "etymology"}, ["meaning"] = {list = true}, ["gloss"] = {list = true},
["k"] = {}, ["ko"] = {alias_of = "k"}, ["korean"] = {alias_of = "k"},
["kt"] = {}, ["tr"] = {alias_of = "kt"}, ["transcription"] = {alias_of = "kt"}, ["ktr"] = {alias_of = "kt"}, ["kotr"] = {alias_of = "kt"}, ["koreantr"] = {alias_of = "kt"}, ["ktrans"] = {alias_of = "kt"}, ["kotrans"] = {alias_of = "kt"},
["ke"] = {}, ["kodef"] = {alias_of = "ke"}, ["kodefinition"] = {alias_of = "ke"}, ["koreandef"] = {alias_of = "ke"},
["v"] = {}, ["vi"] = {alias_of = "v"}, ["vietnam"] = {alias_of = "v"},
["ve"] = {}, ["videf"] = {alias_of = "ve"}, ["videfinition"] = {alias_of = "ve"}, ["vietnamdef"] = {alias_of = "ve"}, ["vietnamdefinition"] = {alias_of = "ve"},
["p"] = {list = true}, ["pron"] = {list = true}, ["pronunciation"] = {list = true},
["e"] = {}, ["etym"] = {alias_of = "e"}, ["etymology"] = {alias_of = "e"}, ["origin"] = {alias_of = "e"}, ["ori"] = {alias_of = "e"}, ["o"] = {alias_of = "e"},
["syn"] = {list = true}, ["synonym"] = {list = true},
["ant"] = {list = true}, ["antonym"] = {list = true},
["der"] = {list = true}, ["deriv"] = {list = true}, ["derived"] = {list = true}, ["derivedterm"] = {list = true},
["also"] = {list = true}, ["see"] = {list = true}, ["seealso"] = {list = true}, ["alsosee"] = {list = true},
["wp"] = {}, ["wiki"] = {alias_of = "wp"}, ["wikipedia"] = {alias_of = "wp"},
["cat"] = {list = true}, ["category"] = {list = true}, ["categories"] = {list = true}, ["categorize"] = {list = true}, ["categorise"] = {list = true}, ["categorization"] = {list = true}, ["categorisation"] = {list = true},
["pic"] = {}, ["file"] = {alias_of = "pic"}, ["image"] = {alias_of = "pic"}, ["picture"] = {alias_of = "pic"},
["piccap"] = {}, ["caption"] = {alias_of = "piccap"}, ["description"] = {alias_of = "piccap"}, ["desc"] = {alias_of = "piccap"},
["er"] = {}, ["erhua"] = {alias_of = "er"},
["tl"] = {}, ["toneless"] = {alias_of = "tl"}, ["tonelessvariant"] = {alias_of = "tl"}, ["variant"] = {alias_of = "tl"}, ["variation"] = {alias_of = "tl"}, ["tonelessvariation"] = {alias_of = "tl"},
["a"] = {}, ["audio"] = {alias_of = "a"}, ["listen"] = {alias_of = "a"}, ["sound"] = {alias_of = "a"}, ["pronounced"] = {alias_of = "a"},
["alt"] = {list = true}, ["alter"] = {list = true}, ["altern"] = {list = true}, ["alternate"] = {list = true}, ["alternative"] = {list = true}, ["alternativeform2"] = {list = true},
["c"] = {}, ["cant"] = {alias_of = "c"}, ["cantonese"] = {alias_of = "c"},
["mn"] = {}, ["nan"] = {alias_of = "mn"}, ["minnan"] = {alias_of = "mn"},
["w"] = {}, ["wu"] = {alias_of = "w"}, ["shanghai"] = {alias_of = "w"},
["m"] = {},
["h"] = {},
["md"] = {},
["mc"] = {},
["oc"] = {},
}
local args = require("Module:parameters").process(f:getParent().args, params)
local comp = args["type"] or ""
local pos = {}
local def = {}
for i=1,math.max(args[1].maxindex/2, args["pos"].maxindex, args["def"].maxindex) do
table.insert(pos, args[1][2*i-1] or args["pos"][i] or "")
table.insert(def, args[1][2*i] or args["def"][i] or "")
end
local function expand(arg)
local result = {}
local maximum = 0
for i=1,#arg do if #arg[i] > maximum then maximum = #arg[i] end end
local current = nil
for i=1,maximum do
current = nil
for j=1,#arg do
if current then
break
else
current = arg[j][i]
end
end
current = current or ""
table.insert(result, current)
end
return result
end
local function fetch_all(arg)
local result = {}
for i=1,#arg do
for j=1,#arg[i] do
table.insert(result,arg[i][j])
end
end
return result
end
local etyms = expand({args["e1"], args["etym1"], args["etymology1"], args["gloss"], args["meaning"]})
local ko = args["k"] or ""
local kotrans = args["kt"] or ""
local kodef = args["ke"] or def[1] or ""
local vi = args["v"] or ""
local videf = args["ve"] or def[1] or ""
local p = expand({args["p"], args["pron"], args["pronunciation"]})
local etym = args["etym"] or ""
local syn = expand({args["syn"], args["synonym"]})
local ant = expand({args["ant"], args["antonym"]})
local der = expand({args["der"], args["deriv"], args["derived"], args["derivedterm"]})
local also = expand({args["also"], args["see"], args["alsosee"], args["seealso"]})
local wp = args["wp"] or ""
local cat = fetch_all({args["cat"], args["category"], args["categories"], args["categorize"], args["categorise"], args["categorization"], args["categorisation"]})
local pic = args["pic"] or ""
local piccap = args["piccap"] or ""
local er = args["er"] or ""
local tl = args["tl"] or ""
local audio = args["a"] or ""
local alt = expand({args["alt"], args["alter"], args["altern"], args["alternate"], args["alternative"], args["alternativeform"]})
local c = args["c"] or ""
local mn = args["mn"] or ""
local w = args["w"] or ""
local m = args["m"] or ""
local h = args["h"] or ""
local md = args["md"] or ""
local mc = args["mc"] or ""
local oc = args["oc"] or ""
text = ''
if not pos[1] or pos[1] == '' then pos[1] = 'n' end
for i=1,#pos do pos[i] = checkpos(pos[i]) end
text = (text .. '==Chinese==\n')
if M.ts_determ(title) == 'simp' then
return text .. '{{zh-see|' .. M.st(title) .. ('}}\n\n[[zh:%s]]'):format(mw.title.getCurrentTitle().text)
end
length = mw.ustring.len(title)
noerhua = mw.ustring.sub(title,1,length-1)
erhua = mw.ustring.sub(title,length,length)
text = text .. (is_erhua and M.hzbox_er(title) or M.hzbox(title,comp,table.concat(etyms,'|')))
if wp ~= '' then text = (text .. '\n{{wikipedia|lang=zh}}') end
if pic ~= '' then text = (text .. '\n[[File:' .. pic .. '|thumb|250px') if piccap ~= '' then text = (text .. '|' .. piccap) end text = (text .. ']]') end
if is_erhua then
text = (text .. '\n\n===Etymology===\n{{zh-compound|' .. noerhua .. '|' .. erhua .. '|')
if def[1] and def[1] ~= '' then text = text .. def[1] end
text = (text .. "|''diminutive suffix''}}\n\n")
text = (text .. '===Pronunciation===\n{{zh-pron\n\|m=' .. M.pytemp_er(title,comp,pos[1],p) .. 'r\n|cat=' .. table.concat(pos[1],',') .. '\n}}\n\n')
else
text = (text .. '\n\n')
if #alt > 0 then
text = (text .. '===Alternative forms===')
for i=1,#alt do text = (text .. '\n* {{zh-l|' .. alt[i] .. '}}') end
text = (text .. '\n\n')
end
if etym ~= '' then text = (text .. '===Etymology===\n' .. etym .. '\n\n') end
if #etyms > 0 then
text = (text .. '===Etymology===\n')
text = (text .. '{{zh-compound|' .. M.compdecompetym(title,comp) .. '|' .. table.concat(etyms,'|') .. '}}\n\n')
end
text = (text .. '===Pronunciation===\n{{zh-pron')
if m ~= '-' then
if m ~= '' then
m_pron = m
text = (text .. '\n|m=' .. m_pron)
else
m_pron = mw.ustring.gsub(M.pytemp(title,comp,pos[1],p), ',', ', ')
text = (text .. '\n|m=' .. m_pron)
if er ~= '' then text = (text .. ',er=' .. er) end
if tl ~= '' then text = (text .. ',tl=y') end
end
end
if c == '' then c = M.check_pron(title, 'yue', length) or '' end
if length == 1 or (c ~= '' and c ~= '-') then text = (text .. '\n|c=' .. (c or "")) end
if h == '' then h = M.check_pron(title, 'hak') or '' end
if length == 1 or (h ~= '' and h ~= '-') then text = (text .. '\n|h=' .. (h and ("pfs=" .. h) or "")) end
if length == 1 or md ~= '' then text = (text .. '\n|md=' .. (md or "")) end
if mn == '' then mn = M.check_pron(title, 'nan', nil, true) or '' end
if length == 1 or (mn ~= '' and mn ~= '-') then text = (text .. '\n|mn=' .. (mn or "")) end
if length == 1 or w ~= '' then text = (text .. '\n|w=' .. (w or "")) end
if audio ~= '' then text = (text .. '\n|ma=') if audio ~= 'y' then text = (text .. audio) else text = (text .. 'y') end end
if length == 1 or mc ~= '' then text = (text .. '\n|mc=' .. (mc ~= "" and mc or 'y')) end
if length == 1 or oc ~= '' then text = (text .. '\n|oc=' .. (oc ~= "" and oc or 'y')) end
text = (text .. '\n|cat=' .. table.concat(pos,',') .. '\n}}\n\n')
end
text = (text .. '===' .. (length == 1 and "Definitions" or M.postitle(pos[1])) .. '===\n')
text = (text .. '{{zh-' .. (length == 1 and "hanzi" or M.poshead(pos[1])) .. '}}\n\n')
if is_erhua then
text = text .. '# {{context|Mandarin|lang=zh}} {{erhua form'
if def[1] and def[1] ~= '' then text = text .. '|' .. def[1] end
text = text .. '}}'
else
text = (text .. '# ' .. ((def[1] and def[1] ~= "") and def[1] or "{{rfdef|lang=zh}}"))
end
text = M.semantics(text,'Synonyms',syn)
text = M.semantics(text,'Antonyms',ant)
text = M.semantics(text,'Derived terms',der)
for i=2,#pos do
text = text .. '\n\n===' .. M.postitle(pos[i]) .. '===\n'
text = text .. '{{zh-' .. M.poshead(pos[i]) .. '}}\n\n'
if is_erhua then
text = text .. '# {{context|Mandarin|lang=zh}} {{erhua form'
if def[i] ~= '' then text = text .. '|' .. def[i] end
text = text .. '}}'
else
text = text .. '# ' .. def[i]
end
end
if #also > 0 then
text = (text .. '\n\n===See also===')
for i=1,#also do
text = (text .. '\n* {{zh-l|' .. also[i] .. '}}')
end
end
if #cat > 0 then text = (text .. '\n\n{{zh-cat|' .. table.concat(cat,'|') .. '}}') end
if ko ~= '' then
text = text .. '\n\n----\n\n==Korean==\n{{ko-hanjatab}}\n\n===Noun===\n{{ko-noun|hj|hangeul=' .. ko .. '}}\n\n# {{hanja form of|' .. ko .. '|' .. kodef .. '}}'
end
if vi ~= '' then
text = text .. '\n\n----\n\n==Vietnamese==\n{{vi-hantutab}}\n\n===' .. M.postitle(pos[1]) .. '===\n{{vi-hantu}}\n\n# {{han tu form of|' .. vi .. '|' .. videf .. '}}'
end
if not mw.title.getCurrentTitle().exists then
text = text .. ('\n\n[[zh:%s]]'):format(mw.title.getCurrentTitle().text)
end
return text
end
return M