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

From blackwiki
Jump to navigation Jump to search
blackwiki>Mr. Stradivarius
(use a makeWikilink function)
blackwiki>Mr. Stradivarius
(use table.concat rather than string concatenation for the getLinksText function)
Line 14: Line 14:
 
-- /Archive 27, then getSubpageLink(3, title) returns a link to Archive 30.
 
-- /Archive 27, then getSubpageLink(3, title) returns a link to Archive 30.
 
local subpageName
 
local subpageName
local startIdx, endIdx, archiveNum = mw.ustring.find(title.subpageText, '^Archive ([0-9]+)')
+
local archiveNum = title.subpageText:match('^Archive ([1-9][0-9]*)$')
 +
archiveNum = tonumber(archiveNum)
 
if archiveNum then
 
if archiveNum then
 
subpageName = 'Archive ' .. (archiveNum + offset)
 
subpageName = 'Archive ' .. (archiveNum + offset)
Line 32: Line 33:
  
 
local function getLinksText(args, title)
 
local function getLinksText(args, title)
local arrowSpacer = '  '
+
local nbsp = ' '
local linkSpacer = '    '
+
local arrowSpacer, linkSpacer
 
if mw.ustring.len(title.subpageText) <= 4 then
 
if mw.ustring.len(title.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.
local emSpace = frame:expandTemplate({title = 'Unicode', args = {mw.ustring.char(8195)}})
+
arrowSpacer = nbsp:rep(5)
arrowSpacer = '&nbsp; ' .. emSpace .. ' &nbsp;&nbsp;'
+
linkSpacer = nbsp:rep(7)
linkSpacer = '&nbsp; ' .. emSpace .. ' &nbsp; ' .. emSpace .. '&nbsp;'
+
else
 +
arrowSpacer = nbsp:rep(2)
 +
linkSpacer = nbsp:rep(4)
 
end
 
end
  
local s = ''
+
local ret = {}
  
 
for offset = -5, -3 do
 
for offset = -5, -3 do
Line 47: Line 50:
 
if link then
 
if link then
 
if offset == -3 then
 
if offset == -3 then
s = s .. link .. linkSpacer
+
ret[#ret + 1] = link
 +
ret[#ret + 1] = linkSpacer
 
else
 
else
s = s .. link .. ' ←' .. arrowSpacer
+
ret[#ret + 1] = link
 +
ret[#ret + 1] = ' ←'
 +
ret[#ret + 1] = arrowSpacer
 
end
 
end
 
break
 
break
Line 58: Line 64:
 
local link = getSubpageLink(offset, title)
 
local link = getSubpageLink(offset, title)
 
if link then
 
if link then
s = s .. link .. linkSpacer
+
ret[#ret + 1] = link
 +
ret[#ret + 1] = linkSpacer
 
end
 
end
 
end
 
end
  
s = s .. '<span style="font-size:115%;">' .. makeWikilink(title.fullText, title.subpageText) .. '</span>'
+
ret[#ret + 1] = '<span style="font-size:115%;">'
 +
ret[#ret + 1] = makeWikilink(title.prefixedText, title.subpageText)
 +
ret[#ret + 1] = '</span>'
  
 
for offset = 1, 2 do
 
for offset = 1, 2 do
 
local link = getSubpageLink(offset, title)
 
local link = getSubpageLink(offset, title)
 
if link then
 
if link then
s = s .. linkSpacer .. link
+
ret[#ret + 1] = linkSpacer
 +
ret[#ret + 1] = link
 
end
 
end
 
end
 
end
Line 75: Line 85:
 
if link then
 
if link then
 
if offset == 3 then
 
if offset == 3 then
s = s .. linkSpacer .. link
+
ret[#ret + 1] = linkSpacer
 +
ret[#ret + 1] = link
 
else
 
else
s = s .. arrowSpacer .. '→ ' .. link
+
ret[#ret + 1] = arrowSpacer
 +
ret[#ret + 1] = '→ '
 +
ret[#ret + 1] = link
 
end
 
end
 
break
 
break
Line 83: Line 96:
 
end
 
end
  
return s
+
return table.concat(ret)
 
end
 
end
  
Line 96: Line 109:
 
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 .. " 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 "

Revision as of 13:09, 5 October 2014

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

--
-- This module implements {{Automatic archive navigator}}
--

local p = {}

local function makeWikilink(page, display)
	return string.format('[[%s|%s]]', page, display)
end

local function getSubpageLink(offset, title)
	-- 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, title) returns a link to Archive 30.
	local subpageName
	local archiveNum = title.subpageText:match('^Archive ([1-9][0-9]*)$')
	archiveNum = tonumber(archiveNum)
	if archiveNum then
		subpageName = 'Archive ' .. (archiveNum + offset)
	elseif tonumber(title.subpageText) then
		subpageName = title.subpageText + offset
	else
		return nil  -- Couldn't parse out a subpage number
	end

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

local function getLinksText(args, title)
	local nbsp = '&nbsp;'
	local arrowSpacer, linkSpacer
	if mw.ustring.len(title.subpageText) <= 4 then
		-- If page names are short, we want more space.
		arrowSpacer = nbsp:rep(5)
		linkSpacer = nbsp:rep(7)
	else
		arrowSpacer = nbsp:rep(2)
		linkSpacer = nbsp:rep(4)
	end

	local ret = {}

	for offset = -5, -3 do
		local link = getSubpageLink(offset, title)
		if link then
			if offset == -3 then
				ret[#ret + 1] = link
				ret[#ret + 1] = linkSpacer
			else
				ret[#ret + 1] = link
				ret[#ret + 1] = ' ←'
				ret[#ret + 1] = arrowSpacer
			end
			break
		end
	end

	for offset = -2, -1 do
		local link = getSubpageLink(offset, title)
		if link then
			ret[#ret + 1] = link
			ret[#ret + 1] = linkSpacer
		end
	end

	ret[#ret + 1] = '<span style="font-size:115%;">'
	ret[#ret + 1] = makeWikilink(title.prefixedText, title.subpageText)
	ret[#ret + 1] = '</span>'

	for offset = 1, 2 do
		local link = getSubpageLink(offset, title)
		if link then
			ret[#ret + 1] = linkSpacer
			ret[#ret + 1] = link
		end
	end

	for offset = 5, 3, -1 do
		local link = getSubpageLink(offset, title)
		if link then
			if offset == 3 then
				ret[#ret + 1] = linkSpacer
				ret[#ret + 1] = link
			else
				ret[#ret + 1] = arrowSpacer
				ret[#ret + 1] = '→ '
				ret[#ret + 1] = link
			end
			break
		end
	end

	return table.concat(ret)
end

local function getMessage(args, title)
	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 .. " 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 .. makeWikilink(title.rootPageTitle.fullText, 'current talk page') .. '.'
		end
		return msg
	end
end

function p._aan(args, title)
	title = title or mw.title.getCurrentTitle()

	local image = args.image
	if not image then
		image = '[[File:' .. (args.icon or 'Replacement filing cabinet.svg') .. '|40x40px|alt=|link=]]'
	end

	local mbox = require('Module:Message box').main('tmbox', {
		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, title) .. '\n' .. getMessage(args, title)
	})

	return mbox .. '__NONEWSECTIONLINK__ __NOEDITSECTION__'
end

function p.aan(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		wrappers = 'Template:Automatic archive navigator'
	})
	return p._aan(args)
end

return p