Модуль:MetaCatDoc
Модуль для создания страницы документации шаблонов, использующих модули
Модуль генерирует список категорий и список шаблонов. Используется в шаблонах {{Year-doc}}, {{Decade-doc}} и {{Century-doc}}.
Пример: {{#invoke:MetaCatDoc|main}}
в шаблоне «{{Архитектура по векам}}» покажет
Ошибка Lua на строке 16: bad argument #1 to 'gsub' (string expected, got nil).
---*- mode: lua; coding: utf-8; -*-
local p = {}
local title = mw.title.getCurrentTitle().text
local getArgs = require('Module:Arguments').getArgs
local toroman = require('Module:Roman').convert
local ft = string.format
function p.main(frame)
local args = getArgs(frame)
title = args['title'] or title
local templ = string.gsub(title, '/doc$', '') -- rm /doc
local text = mw.title.new(templ,10):getContent()
text = string.gsub(text, '<noinclude>.-</noinclude>', '')
text = string.gsub(text, '<!--.--->', '')
if string.find(text, 'YearMetaCat2') then
mn = 'YearMetaCat2'
elseif string.find(text, 'DecadeMetaCat') then
mn = 'DecadeMetaCat'
elseif string.find(text, 'CenturyMetaCat') then
mn = 'CenturyMetaCat'
else
error('не найден модуль (YearMetaCat2/DecadeMetaCat/CenturyMetaCat)')
end
local ret = ';Добавляет категории:\n'
local cats = string.gsub(text, '.-{{#invoke:'..mn..'|main(.-)}}.*', '%1')
for _, c in ipairs(mw.text.split(cats, '|', true)) do
if c ~= '' and not string.find(c, '=') then
local cc = mw.text.split(c, '!', true)
local c1 = mw.text.trim(cc[1])
if mn == 'CenturyMetaCat' then
local c3 = mw.text.trim(cc[3] or '')
local c4 = mw.text.trim(cc[4] or '')
local ss
if c3 ~= '' and c4 ~= '' then
c3 = tonumber(c3)
c4 = tonumber(c4)
if c3 < 0 and c4 < 0 then
ss = ft('с %s по %s века до н. э. «%s»', toroman(-c3), toroman(-c4), c1)
elseif c3 < 0 and c4 > 0 then
ss = ft('с %s века до н. э. по %s век «%s»', toroman(-c3), toroman(c4), c1)
else
ss = ft('с %s по %s века «%s»', toroman(c3), toroman(c4), c1)
end
elseif c3 ~= '' then
c3 = tonumber(c3)
if c3 < 0 then
ss = ft('с %s века до н. э. «%s»', toroman(-c3), c1)
else
ss = ft('с %s века «%s»', toroman(c3), c1)
end
elseif c4 ~= '' then
c4 = tonumber(c4)
if c4 < 0 then
ss = ft('до %s века до н. э. «%s»', toroman(-c4), c1)
else
ss = ft('до %s века «%s»', toroman(c4), c1)
end
else
ss = c1
end
ret = ret..'* '..ss..'\n'
else -- not century
ret = ret..'* '..c1..'\n'
end
end
end
local templs = ''
local n = 0
for t in string.gmatch(text, '{{[^#].-}}') do
t = mw.text.trim(string.sub(t, 3, -3))
t = string.gsub(t, '{{#invoke:'..mn..'|expand|', '')
n = n + 1
local i = string.find(t, '|')
if i then
local tn = string.sub(t, 0, i-1)
local a = string.sub(t, i)
templs = templs..ft('* {{[[Ш:%s|%s]]%s}}\n', tn, tn, a)
else
templs = templs..ft('* {{[[Ш:%s|%s]]}}\n', t, t)
end
end
if n == 1 then
ret = ret..';Добавляет шаблон:\n'..templs
elseif n > 1 then
ret = ret..';Добавляет шаблоны:\n'..templs
end
return ret
end
return p