Module:Shortcut: Difference between revisions

From Test Wiki
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
Xaloria (talk | contribs)
m 1 revision imported
Tags: Mobile edit Mobile web edit
 
(26 intermediate revisions by 12 users not shown)
Line 6: Line 6:
-- Load required modules
-- Load required modules
local checkType = require('libraryUtil').checkType
local checkType = require('libraryUtil').checkType
local yesno = require('Module:Yesno')


local p = {}
local p = {}

local function message(msg, ...)
return mw.message.newRawMessage(msg, ...):plain()
end

local function makeCategoryLink(cat)
return string.format('[[%s:%s]]', mw.site.namespaces[14].name, cat)
end


function p._main(shortcuts, options, frame, cfg)
function p._main(shortcuts, options, frame, cfg)
Line 15: Line 24:
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 templateMode = options.template and yesno(options.template)
local nShortcuts = #shortcuts
local redirectMode = options.redirect and yesno(options.redirect)

local isCategorized = not options.category or yesno(options.category) ~= false
-- Check that we have something to display
if nShortcuts < 1 and not options.msg then
return nil
end


-- Validate shortcuts
-- Validate shortcuts
for i, shortcut in ipairs(shortcuts) do
for i, shortcut in ipairs(shortcuts) do
if type(shortcut) ~= 'string' or #shortcut < 1 then
if type(shortcut) ~= 'string' or #shortcut < 1 then
error(message(cfg['invalid-shortcut-error'], i), 2)
error(string.format(
'shortcut #%d was invalid (shortcuts must be strings of ' ..
'at least one character in length)'
), 2)
end
end
end
end


-- Make the list items. These are the shortcuts plus any extra lines such
local root = mw.html.create()
-- as options.msg.
local listItems = {}
for i, shortcut in ipairs(shortcuts) do
local templatePath, prefix
if templateMode then
-- 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
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()
root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Shortcut/styles.css'} })
-- Anchors
-- Anchors
local anchorDiv = root
local anchorDiv = root
:tag('div')
:tag('div')
:addClass('module-shortcutanchordiv')
: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 anchor = mw.uri.anchorEncode(shortcut)
anchorDiv:tag('span'):attr('id', anchor)
anchorDiv:tag('span'):attr('id', anchor)
end
end

root:newline() -- To match the old [[Template:Shortcut]]


-- Shortcut heading
-- Shortcut heading
local shortcutHeading = mw.message.newRawMessage(
local shortcutHeading
do
cfg['shortcut-heading'],
nShortcuts
local nShortcuts = #shortcuts
if nShortcuts > 0 then
):plain()
local headingMsg = options['shortcut-heading'] or
shortcutHeading = frame:preprocess(shortcutHeading)
redirectMode and cfg['redirect-heading'] or
cfg['shortcut-heading']
shortcutHeading = message(headingMsg, nShortcuts)
shortcutHeading = frame:preprocess(shortcutHeading)
end
end


-- Shortcut box
-- Shortcut box
local shortcutList = root
local shortcutList = root
:tag('table')
:tag('div')
:addClass('shortcutbox noprint')
:addClass('module-shortcutboxplain noprint')
:css('float', 'right')
:attr('role', 'note')
if options.float and options.float:lower() == 'left' then
:css('border', '1px solid #aaa')
shortcutList:addClass('module-shortcutboxleft')
: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
end
if options.msg then
if options.clear and options.clear ~= '' then
shortcutList:tag('li'):wikitext(options.msg)
shortcutList:css('clear', options.clear)
end
end
if shortcutHeading then

shortcutList
-- Error category
:tag('div')
if shortcuts[1] then
:addClass('module-shortcutlist')
local title = mw.title.new(shortcuts[1])
:wikitext(shortcutHeading)
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
end

local ubl = require('Module:List').unbulleted(listItems)
shortcutList:wikitext(ubl)
return tostring(root)
return tostring(root)
end
end


function p.main(frame)
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
local args = require('Module:Arguments').getArgs(frame)
wrappers = 'Template:Shortcut'
})


-- Separate shortcuts from options
-- Separate shortcuts from options