Module:AutomaticArchiveNavigator

-- -- This module implements -- local p = {} local args local frame local thisPage

-- Get a formatted link to the subpage a certain distance away, or nil -- if that subpage does not exist. e.g. If the current subpage is -- /Archive 27, then getSubpageLink(3) returns a link to Archive 30. local function getSubpageLink(offset) local subpageName local startIdx, endIdx, archiveNum = mw.ustring.find(thisPage.subpageText, '^Archive ([0-9]+)') if archiveNum then subpageName = 'Archive ' .. (archiveNum + offset) elseif tonumber(thisPage.subpageText) then subpageName = thisPage.subpageText + offset else return nil -- Couldn't parse out a subpage number end

local page = mw.title.new(thisPage.baseText .. '/' .. subpageName, thisPage.namespace) if page.exists then return  .. subpageName ..  else return nil end end

local function getLinksText local arrowSpacer = ' ' local linkSpacer = '   ' if mw.ustring.len(thisPage.subpageText) <= 4 then -- If page names are short, we want more space. But why the mix of regular, non-breaking, and em spaces? local emSpace = frame:expandTemplate({title = 'Unicode', args = {mw.ustring.char(8195)}}) arrowSpacer = ' ' .. emSpace .. '  '        linkSpacer = '  ' .. emSpace .. '  ' .. emSpace .. ' '   end local s = '' for offset = -5, -3 do       local link = getSubpageLink(offset) if link then if offset == -3 then s = s .. link .. linkSpacer else s = s .. link .. ' ←' .. arrowSpacer end break end end for offset = -2, -1 do       local link = getSubpageLink(offset) if link then s = s .. link .. linkSpacer end end

s = s .. ' ' .. thisPage.subpageText .. ' ' for offset = 1, 2 do       local link = getSubpageLink(offset) if link then s = s .. linkSpacer .. link end end for offset = 5, 3, -1 do       local link = getSubpageLink(offset) if link then if offset == 3 then s = s .. linkSpacer .. link else s = s .. arrowSpacer .. '→ ' .. link end break end end

return s end

local function getMessage if args[1] == '1' then return '' else local msg = '\n' if args.text then msg = msg .. args.text else msg = msg .. "This is an archive of past discussions" if args.period then msg = msg .. "&#32;for the period '''" .. args.period .. "'''"           end msg = msg .. ". Do not edit the contents of this page. If you wish to start a new discussion or revive an old one, please do so on the " msg = msg .. "current talk page." end return msg end end

local function _aan frame = mw.getCurrentFrame -- For testing purposes, allow passing in the page name as a param. if args.title then thisPage = mw.title.new(args.title) else thisPage = mw.title.getCurrentTitle end local image = args.image if not image then image = '' end local mbox = frame:expandTemplate({title = 'tmbox', args = {       image = image,        imageright = args.imageright,        style = args.style or 'width:80%;margin-left:auto;margin-right:auto;',        textstyle = args.textstyle or 'text-align:center;',        text = getLinksText .. '\n' .. getMessage    }}) return mbox .. '__NONEWSECTIONLINK__ ' end

function p.aan(frame) local origArgs -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw.getCurrentFrame then origArgs = frame:getParent.args else origArgs = frame end -- ParserFunctions considers the empty string to be false, so to preserve the previous -- template behavior, change any empty arguments to nil, so Lua will consider -- them false too. args = {} for k, v in pairs(origArgs) do       if v ~= '' then args[k] = v       end end return _aan end return p