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

편집 요약 없음
편집 요약 없음
 
(같은 사용자의 중간 판 31개는 보이지 않습니다)
1번째 줄: 1번째 줄:
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 == nil then
return ''
end
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['동국정운']))
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['뜻']
self['소리'] = args['소리'] or '-'
self['중고한어'] = args['중고한어']
self['동국정운'] = args['동국정운']
self['부수'] = args['부수']
self['획수'] = args['획수'] or ' '
self['획순파일'] = args['획순파일'] or 'norm'
self['대만식'] = args['정체자'] or args['대만식']
self['이체자'] = {
args['약자'], args['속자'], args['본자'], args['고자'],
args['이체자'] or args['이체자1'],
args['이체자2'], args['이체자3'],
args['이체자4'], args['이체자5']
}
self['이체자 이름'] = {
'약자', '속자', '본자', '고자', '&nbsp;', '&nbsp;', '&nbsp;',
'&nbsp;', '&nbsp;'
}
self['어문회 급수'] = args['급수'] or args['어문회급수']
 
self['신자체'] = args['신자체'] or args['한자'] or subPage
--self['신자체뜻'] = args['뜻'] or ' '
self['훈독'] = args['훈독']
self['음독'] = args['음독']
self['오음'] = args['오음'];self['한음'] = args['한음'];self['당음'] = args['당음'];self['관용음'] = args['관용음']
self['신자체획수'] = args['신자체 획수'] or args['획수'] or ' '
self['신자체획순파일'] = args['신자체획순파일'] or args['획순파일'] or 'ja'
self['신자체부수'] = args['신자체 부수'] or args['부수']
 
self['간체자'] = args['간체자'] or args['한자'] or subPage
--self['간체자 뜻'] = args['뜻'] or ' ',
self['병음'] = args['병음']
self['간체자획수'] = args['간체자 획수'] or args['획수'] or ' '
self['간체자획순파일'] = args['간체자획순파일'] or args['획순파일'] or 'norm'
self['간체자부수'] = args['간체자 부수'] or args['부수']
-- 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['뜻'] or ' ', self['소리'], css))
--return args[1]
return self:render(args[1])
end
------------------------------------------------------------------------------------
return p

2022년 3월 1일 (화) 19:57 기준 최신판

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

-- 다른 모듈로의 링크를 위해 남겨놓음.