Join The Fan Lab, a private Fandom research community for users in the US and UK where you will be asked to share your opinions on all things gaming and entertainment! Click here to see if you qualify

Модуль:Состояния блока

Материал из Minecraft Wiki
Перейти к: навигация, поиск

Этот модуль реализует шаблон {{Состояния блока}}.

Зависимости[править код]

---- Модуль для реализации таблиц состояний блока.
-- Данные по состояниям размещаются на подстраницах данного модуля.

--[[
Формат страниц Модуль:Состояния блока/minecraft:block следующий (пример для minecraft:log):

return {
	{"axis", {
--		["тип"] = "TAG_String", -- по умолчанию подразумевается TAG_String
		["значения"] = {
			{"none", "Все стороны древесины имеют «кору»."},
			{"x", "Стороны блока без коры направлены на восток-запад."},
			{"y", "Стороны блока без коры направлены вверх или вниз."},
			{"z", "Стороны блока без коры направлены на север-юг."},
		}
	}},
	{"variant", {
		["значения"] = {
			{"oak", "{{Спрайт/Блок|древесина|текст=Дубовая}}"},
			{"spruce", "{{Спрайт/Блок|еловая_древесина|текст=Хвойная}}"},
			{"birch", "{{Спрайт/Блок|берёзовая_древесина|текст=Берёзовая}}"},
			{"jungle", "{{Спрайт/Блок|джунглевая_древесина|текст=Джунглевая}}"}
		}
	}}
}

Если вместо описания поместить один символ &, то будет использоваться такое же описание, что и для предыдущего элемента.
Если поместить строку «&» сразу после названия тега, вместо таблицы с данными о теге, то тег будет сгруппирован с тегом, расположенным выше.
]]

local p = {}

-- Создать одну таблицу (внутренняя функция)
function p.table(args)
	local thetable
	local f = mw.getCurrentFrame()
	
	-- Параметры
	local id = args[1]
	local nocat = args["некат"] or ""
	local class = args["класс"] or ""
	
	-- Данные по блоку
	local datatitle = "Модуль:Состояния блока/" .. id
	local datapage = mw.title.new(datatitle)
	
	-- Сначала проверим, есть ли они.
	if not datapage.exists then
		-- Их нет, выводим сообщение об ошибке и прекращаем работу.
		thetable = "<strong class=error>Страница [" .. datapage:fullUrl("action=edit&editintro=Шаблон:Состояния_блока/editintro&preload=Модуль:Состояния_блока/preload&redlink=1") .. ' ' .. datatitle .. "] не существует. Необходимо создать её.</strong>"
		if nocat == "" then
			thetable = thetable .. "[[Категория:Страницы с отсутствующими данными о состоянии блока]]"
		end
		return thetable
	end
	
	-- Они есть, значит можно загружать
	local data = mw.loadData(datatitle)
	
	local nbtsprite = require("Модуль:NBT").sprite -- для отображения типа NBT-тега
	
	thetable = mw.html.create("table"):addClass("wikitable") -- создать стандартную таблицу
	if class ~= "" then
		thetable:addClass(class)
	end
	
	-- Общий заголовок с ссылкой на редактирование
	local caption = id .. " <small>[ [" .. datapage:fullUrl("action=edit&editintro=Шаблон:Состояния_блока/editintro") .. ' ' .. f:preprocess("{{lc:{{int:editlink}} }}") .. "] ]</small>"
	thetable:tag("caption"):wikitext(caption)
	
	-- Заголовки таблицы
	local headers = thetable:tag("tr")
	headers:tag("th"):wikitext("[[Состояния блоков|Название]]")
	headers:tag("th"):wikitext("Значение")
	headers:tag("th"):wikitext("Описание")
	
	-- Первый ряд и его заголовок
	local row = thetable:tag("tr")
	local rhead = row:tag("th"):cssText("text-align: left")
	local ttype = "TAG_String"

	-- Ряды таблицы
	for i, tag in ipairs(data) do
		local tdata = tag[2]
		
		-- Проводить ли группировку тегов?
		if i > 1 and tdata == "&" then
			rgrouping = true
			rhead:tag("br")
			rhead:wikitext(nbtsprite{ttype, tag[1], ["некат"] = nocat})
		elseif tdata ~= "&" then
			-- Группировку не производим
			if i > 1 then
				-- Создаём новый ряд, если не был подготовлен старый
				row = thetable:tag("tr")
				rhead = row:tag("th")
			end
			
			ttype = tdata["тип"] or "TAG_String"
			rhead:wikitext(nbtsprite{ttype, tag[1], ["некат"] = nocat})
			
			-- переменные для группировки описаний тегов
			local subrow = row
			local gcount = 0
			local dgrouping = false
			local tvalue
			local tdesc
			
			for j, value in ipairs(tdata["значения"]) do
				-- value[1] — название
				-- value[2] — описание
				gcount = gcount + 1
				
				-- Производить ли группировку значений?
				if gcount > 1 then
					if value[2] == "&" then
						-- начать группировку
						dgrouping = true
						gcount = gcount - 1
					else
						if dgrouping == true then
							-- заканчиваем группировку, начинаем новую строку
							dgrouping = false
						end
						subrow = thetable:tag("tr")
					end
				end
				
				-- Если не группируем, создаём новые клетки для значения и описания.
				if dgrouping == false then
					tvalue = subrow:tag("td")
					tdesc = subrow:tag("td")
					tdesc:wikitext(f:preprocess(value[2]))
				else -- Если же нет, добавляем значение к старой клетке, а описание не трогаем.
					tvalue:tag("br")
				end
				tvalue:wikitext("<code>" .. value[1] .. "</code>")
			end
		
			-- Указываем количество групп в строку о теге.
			rhead:attr("rowspan", gcount)
		end
	end
	
	-- Собираем всё вместе и возвращаем результат.
	return tostring(thetable)
end

-- Создать таблицы (функция для общего использования). Используйте именно её, даже если таблица одна.
function p.tables(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = require("Модуль:ProcessArgs").merge(true)
	end
	
	-- Неименованные аргументы указывают на идентификаторы блоков (например, minecraft:stone). Можно указать несколько блоков.
	-- Именованные аргументы используются для настройки модуля.
	
	local alltables = ""
	local nocat = args["некат"] or "" -- отключение категорий
	local class = args["класс"] or "" -- дополнительный класс таблицы
	
	local ids = {}
	for i, id in ipairs(args) do
		table.insert(ids, mw.text.trim(id))
	end
	
	-- Если идентификаторы указаны...
	if #ids > 0 then
		-- ...то обработаем их с помощью p.table().
		for i, id in ipairs(ids) do
			alltables = alltables .. p.table{id, ["некат"] = nocat, ["класс"] = class}
		end
	else
		-- А иначе завершаем работу с ошибкой.
		alltables = "<strong class=error>Ошибка: Шаблону {{Состояния блока}} не переданы аргументы!</strong>"
		if nocat == "" then
			alltables = alltables .. "[[Категория:Страницы с неправильным использованием шаблона Состояния блока]]"
		end
	end
	
	-- Возвращаем результат
	return alltables
end

return p