Module:Random slideshow/sandbox
< Module:Random slideshow
Jump to navigation
Jump to search
Revision as of 07:04, 12 June 2018 by blackwiki>Evad37 (set fileflags to get the first 100 images (which in most cases should be all images on the page, or in the section)
Documentation for this module may be created at Module:Random slideshow/sandbox/doc
-- Creates a slideshow gallery where the order is randomised. Intended for use on portal pages.
local p = {}
local excerptModule = require('Module:Excerpt/sandbox')
local randomModule = require('Module:Random')
local redirectModule = require('Module:Redirect')
function cleanupArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
cleanArgs[key] = val
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
function normaliseCssMeasurement(input)
local suffix = string.reverse(string.sub(string.reverse(input), 1, 2))
if ( suffix == 'px' ) or ( suffix == 'em' ) or ( string.sub(suffix, 2, 2) == '%' ) then
return input
else
return input .. 'px'
end
end
function makeOutput(galleryLines, maxWidth)
local randomiseArgs = { ['t'] = galleryLines }
local randomisedLines = randomModule.main('array', randomiseArgs)
local galleryContent = table.concat(randomisedLines, '\n')
local output = '<div style="max-width:' .. normaliseCssMeasurement(maxWidth) .. '; margin:-4em auto;">{{#tag:gallery|' .. galleryContent .. '|mode=slideshow}}</div>'
return output
end
function makeGalleryLine(file, caption, credit)
local title = mw.title.new(file, "File" )
local creditLine = ( credit and '<p><span style="font-size:88%">' .. credit .. '</span>' or '' )
return title.prefixedText .. '{{!}}' .. ( caption or '' ) .. creditLine
end
function makeGalleryLinesTable(args)
local galleryLinesTable = {}
local i = 1
while args[i] do
table.insert(galleryLinesTable, makeGalleryLine(args[i], args[i+1], args['credit' .. (i+1)/2]))
i = i + 2
end
return galleryLinesTable
end
function extractGalleryFiles(wikitext)
local gallery = mw.ustring.match(wikitext, '<gallery.->%s*(.-)%s*</gallery>')
if not gallery then
return false
end
gallery = mw.ustring.gsub(gallery, '|', '{{!}}')
return mw.text.split(gallery, '%c')
end
function extractRegularFiles(wikitext)
local wikitext = mw.ustring.gsub(wikitext, '|thumb', '')
local wikitext = mw.ustring.gsub(wikitext, '|', '{{!}}')
local files = mw.text.split(wikitext, '%c%s*')
for k, v in pairs(files) do
local f = mw.ustring.gsub(v, '^%[%[(.*)%]%]$', '%1')
f = mw.ustring.gsub(f, '|%s*thumb%s*([|%]])', '%1')
f = mw.ustring.gsub(f, '|%s*left%s*([|%]])', '%1')
f = mw.ustring.gsub(f, '|%s*right%s*([|%]])', '%1')
f = mw.ustring.gsub(f, '|%s*center%s*([|%]])', '%1')
f = mw.ustring.gsub(f, '|', '{{!}}')
files[k] = f
end
return files
end
function makeTranscludedGalleryLinesTables(args)
local lines = {}
local i = 1
while args[i] do
-- Get page content
local content, pagename = excerptModule.getContent(args[i])
if not pagename then
return error('Cannot read a valid page for "' .. args[i] .. '"', 0)
elseif not content then
return error('No content found on page "' .. args[i] .. '"', 0)
end
if args['section'..i] then
content = excerptModule.getsection(content, args['section'..i]) or ''
end
content = excerptModule.cleanupText(content)
local galleryFiles = extractGalleryFiles(content)
if galleryFiles then
for _, f in pairs(galleryFiles) do
table.insert(lines, f)
end
end
local otherFiles = excerptModule.parse(content, {fileflags="1-100"}, true)
if otherFiles then
for _, f in pairs(extractRegularFiles(otherFiles)) do
if f and f ~= '' and mw.ustring.sub(f, 1, 5) == 'File:' then
table.insert(lines, f)
end
end
end
i = i + 1
end
return ( #lines > 0 ) and lines or error('No images found')
end
p._main = function(args, transclude)
if not args[1] then
return error(linked and 'No page specified' or 'No page specified', 0)
end
local lines = transclude and makeTranscludedGalleryLinesTables(args) or makeGalleryLinesTable(args)
return makeOutput(lines, args.width or '100%')
end
p.main = function(frame)
local parent = frame.getParent(frame)
local parentArgs = parent.args
local args = cleanupArgs(parentArgs)
local output = p._main(args, false)
return frame:preprocess(output)
end
p.transclude = function(frame)
local parent = frame.getParent(frame)
local parentArgs = parent.args
local args = cleanupArgs(parentArgs)
local output = p._main(args, true)
return frame:preprocess(output)
end
return p