Амодуль:Hatnote
Модуль предназначен для реализации hatnote-шаблонов (например, {{основная статья}}, {{см. также}}). Также он содержит несколько функций для работы со ссылками и отслеживания ошибок. См. тесты на странице Шаблон:Основная статья/тесты.
Основные функции
аредакциазураОсновные функции содержатся в таблице p
, все функции можно вызывать как из других модулей, так и через {{#invoke}}. При вызове из модуля функции принимают первым параметром таблицу с аргументами. Все описанные ниже параметры являются аргументами этой таблицы. Некоторые параметры принимают булевоподобные значения: их перечисление можно найти здесь.
parse_link
аредакциазура
Принимает на вход ссылку, возвращает два значения: целевую страницу и видимую часть ссылки. Если ссылку не удалось разобрать, возвращает nil
. Наличие квадратных скобок не обязательно.
format_link
аредакциазура
Формирует вики-ссылку. Превращает #
в ссылках на разделы в знак параграфа, отбитый пробелами, делая их более читабельными (см. {{ссылка на раздел}}).
Параметры:
- первый параметр: название целевой страницы или вики-ссылка.
- второй параметр: название раздела. Параметр будет проигнорирован, если раздел уже задан в первом параметре через
#
. - третий параметр: видимый текст ссылки.
remove_precision
аредакциазура
Убирает уточнение из первого параметра (см. {{без уточнения}}).
is_disambig
аредакциазура
Функция, определяющая, является ли первый параметр страницей разрешения неоднозначности. Список шаблонов неоднозначностей берется со страницы MediaWiki:Disambiguationspage.
list
аредакциазура
Формирует список из вики-ссылок.
Параметры:
- нумерованные параметры — ссылки на страницы.
|l1=
,|l2=
и т. д. — текст ссылок.|list_sep=
или|разделитель списка=
: разделитель списка, по умолчанию — Ашаблон:No wikify.|natural_join=
: при неложном значении вместо последнего разделителя выводится союз «и».|links_ns=
или|ПИ ссылок=
: ко всем ссылкам добавляется префикс указанного пространства имен.|bold_links=
или|ссылки болдом=
: при непустом и неложном значении каждая ссылка выделяется полужирным.
Возвращает таблицу, для неё предусмотрен метод tostring()
и конкатенация. Именованные параметры этой таблицы — булевы переменные, истинные при обнаружении проблем. Отслеживаемые проблемы: red_link
, bad_format
, formatted
, unparsable_link
. Их описание см. ниже.
hatnote
аредакциазура
Формирует код <div class="hatnote">...</div>
.
Параметры:
- первый параметр — текст заметки.
|id=
: id заметки.|extraclasses=
: дополнительные классы заметки.|hide_disambig=
: при непустом и неложном значении к тексту добавляется классdabhide
, скрывающий подсветку для пользователей гаджета подсветки неоднозначностей.
main
аредакциазура
Генерирует текст-заметку. Позволяет ссылаться на неограниченное число страниц. Синтаксис:
- вызов из вики-текста:
{{#invoke:Hatnote|main|префикс= префикс |префикс мн. ч.= префикс для нескольких ссылок |разделитель списка= разделитель списка |ПИ ссылок= пространство имен |extraclasses = дополнительные классы |точка= true / false |hide_disambig= true / false}}
- вызов из другого модуля:
-- подключение модуля local hatnote = require('Модуль:Hatnote').main -- пример использования без изменения категорий по умолчанию local res1 = hatnote{ 'Какая-то статья', l1 = 'Какой-нибудь текст ссылки', prefix = 'Основная статья:', prefix_plural = 'Основные статьи:', dot = true, nocat = args.nocat -- следует всегда передавать nocat, если он предусмотрен } -- и с изменением local res2 = hatnote({ 'Еще какая-то статья', prefix = 'См. также:', list_sep = '; ', natural_join = false, nocat = args.nocat }, { red_link = 'Википедия:Статьи с шаблоном «См. также» с красными ссылками' })
|prefix=
или|префикс=
: обязательный параметр, текст перед списком ссылок.|prefix_plural=
или|префикс мн. ч.=
: если ссылок несколько, для префикса вместо предыдущего параметра будет использован этот.|sep=
или|разделитель=
: разделитель между префиксом и списком ссылок.|dot=
или|точка=
: при непустом и неложном значении выводится точка в конце.|nocat=
: при непустом и неложном значении отключается категоризация.|empty_list_message=
: сообщение об ошибке, выводящееся при пустом списке ссылок. По умолчанию — «Не указано ни одной страницы».|preview_error=
: при непустом и неложном значении ошибка при пустом списке ссылок выводится только во время предпросмотра.
Функция также принимает все параметры функций list
и hatnote
и передает их без изменения в эти функции.
Вторым параметром (при вызове через другой модуль) функция принимает таблицу с переназначенными категориями. Их идентификаторы см. ниже:
Служебные функции
аредакциазураНаходятся в таблице tr
, предназначены для отслеживания проблем и вывода сообщений об ошибках. Все функции можно вызывать только из других модулей.
define_categories
аредакциазура
tr.define_categories(tracking_categories)
Создает объект, представляющий собой таблицу с категориями и функцией для их добавления. Первым параметром передается ассоциированный массив с идентификаторами отслеживающих категорий.
add
аредакциазура
categories:add(type, nocat)
или
categories:add(category_name, nocat)
Добавляет в таблицу категории. Первый параметр — либо идентификатор, объявленный в define_categories()
, либо название категории. Второй параметр — отключение категоризации.
error
аредакциазура
tr.error(msg, categories, preview_only)
Выводит сообщение об ошибке. Если ошибка генерируется шаблоном, то отображается название этого шаблона; если прямым вызовом через {{#invoke}}, то название вызываемого модуля.
Параметры:
msg
: текст сообщения.categories
: либо объект, возвращаемыйdefine_categories()
, либо строка с категориями.preview_only
: при непустом и неложном значении ошибка выводится только во время предпросмотра.
Отслеживаемые случаи
аредакциазураno_prefix
— не задан префикс. Также выводится сообщение об ошибке.no_links
— не задано ни одной ссылки. Также выводится сообщение об ошибке (либо в тексте статьи, либо только во время предварительного просмотра, подробнее см. #main-Параметры).red_link
— параметр содержит ссылку на несуществующую статью.bad_format
— параметр содержит разделитель{{!}}
вместо параметра|lx=
или лишние квадратные скобки.formatted
— параметр содержит<span
(в таком случае он не парсится, а выдаётся в готовом виде). Нужно для поддержки шаблонов {{не переведено}} в качестве параметров.unparsable_link
— параметр содержит нестандартное оформление, которое не может быть разобрано модулем (например,{{см. также|[https://example.com внешние ссылки]}}
или{{см. также|посторонний текст помимо [[ссылка|ссылки]]}}
).
Использование в других модулях
аредакциазураНекоторые функции используются в следующих модулях (проверить):
--------------------------------------------------------------------------------
-- Module:Hatnote --
-- --
-- This module produces hatnote links and links to related articles. It --
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --
-- helper functions for other Lua hatnote modules. --
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
function p.defaultClasses(inline)
-- Provides the default hatnote classes as a space-separated string; useful
-- for hatnote-manipulation modules like [[Module:Hatnote group]].
return
(inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
'navigation-not-searchable'
end
function p.disambiguate(page, disambiguator)
-- Formats a page title with a disambiguation parenthetical,
-- i.e. "Example" → "Example (disambiguation)".
checkType('disambiguate', 1, page, 'string')
checkType('disambiguate', 2, disambiguator, 'string', true)
disambiguator = disambiguator or 'disambiguation'
return mw.ustring.format('%s (%s)', page, disambiguator)
end
function p.findNamespaceId(link, removeColon)
-- Finds the namespace id (namespace number) of a link or a pagename. This
-- function will not work if the link is enclosed in double brackets. Colons
-- are trimmed from the start of the link by default. To skip colon
-- trimming, set the removeColon parameter to false.
checkType('findNamespaceId', 1, link, 'string')
checkType('findNamespaceId', 2, removeColon, 'boolean', true)
if removeColon ~= false then
link = removeInitialColon(link)
end
local namespace = link:match('^(.-):')
if namespace then
local nsTable = mw.site.namespaces[namespace]
if nsTable then
return nsTable.id
end
end
return 0
end
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
-- Formats an error message to be returned to wikitext. If
-- addTrackingCategory is not false after being returned from
-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
-- is added.
checkType('makeWikitextError', 1, msg, 'string')
checkType('makeWikitextError', 2, helpLink, 'string', true)
yesno = require('Module:Yesno')
title = title or mw.title.getCurrentTitle()
-- Make the help link text.
local helpText
if helpLink then
helpText = ' ([[' .. helpLink .. '|ацхыраара]])'
else
helpText = ''
end
-- Make the category text.
local category
if not title.isTalkPage -- Don't categorise talk pages
and title.namespace ~= 2 -- Don't categorise userspace
and yesno(addTrackingCategory) ~= false -- Allow opting out
then
category = 'Агхақәа змоу Hatnote ашаблонқәа '
category = mw.ustring.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
)
else
category = ''
end
return mw.ustring.format(
'<strong class="error">Агха: %s%s.</strong>%s',
msg,
helpText,
category
)
end
local curNs = mw.title.getCurrentTitle().namespace
p.missingTargetCat =
--Default missing target category, exported for use in related modules
((curNs == 0) or (curNs == 14)) and
'Articles with hatnote templates targeting a nonexistent page' or nil
function p.quote(title)
--Wraps titles in quotation marks. If the title starts/ends with a quotation
--mark, kerns that side as with {{-'}}
local quotationMarks = {
["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
}
local quoteLeft, quoteRight = -- Test if start/end are quotation marks
quotationMarks[string.sub(title, 1, 1)],
quotationMarks[string.sub(title, -1, -1)]
if quoteLeft or quoteRight then
title = mw.html.create("span"):wikitext(title)
end
if quoteLeft then title:css("padding-left", "0.15em") end
if quoteRight then title:css("padding-right", "0.15em") end
return '"' .. tostring(title) .. '"'
end
--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
function p.hatnote(frame)
local args = getArgs(frame)
local s = args[1]
if not s then
return p.makeWikitextError(
'no text specified',
'Template:Hatnote#Errors',
args.category
)
end
return p._hatnote(s, {
extraclasses = args.extraclasses,
selfref = args.selfref
})
end
function p._hatnote(s, options)
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local inline = options.inline
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
local extraclasses
if type(options.extraclasses) == 'string' then
extraclasses = options.extraclasses
end
hatnote
:attr('role', 'note')
:addClass(p.defaultClasses(inline))
:addClass(extraclasses)
:addClass(options.selfref and 'selfref' or nil)
:wikitext(s)
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
} .. tostring(hatnote)
end
return p