Чулацаман тӀегӀо

Модуль:Multiple image

ХӀокху модулах лаьцна хааман Модуль:Multiple image/doc агӀо кхолла мега

-- implements [[template:multiple image]]
local p = {}

local autoscaledimages
local nonautoscaledimages

local function isnotempty(s)
    return s and s:match( '^%s*(.-)%s*$' ) ~= ''
end

local function removepx(s)
    return tostring(s or ''):match('^(.*)[Pp][Xx]%s*$') or s
end

local function getdimensions(s, w, h)
    if tonumber(w) and tonumber(h) then
        nonautoscaledimages = true
        return tonumber(w), tonumber(h)
    end
    local file = s and mw.title.new('File:' .. mw.uri.decode(mw.ustring.gsub(s,'%|.*$',''), 'WIKI'))
    file = file and file.file or {width = 0, height = 0}
    w = tonumber(file.width) or 0
    h = tonumber(file.height) or 0
    autoscaledimages = true
    return w, h
end

local function renderImageCell(image, width, height, link, alt, thumbtime, caption, class, textalign, istyle, border)
    local root = mw.html.create('')
    local altstr = ''
    local classstr = class and ('|class=' .. class) or ''
    local linkstr = link and ('|link=' .. link) or ''
    local widthstr = '|' .. tostring(width) .. 'px'
    local thumbtimestr = ''
    if isnotempty( alt ) then
        altstr = '|alt=' .. alt
    end
    if widthstr == '|-nanpx' then
        widthstr = ''
    end
    if isnotempty( thumbtime ) then
        thumbtimestr = '|thumbtime=' .. thumbtime
    end

    local imagediv = root:tag('div')
    imagediv:addClass((border ~= 'infobox') and 'thumbimage' or nil)
    imagediv:cssText(istyle)
    if( height ) then
        imagediv:css('height', tostring(height) .. 'px')
        imagediv:css('overflow', 'hidden')
    end
    imagediv:wikitext('[[file:' .. image .. classstr .. widthstr .. linkstr .. altstr .. thumbtimestr .. ']]')
    if isnotempty(caption) then
        local captiondiv = root:tag('div')
        captiondiv:addClass((border ~= 'infobox') and 'thumbcaption' or nil)
        if isnotempty(textalign) then
            captiondiv:addClass('text-align-' .. textalign)
        end
        captiondiv:wikitext(caption)
    end
    return tostring(root)
end

local function getWidth(w1, w2)
    local w
    if isnotempty(w1) then
        w = tonumber(w1)
    elseif isnotempty(w2) then
        w = tonumber(w2)
    end
    return w or 200
end

local function getPerRow(pstr, ic)
    local pr = mw.text.split(pstr or '', '[^%d][^%d]*')
    if (#pr < 1) then
        pr = {tostring(ic)}
    end
    local r = 1
    local thisrow = tonumber(pr[1] or ic) or ic
    local prownum = {}
    while( ic > 0 ) do
        prownum[r] = thisrow
        ic = ic - thisrow
        r = r + 1
        thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)
    end
    return prownum
end

