Модуль: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;