ФЭНДОМ


local p = {}
 
-- используется для того, чтобы можно было удалять элементы из таблицы
local function copy(other)
	local res = {}
	for k,v in pairs(other) do
		res[k] = v
	end
	return res
end
 
-- вызов шаблона, при ошибке возвращает пустую строку
local function expand(frame, tname, targs)
	local success, result = pcall(
		frame.expandTemplate,
		frame,
		{title = tname, args = targs}
	)
	if success then
		return result
	else
		return ''
	end
	--return frame:expandTemplate({title = tname, args = args})
end
 
--предотвращает обработку вики-текста в отображении образца
local function nowiki(str)
	local res = str
	str = mw.text.unstripNoWiki(str)
	str = string.gsub(str, '%[', '[')
	str = string.gsub(str, '%]', ']')
	str = string.gsub(str, '<', '&lt;')
	str = string.gsub(str, '>', '&gt;')
	str = string.gsub(str, '{', '&#123;')
	str = string.gsub(str, '}', '&#125;')
	str = string.gsub(str, '\'', '&#39;')
	str = string.gsub(str, '"', '&quot;')
	str = string.gsub(str, '(https?://)', '<span>%1</span>')
	return str
end
 
--удаляет из параметров вписанные через HTML-сущности "<nowiki>" и заменяет "{{=}}" на "=" для вызова шаблона
local function process_nowiki_equals(str)
	str = str:gsub('&lt;nowiki>', ''):gsub('&lt;/nowiki>', '')
			 :gsub('&lt;nowiki&gt;', ''):gsub('&lt;/nowiki&gt;', '')
			 :gsub('&#123;&#123;&#61;&#125;&#125;', '=')
			 :gsub('&#123;{&#61;}&#125;', '=')
			 :gsub('{&#123;&#61;&#125;}', '=')
			 :gsub('{{=}}', '=')
			 :gsub('&amp;', '&')
	return str
end
 
 
function p.main(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	local yesno = require('Module:Yesno')
	local args = copy(getArgs(frame, {trim = false, removeBlanks = false})) --copy(frame.args)
	local tag = args._tag or 'code'
	local container = args._container or nil
	local sep =  args._sep and args._sep .. ' ' or '&rarr; ' -- по умолчанию "→"
	local link = yesno(args._link, false)
	local endl = args._endl or ''
	local prefix = args._prefix or args['_pre-text'] or ''
	local postfix = args._postfix or args['_post-text'] or ''
	local nobr = yesno(args._nobr, false)
	local spaced = yesno(args._spaced, false)
	local nocat = yesno(args._nocat, false)
	local style = args._style
 
	-- передаётся шаблоном {{стопка примеров}}, один разделитель на все примеры
	local comment_sep = args._comment_sep or ' &nbsp;'
 
	-- полезно в шаблоне {{стопка примеров}} (это просто текст в конце)
	local after = args._after or args._comment or ''
 
	-- полезно в шаблоне {{стопка примеров}} (это просто текст в начале)
	local before = args._before and args._before .. ' ' or ''
 
	if style == 'pre' then
		tag = nil
		container = 'pre'
		sep = '\n'
	elseif style == '*pre' then
		tag = nil
		container = '*pre'
		sep = '\n'
	elseif style == 'pre↓' then
		tag = nil
		container = 'pre'
		sep = '<div style="margin:-0.5em 50% 0.7em;"><span style="font-size:150%;">↓</span></div>\n' --содержимое шаблона {{sp↓|50%||-0.5em}}
	elseif style == '*pre↓' then
		tag = nil
		container = '*pre'
		sep = '<div style="margin:-0.5em 50% 0.7em;"><span style="font-size:150%;">↓</span></div>\n' --содержимое шаблона {{sp↓|50%||-0.5em}}
	elseif style == 'wikitable' then
		tag = 'tt'
		sep = '\n|'
		comment_sep = '\n|'
	end
 
	if (after ~= '') then
		after = comment_sep .. after
	end
 
	local nwt
	if tag then
		nwt = mw.html.create(tag):tag(tag) --"no-wiki tag", внутри него шаблон не вызывается
		if nobr then
			nwt:css('white-space', 'nowrap')
		end
	end
	local content = nowiki(prefix) .. '{{' --для накопления содержимого тэга
 
	local tname = args._template or args[1]
	if tname == nil then --если имя шаблона содержит знак "=" (работает, только если нет неименованных параметров)
		local nextfunc, static, cur = pairs(args)
		local k, v = nextfunc(static, cur)
		if k ~= nil and type(k) ~= 'number' and not k:find('^_') then --именованные параметры, исключая модификаторы внешнего вида
			tname = k .. "=" .. v
			args[k] = nil --больше этот параметр нам не пригодится
		end
	end
	if tname == '' or tname == nil then --при опущенном первом параметре берём имя шаблона из названия страницы
		tname = mw.language.new('ru'):lcfirst(mw.title.getCurrentTitle().rootText)
	end
	if args._template == nil then --имя вызываемого шаблона в неименованном первом параметре (или же взято из названия страницы или
		                          --из именованного параметра в отсутствие неименованных — в следующей строчке вреда нет в любом случае),
		                          --больше его обрабатывать не надо
		table.remove(args,1)
	end
	if link then
		content = content .. '[[Шаблон:' .. tname .. '|' .. tname .. ']]'
	else
		content = content .. tname
	end
	content = content .. endl
 
	local targs, equals_pos, param, value, left_shift = {}, 0, '', '', 0
	for k, v in pairs(args) do
		if type(k) == 'number' then --неименованные параметры
			equals_pos = v:find('=')
			if equals_pos and v:find('{{=}}') == equals_pos-2 then
				equals_pos = nil
			end
			if equals_pos then --содержащие "=" преобразуем в именованные
				param = v:sub(1, equals_pos-1)
				value = v:sub(equals_pos+1)
				targs[param] = process_nowiki_equals(value)
				content = content .. (spaced and ' ' or '') .. '&#124;' .. nowiki(param) .. '=' .. nowiki(value) .. endl
				left_shift = left_shift+1 --переменная нужна, чтобы квазинумерованные параметры, переданные через "{{=}}",
				                          --не сбивали порядок
			else --истинно неименованные
				targs[k - left_shift] = process_nowiki_equals(v)
				content = content .. (spaced and ' ' or '') .. '&#124;' .. nowiki(v) .. endl
			end
		elseif not k:find('^_') then --именованные параметры, исключая модификаторы внешнего вида
			targs[k] = process_nowiki_equals(v)
			content = content .. (spaced and ' ' or '') .. '&#124;' .. nowiki(k) .. '=' .. nowiki(v) .. endl
		end
	end
	content = content .. '}}' .. nowiki(postfix)
	if container then
		local container_args = {}
		container_args[1] = content
		nwt = expand(frame, container, container_args)
	else
		nwt:wikitext(content):done()
	end
 
	if nocat then
		targs['nocat'] = 1
	end
 
	expand_result = tostring(expand(frame, tname, targs))
	if expand_result:sub(1, 2) == '{|' then
		sep = sep .. '\n'
	end
 
	return before .. tostring(nwt) .. ' ' .. sep .. prefix .. expand_result .. postfix .. after
end
 
return p

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на ФЭНДОМЕ

Случайная вики