|
|
| 1번째 줄: |
1번째 줄: |
| local p = {}
| |
| local html = mw.html
| |
| local title_ = mw.title
| |
| local ustring = mw.ustring | | local ustring = mw.ustring |
| local getArgs = require('Module:Arguments').getArgs | | local getArgs = require('Module:Arguments').getArgs |
| local unicodechar = require('모듈:unicode').unicodechar | | local p = {} |
|
| |
|
| function p.test(frame) return 'asdf' end
| | ------------------------- codepoint ------------------------------------------ |
| | | function p.code( data ) |
| p.strokeOrder = function(frame)
| | if type(data) == 'table' then |
| local func = require('Module:한자/획순').strokeOrder
| | data = getArgs(frame)[1] or nil |
| return func(frame)
| | elseif type(data) == 'string' then |
| end
| | return p.code_(char) |
| | | else |
| local strokeOrder = require('Module:한자/획순').strokeOrder_
| | return '입력값이 없습니다.' |
| 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+' .. ustring.upper(string.format("%x", ustring.codepoint(str)))
| |
| end
| |
| -----------------------------------------------------------------------------------------------------
| |
| local function renderVariant(text, hanja, lang)
| |
| local torender = html.create("span") | |
| torender:addClass('variant')
| |
| :tag("span"):cssText("font-size: 11px; line-height: 1em;"):wikitext(text):done() | |
| :tag("span"):attr("lang", lang):wikitext(hanja)
| |
| return torender | |
| end
| |
| local function ThTd(th, td)
| |
| if td ~= '' then
| |
| local torender = html.create("tr") | |
| torender:tag("th"):css("text-align", "left"):wikitext(th)
| |
| torender:tag("td"):wikitext(td)
| |
| return torender | |
| end | | end |
| end | | end |
| local function Th(th, class)
| | function p.code_( char, base, offset ) |
| local torender = html.create("tr") | | if type(char) == 'string' then |
| if type(th) == 'table' then
| | if offset == nil then offset = 0 end |
| torender:tag("th"):attr("colspan", "2"):addClass(class):css("text-align","center"):node(th) | | local baseformat, head |
| | if base == '10' then |
| | baseformat = '%d'; head = 'U+' |
| | elseif base == 'x16' then |
| | baseformat = '%x'; head = 0 |
| | return ustring.codepoint(char) + offset |
| | else |
| | baseformat = '%x'; head = 'U+' |
| | end |
| | return head..ustring.upper(ustring.format(baseformat, ustring.codepoint(char) + offset)) |
| else | | else |
| torender:tag("th"):attr("colspan", "2"):addClass(class):css("text-align","center"):wikitext(th) | | return 0 |
| end | | end |
| return torender
| |
| end | | end |
| local function Td(td, class)
| | ---------------------- next codepoint --------------------------------------- |
| local torender = html.create("tr")
| | function p.nextcode( data ) |
| if type(td) == 'table' then | | if type(data) == 'table' then char = getArgs(data)[1] or nil |
| torender:tag("td"):attr("colspan", "2"):addClass(class):css("text-align","center"):node(td) | | else char = data or nil end if char then |
| | return p.code_(char, '16', 1) |
| else | | else |
| torender:tag("td"):attr("colspan", "2"):addClass(class):css("text-align","center"):wikitext(td) | | return '입력값이 없습니다.' |
| end | | end |
| return torender
| |
| end | | end |
| ----------------------------------------------------------------------------------------- | | ---------------------- prev codepoint --------------------------------------- |
| -- 메인 상자
| | function p.prevcode( data ) |
| function p:render(lang) | | if type(data) == 'table' then char = getArgs(data)[1] or nil |
| local langTable = {}
| | else char = data or nil end |
| if lang == "중국어" or lang == '간체자' then | | if char then |
| langTable = { 'simplified', 'traditional', 'japan' }
| | return p.code_(char, '16', -1) |
| elseif lang == "일본어" or lang == '신자체' then | |
| langTable = { 'japan', 'traditional', 'simplified' }
| |
| else | | else |
| langTable = { 'traditional', 'japan', 'simplified' } | | return '입력값이 없습니다.' |
| end | | end |
| local tabtitles = { ['traditional'] = '정자[韓/臺]', ['simplified'] = '간체자[中]', ['japan'] = '신자체[日]' }
| |
| local torender = html.create("div")
| |
| :addClass("libre hanja-info")
| |
| :cssText('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;')
| |
|
| |
| local libre_tab = html.create("div"):addClass("libre-tab")
| |
| local libre_tab_btns = html.create("div"):addClass("libre-tab-btns")
| |
| local libre_tab_main = html.create("div"):addClass("libre-tab-main")
| |
|
| |
| libre_tab_btns:tag("div"):addClass("libre-tab-btn libre-tab-btn-active"):wikitext(tabtitles[langTable[1]])
| |
| libre_tab_btns:tag("div"):addClass("libre-tab-btn"):wikitext(tabtitles[langTable[2]])
| |
| libre_tab_btns:tag("div"):addClass("libre-tab-btn"):wikitext(tabtitles[langTable[3]])
| |
|
| |
| self:traditional(); self:japan(); self:simplified()
| |
| libre_tab_main:tag("div"):addClass("libre-tab-main-content libre-tab-main-content-active"):node(self[langTable[1]])
| |
| libre_tab_main:tag("div"):addClass("libre-tab-main-content"):node(self[langTable[2]])
| |
| libre_tab_main:tag("div"):addClass("libre-tab-main-content"):node(self[langTable[3]])
| |
| libre_tab:node(libre_tab_btns)
| |
| libre_tab:node(libre_tab_main)
| |
| torender:node(libre_tab)
| |
|
| |
| return tostring(self.hanja_header)..tostring(torender)..unicodechar({ ['영어이름'] = '',
| |
| ['문자'] = self.trad['한자'],})
| |
| end | | end |
| | | ---------------------- next char --------------------------------------- |
| function p:japan() | | function p.nextchar( data ) |
| local render = html.create("table"):css("width", "100%")
| | local char |
| | | if type(data) == 'table' then char = getArgs(data)[1] or nil |
| local hanja_ = html.create("td"):attr("colspan", "2"):addClass("hanja"):css("text-align", "center") | | else char = data or nil end |
| hanja_:tag("span"):attr("lang", "ja"):wikitext(self.jap["한자"]) | | if char then |
| render:tag("tr"):node(hanja_) | | return ustring.char(p.code_(char, 'x16', 1)) |
| | |
| render:node(ThTd("뜻(訓)", self.jap["뜻"]))
| |
| render:node(ThTd("훈독(訓読)", self.jap["훈독"]))
| |
| if self.jap["오음"] == '' and self.jap["한음"] == '' and self.jap["당음"] == '' and
| |
| self.jap["관용음"] == '' then
| |
| render:node(ThTd("음독(音読)", self.jap["음독"]))
| |
| else | | else |
| render:node(Th("음독(音読)")) | | return '입력값이 없습니다.' |
| render:node(ThTd("오음(吳音)", self.jap["오음"]))
| |
| render:node(ThTd("한음(漢音)", self.jap["한음"]))
| |
| render:node(ThTd("당음(唐音)", self.jap["당음"]))
| |
| render:node(ThTd("관용음", self.jap["관용음"]))
| |
| end | | end |
|
| |
| render:node(ThTd("[[부수]]", '[[' .. self.jap["부수"] .. ']]'))
| |
| render:node(ThTd("[[유니코드]]", unicode(self.jap["한자"])))
| |
| render:node(Td(strokeOrder(self.jap["획수"] .. "획", self.jap["한자"], "", self.jap["획순파일"], 'ja')))
| |
|
| |
| self['japan'] = render
| |
| end | | end |
| | | ---------------------- prev char --------------------------------------- |
| function p:simplified() | | function p.prevchar( data ) |
| local render = html.create("table"):css("width", "100%")
| | local char |
| | | if type(data) == 'table' then char = getArgs(data)[1] or nil |
| local hanja_ = html.create("td"):attr("colspan", "2"):addClass("hanja"):css("text-align", "center") | | else char = data or nil end |
| hanja_:tag("span"):attr("lang", "zh-cn"):wikitext(self.simp["한자"]) | | if char then |
| | | return ustring.char(p.code_(char, 'x16', -1)) |
| render:tag("tr"):node(hanja_) | | else |
| | | return '입력값이 없습니다.' |
| render:node(ThTd("뜻(訓)", self.simp["뜻"]))
| |
| render:node(ThTd("중국어 병음", self.simp["병음"]))
| |
| if self.simp["중고한어"] ~= "" then | |
| render:node(ThTd("중고한어", self.simp["중고한어"])) | |
| end | | end |
| render:node(ThTd("[[부수]]", '[[' .. self.simp["부수"] .. ']]'))
| |
| render:node(ThTd("[[유니코드]]", unicode(self.simp["한자"])))
| |
| render:node(Td(strokeOrder(self.simp["획수"] .. "획", self.simp["한자"], "", self.simp["획순파일"])))
| |
| self['simplified'] = render
| |
| end | | end |
| | ---------------------- {틀:유니코드문자} --------------------------------------- |
| | function p.unicodechar( frame ) |
| | local args = getArgs(frame) |
| | local charname |
| | if args['이름'] == nil then charname = mw.title.getCurrentTitle().prefixedText |
| | else charname = args['이름'] end |
| | local eng = args['영어이름'] or '' |
| | |
| | local root = mw.html.create('table'):addClass('wikitable'):cssText('margin: 0 0.4em;max-width:100%;width: 21em;float: right; text-align: center; clear:both') |
| | local tr, td |
|
| |
|
| function p:traditional()
| | if args['이름'] ~= '없음' then |
| local render = html.create("table"):css("width", "100%") | | tr = ustring.format('<tr><th colspan="3"><div>%s</div><small>%s</small></th></tr>', charname, eng) |
| local hanja_text = html.create("td"):attr("colspan", "2"):addClass("hanja"):css("text-align", "center")
| | else |
| hanja_text:tag("span"):attr("lang", "ko"):wikitext(self.trad["한자"])
| | tr = ustring.format('<tr><th colspan="3"><small>%s</small></th></tr>', eng) |
| | |
| if self.trad["대만식"] ~= "" then | |
| hanja_text:node(renderVariant("대만", self.trad["대만식"], "zh-tw")) | |
| end | | end |
| render:tag("tr"):node(hanja_text) | | root:node(tr) |
|
| |
|
| render:node(ThTd("뜻(訓)", self.trad["뜻"]))
| | tr = mw.html.create('tr') |
| render:node(ThTd("소리(音)", self.trad["소리"])) | | local curr = args['기호'] or args['문자'] or ' ' |
| render:node(ThTd("[[부수]]", '[[' .. self.trad["부수"] .. ']]'))
| | local prev, next |
| render:node(ThTd("[[유니코드]]", unicode(self.trad["한자"]))) | | if curr == ' ' then |
| | return '<span class="warning">기호(문자)를 입력하지 않았습니다. |기호 = (기호)</span>' |
| | else |
| | if ustring.codepoint(curr) > 65535 then |
| | prev = args['이전'] or args['전문자'] or '[['..p.prevcode(curr)..'|'..p.prevchar(curr)..']]' |
| | next = args['이후'] or args['후문자'] or '[['..p.nextcode(curr)..'|'..p.nextchar(curr)..']]' |
| | else |
| | prev = args['이전'] or args['전문자'] or '[['..p.prevchar(curr)..']]' |
| | next = args['이후'] or args['후문자'] or '[['..p.nextchar(curr)..']]' |
| | end |
| | end |
| | td = ustring.format('<td style="width: 38%%"><div>%s</div>←</td>', prev) |
| | tr:node(td) |
|
| |
|
| local bool | | td = ustring.format('<td style="width:4em"><div style="font-size: 1.8em;line-height: 1.2em;"><b>%s</b></div><small><span style="color: gray;">%s</span></small></td>', curr, p.code_(curr)) |
| for k in pairs(self.trad["이체자"]) do
| | tr:node(td) |
| if self.trad["이체자"][k] ~= "" then
| | |
| bool = true
| | td = ustring.format('<td style="width: 38%%"><div>%s</div>→</td>', next) |
| break
| | tr:node(td) |
| end
| |
| end | |
|
| |
|
| if bool == true then
| | root:node(tr) |
| local hanja_variant = html.create("tr"):tag("th"):css("text-align","left"):wikitext("이체자")
| | |
| local hanja_variants = html.create("span"):addClass('variants')
| | return tostring(root) |
| | |
| local i = 1
| |
| while i < 6 do
| |
| if self.trad["이체자"][i] ~= '' then
| |
| hanja_variants:node(renderVariant(self.trad["이체자 이름"][i],self.trad["이체자"][i], "ko"))
| |
| end
| |
| i = i + 1
| |
| end
| |
| hanja_variant:tag("td"):node(hanja_variants)
| |
| render:node(hanja_variant)
| |
| end | |
| render:node(Td(strokeOrder(self.trad["획수"] .. "획", self.trad["한자"], "", self.trad["획순파일"]))) | |
| | |
| self['traditional'] = render
| |
| end | | 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['모드'] == '한자만' then
| |
| self.hanja_header:tag('span'):addClass('hanja')
| |
| :wikitext('[[' ..args["한자"] ..']]' .. css)
| |
| return self.hanja_header
| |
|
| |
| elseif args['모드'] == '신자체만' or args['모드'] == '일본어만' then
| |
| self.hanja_header:tag('span'):addClass('hanja'):attr('lang', 'ja'):css('font-family', 'Noto Serif CJK KR, serif')
| |
| :wikitext('[[' ..args['신자체'] ..']]' .. css)
| |
| return self.hanja_header
| |
|
| |
| elseif args['모드'] == '훈음' then
| |
| local hanja, mean, sound
| |
| if args['한자 정보2'] then
| |
| hanja = args[1]; mean = args[2]; sound = args[3]
| |
| else
| |
| hanja = args['한자'] ; mean = args['뜻'] ; sound = args['소리']
| |
| end
| |
| self.hanja_header:tag('span'):addClass('hanja'):wikitext('[[' ..hanja ..']]')
| |
| if sound == " " then
| |
| self.hanja_header:tag('span'):addClass('mean'):wikitext(' ' .. mean)
| |
| else
| |
| self.hanja_header:tag('span'):addClass('mean'):wikitext(ustring.format(' %s <i>〔</i>%s</i>〕</i>', mean, sound))
| |
| end
| |
| self.hanja_header:wikitext(css)
| |
| return self.hanja_header
| |
|
| |
| elseif args['모드'] == '풀이' then
| |
| return ''
| |
| end
| |
|
| |
| self.trad = {
| |
| ["한자"] = args["한자"] or " ",
| |
| ["뜻"] = args["뜻"] or " ",
| |
| ["소리"] = args["소리"] or '-',
| |
| ["부수"] = args["부수"] or " ",
| |
| ["획수"] = args["획수"] or " ",
| |
| ["획순파일"] = args["획순파일"],
| |
| ["대만식"] = args["정체자"] or 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.jap = {
| |
| ["한자"] = args["신자체"] or args["한자"] or " ",
| |
| ["뜻"] = args["뜻"] or " ",
| |
| ["훈독"] = args["훈독"] or "",
| |
| ["음독"] = args["음독"] or "",
| |
| ["오음"] = args["오음"] or "",
| |
| ["한음"] = args["한음"] or "",
| |
| ["당음"] = args["당음"] or "",
| |
| ["관용음"] = args["관용음"] or "",
| |
| ["획수"] = args["신자체 획수"] or args["획수"] or " ",
| |
| ["획순파일"] = args["신자체 획순파일"] or
| |
| args["획순파일"],
| |
| ["부수"] = args["신자체 부수"] or args["부수"] or " "
| |
| }
| |
| self.simp = {
| |
| ["한자"] = args["간체자"] or args["한자"] or " ",
| |
| ["뜻"] = args["뜻"] or " ",
| |
| ["병음"] = args["병음"] or " ",
| |
| ["중고한어"] = args["중고한어"] or "",
| |
| ["획수"] = args["간체자 획수"] or args["획수"] or " ",
| |
| ["획순파일"] = args["간체자 획순파일"] or
| |
| args["획순파일"],
| |
| ["부수"] = args["간체자 부수"] or args["부수"] or " "
| |
| }
| |
| local currentPage = title_.getCurrentTitle().prefixedText
| |
| local index = ustring.find(currentPage, '/') or 0
| |
| local subPage
| |
| local rootPage
| |
| subPage = ustring.sub(currentPage, index+1, -1)
| |
| rootPage = ustring.sub(currentPage, 1, index-1)
| |
|
| |
| self.hanjalink = ustring.codepoint(self.trad["한자"]); self.unicode = unicode(self.trad["한자"])
| |
| if self.hanjalink > 65535 then --유니코드 U+10000 초과
| |
| self.hanja_header:tag('span'):addClass('hanja'):wikitext(ustring.format('[[%s|%s]]', self.unicode, self.trad["한자"]))
| |
| else --아닐 때
| |
| self.hanja_header:tag('span'):addClass('hanja'):wikitext(ustring.format('[[%s]]', self.trad["한자"]))
| |
| end
| |
|
| |
| if rootPage == '시리즈:리브레 한자사전' then
| |
| if self.trad["부수"] == subPage then -- 제부수일 때
| |
| self.hanja_header:wikitext(ustring.format('[[분류:%s| ]]', self.trad["부수"]))
| |
| else -- 제부수가 아닐 때
| |
| self.hanja_header:wikitext(ustring.format('[[분류:%s|-]]', self.trad["부수"]))
| |
| end
| |
| if not args['상위문서x'] then self.hanja_header:wikitext(ustring.format('[[%s]]<br/>', rootPage)) end
| |
| if self.trad["소리"] == '-' or args['미분류'] then -- 소리가 없을 때
| |
| self.hanja_header:wikitext('[[분류:한자/문자|-]]')
| |
| else -- 소리 있을 때
| |
| self.hanja_header:wikitext(ustring.format('[[분류:한자/문자|%s]]', self.trad['소리']))
| |
| end
| |
| if self.hanjalink > 65535 then --유니코드 U+10000 초과
| |
| self.hanja_header:wikitext(ustring.format('[[분류:%s| ]]', self.unicode))
| |
| else --아닐 때
| |
| self.hanja_header:wikitext(ustring.format('[[분류:%s| ]]', self.trad["한자"]))
| |
| end
| |
| end
| |
| self.hanja_header:tag('span'):addClass('mean'):wikitext(ustring.format(' %s <i>〔</i>%s</i>〕</i>__NOTOC__', self.trad["뜻"], self.trad["소리"]) ..css)
| |
|
| |
| return self:render(args["모드"])
| |
| end
| |
| ------------------------------------------------------------------------------------
| |
| return p | | return p |