Module:Large category TOC

Revision as of 01:55, 18 August 2020 by PeaceDeadC (talk | contribs) (Created page with "local p = {} local azupper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' local azlower = 'abcdefghijklmnopqrstuvwxyz' local aejot = 'aejot' function p.scrollable(frame) return main('scrol...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Documentation for this module may be created at Module:Large category TOC/doc

local p = {}

local azupper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
local azlower = 'abcdefghijklmnopqrstuvwxyz'
local aejot = 'aejot'

function p.scrollable(frame)
	return main('scrollable')
end

function p.collapsible(frame)
	return main('collapsible')
end

function p.aejot(frame)
	return main('aejot')
end

function main(toc_type)
	-- It should be much faster to only process these once, and just re use them as variables
	local pageurl = mw.title.getCurrentTitle():fullUrl()
	local toc = mw.message.new('Toc'):plain()
	
	-- Highest level div
	local toc_frame = mw.html.create('div')
				:addClass('plainlinks')
				:addClass('hlist')
				:addClass('toc')
				-- :attr('id','toc')
				:css('display','block !important')
				:css('background','WhiteSmoke')
				:css('clear','both')
				:css('width','98%')

	-- Contains "Content: Top 0-9 A - Z"
	local header = mw.html.create('div')
				:attr('id','toctitle')
				:css('background','WhiteSmoke')
	
	-- Contains all the rest
	local body_wrapper
	local body = mw.html.create('div')
				:css('text-align', 'center')
	
	if toc_type == 'collapsible' then
		toc_frame:addClass('NavFrame')
		header:addClass('NavHead')
		body:addClass('NavContent')
			:css('background','white')
			:css('display','none')
	elseif toc_type == 'scrollable' then
		body:css('overflow-x','scroll')
			:css('overflow-y','hidden')
			:css('white-space','nowrap')
	end
	
	local header_content = '<strong>'..toc..':</strong>' ..
						' ['..pageurl..' Top]' ..
						' ['..pageurl..'?from=0 0–9]'
	
	for i=1,26,1 do
		local letter = string.sub(azupper,i,i)
		header_content = header_content..' ['..pageurl..'?from='..letter..' '..letter..']'
	end
	
	header:wikitext(header_content)
	
	local body_content
	
	if toc_type == 'collapsible' then
		body_content = '<b>#</b> '
		body_wrapper = mw.html.create('code')
				:css('background','White')
	else
		body_content = '['..pageurl..'?from=* <b>*</b>] <b>#</b> '
		body_wrapper = mw.html.create('span')
	end
	
	for i=0,9,1 do
		body_content = body_content..' ['..pageurl..'?from='..i..' '..i..']'
	end
	
	local function atoz(letter)
		local azlist
		local letterlist
		local maxind
		if toc_type == 'aejot' then
			letterlist = aejot
			maxind = 5
		else
			letterlist = azlower
			maxind = 26
		end
				
		if toc_type == 'aejot' or toc_type == 'scrollable' then
			azlist = ' • <b>'..letter..'</b> '
		else
			azlist = '<br /><b>'..letter..'</b> '
		end
			
		for i=1,maxind,1 do
			local lowerletter = string.sub(letterlist,i,i)
			azlist = azlist..' ['..pageurl..'?from='..letter..lowerletter..' '..letter..lowerletter..'] '
		end
		return azlist
	end
	
	for i=1,26,1 do
		local letter = string.sub(azupper,i,i)
		body_content = body_content..atoz(letter)
	end
	
	body_wrapper:wikitext(body_content)
	body:node(body_wrapper)
	toc_frame:node(header)
	toc_frame:node(body)
	
	return '__NOTOC__\n'..tostring(toc_frame)
end

return p