Module:Infocard: Difference between revisions
Jump to navigation
Jump to search
>Vinifera7 (This pattern allows the same function to be called, regardless of whether we're calling it via #invoke or from within another module.) |
(Added options to add content above or below the infocard. Use invoker factory from Module:Util. Use template styles at Module:Infocard/styles.css.) |
||
Line 3: | Line 3: | ||
-- Module:Infocard | -- Module:Infocard | ||
-- | -- | ||
-- This module implements Template: | -- This module implements Template:Infocard and is used by a number of other | ||
-- modules to display info cards. | -- modules to display info cards. | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
local | require('Module:No globals') | ||
local m_util = require('Module:Util') | |||
local | -- Should we use the sandbox version of our submodules? | ||
local use_sandbox = m_util.misc.maybe_sandbox('Infocard') | |||
-- | -- The cfg table contains all localisable strings and configuration, to make it | ||
cfg. | -- easier to port this module to another wiki. | ||
local cfg = use_sandbox and mw.loadData('Module:Infocard/config/sandbox') or mw.loadData('Module:Infocard/config') | |||
local i18n = cfg.i18n | |||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
Line 22: | Line 24: | ||
local function _main(args) | local function _main(args) | ||
local | args.heading = args.heading or args.header | ||
: | args.subheading = args.subheading or args.subheader | ||
local | local html = mw.html.create('div') | ||
: | :addClass('info-card') | ||
if args.above then | |||
html | |||
:tag('div') | |||
:addClass('info-card__above') | |||
:node(args.above) | |||
end | |||
local card = mw.html.create('div') | |||
:addClass('info-card__card') | |||
if args.class then | |||
card:addClass(args.class) | |||
end | |||
local header = mw.html.create('div') | |||
:addClass('info-card__header') | |||
header | |||
:tag('div') | :tag('div') | ||
: | :addClass('left') | ||
:wikitext(args.headerleft | :wikitext(args.headerleft or '') | ||
local middle = mw.html.create('div') | local middle = mw.html.create('div') | ||
: | :addClass('middle') | ||
middle | middle | ||
:tag('div') | :tag('div') | ||
: | :addClass('heading') | ||
:wikitext(args. | :wikitext(args.heading) | ||
if args.subheading then | |||
if args. | |||
middle | middle | ||
:tag('div') | :tag('div') | ||
: | :addClass('subheading') | ||
:wikitext(args. | :wikitext(args.subheading) | ||
end | end | ||
header | |||
:node(middle) | :node(middle) | ||
header | |||
:tag('div') | :tag('div') | ||
: | :addClass('right') | ||
:wikitext(args.headerright | :wikitext(args.headerright or '') | ||
card:node(header) | |||
local body = mw.html.create('div') | |||
:addClass('info-card__body') | |||
local | |||
: | |||
local block | local block | ||
for i=1, math.huge do -- repeat until no more blocks are found | |||
if args[i] == nil then | |||
break | |||
end | |||
block = mw.html.create('div') | block = mw.html.create('div') | ||
: | :addClass('block') | ||
if args[i .. 'class'] then | |||
block: | block:addClass(args[i .. 'class']) | ||
end | end | ||
block:node(args[i]) | |||
body:node(block) | |||
end | end | ||
card:node(body) | |||
return tostring( | html:node(card) | ||
if args.below then | |||
html | |||
:tag('div') | |||
:addClass('info-card__below') | |||
:node(args.below) | |||
end | |||
return mw.getCurrentFrame():extensionTag( | |||
'templatestyles', '', {src = cfg.templatestyles} | |||
) .. tostring(html) | |||
end | end | ||
Line 79: | Line 98: | ||
local p = {} | local p = {} | ||
p.main = m_util.misc.invoker_factory(_main, { | |||
wrappers = cfg.wrappers, | |||
}) | |||
p.infocard = p.main | p.infocard = p.main |
Revision as of 21:24, 25 February 2022
The above documentation is transcluded from Module:Infocard/doc.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
-------------------------------------------------------------------------------
--
-- Module:Infocard
--
-- This module implements Template:Infocard and is used by a number of other
-- modules to display info cards.
-------------------------------------------------------------------------------
require('Module:No globals')
local m_util = require('Module:Util')
-- Should we use the sandbox version of our submodules?
local use_sandbox = m_util.misc.maybe_sandbox('Infocard')
-- The cfg table contains all localisable strings and configuration, to make it
-- easier to port this module to another wiki.
local cfg = use_sandbox and mw.loadData('Module:Infocard/config/sandbox') or mw.loadData('Module:Infocard/config')
local i18n = cfg.i18n
-- ----------------------------------------------------------------------------
-- Main function
-- ----------------------------------------------------------------------------
local function _main(args)
args.heading = args.heading or args.header
args.subheading = args.subheading or args.subheader
local html = mw.html.create('div')
:addClass('info-card')
if args.above then
html
:tag('div')
:addClass('info-card__above')
:node(args.above)
end
local card = mw.html.create('div')
:addClass('info-card__card')
if args.class then
card:addClass(args.class)
end
local header = mw.html.create('div')
:addClass('info-card__header')
header
:tag('div')
:addClass('left')
:wikitext(args.headerleft or '')
local middle = mw.html.create('div')
:addClass('middle')
middle
:tag('div')
:addClass('heading')
:wikitext(args.heading)
if args.subheading then
middle
:tag('div')
:addClass('subheading')
:wikitext(args.subheading)
end
header
:node(middle)
header
:tag('div')
:addClass('right')
:wikitext(args.headerright or '')
card:node(header)
local body = mw.html.create('div')
:addClass('info-card__body')
local block
for i=1, math.huge do -- repeat until no more blocks are found
if args[i] == nil then
break
end
block = mw.html.create('div')
:addClass('block')
if args[i .. 'class'] then
block:addClass(args[i .. 'class'])
end
block:node(args[i])
body:node(block)
end
card:node(body)
html:node(card)
if args.below then
html
:tag('div')
:addClass('info-card__below')
:node(args.below)
end
return mw.getCurrentFrame():extensionTag(
'templatestyles', '', {src = cfg.templatestyles}
) .. tostring(html)
end
-- ----------------------------------------------------------------------------
-- Exported functions
-- ----------------------------------------------------------------------------
local p = {}
p.main = m_util.misc.invoker_factory(_main, {
wrappers = cfg.wrappers,
})
p.infocard = p.main
p._main = p.main -- Contingency for modules that are still calling p._main()
return p