Module:Large category TOC

From TechInfoDepot
Jump to navigationJump to search
Documentation icon Module documentation[view] [edit] [history] [purge]

Usage

This module implements Template:Large category TOC and similar templates. It is used on categories with many members to provide a means of indexing them by first letter and first two letters

For scrollable lists (Template:Large category TOC):

{{#invoke:Large category TOC|scrollable}}

For shorter lists (Template:Large category TOC 2):

{{#invoke:Large category TOC|aejot}}

For collapsible lists (Template:Collapsible large category TOC):

{{#invoke:Large category TOC|collapsible}}

  1 local p = {}
  2 
  3 local azupper = mw.text.split('ABCDEFGHIJKLMNOPQRSTUVWXYZ','')
  4 local azlower = mw.text.split('abcdefghijklmnopqrstuvwxyz','')
  5 local aejot = mw.text.split('aejot','')
  6 
  7 function p.scrollable(frame)
  8 	return main('scrollable')
  9 end
 10 
 11 function p.collapsible(frame)
 12 	return main('collapsible')
 13 end
 14 
 15 function p.aejot(frame)
 16 	return main('aejot')
 17 end
 18 
 19 function main(toc_type)
 20 	-- It should be much faster to only process these once, and just re use them as variables
 21 	local pageurl = mw.title.getCurrentTitle():fullUrl()
 22 	local toc = mw.message.new('Toc'):plain()
 23 	
 24 	-- Highest level div
 25 	local toc_frame = mw.html.create('div')
 26 				:addClass('plainlinks')
 27 				:addClass('hlist')
 28 				:addClass('toc')
 29 				-- :attr('id','toc')
 30 				:css({ display = 'block !important',
 31 						background = 'WhiteSmoke',
 32 						clear = 'both',
 33 						width = '98%' })
 34 
 35 	-- Contains "Content: Top 0-9 A - Z"
 36 	local header = toc_frame:tag('div')
 37 				:attr('id','toctitle')
 38 				:css('background','WhiteSmoke')
 39 	
 40 	-- Contains all the rest
 41 	local body_wrapper
 42 	local body = toc_frame:tag('div')
 43 					:css('text-align', 'center')
 44 	
 45 	if toc_type == 'collapsible' then
 46 		toc_frame:addClass('NavFrame')
 47 		header:addClass('NavHead')
 48 		body:addClass('NavContent')
 49 			:css({ background = 'white',
 50 					display = 'none' })
 51 	elseif toc_type == 'scrollable' then
 52 		body:css({ ['overflow-x'] = 'scroll',
 53 					['overflow-y']= 'hidden',
 54 					['white-space'] = 'nowrap' })
 55 	end
 56 	
 57 	local header_content = {'<strong>',toc,':</strong>',
 58 						' [',pageurl,' Top]',
 59 						' [',pageurl,'?from=0 0–9]' }
 60 	
 61 	for _, v in ipairs(azupper) do
 62 		table.insert(header_content,string.format(' [%s?from=%s %s]',pageurl,v,v))
 63 	end
 64 	header:wikitext(table.concat(header_content))
 65 	
 66 	local body_content = {}
 67 	
 68 	if toc_type == 'collapsible' then
 69 		table.insert(body_content,'<b>#</b> ')
 70 		body_wrapper = body:tag('code')
 71 						:css('background','White')
 72 	else
 73 		table.insert(body_content,'['..pageurl..'?from=* <b>*</b>] <b>#</b> ')
 74 		body_wrapper = body:tag('span')
 75 	end
 76 	
 77 	for i=0,9 do
 78 		table.insert(body_content,string.format(' [%s?from=%s %s]',pageurl,i,i))
 79 	end
 80 	
 81 	local function atoz(letter)
 82 		local azlist = {}
 83 		local letterlist
 84 		if toc_type == 'aejot' then
 85 			letterlist = aejot
 86 		else
 87 			letterlist = azlower
 88 		end
 89 				
 90 		if toc_type == 'aejot' or toc_type == 'scrollable' then
 91 			table.insert(azlist,' • <b>'..letter..'</b> ')
 92 		else
 93 			table.insert(azlist,'<br /><b>'..letter..'</b> ')
 94 		end
 95 			
 96 		for _, v in ipairs(letterlist) do
 97 			table.insert(azlist,string.format(' [%s?from=%s%s %s%s] ',pageurl,letter,v,letter,v))
 98 		end
 99 		return table.concat(azlist)
100 	end
101 	
102 	for _, v in ipairs(azupper) do
103 		table.insert(body_content,atoz(v))
104 	end
105 	
106 	body_wrapper:wikitext(table.concat(body_content))
107 	
108 	return '__NOTOC__\n'..tostring(toc_frame)
109 end
110 
111 return p