Modul:Vorlage:Auflistung: Unterschied zwischen den Versionen
(2020-10-02) |
(2020-10-22) |
||
| Zeile 1: | Zeile 1: | ||
local HorizontalList = { suite = "HorizontalList", | local HorizontalList = { suite = "HorizontalList", | ||
serial = "2020-10- | serial = "2020-10-22", | ||
item = 0 } | item = 0 } | ||
-- Horizontal list of items by HTML/CSS list | -- Horizontal list of items by HTML/CSS list | ||
| Zeile 6: | Zeile 6: | ||
local CSS = { classesBlock = { }, | |||
classesSep = { } } | |||
HorizontalList.f = function ( all, altogether, frame ) | HorizontalList.f = function ( all, altogether, apart, frame ) | ||
-- Generate horizontal list from wikitext | -- Generate horizontal list from wikitext | ||
-- Parameter: | -- Parameter: | ||
| Zeile 19: | Zeile 17: | ||
-- each line starting with one of * or # | -- each line starting with one of * or # | ||
-- altogether -- true, if nowrap around each regular item | -- altogether -- true, if nowrap around each regular item | ||
-- apart -- string, with separator, if desired | |||
-- frame -- object, if available | -- frame -- object, if available | ||
-- Returns string | -- Returns string | ||
| Zeile 42: | Zeile 41: | ||
end -- for i | end -- for i | ||
if got then | if got then | ||
r = HorizontalList.fiat( got, list, altogether, frame ) | r = HorizontalList.fiat( got, | ||
list, | |||
altogether, | |||
apart, | |||
frame ) | |||
else | else | ||
r = "" | r = "" | ||
| Zeile 59: | Zeile 62: | ||
HorizontalList.fiat = function ( all, advance, altogether, frame ) | HorizontalList.fiat = function ( all, advance, altogether, apart, frame ) | ||
-- Generate horizontal list from | -- Generate horizontal list from item sequence | ||
-- Parameter: | -- Parameter: | ||
-- all -- table, with sequence of items | -- all -- table, with sequence of items | ||
| Zeile 66: | Zeile 69: | ||
-- advance -- true, if ordered list requested | -- advance -- true, if ordered list requested | ||
-- altogether -- true, if nowrap around each item | -- altogether -- true, if nowrap around each item | ||
-- apart -- string, with separator, if desired | |||
-- frame -- object, if available | -- frame -- object, if available | ||
-- Returns string | -- Returns string | ||
| Zeile 72: | Zeile 76: | ||
local e | local e | ||
if #all > 1 then | if #all > 1 then | ||
local ou, s | local es, ou, s | ||
if advance then | if advance then | ||
s = "ol" | s = "ol" | ||
| Zeile 79: | Zeile 83: | ||
end | end | ||
ou = mw.html.create( s ) | ou = mw.html.create( s ) | ||
if type( | for k, v in pairs( CSS.classesBlock ) do | ||
for | ou:addClass( v ) | ||
end -- for k, v | |||
end -- for | if type( apart ) == "string" then | ||
es = mw.html.create( "span" ) | |||
:wikitext( apart ) | |||
for k, v in pairs( CSS.classesSep ) do | |||
es:addClass( v ) | |||
end -- for k, v | |||
end | end | ||
for i = 1, #all do | for i = 1, #all do | ||
| Zeile 91: | Zeile 100: | ||
else | else | ||
e:wikitext( tostring( s ) ) | e:wikitext( tostring( s ) ) | ||
end | |||
if es and i < #all then | |||
e:node( es ) | |||
end | end | ||
if altogether then | if altogether then | ||
| Zeile 101: | Zeile 113: | ||
frame = mw.getCurrentFrame() | frame = mw.getCurrentFrame() | ||
end | end | ||
r = frame:extensionTag( "templatestyles", | if CSS.styles then | ||
r = frame:extensionTag( "templatestyles", | |||
nil, | |||
{ src = CSS.styles } ) | |||
else | |||
r = "" | |||
end | |||
r = r .. tostring( ou ) | r = r .. tostring( ou ) | ||
else | else | ||
| Zeile 121: | Zeile 137: | ||
return r or "" | return r or "" | ||
end -- HorizontalList.fiat() | end -- HorizontalList.fiat() | ||
HorizontalList.first = function ( arglist ) | |||
-- Configure CSS environment | |||
-- Parameter: | |||
-- arglist -- table, with optional components | |||
-- styles -- templatestyles page | |||
-- -- string, with name | |||
-- -- table, with title object | |||
-- classesBlock -- class(es) for block element | |||
-- -- string, with class(es) | |||
-- -- table, with particular mapping | |||
-- classesSep -- class(es) for separator element | |||
-- -- string, with class(es) | |||
-- -- table, with particular mapping | |||
if type( arglist ) == "table" then | |||
local s, val | |||
for k, v in pairs( CSS ) do | |||
if type( v ) == "table" then | |||
val = arglist[ k ] | |||
s = type( val ) | |||
if s == "string" then | |||
s = mw.text.trim( val ) | |||
if s ~= "" then | |||
table.insert( v, s ) | |||
end | |||
elseif s == "table" then | |||
for kk, vv in pairs( val ) do | |||
if type( vv ) == "string" then | |||
s = mw.text.trim( vv ) | |||
if s == "" then | |||
s = nil | |||
end | |||
else | |||
s = nil | |||
end | |||
v[ kk ] = s | |||
end -- for kk, vvv | |||
end | |||
end | |||
end -- for k, v | |||
val = arglist.styles | |||
s = type( val ) | |||
if s == "string" then | |||
s = mw.text.trim( val ) | |||
elseif s == "table" and | |||
type( val.prefixedText ) == "string" and | |||
type( val.exists ) == "boolean" and | |||
val.exists then | |||
s = val.prefixedText | |||
else | |||
s = false | |||
end | |||
if s and s:match( ".+:.+%.css$") then | |||
CSS.styles = s | |||
end | |||
end | |||
end -- HorizontalList.first() | |||
| Zeile 129: | Zeile 204: | ||
p.f = function ( frame ) | p.f = function ( frame ) | ||
-- Template call | -- Template call | ||
HorizontalList.first( { styles = frame.args.styles, | |||
classesBlock = frame.args.classesBlock, | |||
classesSep = frame.args.classesSep } ) | |||
return HorizontalList.f( frame.args[ 1 ], | return HorizontalList.f( frame.args[ 1 ], | ||
frame.args.nowrap == "1", | frame.args.nowrap == "1", | ||
frame.args.sep, | |||
frame ) | frame ) | ||
end -- p.f | end -- p.f | ||
| Zeile 140: | Zeile 219: | ||
p.Auflistung = function () | p.Auflistung = function () | ||
-- Module interface | -- Module interface @dewiki | ||
return HorizontalList | return HorizontalList | ||
end | end | ||
return p | return p | ||
Version vom 23. Oktober 2020, 16:48 Uhr
Die Dokumentation für dieses Modul kann unter Modul:Vorlage:Auflistung/doc erstellt werden
local HorizontalList = { suite = "HorizontalList",
serial = "2020-10-22",
item = 0 }
-- Horizontal list of items by HTML/CSS list
local CSS = { classesBlock = { },
classesSep = { } }
HorizontalList.f = function ( all, altogether, apart, frame )
-- Generate horizontal list from wikitext
-- Parameter:
-- all -- string, with wikitext
-- each line starting with one of * or #
-- altogether -- true, if nowrap around each regular item
-- apart -- string, with separator, if desired
-- frame -- object, if available
-- Returns string
local r
if type( all ) == "string" then
local story = mw.text.trim( all )
local s = story:sub( 1, 1 )
if s == "#" or s == "*" then
local list = ( s == "#" )
local items, got
if list then
s = "\n%s*#%s*"
else
s = "\n%s*%*%s*"
end
items = mw.text.split( story:sub( 2 ), s )
for i = 1, #items do
s = mw.text.trim( items[ i ] )
if s ~= "" then
got = got or { }
table.insert( got, s )
end
end -- for i
if got then
r = HorizontalList.fiat( got,
list,
altogether,
apart,
frame )
else
r = ""
end
else
r = story
end
elseif all then
r = tostring( all )
else
r = ""
end
return r
end -- HorizontalList.f()
HorizontalList.fiat = function ( all, advance, altogether, apart, frame )
-- Generate horizontal list from item sequence
-- Parameter:
-- all -- table, with sequence of items
-- each item is a string or a mw.html object
-- advance -- true, if ordered list requested
-- altogether -- true, if nowrap around each item
-- apart -- string, with separator, if desired
-- frame -- object, if available
-- Returns string
local r
if type( all ) == "table" then
local e
if #all > 1 then
local es, ou, s
if advance then
s = "ol"
else
s = "ul"
end
ou = mw.html.create( s )
for k, v in pairs( CSS.classesBlock ) do
ou:addClass( v )
end -- for k, v
if type( apart ) == "string" then
es = mw.html.create( "span" )
:wikitext( apart )
for k, v in pairs( CSS.classesSep ) do
es:addClass( v )
end -- for k, v
end
for i = 1, #all do
e = mw.html.create( "li" )
s = all[ i ]
if type( s ) == "table" then
e:node( s )
else
e:wikitext( tostring( s ) )
end
if es and i < #all then
e:node( es )
end
if altogether then
e:css( "white-space", "nowrap" )
end
ou:newline()
:node( e )
end -- for i
if type( frame ) ~= "table" then
frame = mw.getCurrentFrame()
end
if CSS.styles then
r = frame:extensionTag( "templatestyles",
nil,
{ src = CSS.styles } )
else
r = ""
end
r = r .. tostring( ou )
else
r = all[ 1 ]
if altogether then
if type( r ) == "table" then
r:css( "white-space", "nowrap" )
else
r = mw.html.create( "span" )
:css( "white-space", "nowrap" )
:wikitext( tostring( r ) )
end
end
r = tostring( r )
end
end
return r or ""
end -- HorizontalList.fiat()
HorizontalList.first = function ( arglist )
-- Configure CSS environment
-- Parameter:
-- arglist -- table, with optional components
-- styles -- templatestyles page
-- -- string, with name
-- -- table, with title object
-- classesBlock -- class(es) for block element
-- -- string, with class(es)
-- -- table, with particular mapping
-- classesSep -- class(es) for separator element
-- -- string, with class(es)
-- -- table, with particular mapping
if type( arglist ) == "table" then
local s, val
for k, v in pairs( CSS ) do
if type( v ) == "table" then
val = arglist[ k ]
s = type( val )
if s == "string" then
s = mw.text.trim( val )
if s ~= "" then
table.insert( v, s )
end
elseif s == "table" then
for kk, vv in pairs( val ) do
if type( vv ) == "string" then
s = mw.text.trim( vv )
if s == "" then
s = nil
end
else
s = nil
end
v[ kk ] = s
end -- for kk, vvv
end
end
end -- for k, v
val = arglist.styles
s = type( val )
if s == "string" then
s = mw.text.trim( val )
elseif s == "table" and
type( val.prefixedText ) == "string" and
type( val.exists ) == "boolean" and
val.exists then
s = val.prefixedText
else
s = false
end
if s and s:match( ".+:.+%.css$") then
CSS.styles = s
end
end
end -- HorizontalList.first()
-- Export
local p = { }
p.f = function ( frame )
-- Template call
HorizontalList.first( { styles = frame.args.styles,
classesBlock = frame.args.classesBlock,
classesSep = frame.args.classesSep } )
return HorizontalList.f( frame.args[ 1 ],
frame.args.nowrap == "1",
frame.args.sep,
frame )
end -- p.f
p.HorizontalList = function ()
-- Module interface
return HorizontalList
end
p.Auflistung = function ()
-- Module interface @dewiki
return HorizontalList
end
return p