<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://station14.ru/history/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Transclude?feed=atom</id>
	<title>Модуль:Transclude - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://station14.ru/history/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Transclude?feed=atom"/>
	<link rel="alternate" type="text/html" href="https://station14.ru/history/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Transclude"/>
	<updated>2026-04-05T23:03:17Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://station14.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Transclude&amp;diff=108258&amp;oldid=prev</id>
		<title>Pok: Защитил страницу Модуль:Transclude ([Редактирование=Разрешено только инженерам] (бессрочно) [Переименование=Разрешено только инженерам] (бессрочно))</title>
		<link rel="alternate" type="text/html" href="https://station14.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Transclude&amp;diff=108258&amp;oldid=prev"/>
		<updated>2025-10-27T14:55:32Z</updated>

		<summary type="html">&lt;p&gt;Защитил страницу &lt;a href=&quot;/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Transclude&quot; title=&quot;Модуль:Transclude&quot;&gt;Модуль:Transclude&lt;/a&gt; ([Редактирование=Разрешено только инженерам] (бессрочно) [Переименование=Разрешено только инженерам] (бессрочно))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 17:55, 27 октября 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key ss14_wiki:diff:1.41:old-76902:rev-108258 --&gt;
&lt;/table&gt;</summary>
		<author><name>Pok</name></author>
	</entry>
	<entry>
		<id>https://station14.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Transclude&amp;diff=76902&amp;oldid=prev</id>
		<title>Pok: Новая страница: «-- source: https://ru.wikipedia.org/wiki/Модуль:Transclude -- license: CC BY-SA 4.0   local p={}  -- Вызывает внутренний шаблон с аргументами объемлющего шаблона function p.call(frame) 	local template = frame.args[1] 	local args = frame:getParent().args     return frame:expandTemplate{ title=template, args=args } end  -- Общая реализация для forall и call local function forallImpl...»</title>
		<link rel="alternate" type="text/html" href="https://station14.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Transclude&amp;diff=76902&amp;oldid=prev"/>
		<updated>2025-04-04T23:08:26Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «-- source: https://ru.wikipedia.org/wiki/Модуль:Transclude -- license: CC BY-SA 4.0   local p={}  -- Вызывает внутренний шаблон с аргументами объемлющего шаблона function p.call(frame) 	local template = frame.args[1] 	local args = frame:getParent().args     return frame:expandTemplate{ title=template, args=args } end  -- Общая реализация для forall и call local function forallImpl...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- source: https://ru.wikipedia.org/wiki/Модуль:Transclude&lt;br /&gt;
-- license: CC BY-SA 4.0 &lt;br /&gt;
&lt;br /&gt;
local p={}&lt;br /&gt;
&lt;br /&gt;
-- Вызывает внутренний шаблон с аргументами объемлющего шаблона&lt;br /&gt;
function p.call(frame)&lt;br /&gt;
	local template = frame.args[1]&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
    return frame:expandTemplate{ title=template, args=args }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Общая реализация для forall и call&lt;br /&gt;
local function forallImpl(args, separator, conjunction, func)&lt;br /&gt;
	-- нумерованные ключи из args&lt;br /&gt;
	local keys = {}&lt;br /&gt;
	-- перебор в произвольном порядке, даже для нумерованных ключей&lt;br /&gt;
	for key, value in pairs(args) do&lt;br /&gt;
		if type(key) == &amp;#039;number&amp;#039; and value and value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			table.insert(keys, key)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(keys)&lt;br /&gt;
	&lt;br /&gt;
	local results = {}&lt;br /&gt;
	for _, key in ipairs(keys) do&lt;br /&gt;
		local value = func(args[key])&lt;br /&gt;
		table.insert(results, value)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return mw.text.listToText(results, separator, conjunction)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Вызывает внутренний шаблон, передавая ему нумерованные параметры объемлющего шаблона по-одному&lt;br /&gt;
function p.forall(frame)&lt;br /&gt;
	local template = frame.args[1]&lt;br /&gt;
	local separator = frame.args.separator or &amp;#039;&amp;#039;&lt;br /&gt;
	local conjunction = frame.args.conjunction or separator&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local func = function(value)&lt;br /&gt;
		return frame:expandTemplate{ title = template, args = {value} } -- или другой frame?&lt;br /&gt;
	end&lt;br /&gt;
	return forallImpl(args, separator, conjunction, func)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Берёт нумерованные аргументы объемлющего шаблона и склеивает их в единую строку&lt;br /&gt;
function p.join(frame)&lt;br /&gt;
	local separator = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local conjunction = frame.args[2] or separator&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local func = function(value)&lt;br /&gt;
		return value&lt;br /&gt;
	end&lt;br /&gt;
	return forallImpl(args, separator, conjunction, func)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Служебная функция: удаляет дубликаты из отсортированного массива с нумерованными индексами&lt;br /&gt;
local function deleteDuplicates(args)&lt;br /&gt;
	local res = {}&lt;br /&gt;
	for key, value in pairs(args) do&lt;br /&gt;
		if args[key+1] ~= value then&lt;br /&gt;
			table.insert(res, value)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Вызывает внутренний шаблон несколько раз, передавая в него блоки аргументов объемлющего шаблона&lt;br /&gt;
