Module:Main page: Difference between revisions
Jump to navigation
Jump to search
Updating IMP pages
https://support.wiki.gg>Deleted user 1gWcT7XbLNhUaEEgNxWqUKyA m (Protected "Module:Main page" ([Edit=Allow only users with a confirmed email address] (indefinite) [Move=Allow only administrators] (indefinite))) |
https://support.wiki.gg>Mr Pie 5 (Updating IMP pages) |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local h = {} | |||
-- merge args from frame and frame:getParent() | |||
function h.mergeArgs(frame) | |||
local inputArgs = {} | |||
for k, v in pairs(frame.args) do | |||
v = mw.text.trim(tostring(v)) | |||
if v ~= '' then | |||
inputArgs[k] = v | |||
end | |||
end | |||
for k, v in pairs(frame:getParent().args) do | |||
v = mw.text.trim(v) | |||
if v ~= '' then | |||
inputArgs[k] = v | |||
end | |||
end | |||
return inputArgs | |||
end | |||
-------------------------------------------------------------------- | |||
function p.main(frame) | function p.main(frame) | ||
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 | |||
-- parse the arguments into CSS variables that contain legal syntax for grid-template-areas | -- parse the arguments into CSS variables that contain legal syntax for grid-template-areas | ||
local desktop = "--main-page-layout--desktop: '" .. string.gsub( | local desktop = "--main-page-layout--desktop: '" .. string.gsub(args['desktop'], '\n', "' '") .. "';" | ||
local tablet = "--main-page-layout--tablet: '" .. string.gsub( | local tablet = "--main-page-layout--tablet: '" .. string.gsub(args['tablet' ], '\n', "' '") .. "';" | ||
local mobile = "--main-page-layout--mobile: '" .. string.gsub( | local mobile = "--main-page-layout--mobile: '" .. string.gsub(args['mobile' ], '\n', "' '") .. "';" | ||
-- grid-template-columns | |||
local desktop_cols = trim(string.gsub( | -- grid-template-columns overrides | ||
local tablet_cols = trim(string.gsub( | local desktop_cols = mw.text.trim(string.gsub(args['desktop-columns'] or '', ';', '')) | ||
local mobile_cols = trim(string.gsub( | 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 | if desktop_cols ~= '' then | ||
desktop = desktop .. '--main-page-layout-columns--desktop: '.. desktop_cols ..';' | desktop = desktop .. '--main-page-layout-columns--desktop: '.. desktop_cols ..';' | ||
| Line 31: | Line 53: | ||
end | end | ||
local boxes = {} | local boxes = {} -- list of all boxes | ||
local boxes_in_layout = {} -- list of layouts, then list of all boxes in that layout | |||
local missing_boxes = {} -- list of layouts, then list of boxes that are *not* included in that layout | |||
-- | -- add every box referenced in the layout rules once | ||
function | function parse_layout(layout) | ||
for _, | for _,name in pairs(mw.text.split(args[layout], '%s')) do | ||
boxes[name] = true -- list as set | |||
boxes_in_layout[layout][name] = true | |||
end | end | ||
end | end | ||
-- | local layouts = {'desktop', 'tablet', 'mobile'} | ||
-- we check | |||
for _, | -- loop through the layouts the first time to set up the box lists | ||
for _,layout in pairs(layouts) do | |||
boxes_in_layout[layout] = {} | |||
missing_boxes[layout] = {} | |||
parse_layout(layout) | |||
end | |||
-- then loop through the layouts a second time because we need to compare those completed lists to check for missing boxes | |||
for _,layout in pairs(layouts) do | |||
for name,_ in pairs(boxes) do | |||
if boxes_in_layout[layout][name] ~= true 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 | ||
end | end | ||
-- start our mp-container wrapper, and add our variables from earlier as inline styles to declare them | -- start our mp-container wrapper, and add our variables from earlier as inline styles to declare them | ||
-- the | -- the rootpage is added to the dataset so it's easily accessible by mp-edit-links.js and it doesn't need to make its own API call | ||
local output = ' | local output = mw.html.create() | ||
local container = output:tag('div'):attr('id', 'mp-container'):cssText(desktop .. tablet .. mobile):attr('data-rootpage', rootpage) | |||
-- loop through boxes and add the relevant main page subpages into the output | -- loop through boxes and add the relevant main page subpages into the output | ||
for _,box in pairs( | for box,_ in pairs(boxes) do | ||
if mw.title.new( | mw.ext.VariablesLua.vardefine('imp-variable-id', box) -- using a vardefine lets us pass this directly to the template without going through the user-facing box | ||
local pre_vardefine = '' | |||
for _,layout in pairs(layouts) do | |||
pre_vardefine = pre_vardefine .. (missing_boxes[layout][box] and '0' or '1') .. ',' | |||
end | |||
-- formatted as a psuedo-bitmask to reduce variable usage, "<display-on-destop>, <display-on-tablet>, <display-on-mobile>," each value is 0 or 1 (trailing comma is insignificant) | |||
-- expected to be used with #explode in the template receiving the variable | |||
mw.ext.VariablesLua.vardefine('imp-variable-display-box', pre_vardefine) | |||
if mw.title.new(rootpage .. '/' .. box).exists then | |||
container:wikitext(frame:expandTemplate{ title = ':' .. rootpage .. '/' .. box}) | |||
else | else | ||
container:wikitext(frame:expandTemplate{ title = 'Main page box/missing', args = { box, rootpage = rootpage}}) -- See [[Template:Main page box/missing]] | |||
end | end | ||
end | end | ||
return output | return output | ||