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

편집 요약 없음
편집 요약 없음
131번째 줄: 131번째 줄:
render:node(ThTd('뜻(訓)', self['뜻']))
render:node(ThTd('뜻(訓)', self['뜻']))
render:node(ThTd('중국어 병음', self['병음']))
render:node(ThTd('중국어 병음', self['병음']))
if self['중고한어'] ~= '' then
render:node(ThTd('중고한어', self['중고한어']))
end
render:node(ThTd('[[부수]]', '[[' .. self['부수'] .. ']]'))
render:node(ThTd('[[부수]]', '[[' .. self['부수'] .. ']]'))
render:node(Td(self.strokeOrder(self['간체자획수'] .. '획', self['간체자'], '', self['간체자획순파일'])))
render:node(Td(self.strokeOrder(self['간체자획수'] .. '획', self['간체자'], '', self['간체자획순파일'])))
153번째 줄: 150번째 줄:
render:node(ThTd('뜻(訓)', self['뜻']))
render:node(ThTd('뜻(訓)', self['뜻']))
render:node(ThTd('소리(音)', self['소리']))
render:node(ThTd('소리(音)', self['소리']))
render:node(ThTd('중고한어', self['중고한어']))
render:node(ThTd('[[부수]]', '[[' .. self['부수'] .. ']]'))
render:node(ThTd('[[부수]]', '[[' .. self['부수'] .. ']]'))
if self['어문회 급수'] ~= '' then
if self['어문회 급수'] ~= '' then
213번째 줄: 211번째 줄:
self['뜻'] = args['뜻'] or ' '
self['뜻'] = args['뜻'] or ' '
self['소리'] = args['소리'] or '-'
self['소리'] = args['소리'] or '-'
self['중고한어'] = args['중고한어']
self['동국정운'] = args['동국정운']
self['부수'] = args['부수'] or ' '
self['부수'] = args['부수'] or ' '
self['획수'] = args['획수'] or ' '
self['획수'] = args['획수'] or ' '
244번째 줄: 244번째 줄:
--self['간체자 뜻'] = args['뜻'] or ' ',
--self['간체자 뜻'] = args['뜻'] or ' ',
self['병음'] = args['병음'] or ' '
self['병음'] = args['병음'] or ' '
self['중고한어'] = args['중고한어'] or ''
self['간체자획수'] = args['간체자 획수'] or args['획수'] or ' '
self['간체자획수'] = args['간체자 획수'] or args['획수'] or ' '
self['간체자획순파일'] = args['간체자획순파일'] or args['획순파일'] or 'norm'
self['간체자획순파일'] = args['간체자획순파일'] or args['획순파일'] or 'norm'

2022년 2월 23일 (수) 12:38 판

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

local p = {}
local html = mw.html
local title_ = mw.title
local ustring = mw.ustring
local getArgs = require('Module:Arguments').getArgs

function p.test(frame) return 'asdf' end

p.strokeOrder = function(frame)
	local func = require('Module:한자/획순').strokeOrder
	return func(frame)
end

p.list = function(frame)
	local func = require('Module:한자/목록').list
	return func(frame)
end
---@param str string
---@return string 'U+ABCD'
local function unicode(str)
	return 'U+' .. string.format('%x', ustring.codepoint(str)):upper()
end
-----------------------------------------------------------------------------------------------------
local function renderVariant(text, hanja, lang)
	return html.create('span'):addClass('variant')
		:tag('span'):cssText('font-size: 11px; line-height: 1em;'):wikitext(text):done()
		:tag('span'):attr('lang', lang):wikitext(hanja):done()
end
local function ThTd(th, td)
	if td ~= '' then
		local render = '<tr><th class="" style="text-align: left">%s</th><td>%s</td></tr>'
		return render:format(tostring(th), tostring(td))
	end
end
local function Th(th, class)
	local render = '<tr><th colspan="2" class="%s" style="text-align: center">%s</th></tr>'
	return render:format(class or '', tostring(th))
end
local function Td(td, class)
	local render = '<tr><td colspan="2" class="%s" style="text-align: center">%s</td></tr>'
	return render:format(class or '', tostring(td))
end
-----------------------------------------------------------------------------------------
-- 메인 상자
function p:render(lang)
	self.strokeOrder = require('Module:한자/획순').strokeOrder_
	self.unicodechar = require('모듈:unicode').unicodechar

	local langTable = {}
	if lang == '중국어' or lang == '간체자' then
		langTable = { 'simplified', 'traditional', 'japan' }
	elseif lang == '일본어' or lang == '신자체' then
		langTable = { 'japan', 'traditional', 'simplified' }
	else
		langTable = { 'traditional', 'japan', 'simplified' }
	end
	local tabtitles = { ['traditional'] = '정자[韓/臺]', ['simplified'] = '간체자[中]', ['japan'] = '신자체[日]' }
	
	self:traditional()
	self:japan()
	self:simplified()
	
	local torender = ustring.format([[
<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%%);
">
<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>
</div>]],
	tabtitles[langTable[1]], tabtitles[langTable[2]], tabtitles[langTable[3]],
	self[langTable[1]], self[langTable[2]], self[langTable[3]])
	
	return self.header..torender..tostring(self.hanja_header)
