Модуль:HTMLUtils
Внешний вид
Для документации этого модуля может быть создана страница Модуль: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