Module:Main page: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary Tag: Reverted |
mNo edit summary Tag: Reverted |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local h = {} | local h = {} | ||
-- Function to sanitize box names | |||
function h.sanitizeBoxName(name) | |||
if not name then return '' end | |||
-- Remove illegal characters for page titles | |||
name = string.gsub(name, '[{}<>%[%]|#%+]', '') | |||
-- Replace spaces with underscores | |||
name = string.gsub(name, ' ', '_') | |||
-- Trim | |||
return mw.text.trim(name) | |||
end | |||
-- merge args from frame and frame:getParent() | -- merge args from frame and frame:getParent() | ||
| Line 102: | Line 113: | ||
for _, name in pairs(mw.text.split(mw.text.trim(args[layout]), '%s+')) do | for _, name in pairs(mw.text.split(mw.text.trim(args[layout]), '%s+')) do | ||
if name ~= '' then | if name ~= '' then | ||
name = h.sanitizeBoxName(name) -- Sanitize box name | |||
if not seen_boxes[name] then | if not seen_boxes[name] then | ||
boxes[#boxes + 1] = name | boxes[#boxes + 1] = name | ||
| Line 159: | Line 171: | ||
end | end | ||
-- Check if the box page exists | |||
local box_page = rootpage .. '/' .. box | local box_page = rootpage .. '/' .. box | ||
local template_call | |||
if mw.title.new(box_page).exists then | if mw.title.new(box_page).exists then | ||
-- Use direct template syntax to avoid expansion issues | |||
template_call = '{{:' .. box_page .. '}}' | |||
else | else | ||
-- Use direct template syntax for missing box template | |||
-- Escape special characters to prevent "Bad title" error | |||
local safe_box = mw.text.nowiki(box) | |||
local safe_rootpage = mw.text.nowiki(rootpage) | |||
template_call = '{{Main page box/missing|' .. safe_box .. '|rootpage=' .. safe_rootpage .. '}}' | |||
end | end | ||
-- Add the template call to output | |||
output:wikitext(template_call) | |||
end | end | ||
Revision as of 16:19, 10 December 2025
local p = {}
local h = {}
-- Function to sanitize box names
function h.sanitizeBoxName(name)
if not name then return '' end
-- Remove illegal characters for page titles
name = string.gsub(name, '[{}<>%[%]|#%+]', '')
-- Replace spaces with underscores
name = string.gsub(name, ' ', '_')
-- Trim
return mw.text.trim(name)
end
-- merge args from frame and frame:getParent()
function h.mergeArgs(frame)
local inputArgs = {}
-- Check if frame.args exists
if frame.args then
for k, v in pairs(frame.args) do
v = mw.text.trim(tostring(v))
if v ~= '' then
inputArgs[k] = v
end
end
end
-- Check if frame:getParent() exists and has args
local parent = frame:getParent()
if parent and parent.args then
for k, v in pairs(parent.args) do
v = mw.text.trim(tostring(v))
if v ~= '' then
inputArgs[k] = v
end
end
end
return inputArgs
end
--------------------------------------------------------------------
function p.main(frame)
if not frame then
return "Error: No frame provided"
end
local args = h.mergeArgs(frame)
-- use the rootpage parameter if given, otherwise use the current page name
local rootpage = args['rootpage'] or mw.title.getCurrentTitle().fullText
local layouts = {'desktop', 'tablet', 'mobile'}
-- Initialize layout arguments if they don't exist
for _, layout in pairs(layouts) do
args[layout] = args[layout] or ''
-- Clean up the layout string
args[layout] = mw.text.trim(args[layout]):gsub("\n\n+", "\n"):gsub(" +", " "):gsub(" \n", "\n"):gsub("\n ", "\n")
-- Check if columns are consistent in this layout (only if layout is not empty)
if args[layout] ~= '' then
local warn = false
local last_column_count = 0
local rows = mw.text.split(mw.text.trim(args[layout]), '\n')
for _, row in pairs(rows) do
if row ~= '' then
local current_column_count = #mw.text.split(row, '%s+')
if last_column_count == 0 then
last_column_count = current_column_count
elseif last_column_count ~= current_column_count then
warn = true
end
end
end
if warn then
mw.addWarning('ERROR: the ' .. layout .. ' layout does not have a consistent number of columns in each row. This will result in all the boxes merging into one.')
end
end
end
-- Parse the arguments into CSS variables
local desktop_var = args['desktop'] ~= '' and "--main-page-layout--desktop: '" .. string.gsub(args['desktop'], '\n', "' '") .. "';" or ''
local tablet_var = args['tablet'] ~= '' and "--main-page-layout--tablet: '" .. string.gsub(args['tablet'], '\n', "' '") .. "';" or ''
local mobile_var = args['mobile'] ~= '' and "--main-page-layout--mobile: '" .. string.gsub(args['mobile'], '\n', "' '") .. "';" or ''
-- grid-template-columns overrides
local desktop_cols = mw.text.trim(string.gsub(args['desktop-columns'] or '', ';', ''))
local tablet_cols = mw.text.trim(string.gsub(args['tablet-columns'] or '', ';', ''))
local mobile_cols = mw.text.trim(string.gsub(args['mobile-columns'] or '', ';', ''))
-- Set the variables used by grid-template-columns
if desktop_cols ~= '' then
desktop_var = desktop_var .. '--main-page-layout-columns--desktop: '.. desktop_cols ..';'
end
if tablet_cols ~= '' then
tablet_var = tablet_var .. '--main-page-layout-columns--tablet: '.. tablet_cols ..';'
end
if mobile_cols ~= '' then
mobile_var = mobile_var .. '--main-page-layout-columns--mobile: '.. mobile_cols ..';'
end
local boxes = {}
local seen_boxes = {}
local boxes_in_layout = {}
local missing_boxes = {}
-- Function to parse layout (moved inside main to access args)
local function parse_layout(layout)
if args[layout] and args[layout] ~= '' then
for _, name in pairs(mw.text.split(mw.text.trim(args[layout]), '%s+')) do
if name ~= '' then
name = h.sanitizeBoxName(name) -- Sanitize box name
if not seen_boxes[name] then
boxes[#boxes + 1] = name
seen_boxes[name] = true
end
boxes_in_layout[layout][name] = true
end
end
end
end
-- Loop through the layouts to set up the box lists
for _, layout in pairs(layouts) do
boxes_in_layout[layout] = {}
missing_boxes[layout] = {}
parse_layout(layout)
end
-- Check for missing boxes in each layout
for _, layout in pairs(layouts) do
for _, name in pairs(boxes) do
if not boxes_in_layout[layout][name] then
mw.addWarning('WARNING: the "' .. name .. '" box is missing in the ' .. layout .. ' layout. If this is intentional, you can ignore this warning.')
missing_boxes[layout][name] = true
end
end
end
-- Start our mp-container wrapper
local output = mw.html.create('div')
output:attr('id', 'mp-container')
:cssText(desktop_var .. tablet_var .. mobile_var)
:attr('data-rootpage', rootpage)
-- Loop through boxes and add the relevant main page subpages
for _, box in pairs(boxes) do
-- FIX: Check if VariablesLua exists before using it
if mw.ext and mw.ext.VariablesLua then
mw.ext.VariablesLua.vardefine('imp-variable-id', box)
local pre_vardefine = ''
for _, layout in pairs(layouts) do
pre_vardefine = pre_vardefine .. (missing_boxes[layout][box] and '0' or '1') .. ','
end
mw.ext.VariablesLua.vardefine('imp-variable-display-box', pre_vardefine)
else
-- Alternative: Use frame:preprocess to set variables
frame:preprocess('{{#vardefine:imp-variable-id|' .. box .. '}}')
local pre_vardefine = ''
for _, layout in pairs(layouts) do
pre_vardefine = pre_vardefine .. (missing_boxes[layout][box] and '0' or '1') .. ','
end
frame:preprocess('{{#vardefine:imp-variable-display-box|' .. pre_vardefine .. '}}')
end
-- Check if the box page exists
local box_page = rootpage .. '/' .. box
local template_call
if mw.title.new(box_page).exists then
-- Use direct template syntax to avoid expansion issues
template_call = '{{:' .. box_page .. '}}'
else
-- Use direct template syntax for missing box template
-- Escape special characters to prevent "Bad title" error
local safe_box = mw.text.nowiki(box)
local safe_rootpage = mw.text.nowiki(rootpage)
template_call = '{{Main page box/missing|' .. safe_box .. '|rootpage=' .. safe_rootpage .. '}}'
end
-- Add the template call to output
output:wikitext(template_call)
end
return tostring(output)
end
-- Add show function for compatibility
function p.show(frame)
return p.main(frame)
end
return p