local p = {}
local starttxt = [[
__NOTOC__<!--
--><div role="navigation" id="toc" class="toc plainlinks hlist" aria-labelledby="tocheading" style="text-align:left;">
<div id="toctitle" class="toctitle" style="text-align:center;"><span id="tocheading" style="font-weight:bold;">Contents</span></div>
<div style="margin:auto;white-space:nowrap;">
]]
local closetxt = [[</div></div>]]
local function getYear(s,y)
if y and mw.ustring.match(y, '^%d+$') then
return y
end
y = mw.ustring.gsub(s, '^.-(%d+).-$', '%1')
return y
end
local function getMonth(s,m)
local mnames = {
['January']=1,
['February']=2,
['March']=3,
['April']=4,
['May']=5,
['June']=6,
['July']=7,
['August']=8,
['September']=9,
['October']=10,
['November']=11,
['December']=12
}
if m and mnames[m] then
return m
end
for k,n in pairs(mnames) do
if mw.ustring.match(s or '', k) then
return k
end
end
return ''
end
function p.main(frame)
local current_title = mw.title.getCurrentTitle()
local pagename = current_title.text
local content = current_title:getContent()
local args = frame.args
local pargs = frame:getParent().args
local outfmt = args['format'] or pargs['format'] or ''
if not content then
error "The current page has no content"
end
local month = getMonth(pagename, args['month'] or pargs['month'] or '')
local year = getYear(pagename, args['year'] or pargs['year'] or '')
local days = {}
local founddays = {}
-- Find uppermost headers containing the days of the month.
for day in mw.ustring.gmatch(content,"%f[^\n]==%s*(%d+[%-–%d]*)%s*" .. month .. "%s*==%f[^=]") do
days[day] = 'df'
table.insert(founddays, day)
end
for day in mw.ustring.gmatch(content,"%f[^\n]==%s*" .. month .. "%s*(%d+[%-–%d]*)%s*==%f[^=]") do
days[day] = 'mf'
table.insert(founddays, day)
end
local extra = args['extra'] or pargs['extra'] or ''
local footerlinks = {}
if extra ~= '' then
footerlinks = mw.text.split(extra, '%s*=%s*')
else
footerlinks = {"Unknown date", "See also", "References", "Notes", "Further reading", "External links"}
end
local footer = {}
for k,v in ipairs(footerlinks) do
if mw.ustring.match(content,"%f[^\n]==%s*" .. v .. "%s*==%f[^=]") then
table.insert(footer, v)
end
end
local entries = { ';' .. month}
for k,d in ipairs(founddays) do
local fmt = days[d]
if fmt == 'df' then
table.insert(entries, ': [[#' .. d .. ' ' .. month .. '|' .. d .. ']]')
elseif fmt == 'mf' then
table.insert(entries, ': [[#' .. month .. ' ' .. d .. '|' .. d .. ']]')
end
end
for k,v in ipairs(footer) do
table.insert(entries, ': [[#' .. v .. '|' .. v .. ']]')
end
return starttxt .. table.concat(entries,"\n") .. closetxt
end
return p