Difference between revisions of "Module:Random slideshow/sandbox"

From blackwiki
Jump to navigation Jump to search
blackwiki>Evad37
(increment i)
m (64 revisions imported)
 
(32 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
-- Creates a slideshow gallery where the order is randomised. Intended for use on portal pages.
 
-- Creates a slideshow gallery where the order is randomised. Intended for use on portal pages.
 
local p = {}
 
local p = {}
local excerptModule =  require('Module:Excerpt/sandbox')
+
local excerptModule =  require('Module:Excerpt/portals')
 
local randomModule = require('Module:Random')
 
local randomModule = require('Module:Random')
 
local redirectModule = require('Module:Redirect')
 
local redirectModule = require('Module:Redirect')
Line 29: Line 29:
 
end
 
end
  
function makeOutput(galleryLines, maxWidth)
+
function isDeclined(val)
 +
if not val then return false end
 +
local declinedWords = " decline declined exclude excluded false none not no n off omit omitted remove removed "
 +
return string.find(declinedWords , ' '..val..' ', 1, true ) and true or false
 +
end
 +
 
 +
function makeOutput(galleryLines, maxWidth, containerClassName, nonRandom)
 
local randomiseArgs = { ['t'] = galleryLines }
 
local randomiseArgs = { ['t'] = galleryLines }
local randomisedLines = randomModule.main('array', randomiseArgs)
+
local sortedLines = nonRandom and galleryLines or randomModule.main('array', randomiseArgs)
local galleryContent = table.concat(randomisedLines, '\n')
+
local galleryContent = table.concat(sortedLines, '\n')
local output = '<div style="max-width:' .. normaliseCssMeasurement(maxWidth) .. '; margin:-4em auto;">{{#tag:gallery|' .. galleryContent  .. '|mode=slideshow}}</div>'
+
local output = '<div class="' .. containerClassName .. '" style="max-width:' .. normaliseCssMeasurement(maxWidth) .. '; margin:-4em auto;">{{#tag:gallery|' .. galleryContent  .. '|mode=slideshow}}</div>'
 
return output
 
return output
 
end
 
end
Line 39: Line 45:
 
function makeGalleryLine(file, caption, credit)
 
function makeGalleryLine(file, caption, credit)
 
local title = mw.title.new(file, "File" )
 
local title = mw.title.new(file, "File" )
local creditLine = ( credit and '<p><span style="font-size:88%">' .. credit .. '</span>' or '' )
+
local creditLine = ( credit and '<p><span style="font-size:88%">' .. credit .. '</span></p>' or '' )
 
return title.prefixedText .. '{{!}}' .. ( caption or '' ) .. creditLine
 
return title.prefixedText .. '{{!}}' .. ( caption or '' ) .. creditLine
 
end
 
end
Line 51: Line 57:
 
end
 
end
 
return galleryLinesTable  
 
return galleryLinesTable  
 +
end
 +
 +
function hasCaption(line)
 +
local caption = mw.ustring.match(line, ".-{{!}}(.*)")
 +
-- require caption to exist with more than 5 characters (avoids sizes etc being mistaken for captions)
 +
return caption and #caption>5 and true or false
 
end
 
end
  
Line 63: Line 75:
  
 
function extractRegularFiles(wikitext)
 
function extractRegularFiles(wikitext)
local wikitext = mw.ustring.gsub(wikitext, '%]%]%[%[File:', ']]\n[[File:')
+
local files = {}
local wikitext = mw.ustring.gsub(wikitext, '|thumb', '')
+
local frame = mw.getCurrentFrame()
local files = mw.text.split(wikitext, '%c')
+
local expand = function(template)
for k, v in pairs(files) do
+
return frame:preprocess(template)
local f = mw.ustring.gsub(v, '|%s*thumb%s*([|%]])', '%1')
+
end
f = mw.ustring.gsub(f, '|%s*left%s*([|%]])', '%1')
+
for file in mw.ustring.gmatch(wikitext, '%b[]' ) do
f = mw.ustring.gsub(f, '|%s*right%s*([|%]])', '%1')
+
-- remove keywords that don't work in galleries
f = mw.ustring.gsub(f, '|%s*center%s*([|%]])', '%1')
+
file = mw.ustring.gsub(file, '|%s*thumb%s*([|%]])', '%1')
f = mw.ustring.gsub(f, '|%s*upright%s*=?%s*.-([|%]])', '%1')
+
file = mw.ustring.gsub(file, '|%s*thumbnail%s*([|%]])', '%1')
f = mw.ustring.gsub(f, '|', '{{!}}')
+
file = mw.ustring.gsub(file, '|%s*left%s*([|%]])', '%1')
f = mw.ustring.gsub(f, '^%[%[(.*)%]%]$', '%1')
+
file = mw.ustring.gsub(file, '|%s*right%s*([|%]])', '%1')
files[k] = f
+
file = mw.ustring.gsub(file, '|%s*center%s*([|%]])', '%1')
 +
file = mw.ustring.gsub(file, '|%s*framed?%s*([|%]])', '%1')
 +
file = mw.ustring.gsub(file, '|%s*frameless%s*([|%]])', '%1')
 +
file = mw.ustring.gsub(file, '|%s*upright%s*([|%]])', '%1')
 +
file = mw.ustring.gsub(file, '|%s*upright%s*=.-([|%]])', '%1')
 +
-- remove spaces prior to captions (which cause pre-formatted text)
 +
file = mw.ustring.gsub(file, '|%s*', '|')
 +
-- remove sizes, which sometimes get mistaken for captions
 +
file = mw.ustring.gsub(file, '|%d*x?%d+px([|%]])', '%1')
 +
-- expand templates
 +
file = mw.ustring.gsub(file, '{%b{}}', expand)
 +
-- remove loose closing braces which don't have matching opening braces
 +
file = mw.ustring.gsub(file, '}}', '')
 +
-- remove loose opening braces which don't have matching closing braces (and the subsequent content, which is probably just a template name)
 +
file = mw.ustring.gsub(file, '{{.-([|%]])', '$1')
 +
-- replace pipes and equals (which would otherwise break the {{#tag:}} syntax)
 +
file = mw.ustring.gsub(file, '|', '{{!}}')
 +
file = mw.ustring.gsub(file, '=', '{{=}}')
 +
-- remove linebreaks
 +
file = mw.ustring.gsub(file, '\n\n', '<br>')
 +
file = mw.ustring.gsub(file, '\n', '')
 +
-- remove surrounding square brackets
 +
file = mw.ustring.gsub(file, '^%[%[', '')
 +
file = mw.ustring.gsub(file, '%]%]$', '')
 +
table.insert(files, file)
 
end
 
end
 
return files
 
return files
Line 80: Line 116:
  
 
function makeTranscludedGalleryLinesTables(args)
 
function makeTranscludedGalleryLinesTables(args)
 +
local namespaceNumber = function(pagetitle)
 +
local titleObject = mw.title.new(pagetitle)
 +
return titleObject and titleObject.namespace
 +
end
 
local lines = {}
 
local lines = {}
 
local i = 1
 
local i = 1
 
while args[i] do
 
while args[i] do
-- Get page content
+
if namespaceNumber(args[i]) == 6 then -- file namespace
local content, pagename = excerptModule.getContent(args[i])
+
-- args[i] is either just the filename, or uses syntax File:Name.jpg##Caption##Credit
if not pagename then
+
local parts = mw.text.split(args[i], '##%s*')
return error('Cannot read a valid page for "' .. args[i] .. '"', 0)
+
local filename = parts[1]
elseif not content then
+
local caption = args['caption'..i] or parts[2] or false
return error('No content found on page "' .. args[i] .. '"', 0)
+
local credit = args['credit'..i] or parts[3] or false
end
+
local line = makeGalleryLine(filename, caption, credit)
if args['section'..i] then
+
table.insert(lines, line)
content = excerptModule.getsection(content, args['section'..i]) or ''
+
else
end
+
local content, pagename = excerptModule.getContent(args[i])
content = excerptModule.cleanupText(content)
+
if not pagename then
 
+
return error('Cannot read a valid page for "' .. args[i] .. '"', 0)
local galleryFiles = extractGalleryFiles(content)
+
elseif not content then
if galleryFiles then
+
return error('No content found on page "' .. args[i] .. '"', 0)
for _, f in pairs(galleryFiles) do
+
end
table.insert(lines, f)
+
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
 +
if hasCaption(f) then
 +
local filename = string.gsub(f, '{{!}}.*', '')
 +
local isOkay = excerptModule.checkImage(filename)
 +
if isOkay then
 +
table.insert(lines, f)
 +
end
 +
end
 +
end
 
end
 
end
end
+
 
+
local otherFiles = excerptModule.parse(content, {fileflags="1-100", filesOnly=true})
local otherFiles = excerptModule.parse(content, {fileflags="1-100"}, true)
+
if otherFiles then
if otherFiles then
+
for _, f in pairs(extractRegularFiles(otherFiles)) do
for _, f in pairs(extractRegularFiles(otherFiles)) do
+
if f and f ~= '' and mw.ustring.sub(f, 1, 5) == 'File:' and hasCaption(f) then
if f and f ~= '' and mw.ustring.sub(f, 1, 5) == 'File:' then
+
table.insert(lines, f)
table.insert(lines, f)
+
end
 
end
 
end
 
end
 
end
 +
 
end
 
end
 
 
i = i + 1
 
i = i + 1
 
end
 
end
Line 116: Line 171:
 
end
 
end
  
p._main = function(args, transclude)
+
p._main = function(args, transclude, containerClassName)
 
if not args[1] then
 
if not args[1] then
 
return error(linked and 'No page specified' or 'No page specified', 0)
 
return error(linked and 'No page specified' or 'No page specified', 0)
 
end
 
end
 
local lines = transclude and makeTranscludedGalleryLinesTables(args) or makeGalleryLinesTable(args)
 
local lines = transclude and makeTranscludedGalleryLinesTables(args) or makeGalleryLinesTable(args)
return makeOutput(lines, args.width or '100%')
+
return makeOutput(lines, args.width or '100%', containerClassName or 'randomSlideshow-container', isDeclined(args.random))
 
end
 
end
  
Line 129: Line 184:
 
local args = cleanupArgs(parentArgs)
 
local args = cleanupArgs(parentArgs)
 
local output = p._main(args, false)
 
local output = p._main(args, false)
return frame:preprocess(output)
+
return frame:extensionTag{ name='templatestyles', args = { src='Random slideshow/styles.css'} }
 +
.. frame:preprocess(output)
 
end
 
end
  
Line 137: Line 193:
 
local args = cleanupArgs(parentArgs)
 
local args = cleanupArgs(parentArgs)
 
local output = p._main(args, true)
 
local output = p._main(args, true)
return frame:preprocess(output)
+
return frame:extensionTag{ name='templatestyles', args = { src='Random slideshow/styles.css'} }
end
+
.. frame:preprocess(output)
 
 
p.excerpts = function(frame)
 
local parent = frame.getParent(frame)
 
local parentArgs = parent.args
 
local args = cleanupArgs(parentArgs)
 
local galleryArgs = {}
 
local options = args -- pick up miscellaneous options: more, errors, fileargs
 
options.paraflags = excerptModule.numberflags(args["paragraphs"] or "") -- parse paragraphs, e.g. "1,3-5" → {"1","3-5"}
 
options.fileflags = excerptModule.numberflags(args["files"] or "") -- parse file numbers
 
if options.more and options.more == "" then options.more = "Read more..." end -- more= is short for this default text
 
local i = 1
 
while args[i] do
 
local excerpt = excerptModule.main({args[i]}, options)
 
local text = '<div style{{=}}text-align:left;>' .. mw.ustring.gsub(excerpt, '%c', '<br>') .. '</div>'
 
table.insert(galleryArgs, 'File:Blank.png')
 
table.insert(galleryArgs, excerpt)
 
i = i + 1
 
end
 
local output = p._main(galleryArgs, false)
 
return frame:preprocess(output)
 
 
end
 
end
  
 
return p
 
return p

Latest revision as of 08:32, 27 September 2020

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/portals')
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 isDeclined(val)
	if not val then return false end
	local declinedWords = " decline declined exclude excluded false none not no n off omit omitted remove removed "
	return string.find(declinedWords , ' '..val..' ', 1, true ) and true or false
end

function makeOutput(galleryLines, maxWidth, containerClassName, nonRandom)
	local randomiseArgs = {	['t'] = galleryLines }
	local sortedLines = nonRandom and galleryLines or randomModule.main('array', randomiseArgs)
	local galleryContent = table.concat(sortedLines, '\n')
	local output = '<div class="' .. containerClassName .. '" 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></p>' 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 hasCaption(line)
	local caption = mw.ustring.match(line, ".-{{!}}(.*)")
	-- require caption to exist with more than 5 characters (avoids sizes etc being mistaken for captions)
	return caption and #caption>5 and true or false
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 files = {}
	local frame = mw.getCurrentFrame()
	local expand = function(template)
		return frame:preprocess(template)
	end
	for file in mw.ustring.gmatch(wikitext, '%b[]' ) do
		-- remove keywords that don't work in galleries
		file = mw.ustring.gsub(file, '|%s*thumb%s*([|%]])', '%1')
		file = mw.ustring.gsub(file, '|%s*thumbnail%s*([|%]])', '%1')
		file = mw.ustring.gsub(file, '|%s*left%s*([|%]])', '%1')
		file = mw.ustring.gsub(file, '|%s*right%s*([|%]])', '%1')
		file = mw.ustring.gsub(file, '|%s*center%s*([|%]])', '%1')
		file = mw.ustring.gsub(file, '|%s*framed?%s*([|%]])', '%1')
		file = mw.ustring.gsub(file, '|%s*frameless%s*([|%]])', '%1')
		file = mw.ustring.gsub(file, '|%s*upright%s*([|%]])', '%1')
		file = mw.ustring.gsub(file, '|%s*upright%s*=.-([|%]])', '%1')
		-- remove spaces prior to captions (which cause pre-formatted text)
		file = mw.ustring.gsub(file, '|%s*', '|')
		-- remove sizes, which sometimes get mistaken for captions
		file = mw.ustring.gsub(file, '|%d*x?%d+px([|%]])', '%1')
		-- expand templates
		file = mw.ustring.gsub(file, '{%b{}}', expand)
		-- remove loose closing braces which don't have matching opening braces
		file = mw.ustring.gsub(file, '}}', '')
		-- remove loose opening braces which don't have matching closing braces (and the subsequent content, which is probably just a template name)
		file = mw.ustring.gsub(file, '{{.-([|%]])', '$1')
		-- replace pipes and equals (which would otherwise break the {{#tag:}} syntax)
		file = mw.ustring.gsub(file, '|', '{{!}}')
		file = mw.ustring.gsub(file, '=', '{{=}}')
		-- remove linebreaks
		file = mw.ustring.gsub(file, '\n\n', '<br>')
		file = mw.ustring.gsub(file, '\n', '')
		-- remove surrounding square brackets
		file = mw.ustring.gsub(file, '^%[%[', '')
		file = mw.ustring.gsub(file, '%]%]$', '')
		table.insert(files, file)
	end
	return files
end

function makeTranscludedGalleryLinesTables(args)
	local namespaceNumber = function(pagetitle)
		local titleObject = mw.title.new(pagetitle)
		return titleObject and titleObject.namespace
	end
	local lines = {}
	local i = 1
	while args[i] do
		if namespaceNumber(args[i]) == 6 then -- file namespace
			-- args[i] is either just the filename, or uses syntax File:Name.jpg##Caption##Credit
			local parts = mw.text.split(args[i], '##%s*')
			local filename = parts[1]
			local caption = args['caption'..i] or parts[2] or false
			local credit = args['credit'..i] or parts[3] or false
			local line = makeGalleryLine(filename, caption, credit)
			table.insert(lines, line)
		else
			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
					if hasCaption(f) then
						local filename = string.gsub(f, '{{!}}.*', '')
						local isOkay = excerptModule.checkImage(filename)
						if isOkay then
							table.insert(lines, f)
						end
					end
				end
			end
	
			local otherFiles = excerptModule.parse(content, {fileflags="1-100", filesOnly=true})
			if otherFiles then
				for _, f in pairs(extractRegularFiles(otherFiles)) do
					if f and f ~= '' and mw.ustring.sub(f, 1, 5) == 'File:' and hasCaption(f) then
						table.insert(lines, f)
					end
				end
			end
		
		end
		i = i + 1
	end
	return ( #lines > 0 ) and lines or error('No images found')
end

p._main = function(args, transclude, containerClassName)
	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%', containerClassName or 'randomSlideshow-container', isDeclined(args.random))
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:extensionTag{ name='templatestyles', args = { src='Random slideshow/styles.css'} } 
		.. 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:extensionTag{ name='templatestyles', args = { src='Random slideshow/styles.css'} } 
		.. frame:preprocess(output)
end

return p