Module:Portal pictures
From KYNNpedia
Documentation for this module may be created at Module:Portal pictures/doc
local getArgs = require('Module:Arguments').getArgs local randomModule = require('Module:Random') local yesno = require('Module:Yesno') local slideshowModule = require('Module:Random slideshow') p = {} -- == Utility functions == local function getCleanArgs(frame) return getArgs(frame, { trim = true, removeBlanks = true }) end local function wikiError(message) return mw.html.create('div'):addClass('error'):wikitext(message) end -- replace all newlines in the string with break tags -- slideshow only supports single line captions local function replaceNewlines(s) return mw.ustring.gsub(s, '%c', '<br />') end -- == Argument preparation functions == -- Extracts dates, custom images, and subpages from args local function extractPictures(args) local dates = {} local images = {} local subpages = {} for key, value in pairs(args) do if value then if type(key) == "number" then -- positional parameters correspond to POTD dates table.insert(dates, value) elseif string.sub(key, 1, 1) == "i" then -- named parameters with prefixes "i", "title", "credit", and "caption" -- correspond to custom images local num = string.sub(key, 2) local title = args["title" .. num] local credit = args["credit" .. num] local caption = args["caption" .. num] or "" local image = { file = value, title = title, credit = credit, caption = caption } table.insert(images, image) end end end local subpageMax = tonumber(args['subpagemax']) or 0 if subpageMax > 0 then local root = args['demoroot'] or (mw.title.getCurrentTitle().rootPageTitle.prefixedText) local picturesRoot = root .. '/' .. (args['subpage'] or 'Selected picture') for i = 1, subpageMax do table.insert(subpages, picturesRoot .. '/' .. tostring(i)) end end return dates, images, subpages end local function getDefaultMoreLink(args) local root = args['demoroot'] or (mw.title.getCurrentTitle().rootPageTitle.prefixedText) local picturesPage = args['subpage'] or 'Selected picture' return "[[" .. root .. "/" .. picturesPage .. "|More selected pictures]]" end -- == Formatting functions == -- transclude [[Template:Portal POTD]] local function formatPortalPotd(frame, potdDate) return frame:expandTemplate{ title = "Portal POTD", args = { potdDate, more = 'no' } } end local function formatMoreHtml(more) if not yesno(more, true) then return "" end local moreHtml = mw.html.create('div') :attr("class", "noprint") :attr("style", "margin-top:0.5em; font-weight:bold; width:100%; text-align:right;") :wikitext(more) return tostring(moreHtml) end -- manual recreation of the bottom half of [[Template:Portal POTD]] local function formatPotdText(frame, titleText, creditText, captionText, moreHtml) local res = frame:expandTemplate{ title = "POTD portal layout/text", args = { title = titleText, credit = creditText, caption = captionText, ['margin-top']='0.5em' } } if moreHtml then -- ideally, the "more" text should be trancluded _once_ for the whole box -- but we do it for _every_ image for compatibility with portals, which use numbered subpages res = res .. moreHtml end return res end local function formatFile(filename) local html = mw.html.create('div') :attr("class", "center") :wikitext("[[File:" .. filename .. "|380px]]") return tostring(html) end -- Extract value named "paramName" from a subpage of [[Template:POTD]] local function getPotdPart(frame, potdSubpage, paramName) return frame:expandTemplate{ title = potdSubpage, args = { paramName } } end -- bottom half of [[Template:Portal POTD]] for a POTD subpage local function getPotdText(frame, potdDate, moreHtml) local potdText = getPotdPart(frame, "POTD/" .. potdDate, "portal layout/text") potdText = replaceNewlines(potdText) if moreHtml then potdText = potdText .. moreHtml end return potdText end -- prepare arguments for [[Module:Random slideshow]] -- alternating: image1, text1, image2, text2, ... local function makeSlideShowArgs(frame, dates, images, subpages, more, limit) local slideShowArgs = {} local moreHtml = formatMoreHtml(more) if #dates > 0 then local randomDates = randomModule.main('array', {t=dates, limit=limit}) for _, potdDate in ipairs(randomDates) do local image = getPotdPart(frame, "POTD/" .. potdDate, "image") local image2 = '' if image == '{{{image}}}' then image = getPotdPart(frame, "POTD/" .. potdDate, "image1") image2 = '[[File:' .. getPotdPart(frame, "POTD/" .. potdDate, "image2") .. '|200px|center]]' end local text = image2 .. getPotdText(frame, potdDate, moreHtml) table.insert(slideShowArgs, image) table.insert(slideShowArgs, text) end end if #images > 0 then local randomImages = randomModule.main('array', {t=images, limit=limit}) for _, image in pairs(randomImages) do table.insert(slideShowArgs, image['file']) local text = formatPotdText(frame, image['title'], image['credit'], image['caption'], moreHtml) table.insert(slideShowArgs, text) end end if #subpages > 0 then local randomSubpages = randomModule.main('array', {t=subpages, limit=math.floor(limit / 2)}) for _, subpage in pairs(randomSubpages) do table.insert(slideShowArgs, 'Blank.png') local subpageContent = replaceNewlines(frame:expandTemplate{ title = subpage }) table.insert(slideShowArgs, subpageContent) end end return slideShowArgs end -- == Main functions == -- Create a list gallery of all passed images local function gallery(frame) local args = getCleanArgs(frame) local dates, images, subpages = extractPictures(args) local texts = {} for _, value in pairs(dates) do local topText = '<span id="Template:POTD/' .. value .. '"></span>' .. "[[Template:POTD/" .. value .. "]]\n\n" table.insert(texts, topText .. formatPortalPotd(frame, value)) end for _, image in pairs(images) do local topText = "[[:File:" .. image['file'] .. "]]\n\n" local bottomText = formatPotdText(frame, image['title'], image['credit'], image['caption']) table.insert(texts, topText .. formatFile(image['file']) .. "\n\n" .. bottomText) end for _, subpage in pairs(subpages) do local topText = "[[:" .. subpage .. "]]\n\n" local subpageContent = frame:expandTemplate{ title = subpage } table.insert(texts, topText .. subpageContent) end return frame:preprocess(table.concat(texts, "\n----\n")) end -- Create a slideshow of passed images using [[Module:Random slideshow]] local function slideShow(frame) local args = getCleanArgs(frame) local more = args["more"] or getDefaultMoreLink(args) local dates, images, subpages = extractPictures(args) local limit = 15 local slideShowArgs = makeSlideShowArgs(frame, dates, images, subpages, more, limit) local slideShow = slideshowModule._main(slideShowArgs, false, 'portalSlideshow-container') return frame:extensionTag{ name='templatestyles', args = { src='Module:Random slideshow/styles.css'} } .. frame:preprocess(slideShow) end -- entry point for the module function main(frame) local title = mw.title.getCurrentTitle() if title.isSubpage then return gallery(frame) else return slideShow(frame) end end p.main = main p.slideShow = slideShow p.gallery = gallery return p