Этот модуль относится к критическим. У него очень много включений или он используется с подстановкой. Из-за опасности вандализма или ошибочного редактирования он был защищён.
Модуль предназначен для реализации hatnote-шаблонов (например, {{основная статья}}, {{см. также}}). Также он содержит несколько функций для работы со ссылками и отслеживания ошибок. См. тесты на странице Шаблон:Основная статья/тесты.
Основные функции содержатся в таблице p, все функции можно вызывать как из других модулей, так и через {{#invoke}}. При вызове из модуля функции принимают первым параметром таблицу с аргументами. Все описанные ниже параметры являются аргументами этой таблицы. Некоторые параметры принимают булевоподобные значения: их перечисление можно найти здесь.
parse_link
Принимает на вход ссылку, возвращает два значения: целевую страницу и видимую часть ссылки. Если ссылку не удалось разобрать, возвращает nil. Наличие квадратных скобок не обязательно.
format_link
Формирует вики-ссылку. Превращает # в ссылках на разделы в знак параграфа, отбитый пробелами, делая их более читабельными (см. {{ссылка на раздел}}).
Параметры:
первый параметр: название целевой страницы или вики-ссылка.
второй параметр: название раздела. Параметр будет проигнорирован, если раздел уже задан в первом параметре через #.
третий параметр: видимый текст ссылки.
remove_precision
Убирает уточнение из первого параметра (см. {{без уточнения}}).
|list_sep = или |разделитель списка =: разделитель списка, по умолчанию — «, ».
|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}}
вызов из другого модуля:
-- подключение модуляlocalhatnote=require('Модуль:Hatnote').main-- пример использования без изменения категорий по умолчаниюlocalres1=hatnote{'Какая-то статья',l1='Какой-нибудь текст ссылки',prefix='Основная статья:',prefix_plural='Основные статьи:',dot=true,nocat=args.nocat-- следует всегда передавать nocat, если он предусмотрен}-- и с изменениемlocalres2=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-Параметры).
formatted — параметр содержит <span (в таком случае он не парсится, а выдаётся в готовом виде). Нужно для поддержки шаблонов {{не переведено}} в качестве параметров.
unparsable_link — параметр содержит нестандартное оформление, которое не может быть разобрано модулем (например, {{см. также|[https://example.com внешние ссылки]}} или {{см. также|посторонний текст помимо [[ссылка|ссылки]]}}).
localget_args=require('Module:Arguments').getArgslocalmErrorlocalyesno=function(v)returnrequire('Module:Yesno')(v,true)endlocalp,tr={},{}localcurrent_title=mw.title.getCurrentTitle()localtracking_categories={no_prefix='Википедия:Страницы с модулем Hatnote без указания префикса',no_links='Википедия:Страницы с модулем Hatnote без ссылок',red_link='Википедия:Страницы с модулем Hatnote с красной ссылкой',bad_format='Википедия:Страницы с модулем Hatnote с некорректно заполненными параметрами',unparsable_link='Википедия:Страницы с модулем Hatnote с нечитаемой ссылкой',formatted='Википедия:Страницы с модулем Hatnote с готовым форматированием',}-- Общая категория для страниц значений: [[Категория:Страницы значений по алфавиту]]localdisambig_cat='Страницы значений по алфавиту'localfunctionindex(t1,t2)returnsetmetatable(t1,{__index=t2})endlocalfunctionconcat(e1,e2)returntostring(e1)..tostring(e2)endfunctiontr.define_categories(tracked_cases)localcategories=setmetatable({},{__tostring=function(self)returntable.concat(self)end,__concat=concat})functioncategories:add(element,nocat)ifnotnocatthenlocalcat_nameiftracked_casesandtracked_cases[element]thencat_name=tracked_cases[element]elsecat_name=elementendtable.insert(self,string.format('[[Категория:%s]]',cat_name))endendreturncategoriesendfunctiontr.error(msg,categories,preview_only)localcurrent_frame=mw.getCurrentFrame()localparent_frame=current_frame:getParent()localres_frame_title=parent_frameandparent_frame:getTitle()~=current_title.prefixedTextandparent_frame:getTitle()orcurrent_frame:getTitle()ifnotpreview_onlyorcurrent_frame:preprocess('{{REVISIONID}}')==''thenmError=require('Module:Error')returnmError.error{tag='div',string.format('Ошибка в [[%s]]: %s.'..(preview_onlyand'<br><small>Это сообщение показывается только во время предпросмотра.</small>'or''),res_frame_title,msg)}..categorieselsereturncategoriesendendfunctionp.parse_link(frame)localargs=get_args(frame)locallink=args[1]:gsub('\n','')locallabellink=mw.text.trim(link:match('^%[%[([^%]]+)%]%]$')orlink)iflink:sub(1,1)=='/'thenlabel=linklink=current_title.prefixedText..linkendlink=link:match(':?(.+)')iflink:match('|')thenlink,label=link:match('^([^%|]+)%|(.+)$')endifnotmw.title.new(link)thenreturnnil,nilendreturnlink,labelendfunctionp.format_link(frame)-- {{ссылка на раздел}}localargs=get_args(frame)locallink,section,label=args[1],args[2],args[3]ifnotlinkthenlink=current_title.prefixedTextifsectionthenlink='#'..sectionlabel=labelor'§ '..sectionendelselocalparsed_link,parsed_label=p.parse_link{link}ifparsed_linkthenlink=parsed_linkelsereturnlinkendifsectionandnotlink:match('#')thenlink=link..'#'..sectionifparsed_labelthenparsed_label=parsed_label..'#'..sectionendendlabel=(labelorparsed_labelorlink):gsub('^([^#]-)#(.+)$','%1 § %2')endiflabelandlabel~=linkthenreturnstring.format('[[:%s|%s]]',link,label)elsereturnstring.format('[[:%s]]',link)endendfunctionp.remove_precision(frame)-- {{без уточнения}}localargs=get_args(frame)localtitle=args[1]returntitle:match('^(.+)%s+%b()$')ortitleendfunctionp.is_disambig(frame)localargs=get_args(frame)localtitle=args[1]localpage=mw.title.new(title)ifnotpageornotpage.existsormw.title.equals(page,current_title)thenreturnfalseendfor_,cinipairs(page.categories)doifc==disambig_catthenreturntrueendendreturnfalseendfunctionp.list(frame)localargs=get_args(frame,{trim=false})locallist_sep=args.list_seporargs['разделитель списка']or', 'locallast_list_sep=yesno(args.natural_join)~=falseand' и 'orlist_seplocallinks_ns=args.links_nsorargs['ПИ ссылок']localbold_links=yesno(args.bold_linksorargs['ссылки болдом'])localres_list={}localtracked={red_link=false,bad_format=false,formatted=false,unparsable_link=false}locali=1whileargs[i]dolocallink=args[i]locallabel=args['l'..i]localelement=''iflink:match('<span')then-- TODO: переписатьtracked.formatted=trueelement=link-- for {{не переведено}}elselocalbad_format=(link:match('|')orlink:match('[%[%]]'))~=nillocalparsed_link,parsed_label=p.parse_link{link}ifparsed_linkthentracked.bad_format=tracked.bad_formatorbad_formatiflinks_nsthenparsed_label=parsed_labelorparsed_linkparsed_link=mw.site.namespaces[links_ns].name..':'..parsed_linkendlocaltitle=mw.title.new(parsed_link)tracked.red_link=tracked.red_linkornot(title.isExternalortitle.exists)element=p.format_link{parsed_link,nil,labelorparsed_label}elsetracked.unparsable_link=trueelement=linkendendifbold_linksthenelement=string.format('<b>%s</b>',element)endtable.insert(res_list,element)i=i+1endreturnsetmetatable(res_list,{__index=tracked,__tostring=function(self)returnmw.text.listToText(self,list_sep,last_list_sep)end,__concat=concat,__pairs=function(self)returnpairs(tracked)end})endfunctionp.hatnote(frame)localargs=get_args(frame)localtext=args[1]localid=args.idlocalextraclasses=args.extraclasseslocalhide_disambig=yesno(args.hide_disambig)localres=mw.html.create('div'):attr('role','note'):attr('id',id):addClass('hatnote'):addClass('navigation-not-searchable'):addClass(extraclasses):wikitext(text)ifhide_disambigthenres:addClass('dabhide')endreturnresendfunctionp.main(frame,_tracking_categories)localargs=get_args(frame,{trim=false})localprefix=args.prefixorargs['префикс']localprefix_plural=args.prefix_pluralorargs['префикс мн. ч.']localsep=args.seporargs['разделитель']or' 'localdot=yesno(args.dotorargs['точка'])and'.'or''localnocat=yesno(args.nocat)localpreview_error=yesno(args.preview_error)localempty_list_message=args.empty_list_messageor'Не указано ни одной страницы'categories=tr.define_categories(index(_tracking_categoriesor{},tracking_categories))ifnotprefixthencategories:add('no_prefix',nocat)returntr.error('Не указан префикс',categories)endifnotargs[1]thencategories:add('no_links',nocat)returntr.error(empty_list_message,categories,preview_error)endifargs[2]andprefix_pluralthenprefix=prefix_pluralendlocallist=p.list(args)fork,vinpairs(list)doiftype(v)=='boolean'andvthencategories:add(k,nocat)endendreturnp.hatnote(index({prefix..sep..list..dot},args))..categoriesendreturnindex(p,tr)