Модуль:Category
Перейти до навігації
Перейти до пошуку
Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]
Цей модуль надає доступ з 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
Документація вище включена з Модуль:Category/документація. (ред. | історія) Дописувачі можуть експериментувати на підсторінках пісочниця (створити | дзеркало) та тести (створити) цього шаблону. Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки. |
-- Модуль для праці з категоріями.
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| {{#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