Этот модуль предназначен для создания HTML-структур более ёмким способом, чем встроенная в Scribunto библиотека mw.html.
Описание работы[]
Этот модуль изменяет создаваемые mw.html объекты, добавляя в них методы с более ёмким синтаксисом. Эти методы, к тому же, автоматически изменяют создаваемые ими объекты.
Этот модуль не изменяет объекты mw.html, возвращаемые стандартными функциями, или объекты, полученные извне, но в модуле содержится функция для внедрения методов в такие объекты.
Ряд функций этого модуля принимает селекторы, позволяющие сразу задать тип элемента, HTML-идентификатор и фиксированные CSS-классы. Формат селекторов модуля похож на селекторы CSS.
Селекторы, принимаемые этим модулем, состоят из одной или нескольких частей, которые на усмотрение пользователя могут быть разделены пробелами. Сами части пробелов содержать не могут. Первая часть должна состоять исключительно из названия элемента (например span или div). Последующие части должны начинаться или на точку (.), за которой следует название CSS-класса, или на знак решётки (#), за которым следует HTML-идентификатор.
Примеры селекторов:
div— элементdivбез особых свойств, но с поддержкой расширенных методов этого модуляspan.invslot— элементspanс классомinvslottable .wikitable .collapsible .collapsed #item-list— таблица (table) с классамиwikitable,collapsibleиcollapsed, а также идентификаторомitem-list
Функции[]
Функции, которые вызываются из модуля, обозначены как p.function_name. Функции, которые вызываются из объектов, возвращаемых модулем (то есть в дополнение к стандартным функциям mw.html), обозначены как node:function_name.
p.make_node, p.make_node_fmt[]
Синтаксис:
p.make_node(selector, ...)p.make_node_fmt(selector, fmt, ...)
Эти две функции создают элемент mw.html с возможностью сразу задать классы и идентификатор через селектор selector, а также установить начальный текст. В функции make_node после селектора может следовать произвольное число аргументов, добавляемых в элемент как вики-текст (что эквивалентно стандартному методу mw.html:wikitext(...)). В варианте make_node_fmt после селектора идёт строка-формат, которая передаётся стандартной функции string.format вместе со всеми аргументами, которые следуют после строки-формата.
Пример:
local html = require("Module:HTMLUtils")
-- ...
local node = html.make_node("div .greeting", "Добрый день, ", name, "!")
-- что то же самое, что:
local node_fmt = html.make_node_fmt("div .greeting", "Добрый день, %s!", name)
-- или со стандартными функциями:
local std_node = mw.html.create("div")
:addClass("greeting")
:wikitext("Добрый день, ", name, "!")
local std_node_fmt = mw.html.create("div")
:addClass("greeting")
:wikitext(string.format("Добрый день, %s!", name))
p.inject_methods[]
Берёт объект mw.html и внедряет в него методы, добавляемые этим модулем. Возвращает изменённый объект.
local html = require("Module:HTMLUtils")
local another = require("Module:SomeOtherModule")
-- ...
-- функция another.make_html не использует HTMLUtils, и возвращаемый ей объект
-- mw.html не поддерживает расширенные методы из этого модуля
local node = html.inject_methods(another.make_html())
-- но после вызова inject_methods этот объект может быть передан методам HTMLUtils
node:sel_node("div .test", "Привет, мир!")
node:sel_node, node:sel_node_fmt[]
Эти две функции эквивалентны стандартному методу mw.html:node, но внедряют методы HTMLUtils. Синтаксис аналогичен таковым у make_node и make_node_fmt.
local html = require("Module:HTMLUtils")
-- ...
-- все три вызова идентичны
local wrapper = html.make_node("div .wrapper")
:sel_node("div .greeting", "Добрый день, ", name, "!")
:sel_node_fmt("div .greeting", "Добрый день, %s!", name)
:node(mw.html.create("div")
:addClass("greeting")
:wikitext("Добрый день, ", name, "!")
)
-- Обратите внимание, что стандартный метод :node возвращает тот же объект,
-- то есть методы HTMLUtils не исчезают.
node:sel_tag, node:sel_tag_fmt[]
Эти две функции эквивалентны стандартному методу mw.html:tag, но внедряют методы HTMLUtils. Синтаксис аналогичен таковым у make_node и make_node_fmt.
local html = require("Module:HTMLUtils")
-- ...
-- все три вызова идентичны
local wrapper = html.make_node("div .wrapper")
:sel_tag("div .greeting", "Добрый день, ", name, "!")
:done()
:sel_tag_fmt("div .greeting", "Добрый день, %s!", name)
:done()
:tag("div")
:addClass("greeting")
:wikitext("Добрый день, ", name, "!")
:done()
-- Обратите внимание, что стандартный метод :tag создаёт новый объект,
-- и методы HTMLUtils на этот новый объект не переносятся. При этом :done
-- возвращает уже созданный объект, из которого методы HTMLUtils не убираются.