Difference between revisions of "Module:Large category TOC/sandbox"

From blackwiki
Jump to navigation Jump to search
blackwiki>The Mol Man
m (51 revisions imported)
 
(47 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
local p = {}
 
local p = {}
  
local azupper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+
local azupper = mw.text.split('ABCDEFGHIJKLMNOPQRSTUVWXYZ','')
local azlower = 'abcdefghijklmnopqrstuvwxyz'
+
local azlower = mw.text.split('abcdefghijklmnopqrstuvwxyz','')
local aejot = 'aejot'
+
local aejot = mw.text.split('aejot','')
  
-- Implements [[Template:Large Category TOC]]
 
 
function p.scrollable(frame)
 
function p.scrollable(frame)
return make(false,true,true)
+
return main('scrollable')
 
end
 
end
  
 
function p.collapsible(frame)
 
function p.collapsible(frame)
return make(true,false,true)
+
return main('collapsible')
 
end
 
end
  
function make(collapsible,scrollable,fullaz)
+
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
 
-- It should be much faster to only process these once, and just re use them as variables
local pageurl = frame:preprocess('{{fullurl:{{FULLPAGENAME}}}}')
+
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',
 +
background = 'WhiteSmoke',
 +
clear = 'both',
 +
width = '98%' })
 +
 
 +
-- Contains "Content: Top 0-9 A - Z"
 +
local header = toc_frame:tag('div')
 +
:attr('id','toctitle')
 +
:attr('class','toctitle')
 +
:css('background','WhiteSmoke')
 
 
local toc_string
+
-- Contains all the rest
if collapsible then
+
local body_wrapper
toc_string = '<div class="collapsible" style="background:transparent;">\n'
+
local body = toc_frame:tag('div')
else
+
:css('text-align', 'center')
toc_string = ''
+
 +
if toc_type == 'collapsible' then
 +
toc_frame:addClass('NavFrame')
 +
header:addClass('NavHead')
 +
body:addClass('NavContent')
 +
:css({ background = 'white',
 +
display = 'none' })
 +
elseif toc_type == 'scrollable' then
 +
body:css({ ['overflow-x'] = 'scroll',
 +
['overflow-y']= 'hidden',
 +
['white-space'] = 'nowrap' })
 
end
 
end
toc_string = toc_string..'<div class="NavFrame" style="clear:both; background:WhiteSmoke;">\n'..
+
'<div class="NavHead" style="background:WhiteSmoke;">\n'..
+
local header_content = {toc,':',
'<div class="plainlinks" id="kat_toc" style="background:WhiteSmoke; text-align:center; font-size:100%;">\n'..
+
' [',pageurl,' Top]',
'<b>Index:</b> ['..pageurl..' *] ['..pageurl..'?from=# 0-9]'
+
' [',pageurl,'?from=0 0–9]' }
-- Add ?from=A through Z to the title bar
+
for i=1,26,1 do
+
for _, v in ipairs(azupper) do
local letter = string.sub(azupper,i,i)
+
table.insert(header_content,string.format(' [%s?from=%s %s]',pageurl,v,v))
toc_string = toc_string..' ['..pageurl..'?from='..letter..' '..letter..']'
 
 
end
 
end
-- Closing tags
+
header:wikitext(table.concat(header_content))
if collapsible then
+
toc_string = toc_string..'<span style="font-size: 85%;">(Click <i>Show</i> for more navigation options.)</span>'
+
local body_content = {}
 +
 +
if toc_type == 'collapsible' then
 +
table.insert(body_content,'<b>#</b> ')
 +
body_wrapper = body:tag('code')
 +
:css('background','White')
 +
else
 +
table.insert(body_content,'['..pageurl..'?from=* <b>*</b>] <b>#</b> ')
 +
body_wrapper = body:tag('span')
 
end
 
end
toc_string = toc_string..'\n</div>\n</div>'
+
if collapsible then
+
for i=0,9 do
toc_string = toc_string..'<div class="NavContent" style="background:White; display:none;">'..
+
table.insert(body_content,string.format(' [%s?from=%s %s]',pageurl,i,i))
'<div class="plainlinks" style="background:White; font-size:100%; text-align:center;">'..
 
'\n----'..
 
'\n<code style="background:White;"> <b>#</b>'
 
else if scrollable then
 
toc_string = toc_string..'<div style="overflow-x:auto; overflow-y:hidden; width:98%;"><span class="plainlinks">'
 
end
 
end
 
-- Add ?from=0 through 9 to the list
 
for i=0,9,1 do
 
toc_string = toc_string..'\n['..pageurl..'?from='..i..' '..i..']'
 
 
end
 
end
 
 
-- Function to handle all 500+ ?from=Aa-z parameters with a simple loop
 
 
local function atoz(letter)
 
