편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.
최신판 | 당신의 편집 | ||
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 ~= '' 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['병음'])) | |||
if self['중고한어'] ~= '' then | |||
render:node(ThTd('중고한어', self['중고한어'])) | |||
end | |||
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['부수'] .. ']]')) | |||
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['부수'] 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['이체자 이름'] = { | |||
'약자', '속자', '본자', '고자', ' ', ' ', ' ', | |||
' ', ' ' | |||
} | |||
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 '' | |||
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 |