Editing Module:Shortcut

Jump to navigation Jump to search
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 publish 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 templateMode = options.template and yesno(options.template)
local redirectMode = options.redirect and yesno(options.redirect)
local isCategorized = not options.category or 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
function p.makeAnchor(s)
s = anchorEncode(s)
local anchor = format('<span id="%s"></span>', s)
return anchor
end


-- Make the list items. These are the shortcuts plus any extra lines such
function p.makeShortcutList(shortcuts)
-- as options.msg.
local makeShortcutLink = p.makeShortcutLink
local listItems = {}
local listArgs = {}
for i, shortcut in ipairs(shortcuts) do
for i, shortcut in ipairs(shortcuts) do
local templatePath, prefix
local link = makeShortcutLink(shortcut)
if templateMode then
listArgs[#listArgs + 1] = link
-- Namespace detection
local titleObj = mw.title.new(shortcut, 10)
if titleObj.namespace == 10 then
templatePath = titleObj.fullText
else
templatePath = shortcut
end
prefix = options['pre' .. i] or options.pre or ''
end
if options.target and yesno(options.target) then
listItems[i] = templateMode
and string.format("&#123;&#123;%s[[%s|%s]]&#125;&#125;", prefix, templatePath, shortcut)
or string.format("[[%s]]", shortcut)
else
listItems[i] = frame:expandTemplate{
title = 'No redirect',
args = templateMode and {templatePath, shortcut} or {shortcut, shortcut}
}
if templateMode then
listItems[i] = string.format("&#123;&#123;%s%s&#125;&#125;", prefix, listItems[i])
end
end
end
end
table.insert(listItems, options.msg)
listArgs.class = 'plainlinks'
return mList.makeList('bulleted', listArgs)
end


-- Return an error if we have nothing to display
function p.makeShortcutLink(s)
if #listItems < 1 then
local uriObj = fullUrl(s, {redirect = 'no'})
local msg = cfg['no-content-error']
local url = tostring(uriObj)
msg = string.format('<strong class="error">%s</strong>', msg)
return format('[%s %s]', url, s)
if isCategorized and cfg['no-content-error-category'] then
end
msg = msg .. makeCategoryLink(cfg['no-content-error-category'])
end
return msg
end


local root = mw.html.create()
function p.getErrorCategories(shortcuts)
root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Shortcut/styles.css'} })
local shortcut1 = shortcuts[1]
-- Anchors
local title = mw.title.new(shortcut1)
local anchorDiv = root
if not title or not title.exists then
:tag('div')
local categoryNsName = mw.site.namespaces[14].name
:addClass('module-shortcutanchordiv')
return format('[[%s:%s]]', categoryNsName, cfg.errorCategory)
for i, shortcut in ipairs(shortcuts) do
else
local anchor = mw.uri.anchorEncode(shortcut)
return nil
anchorDiv:tag('span'):attr('id', anchor)
end
 
-- Shortcut heading
local shortcutHeading
do
local nShortcuts = #shortcuts
if nShortcuts > 0 then
local headingMsg = options['shortcut-heading'] or
redirectMode and cfg['redirect-heading'] or
cfg['shortcut-heading']
shortcutHeading = message(headingMsg, nShortcuts)
shortcutHeading = frame:preprocess(shortcutHeading)
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('module-shortcutboxplain noprint')
:css{position = 'relative', top = '-3em'}
:attr('role', 'note')
:wikitext(anchors)
if options.float and options.float:lower() == 'left' then
root
shortcutList:addClass('module-shortcutboxleft')
:tag('table')
end
:addClass('shortcutbox noprint')
if options.clear and options.clear ~= '' then
:css{
shortcutList:css('clear', options.clear)
float = 'right',
end
border = '1px solid #aaa',
if shortcutHeading then
background = '#fff',
shortcutList
margin = '.3em .3em .3em 1em',
:tag('div')
padding = '3px',
:addClass('module-shortcutlist')
['text-align'] = 'center'
:wikitext(shortcutHeading)
}
end
:tag('tr')
:tag('th')
local ubl = require('Module:List').unbulleted(listItems)
:addClass('plainlist')
shortcutList:wikitext(ubl)
: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)
-- 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
Cancel Editing help (opens in new window)

  [] · [[]] · [[|]] · {{}} · · “” ‘’ «» ‹› „“ ‚‘ · ~ | ° &nbsp; · ± × ÷ ² ³ ½ · §
     [[Category:]] · [[:File:]] · [[Special:MyLanguage/]] · Special:MyLanguage/ · <code></code> · <nowiki></nowiki> <code><nowiki></nowiki></code> · <syntaxhighlight lang="php"></syntaxhighlight> · <includeonly></includeonly> · <noinclude></noinclude> · #REDIRECT[[]] · <translate></translate> · <languages/> · {{#translation:}} · <tvar name=1></tvar> · {{DEFAULTSORT:}} · <s></s>

Template used on this page: