<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AGet_page_content</id>
	<title>Модуль:Get page content - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AGet_page_content"/>
	<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Get_page_content&amp;action=history"/>
	<updated>2026-05-15T12:07:36Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Get_page_content&amp;diff=2788&amp;oldid=prev</id>
		<title>Dzmuh: Новая страница: «local p = {}  local monthNames = {'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентя...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Get_page_content&amp;diff=2788&amp;oldid=prev"/>
		<updated>2021-06-03T23:05:55Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «local p = {}  local monthNames = {&amp;#039;января&amp;#039;, &amp;#039;февраля&amp;#039;, &amp;#039;марта&amp;#039;, &amp;#039;апреля&amp;#039;, &amp;#039;мая&amp;#039;, &amp;#039;июня&amp;#039;, &amp;#039;июля&amp;#039;, &amp;#039;августа&amp;#039;, &amp;#039;сентя...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local monthNames = {'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'}&lt;br /&gt;
&lt;br /&gt;
if not getArgs then&lt;br /&gt;
	getArgs = require('Модуль:Arguments').getArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local pageTitle, pageTitleText, sectionHeading, _frame&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Helper function that escapes all pattern characters so that they will be treated&lt;br /&gt;
as plain text. Copied from [[:en:Module:String]].&lt;br /&gt;
]=]&lt;br /&gt;
local function escapePattern(pattern_str)&lt;br /&gt;
	return mw.ustring.gsub(pattern_str, '([%(%)%.%%%+%-%*%?%[%^%$%]])', '%%%1')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Native function can return &amp;quot;Ошибка Lua: PCRE backtrack limit reached while matching pattern '^[	� ]*(.-)[	� ]*$'.&amp;quot;&lt;br /&gt;
