Открыть меню
Переключить меню настроек
Открыть персональное меню
Вы не представились системе
Ваш IP-адрес будет виден всем, если вы внесёте какие-либо изменения.

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

Материал из YastreWiki
Нет описания правки
мНет описания правки
Метка: ручная отмена
 
(не показано 20 промежуточных версий этого же участника)
Строка 37: Строка 37:
     local captionParam = clean(args['подпись'])
     local captionParam = clean(args['подпись'])


     local root = mw.html.create('table')
     local container = mw.html.create('div')
    root:addClass('infobox')
        :addClass('infobox')


     root:tag('caption')
     container:tag('div')
         :addClass('infobox-title')
         :addClass('infobox-title')
         :wikitext(title)
         :wikitext(title)
    local tableRoot = container:tag('table')
        :addClass('infobox-table')


     if imageParam then
     if imageParam then
         local imageRow = root:tag('tr'):addClass('infobox-image-row')
         local imageRow = tableRoot:tag('tr'):addClass('infobox-image-row')
         local imageCell = imageRow:tag('td')
         local imageCell = imageRow:tag('td')
             :attr('colspan', '2')
             :attr('colspan', '2')
Строка 78: Строка 81:
         local val = clean(data)
         local val = clean(data)
         if val then
         if val then
             local row = root:tag('tr'):addClass('infobox-row')
             local row = tableRoot:tag('tr'):addClass('infobox-row')
             row:tag('th')
             row:tag('th')
                 :addClass('infobox-label')
                 :addClass('infobox-label')
Строка 88: Строка 91:
     end
     end


    addRow('Настоящее имя', args['имя'])
local predefinedRows = {
    addRow('Описание', args['описание'])
{ label = 'Настоящее имя', key = 'настоящее_имя' },
    addRow('Статус', args['статус'])
    { label = 'Имя', key = 'имя' },
    { label = 'Тип', key = 'тип' },
    { label = 'Пол', key = 'пол' },
    { label = 'Описание', key = 'описание' },
    { label = 'Статус', key = 'статус' },


    addRow('Дата создания', args['дата создания'])
{ label = 'Создатель', key = 'создатель' },
    addRow('Подписчики', args['подписчики'])
    { label = 'Разработчик', key = 'разработчик' },
    addRow('Просмотры', args['просмотры'])
    { label = 'Дата создания', key = 'дата создания' },
    addRow('Ссылки', args['ссылки'])
    addRow('Первая версия', args['первая версия'])
    { label = 'Подписчики', key = 'подписчики' },
addRow('Последняя версия', args['последняя версия'])
    { label = 'Просмотры', key = 'просмотры' },
addRow('Лицензия', args['лицензия'])
addRow('Языки программирования', args['языки программирования'])
    { label = 'Первая версия', key = 'первая версия' },
    { label = 'Последняя версия', key = 'последняя версия' },
    { label = 'Языки программирования', key = 'языки программирования' },
    { label = 'Лицензия', key = 'лицензия' },
    { label = 'Ссылки', key = 'ссылки' },
}
for _, row in ipairs(predefinedRows) do
    addRow(row.label, args[row.key])
end


     local function addCustomFields()
     local function addCustomFields()
Строка 118: Строка 136:
         end
         end
     end
     end
      
 
local function addBracketFields()
     local function addBracketFields()
    for key, rawValue in pairs(args) do
        for key, rawValue in pairs(args) do
        if type(key) == 'string' then
            if type(key) == 'string' then
            local base, label = key:match('^([^%(%)]+)%s*%((.-)%)$')
                local base, label = key:match('^([^%(%)]+)%s*%((.-)%)$')
            if base and rawValue and mw.text.trim(rawValue) ~= '' then
                if base and rawValue and mw.text.trim(rawValue) ~= '' then
                local labelText = clean(label)
                    local labelText = clean(label)
                if not labelText then
                    if not labelText then
                    labelText = clean(base)
                        labelText = clean(base)
                end
                    end
                if labelText then
                    if labelText then
                    addRow(labelText, rawValue)
                        addRow(labelText, rawValue)
                end
                    end
            end
                end
        end
            end
    end
        end
end
    end


     addCustomFields()
     addCustomFields()
addBracketFields()
    addBracketFields()
 
     return styles .. tostring(root)
    local footerText = args['подвал']
    if footerText and mw.text.trim(footerText) ~= '' then
        container:tag('div')
            :addClass('infobox-footer-block')
            :node(footerText)
    end
 
     return styles .. tostring(container)
end
end


return p
return p

Текущая версия от 18:10, 5 июня 2026

Для документации этого модуля может быть создана страница Модуль:Infobox/doc

local p = {}

