Модуль:Список/doc

Версия от 20:57, 26 мая 2026; Johnny B Goode (обсуждение | вклад) (Новая страница: «<markdown> Да, такую задачу можно эффективно решить с помощью одного модуля Scribunto (Lua). Создавать два отдельных модуля нет необходимости — удобнее объединить логику в одном месте и сделать две разные функции (точки входа) для маркированного и нумерованного с...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Это страница документации Модуль:Список.

Да, такую задачу можно эффективно решить с помощью одного модуля 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: Создание шаблонов

Теперь вы можете создать шаблоны, которые будут обращаться к этому модулю.

Вариант А: Два отдельных шаблона

  1. Шаблон:Маркированный список Код шаблона:

    {{#invoke:List|unordered}}
  2. Шаблон:Нумерованный список Код шаблона:

    {{#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}}.