Module:TOC
This module implements various table of contents (TOC) templates. At the moment, it implements {{TOCyears}} and {{List TOC}}.
Usage
Avaiable functions
#invoke function | Lua function | Template |
---|---|---|
years | _years | {{TOCyears}} |
list | _list | {{List TOC}} |
From wikitext
From wikitext this module should usually be used through one of the templates in the table above. However, it is also possible to use it with the following syntax:
{{#invoke:TOC|function|args}}
The function names are listed in the table in the "#invoke function" column, and args are the arguments that would normally be added by the template. Please see the template documentation for each template for available parameters.
From Lua
Load the module like this:
local mTOC = require('Module:TOC')
You can then use the functions with the following syntax:
mTOC.func(args)
"func" should be changed to one of the Lua function names in the table above. These all start with an underscore ("_"). The args variable is a table of arguments to be passed to the function. Please see the template documentation for available arguments.
The above documentation is transcluded from Module:TOC/doc. (edit | history) Editors can experiment in this module's sandbox (create | mirror) and testcases (create) pages. Subpages of this module. |
-- This module implements various templates that create custom tables of -- contents. -- Load necessary modules local yesno = require('Module:Yesno') local checkType = require('libraryUtil').checkType local p = {} local function makeTocLink(page, display) display = display or page return string.format('[[#%s|%s]]', page, display) end local function makeToc(s, args) -- Make a TOC box from a string and from the given table of arguments. checkType('makeToc', 1, s, 'string') checkType('makeToc', 2, args, 'table', true) args = args or {} -- Root local root = mw.html.create() local isPrimary = yesno(args.primary) ~= false if isPrimary then root:wikitext('__NOTOC__') end -- Top div tag local top = root:tag('div') top:addClass('toc plainlinks hlist') if isPrimary then top:attr('id', 'toc') end local align = args.align and args.align:lower() if align == 'left' then top :css('float', 'left') :css('clear', args.clear or 'left') elseif align == 'right' then top :css('float', 'right') :css('clear', args.clear or 'right') elseif align == 'center' then top :css('margin', 'auto') :css('clear', args.clear or 'none') else top :css('clear', args.clear or 'left') end top:newline() -- Title div tag local title = args.title or mw.message.new('Toc'):plain() local titleDiv = top:tag('div') titleDiv:attr('id', 'toctitle') if isPrimary then titleDiv:wikitext('<h2>' .. title .. '</h2>') else titleDiv:tag('strong'):wikitext(title) end -- Content top :newline() :wikitext(s) :newline() return tostring(root) end function p._years(args) local i = tonumber(args.startyear) or 1900 local endYear = tonumber(args.endyear) or 1950 local range = tonumber(args.range) local step = tonumber(args.step) or 1 local links = {} while i <= endYear do local year = tostring(i) if range then year = year .. '-' .. tostring(i + range) end links[#links + 1] = makeTocLink(year) i = i + step end if #links > 0 then links = '* ' .. table.concat(links, ' ') return makeToc(links, args) else return '' end end function p._list(args) -- Set up the variables. local noRows = 4 -- The number of rows, starting at key "a". Must be 26 or less. local alphabetPosition = 3 -- The position of the extra alphabet row. local lists, chars = {}, {} for i = 1, noRows do lists[i] = {} end -- Find the relevant keys from the arguments. local a = 97 local endChar = string.char(a + noRows - 1) local pattern = string.format('^([a-%s])([1-9][0-9]*)$', endChar) for k, v in pairs(args) do local letter, num if type(k) == 'string' then letter, num = k:match(pattern) end if letter then local iRow = string.byte(letter) - a + 1 table.insert(lists[iRow], {num = tonumber(num), section = v}) end end -- Sort the tables and replace the value tables with the section name. for i, valueTables in pairs(lists) do table.sort(valueTables, function(t1, t2) return t1.num < t2.num end) for j, valueTable in ipairs(valueTables) do lists[i][j] = valueTable.section end end -- Add the extra alphabet row. -- local A = 65 -- local alphabetRow = {} -- for i = 1, 26 do -- local char = string.char(A + i - 1) -- alphabetRow[i] = char -- end -- table.insert(lists, alphabetPosition, alphabetRow) -- Render the rows. local ret = {} for i, sections in ipairs(lists) do if #sections > 0 then ret[#ret + 1] = '<div>' for j, section in ipairs(sections) do ret[#ret + 1] = '* ' .. makeTocLink(section) end ret[#ret + 1] = '</div>' end end return makeToc(table.concat(ret, '\n'), args) end setmetatable(p, {__index = function(t, k) return function (frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = { 'Template:TOCyears', 'Template:List TOC' } }) return p['_' .. k](args) end end}) return p