local function atoz(letter)
local itlen
+
local azlist = {}
local azstring
+
local letterlist
if fullaz then
+
if toc_type == 'aejot' then
azstring = azlower
+
letterlist = aejot
itlen = 26
 
 
else
 
else
azstring = aejot
+
letterlist = azlower
itlen = 5
 
 
end
 
end
+
local azlist
+
if toc_type == 'aejot' or toc_type == 'scrollable' then
if collapsible then
+
table.insert(azlist,' <b>'..letter..'</b> ')
azlist = '<br>\n<b>'..letter..'</b> '
 
 
else
 
else
azlist = '\n• <b>'..letter..'</b> '
+
table.insert(azlist,'<br /><b>'..letter..'</b> ')
 +
end
 +
 +
for _, v in ipairs(letterlist) do
 +
table.insert(azlist,string.format(' [%s?from=%s%s %s%s] ',pageurl,letter,v,letter,v))
 
end
 
end
for i=1,itlen,1 do
+
return table.concat(azlist)
local lowerletter = string.sub(azstring,i,i)
 
azlist = azlist..' ['..pageurl..'?from='..letter..lowerletter..' '..letter..lowerletter..'] '
 
end
 
return azlist
 
 
end
 
end
 
+
-- A-Z loop that calls the a-z function
+
for _, v in ipairs(azupper) do
for i=1,26,1 do
+
table.insert(body_content,atoz(v))
local letter = string.sub(azupper,i,i)
 
toc_string = toc_string..atoz(letter)
 
 
end
 
end
-- Close tags
+
if collapsible then
+
body_wrapper:wikitext(table.concat(body_content))
toc_string = toc_string..'\n</code>\n</div></div></div>'
+
else
+
return '__NOTOC__\n'..tostring(toc_frame)
if scrollable then
 
toc_string = toc_string..'\n</div>'
 
end
 
toc_string = toc_string..'\n</span></div></div>'
 
end
 
return toc_string
 
 
end
 
end
 +
 
return p
 
return p

Latest revision as of 06:11, 27 September 2020

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

local p = {}

local azupper = mw.text.split('ABCDEFGHIJKLMNOPQRSTUVWXYZ','')
local azlower = mw.text.split('abcdefghijklmnopqrstuvwxyz','')
local aejot = mw.text.split('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',
						background = 'WhiteSmoke',
						clear = 'both',
						width = '98%' })

	-- Contains "Content: Top 0-9 A - Z"
	local header = toc_frame:tag('div')
				:attr('id','toctitle')
				:attr('class','toctitle')
				:css('background','WhiteSmoke')
	
	-- Contains all the rest
	local body_wrapper
	local body = toc_frame:tag('div')
					:css('text-align', 'center')
	
	if toc_type == 'collapsible' then
		toc_frame:addClass('NavFrame')
		header:addClass('NavHead')
		body:addClass('NavContent')
			:css({ background = 'white',
					display = 'none' })
	elseif toc_type == 'scrollable' then
		body:css({ ['overflow-x'] = 'scroll',
					['overflow-y']= 'hidden',
					['white-space'] = 'nowrap' })
	end
	
	local header_content = {toc,':',
						' [',pageurl,' Top]',
						' [',pageurl,'?from=0 0–9]' }
	
	for _, v in ipairs(azupper) do
		table.insert(header_content,string.format(' [%s?from=%s %s]',pageurl,v,v))
	end
	header:wikitext(table.concat(header_content))
	
	local body_content = {}
	
	if toc_type == 'collapsible' then
		table.insert(body_content,'<b>#</b> ')
		body_wrapper = body:tag('code')
						:css('background','White')
	else
		table.insert(body_content,'['..pageurl..'?from=* <b>*</b>] <b>#</b> ')
		body_wrapper = body:tag('span')
	end
	
	for i=0,9 do
		table.insert(body_content,string.format(' [%s?from=%s %s]',pageurl,i,i))
	end
	
	local function atoz(letter)
		local azlist = {}
		local letterlist
		if toc_type == 'aejot' then
			letterlist = aejot
		else
			letterlist = azlower
		end
				
		if toc_type == 'aejot' or toc_type == 'scrollable' then
			table.insert(azlist,' • <b>'..letter..'</b> ')
		else
			table.insert(azlist,'<br /><b>'..letter..'</b> ')
		end
			
		for _, v in ipairs(letterlist) do
			table.insert(azlist,string.format(' [%s?from=%s%s %s%s] ',pageurl,letter,v,letter,v))
		end
		return table.concat(azlist)
	end
	
	for _, v in ipairs(azupper) do
		table.insert(body_content,atoz(v))
	end
	
	body_wrapper:wikitext(table.concat(body_content))
	
	return '__NOTOC__\n'..tostring(toc_frame)
end

return p