Module:Auto compact TOC: Difference between revisions
Appearance
Content deleted Content added
No edit summary |
a header could start at the beginning of the page (though it shouldn't in an article) |
||
Line 28: | Line 28: | ||
local letters = Array() |
local letters = Array() |
||
-- Find uppermost headers containing a single ASCII letter. |
-- Find uppermost headers containing a single ASCII letter. |
||
for letter in content:gmatch "%f[^\n]==%s*(%a)%s*==%f[^=]" do |
for letter in content:gmatch "%f[^\n%z]==%s*(%a)%s*==%f[^=]" do |
||
letter = letter:upper() |
letter = letter:upper() |
||
letters:insert(make_TOC_item(letter)) |
letters:insert(make_TOC_item(letter)) |
||
Line 38: | Line 38: | ||
"See also", "References", "Notes", "Further reading", "External links", |
"See also", "References", "Notes", "Further reading", "External links", |
||
} |
} |
||
for header in content:gmatch "%f[^\n]==%s*(..-)%s*==%f[^=]" do |
for header in content:gmatch "%f[^\n%z]==%s*(..-)%s*==%f[^=]" do |
||
if other_headers[header] then |
if other_headers[header] then |
||
rest:insert(make_TOC_item(header)) |
rest:insert(make_TOC_item(header)) |
Latest revision as of 03:27, 30 September 2024
![]() | This module depends on the following other modules: |
Implements {{auto compact TOC}}
require('strict')
local p = {}
local horizontal = require('Module:List').horizontal
local start = [[
__NOTOC__<div id="toc" class="toc plainlinks" role="navigation" aria-labelledby="mw-toc-heading">
<div class="toctitle"><h2 id="mw-toc-heading">Contents</h2></div>
]]
local close = [[</div>]]
local function make_TOC_item(anchor, link_text)
link_text = link_text or anchor
return ("[[#%s|%s]]"):format(anchor, link_text)
end
local Array_mt = { __index = table }
local function Array()
return setmetatable({}, Array_mt)
end
function p.make_TOC(frame)
local content = mw.title.getCurrentTitle():getContent()
if not content then
error "The current page has no content"
end
local letters = Array()
-- Find uppermost headers containing a single ASCII letter.
for letter in content:gmatch "%f[^\n%z]==%s*(%a)%s*==%f[^=]" do
letter = letter:upper()
letters:insert(make_TOC_item(letter))
end
local yesno = require('Module:Yesno')
local rest = Array()
local other_headers = require('Module:TableTools').listToSet{
"See also", "References", "Notes", "Further reading", "External links",
}
for header in content:gmatch "%f[^\n%z]==%s*(..-)%s*==%f[^=]" do
if other_headers[header] then
rest:insert(make_TOC_item(header))
end
end
return start .. horizontal(letters) .. horizontal(rest) .. close
end
return p