function p.npc(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local templateFrame = frame:getParent()&lt;br /&gt;
	local template = frame.args[1]&lt;br /&gt;
	&lt;br /&gt;
	-- определение, блоки аргументов с какими номерами нужны:&lt;br /&gt;
	-- если в объемлющем шаблоне есть &amp;quot;параметр12&amp;quot; и в вызове модуля есть &amp;quot;параметр&amp;quot;, то вызывается 12-й блок&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for key, _ in pairs(args) do&lt;br /&gt;
		local main, num = string.match(key, &amp;#039;^(.-)%s*(%d*)$&amp;#039;)&lt;br /&gt;
		num = tonumber(num)&lt;br /&gt;
		-- учитывать &amp;quot;параметр12&amp;quot;, только если задано &amp;quot;параметр&amp;quot;&lt;br /&gt;
		if num and frame.args[main] then&lt;br /&gt;
			table.insert(nums, num)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	nums = deleteDuplicates(nums)&lt;br /&gt;
	&lt;br /&gt;
	-- проходить по нужным номерам блоков по возрастанию и однократно&lt;br /&gt;
	-- подставлять в шаблон:&lt;br /&gt;
	-- 1. общие аргументы данного модуля&lt;br /&gt;
	-- 2. аргументы объемлющего шаблона вида &amp;quot;параметр12&amp;quot; как &amp;quot;параметр&amp;quot; в 12-й блок&lt;br /&gt;
	local results = {}&lt;br /&gt;
	for _, blockNum in ipairs(nums) do&lt;br /&gt;
		-- общие аргументы модуля, которые передаются в каждый блок&lt;br /&gt;
		local blockArgs = mw.clone(frame.args)&lt;br /&gt;
		 -- metatable ломает expandTemplate&lt;br /&gt;
		setmetatable(blockArgs, nil)&lt;br /&gt;
		&lt;br /&gt;
		for key, value in pairs(args) do&lt;br /&gt;
			local main, num = string.match(key, &amp;#039;^(.-)%s*(%d*)$&amp;#039;)&lt;br /&gt;
			num = tonumber(num)&lt;br /&gt;
			-- передавать &amp;quot;параметр12&amp;quot; как &amp;quot;параметр&amp;quot; в 12-й блок, только если есть &amp;quot;параметр&amp;quot; в вызове модуля&lt;br /&gt;
			if blockNum == num and frame.args[main] then&lt;br /&gt;
				blockArgs[main] = value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local blockText = templateFrame:expandTemplate{ title=template; args=blockArgs }&lt;br /&gt;
		table.insert(results, blockText)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
    return table.concat(results)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Действует аналогично forall по числовой переменной, изменяющейся (по умолчанию, от 1) до f.args[2].&lt;br /&gt;
function p.cycle(f)&lt;br /&gt;
    local tf,ac,op=f:getParent(), {}, f.args.output or &amp;#039;inline&amp;#039;;&lt;br /&gt;
    local sep=&amp;#039;&amp;#039;;&lt;br /&gt;
    if op == &amp;#039;newline&amp;#039; then&lt;br /&gt;
    	sep=&amp;#039;\n&amp;#039;;&lt;br /&gt;
    end&lt;br /&gt;
    for p,k in pairs(f.args) do&lt;br /&gt;
        if type(p)==&amp;#039;number&amp;#039; then&lt;br /&gt;
            if p&amp;gt;2 then ac[p-1]=k end&lt;br /&gt;
        else ac[p]=k&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local s,fh = f.args[2]:match(&amp;#039;^%s*(%-?%d+)%s*%.%.&amp;#039;) or 1,&lt;br /&gt;
        f.args[2]:match(&amp;#039;%.%.%s*(%S.*)%s*$&amp;#039;) or f.args[2] or &amp;#039;&amp;#039;;&lt;br /&gt;
    fh=tonumber(fh) or fh:match(&amp;#039;^%s*(.-)%s*$&amp;#039;);&lt;br /&gt;
	s=tonumber(s);&lt;br /&gt;
    local acr={};&lt;br /&gt;
    if not s then error(&amp;#039;Начало цикла «&amp;#039;..s..&amp;#039;» — не число&amp;#039;) end&lt;br /&gt;
    local function dc(order)&lt;br /&gt;
        local r=tf:expandTemplate{ title=f.args[1]; args={s,unpack(ac)} }&lt;br /&gt;
        if order == &amp;#039;desc&amp;#039; then&lt;br /&gt;
        	s=s-1;&lt;br /&gt;
        else&lt;br /&gt;
        	s=s+1;&lt;br /&gt;
    	end&lt;br /&gt;
        if r~=&amp;#039;&amp;#039; then table.insert(acr,r); return r end&lt;br /&gt;
    end&lt;br /&gt;
    if type(fh)==&amp;#039;number&amp;#039; then&lt;br /&gt;
    	if fh &amp;gt; s then&lt;br /&gt;
        	while s&amp;lt;=fh do dc(&amp;#039;asc&amp;#039;) end&lt;br /&gt;
    	else&lt;br /&gt;
        	while s&amp;gt;=fh do dc(&amp;#039;desc&amp;#039;) end&lt;br /&gt;
    	end&lt;br /&gt;
    elseif fh~=&amp;#039;&amp;#039; then&lt;br /&gt;
        while tf:expandTemplate{ title=fh; args={s,unpack(ac)} } do dc(&amp;#039;asc&amp;#039;) end&lt;br /&gt;
    else&lt;br /&gt;
        while dc(&amp;#039;asc&amp;#039;) do end&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat(acr, sep)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Pok</name></author>
	</entry>
</feed>