Модуль:Рубрики

Материал из ВикиФур
Перейти к: навигация, поиск
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