|
|
(같은 사용자의 중간 판 27개는 보이지 않습니다) |
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['오음'] == 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
| |
| | |
| 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['획수']
| |
| 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['이체자 이름'] = {
| |
| '약자', '속자', '본자', '고자', ' ', ' ', ' ',
| |
| ' ', ' '
| |
| }
| |
| 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
| |