local function renderMultipleImages(frame)
    local pargs = {}
    local parentArgs = frame:getParent().args
    local args = frame.args
    
    -- Копируем все аргументы
    for k, v in pairs(parentArgs) do pargs[k] = v end

    -- Переносим чеченские параметры в стандартные (Алиасы)
    pargs['direction'] = parentArgs['direction'] or parentArgs['агӀо']
    pargs['align'] = parentArgs['align'] or parentArgs['зона']
    pargs['total_width'] = parentArgs['total_width'] or parentArgs['шоралла']
    pargs['header'] = parentArgs['header'] or parentArgs['title'] or parentArgs['корта']
    pargs['footer'] = parentArgs['footer'] or parentArgs['куьг']
    pargs['perrow'] = parentArgs['perrow'] or parentArgs['могӀарехь']
    pargs['background color'] = parentArgs['background color'] or parentArgs['фонан бос']

    for i = 1, 10 do
        pargs['image' .. i] = parentArgs['image' .. i] or parentArgs['сурт' .. i]
        pargs['width' .. i] = parentArgs['width' .. i] or parentArgs['шоралла' .. i]
        pargs['caption' .. i] = parentArgs['caption' .. i] or parentArgs['куьг' .. i]
    end

    local width = removepx(pargs['width'] or '')
    local dir = pargs['direction'] or ''
    local border = pargs['border'] or args['border'] or ''
    local align = pargs['align'] or args['align'] or (border == 'infobox' and 'center' or '')
    local capalign = pargs['caption_align'] or args['caption_align'] or ''
    local totalwidth = removepx(pargs['total_width'] or args['total_width'] or '')
    local imgstyle = pargs['image_style'] or args['image_style']
    local header = pargs['header'] or ''
    local footer = pargs['footer'] or ''
    local imagegap = tonumber(pargs['image_gap'] or '1') or 1
    local perrow = nil
    local thumbclass = {
        ["left"] = 'tleft',
        ["none"] = 'tnone',
        ["center"] = 'tnone',
        ["centre"] = 'tnone',
        ["right"] = 'tright'
        }

    local imagenumbers = {}
    local imagecount = 0
    for i = 1, 10 do
        if isnotempty(pargs['image' .. i]) then
            table.insert(imagenumbers, i)
            imagecount = imagecount + 1
        end
    end

    perrow = getPerRow(dir == 'vertical' and '1' or pargs['perrow'], imagecount)
    local rowcount = #perrow

    local heights = {}
    local widths = {}
    local widthmax = 0
    local widthsum = {}
    local k = 0
    for r=1,rowcount do
        widthsum[r] = 0
        for c=1,perrow[r] do
            k = k + 1
            if( k <= imagecount ) then
                local i = imagenumbers[k]
                if( isnotempty(totalwidth) ) then
                    widths[k], heights[k] = getdimensions(pargs['image' .. i], pargs['width' .. i], pargs['height' .. i])
                else
                    widths[k] = getWidth(width, pargs['width' .. i])
                end
                widthsum[r] = widthsum[r] + widths[k]
            end
        end
        widthmax = math.max(widthmax, widthsum[r])
    end

    if imagegap < 0 then imagegap = 0 end

    if( isnotempty(totalwidth) ) then
        totalwidth = tonumber(totalwidth)
        widthmax = 0
        local k = 0
        for r=1,rowcount do
            local koffset = k
            local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12
            local ar = {}
            local arsum = 0
            for j=1,perrow[r] do
                k = k + 1
                if( k<= imagecount ) then
                    local i = imagenumbers[k]
                    local h = heights[k] or 0
                    if (h > 0) then ar[j] = widths[k]/h
                    else ar[j] = widths[k]/100 end
                    arsum = arsum + ar[j]
                end
            end
            local ht = tw/arsum
            local ws = 0
            k = koffset
            for j=1,perrow[r] do
                k = k + 1
                if( k<= imagecount ) then
                    widths[k] = math.floor(ar[j]*ht + 0.5)
                    ws = ws + widths[k]
                    if heights[k] then heights[k] = math.floor(ht) end
                end
            end
            widthsum[r] = ws
            widthmax = math.max(widthmax, widthsum[r])
        end
    end

    if( imagecount > 0 ) then
        local bodywidth = 0
        for r=1,rowcount do
            if( widthmax == widthsum[r] ) then
                bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12
            end
        end
        bodywidth = math.max( 100, bodywidth - 8);
        local bg = pargs['background color'] or ''
        local root = mw.html.create('div')
        root:addClass('thumb'):addClass('tmulti'):addClass(thumbclass[align] or 'tright')
        if( align == 'center' or align == 'centre' ) then root:addClass('center') end
        if( bg ~= '' ) then root:css('background-color', bg) end

        local div = root:tag('div')
        div:addClass((border ~= 'infobox') and 'thumbinner multiimageinner' or 'multiimageinner')
        div:css('width', tostring(bodywidth) .. 'px'):css('max-width', tostring(bodywidth) .. 'px')
        
        if( bg ~= '' ) then div:css('background-color', bg) end
        if( border == 'infobox' or border == 'none') then div:css('border', 'none') end
        
        if( isnotempty(header) ) then
            div:tag('div'):addClass('trow'):tag('div'):addClass('theader')
                :css('text-align', pargs['header_align'])
                :css('background-color', (pargs['header_background'] ~= '') and pargs['header_background'] or nil)
                :wikitext(header)
        end

        local k = 0
        for r=1,rowcount do
            local rowdiv = div:tag('div'):addClass('trow');
            for j=1,perrow[r] do
                k = k + 1
                if( k <= imagecount ) then
                    local i = imagenumbers[k]
                    local imagediv = rowdiv:tag('div'):addClass('tsingle')
                    if bg ~= '' then imagediv:css('background-color', bg); end
                    if imagegap > 1 and k < imagecount then
                        if dir == 'vertical' then imagediv:css('margin-bottom', tostring(imagegap) .. 'px')    
                        elseif j < perrow[r] then imagediv:css('margin-right', tostring(imagegap) .. 'px') end
                    end
                    local w = widths[k]
                    imagediv:css('width', tostring(2 + w) .. 'px'):css('max-width', tostring(2 + w) .. 'px')
                    imagediv:wikitext(renderImageCell(pargs['image' .. i], w, heights[k], pargs['link' .. i], pargs['alt' .. i], pargs['thumbtime' .. i], pargs['caption' .. i], pargs['class' .. i], capalign, imgstyle, border))
                end
            end
        end

        if( isnotempty(footer) ) then
            local falign = string.lower(pargs['footer_align'] or args['footer_align'] or '')
            falign = (falign == 'centre') and 'center' or falign
            div:tag('div'):addClass('trow'):css('display', (falign ~= '') and 'flow-root' or 'flex')
                :tag('div'):addClass((border ~= 'infobox') and 'thumbcaption' or nil)
                :css('text-align', (falign ~= '') and falign or nil)
                :css('background-color', (pargs['footer_background'] ~= '') and pargs['footer_background'] or nil)
                :wikitext(footer)
        end
        return tostring(root)
    end
    return ''
end

function p.render( frame )
    autoscaledimages = false
    nonautoscaledimages = false

    -- Безопасная загрузка модуля проверки параметров
    local status, checkModule = pcall(require, 'Module:Check for unknown parameters')
    local tracking = ''
    
    if status and checkModule and checkModule._check then
        tracking = checkModule._check({
            ['unknown'] = frame:expandTemplate{
                title = 'main other',
                args = {'[[Category:Pages using multiple image with unknown parameters|_VALUE_ ]]'}
            },
            ['preview'] = 'Page using [[Template:Multiple image]] with unknown parameter "_VALUE_"',
            ['ignoreblank'] = 'y',
            regexp1 = 'image%d+', regexp2 = 'width%d+', regexp3 = 'height%d+',
            regexp4 = 'class%d+', regexp5 = 'alt%d+', regexp6 = 'link%d+',
            regexp7 = 'thumbtime%d+', regexp8 = 'caption%d+',
            regexp9 = 'сурт%d+', regexp10 = 'шоралла%d+', regexp11 = 'куьг%d+',
            'align', 'direction', 'background color', 'header_background', 
            'header_align', 'header', 'width', 'total_width', 
            'caption_align', 'footer_background', 'footer_align', 'footer', 
            'perrow', 'title', 'image_gap', 'border', 'image_style',
            'агӀо', 'зона', 'шоралла', 'корта', 'куьг', 'могӀарехь', 'фонан бос'
        }, frame:getParent().args)
    end

    return frame:extensionTag {name = 'templatestyles', args = {src = 'Multiple image/styles.css', wrapper = ".tmulti"}}
        .. renderMultipleImages( frame )
        .. (autoscaledimages and '[[Категори:Масштаб авто хийцалуш йолу Multiple image кеп лелош йолу агӀонаш]]' or '')
        .. (nonautoscaledimages and '[[Категори:Куьйгаца масштаб хийцалуш йолу Multiple image кеп лелош йолу агӀонаш]]' or '')
        .. tracking
end

p[''] = function( frame ) return p.render( frame:newChild{title = frame:getTitle()} ) end

return p