모듈:한자 정보

설명문서 [편집] [역사] [새로고침]

샘플[원본 편집]

정자[韓/臺]
일본어[日]
중국어[中]
CJK Unified Ideographs

U+6F22

부 14획
뜻과 소리한나라
중고한어hɑnH
어문회 급수준7급
이체자대만
쓰는 순서
漢-order.gif
CJK Unified Ideographs

U+6F22

부 13획
뜻과 소리한나라
훈독(読)おとこ、あや、から
음독(音読)
오음(呉音)カン
한음(漢音)カン
쓰는 순서
漢-order.gif
CJK Unified Ideographs

U+6C49

부 5획
뜻과 소리한나라
병음hàn
쓰는 순서
汉-bw.png

한나라

연습장이나 사용자 문서에서 틀의 사용이나 수정을 연습할 수 있습니다.
분류는 /설명문서에 넣어주세요.

local p = {}
local mw = mw
local html = mw.html
local title_ = mw.title
local ustring = mw.ustring

---return 'U+ABCD'
---@param str string
---@return string
local function tounicode(str)
	return 'U+' .. string.format('%x', ustring.codepoint(str)):upper()
end

---------------------------------------------------------------------------------------------------------
function p.main(frame) return p:main_(frame) end

function p:main_(frame)
	local args = require('Module:Arguments').getArgs(frame)

	local header = { mean_sound = {} }
	header.mean_sound.html = html.create('p'):addClass('hanja-info-header hanja-mean-sound')
	function header.mean_sound:tostring() return tostring(self.html) end

	header.projectlink = ""

	local lang = args[1]
	-- 1번 변수에 값이 있을 때 우선 처리 -------------------------------------------------------------
	if lang == '한자만' then
		return header.mean_sound.html:addClass('onlyhanja')
			:tag('span'):addClass('hanja')
			:wikitext('[[', args['한자'], ']]'):done()
	elseif lang == '신자체 글자만' or lang == '일본어 글자만' then
		return header.mean_sound.html:addClass('onlyhanja')
			:tag('span'):addClass('hanja')
			:wikitext(frame:preprocess {
				text = '{{일본어=|[[' .. (args['신자체'] or args['한자'] or '') .. ']]}}' }):done()
	end

	---------------------------------------------------------------------------------------------------------
	---------- 수행
	local hanja = {
		char = args['한자'] or '',
		-- codepoint 65535를 넘어가는지 체크할 변수, unicode의 예 U+10000
		codepoint = ustring.codepoint(args['한자']),
		unicode = tounicode(args['한자']),
		mean = args['뜻'] or '',
		sound = args['소리'] or '-',
		mean_sound = args['뜻 소리'],
		rating = args['급수'] or args['어문회급수']
	}

	if hanja.mean_sound then
		hanja.sound = hanja.mean_sound:match('%[([^]]*)')
		hanja.mean = mw.text.trim(hanja.mean_sound:match('([^[]*) %['))
		hanja.mean_sound = ustring.format('<span class="mean">%s</span>', hanja.mean_sound:gsub('%[', '<i>'):gsub('%]', '</i>'))
	else
		hanja.mean_sound = ustring.format('%s <i>%s</i>', hanja.mean, hanja.sound)
	end

	---------------------------------------------------------------------------------------------------------
	---------- 분류 정렬키 조작
	local currentPage = mw.text.split(title_.getCurrentTitle().prefixedText, '/')
	local pageName = { currentPage[1], currentPage[2] or '' }
	local inProject = false

	if pageName[1] == '시리즈:리브레 한자사전' and (hanja.char == pageName[2] or hanja.unicode == pageName[2]) then
		inProject = true
	end

	function header.mean_sound:Build()
		self.html:wikitext('<span class="hanja">[[', hanja.char, ']]</span> ')

		if lang == "간체자만" or lang == "중국어만" then
			self.html:wikitext('<span class="mean"> ', hanja.inChina.pinyin or '', '</span>')
		else
			self.html:node(hanja.mean_sound)
		end

		if inProject then
			-- 이름공간 식별

			self.html:addClass('is-hanja-dict')

			self.html:wikitext("[[분류:", hanja.char, "| ]][[분류:한자/문자]]")

			if args['부수'] then
				self.html:wikitext("[[분류:", args['부수'], "|", (args['부수'] == pageName[2]) and ' ' or '-', ']]')
			end

			-- 기본 정렬키 = 미분류거나 소리없음 ? 한/한자 : '-'
			if hanja.sound == '-' or args['미분류'] then
				self.html:wikitext(frame:preprocess("{{DEFAULTSORT:" ..
				string.gsub(hanja.sound .. hanja.char, ' ', '') .. "}}"))
			else
				self.html:wikitext(frame:preprocess("{{DEFAULTSORT:-}}"))
			end

			if hanja.rating then
				self.html:wikitext('[[분류:', hanja.rating, ' 한자]]')
			end
		end
	end

	header.mean_sound:Build()

	if inProject then
		if hanja.rating then
			hanja.rating = (hanja.rating:find("급") == nil) and hanja.rating .. "급" or hanja.rating
		end

		if not args['상위문서x'] then
			header.projectlink = require('Module:한자 정보/구현').projectlink:tostring()
		end
	end

	local wikitable = require('Module:표')
	local strokeOrder = require('Module:한자/획순').strokeOrder_
	local unicodeBox = require('Module:한자 정보/구현').unicodeBox

	local new = function(char, strokes, strokeOrderFile, radical)
		local self = {
			char = nil,
			strokes = nil,
			radical = nil,
			strokeOrderFile = nil,
			content = '',
			title = ''
		}
		self.char = char;
		self.strokes = strokes;
		self.strokeOrderFile = strokeOrderFile;
		self.radical = radical

		---@param key string
		---@param value any
		function self:setKeyValue(key, value)
			self[key] = value
		end

		return self
	end

	hanja.inKorea = new(
		args['한자'] or '',
		args['획수'] or '',
		args['획순파일'] or 'norm',
		args['부수'] or '')

	hanja.inChina = new(
		args['간체자'] or hanja.char,
		args['간체자 획수'] or hanja.inKorea.strokes,
		args['간체자획순파일'],
		args['간체자 부수'] or hanja.inKorea.radical)

	hanja.inChina:setKeyValue('pinyin', args['병음'])

	hanja.inJapan = new(
		args['신자체'] or hanja.char,
		args['신자체 획수'] or hanja.inKorea.strokes,
		args['신자체획순파일'],
		args['신자체 부수'] or hanja.inKorea.radical)

	function hanja.inChina:makeHTML()
		wikitable:setClass("hanja-info-table")
			:appendTd(unicodeBox(self.char, 'zh-cn'), 'unicodechar')
			:appendTd(string.format('[[%s]]부 %s획', self.radical, self.strokes), 'unicodechar-sub')
			:appendThTd('뜻과 소리', hanja.mean_sound, 'mean_sound')
			:appendThTd('병음', self.pinyin)
			:appendTd(strokeOrder("쓰는 순서", self.char, self.strokeOrderFile))
		self.title = '중국어[中]'
		self.content = wikitable:ret()
		wikitable:clear()
	end

	function hanja.inJapan:makeHTML()
		wikitable:setClass("hanja-info-table")
			:appendTd(unicodeBox(self.char, 'ja'), 'unicodechar')
			:appendTd(string.format('[[%s]]부 %s획', self.radical, self.strokes), 'unicodechar-sub')
			:appendThTd('뜻과 소리', hanja.mean_sound, 'mean_sound')
			:appendThTd('훈독(<span lang="ja">訓</span>読)', args['훈독'])

		if args['오음'] or args['한음'] or args['당음'] or args['관용음'] then
			wikitable:appendTh('음독(<span lang="ja">音読</span>)')
				:appendThTd('오음(<span lang="ja">呉音</span>)', args['오음'])
				:appendThTd('한음(<span lang="ja">漢音</span>)', args['한음'])
				:appendThTd('당음(<span lang="ja">唐音)', args['당음'])
				:appendThTd('관용음', args['관용음'])
		else
			wikitable:appendThTd('음독(<span lang="ja">音読</span>)', args['음독'])
		end

		wikitable:appendTd(strokeOrder("쓰는 순서", self.char, self.strokeOrderFile))
		self.content = wikitable:ret()
		self.title = '일본어[日]'
		wikitable:clear()
	end

	function hanja.inKorea:makeHTML()
		local hanja_variants = html.create('span'):addClass('variants')
		local hasAlter = false
		local function renderVariant(caption, hanja_, langcode)
			if hanja_ then
				return html.create('span'):addClass('variant')
					:tag('span'):cssText('font-size: 11px; line-height: 1em;'):wikitext(caption):done()
					:tag('span'):attr('lang', langcode):wikitext(hanja_):done()
			else
				return ''
			end
		end

		hanja.inTaiwan = args['정체자'] or args['대만식']
		if hanja.inTaiwan then
			hanja_variants:node(renderVariant('대만', hanja.inTaiwan, 'zh-tw'))
			hasAlter = true
		end

		local alterForm = {
			{ args['약자'], '약자' }, { args['속자'], '속자' },
			{ args['본자'], '본자' }, { args['고자'], '고자' },
			{ args['이체자'], '&nbsp;' }
		}

		for _, elem in pairs(alterForm) do
			if elem[1] then
				hasAlter = true
				hanja_variants:node(renderVariant(elem[2], elem[1], 'ko'))
			end
		end

		if hasAlter == false then hanja_variants = nil end

		wikitable:setClass("hanja-info-table")
			:appendTd(unicodeBox(self.char, 'ko'), 'unicodechar')
			:appendTd(string.format('[[%s]]부 %s획', self.radical, self.strokes), 'unicodechar-sub')
			:appendThTd('뜻과 소리', hanja.mean_sound, 'mean_sound')
			:appendThTd('[[중고한어]]', args['중고한어'])
			:appendThTd('[[동국정운]]', args['동국정운'], 'jamocomposed_block')
			:appendThTd('[[훈몽자회]]', args['훈몽자회'], 'jamocomposed_block')

		if hanja.rating then
			wikitable:appendThTd('[[어문회|어문회 급수]]', string.format('[[%s 한자|%s]]', hanja.rating, hanja.rating))
		end

		wikitable:appendThTd('이체자', hanja_variants)
			:appendTd(strokeOrder("쓰는 순서", self.char, self.strokeOrderFile))

		self.title = '정자[韓/臺]'
		self.content = wikitable:ret()
		wikitable:clear()
	end

	---------------------------------------------------------------------------------------------------------
	---------- 렌더링
	do
		local outerbox = {
			source = [[
			<div class="libre hanja-info" style="
			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;
			background:rgb(255, 255, 255, 17%%);">%s</div>]]
		}

		function outerbox:make(text)
			return ustring.format(self.source, text)
		end

		local Taboxes = {
			source = [[
			<div class="libre-tab">
				<div class="libre-tab-btns">
					<div class="libre-tab-btn libre-tab-btn-active">%s</div>
					<div class="libre-tab-btn">%s</div>
					<div class="libre-tab-btn">%s</div>
				</div>
				<div class="libre-tab-main">
					<div class="libre-tab-main-content libre-tab-main-content-active">%s</div>
					<div class="libre-tab-main-content">%s</div>
					<div class="libre-tab-main-content">%s</div>
				</div>
			</div>]],
		}

		function Taboxes:make(...)
			return ustring.format(self.source, ...)
		end

		local hanja_info
		if lang == nil then
			hanja.inJapan:makeHTML()
			hanja.inChina:makeHTML()
			hanja.inKorea:makeHTML()

			hanja_info = outerbox:make(
				Taboxes:make(hanja.inKorea.title, hanja.inJapan.title, hanja.inChina.title,
					hanja.inKorea.content, hanja.inJapan.content, hanja.inChina.content))
		elseif lang == '중국어' or lang == '간체자' then
			hanja.inJapan:makeHTML()
			hanja.inChina:makeHTML()
			hanja.inKorea:makeHTML()

			hanja_info = outerbox:make(
				Taboxes:make(hanja.inKorea.title, hanja.inJapan.title, hanja.inChina.title,
					hanja.inKorea.content, hanja.inJapan.content, hanja.inChina.content))
		elseif lang == "간체자만" or lang == "중국어만" then
			hanja.codepoint = ustring.codepoint(args['간체자'])
			hanja.unicode = tounicode(args['간체자'])
			hanja.inChina:makeHTML()
			hanja_info = outerbox:make(hanja.inChina.content)
		elseif lang == '일본어' or lang == '신자체' then
			hanja.inJapan:makeHTML()
			hanja.inChina:makeHTML()
			hanja.inKorea:makeHTML()

			hanja_info = outerbox:make(
				Taboxes:make(hanja.inKorea.title, hanja.inJapan.title, hanja.inChina.title,
					hanja.inKorea.content, hanja.inJapan.content, hanja.inChina.content))
		elseif lang == '일본어만' or lang == '신자체만' then
			hanja.codepoint = ustring.codepoint(args['신자체'])
			hanja.unicode = tounicode(args['신자체'])
			hanja.inJapan:makeHTML()
			hanja_info = outerbox:make(hanja.inJapan.content)
		end

		return table.concat({
			header.projectlink,
			hanja_info,
			header.mean_sound:tostring(),
			frame:preprocess([[<templatestyles src='틀:한자 정보/styles.css'/><templatestyles src='틀:한자 정보/내부/styles.css'/>]])
		})
	end
end

return p