Модуль:Pageparser

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация
 ---- Этот модуль содержит функции работы с текстом страницы
local p = {}
 
--[[ 
  Функция возвращает названия всех секций на странице
  
  Параметры:
  1. page= имя страницы (текущая по умолчанию)
  2. level= уровень секции (2 по умолчанию)
  3. namespace= простраство имён (статьи); простраство имён можно передовать внутри имени страницы через двоеточие
  4. delimiter= разделитель названий секций (' • ' по умолчанию)
  
  Возвращаемое значение:
  Строка, содержащая список всех секций, разделённых указанным разделителем
]]
function p.sections(frame)
	local function getParameters( frame_args, arg_list )
		local new_args = {};
		local index = 1;
		local value;
 
		for i,arg in ipairs( arg_list ) do
			value = frame_args[arg]
			if value == nil then
				value = frame_args[index];
				index = index + 1;
			end
			new_args[arg] = value;
		end
 
		return new_args;
	end
	local new_args = getParameters( frame.args, { 'page', 'level', 'namespace', 'delimiter', 'get_numbers', 'firstonly' } );
	local page  = new_args['page'] or '';
	local namespace = new_args['namespace'] or '';
	local level = new_args['level'] or 2;
	local delimiter = new_args['delimiter'] or '\n';
	local get_numbers = new_args['get_numbers'] or false;
	local firstonly = new_args['firstonly'] or false;
	local pagepointer;
	if page == '' then
		pagepointer=mw.title.getCurrentTitle()
		assert(pagepointer,"failed to access getCurrentTitle")
	else
		pagepointer=mw.title.new(page, namespace)
		assert(pagepointer,"failed to access mw.title.new("..tostring(page)..")")
	end
	local text=pagepointer.getContent(pagepointer);
	assert (text,"error: failed to get text from ".. page)
	text= mw.ustring.gsub( text, "<!%-%-.-%-%->", "" ); -- убираем HTML комментарии
	local hpref = mw.ustring.rep("=", tonumber(level));
	local iterator  = mw.ustring.gmatch(text, "\n" .. hpref .. "%s*([^=]-)%s*" .. hpref .."\n");
	local sections = {};
	
	local tocNumber = 1
	for sectionname in iterator do
		table.insert(sections, sectionname .. (get_numbers and ' [' .. tocNumber .. ']' or ''));
		tocNumber = tocNumber + 1;
	end
	if firstonly then return sections[1] else
	return table.concat(sections, delimiter);
	end
end

return p