Module:Shortcut
From MINR.ORG WIKI
Revision as of 14:28, 15 December 2014 by Mr. Stradivarius (talk) (use wikilinks rather than URLs, as it would change the redlink behaviour, and that's better done after it is discussed)
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) 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 shortcutList:tag('li'):wikitext(string.format( '[[%s]]', shortcut )) 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