Модуль:Shortcut
Зовнішній вигляд
| Цей модуль позначений як К:реліз, готовий до загального вжитку (270). Він досягнув стадії готовності й вважається, що вільний від помилок і може використовуватись всюди, де знадобиться. Його можна згадувати на довідкових сторінках та інших сторінках Вікіпедії як можливість для навчання новачків. Аби зменшити навантаження на сервери та некоректний показ сторінок, його потрібно вдосконалювати через тестування у пісочниці[en], а не через застосування спроб і помилок. |
| Цей модуль позначено як К:такий, що потребує захищеного статусу (127). Завершені модулі використовуються в дуже великій кількості статей, або часто використовуються як підстановки. Позаяк акти вандалізму або помилки можуть вплинути на багато сторінок і навіть незначне редагування призведе до істотного навантаження на сервери, вони підлягають захисту від редагувань. |
| Цей модуль Lua використовується на близько 2800 сторінках і його зміни будуть дуже помітними. Будь ласка, перевіряйте будь-які зміни на підсторінках /пісочниці та /тестів цього модуля, або у вашій пісочниці модуля, та зважайте на обговорення змін на сторінці обговорення перед їхнім впровадженням. |
| Цей модуль залежить від наступних модулів: |
| Цей модуль використовує TemplateStyles: |
Цей модуль створює контейнер, що показує посилання з короткою назвою на сторінку.
Використання
У вікітексті
У вікітексті, цей модуль повинен викликатися через шаблон, зазвичай {{shortcut}}. Детальніше щодо документації, будь ласка, дивіться сторінку шаблону. Однак, його можна викликати напряму, використавши синтаксис {{#invoke:shortcut|main|аргументи}}.
З Lua
Щоб використати цей модуль у Lua, спершу завантажте його.
local mShortcut = require('Module:Shortcut')
Тоді ви можете створити контейнери з короткою назвою, використавши наступний синтаксис:
mShortcut._main(shortcuts, options, frame, cfg)
- shortcuts є масивом скорочень назв сторінок. (обов'язковий)
- options є таблицею опцій. Підтримуються наступні ключі:
msg— повідомлення, що буде залишено після списку скорочень.category— якщо встановлено false (або значення, що вважається як false модулем Module:Yesno, таке як «no»), то не додаються категорії до сторінки.
- frame — об'єкт frame. Це необов'язковий аргумент та призначений лише для внутрішнього використання.
- cfg — таблиця значень config. Це необов'язковий аргумент та призначений лише для тестування.
Технічні деталі
Цей модуль має конфігураційний файл в Модуль:Shortcut/config. Він може використовуватися для перекладу цього модуля іншими мовами або для зміни деталей такі як назва категорій.
Документація вище включена з Модуль:Shortcut/документація. (ред. | історія)
Дописувачі можуть експериментувати на підсторінках пісочниці (ред. | різн.) та тести (створити) цього модуля.
Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки.
Дописувачі можуть експериментувати на підсторінках пісочниці (ред. | різн.) та тести (створити) цього модуля.
Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки.
-- This module implements {{коротка назва}}.
-- Set constants
local CONFIG_MODULE = 'Модуль:Shortcut/config'
-- Load required modules
local checkType = require('libraryUtil').checkType
local yesno = require('Модуль: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
local function namespaceDetection(shortcut, pageID)
local pagePath
local titleObj = mw.title.new(shortcut, pageID)
if titleObj.namespace == pageID then
pagePath = titleObj.fullText
else
pagePath = shortcut
end
return pagePath
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 templateMode = options.template and yesno(options.template)
local redirectMode = options.redirect and yesno(options.redirect)
local categoryMode = options['category mode'] and yesno(options['category mode'])
local isCategorized = not options.category or 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
local templatePath, prefix
if templateMode then
-- Namespace detection
templatePath = namespaceDetection(shortcut, 10)
prefix = options['pre' .. i] or options.pre or ''
end
if categoryMode then
-- Namespace detection
shortcut = namespaceDetection(shortcut, 14)
end
if options.target and yesno(options.target) then
listItems[i] = templateMode
and string.format("{{%s[[%s|%s]]}}", 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("{{%s%s}}", 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 = 'Модуль:Shortcut/styles.css'} })
-- Anchors
local anchorDiv = root
:tag('div')
:addClass('module-shortcutanchordiv')
for i, shortcut in ipairs(shortcuts) do
local anchor = mw.uri.anchorEncode(shortcut)
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
-- Shortcut box
local shortcutList = root
:tag('div')
:addClass('module-shortcutboxplain noprint')
:attr('role', 'note')
if options.float and options.float:lower() == 'left' then
shortcutList:addClass('module-shortcutboxleft')
end
if options.clear and options.clear ~= '' then
shortcutList:css('clear', options.clear)
end
if shortcutHeading then
shortcutList
:tag('div')
:addClass('module-shortcutlist')
:wikitext(shortcutHeading)
end
local ubl = require('Модуль:List').unbulleted(listItems)
shortcutList:wikitext(ubl)
return tostring(root)
end
function p.main(frame)
local args = require('Модуль: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
return p