--
--
구현을 위한 모듈입니다.
--
local p = {}
local navbar = require('모듈:Navbar')._navbar local getArgs -- lazily initialized
local args local tableRowAdded = false local border local listnums = {}
local function trim(s) return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) end
local function addNewline(s) if s:match('^') or s:match('^{|') thenreturn '\n' .. s ..'\n' elsereturn s end end
local function addTableRow(tbl) -- If any other rows have already been added, then we add a 2px gutter row.if tableRowAdded thentbl:tag('tr'):css('height', '2px'):tag('td'):attr('colspan',2)
end
tableRowAdded = true
return tbl:tag('tr') end
local function renderNavBar(titleCell) -- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left-- or right to keep the title centered.local spacerSide = nil
if args['상태'] == 'off' then-- No navbar, and client wants no spacer, i.e. wants the title to be shifted to the left. If there's-- also no show/hide link, then we need a spacer on the right to achieve the left shift.if args['상태'] == 'plain' then spacerSide = 'right' end elseif args.navbar == 'plain' or (not args['이름'] and mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', ) == '틀:둘러보기 상자') then-- No navbar. Need a spacer on the left to balance out the width of the show/hide link.if args['상태'] ~= 'plain' then spacerSide = 'left' end else-- Will render navbar (or error message). If there's no show/hide link, need a spacer on the right-- to balance out the width of the navbar.if args['상태'] == 'plain' then spacerSide = 'right' end
titleCell:wikitext(navbar{args['이름'],mini = 1,fontstyle = (args['기반모양'] or ) .. ';' .. (args['제목모양'] or ) .. ';background:none transparent;border:none;'
})end
-- Render the spacer div.if spacerSide thentitleCell:tag('span'):css('float', spacerSide):css('width', '6em'):wikitext(' ')
end
end
-- -- 제목 구문 -- local function renderTitleRow(tbl) if not args['제목'] then return end
local titleRow = addTableRow(tbl)
if args['제목묶음'] thentitleRow:tag('th'):attr('scope', 'row'):addClass('navbox-group'):addClass(args['제목묶음속성']):cssText(args['기반모양']):cssText(args['묶음모양']):cssText(args['제목묶음모양']):wikitext(args['제목묶음'])
end
local titleCell = titleRow:tag('th'):attr('scope', 'col')
if args['제목묶음'] thentitleCell:css('border-left', '2px solid #fdfdfd'):css('width', '100%')
end
local titleColspan = 2if args['왼쪽그림'] then titleColspan = titleColspan + 1 endif args['그림'] then titleColspan = titleColspan + 1 endif args['제목묶음'] then titleColspan = titleColspan - 1 end
titleCell:cssText(args['기반모양']):cssText(args['제목모양']):addClass('navbox-title'):attr('colspan', titleColspan)
renderNavBar(titleCell)
titleCell:tag('div'):addClass(args['제목속성']):css('font-size', '114%'):wikitext(addNewline(args['제목']))
end
-- -- 아랫글/윗글 구문 --
local function getAboveBelowColspan() local ret = 2if args['왼쪽그림'] then ret = ret + 1 endif args['그림'] then ret = ret + 1 endreturn ret end
local function renderAboveRow(tbl) if not args['윗글'] then return end
addTableRow(tbl):tag('td'):addClass('navbox-abovebelow'):addClass(args['윗글속성']):cssText(args['기반모양']):cssText(args['윗글모양']):attr('colspan', getAboveBelowColspan()):tag('div'):wikitext(addNewline(args['윗글']))
end
local function renderBelowRow(tbl) if not args['아랫글'] then return end
addTableRow(tbl):tag('td'):addClass('navbox-abovebelow'):addClass(args['아랫글속성']):cssText(args['기반모양']):cssText(args['아랫글모양']):attr('colspan', getAboveBelowColspan()):tag('div'):wikitext(addNewline(args['아랫글']))
end
-- -- 내용 구문 -- local function renderListRow(tbl, listnum) local row = addTableRow(tbl)
if listnum == 1 and args['왼쪽그림'] thenrow:tag('td'):addClass('navbox-image'):addClass(args['그림속성']):css('width', '0%'):css('padding', '0px 2px 0px 0px'):cssText(args['왼쪽그림모양']):attr('rowspan', 2 * #listnums - 1):tag('div'):wikitext(addNewline(args['왼쪽그림']))
end
if args['묶음' .. listnum] thenlocal groupCell = row:tag('th')
groupCell:attr('scope', 'row'):addClass('navbox-group'):addClass(args['묶음속성']):cssText(args['기반모양'])
if args['묶음너비'] thengroupCell:css('width', args['묶음너비'])
end
groupCell:cssText(args['묶음모양']):cssText(args['묶음' .. listnum .. '모양']):wikitext(args['묶음' .. listnum]) end
local listCell = row:tag('td')
if args['묶음' .. listnum] thenlistCell:css('text-align', 'left'):css('border-left-width', '2px'):css('border-left-style', 'solid')
elselistCell:attr('colspan', 2) end
if not args['묶음너비'] thenlistCell:css('width', '100%') end
local isOdd = (listnum % 2) == 1local rowstyle = args['짝수모양']if isOdd then rowstyle = args['홀수모양'] end
local evenOddif args.evenodd == 'swap' thenif isOdd then evenOdd = 'even' else evenOdd = 'odd' end elseif isOdd then evenOdd = args.evenodd or 'odd' else evenOdd = args.evenodd or 'even' end end
listCell:css('padding', '0px'):cssText(args['내용모양']):cssText(rowstyle):cssText(args['내용' .. listnum .. '모양']):addClass('navbox-list'):addClass('navbox-' .. evenOdd):addClass(args['내용속성']):tag('div'):css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em'):wikitext(addNewline(args['내용' .. listnum]))
if listnum == 1 and args['그림'] thenrow:tag('td'):addClass('navbox-image'):addClass(args['그림속성']):css('width', '0%'):css('padding', '0px 0px 0px 2px'):cssText(args['그림모양']):attr('rowspan', 2 * #listnums - 1):tag('div'):wikitext(addNewline(args['그림']))
end end
--
-- 분류 추적
--
local function needsHorizontalLists() if border == 'child' or border == 'subgorup' or args.tracking == 'no' then return false end
local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist hwrap', 'hlist vcard', 'vcard hlist', 'hlist vevent'}for i, cls in ipairs(listClasses) doif args['내용속성'] == cls or args['내용속성'] == cls thenreturn false end end
return true end
local function hasBackgroundColors() return mw.ustring.match(args['제목모양'] or ,'background') or mw.ustring.match(args['묶음모양'] or ,'background') or mw.ustring.match(args['기반모양'] or ,'background') end
local function isIllegible() local styleratio = require('모듈:Color contrast')._styleratio
for key, style in pairs(args) doif tostring(key):match("style$") thenif styleratio{mw.text.unstripNoWiki(style)} < 4.5 thenreturn true end end endreturn false end
local function getTrackingCategories() local cats = {}if needsHorizontalLists() then table.insert(cats, '가로 목록을 지원하지 않는 둘러보기 틀') endif hasBackgroundColors() then table.insert(cats, '배경색을 사용하는 둘러보기 틀') endif isIllegible() then table.insert(cats, '읽기 어려울 수 있는 둘러보기 틀') endreturn cats end
local function renderTrackingCategories(builder) local title = mw.title.getCurrentTitle()if title.namespace ~= 10 then return end -- not in template spacelocal subpage = title.subpageTextif subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end
for i, cat in ipairs(getTrackingCategories()) dobuilder:wikitext() end end
-- -- 둘러보기 상자 표 본문 구문 -- local function renderMainTable() local tbl = mw.html.create('table'):addClass('nowraplinks'):addClass(args['내용속성'])
if args.title and (args['상태'] ~= 'plain' and args['상태'] ~= 'off') thentbl:addClass('collapsible'):addClass(args['상태'] or 'autocollapse')
end
tbl:css('border-spacing', 0)if border == 'subgroup' or border == 'child' or border == 'none' thentbl:addClass('navbox-subgroup'):cssText(args['내용모양']):cssText(args['모양'])
else -- regular navobx - bodystyle and style will be applied to the wrapper tabletbl:addClass('navbox-inner'):css('background', 'transparent'):css('color', 'inherit')
endtbl:cssText(args['내부모양'])
renderTitleRow(tbl)renderAboveRow(tbl)for i, listnum in ipairs(listnums) dorenderListRow(tbl, listnum) endrenderBelowRow(tbl)
return tbl end
function p._navbox(navboxArgs) args = navboxArgs
for k, v in pairs(args) dolocal listnum = ( .. k):match('^list(%d+)$')if listnum then table.insert(listnums, tonumber(listnum)) end endtable.sort(listnums)
border = trim(args['border'] or args[1] or )
-- render the main body of the navboxlocal tbl = renderMainTable()
-- render the appropriate wrapper around the navbox, depending on the border paramlocal res = mw.html.create()if border == 'none' thenres:node(tbl)
elseif border == 'subgroup' or border == 'child' then-- We assume that this navbox is being rendered in a list cell of a parent navbox, and is-- therefore inside a div with padding:0em 0.25em. We start with a to avoid the-- padding being applied, and at the end add a
res:wikitext('') -- XXX: hack due to lack of unclosed support in mw.html.:node(tbl):wikitext('
elseres:tag('table'):addClass('navbox'):css('border-spacing', 0):cssText(args['내용모양']):cssText(args['모양']):tag('tr'):tag('td'):css('padding', '2px'):node(tbl)
end
renderTrackingCategories(res)
return tostring(res) end
function p.navbox(frame) if not getArgs thengetArgs = require('모듈:Arguments').getArgs endargs = getArgs(frame, {wrappers = '틀:둘러보기 상자'})
-- Read the arguments in the order they'll be output in, to make references number in the right order.local __ = args['제목']_ = args['윗글']for i = 1, 20 do_ = args["묶음" .. tostring(i)]_ = args["내용" .. tostring(i)] end_ = args['아랫글']
return p._navbox(args) end
return p