<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.lemoncraft.su/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3A%D0%9A%D1%80%D0%B0%D1%84%D1%82</id>
	<title>Модуль:Крафт - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.lemoncraft.su/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3A%D0%9A%D1%80%D0%B0%D1%84%D1%82"/>
	<link rel="alternate" type="text/html" href="https://wiki.lemoncraft.su/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%9A%D1%80%D0%B0%D1%84%D1%82&amp;action=history"/>
	<updated>2026-05-31T20:40:12Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.lemoncraft.su/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%9A%D1%80%D0%B0%D1%84%D1%82&amp;diff=170&amp;oldid=prev</id>
		<title>Spark108: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="https://wiki.lemoncraft.su/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%9A%D1%80%D0%B0%D1%84%D1%82&amp;diff=170&amp;oldid=prev"/>
		<updated>2025-03-26T10:40:31Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 10:40, 26 марта 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&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;/table&gt;</summary>
		<author><name>Spark108</name></author>
	</entry>
	<entry>
		<id>https://wiki.lemoncraft.su/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%9A%D1%80%D0%B0%D1%84%D1%82&amp;diff=69&amp;oldid=prev</id>
		<title>Spark108: Новая страница: «---------------------------------------------------------------------------------- --- Модуль для создания таблиц с рецептами для крафта. --- ВНИМАНИЕ: Изменения на этом модуле отразятся на большом количестве статей! ----------------------------------------------------------------------------------  local p = {}  --- Интернационализация...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.lemoncraft.su/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%9A%D1%80%D0%B0%D1%84%D1%82&amp;diff=69&amp;oldid=prev"/>
		<updated>2025-03-25T16:35:55Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «---------------------------------------------------------------------------------- --- Модуль для создания таблиц с рецептами для крафта. --- ВНИМАНИЕ: Изменения на этом модуле отразятся на большом количестве статей! ----------------------------------------------------------------------------------  local p = {}  --- Интернационализация...»&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 16:35, 25 марта 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&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;/table&gt;</summary>
		<author><name>Spark108</name></author>
	</entry>
	<entry>
		<id>https://wiki.lemoncraft.su/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%9A%D1%80%D0%B0%D1%84%D1%82&amp;diff=169&amp;oldid=prev</id>
		<title>minecraftwiki&gt;MakandIv в 17:25, 31 декабря 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.lemoncraft.su/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%9A%D1%80%D0%B0%D1%84%D1%82&amp;diff=169&amp;oldid=prev"/>
		<updated>2024-12-31T17:25:46Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;----------------------------------------------------------------------------------&lt;br /&gt;
