Открыть меню
Открыть персональное меню
Вы не представились системе
Your IP address will be publicly visible if you make any edits.

Модуль:RenderSubnotes: различия между версиями

Материал из wiki.iccup.org
Нет описания правки
Нет описания правки
 
(не показано 199 промежуточных версий 2 участников)
Строка 1: Строка 1:
local p = {}
local p = {}


-- Основная функция для рендеринга примечаний
function p.renderNotes(frame)
function p.renderNotes(frame)
     local rootHtml = mw.html.create('ul') -- Создаем корневой элемент списка
     local parent = frame:getParent()
     local index = 1
     local notes = {}
      
    local noteOrder = {}
     while true do
 
         local note = frame.args['note_' .. index]
     -- Собираем основные примечания и сохраняем их порядок
          
     for key, value in pairs(parent.args) do
         if not note then break end
         if key:match("^note_%d+$") and value ~= "" then
       
            notes[key] = {value = value, subNotes = {}}
        local li = rootHtml:tag('li'):wikitext(note) -- Основное примечание
            table.insert(noteOrder, key) -- Сохраняем порядок ключей
         local subIndex = 1
         end
         local hasSubNotes = false
    end
          
 
         -- Проверяем на наличие вложенных примечаний
    -- Собираем вложенные примечания и добавляем к соответствующим основным
        while true do
    for key, value in pairs(parent.args) do
            local subNote = frame.args['note_' .. index .. '_' .. subIndex]
         if key:match("^note_%d+_%d+$") and value ~= "" then
              
            local mainKey = key:match("^(note_%d+)")
             if not subNote then break end
            local subNoteIndex = tonumber(key:match("_(%d+)$"))
              
            if notes[mainKey] then
             -- Если есть вложенные, создаем вложенный список
                notes[mainKey].subNotes[subNoteIndex] = value
             if not hasSubNotes then
            end
                 hasSubNotes = true
        end
                subUl = li:tag('ul')
    end
 
    -- Сортируем `noteOrder` для корректного отображения по порядку ключей
    table.sort(noteOrder, function(a, b)
         local aNum = tonumber(a:match("%d+"))
         local bNum = tonumber(b:match("%d+"))
         return aNum < bNum
    end)
 
    -- Если нет примечаний, выводим сообщение
    if next(notes) == nil then
         return "Примечаний нет."
    end
 
    -- Формируем список примечаний с учетом порядка
    local result = '<ul>'
    for _, noteKey in ipairs(noteOrder) do
        local note = notes[noteKey]
        result = result .. '<li>' .. note.value
 
        -- Проверяем, есть ли вложенные примечания
        if next(note.subNotes) ~= nil then
            result = result .. '<ul>'
 
            -- Сортируем вложенные примечания и добавляем в результат
             local sortedSubNotes = {}
             for index, subNote in pairs(note.subNotes) do
                if subNote ~= nil then -- Проверка на наличие значения
                    table.insert(sortedSubNotes, {index = index, value = subNote})
                end
             end
             table.sort(sortedSubNotes, function(a, b) return a.index < b.index end)
 
             for _, subNote in ipairs(sortedSubNotes) do
                 result = result .. '<li>' .. subNote.value .. '</li>'
             end
             end
              
 
            subUl:tag('li'):wikitext(subNote) -- Вложенное примечание
             result = result .. '</ul>'
             subIndex = subIndex + 1
        end
 
        result = result .. '</li>'
    end
    result = result .. '</ul>'
 
    return result
end
 
local function checkMatchingNumber(descrKey, imageKey)
    -- Извлекаем цифры после первого подчеркивания
    local descrNumber = descrKey:match("_%d+"):sub(2)
    local imageNumber = imageKey:match("_%d+"):sub(2)
 
    -- Сравниваем цифры
    return descrNumber == imageNumber
end
 
 
-- Новая функция для рендеринга действий с изображениями
function p.renderItemsAction(frame)
    local parent = frame:getParent()
    local items = {}
    local itemsImage = {}
    local itemOrder = {}
    local itemImageOrder = {}
 
    -- Собираем основные действия и их описания
    for key, value in pairs(parent.args) do
        if key:match("^itemsActionDescr_%d+$") and value ~= "" then
             items[key] = {description = value, images = {}}
            table.insert(itemOrder, key) -- Сохраняем порядок ключей
         end
         end
       
        index = index + 1
     end
     end
    -- Собираем изображения для каждого действия
    for key, value in pairs(items) do
  for keyImage, valueImage in pairs(parent.args) do
