Module:Shortcut: Difference between revisions

From Test Wiki
Jump to navigation Jump to search
Content deleted Content added
fix error message
allow output if no shortcuts are set but msg is present
Line 17: Line 17:
local nShortcuts = #shortcuts
local nShortcuts = #shortcuts


-- Check that we have something to display
-- Validate shortcuts
if nShortcuts < 1 then
if nShortcuts < 1 and not options.msg then
return nil
return nil
end
else

for i, shortcut in ipairs(shortcuts) do
-- Validate shortcuts
if type(shortcut) ~= 'string' or #shortcut < 1 then
for i, shortcut in ipairs(shortcuts) do
error(string.format(
'shortcut #%d was invalid (shortcuts must be strings of ' ..
if type(shortcut) ~= 'string' or #shortcut < 1 then
error(string.format(
'at least one character in length)'
'shortcut #%d was invalid (shortcuts must be strings of ' ..
), 2)
'at least one character in length)'
end
), 2)
end
end
end
end
Line 82: Line 83:


-- Error category
-- Error category
if shortcuts[1] then
do
local title = mw.title.new(shortcuts[1])
local title = mw.title.new(shortcuts[1])
if not title or not title.exists then
if not title or not title.exists then

Revision as of 13:26, 15 December 2014

This module is licensed under CC-BY-SA 4.0, as it has been imported from Wikipedia.


-- This module implements {{shortcut}}.

-- Set constants
local CONFIG_MODULE = 'Module:Shortcut/config'

-- Load required modules
local checkType = require('libraryUtil').checkType

local p = {}

function p._main(shortcuts, options, frame, cfg)
	checkType('_main', 1, shortcuts, 'table')
	checkType('_main', 2, options, 'table', true)
	options = options or {}
	frame = frame or mw.getCurrentFrame()
	cfg = cfg or mw.loadData(CONFIG_MODULE)
	local nShortcuts = #shortcuts

	-- Check that we have something to display
	if nShortcuts < 1 and not options.msg then
		return nil
	end

	-- Validate shortcuts
	for i, shortcut in ipairs(shortcuts) do
		if type(shortcut) ~= 'string' or #shortcut < 1 then
			error(string.format(
				'shortcut #%d was invalid (shortcuts must be strings of ' ..
				'at least one character in length)'
			), 2)
		end
	end

	local root = mw.html.create()

	-- Anchors
	local anchorDiv = root
		:tag('div')
			:css('position', 'relative')
			:css('top', '-3em')
	for i, shortcut in ipairs(shortcuts) do
		local anchor = mw.uri.anchorEncode(shortcut)
		anchorDiv:tag('span'):attr('id', anchor)
	end

	root:newline() -- To match the old [[Template:Shortcut]]

	-- Shortcut heading
	local shortcutHeading = mw.message.newRawMessage(
		cfg['shortcut-heading'],
		nShortcuts
	):plain()
	shortcutHeading = frame:preprocess(shortcutHeading)

	-- Shortcut box
	local shortcutList = root
		:tag('table')
			:addClass('shortcutbox noprint')
			:css('float', 'right')
			:css('border', '1px solid #aaa')
			:css('background', '#fff')
			:css('margin', '.3em .3em .3em 1em')
			:css('padding', '3px')
			:css('text-align', 'center')
				:tag('tr')
					:tag('th')
						:addClass('plainlist')
						:css('border', 'none')
						:css('background', 'transparent')
						:tag('small')
							:wikitext(shortcutHeading)
							:newline()
							:tag('ul')
	for i, shortcut in ipairs(shortcuts) do
		local url = mw.uri.fullUrl(shortcut, {redirect = 'no'})
		url = tostring(url)
		local link = string.format('[%s %s]', url, shortcut)
		shortcutList:tag('li'):wikitext(link)
	end
	if options.msg then
		shortcutList:tag('li'):wikitext(options.msg)
	end

	-- Error category
	if shortcuts[1] then
		local title = mw.title.new(shortcuts[1])
		if not title or not title.exists then
			root:wikitext(string.format(
				'[[%s:%s]]',
				mw.site.namespaces[14].name,
				cfg['first-parameter-error-category']
			))
		end
	end

	return tostring(root)
end

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		wrappers = 'Template:Shortcut'
	})

	-- Separate shortcuts from options
	local shortcuts, options = {}, {}
	for k, v in pairs(args) do
		if type(k) == 'number' then
			shortcuts[k] = v
		else
			options[k] = v
		end
	end

	-- Compress the shortcut array, which may contain nils.
	local function compressArray(t)
		local nums, ret = {}, {}
		for k in pairs(t) do
			nums[#nums + 1] = k
		end
		table.sort(nums)
		for i, num in ipairs(nums) do
			ret[i] = t[num]
		end
		return ret
	end
	shortcuts = compressArray(shortcuts)

	return p._main(shortcuts, options, frame)
end

return p