모듈:Navbox temp

포장 (토론 | 기여)님의 2019년 12월 26일 (목) 18:00 판 (새 문서: -- -- {{둘러보기 상자}} 구현을 위한 모듈입니다. -- local p = {} local navbar = require('모듈:Navbar')._navbar local getArgs -- lazily initialized local args local...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

--

--

구현을 위한 모듈입니다.

--

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

to balance out the parent's

res:wikitext('') -- XXX: hack due to lack of unclosed support in mw.html.:node(tbl):wikitext('

') -- XXX: hack due to lack of unclosed support in mw.html.

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