-- in case of very long sections.&lt;br /&gt;
local function trim(str)&lt;br /&gt;
	str = mw.ustring.gsub(str, '^[	� ]*', '')&lt;br /&gt;
	str = mw.ustring.gsub(str, '[	� ]*$', '')&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function cleanSectionHeading(heading)&lt;br /&gt;
	-- The following patterns reproduce [[Участник:Jack who built the house/transferHeadingToSummary.js]]&lt;br /&gt;
	heading = mw.ustring.gsub(heading, '%[%[:?[^|%]]*|([^%]]*)%]%]', '%1')&lt;br /&gt;
	heading = mw.ustring.gsub(heading, '%[%[:?([^%]]*)%]%]', '%1')&lt;br /&gt;
	heading = mw.ustring.gsub(heading, &amp;quot;'''(.-)'''&amp;quot;, '%1')&lt;br /&gt;
	heading = mw.ustring.gsub(heading, &amp;quot;''(.-)''&amp;quot;, '%1')&lt;br /&gt;
	heading = mw.ustring.gsub(heading, '&amp;lt;/?%w+ ?/?&amp;gt;', '')&lt;br /&gt;
	heading = mw.ustring.gsub(heading, '&amp;lt;%w+ [%w ]-=[^&amp;lt;&amp;gt;]-&amp;gt;', '')&lt;br /&gt;
	heading = mw.ustring.gsub(heading, '  +', ' ')&lt;br /&gt;
	heading = mw.text.trim(heading)&lt;br /&gt;
	return heading&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function sectionHeadingToLink(sectionHeading)&lt;br /&gt;
	local sectionHeadingLink = sectionHeading&lt;br /&gt;
	-- The following reproduces processURI function of [[Участник:Jack who built the house/copyWikilinks.js]]&lt;br /&gt;
	--[[sectionHeadingLink = mw.ustring.gsub(sectionHeadingLink, '&amp;lt;', '%%3C')&lt;br /&gt;
	sectionHeadingLink = mw.ustring.gsub(sectionHeadingLink, '&amp;gt;', '%%3E')&lt;br /&gt;
	sectionHeadingLink = mw.ustring.gsub(sectionHeadingLink, '%[', '%%5B')&lt;br /&gt;
	sectionHeadingLink = mw.ustring.gsub(sectionHeadingLink, '%]', '%%5D')&lt;br /&gt;
	sectionHeadingLink = mw.ustring.gsub(sectionHeadingLink, '{', '%%7B')&lt;br /&gt;
	sectionHeadingLink = mw.ustring.gsub(sectionHeadingLink, '|', '%%7C')&lt;br /&gt;
	sectionHeadingLink = mw.ustring.gsub(sectionHeadingLink, '}', '%%7D')&lt;br /&gt;
	sectionHeadingLink = mw.ustring.gsub(sectionHeadingLink, ' ', '.C2.A0')]]&lt;br /&gt;
	return '#' .. sectionHeadingLink&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function expandTemplate(tname, targs)&lt;br /&gt;
	local success, result = pcall(&lt;br /&gt;
		_frame.expandTemplate,&lt;br /&gt;
		_frame,&lt;br /&gt;
		{title = tname, args = targs}&lt;br /&gt;
	)&lt;br /&gt;
	return success and result or ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLastMatchWith2Captures(s, pattern)&lt;br /&gt;
	local iterator = mw.ustring.gmatch(s, pattern)&lt;br /&gt;
	local lastCapture1, lastCapture2&lt;br /&gt;
	for capture1, capture2 in iterator do&lt;br /&gt;
		lastCapture1 = capture1&lt;br /&gt;
		lastCapture2 = capture2&lt;br /&gt;
	end&lt;br /&gt;
	return lastCapture1, lastCapture2&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isEmptyClosure(closureContent)&lt;br /&gt;
	if closureContent then&lt;br /&gt;
		closureContent = closureContent&lt;br /&gt;
			:gsub('&amp;lt;includeonly&amp;gt;.-&amp;lt;/includeonly&amp;gt;', '')&lt;br /&gt;
			:gsub('&amp;lt;!%-%-.-%-%-&amp;gt;', '')&lt;br /&gt;
		closureContent = mw.text.trim(closureContent)&lt;br /&gt;
		if #closureContent &amp;lt; 10 then&lt;br /&gt;
			return true&lt;br /&gt;
		else&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function killHeadingMarkers(content)&lt;br /&gt;
	content = mw.ustring.gsub(&lt;br /&gt;
		content,&lt;br /&gt;
		string.char(127) .. '\'&amp;quot;`UNIQ%-%-h%-%d+%-%-QINU`&amp;quot;\'' .. string.char(127),&lt;br /&gt;
		''&lt;br /&gt;
	)&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parsePage(args, talkpageMode)&lt;br /&gt;
	if not _frame then&lt;br /&gt;
		_frame = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local yesno = require('Module:Yesno')&lt;br /&gt;
	&lt;br /&gt;
	local afdMode = yesno(args['режим КУ'], false)&lt;br /&gt;
	local pageListMode = yesno(args['режим списков страниц'], false)&lt;br /&gt;
	local standardMode&lt;br /&gt;
	if not talkpageMode and not afdMode and not pageListMode then&lt;br /&gt;
		standardMode = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local returnAsData = not standardMode or yesno(args['как данные'], false)&lt;br /&gt;
	&lt;br /&gt;
	local returnAsData_onlyStats&lt;br /&gt;
	if returnAsData and args['только статистика'] then&lt;br /&gt;
		returnAsData_onlyStats = yesno(args['только статистика'], false)&lt;br /&gt;
	else&lt;br /&gt;
		returnAsData_onlyStats = false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local subsectionHeading, resultMode&lt;br /&gt;
	if standardMode then&lt;br /&gt;
		resultMode = yesno(args['итог'], false)&lt;br /&gt;
		subsectionHeading = args['подраздел']&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local standardHeading = not standardMode or yesno(args['стандартный заголовок'], false)&lt;br /&gt;
	local shortHeadings = talkpageMode and yesno(args['короткие заголовки'], false)&lt;br /&gt;
	&lt;br /&gt;
	local collapsed = not returnAsData and yesno(args['свернуть'], false)&lt;br /&gt;
	local showFrame = collapsed or (not returnAsData and (yesno(args['обрамление']) or (yesno(args['из шаблона'], false) and (args['обрамление'] == nil))))&lt;br /&gt;
	&lt;br /&gt;
	local sectionHeadingLink&lt;br /&gt;
	if showFrame or (standardHeading or returnAsData_onlyStats) and not talkpageMode then&lt;br /&gt;
		sectionHeadingLink = sectionHeadingToLink(sectionHeading)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local withoutHeading, standardSectionHeading&lt;br /&gt;
	if standardHeading then&lt;br /&gt;
		withoutHeading = true&lt;br /&gt;
		&lt;br /&gt;
		if afdMode then&lt;br /&gt;
			standardSectionHeading = sectionHeading .. ' &amp;lt;span style=&amp;quot;font-size:80%;&amp;quot;&amp;gt;← [[' .. pageTitleText .. sectionHeadingLink .. '|' .. pageTitleText .. ']]&amp;lt;/span&amp;gt;'&lt;br /&gt;
		elseif not talkpageMode then&lt;br /&gt;
			standardSectionHeading = '[[' .. pageTitleText .. sectionHeadingLink .. '|' .. (&lt;br /&gt;
					subsectionHeading&lt;br /&gt;
					and subsectionHeading .. ' (' .. sectionHeading .. ')'&lt;br /&gt;
					or (sectionHeading == 'top' and '&amp;lt;i&amp;gt;Преамбула&amp;lt;/i&amp;gt;' or sectionHeading)&lt;br /&gt;
				) .. ']] &amp;lt;span style=&amp;quot;font-size:80%;&amp;quot;&amp;gt;← ' .. pageTitleText .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
	elseif not talkpageMode and args['заголовок'] then&lt;br /&gt;
		withoutHeading = not yesno(args['заголовок'], false)&lt;br /&gt;
	else&lt;br /&gt;
		withoutHeading = false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local level = tonumber(args['уровень']) or 2  -- базовый уровень при вставке разделов&lt;br /&gt;
	local additionalEqualSigns = ''&lt;br /&gt;
	if level &amp;gt; 2 then&lt;br /&gt;
		for i = 3, level do&lt;br /&gt;
			additionalEqualSigns = additionalEqualSigns .. '='&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local showInTOC&lt;br /&gt;
	if args['показывать в содержании'] then&lt;br /&gt;
		showInTOC = yesno(args['показывать в содержании'], true)&lt;br /&gt;
	elseif collapsed then&lt;br /&gt;
		showInTOC = false&lt;br /&gt;
	else&lt;br /&gt;
		showInTOC = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local showEditLink&lt;br /&gt;
	if args['править'] then&lt;br /&gt;
		showEditLink = yesno(args['править'], true)&lt;br /&gt;
	else&lt;br /&gt;
		showEditLink = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local showStatsLine&lt;br /&gt;
	if standardHeading and args['строка статистики'] then&lt;br /&gt;
		showStatsLine = yesno(args['строка статистики'], false)&lt;br /&gt;
	else&lt;br /&gt;
		showStatsLine = false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--local additionalLabels = afdMode or args['дополнительные ярлыки']&lt;br /&gt;
	&lt;br /&gt;
	local sectionContent&lt;br /&gt;
	local data = {}&lt;br /&gt;
	local allData = talkpageMode and {}&lt;br /&gt;
	if pageTitle.exists then&lt;br /&gt;
		local fullContent = (talkpageMode and '' or '\n== top ==') .. '\n' .. pageTitle:getContent() .. '\n= technical heading =\n'&lt;br /&gt;
		fullContent = mw.ustring.gsub('\n' .. fullContent, '(\n(=+)[^\n]-%2[ \t\f\v]*)&amp;lt;!%-%-.-%-%-&amp;gt;', '%1')&lt;br /&gt;
		&lt;br /&gt;
		local iterator&lt;br /&gt;
		local rootSectionID&lt;br /&gt;
		if talkpageMode then -- соответствие заголовков второго уровня заголовкам вообще для talkpageMode&lt;br /&gt;
			rootSectionID = {}&lt;br /&gt;
			iterator = mw.ustring.gmatch(fullContent, '\n(=+)[^\n]-%1')&lt;br /&gt;
			local i, j = 0, 0&lt;br /&gt;
			for equalSigns in iterator do&lt;br /&gt;
				i = i + 1&lt;br /&gt;
				if equalSigns == '==' then&lt;br /&gt;
					j = j + 1&lt;br /&gt;
					rootSectionID[j] = i&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			iterator = mw.ustring.gmatch(fullContent, '\n((==)([^=][^\n]-)==)')&lt;br /&gt;
		else&lt;br /&gt;
			iterator = mw.ustring.gmatch(fullContent, '\n((=+)([^\n]-)%2)')&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local headingNum = 0&lt;br /&gt;
		for fullMatch, equalSigns, match in iterator do&lt;br /&gt;
			headingNum = headingNum + 1&lt;br /&gt;
			data = {}&lt;br /&gt;
			match = mw.text.trim(match)&lt;br /&gt;
			&lt;br /&gt;
			local thisHeading = mw.text.encode(cleanSectionHeading(match), '&amp;lt;&amp;gt;%[%]{|}')&lt;br /&gt;
			if thisHeading == sectionHeading or talkpageMode then&lt;br /&gt;
				-- получаем содержимое раздела&lt;br /&gt;
				local equalSignsPattern = '='&lt;br /&gt;
				for i = 2, #equalSigns do&lt;br /&gt;
					equalSignsPattern = equalSignsPattern .. '=?'&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				sectionContent =&lt;br /&gt;
					mw.ustring.match(fullContent,&lt;br /&gt;
						   (withoutHeading and '' or '(')&lt;br /&gt;
						.. escapePattern(fullMatch) .. '[ \t\f\v]*\n+'&lt;br /&gt;
						.. (withoutHeading and '(' or '')&lt;br /&gt;
						.. '.-)\n' .. equalSignsPattern .. '[^=][^\n]-=+[ \t\f\v]*\n') or '' --will fail at &amp;quot;===&amp;quot; or the like&lt;br /&gt;
				sectionContent = sectionContent:gsub('&amp;lt;onlyinclude&amp;gt;.-&amp;lt;/onlyinclude&amp;gt;', '')&lt;br /&gt;
				sectionContent = sectionContent:gsub('&amp;lt;includeonly&amp;gt;(.-)&amp;lt;/includeonly&amp;gt;', '%1')&lt;br /&gt;
				&lt;br /&gt;
				local subsectionHeadingNum&lt;br /&gt;
				if subsectionHeading then -- withoutHeading тут неактуально — standardHeading всегда true&lt;br /&gt;
					local beforeContent&lt;br /&gt;
					beforeContent, sectionContent = mw.ustring.match(sectionContent .. '\n= technical heading =\n', '(.-)\n' .. equalSigns .. '=[ \t\f\v]*' .. escapePattern(subsectionHeading) .. '[ \t\f\v]*=+[ \t\f\v]*\n+(.-)\n' .. equalSignsPattern .. '[^=][^\n]-=+[ \t\f\v]*\n')&lt;br /&gt;
					subsectionHeadingNum = 0&lt;br /&gt;
					for match2 in mw.ustring.gmatch('\n' .. beforeContent, '\n=+[^\n]-=+') do&lt;br /&gt;
						subsectionHeadingNum = subsectionHeadingNum + 1&lt;br /&gt;
					end&lt;br /&gt;
					if not sectionContent then&lt;br /&gt;
						sectionContent = ''&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				local closureHeading, resultMode_closureHeadingNum&lt;br /&gt;
				if resultMode then&lt;br /&gt;
					local beforeContent, newSectionContent, closureContent&lt;br /&gt;
					local closureTitles = {'Итог', 'Окончательный итог', 'Автоитог'}&lt;br /&gt;
					if withoutHeading and not standardHeading then&lt;br /&gt;
						for i = 1, #closureTitles do -- через or несколько match'ей тут нельзя, так как возвращаются несколько значений&lt;br /&gt;
							if i == 1 or not newSectionContent then&lt;br /&gt;
								beforeContent, closureHeading, newSectionContent = mw.ustring.match(sectionContent .. '\n= technical heading =\n', '(.*)\n' .. equalSigns .. '=[ \t\f\v]*(' .. closureTitles[i] .. '[^\n]-)[ \t\f\v]*=+[ \t\f\v]*\n+(.-)\n' .. equalSignsPattern .. '[^=][^\n]-=+[ \t\f\v]*\n')&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						for i = 1, #closureTitles do -- через or несколько match'ей тут нельзя, так как возвращаются несколько значений&lt;br /&gt;
							if i == 1 or not newSectionContent then&lt;br /&gt;
								beforeContent, newSectionContent, closureHeading, closureContent = mw.ustring.match(sectionContent .. '\n= technical heading =\n', '(.*)\n(' .. equalSigns .. '=[ \t\f\v]*(' .. closureTitles[i] .. '[^\n]-)[ \t\f\v]*=+[ \t\f\v]*\n(.-))\n' .. equalSignsPattern .. '[^=][^\n]-=+[ \t\f\v]*\n')&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if newSectionContent then&lt;br /&gt;
						sectionContent = newSectionContent&lt;br /&gt;
						newSectionContent = nil&lt;br /&gt;
						resultMode_closureHeadingNum = 0&lt;br /&gt;
						for match2 in mw.ustring.gmatch('\n' .. beforeContent, '\n=+[^\n]-=+') do&lt;br /&gt;
							resultMode_closureHeadingNum = resultMode_closureHeadingNum + 1&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						-- проверяем, не пустая ли секция итога&lt;br /&gt;
						emptyClosure = isEmptyClosure(closureContent or sectionContent)&lt;br /&gt;
						if emptyClosure then&lt;br /&gt;
							closureHeading = nil&lt;br /&gt;
							&lt;br /&gt;
							if not returnAsData_onlyStats then&lt;br /&gt;
								sectionContent = &amp;quot;''Похоже, что итога пока нет.''&amp;quot;&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						if not returnAsData_onlyStats then&lt;br /&gt;
							sectionContent = &amp;quot;''Похоже, что итога пока нет.''&amp;quot;&lt;br /&gt;
						else&lt;br /&gt;
							sectionContent = ''&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				-- извлекаем данные:&lt;br /&gt;
				-- о сообщениях&lt;br /&gt;
				if showStatsLine or returnAsData then&lt;br /&gt;
					local iterator2 = mw.ustring.gmatch('\n' .. sectionContent, '\n([^\n]+)((%d%d):(%d%d), (%d%d?) (%w+) (%d%d%d%d)) %(UTC%)') --(%d%d? %w+ %d%d%d%d)&lt;br /&gt;
					local msgCount, authors = 0, {}&lt;br /&gt;
					local lastMsgDate, lastMsgDateString, lastMsgAuthor&lt;br /&gt;
					for precedingText, fullDateString, h, i, d, mesyats, y in iterator2 do&lt;br /&gt;
						msgCount = msgCount + 1&lt;br /&gt;
						h = tonumber(h)&lt;br /&gt;
						i = tonumber(i)&lt;br /&gt;
						d = tonumber(d)&lt;br /&gt;
						y = tonumber(y)&lt;br /&gt;
						local m = 1&lt;br /&gt;
						for k, v in pairs(monthNames) do&lt;br /&gt;
							if v == mesyats then&lt;br /&gt;
								m = k&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						local patterns = {&lt;br /&gt;
							'()%[%[[УуUu]:([^|%]#]+)',&lt;br /&gt;
							'()%[%[[Уу]частни[кц]а?:([^|%]#]+)',&lt;br /&gt;
							'()%[%[[Uu]ser:([^|%]#]+)',&lt;br /&gt;
							'()%[%[[Оо][Уу]:([^|%]#]+)',                    &lt;br /&gt;
							'()%[%[[Оо]бсуждение[ _]участника:([^|%]#]+)',  &lt;br /&gt;
							'()%[%[[Uu]ser[ _]talk:([^|%]#]+)',&lt;br /&gt;
							'()%[%[Special:Contributions/([^|%]#]+)', -- анонимы&lt;br /&gt;
							'()%[%[[^|]+|([^%]]+)%]%]'                -- случаи типа [[w:en:Wikipedia:TWL/Coordinators|The Wikipedia Library Team]]&lt;br /&gt;
						}&lt;br /&gt;
						local lastPos = 0&lt;br /&gt;
						local author&lt;br /&gt;
						for k, v in pairs(patterns) do&lt;br /&gt;
							pos, mention = getLastMatchWith2Captures(precedingText, v)&lt;br /&gt;
							if pos and pos &amp;gt; lastPos then&lt;br /&gt;
								lastPos = pos&lt;br /&gt;
								author = mention&lt;br /&gt;
							end&lt;br /&gt;
							if k == 6 and author then break end -- чтобы «обс» / «вкл» и т. п. из последнего паттерна&lt;br /&gt;
							                                    -- не вытесняли ники&lt;br /&gt;
						end&lt;br /&gt;
						if author then&lt;br /&gt;
							author = mw.text.encode(author)&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						if&lt;br /&gt;
							   not lastMsgDate&lt;br /&gt;
							or (y &amp;gt; lastMsgDate.y)&lt;br /&gt;
							or (y == lastMsgDate.y and m &amp;gt; lastMsgDate.m)&lt;br /&gt;
							or (y == lastMsgDate.y and m == lastMsgDate.m and d &amp;gt; lastMsgDate.d)&lt;br /&gt;
							or (y == lastMsgDate.y and m == lastMsgDate.m and d == lastMsgDate.d and h &amp;gt; lastMsgDate.h)&lt;br /&gt;
							or (y == lastMsgDate.y and m == lastMsgDate.m and d == lastMsgDate.d and h == lastMsgDate.h and i &amp;gt; lastMsgDate.i)&lt;br /&gt;
						then&lt;br /&gt;
							lastMsgDate = {y = y, m = m, d = d, h = h, i = i}&lt;br /&gt;
							lastMsgDateString = fullDateString&lt;br /&gt;
							lastMsgAuthor = author or '?'&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						local found = false&lt;br /&gt;
						for k, v in pairs(authors) do&lt;br /&gt;
							if v == author then&lt;br /&gt;
								found = true&lt;br /&gt;
								break&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						if not found then&lt;br /&gt;
							table.insert(authors, author)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					--local authorsList = table.concat(authors, ', ')&lt;br /&gt;
					if msgCount &amp;gt; 0 then&lt;br /&gt;
						if returnAsData then&lt;br /&gt;
							data.msgCount = msgCount&lt;br /&gt;
							--data.lastMsgDate = lastMsgDate&lt;br /&gt;
							data.lastMsgDateString = lastMsgDateString&lt;br /&gt;
							data.lastMsgDateTimestamp = os.time({year = lastMsgDate.y, month = lastMsgDate.m, day = lastMsgDate.d, hour = lastMsgDate.h, min = lastMsgDate.i})&lt;br /&gt;
							data.lastMsgAuthor = lastMsgAuthor&lt;br /&gt;
							data.lastMsgAnchor = string.format('%.4d%.2d%.2d%.2d%.2d_%s', lastMsgDate.y, lastMsgDate.m, lastMsgDate.d, lastMsgDate.h, lastMsgDate.i, lastMsgAuthor)&lt;br /&gt;
							data.authors = authors&lt;br /&gt;
						end&lt;br /&gt;
						if showStatsLine then&lt;br /&gt;
							sectionContent = '\'\'Последнее сообщение: ' .. lastMsgDateString .. ' от ' .. lastMsgAuthor .. '. Всего ' .. msgCount .. ' {{plural: ' .. msgCount .. '|сообщение|сообщения|сообщений}} от ' .. #authors .. ' {{plural: ' .. #authors .. '|автора|авторов}}.\'\'\n' .. sectionContent&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				-- ...для ярлыков&lt;br /&gt;
				local preclosureHeading, challengedClosureHeading, partialClosureHeading, warningHeading&lt;br /&gt;
				if afdMode then&lt;br /&gt;
					closureHeading = mw.ustring.match(match, '^&amp;lt;s&amp;gt;.*')&lt;br /&gt;
				elseif pageListMode then&lt;br /&gt;
					warningHeading =&lt;br /&gt;
						   mw.ustring.match(match, '^Предупреждение.*')&lt;br /&gt;
						or mw.ustring.match(match, '^Блокировка.*')&lt;br /&gt;
						or mw.ustring.match(match, '^Нарушение авторских прав.*')&lt;br /&gt;
						or mw.ustring.match(match, '^Нарушение АП.*')&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				-- экономим ресурсы и совершаем максимум два действия за один обход регуляркой:&lt;br /&gt;
				-- извлечение данных для ярлыков и формирование заголовков с корректной ссылкой на правку&lt;br /&gt;
				local i = 0&lt;br /&gt;
				local emptyClosure&lt;br /&gt;
				sectionContent = mw.ustring.gsub('\n' .. sectionContent, '\n((=+)([^\n]-)%2)', function (fullMatch2, equalSigns2, match2)&lt;br /&gt;
					i = i + 1&lt;br /&gt;
					match2 = mw.text.trim(match2)&lt;br /&gt;
					&lt;br /&gt;
					if returnAsData and not resultMode and not emptyClosure then&lt;br /&gt;
						if not closureHeading and #equalSigns2 == #equalSigns + 1 then&lt;br /&gt;
							closureHeading =&lt;br /&gt;
								   mw.ustring.match(match2, '^Итог.*')&lt;br /&gt;
								or mw.ustring.match(match2, '^Окончательный итог.*')&lt;br /&gt;
								or mw.ustring.match(match2, '^Автоитог.*')&lt;br /&gt;
								--or mw.ustring.match(match2, '^Автоматический итог.*')&lt;br /&gt;
							&lt;br /&gt;
							if closureHeading then&lt;br /&gt;
								-- проверяем, не пустая ли секция итога&lt;br /&gt;
								local closureContent = mw.ustring.match(sectionContent .. '\n= technical heading =\n', '\n===+[ \t\f\v]*Итог[^\n]-[ \t\f\v]*=+[ \t\f\v]*\n+(.-)\n=+[^\n]-=+[ \t\f\v]*\n')&lt;br /&gt;
								emptyClosure = isEmptyClosure(closureContent);&lt;br /&gt;
								if emptyClosure then&lt;br /&gt;
									closureHeading = nil&lt;br /&gt;
									challengedClosureHeading = nil&lt;br /&gt;
									preclosureHeading = nil&lt;br /&gt;
									partialClosureHeading = nil&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						if not closureHeading then  -- not closureHeading and additionalLabels&lt;br /&gt;
							if afdMode and not partialClosureHeading and #equalSigns2 == #equalSigns + 2 then&lt;br /&gt;
								partialClosureHeading =&lt;br /&gt;
									   mw.ustring.match(match2, '^Итог.*')&lt;br /&gt;
								 	or mw.ustring.match(match2, '^Окончательный итог.*')&lt;br /&gt;
								 	or mw.ustring.match(match2, '^Автоитог.*')&lt;br /&gt;
									or mw.ustring.match(match2, '^Автоматический итог.*')&lt;br /&gt;
							end&lt;br /&gt;
							if not challengedClosureHeading and #equalSigns2 == #equalSigns + 1 then&lt;br /&gt;
								challengedClosureHeading =&lt;br /&gt;
									   mw.ustring.match(match2, '^Оспоренный [иИ]тог.*')&lt;br /&gt;
									or mw.ustring.match(match2, '^Опротестованный [иИ]тог.*')&lt;br /&gt;
								 --or mw.ustring.match(match2, '^Не [иИ]тог.*')&lt;br /&gt;
								if challengedClosureHeading then&lt;br /&gt;
									preclosureHeading = nil&lt;br /&gt;
									partialClosureHeading = nil&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							if not challengedClosureHeading and #equalSigns2 == #equalSigns + 1 then&lt;br /&gt;
								preclosureHeading =&lt;br /&gt;
									   mw.ustring.match(match2, '^Предварительный итог.*')&lt;br /&gt;
									or mw.ustring.match(match2, '^Пред[иы]тог.*')&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						if closureHeading and #equalSigns2 == #equalSigns + 1 then&lt;br /&gt;
							challengedClosureHeading =&lt;br /&gt;
								mw.ustring.match(match2, '^Оспаривание [иИтога]*')&lt;br /&gt;
							if challengedClosureHeading then&lt;br /&gt;
								closureHeading = nil&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					&lt;br /&gt;
					local editLink2&lt;br /&gt;
					if showEditLink then&lt;br /&gt;
						editLink2 = pageTitle:fullUrl('action=edit&amp;amp;section=' ..&lt;br /&gt;
							(talkpageMode and rootSectionID[headingNum] + i or headingNum - 1 + i)&lt;br /&gt;
						  + (not withoutHeading and -1 or 0)&lt;br /&gt;
						  + (resultMode_closureHeadingNum and resultMode_closureHeadingNum or 0)&lt;br /&gt;
						  + (subsectionHeadingNum and subsectionHeadingNum or 0)&lt;br /&gt;
						) -- «- 1», так как, за исключением talkpageMode, мы вставляем искусственную первую секцию&lt;br /&gt;
					end&lt;br /&gt;
					return '\n' .. expandTemplate('fake heading', {&lt;br /&gt;
						['sub'] = #equalSigns2 + level - 2,&lt;br /&gt;
						match2,&lt;br /&gt;
						['real heading'] = showInTOC and additionalEqualSigns .. fullMatch2 .. additionalEqualSigns or '',&lt;br /&gt;
						['edit link'] = showEditLink and editLink2 or '',&lt;br /&gt;
						['in frame'] = (showFrame and (not withoutHeading or standardHeading) and i == 1 and 'x' or '')&lt;br /&gt;
					})&lt;br /&gt;
				end)&lt;br /&gt;
				&lt;br /&gt;
				if returnAsData then&lt;br /&gt;
					data.closureHeading = closureHeading&lt;br /&gt;
					data.preclosureHeading = preclosureHeading&lt;br /&gt;
					data.challengedClosureHeading = challengedClosureHeading&lt;br /&gt;
					data.partialClosureHeading = partialClosureHeading&lt;br /&gt;
					data.warningHeading = warningHeading&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				local thisHeadingLink = sectionHeadingLink and sectionHeadingLink or sectionHeadingToLink(thisHeading)&lt;br /&gt;
				if returnAsData then&lt;br /&gt;
					data.sectionHeadingLink = thisHeadingLink&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				local editLink&lt;br /&gt;
				editLink = pageTitle:fullUrl('action=edit&amp;amp;section=' .. (talkpageMode and rootSectionID[headingNum] or headingNum - 1))&lt;br /&gt;
				if returnAsData then&lt;br /&gt;
					data.sectionEditLink = editLink&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				-- формируем заголовок&lt;br /&gt;
				if not returnAsData_onlyStats and standardHeading then&lt;br /&gt;
					if talkpageMode then&lt;br /&gt;
						if shortHeadings then&lt;br /&gt;
							standardSectionHeading = '[[' .. pageTitleText .. thisHeadingLink .. '|' .. thisHeading .. ']]'&lt;br /&gt;
						else&lt;br /&gt;
							standardSectionHeading = '[[' .. pageTitleText .. thisHeadingLink .. '|' .. thisHeading .. ']] &amp;lt;span style=&amp;quot;font-size:80%;&amp;quot;&amp;gt;← ' .. pageTitleText .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
						end&lt;br /&gt;
					elseif afdMode then&lt;br /&gt;
						standardSectionHeading = match .. ' &amp;lt;span style=&amp;quot;font-size:80%;&amp;quot;&amp;gt;← [[' .. pageTitleText .. thisHeadingLink .. '|' .. pageTitleText .. ']]&amp;lt;/span&amp;gt;'&lt;br /&gt;
					end&lt;br /&gt;
					&lt;br /&gt;
					sectionContent = expandTemplate('fake heading', {&lt;br /&gt;
						['sub'] = 2 + level - 2,&lt;br /&gt;
						standardSectionHeading,&lt;br /&gt;
						['real heading'] = showInTOC and additionalEqualSigns .. '== ' .. standardSectionHeading .. ' ==' .. additionalEqualSigns or '',&lt;br /&gt;
						['edit link'] = showEditLink and editLink or ''&lt;br /&gt;
					}) .. '\n' .. sectionContent&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				sectionContent = trim(sectionContent)&lt;br /&gt;
				&lt;br /&gt;
				if talkpageMode then&lt;br /&gt;
					data.sectionHeading = thisHeading&lt;br /&gt;
					if not returnAsData_onlyStats then&lt;br /&gt;
						data.sectionContent = sectionContent&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if talkpageMode and data.sectionHeading then&lt;br /&gt;
				table.insert(allData, data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if not talkpageMode and (returnAsData or not returnAsData_onlyStats) then&lt;br /&gt;
			if sectionContent == '' then&lt;br /&gt;
				if subsectionHeading then&lt;br /&gt;
					local sectionNotExistMessage = 'На странице [[' .. pageTitleText .. ']] в разделе «' .. sectionHeading .. '» не найден подраздел «' .. subsectionHeading .. '». Возможно, тема была заархивирована.'&lt;br /&gt;
					if returnAsData then&lt;br /&gt;
						data.sectionNotExistMessage = sectionNotExistMessage&lt;br /&gt;
					end&lt;br /&gt;
					if not returnAsData_onlyStats then&lt;br /&gt;
						sectionContent = '== ' .. standardSectionHeading .. &amp;quot; ==\n''&amp;quot; .. sectionNotExistMessage .. &amp;quot;''&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				elseif not returnAsData_onlyStats then&lt;br /&gt;
					sectionContent = '== ' .. standardSectionHeading .. &amp;quot; ==\n''&amp;lt;span class=\&amp;quot;error\&amp;quot;&amp;gt;Не удалось получить содержимое раздела «' .. sectionHeading .. '» на странице [[' .. pageTitleText .. ']] (хотя он был найден).&amp;lt;/span&amp;gt;''&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not sectionContent then&lt;br /&gt;
				local sectionNotExistMessage = 'На странице [[' .. pageTitleText .. ']] не найден раздел «' .. sectionHeading .. '».'&lt;br /&gt;
				if not (&lt;br /&gt;
					   mw.ustring.find(pageTitleText, '^Википедия:К удалению/')&lt;br /&gt;
					or mw.ustring.find(pageTitleText, '^Википедия:К восстановлению/')&lt;br /&gt;
					or mw.ustring.find(pageTitleText, '^Википедия:К переименованию/')&lt;br /&gt;
					or mw.ustring.find(pageTitleText, '^Википедия:К объединению/')&lt;br /&gt;
					or mw.ustring.find(pageTitleText, '^Википедия:К разделению/')&lt;br /&gt;
					or mw.ustring.find(pageTitleText, '^Википедия:К улучшению/')&lt;br /&gt;
				) then&lt;br /&gt;
					sectionNotExistMessage = sectionNotExistMessage .. ' Возможно, он был заархивирован.'&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				if returnAsData then&lt;br /&gt;
					data.sectionNotExistMessage = sectionNotExistMessage&lt;br /&gt;
				end&lt;br /&gt;
				if not returnAsData_onlyStats then&lt;br /&gt;
					sectionContent = (standardHeading and '== ' .. standardSectionHeading .. ' ==\n' or '') .. &amp;quot;''&amp;quot; .. sectionNotExistMessage .. &amp;quot;''&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		local pageNotExistMessage = 'Страницы [[' .. pageTitleText .. ']] не существует.'&lt;br /&gt;
		if not talkpageMode and not returnAsData_onlyStats then&lt;br /&gt;
			sectionContent = (standardHeading and '== ' .. standardSectionHeading .. ' ==\n' or '') .. &amp;quot;''&amp;quot; .. pageNotExistMessage .. &amp;quot;''&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		if returnAsData then&lt;br /&gt;
			if talkpageMode then&lt;br /&gt;
				allData.pageNotExistMessage = pageNotExistMessage&lt;br /&gt;
			else&lt;br /&gt;
				data.pageNotExistMessage = pageNotExistMessage&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if returnAsData then&lt;br /&gt;
		if talkpageMode then&lt;br /&gt;
			return allData&lt;br /&gt;
		else&lt;br /&gt;
			if not returnAsData_onlyStats then&lt;br /&gt;
				data.sectionContent = sectionContent&lt;br /&gt;
			end&lt;br /&gt;
			return data&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if collapsed then&lt;br /&gt;
			sectionContent =&lt;br /&gt;
			   	   '&amp;lt;blockquote style=&amp;quot;margin:0; padding:0; background:transparent; overflow:visible; font-weight:bold; text-align:center; margin:0 5em;&amp;quot;&amp;gt;Содержимое раздела «[[' .. pageTitleText .. sectionHeadingLink .. '|' .. sectionHeading .. ']]» на странице «' .. pageTitleText .. '»&amp;lt;/div&amp;gt;'&lt;br /&gt;
			   	.. '&amp;lt;table class=&amp;quot;collapsible collapsed&amp;quot; style=&amp;quot;width:100%; margin-top:-22.4px; border-collapse:collapse;&amp;quot;&amp;gt;'&lt;br /&gt;
			   	.. '&amp;lt;tr&amp;gt;'&lt;br /&gt;
				.. '&amp;lt;th style=&amp;quot;padding:0;&amp;quot;&amp;gt;&amp;lt;/th&amp;gt;'&lt;br /&gt;
				.. '&amp;lt;/tr&amp;gt;'&lt;br /&gt;
				.. '&amp;lt;tr&amp;gt;'&lt;br /&gt;
				.. '&amp;lt;td style=&amp;quot;padding:0; padding-top:1em;&amp;quot;&amp;gt;'&lt;br /&gt;
				.. '&amp;lt;div style=&amp;quot;border-left:2px solid #a2a9b1; padding-left:0.75em;&amp;quot;&amp;gt;' .. sectionContent .. '&amp;lt;/div&amp;gt;'&lt;br /&gt;
				.. '&amp;lt;/td&amp;gt;'&lt;br /&gt;
				.. '&amp;lt;/tr&amp;gt;'&lt;br /&gt;
				.. '&amp;lt;/table&amp;gt;'&lt;br /&gt;
		elseif showFrame then&lt;br /&gt;
			sectionContent =&lt;br /&gt;
			      '\'\'Ниже приведено содержимое раздела «[[' .. pageTitleText .. sectionHeadingLink .. '|' .. sectionHeading .. ']]» на странице «' .. pageTitleText .. '»:\'\''&lt;br /&gt;
			   .. '&amp;lt;blockquote style=&amp;quot;margin:0; padding:0; background:transparent; overflow:visible; border-left:2px solid #a2a9b1; padding-left:0.75em;&amp;quot;&amp;gt;' .. sectionContent .. '&amp;lt;/div&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
		return sectionContent&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._parse_section_content(args)&lt;br /&gt;
	if not args[1] then return '' end&lt;br /&gt;
	if type(args[1]) ~= 'table' and args[1]:find('#') then&lt;br /&gt;
		pageTitle, sectionHeading = args[1]:match('(.-)#(.+)')&lt;br /&gt;
		if pageTitle then&lt;br /&gt;
			pageTitle = mw.title.new(pageTitle)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		pageTitle = type(args[1]) == 'table' and args[1] or mw.title.new(args[1])&lt;br /&gt;
		sectionHeading = args[2]&lt;br /&gt;
	end&lt;br /&gt;
	if pageTitle then&lt;br /&gt;
		pageTitle.fragment = ''&lt;br /&gt;
		pageTitleText = pageTitle.prefixedText&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not pageTitle or not sectionHeading then return '' end&lt;br /&gt;
	&lt;br /&gt;
	return parsePage(args, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._parse_talkpage_content(args)&lt;br /&gt;
	pageTitle = type(args[1]) == 'table' and args[1] or mw.title.new(args[1])&lt;br /&gt;
	if pageTitle then&lt;br /&gt;
		pageTitle.fragment = ''&lt;br /&gt;
		pageTitleText = pageTitle.prefixedText&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not pageTitle then return '' end&lt;br /&gt;
	&lt;br /&gt;
	return parsePage(args, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.parse_section_content(frame)&lt;br /&gt;
	_frame = frame&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return killHeadingMarkers(frame:preprocess(p._parse_section_content(args)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[function p.parse_talkpage_content(frame)&lt;br /&gt;
	_frame = frame&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return killHeadingMarkers(frame:preprocess(p._parse_talkpage_content(args)))&lt;br /&gt;
end]]&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Dzmuh</name></author>
	</entry>
</feed>