Module:Gallery: Difference between revisions
Appearance
Content deleted Content added
Refactored argument parsing and gallery building algorithm. There should be no visible difference to existing articles but it provides greater flexibility for future editors using arguments and improves the module's extensibility. Ping me if you find any abnormality, or revert the changes. Tag: Reverted |
Reverting to debug reported problems 1273397623 by Arthurfragoso (talk) |
||
Line 1: | Line 1: | ||
-- This module implements {{gallery}} |
-- This module implements {{gallery}} |
||
local p = {} |
local p = {} |
||
Line 7: | Line 7: | ||
local function trim(s) |
local function trim(s) |
||
return mw.ustring.gsub(mw.ustring.gsub(s |
return mw.ustring.gsub(mw.ustring.gsub(s, '%s', ' '), '^%s*(.-)%s*$', '%1') |
||
⚫ | |||
local function isImage(file) |
|||
local file = trim(file):lower() -- Case insensitive check |
|||
-- Check if it starts with "File:", "Image:", or "Media:" or ends with a file extension of 3 to 4 characters |
|||
if file:match("^(file:|image:|media:).+") or |
|||
file:match("%.%w%w%w%w?$") then |
|||
return true |
|||
end |
|||
return false |
|||
end |
end |
||
Line 65: | Line 55: | ||
end |
end |
||
if (args.align or '') == 'centre' then |
|||
args.align = 'center' |
args.align = 'center' |
||
end |
end |
||
Line 107: | Line 97: | ||
end |
end |
||
local virtualgallery = {} |
|||
local gallery = {} |
local gallery = {} |
||
local imageCount = |
local imageCount = math.ceil(#args / 2) |
||
⚫ | |||
⚫ | |||
⚫ | |||
-- Skip empty fields |
|||
elseif isImage(currentfield) then |
|||
imageCount = imageCount + 1 |
|||
virtualgallery[imageCount] = { currentfield } |
|||
elseif imageCount > 0 and virtualgallery[imageCount][2] == nil then |
|||
-- In case of multiple captions, use the first and ignore the laters |
|||
virtualgallery[imageCount][2] = currentfield |
|||
end |
|||
end |
|||
⚫ | |||
-- Run through virtualgallery and builds gallery |
|||
⚫ | |||
for n = 1, #virtualgallery do |
|||
local caption = trim(args[i*2] or '') |
|||
local alt = trim(args['alt' .. i] or '') |
|||
⚫ | |||
local alt = trim(args['alt' .. n] or '') |
|||
⚫ | |||
⚫ | |||
table.insert(gallery, img .. |
|||
⚫ | |||
(caption ~= '' and ('|' .. caption) or '')) |
|||
end |
end |
||
Revision as of 04:17, 2 February 2025
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This Lua module is used on approximately 15,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
![]() | This module depends on the following other modules: |
![]() | This module uses TemplateStyles: |
Implements {{gallery}}
Tracking categories
-- This module implements {{gallery}}
local p = {}
local templatestyles = 'Module:Gallery/styles.css'
local yesno = require('Module:Yesno')
local function trim(s)
return mw.ustring.gsub(mw.ustring.gsub(s, '%s', ' '), '^%s*(.-)%s*$', '%1')
end
local tracking, preview
local function checkarg(k,v)
if k and type(k) == 'string' then
if k == 'align' or k == 'state' or k == 'style' or k == 'title' or
k == 'width' or k == 'height' or k == 'whitebg' or
k == 'mode' or k == 'footer' or k == 'perrow' or k == 'noborder' or
k:match('^alt%d+$') or k:match('^%d+$') then
-- valid
elseif k == 'captionstyle' then
if not v:match('^text%-align%s*:%s*center[;%s]*$') then
table.insert(tracking, '[[Category:Pages using gallery with the captionstyle parameter]]')
end
else
-- invalid
local vlen = mw.ustring.len(k)
k = mw.ustring.sub(k, 1, (vlen < 25) and vlen or 25)
k = mw.ustring.gsub(k, '[^%w%-_ ]', '?')
table.insert(tracking, '[[Category:Pages using gallery with unknown parameters|' .. k .. ']]')
table.insert(preview, '"' .. k .. '"')
end
end
end
function p.gallery(frame)
-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
local origArgs = (type(frame.getParent) == 'function') and frame:getParent().args or frame
-- ParserFunctions considers the empty string to be false, so to preserve the previous
-- behavior of {{gallery}}, change any empty arguments to nil, so Lua will consider
-- them false too.
local args = {}
tracking, preview = {}, {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
checkarg(k,v)
end
end
if (args.mode or '') == 'packed' and (args.align or '') == '' then
args.align = 'center'
end
if (args.align or '') == 'centre' then
args.align = 'center'
end
local tbl = mw.html.create('div')
tbl:addClass('mod-gallery')
if args.state then
tbl
:addClass('mod-gallery-collapsible')
:addClass('collapsible')
:addClass(args.state)
end
if args.style then
tbl:cssText(args.style)
else
tbl:addClass('mod-gallery-default')
end
if args.align then
tbl:addClass('mod-gallery-' .. args.align:lower())
end
if args.title then
tbl:tag('div')
:addClass('title')
:tag('div')
:wikitext(args.title)
end
local gargs = {}
gargs['class'] = 'nochecker' .. (args.noborder and '' or ' bordered-images')
gargs['widths'] = tonumber(args.width) or 180
gargs['heights'] = tonumber(args.height) or 180
gargs['style'] = args.captionstyle
gargs['perrow'] = args.perrow
gargs['mode'] = args.mode
if yesno(args.whitebg or 'yes') then
gargs['class'] = gargs['class'] .. ' whitebg'
end
local gallery = {}
local imageCount = math.ceil(#args / 2)
for i = 1, imageCount do
local img = trim(args[i*2 - 1] or '')
local caption = trim(args[i*2] or '')
local alt = trim(args['alt' .. i] or '')
if img ~= '' then
table.insert(gallery, img .. (alt ~= '' and ('|alt=' .. alt) or '') .. '|' .. caption )
end
end
tbl:tag('div')
:addClass('main')
:tag('div')
:wikitext(
frame:extensionTag{ name = 'gallery', content = '\n' .. table.concat(gallery,'\n'), args = gargs}
)
if args.footer then
tbl:tag('div')
:addClass('footer')
:tag('div')
:wikitext(args.footer)
end
local trackstr = (#tracking > 0) and table.concat(tracking, '') or ''
if #preview > 0 then
trackstr = require('Module:If preview')._warning({
'Unknown parameters ' .. table.concat(preview, '; ') .. '.'
}) .. trackstr
end
return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} } .. tostring(tbl) .. trackstr
end
return p