if keyImage:match("^itemsActionImage_%d+_%d+$") and value ~= "" then
    if checkMatchingNumber(key, keyImage) then
    table.insert(value.images, valueImage)
    end
    end
      end
    end
    -- Сортируем `itemOrder` для корректного отображения по порядку ключей
    table.sort(itemOrder, function(a, b)
        local aNum = tonumber(a:match("%d+"))
        local bNum = tonumber(b:match("%d+"))
        return aNum < bNum
    end)
      
      
     return tostring(rootHtml)
local result = '<ul class="items-actions-list">'
     -- Если нет действий, выводим сообщение
    if next(items) == nil then
        return result .. "<li class='items-actions-list-item'>Действия не указаны.</li>"
    end
 
    -- Формируем список действий с изображениями
    for _, itemKey in ipairs(itemOrder) do
        local item = items[itemKey]
result = result .. '<li class="items-actions-list-item">'
if #item.images > 0 then
            result = result .. '<span class="items-actions-list-item-image">'
            for _, image in ipairs(item.images) do
                result = result .. '[[File:' .. image .. '|50px|50px|link=]]'
            end
            result = result .. '</span>'
        end
        result = result .. '<span class=items-actions-list-item-text>' .. item.description .. '</span>' .. '<li>'
      end
    result = result .. '</ul>'
    return result
end
end


return p
return p

Текущая версия от 21:32, 10 ноября 2024

Описание[править код]

Модуль RenderSubnotes используется для рендеринга примечаний и действий с изображениями в карточках героев или других информационных блоках. Этот модуль предоставляет две основные функции: renderNotes для отображения примечаний и renderItemsAction для рендеринга действий с изображениями.

Использование[править код]

Функция renderNotes[править код]

Функция renderNotes используется для отображения примечаний, где примечания могут быть как основными, так и вложенными. Основные примечания задаются параметрами вида note_1, note_2 и так далее. Вложенные примечания задаются параметрами вида note_1_1, note_1_2 и так далее.

Пример использования:

{{#invoke:RenderSubnotes|renderNotes
| note_1 = Примечание 1
| note_1_1 = Подпримечание 1.1
| note_1_2 = Подпримечание 1.2
| note_2 = Примечание 2
}}

Функция renderItemsAction[править код]

Функция renderItemsAction используется для отображения действий с изображениями. Описание действия задается параметром вида itemsActionDescr_1, а изображение – параметром itemsActionImage_1_1, где числа после символа подчеркивания должны совпадать для правильной привязки изображения к действию.

Пример использования:

{{#invoke:RenderSubnotes|renderItemsAction
| itemsActionDescr_1 = Описание действия 1
| itemsActionImage_1_1 = action_image_1.png
| itemsActionImage_1_2 = action_image_2.png
| itemsActionDescr_2 = Описание действия 2
| itemsActionImage_2_1 = action_image_3.png
}}

Параметры[править код]

Параметры для renderNotes[править код]

  • note_X – основное примечание, где X – порядковый номер.
  • note_X_Y – вложенное примечание, где X – номер основного примечания, а Y – номер вложенного примечания.

Параметры для renderItemsAction[править код]

  • itemsActionDescr_X – описание действия, где X – порядковый номер.
  • itemsActionImage_X_Y – изображение для действия, где X – номер действия, а Y – номер изображения для данного действия.

Примечания[править код]

  • Основные примечания могут иметь несколько уровней вложенности.
  • Изображения для действий должны быть привязаны к правильным действиям с помощью одинаковых порядковых номеров в параметрах.



local p = {}