end

function p:japan()
	local render = html.create('table'):css('width', '100%'):addClass('hanja-info-table')
	render:node(Td(self.unicodechar({
		['이름']='없음',
		['class']= 'x',
		['문자'] = self['신자체'],
		['경로'] = '시리즈:리브레_한자사전/',
		['템플릿']= '리브레 위키:템플릿/한자',
		['editintro']= '리브레 위키:템플릿/한자/editintro',
		['lang']= 'ja'
	}), 'unicodechar-box'))

	render:node(ThTd('뜻(<span lang="ja">訓</span>)', self['뜻']))
	render:node(ThTd('훈독(<span lang="ja">訓</span>読)', self['훈독']))
	if self['오음'] == '' and self['한음'] == '' and self['당음'] == '' and
		self['관용음'] == '' then
		render:node(ThTd('음독(<span lang="ja">音読</span>)', self['음독']))
	else
		render:node(Th('음독(<span lang="ja">音読</span>)'))
		render:node(ThTd('오음(<span lang="ja">呉音</span>)', self['오음']))
		render:node(ThTd('한음(<span lang="ja">漢音</span>)', self['한음']))
		render:node(ThTd('당음(<span lang="ja">唐音)', self['당음']))
		render:node(ThTd('관용음', self['관용음']))
	end

	render:node(ThTd('[[부수]]', '[[' .. self['신자체부수'] .. ']]'))
	render:node(Td(self.strokeOrder(self['신자체획수'] .. '획', self['신자체'], '', nil, self['신자체획순파일'])))
	
	self['japan'] = tostring(render)
end

function p:simplified()
	local render = html.create('table'):css('width', '100%'):addClass('hanja-info-table')
	
	render:node(Td(self.unicodechar({
		['이름']='없음',
		['class']= 'x',
		['문자'] = self['간체자'],
		['경로'] = '시리즈:리브레_한자사전/',
		['템플릿']= '리브레 위키:템플릿/한자',
		['editintro']= '리브레 위키:템플릿/한자/editintro',
		['lang']= 'zh-cn'
	}), 'unicodechar-box'))

	render:node(ThTd('뜻(訓)', self['뜻']))
	render:node(ThTd('중국어 병음', self['병음']))
	render:node(ThTd('[[부수]]', '[[' .. self['부수'] .. ']]'))
	render:node(Td(self.strokeOrder(self['간체자획수'] .. '획', self['간체자'], '', self['간체자획순파일'])))
	self['simplified'] = tostring(render)
end

function p:traditional()
	local render = html.create('table'):css('width', '100%'):addClass('hanja-info-table')
	render:node(Td(self.unicodechar({
		['이름']='없음',
		['class']= 'x',
		['문자'] = self['한자'],
		['경로'] = '시리즈:리브레_한자사전/',
		['템플릿']= '리브레 위키:템플릿/한자',
		['editintro']= '리브레 위키:템플릿/한자/editintro',
		['lang']= 'ko'
	}), 'unicodechar-box'))

	render:node(ThTd('뜻(訓)', self['뜻']))
	render:node(ThTd('소리(音)', self['소리']))
	render:node(ThTd('중고한어', self['중고한어']))
	render:node(ThTd('[[부수]]', '[[' .. self['부수'] .. ']]'))
	if self['어문회 급수'] ~= '' then
		local num = self['어문회 급수']
		render:node(ThTd('[[어문회|어문회 급수]]',
			string.format('[[%s 한자|%s]]', num, num)))
	end

	local hasAlter
	for k in pairs(self['이체자']) do
		if self['이체자'][k] ~= '' then
			hasAlter = true
			break
		end
	end
	if hasAlter == true or self['대만식'] ~= '' then
		local hanja_variant = html.create('tr'):tag('th'):css('text-align','left'):wikitext('이체자')
		local hanja_variants = html.create('span'):addClass('variants')
		if self['대만식'] ~= '' then
			hanja_variants:node(renderVariant('대만', self['대만식'], 'zh-tw'))
		end
		local i = 1
		while i < 6 do
			if self['이체자'][i] ~= '' then
				hanja_variants:node(renderVariant(self['이체자 이름'][i],self['이체자'][i], 'ko'))
			end
			i = i + 1
		end
		hanja_variant:tag('td'):node(hanja_variants)
		render:node(hanja_variant)
	end
	render:node(Td(self.strokeOrder(self['획수'] .. '획', self['한자'], '' , self['획순파일'])))

	self['traditional'] = tostring(render)
