Bước tới nội dung

Mô đun:TOC

Bách khoa toàn thư mở Wikipedia
-- This module implements various templates that create custom tables of-- contents.-- Load necessary moduleslocal yesno = require('Mô đun:Yesno')local checkType = require('libraryUtil').checkTypelocal p = {}local function makeTocLink(page, display)	display = display or page	return string.format('[[#%s|%s]]', page, display)endlocal 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)endfunction 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 ''	endendfunction 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)endsetmetatable(p, {__index = function(t, k)	return function (frame)		local args = require('Mô đun:Arguments').getArgs(frame, {			wrappers = {				'Bản mẫu:TOCyears',				'Bản mẫu:List TOC'			}		})		return p['_' .. k](args)	endend})return p