Modul:ko

Üdvözlöm, Ön a Modul:ko szó jelentését keresi. A DICTIOUS-ban nem csak a Modul:ko szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a Modul:ko szót egyes és többes számban mondani. Minden, amit a Modul:ko szóról tudni kell, itt található. A Modul:ko szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. AModul:ko és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

A modult a Modul:ko/doc lapon tudod dokumentálni

local M = {}
local gsub = mw.ustring.gsub
local match = mw.ustring.match

local lang = require("Module:languages").getByCode("ko")

-- makes hanjatab automatically
function M.hanjatab()
	local hanja = mw.ustring.gsub(mw.title.getCurrentTitle().text, '', '')
		local table_head = '<table class="floatright wikitable" style="text-align:center; font-size:small;"><tr><th colspan="' .. 
		mw.ustring.len(hanja) .. 
		'" style="font-weight:normal;">] in this term</th></tr><tr lang="ko" class="Kore" style="font-size:2em; background:white; line-height:1em;">'
	return table_head .. 
		mw.ustring.gsub(hanja, '(.)', '<td style="padding:0.5em;">]</td>') .. 
		'</tr></table>'
end

-- return only non-hangeul contained in text
function M.remove_hangeul(f)
	local nonhangeul = mw.ustring.gsub(f.args, '', '')
	return nonhangeul
end

function M.boldify(f)
	local pagename = mw.title.getCurrentTitle().text
	hangul = f.args
	if match(hangul, pagename) and not match(hangul, "'") then
		hangul = gsub(hangul, pagename, "'''" .. pagename .. "'''")
	end
	return hangul
end

function M.usex_hangul(f)
	local pagename = mw.title.getCurrentTitle().text
	hangul = f.args
	if match(hangul, pagename) and not match(hangul, "'") then
		hangul = gsub(hangul, pagename, "'''" .. pagename .. "'''")
	end
	i = 1
	local front, back = '<span style="background&#45;color:#FEF8EA"><b>', '</b></span>'
	for bold in mw.ustring.gmatch(hangul, "'''") do
		hangul = gsub(hangul, "'''", (i % 2 == 1 and front or back), 1)
		i = i + 1
	end
	hangul = gsub(hangul, '', '')
	return hangul
end

