Difference between revisions of "Module:Shortcut"

From MINR.ORG WIKI
(use wikilinks rather than URLs, as it would change the redlink behaviour, and that's better done after it is discussed)
(calculate the number of list items based on a table of list items, rather than doing it ad hoc from the shortcuts plus whatever else we want to add)
Line 15: Line 15:
 
frame = frame or mw.getCurrentFrame()
 
frame = frame or mw.getCurrentFrame()
 
cfg = cfg or mw.loadData(CONFIG_MODULE)
 
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
 
-- Validate shortcuts
Line 30: Line 24:
 
), 2)
 
), 2)
 
end
 
end
 +
end
 +
 +
-- Make the list items. These are the shortcuts plus any extra lines such
 +
-- as options.msg.
 +
local listItems = {}
 +
for i, shortcut in ipairs(shortcuts) do
 +
listItems[i] = string.format('[[%s]]', shortcut)
 +
end
 +
table.insert(listItems, options.msg)
 +
local nListItems = #listItems
 +
 +
-- Exit if we have nothing to display
 +
if nListItems < 1 then
 +
return nil
 
end
 
end
  
Line 49: Line 57:
 
local shortcutHeading = mw.message.newRawMessage(
 
local shortcutHeading = mw.message.newRawMessage(
 
cfg['shortcut-heading'],
 
cfg['shortcut-heading'],
nShortcuts
+
nListItems
 
):plain()
 
):plain()
 
shortcutHeading = frame:preprocess(shortcutHeading)
 
shortcutHeading = frame:preprocess(shortcutHeading)
Line 72: Line 80:
 
:newline()
 
:newline()
 
:tag('ul')
 
:tag('ul')
for i, shortcut in ipairs(shortcuts) do
+
for i, item in ipairs(listItems) do
shortcutList:tag('li'):wikitext(string.format(
+
shortcutList:tag('li'):wikitext(item)
'[[%s]]',
 
shortcut
 
))
 
end
 
if options.msg then
 
shortcutList:tag('li'):wikitext(options.msg)
 
 
end
 
end
  

Revision as of 14:43, 15 December 2014

Documentation for this module may be created at Module:Shortcut/doc

-- 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)

	-- 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

	-- Make the list items. These are the shortcuts plus any extra lines such
	-- as options.msg.
	local listItems = {}
	for i, shortcut in ipairs(shortcuts) do
		listItems[i] = string.format('[[%s]]', shortcut)
	end
	table.insert(listItems, options.msg)
	local nListItems = #listItems

	-- Exit if we have nothing to display
	if nListItems < 1 then
		return nil
	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'],
		nListItems
	):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, item in ipairs(listItems) do
		shortcutList:tag('li'):wikitext(item)
	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