Module:GalleryPreview

From The Satanic Wiki
Jump to navigation Jump to search

Documentation for this module may be created at Module:GalleryPreview/doc

--| Module:GalleryPreview (v1.2.0)
--- Creates a preview of images from a gallery page.
--by author: "The JoTS"

-- update 10/28/2017 - Option to include image captions from source gallery.

-- <nowiki>

--% Creates a metatable wrapper for checking arguments.
--@ frArgs (table) The arguments table from a frame object. (i.e. frame.args)
--: (table) "Wrapped" table. Arguments my be indexed with membership operator.
local function argChecker(frArgs)
    return setmetatable({}, {
        __index = function(t, arg)
            if arg:match('^_') then
                return frArgs[arg:gsub('^_','')]
            else
                return assert(frArgs[arg],
                    'Argument "' .. arg .. '" was not provided')
            end
        end
    })
end

-- Gallery object template
local gallery_src = mw.html.create("gallery")
    :attr({navigation = 'true', hideaddbutton = 'true', position = 'center'})

-- Module source
return {
    main = function(frame)
        local args = argChecker(frame.args)

        local gallerypg   = args.gallery_page     -- Link to gallery
        local settings    = args._settings        -- Settings to apply to <gallery>
        local defaultTxt  = args._default         -- Text if link is a redlink
        local portalImg   = args._portal_image    -- Portal image that links to page
        local inclCaption = args._include_caption -- Include image caption
        local numOfImgs  = assert(tonumber(args.number_of_images),
            'Argument "number_of_images" is not an integer')
            - (portalImg and 1 or 0)
        
        gallerypg = mw.title.new(gallerypg)
        
        if gallerypg.exists then
            local contents = gallerypg:getContent()
            local galleries = contents:gmatch(
                "<%s*[Gg]allery.->(.-)</%s*[Gg]allery%s*>")
            
            local images = {} -- will contain all images from all galleries
            local selected = mw.clone(gallery_src)
            
            -- Import all images
            for gallery in galleries do
                for img in mw.text.gsplit(gallery, '\n') do
                    if img:gsub('%s','') ~= '' then
                        table.insert(images, img)
                    end
                end
            end
        
            -- Set randomseed
            math.randomseed(os.time())
            
            -- Select images randomly
            for n = 1, math.min(#images, numOfImgs) do
                local i = math.random(#images)
                local img = inclCaption
                    and images[i]
                    or mw.text.split(images[i], '|')[1] -- omit caption
                
                selected:wikitext(img .. '\n')
                
                table.remove(images, i)
            end
            
            -- Include portal image
            if portalImg then
                selected:wikitext(portalImg .. "|link=" .. gallerypg.text ..'\n')
            end
            
            -- Apply custom settings to gallery
            if settings then
                local settPair =
                    settings:gmatch([=[(%w+):%s*["'](.-)["'][,;]?]=])
                    
                for opt,val in settPair do
                    selected:attr(opt, val)
                end
            end
            
            return frame:preprocess(tostring(selected))
        else
            return frame:preprocess(defaultTxt or
                ("No gallery for {{PAGENAME}} exists yet! You can create it ["
                .. gallerypg:fullUrl("action=edit") .. " here]."))
        end
    end
}