function M.link(frame)
	local arg = frame:getParent().args
	local args, distances = {}, {}
	local m_pron = require("Module:ko-translit")
	local curr_distance, closest_match = 1000, 0
	local word, translit, definition, hanja, note = false, false, false, false, false
	
	for i = 1, 4, 1 do
		if arg and arg ~= "" then
			table.insert(args, arg)
		end
	end

	local curr_hangul_level, closest_hangul = 0, 0
	for i, parameter in ipairs(args) do
		-- \225\132\128-\225\135\191 is the code point range U+1100-11FF,
		-- the Hangul Jamo block.
		local _, tentative_hangul_level = gsub(parameter, "", "")
		if tentative_hangul_level > curr_hangul_level then
			curr_hangul_level = tentative_hangul_level
			closest_hangul = i
		end
	end

	if curr_hangul_level > 0 then
		word = args
		table.remove(args, closest_hangul)
	end
	
	local function compute_distance(str1, str2)
		local len1, len2 = #str1, #str2
		local char1, char2, distance = {}, {}, {}
		
		str1:gsub('.', function (c)
			table.insert(char1, c) end)
		
		str2:gsub('.', function (c)
			table.insert(char2, c) end)
		
		for i = 0, len1 do
			distance = {}
		end
		
		for i = 0, len1 do
			distance = i
		end
		
		for i = 0, len2 do
			distance = i
		end
		
		for i = 1, len1 do
			for j = 1, len2 do
				distance = math.min(
					distance + 1,
					distance + 1,
					distance + (char1 == char2 and 0 or 1)
				)
			end
		end
	
		return distance
	end
	
	local m_link = require("Module:links")
	local test_translit = m_pron.tr_revised(m_link.remove_links(word or arg)) or ""
	
	if arg and arg ~= "" then
		note = arg
	end
	
	if arg then
		definition = arg
		arg = nil
	end
	
	for i, parameter in ipairs(args) do
		-- \239\164\128-\239\171\153 is the code point range U+F900-FADF,
		-- the CJK Compatibility Ideographs block.
		if not match(parameter, '') then
			local tentative_distance = compute_distance(test_translit, parameter)
			if tentative_distance < curr_distance then
				curr_distance = tentative_distance
				closest_match = i
			end
		end
	end

	if curr_distance < 3 and #args > 1 then
		translit = args
		table.remove(args, closest_match)
	end

	for i, parameter in ipairs(args) do
		if match(parameter, "") then
			hanja = parameter
			table.remove(args, i)
		end
	end
	
	if not hanja and not word then
		word = args
		table.remove(args, 1)
	end
	
	if #args > 1 then
		translit = args
		definition = args
	
	elseif #args > 0 then
		if definition then
			translit = args
		else
			definition = args
		end
	end
	
	if hanja and not match(hanja, "]") then
		for hanja_word in mw.ustring.gmatch(hanja, "+") do
			hanja = gsub(hanja, hanja_word, "]")
		end
		for hangul_word in mw.ustring.gmatch(hanja, "+") do
			hanja = gsub(hanja, hangul_word, "]")
		end
		hanja = gsub(hanja, "%[%[%[%[", "[[")
		hanja = gsub(hanja, "%]%]%]%]", "]]")
	end
	
	if arg or translit or test_translit then
		translit = '<span lang="ko-Latn" class="mention-tr tr Latn">' .. 
			(arg or translit or test_translit) .. "</span>"
	end
	
	if definition then
		if not match(definition, "^''.+''$") then definition = "“" .. definition .. "”" end
	end
	
	if hanja then
		hanja = '<span lang="ko" class="Kore">' .. m_link.language_link({lang = lang, term = hanja}, true) .. '</span>'
	end

	word = gsub(word, "%^", "")
	
	if not match(word, "]") then
		if match(word, "^—.+—$") then
			word = gsub(word, "—(.+)—", "—]—")
			
		elseif match(word, "^—.+$") then
			word = gsub(word, "—(.+)", "—]")
			
		elseif match(word, "^.+—$") then
			word = gsub(word, "(.+)—", "]")
		
		elseif match(word, "^.+–$") then
			word = gsub(word, "(.+)–", "]—")
		
		elseif match(word, "^\*") then
			word = gsub(word, "\*", "")
		
		else
			word = "]"
		end
	end
	
	local info = {}
	table.insert(info, word and (hanja or nil) or nil)
	table.insert(info, translit or nil)
	table.insert(info, definition or nil)

	local result = word
		and
			("<span lang=\"ko\" class=\"Kore\">" .. word .. "</span>")
		or
			('<span lang="ko" class="Kore">' .. m_link.language_link({lang = lang, term = hanja}, true) .. '</span>')
	
	if #info > 0 then
		result = result .. " (" .. table.concat(info, ", ") .. ")"
	end
	
	if note then
		result = result .. " (<i>" .. note .. "</i>)"
	end
	
	return result
end

