Шаблон:Hatnote

Материал из Тептар — свободной энциклопедии
Версия от 12:19, 31 января 2022; Mansur700 (обсуждение | вклад) (Новая страница: «local get_args = require('Module:Arguments').getArgs local mError local yesno = function (v) return require('Module:Yesno')(v, true) end local p, tr = {}, {} loc...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

local get_args = require('Module:Arguments').getArgs local mError 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 с некорректно заполненными параметрами', unparsable_link = 'Тептар:Страницы с модулем 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.define_categories(tracked_cases) 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(, cat_name)) 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('2262') == then mError = require('Module:Error') return mError.error{ tag = 'div', string.format('Ошибка в %s: %s.' .. (preview_only and '
Это сообщение показывается только во время предпросмотра.' or ), res_frame_title, msg) } .. categories else return categories end end

function p.parse_link(frame) 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 = current_title.prefixedText .. link end link = link:match(':?(.+)') if link:match('|') then link, label = link:match('^([^%|]+)%|(.+)$') end

if not mw.title.new(link) then return nil, nil 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.prefixedText if section then link = '#' .. section label = label or '§ ' .. section end else 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') end

if label and label ~= link then return string.format('%s', link, label) else return string.format('%s', link) end end

function p.remove_precision(frame) -- Hatnote 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 or 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, unparsable_link = 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 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('%s', element) end

table.insert(res_list, element) i = i + 1 end

return setmetatable(res_list, { __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 }) end

function p.hatnote(frame) local args = get_args(frame) local text = args[1] local id = args.id local extraclasses = args.extraclasses local hide_disambig = yesno(args.hide_disambig)

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') 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) 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 end

return index(p, tr)