Module:DevMbox

From CG Studios Wiki
Revision as of 21:44, 23 November 2025 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Documentation for this module may be created at Module:DevMbox/doc

-- <nowiki>
-- Standalone Mbox module for normal Scribunto (non-Fandom)

local Mbox = {}
local getArgs = require('Module:Arguments').getArgs

-- Helper: args key lookup with optional default value
local function param(args, key, default)
    if args[key] and args[key] ~= '' then
        return args[key]
    end
    return default
end

function Mbox.main(frame)
    local args = getArgs(frame)

    ----------------------------------------
    -- styles
    ----------------------------------------
    local styles = {}
    styles['border-left-color'] = param(args, 'bordercolor')
    styles['background-color']   = param(args, 'bgcolor')

    ----------------------------------------
    -- images
    ----------------------------------------
    local image       = param(args, 'image', '')
    local imagewidth  = param(args, 'imagewidth', '80px')

    local imageadjust = args.imageadjust and ('|' .. args.imageadjust) or ''
    local imagelink   = '|link=' .. (args.imagelink or '')

    local imagewikitext = ''
    if image ~= '' then
        imagewikitext = string.format('[[File:%s|%s%s%s]]',
            image, imagewidth, imageadjust, imagelink
        )
    end

    ----------------------------------------
    -- container setup
    ----------------------------------------
    local id        = param(args, 'id', 'mbox')
    local typeclass = param(args, 'type')
    local collapsed = param(args, 'collapsed')
    local header    = param(args, 'header')
    local asidearg  = param(args, 'aside')
    local textarg   = param(args, 'text')
    local comment   = param(args, 'comment')

    local container = mw.html.create('div')
        :addClass('mbox')
        :addClass(typeclass and ('mbox-type-' .. typeclass))
        :addClass(param(args, 'class'))
        :css(styles)
        :cssText(param(args, 'style'))

    local content = container:tag('div')
        :addClass('mbox__content')

    ----------------------------------------
    -- image block
    ----------------------------------------
    if image ~= '' then
        local img = content:tag('div')
            :addClass('mbox__content__image')
            :addClass('mw-collapsible')
            :attr('id', 'mw-customcollapsible-' .. id)
            :wikitext(imagewikitext)

        if collapsed then
            img:addClass('mw-collapsed')
        end
    end

    ----------------------------------------
    -- main content wrapper
    ----------------------------------------
    local contentwrapper = content:tag('div')
        :addClass('mbox__content__wrapper')

    if header then
        contentwrapper:tag('div')
            :addClass('mbox__content__header')
            :wikitext(header)
    end

    ----------------------------------------
    -- text area
    ----------------------------------------
    if textarg then
        local text = contentwrapper:tag('div')
            :addClass('mbox__content__text')
            :addClass('mw-collapsible')
            :attr('id', 'mw-customcollapsible-' .. id)
            :wikitext(textarg)

        if collapsed then
            text:addClass('mw-collapsed')
        end

        if comment then
            text:tag('div')
                :addClass('mbox__content__text__comment')
                :wikitext(comment)
        end
    end

    ----------------------------------------
    -- close button (note: message removed)
    ----------------------------------------
    contentwrapper:tag('span')
        :addClass('mbox__close')
        :addClass('mw-customtoggle-' .. id)
        :attr('title', 'Dismiss')

    ----------------------------------------
    -- aside
    ----------------------------------------
    if asidearg then
        local aside = content:tag('div')
            :addClass('mbox__content__aside')
            :addClass('mw-collapsible')
            :attr('id', 'mw-customcollapsible-' .. id)
            :wikitext(asidearg)

        if collapsed then
            aside:addClass('mw-collapsed')
        end
    end

    return container
end

return Mbox