모듈:한자 정보

하늘 (토론 | 기여)님의 2022년 6월 27일 (월) 19:55 판
설명문서 [편집] [역사] [새로고침]

샘플

한나라 [한]

정자[韓/臺]
신자체 [日]
간체자 [中]



CJK Unified Ideographs
U+6F22
부 14획
뜻과 소리 한나라 [한]
중고한어hɑnH
어문회 급수준7급
정체자
쓰는 순서
CJK Unified Ideographs
U+6F22
부 13획
뜻과 소리 한나라 [한]
훈독(訓読)おとこ、あや、から
음독(音読)
오음(呉音)カン
한음(漢音)カン
쓰는 순서
CJK Unified Ideographs
U+6C49
부 5획
뜻과 소리 한나라 [한]
병음hàn
쓰는 순서
연습장이나 사용자 문서에서 틀의 사용이나 수정을 연습할 수 있습니다.
분류는 /설명문서에 넣어주세요.

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 = {}
    header.mean_sound = {}
    header.mean_sound.html = html.create('p'):addClass('hanja-info-header')
    function header.mean_sound:tostring() return tostring(self.html) end
	function header.mean_sound:append(str) self.html:wikitext(str) 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()
	else
    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['뜻 소리'],
		alterForm = {
			{args['약자'], '약자'}, {args['속자'], '속자'},
	        {args['본자'], '본자'}, {args['고자'], '고자'},
	        {args['이체자'], ' '}
	    },
		rating = args['급수'] or args['어문회급수'],
		pinyin = args['병음']
	}
	
	hanja.strokes = {}
	hanja.radical = {}
	hanja.strokeOrderFile = {}
	hanja.strokeOrderFile.inKorea = args['획순파일'] or 'norm'
	hanja.strokes.inKorea = args['획수'] or ''
	hanja.radical.inKorea = args['부수'] or ''
	hanja.inTaiwan = args['정체자'] or args['대만식']

	if lang ~= "간체자만" and lang ~= "중국어만" then
		hanja.strokeOrderFile.inJapan = args['신자체자획순파일'] or hanja.strokeOrderFile.inKorea or 'ja'
		hanja.strokes.inJapan = args['신자체 획수'] or hanja.strokes.inKorea
		hanja.radical.inJapan = args['신자체 부수'] or hanja.radical.inKorea
		hanja.inJapan = args['신자체'] or hanja.char
	end
	if lang ~= "신자체만" and lang ~= "일본어만" then
		hanja.strokeOrderFile.inChina = args['간체자획순파일'] or hanja.strokeOrderFile.inKorea
		hanja.strokes.inChina = args['간체자 획수'] or hanja.strokes.inKorea
		hanja.radical.inChina = args['간체자 부수'] or hanja.radical.inKorea
		hanja.inChina = args['간체자'] or hanja.char
		if lang == "간체자만" or lang == "중국어만" then
			hanja.codepoint = ustring.codepoint(args['간체자'])
			hanja.unicode = tounicode(args['간체자'])
			hanja.char = args['간체자'] or args['한자'] or ''
		end
	end	
	
    if hanja.codepoint > 65535 then
        header.mean_sound.html:wikitext('<span class="hanja">[[', hanja.unicode, '|', hanja.char, ']]</span> ')
    else -- 아닐 때
        header.mean_sound.html:wikitext('<span class="hanja">[[', hanja.char, ']]</span> ')
    end
    if hanja.mean_sound then
		hanja.sound = hanja.mean_sound:sub(hanja.mean_sound:find('[[][^]]*[]]')):gsub('[%[%]]', '')
		hanja.mean_sound = '<span class="mean">'.. hanja.mean_sound:gsub('%[', '<i>'):gsub('%]', '</i></span><span>')
	else
		hanja.mean_sound = hanja.mean .. ' <i>' .. hanja.sound .. '</i>'
	end
	if lang == "간체자만" or lang == "중국어만" then
		header.mean_sound.html:wikitext('<span class="mean"> ', hanja.pinyin or '', '</span>')
	else
	    header.mean_sound.html:node(hanja.mean_sound)
	end
	
	---------------------------------------------------------------------------------------------------------
	---------- 분류 정렬키 조작
    local currentPage = mw.text.split(title_.getCurrentTitle().prefixedText, '/')
    local pageName = {
		root = currentPage[1],
        sub = currentPage[2] or '',
    }
	
    if pageName.root == '시리즈:리브레 한자사전' and (hanja.char == pageName.sub or hanja.unicode == pageName.sub) then
        -- 제부수인지(if) 아닌지(else)
        header.mean_sound.html:addClass('is-hanja-dict')
		
        local radicalSortKey = '-' -- [[분류:(부수)|-]]
        if args['부수'] == pageName.sub then
            radicalSortKey = ' '
        end -- [[분류:(부수)| ]]
		
        local defaultsort -- 기본 정렬키
        -- 소리가 없는지(if) 있는지(else)
        if hanja.sound == '-' or args['미분류'] then
            defaultsort = '-' -- 소리 없음
        else
            defaultsort = string.gsub(hanja.sound .. hanja.char, ' ', '')
        end
		
        local cat
        -- 유니코드 U+10000 초과하는지(if) 아닌지(else) --한자 그 자체에 대한 분류
        if hanja.codepoint > 65535 then
            cat = hanja.unicode -- U+0000
        else
            cat = hanja.char -- 漢
        end
		
        header.mean_sound:append(ustring.format(
			'[[분류:%s|%s]][[분류:한자/문자]]%s[[분류:%s| ]]',
            args['부수'] or '', radicalSortKey,
            frame:preprocess{ text = "{{DEFAULTSORT:" .. defaultsort .. "}}" },
            cat))
			
			if hanja.rating then
				header.mean_sound:append('[[분류:' .. hanja.rating .. ' 한자]]')
			end
			if not args['상위문서x'] then
				header.projectlink = require('Module:한자 정보/구현').projectlink:tostring()
			end
		end
		
		---------------------------------------------------------------------------------------------------------
		---------- 렌더링
		local function render()
			local lang = args[1]
			local outerbox = [[
				<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>]]
			local innerboxes = [[
			<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>]]
			local strokeOrder = require('Module:한자/획순').strokeOrder_
			local unicodeBox = require('Module:한자 정보/구현').unicodeBox
			local wikitable = require('Module:표')

			local inChina
			if lang ~= "신자체만" and lang ~= "일본어만" then

                wikitable:setClass("hanja-info-table")
                wikitable:appendTd(unicodeBox( hanja.inChina, 'zh-cn'), 'unicodechar-box')
                wikitable:appendTd('[[' .. hanja.radical.inChina .. ']]부 ' .. hanja.strokes.inChina ..'획')
                wikitable:appendThTd('뜻과 소리', hanja.mean_sound, 'mean_sound')
                wikitable:appendThTd('병음', hanja.pinyin)
                wikitable:appendTd(strokeOrder("쓰는 순서", hanja.inChina, '', hanja.strokeOrderFile.inChina))

				inChina = { title = '중국어[中]', content = wikitable:ret() }
                wikitable:clear()
			end
			local inJapan -- for japanese
			if lang ~= "간체자만" and lang ~= "중국어만" then

				wikitable:setClass("hanja-info-table")
				wikitable:appendTd(unicodeBox( hanja.inJapan, 'ja'), 'unicodechar-box')
				wikitable:appendTd('[[' .. hanja.radical.inJapan .. ']]부 ' .. hanja.strokes.inJapan ..'획')
				wikitable:appendThTd('뜻과 소리', hanja.mean_sound, 'mean_sound')
				wikitable:appendThTd('훈독(<span lang="ja">訓</span>読)', args['훈독'])
				
				if args['오음'] or args['한음'] or args['당음'] or args['관용음'] then
					wikitable:appendTh('음독(<span lang="ja">音読</span>)')
					wikitable:appendThTd('오음(<span lang="ja">呉音</span>)', args['오음'])
					wikitable:appendThTd('한음(<span lang="ja">漢音</span>)', args['한음'])
					wikitable:appendThTd('당음(<span lang="ja">唐音)', args['당음'])
					wikitable:appendThTd('관용음', args['관용음'])
				else
					wikitable:appendThTd('음독(<span lang="ja">音読</span>)', args['음독'])
				end

				wikitable:appendTd(strokeOrder("쓰는 순서", hanja.inJapan, '', hanja.strokeOrderFile.inJapan))
				inJapan = { title = '일본어[日]', content = wikitable:ret() }
                wikitable:clear()
			end
			local inKorea -- for korean
			if lang ~= "신자체만" and lang ~= "일본어만" or lang ~= "간체자만" and lang ~= "중국어만" then
				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
				if hanja.inTaiwan then
					hanja_variants:node(renderVariant('대만', hanja.inTaiwan, 'zh-tw'))
					hasAlter = true
				end
				for _, elem in pairs(hanja.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")
				wikitable:appendTd(unicodeBox( hanja.char, 'ko', 'unicodechar-box'))
				wikitable:appendTd('[[' .. hanja.radical.inKorea .. ']]부 '.. hanja.strokes.inKorea .. '획')
				wikitable:appendThTd('뜻과 소리', hanja.mean_sound, 'mean_sound')
				wikitable:appendThTd('[[중고한어]]', args['중고한어'])
				wikitable:appendThTd('[[동국정운]]', args['동국정운'], 'jamocomposed_block')
				wikitable:appendThTd('[[훈몽자회]]', args['훈몽자회'], 'jamocomposed_block')
				
				if hanja.rating then
					wikitable:appendThTd('[[어문회|어문회 급수]]', string.format('[[%s 한자|%s]]', hanja.rating, hanja.rating))
				end

				wikitable:appendThTd('이체자', hanja_variants)
				wikitable:appendTd(strokeOrder( "쓰는 순서", hanja.char , hanja.strokeOrderFile.inKorea))
				
	        	inKorea = { title = '정자[韓/臺]', content = wikitable:ret() }
	        	wikitable:clear()
			end

        	local hanja_info
        	if lang == '중국어' or lang == '간체자' then
        	    hanja_info = ustring.format(outerbox, ustring.format(innerboxes,
        	    inChina.title, inKorea.title, inJapan.title,
        	    inChina.content, inKorea.content, inJapan.content))

			elseif lang == "간체자만" or lang == "중국어만" then
				hanja_info = ustring.format(outerbox, inChina.content)

        	elseif lang == '일본어' or lang == '신자체' then
        	    hanja_info = ustring.format(outerbox, ustring.format(innerboxes,
        	    inJapan.title, inKorea.title, inChina.title,
        	    inJapan.content, inKorea.content, inChina.content))

			elseif lang == '일본어만' or lang == '신자체만' then
				hanja_info = ustring.format(outerbox, inJapan.content)

			elseif lang == nil then
        	    hanja_info = ustring.format(outerbox, ustring.format(innerboxes,
        	    inKorea.title, inJapan.title, inChina.title,
        	    inKorea.content, inJapan.content, inChina.content))

        	end

        return header.projectlink.. hanja_info .. header.mean_sound:tostring()

    end

    return render()
end

return p