본문으로 이동

모듈: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