Модуль:YearMetaCat (Bk;rl,&YearMetaCat)
Функции
theme
Аналог {{тема по годам}}. Например, {{#invoke:YearMetaCat|theme|Родившиеся в <год> году}}
на странице Категория:Родившиеся в 2000 году даст
1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 |
---|
По умолчанию, год берётся из заголовка по правилам, схожим с шаблоном {{год из заголовка}}.
В отличие от шаблона {{тема по годам}} год из заголовка вычитывается один раз.
По умолчанию отображаются ±5 лет относительно текущего года, но это значение может настраиваться: {{#invoke:YearMetaCat|theme|<год> год в СССР|диапазон=7|год=1961}}
1954 | 1955 | 1956 | 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | 1963 | 1964 | 1965 | 1966 | 1967 | 1968 |
---|
Кроме того, поддерживаются паттерны для обработки указания стран: {{#invoke:YearMetaCat|theme|<год> год <в стране>|диапазон=7|год=1961|страна=Франция}}
1954 | 1955 | 1956 | 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | 1963 | 1964 | 1965 | 1966 | 1967 | 1968 |
---|
Возможно задавать минимальный и максимальный годы с помощью |мин=
и |макс=
: {{#invoke:YearMetaCat|theme|Евровидение-<год>|год=1958|min=1956}}
1956 | 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | 1963 |
---|
- Известные ограничения
- Не реализована обработка годов до нашей эры и пересечения эры.
decade_theme
{{#invoke:YearMetaCat|decade_theme|<десятилетие> в Азии}}
на странице К:1800-е годы в Азии даст 1750-е | 1760-е | 1770-е | 1780-е | 1790-е | 1800-е | 1810-е | 1820-е | 1830-е | 1840-е | 1850-е |
---|
|диапазон=
действует аналогично функции theme()
, но число в нём означает количество ячеек слева и справа, с шагом в десять лет. Параметры |мин=
и |макс=
тоже поддерживаются, но по умолчанию используется значение |макс=2020
, потому что в большинстве случаев на данный момент нет смысла создавать категории будущих десятилетий. Пример: {{#invoke:YearMetaCat|decade_theme|<десятилетие> <в стране>|страна=Украина}}
на странице К:2000-е годы на Украине даст 1950-е | 1960-е | 1970-е | 1980-е | 1990-е | 2000-е | 2010-е | 2020-е |
---|
- Известные ограничения
- Не реализована обработка дат до нашей эры и пересечения эры.
cats
Создаёт список категорий с шаблонными параметрами. В данный момент реализованы варианты, поддерживающие страну в именительном, родительном и местном падеже, а также годы, десятилетия и века.
- Пример
{{#invoke:YearMetaCat|cats |Здания и сооружения, построенные в <год> году!.<страна>! |Здания и сооружения <страны>, построенные в <десятилетие> годы! <последняя_цифра>! |Появились в <год> году <в стране> |год=1990|страна=Великобритания }}
даёт следующий список категорий:
[[К:Здания и сооружения, построенные в 1990 году|.Великобритания]] [[К:Здания и сооружения Великобритании, построенные в 1990-е годы| 0]] [[К:Появились в 1990 году в Великобритании]]
Обратите внимание, что если среди шаблонных параметров есть <век>, то обязательно надо указывать параметр |десятилетие=да
(или его аналог |is_decade=yes
, принимаются все значения, обрабатываемые модулем Yesno), иначе нулевые десятилетия будут отнесены к предыдущему веку.
По умолчанию | |десятилетие=да
| |
---|---|---|
Код | {{#invoke:YearMetaCat|cats |Умершие в <десятилетие> годы |Казнённые в <век>е |год=1800 }} |
{{#invoke:YearMetaCat|cats |Умершие в <десятилетие> годы |Казнённые в <век>е |год=1800 |десятилетие = да }} |
Результат | [[К:Умершие в 1800-е годы]] [[К:Казнённые в XVIII веке]] |
[[К:Умершие в 1800-е годы]] [[К:Казнённые в XIX веке]] |
catmain
Передаёт шаблонные параметры в {{Основная статья по теме категории}}
Код | Результат |
---|---|
{{#invoke:YearMetaCat|catmain|<год> год в кино|год=2012}} |
|
{{#invoke:YearMetaCat|catmain|<год> год в политике <страны>|год=2001|страна=Россия}} |
См. также
- Module:Navseasoncats — схожий модуль, заимствованный из английской Википедии
- Модуль:YearMetaCat2 — аналогичный модуль для годов
local p = {}
local cc = nil --required when needed
local roman = nil --required when needed
local yesno = nil --required when needed
local YEAR_PLACEHOLDER = '<год>'
local COUNTRY_NOM_PLACEHOLDER = '<страна>'
local CENTURY_NOM_PLACEHOLDER = '<век>'
local COUNTRY_GEN_PLACEHOLDER = '<страны>'
local CENTURY_GEN_PLACEHOLDER = '<века>'
local COUNTRY_LOC_PLACEHOLDER = '<в стране>'
local LAST_DIGIT_PLACEHOLDER = '<последняя_цифра>'
local DECADE_NOM_PLACEHOLDER = '<десятилетие>'
local DECADE_GEN_PLACEHOLDER = '<десятилетия>'
-- простой аналог [[Модуль:Math/tonumber#year]] без дат до нашей эры и обработки других чисел
local function year_from_title()
local title = mw.title.getCurrentTitle().text
for t in mw.ustring.gmatch(title, '[0-9]+') do
return t
end
return ''
end
local function error_string(s)
return '<span class="error">' .. s .. '</span>'
end
local function get_year(args)
return tonumber(args['year']) or tonumber(args['год']) or tonumber(year_from_title())
end
local function subst_country(frame, cat_pattern, country)
if cat_pattern:find(COUNTRY_NOM_PLACEHOLDER) then
cat_pattern = mw.ustring.gsub(cat_pattern, COUNTRY_NOM_PLACEHOLDER, country)
end
if cat_pattern:find(COUNTRY_GEN_PLACEHOLDER) then
if cc == nil then cc = require('Module:CountryCases') end
cat_pattern = mw.ustring.gsub(cat_pattern, COUNTRY_GEN_PLACEHOLDER, cc._genitive(frame, country))
end
if cat_pattern:find(COUNTRY_LOC_PLACEHOLDER) then
if cc == nil then cc = require('Module:CountryCases') end
cat_pattern = mw.ustring.gsub(cat_pattern, COUNTRY_LOC_PLACEHOLDER, cc._locative(frame, country))
end
return cat_pattern
end
local function century_num(year, is_decade)
if is_decade and year % 100 == 0 then
return math.floor((year) / 100) + 1
end
return math.floor((year-1) /100 +1 )
end
local function get_roman_century(frame, year, is_decade)
if roman == nil then
roman = require('Module:Roman').convert
end
return year and roman(century_num(year, is_decade)) or error_string('Укажите год')
end
local function do_all_subst(frame, cat_pattern, year, country, is_decade)
cat_pattern = subst_country(frame, cat_pattern, country)
if cat_pattern:find(YEAR_PLACEHOLDER) then
cat_pattern = mw.ustring.gsub(cat_pattern, YEAR_PLACEHOLDER, tostring(year))
end
local roman_century = nil
if cat_pattern:find(CENTURY_NOM_PLACEHOLDER) then
roman_century = roman_century or get_roman_century(frame, year, is_decade)
cat_pattern = mw.ustring.gsub(cat_pattern, CENTURY_NOM_PLACEHOLDER, roman_century .. ' век')
end
if cat_pattern:find(CENTURY_GEN_PLACEHOLDER) then
roman_century = roman_century or get_roman_century(frame, year, is_decade)
cat_pattern = mw.ustring.gsub(cat_pattern, CENTURY_GEN_PLACEHOLDER, roman_century .. ' века')
end
if cat_pattern:find(LAST_DIGIT_PLACEHOLDER) then
cat_pattern = mw.ustring.gsub(cat_pattern, LAST_DIGIT_PLACEHOLDER, tostring(year % 10))
end
if cat_pattern:find(DECADE_NOM_PLACEHOLDER) then
cat_pattern = mw.ustring.gsub(cat_pattern, DECADE_NOM_PLACEHOLDER, tostring(year - (year % 10)) .. '-е')
end
if cat_pattern:find(DECADE_GEN_PLACEHOLDER) then
cat_pattern = mw.ustring.gsub(cat_pattern, DECADE_GEN_PLACEHOLDER, tostring(year - (year % 10)) .. '-х')
end
return cat_pattern
end
function p.theme(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame)
local year = get_year(args)
if year == nil then
return error_string('Ошибка: не указан год')
end
local wt = mw.html.create('table'):addClass('standard'):attr('align', 'center')
local row = wt:tag('tr')
local range = tonumber(args['range']) or tonumber(args['диапазон']) or 5
local country = args['страна'] or args['country']
local cat_pattern = args[1]
local catmain_pattern = args['основная'] or args['catmain'] or args['main']
cat_pattern = subst_country(frame, cat_pattern, country)
local year_cat = function(y)
return '[[:К:' .. mw.ustring.gsub(cat_pattern, YEAR_PLACEHOLDER, tostring(y)) .. '|' .. tostring(y) .. ']]'
end
local start_year
local min_year = tonumber(args['min']) or tonumber(args['мин'])
if min_year then
start_year = math.max(min_year, year - range)
if year < start_year then
return error_string('Год не попадает в диапазон: меньше минимального значения ' .. tostring(min_year))
end
else
start_year = year - range
end
for y = start_year, year -1 do
row:tag('td'):wikitext(year_cat(y))
end
row:tag('th'):wikitext(tostring(year))
local end_year
local max_year = tonumber(args['max']) or tonumber(args['макс'])
if max_year then
end_year = math.min(max_year, year + range)
if year > end_year then
return error_string('Год не попадает в диапазон: больше максимального значения ' .. tostring(max_year))
end
else
end_year = year + range
end
for y = year +1, end_year do
row:tag('td'):wikitext(year_cat(y))
end
return tostring(wt)
end
local function deexclamatecat(pat)
local split = mw.text.split(pat, '!', true)
if split == nil or #split == 0 then
return ''
end
return '[[К:' .. split[1] .. (split[2] and ('|' .. split[2]) or '') .. ']]'
end
function p.cats(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local tt = require('Module:TableTools')
local args = getArgs(frame)
local year = get_year(args)
yesno = yesno or require('Module:Yesno')
local is_decade = yesno(args['is_decade']) or yesno(args['десятилетие'])
local country = args['страна'] or args['country']
local ret = ''
for _, pat in tt.sparseIpairs(args) do
ret = ret .. deexclamatecat(pat) .. '\n'
end
ret = do_all_subst(frame, ret, year, country, is_decade)
if args['demo'] or args['демо'] then --для документации
return frame:extensionTag('pre', ret)
else
return ret
end
end
function p.decade_theme(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame)
local year = get_year(args)
if year == nil then
return error_string('Ошибка: не указан год')
end
if year % 10 ~= 0 then
return error_string('Ошибка: должно использоваться только на страницах десятилетий')
end
local wt = mw.html.create('table'):addClass('standard'):attr('align', 'center')
local row = wt:tag('tr')
local range = tonumber(args['range']) or tonumber(args['диапазон']) or 5
local country = args['страна'] or args['country']
local cat_pattern = args[1]
cat_pattern = subst_country(frame, cat_pattern, country)
local year_cat = function(y)
if cat_pattern:find(DECADE_GEN_PLACEHOLDER) then
return '[[:К:' .. mw.ustring.gsub(cat_pattern, DECADE_GEN_PLACEHOLDER, tostring(y) .. '-х годов') .. '|' .. tostring(y) .. '-е]]'
else
return '[[:К:' .. mw.ustring.gsub(cat_pattern, DECADE_NOM_PLACEHOLDER, tostring(y) .. '-е годы') .. '|' .. tostring(y) .. '-е]]'
end
end
local start_year
local min_year = tonumber(args['min']) or tonumber(args['мин'])
if min_year then
if min_year % 10 ~= 0 then
return error_string('Ошибка: заданный минимальный год не является границей десятилетия')
end
start_year = math.max(min_year, year - range * 10)
if year < start_year then
return error_string('Год не попадает в диапазон: меньше минимального значения ' .. tostring(min_year))
end
else
start_year = year - range * 10
end
for y = start_year, year - 10, 10 do
row:tag('td'):wikitext(year_cat(y))
end
row:tag('th'):wikitext(tostring(year) .. '-е')
local end_year
local max_year = tonumber(args['max']) or tonumber(args['макс']) or 2020 -- в будущее сильно уходить не надо, на 10 лет хватит
if max_year then
if max_year % 10 ~= 0 then
return error_string('Ошибка: заданный максимальный год не является границей десятилетия')
end
end_year = math.min(max_year, year + range * 10)
if year > end_year then
return error_string('Год не попадает в диапазон: больше максимального значения ' .. tostring(max_year))
end
end
for y = year + 10, end_year, 10 do
row:tag('td'):wikitext(year_cat(y))
end
return tostring(wt)
end
function p.catmain(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
yesno = yesno or require('Module:Yesno')
local args = getArgs(frame)
local year = get_year(args)
if year == nil then
return error_string('Ошибка: не указан год')
end
local country = args['страна'] or args['country']
local is_decade = yesno(args['is_decade']) or yesno(args['десятилетие'])
local cat_pattern = args[1]
cat_pattern = do_all_subst(frame, cat_pattern, year, country, is_decade)
return frame:expandTemplate({title = 'Основная статья по теме категории', args = {cat_pattern}})
end
return p