Module:Gallery: Difference between revisions
Appearance
Content deleted Content added
Reverting to debug reported problems 1273397623 by Arthurfragoso (talk) |
Refactored argument parsing and gallery building algorithm. There should be no visible difference to existing articles. Ping me if you find any abnormality, or revert the changes. Tag: Reverted |
||
Line 1: | Line 1: | ||
-- This module implements {{gallery}} |
-- This module implements {{gallery}} by wrapping the <gallery> core extension tag. |
||
local p = {} |
local p = {} |
||
Line 7: | Line 7: | ||
local function trim(s) |
local function trim(s) |
||
return mw.ustring.gsub(mw.ustring.gsub(s, '%s', ' '), '^%s*(.-)%s*$', '%1') |
return mw.ustring.gsub(mw.ustring.gsub(s or '', '%s', ' '), '^%s*(.-)%s*$', '%1') |
||
end |
end |
||
local tracking, preview |
local tracking, preview |
||
local function isImage(file) |
|||
local file = trim(file):lower() -- Case insensitive check |
|||
-- Check if it starts with "File:", "Image:", or "Media:" |
|||
prefix = file:match("^(%a+):") |
|||
if prefix and (prefix == "file" or prefix == "image" or prefix == "media") then |
|||
return true |
|||
end |
|||
local valid_extensions = { |
|||
"apng", "djvu", "flac", "gif", "jfi", "jfif", "jif", "jpe", "jpeg", "jpg", |
|||
"m1a", "m1v", "m2a", "m2v", "mid", "mp1", "mp2", "mp3", "mpa", "mpe", "mpeg", "mpg", |
|||
"mpv", "oga", "ogg", "ogv", "opus", "pdf", "png", "stl", "svg", "svgz", "tiff", |
|||
"wav", "wave", "webm", "webp", "xcf" |
|||
} |
|||
-- Extract file extension, of 3 or 4 characters only |
|||
local ext = file:match("%.(%w%w%w%w?)$") |
|||
-- Check if the extension is in the valid list |
|||
if ext then |
|||
for _, valid_ext in ipairs(valid_extensions) do |
|||
if ext == valid_ext then |
|||
table.insert(tracking, '[[Category:Pages using gallery without a media namespace prefix]]') |
|||
return true |
|||
end |
|||
end |
|||
end |
|||
return false |
|||
end |
|||
local function checkarg(k,v) |
local function checkarg(k,v) |
||
Line 97: | Line 128: | ||
end |
end |
||
local virtualgallery = {} |
|||
local gallery = {} |
local gallery = {} |
||
local imageCount = |
local imageCount = 0 |
||
for i = 1, #args do |
|||
local currentfield = trim(args[i]) or '' |
|||
⚫ | |||
⚫ | |||
⚫ | |||
-- Skip empty fields |
|||
⚫ | |||
elseif isImage(currentfield) then |
|||
table.insert(gallery, img .. (alt ~= '' and ('|alt=' .. alt) or '') .. '|' .. caption ) |
|||
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 |
|||
local altCount = 0; -- remove after migration |
|||
-- Run through virtualgallery and builds gallery |
|||
for n = 1, #virtualgallery do |
|||
local img = virtualgallery[n][1] |
|||
local caption = virtualgallery[n][2] or '' |
|||
⚫ | |||
--remove after migration |
|||
if alt ~= '' then |
|||
altCount = altCount + 1 |
|||
end |
|||
table.insert(gallery, img .. |
|||
⚫ | |||
(caption ~= '' and ('|' .. caption) or '')) |
|||
end |
|||
-- For tracking and verifying during migration to the new algorimth. |
|||
-- It can be removed once everything is verified |
|||
if math.ceil(#args / 2) > imageCount then |
|||
if altCount > 0 then |
|||
table.insert(tracking, '[[Category:Pages using gallery with potential alt text mismatch]]') |
|||
--else |
|||
-- table.insert(tracking, '[[Category:Pages using gallery with extra empty fields]]') |
|||
end |
end |
||
end |
end |
Revision as of 03:28, 3 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}} by wrapping the <gallery> core extension tag.
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 or '', '%s', ' '), '^%s*(.-)%s*$', '%1')
end
local tracking, preview
local function isImage(file)
local file = trim(file):lower() -- Case insensitive check
-- Check if it starts with "File:", "Image:", or "Media:"
prefix = file:match("^(%a+):")
if prefix and (prefix == "file" or prefix == "image" or prefix == "media") then
return true
end
local valid_extensions = {
"apng", "djvu", "flac", "gif", "jfi", "jfif", "jif", "jpe", "jpeg", "jpg",
"m1a", "m1v", "m2a", "m2v", "mid", "mp1", "mp2", "mp3", "mpa", "mpe", "mpeg", "mpg",
"mpv", "oga", "ogg", "ogv", "opus", "pdf", "png", "stl", "svg", "svgz", "tiff",
"wav", "wave", "webm", "webp", "xcf"
}
-- Extract file extension, of 3 or 4 characters only
local ext = file:match("%.(%w%w%w%w?)$")
-- Check if the extension is in the valid list
if ext then
for _, valid_ext in ipairs(valid_extensions) do
if ext == valid_ext then
table.insert(tracking, '[[Category:Pages using gallery without a media namespace prefix]]')
return true
end
end
end
return false
end
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 virtualgallery = {}
local gallery = {}
local imageCount = 0
for i = 1, #args do
local currentfield = trim(args[i]) or ''
if currentfield == '' then
-- 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
local altCount = 0; -- remove after migration
-- Run through virtualgallery and builds gallery
for n = 1, #virtualgallery do
local img = virtualgallery[n][1]
local caption = virtualgallery[n][2] or ''
local alt = trim(args['alt' .. n] or '')
--remove after migration
if alt ~= '' then
altCount = altCount + 1
end
table.insert(gallery, img ..
(alt ~= '' and ('|alt=' .. alt) or '') ..
(caption ~= '' and ('|' .. caption) or ''))
end
-- For tracking and verifying during migration to the new algorimth.
-- It can be removed once everything is verified
if math.ceil(#args / 2) > imageCount then
if altCount > 0 then
table.insert(tracking, '[[Category:Pages using gallery with potential alt text mismatch]]')
--else
-- table.insert(tracking, '[[Category:Pages using gallery with extra empty fields]]')
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