Модуль:Hatnote
Этот модуль оценён как готовый к использованию. Предполагается, что все баги устранены и он готов для широкого использования. Его можно указывать на справочных страницах и рекомендовать к использованию новым участникам. Для его изменения и тестирования, пожалуйста, используйте песочницу. |
Модуль предназначен для реализации hatnote-шаблонов (например, {{основная статья}}, {{см. также}}). Также он содержит несколько функций для работы со ссылками и отслеживания ошибок. См. тесты на странице Шаблон:Основная статья/тесты.
Основные функции
[править]Основные функции содержатся в таблице
Кол программы | Комментарии к нему |
---|---|
текст = p | текст = |
, все функции можно вызывать как из других модулей, так и через Шаблон:Mwmw. При вызове из модуля функции принимают первым параметром таблицу с аргументами. Все описанные ниже параметры являются аргументами этой таблицы. Некоторые параметры принимают булевоподобные значения: их перечисление можно найти здесь.
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 | текст = |
— параметр содержит разделитель {{!}}
вместо параметра |lx=
или лишние квадратные скобки.
Кол программы | Комментарии к нему |
---|---|
текст = formatted | текст = |
— параметр содержит <span (в таком случае он не парсится, а выдаётся в готовом виде). Нужно для поддержки шаблонов {{не переведено}} в качестве параметров.
hatnote
[править]
Формирует код Шаблон:Tag.
Параметры:
- первый параметр — текст заметки.
|extraclasses=
: дополнительные классы заметки.
|hide_disambig=
: при непустом и неложном значении к тексту добавляется класс
Кол программы
Комментарии к нему
текст = dabhide
текст =
, скрывающий подсветку для пользователей гаджета подсветки неоднозначностей.
main
[править]
Генерирует текст-заметку. Позволяет ссылаться на неограниченное число страниц.
Синтаксис:
- вызов из вики-текста:
{{#invoke:Hatnote|main|префикс= префиксШаблон:Optp}}
- вызов из другого модуля:
-- подключение модуля
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=
: при непустом и неложном значении отключается категоризация.
|preview_error=
: при непустом и неложном значении ошибка выводится только во время предпросмотра.
Функция также принимает все параметры функций
Кол программы
Комментарии к нему
текст = list
текст =
и
Кол программы
Комментарии к нему
текст = hatnote
текст =
и передает их без изменения в эти функции.
Вторым параметром (при вызове через другой модуль) функция принимает таблицу с переназначенными категориями. Идентификаторы отслеживающих категорий:
Кол программы
Комментарии к нему
текст = no_prefix
текст =
: Викиучебник:Страницы с модулем Hatnote без ссылок
Кол программы
Комментарии к нему
текст = no_links
текст =
: Викиучебник:Страницы с модулем Hatnote без указания префикса
Кол программы
Комментарии к нему
текст = red_link
текст =
: Викиучебник:Страницы с модулем Hatnote с красной ссылкой
Кол программы
Комментарии к нему
текст = bad_format
текст =
: Викиучебник:Страницы с модулем Hatnote с некорректно заполненными параметрами
Кол программы
Комментарии к нему
текст = formatted
текст =
: Викиучебник:Страницы с модулем Hatnote с готовым форматированиеми
Служебные функции
[править]
Находятся в таблице
Кол программы
Комментарии к нему
текст = tr
текст =
, предназначены для отслеживания проблем и вывода сообщений об ошибках. Все функции можно вызывать только из других модулей.
make_categories
[править]
tr.make_categories(tracking_categories)
Создает объект, представляющий собой таблицу с категориями и функцией для их добавления. Первым параметром передается ассоциированный массив с идентификаторами отслеживающих категорий.
add
[править]
categories:add(type, nocat)
Добавляет в таблицу категории. Первый параметр — идентификатор, второй — отключение категоризации.
error
[править]
tr.error(msg, categories, preview_only)
Выводит сообщение об ошибке. Если ошибка генерируется шаблоном, то отображается название этого шаблона; если прямым вызовом через Шаблон:Mwmw, то название вызываемого модуля.
Параметры:
Кол программы
Комментарии к нему
текст = msg
текст =
: текст сообщения.
Кол программы
Комментарии к нему
текст = categories
текст =
: либо объект, либо строка с категориями.
Кол программы
Комментарии к нему
текст = preview_only
текст =
: при непустом и неложном значении ошибка выводится только во время предпросмотра.
local get_args = require('Module:Arguments').getArgs
local mError = require('Module:Error')
local yesno = function (v) return require('Module:Yesno')(v, true) end
local p, tr = {}, {}
local current_title = mw.title.getCurrentTitle()
local tracking_categories = {
no_prefix = 'Викиучебник:Страницы с модулем Hatnote без указания префикса',
no_links = 'Викиучебник:Страницы с модулем Hatnote без ссылок',
red_link = 'Викиучебник:Страницы с модулем Hatnote с красной ссылкой',
bad_format = 'Викиучебник:Страницы с модулем Hatnote с некорректно заполненными параметрами',
formatted = 'Викиучебник:Страницы с модулем Hatnote с готовым форматированиеми',
}
local function index(t1, t2)
return setmetatable(t1, {__index = t2})
end
local function concat(e1, e2)
return tostring(e1) .. tostring(e2)
end
function tr.make_categories(tracking_categories)
local categories = setmetatable({}, {
__tostring = function (self) return table.concat(self) end,
__concat = concat
})
function categories:add(type, nocat)
if not nocat then
table.insert(self, string.format('[[Категория:%s]]', tracking_categories[type]))
end
end
return categories
end
function tr.error(msg, categories, preview_only)
local current_frame = mw.getCurrentFrame()
local parent_frame = current_frame:getParent()
local res_frame_title = parent_frame and parent_frame:getTitle() ~= current_title.prefixedText and
parent_frame:getTitle() or
current_frame:getTitle()
if not preview_only or current_frame:preprocess('{{REVISIONID}}') == '' then
return mError.error{string.format('Ошибка в [[%s]]: %s', res_frame_title, msg)} .. categories
else
return categories
end
end
local function parse_link(link, label)
link = link:gsub('\n', '')
link = link:match('%[%[:?([^%]]+)%]%]') or link:match(':?(.+)')
if link:match('|') then
link, label = link:match('^([^%|]+)%|(.+)$')
end
return link, label
end
function p.format_link(frame)
-- {{ссылка на раздел}}
local args = get_args(frame)
local link, section, label = args[1], args[2], args[3]
if not link then
link = current_title.text
if section then
link = '#' .. section
label = label or '§ ' .. section
end
else
link, label = parse_link(link, label)
if section and not link:match('#') then
link = link .. '#' .. section
end
label = (label or link):gsub('^([^#]-)#(.+)$', '%1 § %2')
end
return string.format('[[:%s|%s]]', link, label or link)
end
function p.remove_precision(frame)
-- {{без уточнения}}
local args = get_args(frame)
local title = args[1]
return title:match('^(.+)%s+%b()$') or title
end
function p.is_disambig(frame)
local args = get_args(frame)
local title = args[1]
local page = mw.title.new(title)
if not page.exists or mw.title.equals(page, current_title) then
return false
end
local page_content = page:getContent()
local mw_list_content = mw.title.new('MediaWiki:Disambiguationspage'):getContent()
local lang = mw.language.getContentLanguage()
for template in mw.ustring.gmatch(mw_list_content, '%*%s?%[%[Шаблон:([^%]]+)') do
if page_content:match('{{' .. template) or page_content:match('{{' .. lang:lcfirst(template)) then
return true
end
end
return false
end
function p.list(frame)
local args = get_args(frame, {trim = false})
local list_sep = args.list_sep or args['разделитель списка'] or ', '
local last_list_sep = yesno(args.natural_join) ~= false and ' и ' or list_sep
local links_ns = args.links_ns or args['ПИ ссылок']
local bold_links = yesno(args.bold_links or args['ссылки болдом'])
local res_list = {}
local tracked = {
red_link = false,
bad_format = false,
formatted = false,
}
local i = 1
while args[i] do
local link = args[i]
local label = args['l' .. i]
local element = ''
if link:match('<span') then -- TODO: переписать
tracked.formatted = true
element = link -- for {{не переведено}}
else
tracked.bad_format = tracked.bad_format or link:match('|') or link:match('[%[%]]')
link, label = parse_link(link, label)
if links_ns then
label = label or link
link = mw.site.namespaces[links_ns].name .. ':' .. link
end
tracked.red_link = tracked.red_link or not mw.title.new(link).exists
element = p.format_link{link, nil, label}
end
if bold_links then
element = string.format('<b>%s</b>', element)
end
table.insert(res_list, element)
i = i + 1
end
local res = mw.text.listToText(res_list, list_sep, last_list_sep)
return setmetatable({res}, {
__index = tracked,
__tostring = function (self) return self[1] end,
__concat = concat
})
end
function p.hatnote(frame)
local args = get_args(frame)
local text = args[1]
local extraclasses = args.extraclasses
local hide_disambig = yesno(args.hide_disambig)
local res = mw.html.create('div')
:addClass('hatnote')
:addClass(extraclasses)
:wikitext(text)
if hide_disambig then
res:addClass('dabhide')
end
return res
end
function p.main(frame, _tracking_categories)
local args = get_args(frame, {trim = false})
local prefix = args.prefix or args['префикс']
local prefix_plural = args.prefix_plural or args['префикс мн. ч.']
local sep = args.sep or args['разделитель'] or ' '
local dot = yesno(args.dot or args['точка']) and '.' or ''
local nocat = yesno(args.nocat)
local preview_error = yesno(args.preview_error)
categories = tr.make_categories(index(_tracking_categories or {}, tracking_categories))
if not prefix then
categories:add('no_prefix', nocat)
return tr.error('Не указан префикс', categories)
end
if not args[1] then
categories:add('no_links', nocat)
return tr.error('Не указано ни одной страницы', categories, preview_error)
end
if args[2] and prefix_plural then
prefix = prefix_plural
end
local list = p.list(args)
if list.red_link then
categories:add('red_link', nocat)
end
if list.bad_format then
categories:add('bad_format', nocat)
end
if list.formatted then
categories:add('formatted', nocat)
end
return p.hatnote(index({prefix .. sep .. list .. dot}, args)) .. categories
end
return index(p, tr)