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

Материал из 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