Модуль:Рубрики
Материал из ВикиФур
local p={}
local s=require('Модуль:Работа со строками')
local str_replace=s.str_replace
p.COLUMN_TEMPLATE ='{{Рубрика/участник|%title%}}'
p.CANDIDATE_TEMPLATE='{{Рубрика/кандидат|%title%|задачи=%issues%}}'
p.PER_LINE={}
p.PER_LINE[1] ='{{Рубрика/одна|%1%}}'
p.PER_LINE[2] ='{{Рубрика/две|%1%|%2%}}'
p.PER_LINE[3] ='{{Рубрика/три|%1%|%2%|%3%}}'
p.FORMAT={}
p.FORMAT[1]={1}
p.FORMAT[2]={2}
p.FORMAT[3]={3}
p.FORMAT[4]={2,2}
p.FORMAT[5]={2,3}
p.FORMAT[6]={3,3}
p.FORMAT[7]={3,3,1}
p.FORMAT[8]={3,3,2}
p.FORMAT[9]={3,3,3}
function p.expand_columns_from_template(frame)
return p.expand_columns_from_frame(frame:getParent())
end
function p.expand_columns_from_frame(frame)
local result=p.expand_columns(p.list_from_args(frame.args), true)
return frame:preprocess(result)
end
function p.expand_columns_from_console(list)
list=p.list_from_args(list)
return p.expand_columns(list)
end
function p.list_from_args(args)
local list={}, item;
for i, v in pairs(args) do
item={}
if string.match(i, '^%d+$') then
item = p.parse_column_argument(v)
elseif string.match(i, '^кандидат%d*$') then
-- кандидаты записываются в порядке приведения аргументов, а не числа в названии аргумента, но думаю, это ок. --EvilCat
-- Луа в любом случае не хранит порядок :( --EvilCat
item = p.parse_column_argument(v)
item.candidate = true
item.issues = ''
end
if item.title~='' and item.candidate~=nil then table.insert(list, item) end
end
return list
end
function p.parse_column_argument(arg)
local item = {}
local split = mw.text.split(arg, '[\r?\n]')
local issues = ''
for i, v in ipairs(split) do
if i > 1 then
if string.len(v) > 0 then
if issues ~= '' then issues = issues .. '\n' end
issues = issues .. v
end
end
end
item.title = split[1]
if string.len(issues) > 0 then
item.candidate = true
item.issues = issues
else
item.candidate = false
end
return item
end
function p.normalize_list(list)
local normal_list={}
local item
for i, v in pairs(list) do
item={}
if type(v)=="table" then
item=v
else
item={}
item.title=v;
item.candidate=false
end
table.insert(normal_list, item)
end
return normal_list
end
function p.expand_columns(list)
list=p.normalize_list(list)
local result=''
local row_str=''
local template_str
if table.getn(list)==0 then
return 'Не перечислено рубрик!'
elseif p.FORMAT[table.getn(list)]==nil then
return 'Перечислено слишком много рубрик!'
end
local format=p.FORMAT[table.getn(list)]
local row=0
local place=0
for i, v in ipairs(list) do
place=place+1
if i==1 or place>format[row] then
row=row+1
result=result..row_str
place=1
row_str=p.PER_LINE[format[row] ]
end
if v.candidate then
template_str=p.CANDIDATE_TEMPLATE
template_str=str_replace(template_str, '%issues%', v.issues)
else
template_str=p.COLUMN_TEMPLATE
end
template_str=str_replace(template_str, '%title%', v.title)
row_str=str_replace(row_str, '%'..place..'%', template_str)
end
result=result..row_str
return result
end
function p.create_links_from_frame(frame)
return p.create_links(frame.args[1])
end
p['список ссылок']=p.create_links_from_frame
function p.create_links(str, delim)
if delim==nil then delim='•' end
local join_delim
if delim==',' then join_delim=', ' else join_delim=' '..delim..' ' end
local result=''
local titles=mw.text.split(mw.text.trim(str), '%s*'..delim..'%s*')
for i,v in ipairs(titles) do
if i>1 then result=result..join_delim end
result=result..'[[Рубрика:'..v..'|'..v..']]'
end
return result
end
return p