모듈:dercat
보이기
이 모듈에 대한 설명문서는 모듈:dercat/설명문서에서 만들 수 있습니다
local export = {}
local etymology_module = "Module:etymology"
local parameters_module = "Module:parameters"
local utilities_module = "Module:utilities"
local insert = table.insert
local require = require
--[==[
다른 모듈의 함수를 로드하는 로더입니다. 필요할 때만 모듈을 로드하도록 하여 성능을 최적화합니다.
처음 호출된 후에는 대상 함수를 직접 호출하므로 오버헤드가 없습니다.
]==]
local function check_ancestor(...)
check_ancestor = require(etymology_module).check_ancestor
return check_ancestor(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
local function language_or_string(val)
return val == "<" and "string" or "language"
end
function export.dercat(frame)
local args = process_params(frame:getParent().args, {
[1] = {required = true, type = "full language"},
[2] = {list = true, required = true, type = language_or_string, family = true},
["inh"] = {type = "number"},
})
local target_lang, langs, categories, cutoff = args[1], args[2], {}
local target_lang_code, target_lang_name = target_lang:getCode(), target_lang:getCanonicalName()
for i = 1, #langs do
local source_lang = langs[i]
if source_lang == "<" then
-- "inh"와 "<"를 함께 사용하는 것을 금지합니다.
if args.inh then
error(("'<'가 설정된 경우(매개변수 %d 확인) 'inh' 매개변수를 지정할 수 없습니다. 둘 중 하나만 사용하십시오."):format(i))
-- 여러 개의 "<"를 사용하는 것을 금지합니다.
elseif cutoff then
-- Collate keys for all "<"s in the input; all keys need to be offset by 1, since args[1] isn't in the table.
local lt = {cutoff + 1, i + 1}
while langs[i] do
i = i + 1
if langs[i] == "<" then
insert(lt, i + 1)
end
end
error(("'<'는 한 번만 지정할 수 있지만, 현재 매개변수 %s에서 여러 번 사용되었습니다."):format(mw.text.listToText(lt)))
end
cutoff = i
-- 지금까지 나온 모든 언어에 대해 물려받음 분류를 추가합니다.
for j = 1, i - 1 do
local inh_source_lang = langs[j]
check_ancestor(target_lang, inh_source_lang)
insert(categories, j * 2, inh_source_lang:getDisplayForm() .. "에서 물려받은 " .. target_lang_name .. " 낱말")
end
else
-- "파생" 분류를 생성합니다. 언어가 자신에게서 파생된 특수한 경우를 처리합니다.
insert(categories, (target_lang_code == source_lang:getCode() and
source_lang:getCanonicalName() .. "으로 다시 차용된 " .. target_lang_name .. " 낱말" or
source_lang:getDisplayForm() .. "에서 파생된 " .. target_lang_name .. " 낱말"
))
if args.inh and i <= args.inh then
check_ancestor(target_lang, source_lang)
insert(categories, inh_source_lang:getDisplayForm() .. "에서 물려받은 " .. target_lang_name .. " 낱말")
end
end
end
return format_categories(categories, target_lang)
end
return export