-- Module:RemoteControl -- Builds the Remote Control infobox matching CRT model style
local p = {}
local function trim(s) if s == nil then return nil end s = tostring(s) s = s:gsub('^%s+', ):gsub('%s+$', ) if s == then return nil end return s end
local function css(node, cssText) if cssText and cssText ~= then node:cssText(cssText) end return node end
local function addSectionRow(container, title) local section = container:tag('div') section:addClass('infobox-section-header') css(section, 'grid-column: 1 / -1; text-align:center; padding:0.5em; font-weight:bold;') section:wikitext(title) end
local function addRow(container, label, valueHtmlOrWikitext, isRawHtml) local labelDiv = container:tag('div') labelDiv:addClass('infobox-label') css(labelDiv, 'padding:0.2em 0.4em; font-weight:bold; text-align:left;') labelDiv:wikitext(label)
local valueDiv = container:tag('div') valueDiv:addClass('infobox-value') css(valueDiv, 'padding:0.2em 0.4em;')
if isRawHtml then valueDiv:node(mw.html.create('span'):wikitext(valueHtmlOrWikitext)) else valueDiv:wikitext(valueHtmlOrWikitext) end end
local function addFullRow(container, valueHtmlOrWikitext, cssText, isRawHtml, extraClass) local fullDiv = container:tag('div') css(fullDiv, 'grid-column: 1 / -1; ' .. (cssText or )) if extraClass then fullDiv:addClass(extraClass) end
if isRawHtml then fullDiv:wikitext(valueHtmlOrWikitext) else fullDiv:wikitext(valueHtmlOrWikitext) end end
function p.infobox(frame) local parent = frame:getParent() local args = parent and parent.args or frame.args
local title = mw.title.getCurrentTitle() local pageName = title.text
local brand = trim(args.brand) local model_code = trim(args.model_code) local image_main = trim(args.image_main)
-- Use frame:extensionTag to create a proper <style> tag that won't be escaped local styleTag = frame:extensionTag('templatestyles', , {src = 'Template:CRT model/styles.css'})
local container = mw.html.create('div') container:addClass('infobox') container:addClass('infobox-remote-control') css(container, 'float:right; clear:right; margin:0 0 1em 1em; width:22em; font-size:88%; line-height:1.5em; display:grid; grid-template-columns:auto 1fr; gap:3px; padding:3px;')
-- Title row (no background color, centered, bold) addFullRow( container, (brand or ) .. ' ' .. (model_code or ), 'text-align:center; font-size:125%; font-weight:bold; padding:0.5em;', false, 'infobox-title' )
if image_main then local file = image_main:gsub('^File:', ) addFullRow( container, string.format('File:%s', file), 'text-align:center; padding:0;', false, 'infobox-image' ) end
addSectionRow(container, 'Overview')
-- Brand row using #formredlink (must preprocess) if brand then local brandWikitext = string.format( '%s', brand, brand ) local brandHtml = frame:preprocess(brandWikitext) addRow(container, 'Brand', brandHtml, true) end
if model_code then addRow(container, 'Model', model_code, false) end
addRow(container, 'Type', 'Remote', false)
-- Contribute section addSectionRow(container, 'Contribute')
-- Build the edit link URL local editUrl = mw.uri.fullUrl( "Special:FormStart", { form = "Remote control", page_name = pageName } )
-- Create the edit button div local editDiv = container:tag('div') css(editDiv, 'grid-column: 1 / -1; padding:0.2em 0.4em; text-align:center;')
-- Add edit button with primary action styling editDiv:wikitext('[' .. tostring(editUrl) .. ' ]')
-- Return templatestyles tag + container HTML return styleTag .. tostring(container) end
return p