Модуль:MetaCatDoc (Bk;rl,&MetaCatDoc)

Перейти к навигации Перейти к поиску
Документация

Модуль для создания страницы документации шаблонов, использующих модули

Модуль генерирует список категорий и список шаблонов. Используется в шаблонах {{year-doc}}, {{decade-doc}}, {{century-doc}} и {{country-doc}}.

Пример: {{#invoke:MetaCatDoc|main}} в шаблоне «{{Архитектура по векам}}» покажет

Добавляет категории:

  • Искусство <век> века
  • Архитектура по векам

Добавляет шаблон:

---*- 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

-- Функция для замены шаблонов {{templatename из заголовка|...}} на templatename
local function replaceTemplates(text)
    text = string.gsub(text, '{{%s*([^|{}]-)%s*из заголовка[^}]*}}', '<%1>')
    return text
end

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 = replaceTemplates(text) -- замена вхождений шаблонов парсинга слов из заголовка
    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'
    elseif string.find(text, 'CountryMetaCat') then
        mn = 'CountryMetaCat'
    else
        error('не найден модуль (YearMetaCat2/DecadeMetaCat/CenturyMetaCat/CountryMetaCat)')
    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 века до н. э.]', c1, toroman(-c3), toroman(-c4))
                    elseif c3 < 0 and c4 > 0 then
                        ss = ft('%s [с %s века до н. э. по %s век]', c1, toroman(-c3), toroman(c4))
                    else
                        ss = ft('%s [с %s по %s века]', c1, toroman(c3), toroman(c4))
                    end
                elseif c3 ~= '' then
                    c3 = tonumber(c3)
                    if c3 < 0 then
                        ss = ft('%s [с %s века до н. э.]', c1, toroman(-c3))
                    else
                        ss = ft('%s [с %s века]', c1, toroman(c3))
                    end
                elseif c4 ~= '' then
                    c4 = tonumber(c4)
                    if c4 < 0 then
                        ss = ft('%s [до %s века до н. э.]', c1, toroman(-c4))
                    else
                        ss = ft('%s [до %s века]', c1, toroman(c4))
                    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