Модуль:Основная статья
Внешний вид
Этот модуль относится к критическим: у него очень много включений. Из-за опасности вандализма или ошибочного редактирования он был защищён.
Прежде чем вносить какие-либо изменения в этот модуль, просьба оттестировать их в его песочнице и проверить результат на странице с контрольными примерами.
Этот модуль использует TemplateStyles и загружает следующие таблицы CSS-стилей:
Модуль, реализующий шаблон {{Основная статья}}.
Отслеживающие категории:
Код
local p = {}
local get_args = require('Module:Arguments').getArgs
local mHatnote = require('Module:Hatnote')
local category_ns_number = 14
local templatestyles_page = 'Module:Основная статья/styles.css'
local function get_property(args)
local res = mw.getCurrentFrame():expandTemplate{title = 'wikidata', args = args}
return res ~= '' and res or nil
end
local function get_link_target(wikitext)
local target = wikitext:match('%[%[([^%]%|]+)%]') or wikitext:match('%[%[([^%|]+)%|')
return {
target = target or wikitext,
contains_link = target ~= nil
}
end
local function get_catmain_from_wikidata(properties)
local values = {}
for _, property in pairs(properties) do
values[#values + 1] = get_property{property}
values[#values + 1] = get_property{property, plain = true}
end
if #values > 0 then
for _, value in pairs(values) do
local link_target = get_link_target(value)
local title = mw.title.new(link_target.target)
if title and title.exists then
return {
title = value,
exists = true,
missed = not link_target.contains_link
}
end
end
return {title = values[1], exists = false}
end
return nil
end
local function check_title_exists(title_text)
if not title_text or title_text == '' then return false end
local page = title_text:match('%[%[([^%]%|]+)') or title_text:match('%[%[([^%|]+)%|') or title_text
local title = mw.title.new(page)
return title and title.exists or false
end
function p.main(frame)
local args = get_args(frame)
local current_title = mw.title.getCurrentTitle()
local categories = mHatnote.define_categories{
by_wikidata = 'Википедия:Категории с основной статьёй из Викиданных',
by_pagename = 'Википедия:Категории c основной статьёй, которая не указана явно',
missed = 'Википедия:Категории с существующей основной статьёй, не указанной в Викиданных'
}
local hatnote_args = {
extraclasses = 'ts-main',
prefix = 'Основная статья:',
prefix_plural = 'Основные статьи:'
}
for k, v in pairs(args) do hatnote_args[k] = v end
local overridden_categories = {}
local nocat = args.nocat
local first_title_exists
if current_title.namespace == category_ns_number then
hatnote_args.id = 'catmore'
overridden_categories.red_link = 'Википедия:Категории без основных статей'
if not hatnote_args[1] then
local catmain = get_catmain_from_wikidata{'p301', 'p1753'}
local title
if catmain then
title = catmain.title
first_title_exists = catmain.exists
categories:add('by_wikidata', nocat)
if catmain.missed then
categories:add('missed')
end
else
title = current_title.text
categories:add('by_pagename', nocat)
end
hatnote_args[1] = title
end
if first_title_exists == nil then
link = mHatnote.parse_link{hatnote_args[1]}
first_title_exists = not link or mw.title.new(link).exists
end
if not first_title_exists then
hatnote_args.prefix = 'У этой категории нет основной статьи —'
end
end
-- Фильтрация существующих страниц
if args.ifexist then
local existing = {}
for i, v in ipairs(hatnote_args) do
local exists = (i == 1 and first_title_exists) or check_title_exists(v)
if exists then existing[#existing + 1] = v end
end
if #existing == 0 then return '' end
for k in pairs(hatnote_args) do
if type(k) == 'number' then hatnote_args[k] = nil end
end
for i, v in ipairs(existing) do hatnote_args[i] = v end
end
hatnote_args.prefix = frame:extensionTag{
name = 'templatestyles',
args = { src = templatestyles_page },
} .. hatnote_args.prefix
return mHatnote.main(hatnote_args, overridden_categories) .. categories
end
return p