local function clean(val)
    if val == nil then
        return nil
    end

    local trimmed = mw.text.trim(val)
    if trimmed == '' then
        return nil
    end

    trimmed = trimmed:gsub('\r\n', '\n'):gsub('\r', '\n')
    return trimmed:gsub('\n', '<br>')
end

local customFieldPrefixes = { 'поле', 'field', 'custom' }
local customLabelSuffixes = { 'название', 'Название', 'label', 'Label', 'name', 'Name' }
local CUSTOM_FIELD_LIMIT = 20

local function addCustomLabel(key, args)
    for _, suffix in ipairs(customLabelSuffixes) do
        local label = clean(args[key .. suffix])
        if label then
            return label
        end
    end
    return nil
end

function p.render(frame)
    local styles = frame:extensionTag('templatestyles', '', { src = 'Шаблон:Инфобокс/styles.css' })

    local args = frame:getParent().args
    local title = clean(args['название']) or mw.title.getCurrentTitle().text
    local imageParam = clean(args['изображение'])
    local captionParam = clean(args['подпись'])

    local container = mw.html.create('div')
        :addClass('infobox')

    container:tag('div')
        :addClass('infobox-title')
        :wikitext(title)

    local tableRoot = container:tag('table')
        :addClass('infobox-table')

    if imageParam then
        local imageRow = tableRoot:tag('tr'):addClass('infobox-image-row')
        local imageCell = imageRow:tag('td')
            :attr('colspan', '2')
            :addClass('infobox-image')

        local images = mw.text.split(imageParam, '%s*;%s*')
        local captions = {}
        if captionParam then
            captions = mw.text.split(captionParam, '%s*;%s*')
        end

        for i, imgName in ipairs(images) do
            local trimmedImg = mw.text.trim(imgName)
            if trimmedImg ~= '' then
                local wrapper = imageCell:tag('div')
                    :addClass('infobox-image-wrapper')

                wrapper:tag('div')
                    :wikitext(string.format('[[Файл:%s|150px]]', trimmedImg))

                local currentCaption = clean(captions[i])
                if currentCaption then
                    wrapper:tag('div')
                        :addClass('infobox-caption')
                        :wikitext(currentCaption)
                end
            end
        end
    end

    local function addRow(label, data)
        local val = clean(data)
        if val then
            local row = tableRoot:tag('tr'):addClass('infobox-row')
            row:tag('th')
                :addClass('infobox-label')
                :wikitext(label)
            row:tag('td')
                :addClass('infobox-data')
                :wikitext(val)
        end
    end

	local predefinedRows = {
		{ label = 'Настоящее имя', key = 'настоящее_имя' },
	    { label = 'Имя', key = 'имя' },
	    { label = 'Тип', key = 'тип' },
	    { label = 'Пол', key = 'пол' },
	
	    { label = 'Описание', key = 'описание' },
	    { label = 'Статус', key = 'статус' },

		{ label = 'Создатель', key = 'создатель' },
	    { label = 'Разработчик', key = 'разработчик' },
	    { label = 'Дата создания', key = 'дата создания' },
	
	    { label = 'Подписчики', key = 'подписчики' },
	    { label = 'Просмотры', key = 'просмотры' },
	
	    { label = 'Первая версия', key = 'первая версия' },
	    { label = 'Последняя версия', key = 'последняя версия' },
	    { label = 'Языки программирования', key = 'языки программирования' },
	    { label = 'Лицензия', key = 'лицензия' },
	
	    { label = 'Ссылки', key = 'ссылки' },
	}
	
	for _, row in ipairs(predefinedRows) do
    	addRow(row.label, args[row.key])
	end

    local function addCustomFields()
        for _, prefix in ipairs(customFieldPrefixes) do
            for i = 1, CUSTOM_FIELD_LIMIT do
                local key = prefix .. i
                local rawValue = args[key]
                if rawValue then
                    local cleanedValue = clean(rawValue)
                    if cleanedValue then
                        local label = addCustomLabel(key, args)
                        if label then
                            addRow(label, rawValue)
                        end
                    end
                end
            end
        end
    end

    local function addBracketFields()
        for key, rawValue in pairs(args) do
            if type(key) == 'string' then
                local base, label = key:match('^([^%(%)]+)%s*%((.-)%)$')
                if base and rawValue and mw.text.trim(rawValue) ~= '' then
                    local labelText = clean(label)
                    if not labelText then
                        labelText = clean(base)
                    end
                    if labelText then
                        addRow(labelText, rawValue)
                    end
                end
            end
        end
    end

    addCustomFields()
    addBracketFields()

    local footerText = args['подвал']
    if footerText and mw.text.trim(footerText) ~= '' then
        container:tag('div')
            :addClass('infobox-footer-block')
            :node(footerText)
    end

    return styles .. tostring(container)
end

return p