Module:Large category TOC
local p = {}
 
 local azuyir = mw.text.split('அஆஇஈஉஊஎஏஐஒஓஔ','')
 local azmei = mw.text.split('கஙசஞடதநபமயரலவழளறன','')
 local aejot = mw.text.split('ாிுெைொ','')
 
 local function main(toc_type)
 	local toc_frame = mw.html.create('div')
 		:addClass('large-cat-toc')
 		:addClass('plainlinks')
 		:addClass('toc')
 		-- :attr('id','toc')
 		
 	-- Contains &quot;Content: Top 0-9 A - Z&quot;
 	local header = toc_frame:tag('div')
 		:attr('class', 'toctitle')
 	
 	-- Contains all the rest
 	local body_wrapper
 	local body = toc_frame:tag('div')
 		:addClass('large-cat-toc-body')
 		
 	local jumpy_collapse = mw.html.create('div')
 		:addClass('large-cat-toc-jumpy-title')
 	
 	if toc_type == 'collapsible' then
 		toc_frame:addClass('mw-collapsible mw-collapsed')
 		body:addClass('mw-collapsible-content')
 		
 	elseif toc_type == 'scrollable' then
 		toc_frame:addClass('large-cat-toc-scroll')
 	end
 	
 	local pageurl = mw.title.getCurrentTitle():fullUrl()
 	local header_content = {
 		string.format(
 			'&lt;span class=&quot;large-cat-toc-title&quot;&gt;%s:&lt;/span&gt; [%s Top] [%s?from=0 0–9]',
 			mw.message.new('Toc'):plain(),
 			pageurl,
 			pageurl
 		)
 	}
 	
 	for _, v in ipairs(azuyir) do
 		table.insert(header_content, string.format(
 			' [%s?from=%s %s]', pageurl, v, v
 		))
 	end
 	for _, v in ipairs(azmei) do
 		table.insert(header_content, string.format(
 			' [%s?from=%s %s]', pageurl, v, v
 		))
 	end
 	
 	if toc_type == 'collapsible' then
 		jumpy_collapse:wikitext(table.concat(header_content))
 		header:node(jumpy_collapse)
 	else
 		header:wikitext(table.concat(header_content))
 	end
 	
 	local body_content = {}
 	if toc_type ~= 'collapsible' then
 		table.insert(body_content, '&lt;span class=&quot;large-cat-toc-anum&quot;&gt;['..pageurl..'?from=* *]&lt;/span&gt; ')
 	end
 	
 	table.insert(body_content, '&lt;span class=&quot;large-cat-toc-anum&quot;&gt;#&lt;/span&gt; ')
 	body_wrapper = body:tag('span')
 	
 	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 = azmei
 		end
 				
 		if toc_type == 'aejot' or toc_type == 'scrollable' then
 			table.insert(azlist,' • &lt;span class=&quot;large-cat-toc-anum&quot;&gt;'..letter..'&lt;/span&gt; ')
 		else
 			table.insert(azlist,'&lt;br /&gt;&lt;span class=&quot;large-cat-toc-anum&quot;&gt;'..letter..'&lt;/span&gt; ')
 		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(azmei) do
 		table.insert(body_content, atoz(v))
 	end
 	
 	body_wrapper:wikitext(table.concat(body_content))
 	
 	return '__NOTOC__\n' .. mw.getCurrentFrame():extensionTag{
 		name = 'templatestyles', args = { src = 'Module:Large category TOC/styles.css' }
 	} .. tostring(toc_frame)
 end
 
 function p.scrollable(frame)
 	return main('scrollable')
 end
 
 function p.collapsible(frame)
 	return main('collapsible')
 end
 
 function p.aejot(frame)
 	return main('aejot')
 end