Этот модуль реализует шаблон {{Состояния блока}}.
Зависимости[]
---- Модуль для реализации таблиц состояний блока.
-- Данные по состояниям размещаются на подстраницах данного модуля.
--[[
Формат страниц Модуль:Состояния блока/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