Модуль:ReverseList
Модуль предназначен для формирования нумерованного списка с обратным порядком нумерации. Используется в шаблоне {{ReverseList}}
ФункцииПравить
ReverseOrderedListПравить
{{#invoke:ReverseOrderedList}}
ПараметрыПравить
Скрипт принимает только параметры вызывающего шаблона:
- первый неименованный параметр — строки с тептар-разметкой
count
— количество выводимых строк
ЗамечанияПравить
Скрип обрабатывает строки со стандартной тептар-разметкой, где строки нумерованного списка начинаются с символа #
. Первая строка должна начинаться с новой строки. Инвертируется нумерация только списков первого уровня. Все остальные строки игнорируются. Скрипт тратит около 2 секунд на обработку 1000 строк. С учётом лимита времени выполнения скриптов в 10 секунд, максимальное количество строк не должно превышать 5000.
Также следует учесть, что строки текста, переданные в первом параметре, не должны содержать знаков равно (=
).
local p = {};
--[[
Функция преобразует несколько строк начинающихсся символом #, переданных первым параметром, в нумерованный список с обратным порядком нумерации
Второй параметр задает количество выводимых строк
]]
function p.ReverseList(list, list_count)
if list == nil or list == '' then
return '';
end
local pattern = "\n#([^#*:][^\n]+)"; -- подсчёт нумерованных списков
local count = 0;
local cnt = 0;
local t = '';
t, count = mw.ustring.gsub(list, pattern, "");
if count > 0 then
if (list_count == nil) or (count < list_count) then
t, cnt = mw.ustring.gsub(list, pattern, function(s)
local item = '\n<li value="' .. count .. '">' .. s .. '</li>';
count = count-1;
return item;
end );
return '<ol style="line-height: 2em;">' .. t .. '</ol>'
else
local items = {};
local iterator = mw.ustring.gmatch(list, pattern);
local cnt = 0;
for s in iterator do
local item = '<li value="' .. count .. '">' .. s .. '</li>';
count = count-1;
table.insert(items, item);
cnt = cnt +1;
if cnt >= list_count then
break;
end
end;
if cnt > 0 then
table.insert(items, 1, '<ol style="line-height: 2em;">');
table.insert(items, '</ol>');
return table.concat(items, '\n');
else
return ''
end
end
end
return list;
end
function p.ReverseOrderedList(frame)
local parent = frame:getParent()
local list = parent.args[1];
local list_count = tonumber(parent.args['count']) or nil;
return p.ReverseList(list, list_count);
end;
return p;