Editing Module:Shortcut

From MINR.ORG WIKI

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
 
-- This module implements {{shortcut}}.
 
-- This module implements {{shortcut}}.
  
-- Set constants
+
local cfg = {}
local CONFIG_MODULE = 'Module:Shortcut/config'
 
  
-- Load required modules
+
--------------------------------------------------------------------------------
local checkType = require('libraryUtil').checkType
+
-- Configuration
local yesno = require('Module:Yesno')
+
--------------------------------------------------------------------------------
 +
 
 +
-- Name for the error category produced if the first shortcut is not an existing
 +
-- page on the wiki.
 +
cfg.errorCategory = 'Wikipedia shortcut box first parameter needs fixing'
 +
 
 +
-- The header text for the list of shortcuts.
 +
-- cfg.shortcutHeaderSingular will be displayed if there is one shortcut, and
 +
-- cfg.shortcutHeaderPlural will be displayed if there are multiple shortcuts.
 +
cfg.shortcutHeaderSingular = '[[Wikipedia:Shortcut|Shortcut]]:'
 +
cfg.shortcutHeaderPlural = '[[Wikipedia:Shortcut|Shortcuts]]:'
 +
 
 +
--------------------------------------------------------------------------------
 +
-- Load external modules and define often-used functions
 +
--------------------------------------------------------------------------------
 +
 
 +
-- Load external modules
 +
local mArguments = require('Module:Arguments')
 +
local mTableTools = require('Module:TableTools')
 +
local mList = require('Module:List')
 +
 
 +
-- Define often-used functions
 +
local anchorEncode = mw.uri.anchorEncode
 +
local format = string.format
 +
local fullUrl = mw.uri.fullUrl
 +
 
 +
--------------------------------------------------------------------------------
 +
-- Main functions
 +
--------------------------------------------------------------------------------
  
 
local p = {}
 
local p = {}
  
local function message(msg, ...)
+
function p.main(frame)
return mw.message.newRawMessage(msg, ...):plain()
+
local args = mArguments.getArgs(frame)
 +
return p._main(args)
 
end
 
end
  
local function makeCategoryLink(cat)
+
function p._main(args)
return string.format('[[%s:%s]]', mw.site.namespaces[14].name, cat)
+
local shortcuts = p.getShortcuts(args)
 +
local nShortcuts = #shortcuts
 +
if nShortcuts < 1 then
 +
-- Don't output anything if {{shortcut}} was called with no arguments.
 +
return ''
 +
end
 +
local anchors = p.makeAnchorList(shortcuts)
 +
local shortcutList = p.makeShortcutList(shortcuts)
 +
local errorCategories = p.getErrorCategories(shortcuts)
 +
return p.export(anchors, nShortcuts, shortcutList, errorCategories)
 
end
 
end
  
function p._main(shortcuts, options, frame, cfg)
+
function p.getShortcuts(args)
checkType('_main', 1, shortcuts, 'table')
+
local shortcuts = mTableTools.compressSparseArray(args)
checkType('_main', 2, options, 'table', true)
+
return shortcuts
options = options or {}
+
end
frame = frame or mw.getCurrentFrame()
 
cfg = cfg or mw.loadData(CONFIG_MODULE)
 
local isCategorized = yesno(options.category) ~= false
 
  
-- Validate shortcuts
+
function p.makeAnchorList(shortcuts)
 +
local makeAnchor = p.makeAnchor
 +
local anchors = {}
 
for i, shortcut in ipairs(shortcuts) do
 
