Module:TVChannelList
Jump to navigation
Jump to search
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 messagesx 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 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