Модуль:HTMLUtils

Материал из SteamWorld Wiki
Перейти к навигации Перейти к поиску

Для документации этого модуля может быть создана страница Модуль:HTMLUtils/doc

local p = {}

local node_methods = {
	"sel_node",
	"sel_tag",
	"sel_node_fmt",
	"sel_tag_fmt"
}

local inner = {}

function inner.parse_selector(selector)
	local element, remainder = selector:match("^%s*(%w+)%s*(.-)%s*$")
	if not element then
		return nil
	end
	local parts = {}
	local part
	while remainder and remainder ~= "" do
		part, remainder = remainder:match("^([#%.][^ %.#]+)%s*(.-)$")
		table.insert(parts, part)
	end
	
	local id
	local classes = {}
	for _, part in ipairs(parts) do
		if part:sub(1, 1) == "#" then
			if id then
				mw.log("Warning: Redefining ID")
			end
			id = part:sub(2)
		else -- class
			table.insert(classes, part:sub(2))
		end
	end
	return element, id, classes
end

function inner.modify_node(node, id, classes, ...)
	node:attr("id", id)
	for _, class in ipairs(classes) do
		node:addClass(class)
	end
	node:wikitext(...)
	p.inject_methods(node)
	
	return node
end

function inner.sel_node(self, selector, ...)
	self:node(p.make_node(selector, ...))
	return self
end

function inner.sel_tag(self, selector, ...)
	local element, id, classes = inner.parse_selector(selector)
	return inner.modify_node(self:tag(element), id, classes, ...)
end

function inner.sel_node_fmt(self, selector, fmt, ...)
	return self:sel_node(selector, fmt:format(...))
end

function inner.sel_tag_fmt(self, selector, fmt, ...)
	return self:sel_tag(selector, fmt:format(...))
end

function p.inject_methods(node)
	for _, method in ipairs(node_methods) do
		node[method] = node[method] or inner[method]
	end
	return node
end

function p.make_node(selector, ...)
	local element, id, classes = inner.parse_selector(selector)
	return inner.modify_node(mw.html.create(element), id, classes, ...)
end

function p.make_node_fmt(selector, fmt, ...)
	return p.make_node(selector, fmt:format(...))
end

return p