Module:TVChannelList: Difference between revisions
Jump to navigation
Jump to search
PeaceDeadC (talk | contribs) No edit summary |
PeaceDeadC (talk | contribs) No edit summary |
||
Line 110: | Line 110: | ||
-- Function to find and retrieve channel data from appropriate module |
-- Function to find and retrieve channel data from appropriate module |
||
function getChannel(name) |
function getChannel(name) |
||
⚫ | |||
⚫ | |||
local modulesToTry = {} |
local modulesToTry = {} |
||
⚫ | |||
table.insert(modulesToTry, firstLetter) |
|||
-- Handle "The" prefix |
-- Handle "The" prefix |
||
local nameWithoutThe = name:lower():gsub("^the%s*", ""):gsub("%s*", "") |
local nameWithoutThe = name:lower():gsub("^the%s*", ""):gsub("%s*", "") |
||
if nameWithoutThe ~= name:lower() then |
if nameWithoutThe ~= name:lower() then |
||
local theFirstLetter = nameWithoutThe:sub(1, 1):upper() |
|||
if theFirstLetter ~= firstLetter then |
|||
table.insert(modulesToTry, theFirstLetter) |
|||
⚫ | |||
end |
end |
||
⚫ | |||
⚫ | |||
for _, module in ipairs(modulesToTry) do |
for _, module in ipairs(modulesToTry) do |
||
local success, channelModule = pcall(require, 'Module:TVChannelList/' .. module) |
local success, channelModule = pcall(require, 'Module:TVChannelList/' .. module) |
||
if success then |
if success then |
||
⚫ | |||
⚫ | |||
local matchedChannels = {} |
|||
-- First try direct match or aliases |
|||
⚫ | |||
for _, channel in pairs(channelModule.channels) do |
|||
if channel.name:lower() == name:lower() or |
|||
⚫ | |||
⚫ | |||
⚫ | |||
table.insert(matchedChannels, channel) |
|||
end |
|||
end |
|||
⚫ | |||
⚫ | |||
-- If found matches, return results |
|||
⚫ | |||
return nil, i18n.errors.duplicateChannels |
|||
⚫ | |||
⚫ | |||
⚫ | |||
-- If no direct matches found, try redirects |
|||
if channelModule.redirects and channelModule.redirects[name:lower()] then |
|||
return getChannel(channelModule.redirects[name:lower()]) |
|||
end |
end |
||
else |
|||
mw.log('Invalid module structure: Module:TVChannelList/' .. module) |
|||
⚫ | |||
if #matchedChannels > 1 then |
|||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
else |
else |
Revision as of 07:57, 21 February 2025
Documentation for this module may be created at Module:TVChannelList/doc
-- This module handles the display of television network and streaming service information
local p = {}
local arg = ...
local i18n
-- Initialize i18n data for error messages
local function loadI18n()
if not i18n then
i18n = {
errors = {
channelIsEmpty = "Channel name is empty",
channelNotFound = "Channel '%s' not found",
duplicateChannels = "Multiple channels found with this name",
moduleLoadError = "Could not load channel data module"
}
}
end
end
-- Helper function to check if a table contains a value
function table.contains(table, element)
for _, value in pairs(table) do
if value == element then
return true
end
end
return false
end
-- Main function to handle channel information display
function p.channel(frame)
loadI18n()
-- Get template arguments
local args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:TVChannelList'})
-- Check if channel parameter is provided
if not args.channel or args.channel == '' then
return string.format('|-\n| colspan="6" style="text-align:center;vertical-align:middle;color:red;font-weight:bold;" | %s\n',
i18n.errors.channelIsEmpty)
end
-- Get channel data
local channel, error = getChannel(args.channel)
if error then
return string.format('|-\n| colspan="6" style="text-align:center;vertical-align:middle;color:red;font-weight:bold;" | %s\n',
error)
elseif channel then
-- Format channel data, prioritizing template arguments over module data
local channelType = args.type or channel.type or 'Channel'
local genre = args.genre or channel.genre or 'N/A'
local alias = args.alias or channel.alias or 'N/A'
local notes = args.notes or channel.notes or 'N/A'
-- Handle multiple platforms/websites
local platforms = {}
if channel.website and channel.website ~= '' then
table.insert(platforms, string.format('[%s Website]', channel.website))
end
if channel.xvideos and channel.xvideos ~= '' then
table.insert(platforms, string.format('[%s Xvideos Channel]', channel.xvideos))
end
if channel.streaming and channel.streaming ~= '' then
table.insert(platforms, string.format('[%s Streaming]', channel.streaming))
end
local platformsStr = #platforms > 0 and table.concat(platforms, ' & ') or 'N/A'
-- Format row with gathered data
local result = string.format(
'|-\n| style="text-align:center;vertical-align:middle;" | %s\n| style="text-align:center;vertical-align:middle;" | %s\n| style="text-align:center;vertical-align:middle;" | %s\n| style="text-align:center;vertical-align:middle;" | %s\n| style="text-align:center;vertical-align:middle;" | %s\n| style="text-align:center;vertical-align:middle;" | %s\n',
channel.name,
channelType,
platformsStr,
genre,
alias,
notes
)
-- Add categories if in main namespace
local ns = mw.title.getCurrentTitle().namespace
if ns == 0 then
-- Handle multiple categories
if type(channel.category) == "table" then
for _, cat in pairs(channel.category) do
if cat ~= '' then
result = result .. '[[Category:' .. cat .. ']]'
end
end
-- Handle single category
elseif channel.category and channel.category ~= '' then
result = result .. '[[Category:' .. channel.category .. ']]'
end
-- Add default category
result = result .. '[[Category:Television Networks]]'
elseif ns == 2 then
result = result .. '[[Category:User pages using TVChannelList]]'
elseif ns == 118 then
result = result .. '[[Category:Draft pages using TVChannelList]]'
end
return result
else
return string.format('|-\n| colspan="6" style="text-align:center;vertical-align:middle;color:red;font-weight:bold;" | %s\n',
string.format(i18n.errors.channelNotFound, args.channel))
end
end
-- Function to find and retrieve channel data from appropriate module
function getChannel(name)
if not name then return nil, i18n.errors.channelIsEmpty end
local modulesToTry = {}
local firstLetter = name:sub(1, 1):upper()
table.insert(modulesToTry, firstLetter)
-- Handle "The" prefix
local nameWithoutThe = name:lower():gsub("^the%s*", ""):gsub("%s*", "")
if nameWithoutThe ~= name:lower() then
local theFirstLetter = nameWithoutThe:sub(1, 1):upper()
if theFirstLetter ~= firstLetter then
table.insert(modulesToTry, theFirstLetter)
end
end
for _, module in ipairs(modulesToTry) do
local success, channelModule = pcall(require, 'Module:TVChannelList/' .. module)
if success then
if type(channelModule) == "table" and type(channelModule.channels) == "table" then
local matchedChannels = {}
-- First try direct match or aliases
for _, channel in pairs(channelModule.channels) do
if channel.name:lower() == name:lower() or
(channel.aliases and table.contains(channel.aliases, name:lower())) then
table.insert(matchedChannels, channel)
end
end
-- If found matches, return results
if #matchedChannels > 1 then
return nil, i18n.errors.duplicateChannels
elseif #matchedChannels == 1 then
return matchedChannels[1]
end
-- If no direct matches found, try redirects
if channelModule.redirects and channelModule.redirects[name:lower()] then
return getChannel(channelModule.redirects[name:lower()])
end
else
mw.log('Invalid module structure: Module:TVChannelList/' .. module)
end
else
mw.log('Module load failed: Module:TVChannelList/' .. module)
end
end
return nil, string.format(i18n.errors.channelNotFound, name)
end
return p