Jump to content

Module:Wp/nod/Shortcut

From Wikimedia Incubator

Documentation for this module may be created at Module:Wp/nod/Shortcut/doc

-- ᨾᩣ​ᨧᩣ᩠ᨠ https://en.wikipedia.org/wiki/Module:Shortcut
-- As https://incubator.wikimedia.org/w/index.php?title=Module:Wp/nod/Shortcut&oldid=4313336
-- This module implements template Wp/nod/shortcut.

-- Set constants
local CONFIG_MODULE = 'Module:Wp/nod/Shortcut/config'

-- Load required modules
local checkType = require('libraryUtil').checkType
local yesno = require('Module:Wp/nod/Yesno')

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)
	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 isCategorized = yesno(options.category) ~= false

	-- Validate shortcuts
	for i, shortcut in ipairs(shortcuts) do
		if type(shortcut) ~= 'string' or #shortcut < 1 then
			error(message(cfg['invalid-shortcut-error'], i), 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] = frame:expandTemplate{
			title = 'No redirect',
			args = {Wp/nod/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
	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:Wp/nod/shortcut]]

	-- Shortcut heading
	local shortcutHeading
	do
		local nShortcuts = #shortcuts
		if nShortcuts > 0 then
			shortcutHeading = message(cfg['shortcut-heading'], nShortcuts)
			shortcutHeading = frame:preprocess(shortcutHeading)
			shortcutHeading = shortcutHeading .. '\n'
		end
	end

	-- Shortcut box
	local shortcutList = root
		:tag('div')
			:addClass('shortcutbox plainlist noprint')
			:attr('role', 'note')
			:css('float', 'right')
			:css('border', '1px solid #aaa')
			:css('background', '#fff')
			:css('margin', '0em 0em 0em 1em')
			:css('padding', '.3em .6em .2em .6em')
			:css('text-align', 'center')
			:css('font-size', '85%')
			:css('font-weight', 'bold')
	if shortcutHeading then
		shortcutList
			:tag('div')
				:css('display','inline-block')
				:css('border-bottom','1px solid #aaa')
				:css('margin-bottom', '.2em')
				:css('font-weight', 'normal')
				:wikitext(shortcutHeading)
	end
	local list = shortcutList:tag('ul')
	for i, item in ipairs(listItems) do
		list:tag('li'):wikitext(item)
	end
	return tostring(root)
end

function p.main(frame)
	local args = require('Module:Wp/nod/Arguments').getArgs(frame, {
		wrappers = 'Template:Wp/nod/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
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy