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

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

Материал из YastreWiki
Новая страница: «local p = {} local function addRow(builder, label, data) local trimmedData = (data or ''):gsub("^%s*(.-)%s*$", "%1") function p.youtubeChannel(frame) local args = frame:getParent().args if trimmedData ~= '' then builder:tag('tr') :addClass('infobox-row') :tag('th') :addClass('infobox-label') :wikitext(label) :done() :tag('td') :addClass...»
 
мНет описания правки
Метка: ручная отмена
 
(не показано 38 промежуточных версий этого же участника)
Строка 1: Строка 1:
local p = {}
local p = {}


local function addRow(builder, label, data)
local function clean(val)
     local trimmedData = (data or ''):gsub("^%s*(.-)%s*$", "%1")
    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' })


function p.youtubeChannel(frame)
     local args = frame:getParent().args
     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')


    if trimmedData ~= '' then
        local images = mw.text.split(imageParam, '%s*;%s*')
         builder:tag('tr')
        local captions = {}
            :addClass('infobox-row')
        if captionParam then
             :tag('th')
            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')
                 :addClass('infobox-label')
                 :wikitext(label)
                 :wikitext(label)
                :done()
             row:tag('td')
             :tag('td')
                 :addClass('infobox-data')
                 :addClass('infobox-data')
                 :wikitext(trimmedData)
                 :wikitext(val)
                :done()
        end
     end
     end
end
    local root = mw.html.create('table')
    root:addClass('infobox-youtube-channel')


    local title = args['название'] or mw.title.getCurrentTitle().text
local predefinedRows = {
    root:tag('caption')
{ label = 'Настоящее имя', key = 'настоящее_имя' },
        :addClass('infobox-title')
    { label = 'Имя', key = 'имя' },
        :wikitext(title)
    { 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 image = (args['изображение'] or ''):gsub("^%s*(.-)%s*$", "%1")
     local function addBracketFields()
    if image ~= '' then
        for key, rawValue in pairs(args) do
        root:tag('tr')
            if type(key) == 'string' then
            :addClass('infobox-image-row')
                local base, label = key:match('^([^%(%)]+)%s*%((.-)%)$')
            :tag('td')
                if base and rawValue and mw.text.trim(rawValue) ~= '' then
                :attr('colspan', 2)
                    local labelText = clean(label)
                :addClass('infobox-image')
                    if not labelText then
                :wikitext('[[Файл:' .. image .. '|frameless|280px|' .. (args['подпись'] or '') .. ']]')
                        labelText = clean(base)
                  
                    end
        if args['подпись'] and args['подпись']:match('%S') then
                    if labelText then
             root:wikitext('<div class="infobox-caption">' .. args['подпись'] .. '</div>')
                        addRow(labelText, rawValue)
                    end
                 end
             end
         end
         end
     end
     end


     addRow(root, 'Имя', args['имя'])
     addCustomFields()
     addRow(root, 'Дата создания', args['дата создания'])
     addBracketFields()
     addRow(root, 'Подписчики', args['подписчики'])
 
     addRow(root, 'Просмотры', args['просмотры'])
     local footerText = args['подвал']
    addRow(root, 'Ссылка', args['ссылка'])
     if footerText and mw.text.trim(footerText) ~= '' then
    addRow(root, 'Ссылки', args['ссылки'])
        container:tag('div')
            :addClass('infobox-footer-block')
            :node(footerText)
    end


     return tostring(root)
     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