모듈:한자: 두 판 사이의 차이

편집 요약 없음
편집 요약 없음
258번째 줄: 258번째 줄:
},
},
["이체자 이름"] = {
["이체자 이름"] = {
"약자", "속자", " ",
"약자", "속자", " ",
" ", " ", " ", " "
" ", " ", " ", " "
},
},
jap = {
jap = {

2021년 9월 16일 (목) 13:01 판

설명문서 [편집] [역사] [새로고침]
연습장이나 사용자 문서에서 틀의 사용이나 수정을 연습할 수 있습니다.
분류는 /설명문서에 넣어주세요.

local hanja = {}

local html = mw.html
local title_ = mw.title
local ustring = mw.ustring

local getArgs = require('Module:Arguments').getArgs

local function unicode(str)
	return 'U+0'..ustring.upper(string.format("%x", ustring.codepoint(str)))
end

function hanja.test(frame)
	return mw.title.getCurrentTitle().prefixedText	
end

function hanja.glyphStyle(frame)
	local args = getArgs(frame)
	local hanja = ustring.sub(args['한자'], -1, -1)
	local lowerCodepoint = string.format("%x", ustring.codepoint(hanja))
	local codepoint = string.upper( lowerCodepoint )
	
	local root = html.create('div'):css('display', 'flex'):addClass('hanja-style')
	local spanCss = 'display: flex;flex-direction: column;align-items: center;'
	
	local count = 0
	if title_.new('media:'..hanja..'-oracle.svg').exists then count = count + 1 -- 갑골문
		root:tag('span'):cssText(spanCss):wikitext('[[파일:'..hanja..'-oracle.svg|80px]]'):tag('div'):wikitext('갑골문')
	end
	if title_.new('media:'..hanja..'-bronze.svg').exists then count = count + 1 -- 금문
		root:tag('span'):cssText(spanCss):wikitext('[[파일:'..hanja..'-bronze.svg|80px]]'):tag('div'):wikitext('금문')
	end
	if title_.new('media:'..hanja..'-bigseal.svg').exists then count = count + 1 -- 대전
		root:tag('span'):cssText(spanCss):wikitext('[[파일:'..hanja..'-bigseal.svg|80px]]'):tag('div'):wikitext('대전')
	end
	if title_.new('media:'..hanja..'-seal.svg').exists then count = count + 1 -- 소전
		root:tag('span'):cssText(spanCss):wikitext('[[파일:'..hanja..'-seal.svg|80px]]'):tag('div'):wikitext('소전')
	end
	if title_.new('media:U'..codepoint..'.svg').exists then count = count + 1
		local file = '[[파일:U'..codepoint..'.svg|80px]]'
		root:tag('span'):cssText(spanCss):wikitext(file):tag('div'):wikitext('명조')
	elseif title_.new('media:Gw u'..lowerCodepoint..'.svg').exists then count = count + 1
		local file = '[[파일:Gw u'..lowerCodepoint..'.svg|80px]]'
		root:tag('span'):cssText(spanCss):wikitext(file):tag('div'):wikitext('명조')
	elseif title_.new('file:'..hanja..'-명조.svg').exists then count = count + 1
		local file = '[[파일:'..hanja..'-명조.svg|80px]]'
		root:tag('span'):cssText(spanCss):wikitext(file):tag('div'):wikitext('명조')
	end
	local i = 1
	while args[i] ~= nil and i < 13 do
		root:tag('span'):cssText(spanCss):wikitext('[[파일:'..args[i]..'|80px]]'):tag('div'):wikitext(args[i + 1])
		i = i + 2
		count = 1
	end
	if count ~= 0 then
		return '<h2>한자 유래/서체</h2>'..tostring(root)
	end
end

local function strokeOrder(title, hanja, style)
	local unicode = unicode(hanja)
	local file, class
	if title_.new('media:'..hanja..' - '..unicode..' - KanjiVG stroke order.svg').exists then
		class = 'NavFrame collapsed hanja-strokeorder KanjiVG'
		file = '[[파일:'..hanja..' - '..unicode..' - KanjiVG stroke order.svg|200px]]'
	elseif title_.new('media:'..hanja..' - '..unicode..'- KanjiVG stroke order.svg').exists then
		class = 'NavFrame collapsed hanja-strokeorder KanjiVG'
		file = '[[파일:'..hanja..' - '..unicode..'- KanjiVG stroke order.svg|200px]]'
	elseif title_.new('media:'..hanja..'-bw.png').exists then
		class = 'NavFrame collapsed hanja-strokeorder'
		file = '[[파일:'..hanja..'-bw.png]]'
	elseif title_.new('media:'..hanja..'-order.gif').exists then
		class = 'NavFrame collapsed hanja-strokeorder'
		file = '[[파일:'..hanja..'-order.gif|100px]]'
	else
		return title	
	end

	local root = html.create( 'div' ):addClass(class):css('border', 'none'):cssText(style)
		:tag('div'):addClass('NavHead'):wikitext(title):done()
		root:tag('div'):addClass('NavContent'):wikitext(file)
	return root
end

function hanja.strokeOrder(frame)
	local title = frame.args[1]
	local hanja = frame.args[2]
	local style = frame.args[3]
	
	return strokeOrder(title, hanja, style)
end

local function renderVariant(text, hanja, lang)
	local render = html.create("span"):addClass('variant')
	render:tag("span"):cssText("font-size: 11px; line-height: 1em;"):wikitext(text)
	render:tag("span"):attr("lang", lang):wikitext(hanja)
	return render
end

local function renderTrThTd(th, td)
	if td ~= '' then
		local render = html.create("tr")
		render:tag("th"):css("text-align", "left"):wikitext(th)
		render:tag("td"):wikitext(td)
		return render
	end
end

local function renderTrTh(th, class)
	local render = html.create("tr")
	render:tag("th"):attr("colspan", "2"):addClass(class):css("text-align", "center"):wikitext(th)
	return render
end
-- 메인 상자
local function renderLibreTab(name1, name2, name3, cont1, cont2, cont3)
	local render = html.create("div"):addClass("libre hanja-info")
		:cssText('box-shadow: 0 0.5em 1em -0.125em rgb(10 10 10 / 10%), 0 0 0 1px rgb(10 10 10 / 2%); border-radius: .25rem;')
	local libre_tab = html.create("div"):addClass("libre-tab")
		local libre_tab_btns = html.create("div"):addClass("libre-tab-btns")
			libre_tab_btns:tag("div"):addClass("libre-tab-btn"):addClass("libre-tab-btn-active"):wikitext(name1)
			libre_tab_btns:tag("div"):addClass("libre-tab-btn"):wikitext(name2)
			libre_tab_btns:tag("div"):addClass("libre-tab-btn"):wikitext(name3)
		libre_tab:node(libre_tab_btns)
		local libre_tab_main = html.create("div"):addClass("libre-tab-main")
			libre_tab_main:tag("div"):addClass("libre-tab-main-content"):addClass("libre-tab-main-content-active"):node(cont1)
			libre_tab_main:tag("div"):addClass("libre-tab-main-content"):node(cont2)
			libre_tab_main:tag("div"):addClass("libre-tab-main-content"):node(cont3)
		libre_tab:node(libre_tab_main)
	render:node(libre_tab)

	return render
end

local function japan(hanja)
	local render = html.create("table"):css("width", "100%")

	local hanja_ = html.create("td"):attr("colspan", "2"):addClass("hanja"):css("text-align", "center")
		hanja_:tag("span"):attr("lang", "ja"):wikitext(hanja["한자"])
	render:tag("tr"):node(hanja_)

	render:node(renderTrThTd("뜻(訓)", hanja["뜻"]))
	render:node(renderTrThTd("훈독(訓読)", hanja["훈독"]))
	if hanja["오음"] == '' and hanja["한음"] == '' and hanja["당음"] == '' and hanja["관용음"] == '' then
		render:node(renderTrThTd("음독(音読)", hanja["음독"]))
	else
		render:node(renderTrTh("음독(音読)", hanja["음독"]))
		render:node(renderTrThTd("오음(吳音)", hanja["오음"]))
		render:node(renderTrThTd("한음(漢音)", hanja["한음"]))
		render:node(renderTrThTd("당음(唐音)", hanja["당음"]))
		render:node(renderTrThTd("관용음", hanja["관용음"]))
	end

	render:node(renderTrThTd("[[부수]]", '[['..hanja["부수"]..']]'))
	render:node(renderTrThTd("[[유니코드]]", unicode(hanja["한자"])))

	local strokeorder = html.create("tr")
		strokeorder:tag("td"):attr("colspan", "2"):css("text-align", "center")
			:node(strokeOrder( hanja["획수"] .. "획", hanja["한자"], "" ))

	render:node(strokeorder)
	return render
end

local function simplicial(hanja)
	local render = html.create("table"):css("width", "100%")

	local hanja_ = html.create("td")
		:attr("colspan", "2")
		:addClass("hanja")
		:css("text-align", "center")
	hanja_:tag("span")
		:attr("lang", "zh-cn")
		:wikitext(hanja["한자"])

	render:tag("tr"):node(hanja_)

	render:node(renderTrThTd("뜻(訓)", hanja["뜻"]))
	render:node(renderTrThTd("중국어 병음", hanja["병음"]))
	if hanja["중고한어"] ~= "" then
		render:node(renderTrThTd("중고한어", hanja["중고한어"]))
	end
	render:node(renderTrThTd("[[부수]]", '[['..hanja["부수"]..']]'))
	render:node(renderTrThTd("[[유니코드]]", unicode(hanja["한자"])))

	local strokeorder = html.create("tr")
		strokeorder:tag("td"):attr("colspan", "2"):css("text-align", "center")
			:node(strokeOrder( hanja["획수"] .. "획", hanja["한자"], "" ))
			
	render:node(strokeorder)
	return render
end

local function traditional(hanja)
	local render = html.create("table"):css("width", "100%")

	local hanja_ = html.create("td"):attr("colspan", "2"):addClass("hanja"):css("text-align", "center")
	hanja_:tag("span"):attr("lang", "ko"):wikitext(hanja["한자"])

	if hanja["대만식"] ~= "" then
		hanja_:node(renderVariant("대만", hanja["대만식"], "zh-tw"))
	end
	render:tag("tr"):node(hanja_)

	render:node(renderTrThTd("뜻(訓)", hanja["뜻"]))
	render:node(renderTrThTd("소리(音)", hanja["소리"]))
	render:node(renderTrThTd("[[부수]]", '[['..hanja["부수"]..']]'))
	render:node(renderTrThTd("[[유니코드]]", unicode(hanja["한자"])))

	local bool
	for k in pairs(hanja["이체자"]) do
		if hanja["이체자"][k] ~= "" then
			bool = 1
			break
		end
	end

	if bool == 1 then
		local hanja_variant = html.create("tr")
			:tag("th")
			:css("text-align", "left")
			:wikitext("이체자")
		local hanja_variants = html.create("span")
			:addClass('variants')

		local i = 1
		while i < 6 do
			if hanja["이체자"][i] ~= '' then
				hanja_variants:node(renderVariant(hanja["이체자 이름"][i], hanja["이체자"][i], "ko"))
			end
			i = i + 1
		end
		hanja_variant:tag("td"):node(hanja_variants)
		render:node(hanja_variant)
	end
		
	local strokeorder = html.create("tr")
		strokeorder:tag("td"):attr("colspan", "2"):css("text-align", "center")
			:node(strokeOrder( hanja["획수"] .. "획", hanja["한자"], "" ))
		render:node(strokeorder)

	return render
end

function hanja.info(frame)
	local args = getArgs(frame)
	local fullpagename = title_.getCurrentTitle().prefixedText
	
	local hanja = {
		["한자"] = args["한자"] or " ",
		["뜻"] = args["뜻"] or " ",
		["소리"] = args["소리"] or " ",
		["부수"] = args["부수"] or " ",
		["획수"] = args["획수"] or " ",
		["대만식"] = args["정체자"] or args["대만식"] or "",
		["이체자"] = {
			args["약자"] or "",	args["속자"] or "",	args["이체자"] or args["이체자1"] or "", args["이체자2"] or "",
			args["이체자3"] or "", args["이체자4"] or "", args["이체자5"] or ""
		},
		["이체자 이름"] = {
			"약자", "속자", "&nbsp;",
			"&nbsp;", "&nbsp;", "&nbsp;", "&nbsp;"
		},
		jap = {
			["한자"] = args["신자체"] or args["한자"] or " ",
			["뜻"] = args["뜻"] or " ",
			["훈독"] = args["훈독"] or "",
			["음독"] = args["음독"] or "",
			["오음"] = args["오음"] or "",
			["한음"] = args["한음"] or "",
			["당음"] = args["당음"] or "",
			["관용음"] = args["관용음"] or "",
			["획수"] = args["신자체 획수"] or args["획수"] or " ",
			["부수"] = args["신자체 부수"] or args["부수"] or " "
		},
		simp = {
			["한자"] = args["간체자"] or args["한자"] or " ",
			["뜻"] = args["뜻"] or " ",
			["병음"] = args["병음"] or " ",
			["중고한어"] = args["중고한어"] or "",
			["획수"] = args["간체자 획수"] or args["획수"] or " ",
			["부수"] = args["간체자 부수"] or args["부수"] or " "
		}
	}
	
	local css
	local root
	
	if fullpagename == '시리즈:리브레 한자사전/음으로 찾기' then
		local EducatinalHanja = require('Module:한자/data').isEducatinalHanja
		root = html.create('li'):addClass("hanja-info-head")
			:css('display', 'block')
			root:tag('span')
				:addClass("hanja"..' '..EducatinalHanja(hanja["한자"]))
				:wikitext('【[[시리즈:리브레 한자사전/'..hanja["한자"]..'|'..hanja["한자"]..']]】')
			root:tag('span')
				:addClass('mean')
				:wikitext(hanja["뜻"]..'〔'..hanja["소리"]..'〕')

		return root
	else
		root = html.create('div'):addClass("hanja-info-head")
		css = args['css']
	end
	
	if args['모드'] == '한자' then
		root:tag('span')
			:addClass('hanja')
			:wikitext('[['..hanja["한자"]..']]'..css)
		return root

	elseif args['모드'] == '신자체' or args[1] == '일본어' then
		root:tag('span')
			:addClass('hanja')
			:attr('lang', 'ja')
			:css('font-family', 'Noto Serif CJK KR, serif')
			:wikitext('[['..hanja.jap["한자"]..']]'..css)
		return root

	elseif args['모드'] == '훈음'then
		root:tag('span')
			:addClass('hanja')
			:wikitext('[['..hanja["한자"]..']]')
		root:tag('span')
			:addClass('mean')
			:wikitext(' '..hanja["뜻"]..'〔'..hanja["소리"]..'〕'..css)
		return root

	elseif args['모드'] == '풀이' then 
		return ''
		
	else
		if ustring.find( fullpagename, '시리즈:리브레 한자사전') then
			if args['상위문서x'] == nil then
				root:wikitext(args['parent'])
			end
			if args['미분류'] == nil then
				root:wikitext('[[분류:한자/문자|'..hanja["소리"]..']]')
			else
				root:wikitext('[[분류:한자/문자|*]]')
			end
		end
		root:tag('span')
			:addClass('hanja')
			:wikitext('[['..hanja["한자"]..']]')
		root:tag('span')
			:addClass('mean')
			:wikitext(' '..hanja["뜻"]..'〔'..hanja["소리"]..'〕__NOTOC__'..css)
	end

	if args["기본"] == "중국어" or args['기본'] == '간체자' then
		return tostring(root)..tostring(renderLibreTab(
			"간체자[中]",
			"정자[韓/臺]",
			"신자체[日]",
			simplicial(hanja.simp),
			traditional(hanja),
			japan(hanja.jap)))
	elseif args["기본"] == "일본어" or args['기본'] == '신자체' then
		return tostring(root)..tostring(renderLibreTab(
			"신자체[日]",
			"정자[韓/臺]",
			"간체자[中]",
			japan(hanja.jap),
			traditional(hanja),
			simplicial(hanja.simp)))
	else
		return tostring(root)..tostring(renderLibreTab(
			"정자[韓/臺]",
			"신자체[日]",
			"간체자[中]",
			traditional(hanja),
			japan(hanja.jap),
			simplicial(hanja.simp)))
	end
end

function hanja.flexlist(frame)
    local args = getArgs(frame)
    local i = 1
    local list = html.create('div'):addClass('hanja-list-flex')
    
    while args[i] do
    	--local hanja = ustring.match(args[i], '%S+')
    	--local name = ustring.match(args[i], '%s.+')
    	local _ = html.create('div')
    	_:tag('div'):wikitext(args[i])
    	_:tag('div'):wikitext(args[i + 1])
        list:node(_)
        i = i + 2
    end
    return list
end


return hanja