function M.new(frame)
	local title = mw.title.getCurrentTitle().text
	local args = frame:getParent().args
	local pos = args or ""
	local def = args or "{{rfdef|ko}}"
	local pos2 = args or (args and "" or false)
	local def2 = args or "{{rfdef|ko}}"
	local pos3 = args or (args and "" or false)
	local def3 = args or "{{rfdef|ko}}"
	local etym = args or false
	local head = args or false
	local cat = args or false
	local image = args or false
	local caption = args or false
	local pedia = args or false
	local irreg = args or false
	
	local result = ""
	
	local function genTitle(text)
		local pos_title = {
			 = "Noun",  = "Noun",  = "Proper noun",  = "Proper noun",  = "Pronoun",
			 = "Verb",  = "Adjective",  = "Adjective",  = "Adverb",
			 = "Preposition",  = "Postposition",  = "Conjunction",
			 = "Particle",  = "Suffix",
			 = "Proverb",  = "Idiom",  = "Phrase",  = "Interjection",  = "Interjection",
			 = "Classifier",  = "Classifier",  = "Numeral",  = "Abbreviation",
			 = "Determiner",  = "Determiner",  = "Root",
		};
		return pos_title or mw.ustring.upper(mw.ustring.sub(text, 1, 1)) .. mw.ustring.sub(text, 2, -1)
	end
	
	local function genHead(text)
		local pos_head = {
			 = "noun",  = "noun",  = "proper noun",  = "proper noun",  = "verb",  = "adj",  = "adv",
			 = "pos|post",  = "pos|con",  = "pos|particle",  = "pos|pronoun",
			 = "proverb",  = "pos|idiom",  = "pos|phrase",  = "interj",
			 = "pos|abbr",  = "pos|cls",  = "det",  = "det",  = "root",  = "num",
		};
		return pos_head or "pos|" .. text
	end
	
	local function other(class, title, args, level)
		local code = ""
		if args then
			code = code .. "\n\n" .. level .. title .. level .. "\n* {{ko-l|" .. gsub(args, ":", "|") .. "}}"
			i = 2
			while args do
				code = code .. "\n* {{ko-l|" .. gsub(args, ":", "|") .. "}}"
				i = i + 1
			end
		end
		return code
	end
	
	if args or args or args or args or args or args or args then
		multiEtym = true
	end
	
	local function iterate_param(args, genPos, etymNo)
		if genPos == "proper noun" then args = "y" end
		text = ""
		for _, arg in ipairs( { "l", "com", "nn", "ui", "nobc", "cap", "ni", "bcred", "a", "uie" } ) do
			if etymNo > 1 then arg_temp = etymNo .. arg else arg_temp = arg end
			if args then text = text .. "|" .. arg .. "=" .. args end
		end
		return text
	end
	
	local function add_etym(args, etymNo)
		etymText = ""
		n = etymNo > 1 and etymNo or ""
		if args then etymText = etymText .. args
		elseif args then etymText = etymText .. "{{ko-etym-sino|" .. args .. (args and "|" .. args or "") .. "}}."
		elseif args then etymText = etymText .. "{{ko-etym-native|" .. gsub(args, ",", "|") .. "}}"
		elseif args then etymText = etymText .. "From {{bor|ko|" .. (args or "en") .. "|" .. args .. "}}."
		elseif args then etymText = etymText .. 
			"{{ko-l|" .. args .. (args and "|" .. args or "") .. (args and "|" .. args or "") .. "}}" ..
			" + {{ko-l|" .. args .. (args and "|" .. args or "") .. (args and "|" .. args or "") .. "}}" ..
			(args and " + {{ko-l|" .. args .. (args and "|" .. args or "") .. (args and "|" .. args or "") .. "}}" or "") .. 
			(args and " + {{ko-l|" .. args .. (args and "|" .. args or "") .. (args and "|" .. args or "") .. "}}" or "") .. "."
		elseif mw.ustring.match(title, "다$") then
			etymText = etymText .. "From " .. (args and "the root " or "") .. "{{ko-l|" .. mw.ustring.sub(title, 1, -3) .. (args and "|" .. args or "") .. (args and "|" .. args or "") .. "}}" .. 
			" + the suffix {{ko-l|—" .. mw.ustring.sub(title, -2, -1) .. "}}."
		elseif mw.ustring.match(title, "시키다$") or mw.ustring.match(title, "스럽다$") then
			etymText = etymText .. "From " .. (args and "the root " or "") .. "{{ko-l|" .. mw.ustring.sub(title, 1, -4) .. (args and "|" .. args or "") .. (args and "|" .. args or "") .. "}}" .. 
			" + the suffix {{ko-l|—" .. mw.ustring.sub(title, -3, -1) .. "}}."
		end
		return etymText
	end
	
	result = result .. "==Korean=="
	if pedia then result = result .. "\n{{wp|lang=ko" .. (pedia ~= "y" and "|" .. pedia or "") .. "}}" end
	if image then result = result .. "\n]" end
	result = result .. other("alt", "Alternative forms", args, "===")
	
	if mw.ustring.match(title, "다$") or mw.ustring.match(title, "시키다$") or mw.ustring.match(title, "스럽다$") then autoEtym = true end
	if args or args or args or args or args or args or args or autoEtym then
		etym = "\n\n===Etymology" .. (multiEtym and " 1" or "") .. "===\n"
		etym = etym .. add_etym(args, 1)
	end
	
	if etym then result = result .. etym end
	level = multiEtym and "====" or "==="
	result = result .. other("1alt", "Alternative forms", args, "====")
	
	result = result .. "\n\n" .. level .. "Pronunciation" .. level ..
	"\n{{ko-IPA" .. iterate_param(args, genHead(pos), 1) .. "}}"
	if genHead(pos) == "root" then def = "{{ko-root of|" .. def .. "}}" end
	result = result .. "\n\n" .. level .. genTitle(pos) .. level .. "\n{{ko-" .. genHead(pos) ..
	(head and ("|head=" .. head) or "") .. (args and ("|hanja=" .. args) or "") ..
	(irreg and "|irreg=y" or "") .. "}}\n\n# " .. def
	
	local function add_der(args, etymNo, hanja)
		n = etymNo > 1 and etymNo or ""
		local translDer = {  = "하다",  = "되다",  = "시키다" }
		if args and gsub(args, "", "") == "" then
			i = 1
			for ch in mw.text.gsplit(args, "") do
				args = title .. translDer .. 
					(hanja and ":" .. hanja .. "—" or "")
				i = i + 1
			end
		end
		return args
	end
	
	args = add_der(args, 1, args or false)
	result = result .. other("syn", "=Synonyms=", args, level)
	result = result .. other("ant", "=Antonyms=", args, level)
	result = result .. other("der", "=Derived terms=", args, level)
	result = result .. other("rel", "=Related terms=", args, level)
	result = result .. other("also", "=See also=", args, level)
	if genHead(pos) == "adj" or genHead(pos) == "verb" then
		result = result .. "\n\n=" .. level .. "Conjugation" .. level .. "=\n{{ko-conj/" .. genHead(pos) .. (irreg and "|irreg=y" or "") .. "}}"
	end
	
	if pos2 then
		if multiEtym then
			result = result .. "\n\n===Etymology 2===\n" .. add_etym(args, 2)
			level = "===="
			result = result .. other("2alt", "Alternative forms", args, level)
			
			result = result .. "\n\n" .. level .. "Pronunciation" .. level .. 
			"\n{{ko-IPA" .. iterate_param(args, genHead(pos), 2) .. "}}"
			if genHead(pos2) == "root" then def2 = "{{ko-root of|" .. def2 .. "}}" end
			result = result .. "\n\n" .. level .. genTitle(pos2) .. level .. "\n{{ko-" .. genHead(pos2) ..
			(head and ("|head=" .. head) or "") .. (args and ("|hanja=" .. args) or "") .. "}}\n\n# " .. def2
			args = add_der(args, 2, args or false)
			result = result .. other("2syn", "=Synonyms=", args, level)
			result = result .. other("2ant", "=Antonyms=", args, level)
			result = result .. other("2der", "=Derived terms=", args, level)
			result = result .. other("2rel", "=Related terms=", args, level)
			result = result .. other("2also", "=See also=", args, level)
			if genHead(pos2) == "adj" or genHead(pos2) == "verb" then
				result = result .. "\n\n=" .. level .. "Conjugation" .. level .. "=\n{{ko-conj/" .. genHead(pos2) .. (irreg and "|irreg=y" or "") .. "}}"
			end

		else
			result = result .. "\n\n===" .. genTitle(pos2) .. "===\n{{ko-" .. genHead(pos2) ..
			(head and ("|head=" .. head) or "") .. (args and ("|hanja=" .. args) or "") .. 
			"}}\n\n# " .. def2
			if genHead(pos2) == "adj" or genHead(pos2) == "verb" then
				result = result .. "\n\n====Conjugation====\n{{ko-conj/" .. genHead(pos2) .. (irreg and "|irreg=y" or "") .. "}}"
			end
		end
	end
	
	if pos3 then
		if multiEtym then
			result = result .. "\n\n===Etymology 3===\n" .. add_etym(args, 3)
			level = "===="
			result = result .. other("3alt", "Alternative forms", args, level)
			
			result = result .. "\n\n" .. level .. "Pronunciation" .. level .. 
			"\n{{ko-IPA" .. iterate_param(args, genHead(pos), 3) .. "}}"
			if genHead(pos3) == "root" then def3 = "{{ko-root of|" .. def3 .. "}}" end
			result = result .. "\n\n" .. level .. genTitle(pos3) .. level .. "\n{{ko-" .. genHead(pos3) ..
			(head and ("|head=" .. head) or "") .. (args and ("|hanja=" .. args) or "") .. "}}\n\n# " .. def3
			args = add_der(args, 3, args or false)
			result = result .. other("3syn", "=Synonyms=", args, level)
			result = result .. other("3ant", "=Antonyms=", args, level)
			result = result .. other("3der", "=Derived terms=", args, level)
			result = result .. other("3rel", "=Related terms=", args, level)
			result = result .. other("3also", "=See also=", args, level)
			if genHead(pos3) == "adj" or genHead(pos3) == "verb" then
				result = result .. "\n\n=" .. level .. "Conjugation" .. level .. "=\n{{ko-conj/" .. genHead(pos3) .. (irreg and "|irreg=y" or "") .. "}}"
			end
		else
			result = result .. "\n\n===" .. genTitle(pos3) .. "===\n{{ko-" .. genHead(pos3) ..
			(head and ("|head=" .. head) or "") .. (args and ("|hanja=" .. args) or "") .. 
			"}}\n\n# " .. def3
			if genHead(pos3) == "adj" or genHead(pos3) == "verb" then
				result = result .. "\n\n====Conjugation====\n{{ko-conj/" .. genHead(pos3) .. (irreg and "|irreg=y" or "") .. "}}"
			end
		end
	end
	
	if cat then
		result = result .. "\n\n{{C|ko|" .. cat .. "}}"
	end
	
	return result
end

function M.decompose_jamo(syllable)
	if not match(syllable, "") then
		if match(syllable, "") then return { initial = syllable, vowel = "Ø", final = "Ø" }
		elseif match(syllable, "") then return { initial = "Ø", vowel = syllable, final = "Ø" }
		elseif match(syllable, "") then return { initial = "Ø", vowel = "Ø", final = syllable }
		elseif match(syllable, "") then return { initial = "Ø", vowel = "Ø", final = syllable }
		else return { initial = "Ø", vowel = " ", final = "X" } end
	end
	local char = mw.ustring.char
	local cp = mw.ustring.codepoint(syllable)
	if not cp then return { "", "", "" } end
	local relative_cp = cp - 0xAC00
	local jongseong = relative_cp % 28
	local jungseong = math.floor((relative_cp % 588) / 28)
	local choseong = math.floor(relative_cp / 588)
	choseong, jungseong, jongseong = 
		char(0x1100 + choseong), 
		char(0x1161 + jungseong), 
		jongseong ~= 0 and char(0x11A7 + jongseong) or ""
	return { initial = choseong, vowel = jungseong, final = jongseong }
end

return M