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

편집 요약 없음
편집 요약 없음
 
(같은 사용자의 중간 판 9개는 보이지 않습니다)
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)
if hanja then
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()
else
return ''
end
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['오음'] == nil and self['한음'] == nil and self['당음'] == nil and
self['관용음'] == nil 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
if self['신자체부수'] then
render:node(ThTd('[[부수]]', '[[' .. self['신자체부수'] .. ']]'))
end
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['병음']))
if self['간체자부수'] then
render:node(ThTd('[[부수]]', '[[' .. self['간체자부수'] .. ']]'))
end
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
render:node(ThTd('[[부수]]', '[[' .. self['부수'] .. ']]'))
end
if self['어문회 급수'] then
local num = self['어문회 급수']
render:node(ThTd('[[어문회|어문회 급수]]',
string.format('[[%s 한자|%s]]', num, num)))
end
 
if self['대만식'] or #(self['이체자']) ~= 0 then
local hanja_variants = html.create('span'):addClass('variants')
hanja_variants:node(renderVariant('대만', self['대만식'], 'zh-tw'))
for elem in pairs(self['이체자']) do
hanja_variants:node(renderVariant( elem[1], elem[2], 'ko'))
end
local hanja_variant_box = ThTd('이체자', hanja_variants)
render:node(hanja_variant_box)
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['약자'] or nil, '약자'},
{ args['속자'] or nil, '속자'},
{ args['본자'] or nil, '본자'},
{ args['고자'] or nil, '고자'},
{ args['이체자'] or nil, '&nbsp;'}
}
self['어문회 급수'] = args['급수'] or args['어문회급수']
 
self['신자체'] = args['신자체'] or args['한자'] or subPage
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['병음']
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 기준 최신판

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

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