--- Модуль для создания таблиц с рецептами для крафта.&lt;br /&gt;
--- ВНИМАНИЕ: Изменения на этом модуле отразятся на большом количестве статей!&lt;br /&gt;
----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--- Интернационализация и локализация&lt;br /&gt;
local i18n = {&lt;br /&gt;
	-- Зависимости&lt;br /&gt;
	moduleArgs = [[Модуль:ProcessArgs]],&lt;br /&gt;
	moduleSlot = [[Модуль:Инвентарный слот]],&lt;br /&gt;
	moduleRecipe = [[Модуль:Таблица рецептов]],&lt;br /&gt;
	jsonMergeRules = [[Модуль:Крафт/Правила группировки.json]],&lt;br /&gt;
	&lt;br /&gt;
	-- Параметры процесса&lt;br /&gt;
	type = &amp;quot;крафт&amp;quot;,&lt;br /&gt;
	typeGenitive = &amp;quot;крафта&amp;quot;,&lt;br /&gt;
	&lt;br /&gt;
	-- Форматы категорий&lt;br /&gt;
	categoryRecipeType = &amp;quot;[[Категория:Рецепты/$1]]&amp;quot;,&lt;br /&gt;
	&lt;br /&gt;
	-- В оригинале название следующей категории имеет формат «Recipe using&lt;br /&gt;
	-- &amp;lt;предмет&amp;gt;». Прямо переводится эта конструкция как «Рецепт, использующий&lt;br /&gt;
	-- &amp;lt;предмет&amp;gt;». При этом название предмета должно было быть в винительном&lt;br /&gt;
	-- падеже, но на данный момент быстро склонять название предметов  в имени-&lt;br /&gt;
	-- тельном падеже с помощью модулей не представляется возможным. Поэтому в&lt;br /&gt;
	-- качестве перевода используется близкая по смыслу конструкция, не тре-&lt;br /&gt;
	-- бующая склонения.&lt;br /&gt;
	categoryIngredientUsage = &amp;quot;[[Категория:$1 как ингредиент для крафта]]&amp;quot;,&lt;br /&gt;
	&lt;br /&gt;
	-- В отличие от англоязычной версии модуля, преобразования для категорий&lt;br /&gt;
	-- выведены в отдельную функцию. Здесь соответствующие строки не указываются&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--- Внутренние глобальные данные модуля&lt;br /&gt;
local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
-- Зависимости&lt;br /&gt;
local slot = require(i18n.moduleSlot)&lt;br /&gt;
local recipeTable = require(i18n.moduleRecipe).table&lt;br /&gt;
&lt;br /&gt;
-- Аргументы, задающие ячейки&lt;br /&gt;
local cArgVals = {&amp;#039;A1&amp;#039;, &amp;#039;B1&amp;#039;, &amp;#039;C1&amp;#039;, &amp;#039;A2&amp;#039;, &amp;#039;B2&amp;#039;, &amp;#039;C2&amp;#039;, &amp;#039;A3&amp;#039;, &amp;#039;B3&amp;#039;, &amp;#039;C3&amp;#039;}&lt;br /&gt;
p.cArgVals = cArgVals&lt;br /&gt;
&lt;br /&gt;
--- Служебные функции&lt;br /&gt;
&lt;br /&gt;
-- Автоматически раскладывает бесформенный рецепт, определяемый нумерованными&lt;br /&gt;
-- параметрами&lt;br /&gt;
local function arrangeShapelessRecipe(args)&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		args[&amp;quot;бесформенный&amp;quot;] = 1&lt;br /&gt;
		if args[7] then&lt;br /&gt;
			args.A1 = args[1]&lt;br /&gt;
			args.B1 = args[2]&lt;br /&gt;
			args.C1 = args[3]&lt;br /&gt;
			args.A2 = args[4]&lt;br /&gt;
			args.B2 = args[5]&lt;br /&gt;
			args.C2 = args[6]&lt;br /&gt;
			if args[8] then&lt;br /&gt;
				-- ◼◼◼       ◼◼◼&lt;br /&gt;
				-- ◼◼◼  или  ◼◼◼&lt;br /&gt;
				-- ◼◼◼       ◼◼◻&lt;br /&gt;
				args.A3 = args[7]&lt;br /&gt;
				args.B3 = args[8]&lt;br /&gt;
				args.C3 = args[9]&lt;br /&gt;
				if args[9] then&lt;br /&gt;
					-- Если все слоты равны, то рецепт явно не бесформенный&lt;br /&gt;
					local identical = true&lt;br /&gt;
					for i = 1, 8 do&lt;br /&gt;
						if args[i] ~= args[i + 1] then&lt;br /&gt;
							identical = false&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if identical then&lt;br /&gt;
						args[&amp;quot;бесформенный&amp;quot;] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				-- ◼◼◼&lt;br /&gt;
				-- ◼◼◼&lt;br /&gt;
				-- ◻◼◻&lt;br /&gt;
				args.B3 = args[7]&lt;br /&gt;
			end&lt;br /&gt;
		elseif args[2] then&lt;br /&gt;
			args.A2 = args[1]&lt;br /&gt;
			args.B2 = args[2]&lt;br /&gt;
			if args[5] then&lt;br /&gt;
				-- ◻◻◻       ◻◻◻&lt;br /&gt;
				-- ◼◼◼  или  ◼◼◼&lt;br /&gt;
				-- ◼◼◼       ◼◼◻&lt;br /&gt;
				args.C2 = args[3]&lt;br /&gt;
				args.A3 = args[4]&lt;br /&gt;
				args.B3 = args[5]&lt;br /&gt;
				args.C3 = args[6]&lt;br /&gt;
			elseif args[4] then&lt;br /&gt;
				-- ◻◻◻&lt;br /&gt;
				-- ◼◼◻&lt;br /&gt;
				-- ◼◼◻&lt;br /&gt;
				args.A3 = args[3]&lt;br /&gt;
				args.B3 = args[4]&lt;br /&gt;
			else&lt;br /&gt;
				-- ◻◻◻       ◻◻◻&lt;br /&gt;
				-- ◼◼◻  или  ◼◼◻&lt;br /&gt;
				-- ◻◼◻       ◻◻◻&lt;br /&gt;
				args.B3 = args[3]&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- ◻◻◻&lt;br /&gt;
			-- ◻◼◻&lt;br /&gt;
			-- ◻◻◻&lt;br /&gt;
			-- Рецепт из одного ингредиента по определению не может быть&lt;br /&gt;
			-- бесформенным&lt;br /&gt;
			args.B2 = args[1]&lt;br /&gt;
			args[&amp;quot;бесформенный&amp;quot;] = nil&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		for i = 1, 9 do&lt;br /&gt;
			args[i] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Следующая функция добавляет категории использования. Именно с их помощью&lt;br /&gt;
-- работает модуль «Использование для крафта».&lt;br /&gt;
-- Некоторые варианты ингредиентов описываются на общей статье, некоторые -&lt;br /&gt;
-- на раздельных. За разрешение таких случаев отвечает специальный JSON-файл.&lt;br /&gt;
-- Обязательно вносите или запрашивайте изменения туда в случае слияния&lt;br /&gt;
-- или разбиения статей!&lt;br /&gt;
local mergeRules = mw.loadJsonData(i18n.jsonMergeRules)&lt;br /&gt;
local prefixesMatch = slot.i18n.prefixesMatch&lt;br /&gt;
&lt;br /&gt;
local function addUsageCategories(ingredientSets, categories)&lt;br /&gt;
	-- Уже обработанные ингредиенты на всякий случай кэшируются&lt;br /&gt;
	local usedNames = {}&lt;br /&gt;
	local function addName(name)&lt;br /&gt;
		if not usedNames[name] then&lt;br /&gt;
			local cat = i18n.categoryIngredientUsage:gsub(&amp;quot;%$1&amp;quot;, name)&lt;br /&gt;
			table.insert(categories, cat)&lt;br /&gt;
			usedNames[name] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local function addNames(names)&lt;br /&gt;
		if names[1] then&lt;br /&gt;
			for _, name in ipairs(names) do&lt;br /&gt;
				addName(name)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			addName(names)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Обрабатываем все наборы ингредиентов&lt;br /&gt;
	for _, ingredientSet in ipairs(ingredientSets) do&lt;br /&gt;
		for _, ingredient in ipairs(ingredientSet) do&lt;br /&gt;
			local name = ingredient.name&lt;br /&gt;
			if not ingredient.mod and not usedNames[name] then&lt;br /&gt;
				-- Сначала попытаемся прямо заменить то или иное название статьи&lt;br /&gt;
				local directReplace = mergeRules[&amp;quot;прямая замена&amp;quot;][name]&lt;br /&gt;
				if directReplace then&lt;br /&gt;
					addNames(directReplace)&lt;br /&gt;
				else&lt;br /&gt;
					-- Теперь приступаем к обработке по шаблонам замены&lt;br /&gt;
					local replaced = false&lt;br /&gt;
					for _, patternReplace in ipairs(mergeRules[&amp;quot;замена по шаблону&amp;quot;]) do&lt;br /&gt;
						if mw.ustring.find(name, patternReplace[1]) then&lt;br /&gt;
							addNames(patternReplace[2])&lt;br /&gt;
							replaced = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					&lt;br /&gt;
					if not replaced then&lt;br /&gt;
						-- Если шаблон не найден, то делается общая обработка&lt;br /&gt;
						&lt;br /&gt;
						-- Убираем типовые прилагательные&lt;br /&gt;
						for _, prefixMatch in pairs(prefixesMatch) do&lt;br /&gt;
							if mw.ustring.find(name, prefixMatch .. &amp;quot; &amp;quot;) then&lt;br /&gt;
								name = mw.ustring.gsub(name, prefixMatch .. &amp;quot; &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
								break&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						-- Убираем специфические прилагательные для медных блоков&lt;br /&gt;
						if mw.ustring.find(name, &amp;quot;медн[ыао][йяе]&amp;quot;) then&lt;br /&gt;
							name = mw.ustring.gsub(name, &amp;quot;^[Нн]евощён[ыао][йяе] &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
							name = mw.ustring.gsub(name, &amp;quot;^[Вв]ощён[ыао][йяе] &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
							name = mw.ustring.gsub(name, &amp;quot;^[Пп]отемневш[иае][йяе] &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
							name = mw.ustring.gsub(name, &amp;quot;^[Сс]остаренн[ыао][йяе] &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
							name = mw.ustring.gsub(name, &amp;quot;^[Оо]кисленн[ыао][йяе] &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						-- Обработка строк вида &amp;quot;А или Б&amp;quot;&lt;br /&gt;
						local orA, orB = mw.ustring.match(name, &amp;quot;(.-) или (.+)&amp;quot;)&lt;br /&gt;
						if orA then&lt;br /&gt;
							addName(orA)&lt;br /&gt;
							addName(orB)&lt;br /&gt;
						else&lt;br /&gt;
							addName(name)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Основная функция&lt;br /&gt;
--- Строительство таблицы крафта&lt;br /&gt;
function p.table(f)&lt;br /&gt;
	-- Принимаем аргументы&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = require(&amp;#039;Модуль:ProcessArgs&amp;#039;).merge(true)&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Автоматически раскладываем бесформенный рецепт&lt;br /&gt;
	arrangeShapelessRecipe(args)&lt;br /&gt;
	&lt;br /&gt;
	-- Строим таблицу и получаем списки ингредиентов&lt;br /&gt;
	local out, ingredientSets = recipeTable(args, {&lt;br /&gt;
		[&amp;quot;функция интерфейса&amp;quot;] = &amp;#039;craftingTable&amp;#039;,&lt;br /&gt;
		[&amp;quot;тип&amp;quot;] = i18n.type,&lt;br /&gt;
		[&amp;quot;типа&amp;quot;] = i18n.typeGenitive,&lt;br /&gt;
		[&amp;quot;аргументы ингредиентов&amp;quot;] = cArgVals,&lt;br /&gt;
		[&amp;quot;аргументы выхода&amp;quot;] = {&amp;#039;Выход&amp;#039;},&lt;br /&gt;
	})&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;некат&amp;quot;] == &amp;quot;1&amp;quot; or args[&amp;quot;игнорировать&amp;quot;] == &amp;quot;1&amp;quot; or title.namespace ~= 0 or title.isSubpage then&lt;br /&gt;
		return out&lt;br /&gt;
	else&lt;br /&gt;
		-- Простановка категорий. Она автоматически отключена вне пространства статей, а&lt;br /&gt;
		-- также на подстраницах (в т. ч. для модификаций). Для модов ещё не реализована&lt;br /&gt;
		-- адекватная поддержка механизма «Использование для крафта» — это предполагается&lt;br /&gt;
		-- сделать после переписывания модуля на базе Semantic MediaWiki.&lt;br /&gt;
		local categories = {}&lt;br /&gt;
		&lt;br /&gt;
		-- Тип рецепта&lt;br /&gt;
		if args[&amp;quot;тип&amp;quot;] then&lt;br /&gt;
			local cat = i18n.categoryRecipeType:gsub(&amp;quot;%$1&amp;quot;, mw.text.trim(args[&amp;quot;тип&amp;quot;]))&lt;br /&gt;
			table.insert(categories, cat)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Использование ингредиентов&lt;br /&gt;
		addUsageCategories(ingredientSets, categories)&lt;br /&gt;
		&lt;br /&gt;
		return out, table.concat(categories, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>minecraftwiki&gt;MakandIv</name></author>
	</entry>
</feed>