Difference between revisions of "Module:Automatic archive navigator/sandbox"

From blackwiki
Jump to navigation Jump to search
blackwiki>Steel1943
(Create sandbox version of Module:AutomaticArchiveNavigator)
 
blackwiki>Mr. Stradivarius
(start work on making global variables local)
Line 5: Line 5:
 
local p = {}
 
local p = {}
 
   
 
   
local args
 
 
local frame
 
local frame
 
local thisPage
 
local thisPage
Line 12: Line 11:
 
-- if that subpage does not exist. e.g. If the current subpage is
 
-- if that subpage does not exist. e.g. If the current subpage is
 
-- /Archive 27, then getSubpageLink(3) returns a link to Archive 30.
 
-- /Archive 27, then getSubpageLink(3) returns a link to Archive 30.
local function getSubpageLink(offset)
+
local function getSubpageLink(thisPage, offset)
    local subpageName
+
local subpageName
    local startIdx, endIdx, archiveNum = mw.ustring.find(thisPage.subpageText, '^Archive ([0-9]+)')
+
local startIdx, endIdx, archiveNum = mw.ustring.find(thisPage.subpageText, '^Archive ([0-9]+)')
    if archiveNum then
+
if archiveNum then
        subpageName = 'Archive ' .. (archiveNum + offset)
+
subpageName = 'Archive ' .. (archiveNum + offset)
    elseif tonumber(thisPage.subpageText) then
+
elseif tonumber(thisPage.subpageText) then
        subpageName = thisPage.subpageText + offset
+
subpageName = thisPage.subpageText + offset
    else
+
else
        return nil  -- Couldn't parse out a subpage number
+
return nil  -- Couldn't parse out a subpage number
    end
+
end
  
    local page = mw.title.new(thisPage.baseText .. '/' .. subpageName, thisPage.namespace)
+
local page = mw.title.new(thisPage.baseText .. '/' .. subpageName, thisPage.namespace)
    if page.exists then
+
if page.exists then
        return '[[../' .. subpageName .. '|' .. subpageName .. ']]'
+
return '[[../' .. subpageName .. '|' .. subpageName .. ']]'
    else
+
else
        return nil
+
return nil
    end
+
end
 
end
 
end
  
local function getLinksText()
+
local function getLinksText(args)
    local arrowSpacer = '  '
+
local arrowSpacer = '  '
    local linkSpacer = '    '
+
local linkSpacer = '    '
    if mw.ustring.len(thisPage.subpageText) <= 4 then
+
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?
+
-- 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)}})
+
local emSpace = frame:expandTemplate({title = 'Unicode', args = {mw.ustring.char(8195)}})
        arrowSpacer = '&nbsp; ' .. emSpace .. ' &nbsp;&nbsp;'
+
arrowSpacer = '&nbsp; ' .. emSpace .. ' &nbsp;&nbsp;'
        linkSpacer = '&nbsp; ' .. emSpace .. ' &nbsp; ' .. emSpace .. '&nbsp;'
+
linkSpacer = '&nbsp; ' .. emSpace .. ' &nbsp; ' .. emSpace .. '&nbsp;'
    end
+
end
   
+
    local s = ''
+
local s = ''
   
+
    for offset = -5, -3 do
+
for offset = -5, -3 do
        local link = getSubpageLink(offset)
+
local link = getSubpageLink(thisPage, offset)
        if link then
+
if link then
            if offset == -3 then
+
if offset == -3 then
                s = s .. link .. linkSpacer
+
s = s .. link .. linkSpacer
            else
+
else
                s = s .. link .. ' ←' .. arrowSpacer
+
s = s .. link .. ' ←' .. arrowSpacer
            end
+
end
            break
+
break
        end
+
end
    end
+
end
   
+
    for offset = -2, -1 do
+
for offset = -2, -1 do
        local link = getSubpageLink(offset)
+
local link = getSubpageLink(offset)
        if link then
+
if link then
            s = s .. link .. linkSpacer
+
s = s .. link .. linkSpacer
        end
+
end
    end
+
end
  
    s = s .. '<span style="font-size:115%;">[[' .. thisPage.fullText .. '|' .. thisPage.subpageText .. ']]</span>'
+
s = s .. '<span style="font-size:115%;">[[' .. thisPage.fullText .. '|' .. thisPage.subpageText .. ']]</span>'
   
+
    for offset = 1, 2 do
+
for offset = 1, 2 do
        local link = getSubpageLink(offset)
+
local link = getSubpageLink(offset)
        if link then
+
if link then
            s = s .. linkSpacer .. link
+
s = s .. linkSpacer .. link
        end
+
end
    end
+
end
   
+
    for offset = 5, 3, -1 do
+
for offset = 5, 3, -1 do
        local link = getSubpageLink(offset)
+
local link = getSubpageLink(offset)
        if link then
+
if link then
            if offset == 3 then
+
if offset == 3 then
                s = s .. linkSpacer .. link
+
s = s .. linkSpacer .. link
            else
+
else
                s = s .. arrowSpacer .. '→ ' .. link
+
s = s .. arrowSpacer .. '→ ' .. link
            end
+
end
            break
+
break
        end
+
end
    end
+
end
  
    return s
+
return s
 
end
 
end
  
local function getMessage()
+
local function getMessage(args)
    if args[1] == '1' then
+
if args[1] == '1' then
        return ''
+
return ''
    else
+
else
        local msg = '----\n'
+
local msg = '----\n'
        if args.text then
+
if args.text then
            msg = msg .. args.text
+
msg = msg .. args.text
        else
