Изменения
Перейти к навигации
Перейти к поиску
Строка 1:
Строка 1:
− local get_args = require('Module:Arguments').getArgs+
− local mError+
− local yesno = function (v) return require('Module:Yesno')(v, true) end+
+
+
+
+
− +
− +
− +
− no_prefix = 'Википедия:Страницы с модулем Hatnote без указания префикса',+
− no_links = 'Википедия:Страницы с модулем Hatnote без ссылок',+
− red_link = 'Википедия:Страницы с модулем Hatnote с красной ссылкой',+
− bad_format = 'Википедия:Страницы с модулем Hatnote с некорректно заполненными параметрами',
− unparsable_link = 'Википедия:Страницы с модулем Hatnote с нечитаемой ссылкой',
− formatted = 'Википедия:Страницы с модулем Hatnote с готовым форматированием',
− }
− +
− +
+
+
+
+
+
+
+
+
+
− +
− +
+
− +
− local categories = setmetatable({}, { +
− __tostring = function (self) return table.concat(self) end, +
− __concat = concat+
− }) +
− +
− function categories:add(element, nocat)
− if not nocat then
− local cat_name
− if tracked_cases and tracked_cases[element] then
− cat_name = tracked_cases[element]
− else
− cat_name = element
− end
− table.insert(self, string.format('[[Категория:%s]]', cat_name))
− end
− end
−
− return categories
− +
− 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 +
− mError = require('Module:Error')
− return mError.error{
− tag = 'div',
− string.format('Ошибка в [[%s]]: %s.'
− .. (preview_only and '<br><small>Это сообщение показывается только во время предпросмотра.</small>' or ''), res_frame_title, msg)
− } .. categories
− else
− return categories
− end
− +
− local args = get_args(frame) +
− local link = args[1]:gsub('\n', '') +
− local label +
− +
− link = mw.text.trim(link:match('^%[%[([^%]]+)%]%]$') or link) +
− if link:sub(1, 1) == '/' then +
− label = link+
− +
− link = link:match(':?(.+)') +
− +
− link, label = link:match('^([^%|]+)%|(.+)$') +
+
+
+
− +
− if not mw.title.new(link) then
− return nil, nil
− end
−
− return link, label
− +
− +
− local args = get_args(frame) +
− local link, section, label = args[1], args[2], args[3] +
− +
− if not link then +
− link = current_title.prefixedText+
− if section then+
− link = '#' .. section+
− label = label or '§ ' .. section+
− end+
+
+
− local parsed_link, parsed_label = p.parse_link{link} +
− if parsed_link then
− link = parsed_link
− else
− return link
− end
− if section and not link:match('#') then
− link = link .. '#' .. section
− if parsed_label then
− parsed_label = parsed_label .. '#' .. section
− end
− end
−
− label = (label or parsed_label or link):gsub('^([^#]-)#(.+)$', '%1 § %2')
− +
− +
− return string.format('[[:%s|%s]]', link, label) +
+
+
+
+
+
+
+
+
+
− return string.format('[[:%s]]', link) +
+
+
+
+
+
+
− function p.remove_precision(frame)+
− +
− local args = get_args(frame) +
− local title = args[1] +
− +
− return title:match('^(.+)%s+%b()$') or title
− end
− +
− +
− local title = args[1]+
− +
− +
− +
− return false+
+
+
+
+
− +
− 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
− 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 = {}+
− +
− red_link = false,+
− bad_format = false,+
− formatted = false,+
− unparsable_link = false+
− }+
− +
− +
− 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
− local bad_format = (link:match('|') or link:match('[%[%]]')) ~= nil
− local parsed_link, parsed_label = p.parse_link{link}
−
− if parsed_link then
− tracked.bad_format = tracked.bad_format or bad_format
− if links_ns then
− parsed_label = parsed_label or parsed_link
− parsed_link = mw.site.namespaces[links_ns].name .. ':' .. parsed_link
− end
−
− local title = mw.title.new(parsed_link)
− tracked.red_link = tracked.red_link or not (title.isExternal or title.exists)
− element = p.format_link{parsed_link, nil, label or parsed_label}
− else
− tracked.unparsable_link = true
− element = link
− end
− end
−
− if bold_links then
− element = string.format('<b>%s</b>', element)
− end
−
− table.insert(res_list, element)
− i = i + 1
− +
− +
− __index = tracked, +
− __tostring = function (self) return mw.text.listToText(self, list_sep, last_list_sep) end,
− __concat = concat,
− __pairs = function (self) return pairs(tracked) end
− +
− local args = get_args(frame) +
− local text = args[1] +
− local id = args.id +
− +
− +
− +
− local res = mw.html.create('div')+
− :attr('id', id)+
− :addClass('hatnote')
− :addClass('navigation-not-searchable')
− :addClass(extraclasses)
− :wikitext(text)
−
− if hide_disambig then
− res:addClass('dabhide')
−
− 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)
− local empty_list_message = args.empty_list_message or 'Не указано ни одной страницы'
−
− categories = tr.define_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(empty_list_message, categories, preview_error)
− end
−
− if args[2] and prefix_plural then
− prefix = prefix_plural
− end
−
− local list = p.list(args)
−
− for k, v in pairs(list) do
− if type(v) == 'boolean' and v then
− categories:add(k, nocat)
− end
− end
−
− return p.hatnote(index({prefix .. sep .. list .. dot}, args)) .. categories
− +
Reordered helper functions (first by export status, then alphabetically) and migrated p.quote upstream from Module:Redirect hatnote (includes contributions by Tamzin and Nihiltres)
--------------------------------------------------------------------------------
-- 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 p, tr = {}, {}
local libraryUtil = require('libraryUtil')
local current_title = mw.title.getCurrentTitle()
local checkType = libraryUtil.checkType
local tracking_categories = {
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 function index(t1, t2)
local p = {}
return setmetatable(t1, {__index = t2})
--------------------------------------------------------------------------------
-- 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
end
local function concat(e1, e2)
local function removeInitialColon(s)
return tostring(e1) .. tostring(e2)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
end
function tr.define_categories(tracked_cases)
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
end
function tr.error(msg, categories, preview_only)
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
end
function p.parse_link(frame)
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 = current_title.prefixedText .. link
link = removeInitialColon(link)
end
end
local namespace = link:match('^(.-):')
if link:match('|') then
if namespace then
local nsTable = mw.site.namespaces[namespace]
if nsTable then
return nsTable.id
end
end
end
return 0
end
end
function p.format_link(frame)
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 .. '|help]])'
else
else
helpText = ''
end
end
-- Make the category text.
if label and label ~= link then
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 templates with errors'
category = mw.ustring.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
)
else
else
category = ''
end
end
return mw.ustring.format(
'<strong class="error">Error: %s%s.</strong>%s',
msg,
helpText,
category
)
end
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.is_disambig(frame)
function p.quote(title)
local args = get_args(frame)
--Wraps titles in quotation marks. If the title starts/ends with a quotation
--mark, kerns that side as with {{-'}}
local page = mw.title.new(title)
local quotationMarks = {
["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
if not page or not page.exists or mw.title.equals(page, current_title) then
}
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
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
end
--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
function p.hatnote(frame)
local tracked = {
local args = getArgs(frame)
local s = args[1]
if not s then
return p.makeWikitextError(
'no text specified',
'Template:Hatnote#Errors',
args.category
local i = 1
)
end
end
return p._hatnote(s, {
return setmetatable(res_list, {
extraclasses = args.extraclasses,
selfref = args.selfref
})
})
end
end
function p.hatnote(frame)
function p._hatnote(s, options)
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local extraclasses = args.extraclasses
local inline = options.inline
local hide_disambig = yesno(args.hide_disambig)
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
local extraclasses
if type(options.extraclasses) == 'string' then
extraclasses = options.extraclasses
end
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
end
return index(p, tr)
return p