Module:Shortcut: Difference between revisions

From the Croc Wiki, the Croc encyclopedia
Jump to navigationJump to search
Content added Content deleted
(rewrite this without so many dependencies and with it hopefully easier to read)
(fix error message)
Line 25: Line 25:
error(string.format(
error(string.format(
'shortcut #%d was invalid (shortcuts must be strings of ' ..
'shortcut #%d was invalid (shortcuts must be strings of ' ..
'least one character in length)'
'at least one character in length)'
), 2)
), 2)
end
end

Revision as of 13:10, December 15, 2014

Template:Uses TemplateStyles Template:Lua sidebar This module makes a box showing the shortcut links to a page.

Usage

From wikitext

From wikitext, this module should be called from a template, usually {{shortcut}}. Please see the template page for documentation. However, it can also be called using the syntax {{#invoke:shortcut|main|arguments}}.

From Lua

To use this module from Lua, first load it.

local mShortcut = require('Module:Shortcut')

Then you can create shortcut boxes with the following syntax:

mShortcut._main(shortcuts, options, frame, cfg)
  • shortcuts is an array of shortcut page names. (required)
  • options is a table of options. The following keys are supported:
    • msg - a message to leave after the list of shortcuts.
    • category - if set to false (or a value regarded as false by Module:Yesno, such as "no"), categories are suppressed.
  • frame a frame object. This is optional, and only intended to be used internally.
  • cfg a table of config values. This is optional, and is only intended for testing.

Technical details

This module has a configuration file at Module:Shortcut/config. It can be used to translate this module into different languages or to change details like category names.



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

	-- Validate shortcuts
	if nShortcuts < 1 then
		return nil
	else
		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
	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
	do
		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