Module:Shortcut: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
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 |
|||
⚫ | |||
if nShortcuts < 1 and not options.msg then |
|||
⚫ | |||
⚫ | |||
-- Validate shortcuts |
-- Validate shortcuts |
||
Line 30: | Line 24: | ||
), 2) |
), 2) |
||
end |
end |
||
⚫ | |||
-- Make the list items. These are the shortcuts plus any extra lines such |
|||
⚫ | |||
local listItems = {} |
|||
for i, shortcut in ipairs(shortcuts) do |
|||
listItems[i] = string.format('[[%s]]', shortcut) |
|||
⚫ | |||
table.insert(listItems, options.msg) |
|||
local nListItems = #listItems |
|||
⚫ | |||
if nListItems < 1 then |
|||
⚫ | |||
end |
end |
||
Line 49: | Line 57: | ||
local shortcutHeading = mw.message.newRawMessage( |
local shortcutHeading = mw.message.newRawMessage( |
||
cfg['shortcut-heading'], |
cfg['shortcut-heading'], |
||
nListItems |
|||
nShortcuts |
|||
):plain() |
):plain() |
||
shortcutHeading = frame:preprocess(shortcutHeading) |
shortcutHeading = frame:preprocess(shortcutHeading) |
||
Line 72: | Line 80: | ||
:newline() |
:newline() |
||
:tag('ul') |
:tag('ul') |
||
for i, |
for i, item in ipairs(listItems) do |
||
shortcutList:tag('li'):wikitext( |
shortcutList:tag('li'):wikitext(item) |
||
'[[%s]]', |
|||
shortcut |
|||
)) |
|||
⚫ | |||
⚫ | |||
shortcutList:tag('li'):wikitext(options.msg) |
|||
end |
end |
||
Revision as of 13:43, 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)
-- 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