Модуль:Список/doc: различия между версиями
Новая страница: «<markdown> Да, такую задачу можно эффективно решить с помощью одного модуля Scribunto (Lua). Создавать два отдельных модуля нет необходимости — удобнее объединить логику в одном месте и сделать две разные функции (точки входа) для маркированного и нумерованного с...» |
Нет описания правки |
||
| Строка 1: | Строка 1: | ||
{{Начало скрытого блока|Ответ ИИ}} | |||
<markdown> | <markdown> | ||
Да, такую задачу можно эффективно решить с помощью одного модуля Scribunto (Lua). Создавать два отдельных модуля нет необходимости — удобнее объединить логику в одном месте и сделать две разные функции (точки входа) для маркированного и нумерованного списков. | Да, такую задачу можно эффективно решить с помощью одного модуля Scribunto (Lua). Создавать два отдельных модуля нет необходимости — удобнее объединить логику в одном месте и сделать две разные функции (точки входа) для маркированного и нумерованного списков. | ||
| Строка 152: | Строка 153: | ||
Это предотвращает появление пустых точек (маркеров) или сдвигов в разметке. При необходимости вы также можете передавать оформление напрямую в шаблон, например: `{{Маркированный список|стиль=column-count: 2;|Элемент 1|Элемент 2}}`. | Это предотвращает появление пустых точек (маркеров) или сдвигов в разметке. При необходимости вы также можете передавать оформление напрямую в шаблон, например: `{{Маркированный список|стиль=column-count: 2;|Элемент 1|Элемент 2}}`. | ||
</markdown> | </markdown> | ||
{{Конец скрытого блока}} | |||
Текущая версия от 20:58, 26 мая 2026
Да, такую задачу можно эффективно решить с помощью одного модуля Scribunto (Lua). Создавать два отдельных модуля нет необходимости — удобнее объединить логику в одном месте и сделать две разные функции (точки входа) для маркированного и нумерованного списков.
Ниже представлен простой и надёжный код модуля, а также пример его вызова из шаблона.
Шаг 1: Создание модуля
Создайте страницу с названием Module:List (или Модуль:Список) и скопируйте туда следующий код:
local p = {}
-- Вспомогательная функция для очистки аргументов от пустых значений
local function getCleanArgs(frame)
-- Получаем аргументы из шаблона, который вызвал этот модуль
local args = frame:getParent().args
-- Если модуль вызывается напрямую, берем его собственные аргументы
if not args[1] then
args = frame.args
end
local cleaned = {}
local keys = {}
-- Собираем все числовые ключи (параметры шаблона, такие как 1, 2, 3...)
for k, v in pairs(args) do
if type(k) == 'number' then
table.insert(keys, k)
end
end
-- Сортируем ключи, чтобы сохранить исходный порядок элементов
table.sort(keys)
-- Перебираем элементы по порядку, отсеивая пустые
for _, k in ipairs(keys) do
local val = args[k]
if val then
-- Убираем пробелы по краям
val = mw.text.trim(val)
-- Если параметр не пустой, добавляем его в итоговую таблицу
if val ~= "" then
table.insert(cleaned, val)
end
end
end
return cleaned, args
end
-- Общая функция для генерации HTML-списка
local function makeList(listType, frame)
local items, args = getCleanArgs(frame)
-- Если нет ни одного заполненного элемента, возвращаем пустую строку
if #items == 0 then
return ""
end
-- Создаем элемент списка (ul или ol) через стандартную библиотеку mw.html
local listTag = mw.html.create(listType)
-- Возможность передавать дополнительные CSS-классы или стили из шаблона
local class = args.class or args['класс']
local style = args.style or args['стиль']
if class and class ~= "" then
listTag:addClass(class)
end
if style and style ~= "" then
listTag:cssText(style)
end
-- Наполняем список элементами <li>
for _, item in ipairs(items) do
listTag:tag('li'):wikitext(item)
end
return tostring(listTag)
end
-- Точки входа для вызова из шаблонов
-- Для маркированного списка (unordered list - <ul>)
function p.unordered(frame)
return makeList('ul', frame)
end
-- Для нумерованного списка (ordered list - <ol>)
function p.ordered(frame)
return makeList('ol', frame)
end
-- Русскоязычные алиасы для удобства
p['маркированный'] = p.unordered
p['нумерованный'] = p.ordered
return p
Шаг 2: Создание шаблонов
Теперь вы можете создать шаблоны, которые будут обращаться к этому модулю.
Вариант А: Два отдельных шаблона
-
Шаблон:Маркированный список Код шаблона:
{{#invoke:List|unordered}} -
Шаблон:Нумерованный список Код шаблона:
{{#invoke:List|ordered}}
Вариант Б: Один универсальный шаблон (например, Шаблон:Список)
Если вы хотите управлять типом списка через параметр:
{{#invoke:List|{{#if:{{{тип|}}}|{{{тип}}}|unordered}}}}
(В таком случае при вызове {{Список|тип=ordered|...}} будет создаваться нумерованный список, а по умолчанию — маркированный).
Как это работает на практике
При вызове шаблона пустые или пропущенные параметры будут игнорироваться, не оставляя лишних пробелов, пустых маркеров или разрывов.
Пример использования:
{{Маркированный список
| 1 = Первая строка
| 2 =
| 3 = Третья строка (второй параметр был пустым)
| 4 = Четвертая строка
| 5 =
}}
Результат генерации HTML: Скрипт отбросит пустые значения на этапе обработки таблицы, соберет оставшиеся элементы подряд и сформирует чистый HTML-код:
<ul>
<li>Первая строка</li>
<li>Третья строка (второй параметр был пустым)</li>
<li>Четвертая строка</li>
</ul>
Это предотвращает появление пустых точек (маркеров) или сдвигов в разметке. При необходимости вы также можете передавать оформление напрямую в шаблон, например: {{Маркированный список|стиль=column-count: 2;|Элемент 1|Элемент 2}}.