-- Основная функция для рендеринга примечаний
function p.renderNotes(frame)
    local parent = frame:getParent()
    local notes = {}
    local noteOrder = {}

    -- Собираем основные примечания и сохраняем их порядок
    for key, value in pairs(parent.args) do
        if key:match("^note_%d+$") and value ~= "" then
            notes[key] = {value = value, subNotes = {}}
            table.insert(noteOrder, key) -- Сохраняем порядок ключей
        end
    end

    -- Собираем вложенные примечания и добавляем к соответствующим основным
    for key, value in pairs(parent.args) do
        if key:match("^note_%d+_%d+$") and value ~= "" then
            local mainKey = key:match("^(note_%d+)")
            local subNoteIndex = tonumber(key:match("_(%d+)$"))
            if notes[mainKey] then
                notes[mainKey].subNotes[subNoteIndex] = value
            end
        end
    end

    -- Сортируем `noteOrder` для корректного отображения по порядку ключей
    table.sort(noteOrder, function(a, b)
        local aNum = tonumber(a:match("%d+"))
        local bNum = tonumber(b:match("%d+"))
        return aNum < bNum
    end)

    -- Если нет примечаний, выводим сообщение
    if next(notes) == nil then
        return "Примечаний нет."
    end

    -- Формируем список примечаний с учетом порядка
    local result = '<ul>'
    for _, noteKey in ipairs(noteOrder) do
        local note = notes[noteKey]
        result = result .. '<li>' .. note.value

        -- Проверяем, есть ли вложенные примечания
        if next(note.subNotes) ~= nil then
            result = result .. '<ul>'

            -- Сортируем вложенные примечания и добавляем в результат
            local sortedSubNotes = {}
            for index, subNote in pairs(note.subNotes) do
                if subNote ~= nil then -- Проверка на наличие значения
                    table.insert(sortedSubNotes, {index = index, value = subNote})
                end
            end
            table.sort(sortedSubNotes, function(a, b) return a.index < b.index end)

            for _, subNote in ipairs(sortedSubNotes) do
                result = result .. '<li>' .. subNote.value .. '</li>'
            end

            result = result .. '</ul>'
        end

        result = result .. '</li>'
    end
    result = result .. '</ul>'

    return result
end

local function checkMatchingNumber(descrKey, imageKey)
    -- Извлекаем цифры после первого подчеркивания
    local descrNumber = descrKey:match("_%d+"):sub(2)
    local imageNumber = imageKey:match("_%d+"):sub(2)

    -- Сравниваем цифры
    return descrNumber == imageNumber
end


-- Новая функция для рендеринга действий с изображениями
function p.renderItemsAction(frame)
    local parent = frame:getParent()
    local items = {}
    local itemsImage = {}
    local itemOrder = {}
    local itemImageOrder = {}

    -- Собираем основные действия и их описания
    for key, value in pairs(parent.args) do
        if key:match("^itemsActionDescr_%d+$") and value ~= "" then
            items[key] = {description = value, images = {}}
            table.insert(itemOrder, key) -- Сохраняем порядок ключей
        end
    end

    -- Собираем изображения для каждого действия
    for key, value in pairs(items) do
	  for keyImage, valueImage in pairs(parent.args) do
		if keyImage:match("^itemsActionImage_%d+_%d+$") and value ~= "" then
	     if checkMatchingNumber(key, keyImage) then
    		table.insert(value.images, valueImage)
    	 end
    	end
       end
    end

    -- Сортируем `itemOrder` для корректного отображения по порядку ключей
    table.sort(itemOrder, function(a, b)
        local aNum = tonumber(a:match("%d+"))
        local bNum = tonumber(b:match("%d+"))
        return aNum < bNum
    end)
    
	local result = '<ul class="items-actions-list">'
	
    -- Если нет действий, выводим сообщение
    if next(items) == nil then
        return result .. "<li class='items-actions-list-item'>Действия не указаны.</li>"
    end

    -- Формируем список действий с изображениями
    for _, itemKey in ipairs(itemOrder) do
        local item = items[itemKey]
		result = result .. '<li class="items-actions-list-item">'
		if #item.images > 0 then
            result = result .. '<span class="items-actions-list-item-image">'
            for _, image in ipairs(item.images) do
                result = result .. 	'[[File:' .. image .. '|50px|50px|link=]]'
            end
            result = result .. '</span>'
        end
        result = result .. '<span class=items-actions-list-item-text>' .. item.description .. '</span>' .. '<li>' 
       end
    result = result .. '</ul>'
    return result
end

return p