Module:ElementPortraitCarousel: Difference between revisions
// via Wikitext Extension for VSCode |
// via Wikitext Extension for VSCode |
||
| Line 21: | Line 21: | ||
carouselClass = "person-portrait-carousel" | carouselClass = "person-portrait-carousel" | ||
} | } | ||
-- Helper function to create a properly formatted image URL | |||
local function formatImageUrl(imageName) | |||
-- Remove any File: or Image: prefix if present | |||
imageName = imageName:gsub('^[Ff]ile:', '') | |||
imageName = imageName:gsub('^[Ii]mage:', '') | |||
-- Format the URL using MediaWiki's makeImageLink function | |||
local imageTitle = mw.title.new('File:' .. imageName) | |||
if not imageTitle then | |||
return '' -- Invalid title | |||
end | |||
-- Use thumb with a large size to get the full image | |||
local imageObj = mw.image.new(imageTitle.text) | |||
if not imageObj then | |||
return '' -- Image doesn't exist | |||
end | |||
return imageObj:url() | |||
end | |||
-- Split portrait field by semicolons | -- Split portrait field by semicolons | ||
| Line 30: | Line 51: | ||
local images = {} | local images = {} | ||
for image in portrait:gmatch("[^;]+") do | for image in portrait:gmatch("[^;]+") do | ||
local imageName = mw.text.trim(image) | |||
local imageUrl = formatImageUrl(imageName) | |||
if imageUrl and imageUrl ~= "" then | |||
table.insert(images, { | |||
name = imageName, | |||
url = imageUrl | |||
}) | |||
end | |||
end | end | ||
return images | return images | ||
| Line 36: | Line 64: | ||
-- Create single image HTML | -- Create single image HTML | ||
local function createSingleImage( | local function createSingleImage(imageData, maxWidth) | ||
return string.format( | return string.format( | ||
'<div class="person-portrait-carousel">' .. | '<div class="person-portrait-carousel">' .. | ||
'<img src="%s" style="max-width:%s;" alt="Portrait" />' .. | '<img src="%s" style="max-width:%s;" alt="Portrait" />' .. | ||
'</div>', | '</div>', | ||
imageData.url, maxWidth | |||
) | ) | ||
end | end | ||
| Line 53: | Line 81: | ||
'<div class="carousel-container">' .. | '<div class="carousel-container">' .. | ||
'<div class="carousel-images" id="carousel-%s">' .. | '<div class="carousel-images" id="carousel-%s">' .. | ||
'<div class="carousel-item carousel-orbital-1"><img src="%s" alt="Portrait 1" /></div>' .. | '<div class="carousel-item carousel-orbital-1" data-index="1"><img src="%s" alt="Portrait 1" /></div>' .. | ||
'<div class="carousel-item carousel-orbital-2"><img src="%s" alt="Portrait 2" /></div>' .. | '<div class="carousel-item carousel-orbital-2" data-index="2"><img src="%s" alt="Portrait 2" /></div>' .. | ||
'</div></div></div>', | '</div></div></div>', | ||
navId, | navId, | ||
images[1], images[2] | images[1].url, images[2].url | ||
) | ) | ||
end | end | ||
| Line 67: | Line 95: | ||
-- Generate carousel items | -- Generate carousel items | ||
for i, | for i, imageData in ipairs(images) do | ||
local class = i == 1 and "carousel-visible" or "carousel-hidden" | local class = i == 1 and "carousel-visible" or "carousel-hidden" | ||
-- Add positioning classes for 3+ images | |||
if i == 2 then | |||
class = class .. " carousel-right" | |||
elseif i == #images then | |||
class = class .. " carousel-left" | |||
end | |||
table.insert(itemsHtml, string.format( | table.insert(itemsHtml, string.format( | ||
'<div class="carousel-item %s"><img src="%s" alt="Portrait %d" /></div>', | '<div class="carousel-item %s" data-index="%d"><img src="%s" alt="Portrait %d" /></div>', | ||
class, | class, i, imageData.url, i | ||
)) | )) | ||
end | end | ||
| Line 79: | Line 114: | ||
'<div class="person-portrait-carousel">' .. | '<div class="person-portrait-carousel">' .. | ||
'<div class="carousel-container">' .. | '<div class="carousel-container">' .. | ||
'<div class="carousel-nav carousel-prev | '<div class="carousel-nav carousel-prev">◀</div>' .. | ||
'<div class="carousel-images" id="carousel-%s">%s</div>' .. | '<div class="carousel-images" id="carousel-%s">%s</div>' .. | ||
'<div class="carousel-nav carousel-next | '<div class="carousel-nav carousel-next">▶</div>' .. | ||
'</div></div>', | '</div></div>', | ||
navId, table.concat(itemsHtml) | |||
) | ) | ||
end | end | ||