end
function p.main(frame) return p:main_(frame) end
function p:main_(frame)
	local args = getArgs(frame)
	local css = args['css']

	self.hanja_header = html.create('div'):addClass('hanja-info-head')
	if args[1] == '한자만' then
		return self.hanja_header:tag('span'):addClass('hanja')
		:wikitext('[[' ..args['한자'] ..']]' .. css):done()

	elseif args[1] == '신자체만' or args[1] == '일본어만' then
		return self.hanja_header:tag('span'):addClass('hanja'):attr('lang', 'ja'):css('font-family', 'Noto Serif CJK KR, serif')
		:wikitext('[[' ..args['신자체'] ..']]' .. css):done()

	elseif args['모드'] == '풀이' then
		return ''
	end
	
	local currentPage = title_.getCurrentTitle().prefixedText
	currentPage = mw.text.split(currentPage, '/')
	local subPage = currentPage[2] or ''
	local rootPage = currentPage[1]
	-- 변수 처리
	self['한자'] = args['한자'] or subPage
	self['뜻'] = args['뜻'] or ' '
	self['소리'] = args['소리'] or '-'
	self['중고한어'] = args['중고한어']
	self['동국정운'] = args['동국정운']
	self['부수'] = args['부수'] or ' '
	self['획수'] = args['획수'] or ' '
	self['획순파일'] = args['획순파일'] or 'norm'
	self['대만식'] = args['정체자'] or args['대만식'] or ''
	self['이체자'] = {
			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 ''
		}
	self['이체자 이름'] = {
			'약자', '속자', '본자', '고자', '&nbsp;', '&nbsp;', '&nbsp;',
			'&nbsp;', '&nbsp;'
		}
	self['어문회 급수'] = args['급수'] or args['어문회급수'] or ''

	self['신자체'] = args['신자체'] or args['한자'] or subPage
	--self['신자체뜻'] = args['뜻'] or ' '
	self['훈독'] = args['훈독'] or ''
	self['음독'] = args['음독'] or ''
	self['오음'] = args['오음'] or ''
	self['한음'] = args['한음'] or ''
	self['당음'] = args['당음'] or ''
	self['관용음'] = args['관용음'] or ''
	self['신자체획수'] = args['신자체 획수'] or args['획수'] or ' '
	self['신자체획순파일'] = args['신자체획순파일'] or args['획순파일'] or 'ja'
	self['신자체부수'] = args['신자체 부수'] or args['부수'] or ' '

	self['간체자'] = args['간체자'] or args['한자'] or subPage
	--self['간체자 뜻'] = args['뜻'] or ' ',
	self['병음'] = args['병음'] or ' '
	self['간체자획수'] = args['간체자 획수'] or args['획수'] or ' '
	self['간체자획순파일'] = args['간체자획순파일'] or args['획순파일'] or 'norm'
	self['간체자부수'] = args['간체자 부수'] or args['부수'] or ' '
	
-- hanjalink 65535를 넘어가는지 체크할 변수, unicode의 예 U+10000
	self.hanjalink = ustring.codepoint(self['한자']); self.unicode = unicode(self['한자']); self.header = ''

	if rootPage == '시리즈:리브레 한자사전' and (self['한자'] == subPage or self.unicode == subPage) then
		local key1, key2, cat
		-- 제부수인지(if) 아닌지(else)--부수 분류
		if self['부수'] == subPage then key1 = ' '
		else key1 = '-' end
		
		-- 소리가 없는지(if) 있는지(else)--한자 분류
		if self['소리'] == '-' or args['미분류'] then key2 = '-'
		else key2 = string.gsub(self['소리']..self['한자'], ' ', '') end
		
		--유니코드 U+10000 초과하는지(if) 아닌지(else)--한자 그 자체에 대한 분류
		if self.hanjalink > 65535 then cat = self.unicode
		else cat = self['한자'] end

		self.hanja_header:wikitext(ustring.format(
			'[[분류:%s|%s]][[분류:한자/문자]]%s[[분류:%s| ]]',
			self['부수'], key1, frame:preprocess{text = "{{DEFAULTSORT:"..key2.."}}"} , cat))
		if self['어문회 급수'] ~= '' then
			self.hanja_header:wikitext('[[분류:'..self['어문회 급수']..' 한자]]')
		end
		if not args['상위문서x'] then
			self.header = '<div class="hanja-info-header"><div class="hanja-projectlink">[[시리즈:리브레 한자사전]]</div>__TOC__<hr/></div>'
		end
	end
		-- 유니코드 U+10000 초과할 때
	if self.hanjalink > 65535 then
		self.hanja_header:node(ustring.format('<span class="hanja">[[%s|%s]]</span>', self.unicode, self['한자']))
	else --아닐 때
		self.hanja_header:node(ustring.format('<span class="hanja">[[%s]]</span>', self['한자']))
	end
	
	self.hanja_header:node(ustring.format('<span class="mean"> %s <i>%s</i></span>__NOTOC__%s', self['뜻'], self['소리'], css))
	--return args[1]
	return self:render(args[1])
end
------------------------------------------------------------------------------------
return p