Jump to content

Module:URL to diff

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Mr. Stradivarius (talk | contribs) at 16:18, 1 January 2015 (finish the encoding function). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

-- This module converts Wikipedia diff URLs to the {{diff}} template format.

local newBuffer = require('Module:OutputBuffer')

local p = {}

local validDiffValues = {
	cur = true,
	prev = true,
	['next'] = true
}

local function validateId(s)
	local id = tonumber(s)
	if id and id > 0 then
		return id
	else
		return nil
	end
end

local function validateDiffParam(s)
	if not s then
		return nil
	end
	if validDiffValues[s] then
		return s
	else
		return validateId(s)
	end
end

local function decodeUrl(url)
	if type(url) ~= 'string' then
		return nil
	end
	url = mw.uri.new(url)
	if not url or url.host ~= 'en.wikipedia.org' then
		return nil
	end
	local data = {}
	data.diff = validateDiffParam(url.query.diff)
	data.title = url.query.title and mw.uri.decode(url.query.title, 'WIKI')
	data.oldid = validateId(url.query.oldid)
	data.diffonly = url.query.diffonly
	return data
end

local function encodeDiffTemplate(data)
	if not data.title and not data.diff and not data.oldid then
		return nil
	end
	local isNamed = false -- Track whether we need to use named parameters
	for k, v in pairs(data) do
		if string.find(v, '=') then
			isNamed = true
			break
		end
	end
	local getBuffer, print, printf = newBuffer()
	print('diff')
	printf('%s%s', isNamed and 'page=' or '', data.title or '')
	printf('%s%s', isNamed and 'diff=' or '', data.diff or '')
	printf('%s%s', isNamed and 'oldid=' or '', data.oldid or '')
	if data.label then
		printf('%s%s', isNamed and 'label=' or '', data.label)
	end
	if data.diffonly then
		printf('diffonly=%s', data.diffonly)
	end
	local ret = getBuffer('|')
	ret = '{{' .. ret .. '}}'
	return ret
end

function p._url(args)
	local data = decodeUrl(args.url)
	if data then
		data.label = args.label
		return encodeDiffTemplate(data)
	else
		return nil
	end
end

function p.url(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		wrappers = 'Template:Make diff',
	})
	return p._url(args)
end

return p