Module:AutomaticArchiveNavigator

From Sarkarverse
Jump to navigation Jump to search

--

-- 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 .. '|' .. 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 .. " 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 = 'File:' .. (args.icon or 'Replacement filing cabinet.svg') .. ''
   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 .. ' '

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