Module:Large category TOC
From TechInfoDepot
Jump to navigationJump to search
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}}
The above documentation is transcluded from Module:Large category TOC/doc. (edit | history) Editors can experiment in this module's sandbox (create | mirror) and testcases (create) pages. Subpages of this module. |
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