{{i}} Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]

Цей модуль надає доступ з Lua до вмісту категорій

Обмеження ред.

Режими ред.

Функції ред.

content ред.

{{#invoke:Category|content|Назва категорії|
format = * [[{{((}}#ifeq:$5{{!}}0{{!}}:$1:$2{{((}}!{{))}}{{))}}$2]]|
namespaces = 0 Файл}}

Статичні методи ред.

local C=require('Module:Category');

gelement ред.

for g,ns,all,cats,pgs,files in С.gelement('Назва категорії', mode, namespaces) do  end

Supercats ред.

local t = C.Supercats('Назва категорії');
mw.log("Надкатегоріі категорії Назва категорії:");
for _, c in ipairs(t) do mw.log(c) end
-- Модуль для праці з категоріями.
local M={}
local rcmtab = {all="^(%d+):",categories="(%d+) кат.",pages="(%d+) с.",files="(%d+) ф."};

local function gelement(a,b,c)-- Ітератор
    -- NB! Потім у список повернення, можливо, увійде ключ сортування,
    -- а у параметри — від якого елементу починати.
    local n,m,nss=a,b,c;
    if type(n)=='table' then
        n=a.name;
        m=a.mode or m or 'all';
        nss=a.namespaces or nss
    end
    local cc = mw.text.unstrip(
        mw.getCurrentFrame():extensionTag(
            'categorytree',  n,
            {mode = m, hideroot='on', hideprefix='always', namespaces = nss, showcount='on'}
        )
    )
    local func, static, var =
        cc:gmatch('<a%s[^>]-class%s?=[^>]-CategoryTreeLabelNs(%d+)[^>]->%s*([^<>]-)%s*</a>()');
    return function(st,va)
        local ns,g,f = func(st,va);
        local all,cats,pgs,files;
        if ns=='14' then
            local mpatt = cc:match("^[^<>]*<span[^>]*>%(([^<>]+)%)",f) or '';-- не працює із mode=parents
            all,cats,pgs,files =
                mpatt:match(rcmtab.all), mpatt:match(rcmtab.categories),
                mpatt:match(rcmtab.pages), mpatt:match(rcmtab.files)
        end
        return g,tonumber(ns),all,cats,pgs,files
    end, static, var
end

M.gelement=gelement

function M.content(f)
    local r = {};
    for g,ns,all,cats,pgs,files
    in gelement(f.args['name'] or f.args[1], f.args['mode'] or 'all', f.args['namespaces'])
    do table.insert(r,{g,ns,all,cats,pgs,files}) end
    if f.args['sort'] then--сортуємо за шаблоном, {{{sortdel}}} = витинати елемент
        if f.args['sort']==']' then --сортування в обробленому порядку
            local t,c ={}, #r+1;
            for i,v in ipairs(r) do
                t[c-i] = v
            end
            r = t
        else
            local cmp,t,e,m,h =
             require('Модуль:String')._strcmp,{},nil,f.args['sort']:match('^([<>]?)%s*(.*)');
            if h~='' then
                for k,v in ipairs(r) do
                    e = f:expandTemplate{
                        title = h, args = {v[1], v[2], f.args['name'] or f.args[1],f.args['sortarg'],
                          all=v[3], categories=v[4], pages=v[5], files=v[6]} 
                    };
                    if e ~= f.args.sortdel then table.insert(t, {v,e}) end
                end
                table.sort( t, m=='>' and function(a,b) return cmp(b[2],a[2])<0 end
                                      or  function(a,b) return cmp(a[2],b[2])<0 end )
                r = {}
                for k, v in pairs(t) do r[k] = v[1] end
            else
                table.sort( r, m=='>' and function(a,b) return cmp(b[1],a[1])<0 end
                                      or  function(a,b) return cmp(a[1],b[1])<0 end )
            end
        end
    end
    if f.args['t'] then --передаємо у шаблон
        for k,v in pairs(r) do
            r[k] = f:expandTemplate{
                title = f.args['t'],
                args = {v[1], v[2], f.args['name'] or f.args[1],f.args['targ'],
                    all=v[3], categories=v[4], pages=v[5], files=v[6]
                } 
            }
        end
    else --форматуємо у рядок
       for k,v in pairs(r) do
            r[k] = mw.message.newRawMessage(f.args.format or [==[
: [[{{#switch:$7|14|6=:|}}{{#if:$1|$1:$2{{!}}}}$2}}]]{{#ifeq:$5|14|&nbsp;{{#if:$3|$3: ($4)|(порожня)}}}}]==]
            	):rawParams(mw.site.namespaces[v[2]].name,v[1],v[3] or '',v[3] and table.concat{
                    (v[4] and (f.args.fccategories or "%i кат."):format(v[4]) or (v[5] or v[6]) and (f.args.fcsep or ', ') or ''),
                    (v[5] and (f.args.fcpages or "%i с."):format(v[5]) .. (v[6] and (f.args.fcsep or ', ')) or ''),
                    v[6] and (f.args.fcfiles or "%i ф."):format(v[6]) or ''
                } or '',v[2]
            ):plain()
        end
    end
    return table.concat(r, f.args['j'] or '\n')
end

local function Supercats(n)
    -- NB! Потім може з'явиться параметр якості
    local cc, res = mw.text.unstrip( mw.getCurrentFrame():extensionTag( 
        'categorytree', n, {mode = 'parents',hideroot = 'on'}
    ) ), {};
    for cat in cc:gmatch("<a%s[^>]*>%s*(.-)%s*</a>") do table.insert(res,cat) end
    return res
end

M.Supercats = Supercats;

function M.supercats(f)
    local r = Supercats(f.args.name or f.args[1]);
    if f.args['sort'] then--сортуємо за шаблоном, {{{sortdel}}} = витинати елемент
        if f.args['sort']==']' then --сортування у зворотньому порядку
            local t,c ={}, #r+1;
            for i,v in ipairs(r) do
                t[c-i] = v
            end
            r = t
        else
            cmp,m,h =
             require('Модуль:String')._strcmp,f.args['sort']:match('^([<>]?)%s*(.*)');
            if h~='' then
                local t,e = {}
                for k,v in ipairs(r) do
                    e = f:expandTemplate{
                            title = h, args = {v, f.args['name'] or f.args[1],f.args['sortarg']} 
                    };
                    if e ~= f.args.sortdel then table.insert(t, {v,e}) end
                end
                table.sort( t, m=='>' and function(a,b) return cmp(b[2], a[2])<0 end
                                      or  function(a,b) return cmp(a[2], b[2])<0 end )
                r = {}
                for k, v in pairs(t) do r[k] = v[1] end
            else
                table.sort( r, m=='>' and function(a,b) return cmp(b, a)<0 end
                                      or  function(a,b) return cmp(a, b)<0 end )
            end
        end
    end
    if f.args['t'] then --передаємо у шаблон
        for k,v in pairs(r) do
            r[k] = f:expandTemplate{
                title = f.args['t'],
                args = {v, f.args['name'] or f.args[1], f.args['targ']} 
            }
        end
    else --форматуємо у рядок
       for k,v in pairs(r) do
            r[k] = mw.message.newRawMessage(f.args['format'] or ": [[:Категорія:$1|$1]]")
            :rawParams(v):plain()
        end
    end
    return table.concat(r, f.args['j'] or '\n')
end

return M