+
else
            msg = msg .. "This is an '''[[Help:Archiving a talk page|archive]]''' of past discussions"
+
msg = msg .. "This is an '''[[Help:Archiving a talk page|archive]]''' of past discussions"
            if args.period then
+
if args.period then
                msg = msg .. "&#32;for the period '''" .. args.period .. "'''"
+
msg = msg .. "&#32;for the period '''" .. args.period .. "'''"
            end
+
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 .. ". '''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 .. "[[" .. thisPage.rootPageTitle.fullText .. "|current talk page]]."
+
msg = msg .. "[[" .. thisPage.rootPageTitle.fullText .. "|current talk page]]."
        end
+
end
        return msg
+
return msg
    end
+
end
 
end
 
end
  
local function _aan()
+
function p._aan(args)
    frame = mw.getCurrentFrame()
+
frame = mw.getCurrentFrame()
 
   
 
   
    -- For testing purposes, allow passing in the page name as a param.
+
-- For testing purposes, allow passing in the page name as a param.
    if args.title then
+
if args.title then
        thisPage = mw.title.new(args.title)
+
thisPage = mw.title.new(args.title)
    else
+
else
        thisPage = mw.title.getCurrentTitle()
+
thisPage = mw.title.getCurrentTitle()
    end
+
end
   
+
    local image = args.image
+
local image = args.image
    if not image then
+
if not image then
        image = '[[File:' .. (args.icon or 'Replacement filing cabinet.svg') .. '|40x40px|alt=|link=]]'
+
image = '[[File:' .. (args.icon or 'Replacement filing cabinet.svg') .. '|40x40px|alt=|link=]]'
    end
+
end
   
+
    local mbox = frame:expandTemplate({title = 'tmbox', args = {
+
local mbox = frame:expandTemplate({title = 'tmbox', args = {
        image = image,
+
image = image,
        imageright = args.imageright,
+
imageright = args.imageright,
        style = args.style or 'width:80%;margin-left:auto;margin-right:auto;',
+
style = args.style or 'width:80%;margin-left:auto;margin-right:auto;',
        textstyle = args.textstyle or 'text-align:center;',
+
textstyle = args.textstyle or 'text-align:center;',
        text = getLinksText() .. '\n' .. getMessage()
+
text = getLinksText(args) .. '\n' .. getMessage(args)
    }})
+
}})
   
+
    return mbox .. '__NONEWSECTIONLINK__ __NOEDITSECTION__'
+
return mbox .. '__NONEWSECTIONLINK__ __NOEDITSECTION__'
 
end
 
end
  
 
function p.aan(frame)
 
function p.aan(frame)
    local origArgs
+
local origArgs
    -- If called via #invoke, use the args passed into the invoking template.
+
-- If called via #invoke, use the args passed into the invoking template.
    -- Otherwise, for testing purposes, assume args are being passed directly in.
+
-- Otherwise, for testing purposes, assume args are being passed directly in.
    if frame == mw.getCurrentFrame() then
+
if frame == mw.getCurrentFrame() then
        origArgs = frame:getParent().args
+
origArgs = frame:getParent().args
    else
+
for k, v in pairs(frame.args) do
        origArgs = frame
+
origArgs = frame.args
    end
+
break
+
end
    -- ParserFunctions considers the empty string to be false, so to preserve the previous  
+
else
    -- template behavior, change any empty arguments to nil, so Lua will consider
+
origArgs = frame
    -- them false too.
+
end
    args = {}
+
-- ParserFunctions considers the empty string to be false, so to preserve the previous  
    for k, v in pairs(origArgs) do
+
-- template behavior, change any empty arguments to nil, so Lua will consider
        if v ~= '' then
+
-- them false too.
            args[k] = v
+
args = {}
        end
+
for k, v in pairs(origArgs) do
    end
+
if v ~= '' then
   
+
args[k] = v
    return _aan()
+
end
 +
end
 +
return p._aan(args)
 
end
 
end
 
   
 
   
 
return p
 
return p

Revision as of 23:51, 13 November 2013

Documentation for this module may be created at Module:Automatic archive navigator/sandbox/doc

--
-- This module implements {{Automatic archive navigator}}
--
 
local p = {}
 
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(thisPage, 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(args)
	local arrowSpacer = '&nbsp;&nbsp;'
	local linkSpacer = '&nbsp;&nbsp;&nbsp;&nbsp;'
	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 = '&nbsp; ' .. emSpace .. ' &nbsp;&nbsp;'
		linkSpacer = '&nbsp; ' .. emSpace .. ' &nbsp; ' .. emSpace .. '&nbsp;'
	end
	
	local s = ''
	
	for offset = -5, -3 do
		local link = getSubpageLink(thisPage, 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 .. '<span style="font-size:115%;">[[' .. thisPage.fullText .. '|' .. thisPage.subpageText .. ']]</span>'
	
	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(args)
	if args[1] == '1' then
		return ''
	else
		local msg = '----\n'
		if args.text then
			msg = msg .. args.text
		else
			msg = msg .. "This is an '''[[Help:Archiving a talk page|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 .. "[[" .. thisPage.rootPageTitle.fullText .. "|current talk page]]."
		end
		return msg
	end
end

function p._aan(args)
	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') .. '|40x40px|alt=|link=]]'
	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(args) .. '\n' .. getMessage(args)
	}})
	
	return mbox .. '__NONEWSECTIONLINK__ __NOEDITSECTION__'
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
		for k, v in pairs(frame.args) do
			origArgs = frame.args
			break
		end
	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 p._aan(args)
end
 
return p