Module:SocialMedia: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| Line 4: | Line 4: | ||
-- This section defines the social platforms; can be added or deleted without consequence | -- This section defines the social platforms; can be added or deleted without consequence | ||
-- param = handle for the platform; for "x", we also accept "twitter" for legacy | -- param = handle for the platform; for "x", we also accept "twitter" for legacy purposes | ||
-- icon = wiki file for the icon | -- icon = wiki file for the icon | ||
-- prefix = URL prefix | -- prefix = URL prefix | ||
| Line 69: | Line 69: | ||
return args[param] | return args[param] | ||
else | else | ||
for _, alias in ipairs(param) do | for _, alias in ipairs(param) do | ||
local handle = args[alias] | local handle = args[alias] | ||
| Line 80: | Line 79: | ||
end | end | ||
-- | -- Build a clickable icon link (now 32px) with alt text for accessibility: | ||
-- | -- [[File:Something.svg|32px|alt=ALT_TEXT|link=URL]] | ||
local function buildIconLink(iconFile, altText, url) | local function buildIconLink(iconFile, altText, url) | ||
return string.format("[[%s| | return string.format("[[%s|32px|alt=%s|link=%s]]", iconFile, altText, url) | ||
end | end | ||
| Line 91: | Line 90: | ||
for _, platform in ipairs(socialPlatforms) do | for _, platform in ipairs(socialPlatforms) do | ||
local handle = getUserHandle(args, platform.param) | local handle = getUserHandle(args, platform.param) | ||
if handle and handle ~= "" then | if handle and handle ~= "" then | ||
local url = platform.prefix .. handle | local url = platform.prefix .. handle | ||
local iconLink = buildIconLink(platform.icon, platform.label, url) | local iconLink = buildIconLink(platform.icon, platform.label, url) | ||
table.insert(icons, iconLink) | table.insert(icons, iconLink) | ||
| Line 101: | Line 98: | ||
end | end | ||
-- If no handles were provided, return nothing | -- If no handles were provided, return nothing. | ||
if #icons == 0 then | if #icons == 0 then | ||
return "" | return "" | ||
end | end | ||
-- Wrap all icons in a flex container that | -- Wrap all icons in a flex container that clears both sides, | ||
-- | -- so they start from the left margin in a new block. | ||
return table.concat({ | return table.concat({ | ||
'<div style="display: flex; flex-wrap: wrap; gap: 0.5em;">', | '<div style="clear: both; display: flex; flex-wrap: wrap; gap: 0.5em;">', | ||
table.concat(icons, ""), | table.concat(icons, ""), | ||
'</div>' | '</div>' | ||
Revision as of 14:09, 7 February 2025
Documentation for this module may be created at Module:SocialMedia/doc
-- Reusable social media component meant to be called from other modules
local sf = {}
-- This section defines the social platforms; can be added or deleted without consequence
-- param = handle for the platform; for "x", we also accept "twitter" for legacy purposes
-- icon = wiki file for the icon
-- prefix = URL prefix
-- label = used for alt text/screen readers
local socialPlatforms = {
{
param = "facebook",
icon = "File:SocialFacebookIcon.svg",
prefix = "https://www.facebook.com/",
label = "Facebook"
},
{
param = "instagram",
icon = "File:SocialInstagramIcon.svg",
prefix = "https://www.instagram.com/",
label = "Instagram"
},
{
param = "linkedin",
icon = "File:SocialLinkedInIcon.svg",
prefix = "https://www.linkedin.com/",
label = "LinkedIn"
},
{
param = "telegram",
icon = "File:SocialTelegramIcon.svg",
prefix = "https://t.me/",
label = "Telegram"
},
{
param = "threads",
icon = "File:SocialThreadsIcon.svg",
prefix = "https://www.threads.net/",
label = "Threads"
},
{
param = "tiktok",
icon = "File:SocialTikTokIcon.svg",
prefix = "https://www.tiktok.com/",
label = "TikTok"
},
{
-- Multiple aliases: the editor can supply "x" or "twitter"
param = { "x", "twitter" },
icon = "File:SocialXIcon.svg",
prefix = "https://x.com/",
label = "X (Twitter)"
},
{
param = "youtube",
icon = "File:SocialYouTubeIcon.svg",
prefix = "https://www.youtube.com/",
label = "YouTube"
},
}
--------------------------------------------------------------------------------
-- Helper to find the first non-empty user handle from a param or table of params
-- If param is a single string (e.g. "facebook"), we do args["facebook"]
-- If it's a table like { "x", "twitter" }, we check args["x"] then args["twitter"]
--------------------------------------------------------------------------------
local function getUserHandle(args, param)
if type(param) == "string" then
return args[param]
else
for _, alias in ipairs(param) do
local handle = args[alias]
if handle and handle ~= "" then
return handle
end
end
return nil
end
end
-- Build a clickable icon link (now 32px) with alt text for accessibility:
-- [[File:Something.svg|32px|alt=ALT_TEXT|link=URL]]
local function buildIconLink(iconFile, altText, url)
return string.format("[[%s|32px|alt=%s|link=%s]]", iconFile, altText, url)
end
-- Main render function, takes a table of arguments (handles), returns wiki markup with social icons
function sf.render(args)
local icons = {}
for _, platform in ipairs(socialPlatforms) do
local handle = getUserHandle(args, platform.param)
if handle and handle ~= "" then
local url = platform.prefix .. handle
local iconLink = buildIconLink(platform.icon, platform.label, url)
table.insert(icons, iconLink)
end
end
-- If no handles were provided, return nothing.
if #icons == 0 then
return ""
end
-- Wrap all icons in a flex container that clears both sides,
-- so they start from the left margin in a new block.
return table.concat({
'<div style="clear: both; display: flex; flex-wrap: wrap; gap: 0.5em;">',
table.concat(icons, ""),
'</div>'
}, "\n")
end
return sf