Documentation for this module may be created at Module:Tabs/doc
local getArgs = require('Module:Arguments').getArgs local Tabs = {} function Tabs.static(frame) local args = getArgs(frame) local tabCount = Tabs.number_of_tabs(args) local this = tonumber(args['This']) or Tabs.computeThis(args, tabCount) local this2 = tonumber(args['This2']) local outerDiv = mw.html.create('div') :addClass('tabs-static') :attr('data-nosnippet', '') local ul = outerDiv:tag('ul') :attr('class', 'nav nav-tabs navigation-not-searchable tabs tabs' .. tabCount) for i = 1, tabCount do local link = args['link' .. i] local tabName = args['name' .. i] local text if link ~= nil then -- If name is unspecified, then use the last link segment as the name tabName = tabName or Tabs.computeLastSegment(link) text = '[[' .. link .. '|' .. tabName .. ']]' else text = tabName end local li = ul:tag('li') :wikitext(text) if (i == this) or (i == this2) then li:addClass('active') end end -- optionally add more tab bars beneath local extra = '' if this and args['tabs' .. this] ~= nil then extra = args['tabs' .. this] end return tostring(outerDiv) .. extra end function Tabs.computeThis(args, tabCount) local fullPageName = mw.title.getCurrentTitle().prefixedText local this = nil -- Finds the link that is a prefix of the current page. If there are more than one, choose the longest, then first. -- For example, if the current page is ab/cd/e3, then among -- ab/cd/e1 -- ab/cd/e2 -- ab/cd/e -- ab/cd -- ab/cg -- ab -- it will pick ab/cd. local maxLinkLength = -1 for i = 1, tabCount do local link = args['link' .. i] if link ~= nil then link = mw.ustring.gsub(link, '_', ' ') local linkLength = mw.ustring.len(link) local charAfter = mw.ustring.sub(fullPageName, linkLength + 1, linkLength + 1) if mw.ustring.sub(fullPageName, 1, linkLength) == link -- Prefix must be aligned at '/' boundaries and (charAfter == '/' or charAfter == '') and linkLength > maxLinkLength then maxLinkLength = linkLength this = i end end end return this end -- Computes the number of tabs requested function Tabs.number_of_tabs(args) mw.log(args) mw.logObject(args) args = args or {} local i = 0 while args['name' .. (i + 1)] ~= nil or args['link' .. (i + 1)] ~= nil do i = i + 1 end if i == 0 then error('You are trying to add a "Tabs" template without arguments for names nor links') end return i end -- Computes the last segment of a page name -- e.g. Tabs.computeLastSegment('abc/def/ghi') -> 'ghi' function Tabs.computeLastSegment(pageName) local start = 1 while true do local nextStart, nextEnd = mw.ustring.find(pageName, '/', start) if nextStart == nil then return mw.ustring.sub(pageName, start) end start = nextEnd + 1 end end --[[ Creates dynamic tabs. Entry point of Template:Tabs dynamic ]] function Tabs.dynamic(args) local this = tonumber(args['This']) or 1 local hideShowAll = args['hide-showall'] local tabs = Tabs.number_of_tabs(args) local list = '\n<ul class="nav nav-tabs tabs tabs' .. tabs .. '">' local innerDiv = '\n<div class="tabs-content wiki-bordercolor-light">' local i = 1 while(i <= tabs) do local text = args['name' .. i] local li = '\n<li class="tab' .. i .. ' ' .. ((this == i) and 'active' or '') .. '>' .. text .. '</li>' list = list .. li local content = args['content' .. i] if content ~= nil then local contentDiv = '\n<div class="content' .. i .. ((this == i) and ' active' or '') .. '">' .. '\n' .. content .. '</div>' innerDiv = innerDiv .. contentDiv end i = i + 1 end if (hideShowAll == nil) then local li = '<li class="show-all">Show All</li>' list = list .. li end list = list .. '\n</ul>' local outerDiv = '<div class="tabs-dynamic">' outerDiv = outerDiv .. list .. innerDiv if args['content1'] ~= nil then outerDiv = outerDiv .. '\n</div>\n</div>' -- close off both inner and outer end return outerDiv end return Tabs