for i, shortcut in ipairs(shortcuts) do
if type(shortcut) ~= 'string' or #shortcut < 1 then
+
anchors[#anchors + 1] = makeAnchor(shortcut)
error(message(cfg['invalid-shortcut-error'], i), 2)
 
end
 
 
end
 
end
 +
return table.concat(anchors)
 +
end
  
-- Make the list items. These are the shortcuts plus any extra lines such
+
function p.makeAnchor(s)
-- as options.msg.
+
s = anchorEncode(s)
local listItems = {}
+
local anchor = format('<span id="%s"></span>', s)
for i, shortcut in ipairs(shortcuts) do
+
return anchor
listItems[i] = frame:expandTemplate{
+
end
title = 'No redirect',
 
args = {shortcut}
 
}
 
end
 
table.insert(listItems, options.msg)
 
 
 
-- Return an error if we have nothing to display
 
if #listItems < 1 then
 
local msg = cfg['no-content-error']
 
msg = string.format('<strong class="error">%s</strong>', msg)
 
if isCategorized and cfg['no-content-error-category'] then
 
msg = msg .. makeCategoryLink(cfg['no-content-error-category'])
 
end
 
return msg
 
end
 
 
 
local root = mw.html.create()
 
  
-- Anchors
+
function p.makeShortcutList(shortcuts)
local anchorDiv = root
+
local makeShortcutLink = p.makeShortcutLink
:tag('div')
+
local listArgs = {}
:css('position', 'relative')
 
:css('top', '-3em')
 
 
for i, shortcut in ipairs(shortcuts) do
 
for i, shortcut in ipairs(shortcuts) do
local anchor = mw.uri.anchorEncode(shortcut)
+
local link = makeShortcutLink(shortcut)
anchorDiv:tag('span'):attr('id', anchor)
+
listArgs[#listArgs + 1] = link
 
end
 
end
 +
listArgs.class = 'plainlinks'
 +
return mList.makeList('bulleted', listArgs)
 +
end
  
root:newline() -- To match the old [[Template:Shortcut]]
+
function p.makeShortcutLink(s)
 +
local uriObj = fullUrl(s, {redirect = 'no'})
 +
local url = tostring(uriObj)
 +
return format('[%s %s]', url, s)
 +
end
  
-- Shortcut heading
+
function p.getErrorCategories(shortcuts)
local shortcutHeading
+
local shortcut1 = shortcuts[1]
do
+
local title = mw.title.new(shortcut1)
local nShortcuts = #shortcuts
+
if not title or not title.exists then
if nShortcuts > 0 then
+
local categoryNsName = mw.site.namespaces[14].name
shortcutHeading = message(cfg['shortcut-heading'], nShortcuts)
+
return format('[[%s:%s]]', categoryNsName, cfg.errorCategory)
shortcutHeading = frame:preprocess(shortcutHeading)
+
else
shortcutHeading = shortcutHeading .. '\n'
+
return nil
end
 
 
end
 
end
 +
end
  
-- Shortcut box
+
function p.export(anchors, nShortcuts, shortcutList, errorCategories)
local shortcutList = root
+
local root = mw.html.create('')
 +
root
 
:tag('div')
 
:tag('div')
:addClass('shortcutbox plainlist noprint')
+
:css{position = 'relative', top = '-3em'}
:attr('role', 'note')
+
:wikitext(anchors)
:css('float', 'right')
+
root
:css('border', '1px solid #aaa')
+
:tag('table')
:css('background', '#fff')
+
:addClass('shortcutbox noprint')
:css('margin', '.3em .3em .3em 1em')
+
:css{
:css('padding', '.4em .6em')
+
float = 'right',
:css('text-align', 'center')
+
border = '1px solid #aaa',
:css('font-size', 'smaller')
+
background = '#fff',
:css('line-height', '2em')
+
margin = '.3em .3em .3em 1em',
:css('font-weight', 'bold')
+
padding = '3px',
:wikitext(shortcutHeading)
+
['text-align'] = 'center'
:tag('ul')
+
}
for i, item in ipairs(listItems) do
+
:tag('tr')
shortcutList:tag('li'):wikitext(item)
+
:tag('th')
end
+
:addClass('plainlist')
 
+
:css{border = 'none', background = 'transparent'}
 +
:tag('small')
 +
:wikitext(
 +
nShortcuts <= 1
 +
and cfg.shortcutHeaderSingular
 +
or cfg.shortcutHeaderPlural
 +
)
 +
:newline()
 +
:wikitext(shortcutList)
 +
root:wikitext(errorCategories)
 
return tostring(root)
 
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
 
end
  
 
return p
 
return p

Please note that all contributions to MINR.ORG WIKI may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see MINR.ORG WIKI:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)