Diff: Module:Collapsible list
Comparing revision #1 (2022-12-29 03:55:22) with revision #2 (2023-02-02 06:54:27).
| Old | New |
|---|---|
local p = {} |
local p = {} |
local function gettitlestyletracking( ts ) |
local function gettitlestyletracking( ts ) |
if not ts then return '' end |
if not ts then return '' end |
ts = mw.ustring.gsub(mw.ustring.lower(ts), '%s', '') |
ts = mw.ustring.gsub(mw.ustring.lower(ts), '%s', '') |
local tsvals = mw.text.split(ts, ';') |
local tsvals = mw.text.split(ts, ';') |
table.sort(tsvals) |
table.sort(tsvals) |
local skey = table.concat(tsvals,';') |
local skey = table.concat(tsvals,';') |
skey = mw.ustring.gsub(skey, '^;', '') |
skey = mw.ustring.gsub(skey, '^;', '') |
skey = mw.text.encode(mw.text.encode(skey),'%c%[%]=') |
skey = mw.text.encode(mw.text.encode(skey),'%c%[%]=') |
if (mw.ustring.match(';' .. ts, ';background:') or mw.ustring.match(';' .. ts, ';background%-color:')) |
if (mw.ustring.match(';' .. ts, ';background:') or mw.ustring.match(';' .. ts, ';background%-color:')) |
and mw.ustring.match(';' .. ts, ';text%-align:') then |
and mw.ustring.match(';' .. ts, ';text%-align:') then |
return '[[Category:Pages using collapsible list with both background and text-align in titlestyle|' .. skey .. ' ]]' |
return '[[Category:Pages using collapsible list with both background and text-align in titlestyle|' .. skey .. ' ]]' |
end |
end |
return '[[Category:Pages using collapsible list without both background and text-align in titlestyle|' .. skey .. ' ]]' |
return '[[Category:Pages using collapsible list without both background and text-align in titlestyle|' .. skey .. ' ]]' |
end |
end |
local function getListItem( data ) |
local function getListItem( data ) |
if not type( data ) == 'string' then |
if not type( data ) == 'string' then |
return '' |
return '' |
end |
end |
return mw.ustring.format( '<li style="line-height: inherit; margin: 0">%s</li>', data ) |
return mw.ustring.format( '<li style="line-height: inherit; margin: 0">%s</li>', data ) |
end |
end |
-- Returns an array containing the keys of all positional arguments |
-- Returns an array containing the keys of all positional arguments |
-- that contain data (i.e. non-whitespace values). |
-- that contain data (i.e. non-whitespace values). |
local function getArgNums( args ) |
local function getArgNums( args ) |
local nums = {} |
local nums = {} |
for k, v in pairs( args ) do |
for k, v in pairs( args ) do |
if type( k ) == 'number' and |
if type( k ) == 'number' and |
k >= 1 and |
k >= 1 and |
math.floor( k ) == k and |
math.floor( k ) == k and |
type( v ) == 'string' and |
type( v ) == 'string' and |
mw.ustring.match( v, '%S' ) then |
mw.ustring.match( v, '%S' ) then |
table.insert( nums, k ) |
table.insert( nums, k ) |
end |
end |
end |
end |
table.sort( nums ) |
table.sort( nums ) |
return nums |
return nums |
end |
end |
-- Formats a list of classes, styles or other attributes. |
-- Formats a list of classes, styles or other attributes. |
local function formatAttributes( attrType, ... ) |
local function formatAttributes( attrType, ... ) |
local attributes = { ... } |
local attributes = { ... } |
local nums = getArgNums( attributes ) |
local nums = getArgNums( attributes ) |
local t = {} |
local t = {} |
for i, num in ipairs( nums ) do |
for i, num in ipairs( nums ) do |
table.insert( t, attributes[ num ] ) |
table.insert( t, attributes[ num ] ) |
end |
end |
if #t == 0 then |
if #t == 0 then |
return '' -- Return the blank string so concatenation will work. |
return '' -- Return the blank string so concatenation will work. |
end |
end |
return mw.ustring.format( ' %s="%s"', attrType, table.concat( t, ' ' ) ) |
return mw.ustring.format( ' %s="%s"', attrType, table.concat( t, ' ' ) ) |
end |
end |
-- TODO: use Module:List. Since the update for this comment is routine, |
-- TODO: use Module:List. Since the update for this comment is routine, |
-- this is blocked without a consensus discussion by |
-- this is blocked without a consensus discussion by |
-- [[MediaWiki_talk:Common.css/Archive_15#plainlist_+_hlist_indentation]] |
-- [[MediaWiki_talk:Common.css/Archive_15#plainlist_+_hlist_indentation]] |
-- if we decide hlist in plainlist in this template isn't an issue, we can use |
-- if we decide hlist in plainlist in this template isn't an issue, we can use |
-- module:list directly |
-- module:list directly |
-- [https://en.iWiki.org/w/index.php?title=Module:Collapsible_list/sandbox&oldid=1130172480] |
-- [https://en.iWiki.org/w/index.php?title=Module:Collapsible_list/sandbox&oldid=1130172480] |
-- is an implementation (that will code rot slightly I expect) |
-- is an implementation (that will code rot slightly I expect) |
local function buildList( args ) |
local function buildList( args ) |
-- Get the list items. |
-- Get the list items. |
local listItems = {} |
local listItems = {} |
local argNums = getArgNums( args ) |
local argNums = getArgNums( args ) |
for i, num in ipairs( argNums ) do |
for i, num in ipairs( argNums ) do |
table.insert( listItems, getListItem( args[ num ] ) ) |
table.insert( listItems, getListItem( args[ num ] ) ) |
end |
end |
if #listItems == 0 then |
if #listItems == 0 then |
return '' |
return '' |
end |
end |
listItems = table.concat( listItems ) |
listItems = table.concat( listItems ) |
-- hack around mw-collapsible show/hide jumpiness by looking for text-alignment |
-- hack around mw-collapsible show/hide jumpiness by looking for text-alignment |
-- by setting a margin if centered |
-- by setting a margin if centered |
local textAlignmentCentered = 'text%-align%s*:%s*center' |
local textAlignmentCentered = 'text%-align%s*:%s*center' |
local centeredTitle = (args.title_style and args.title_style:lower():match(textAlignmentCentered) |
local centeredTitle = (args.title_style and args.title_style:lower():match(textAlignmentCentered) |
or args.titlestyle and args.titlestyle:lower():match(textAlignmentCentered)) |
or args.titlestyle and args.titlestyle:lower():match(textAlignmentCentered)) |
local centeredTitleSpacing |
local centeredTitleSpacing |
if centeredTitle then |
if centeredTitle then |
centeredTitleSpacing = 'margin: 0 4em' |
centeredTitleSpacing = 'margin: 0 4em' |
else |
else |
centeredTitleSpacing = '' |
centeredTitleSpacing = '' |
end |
end |
-- Get class, style and title data. |
-- Get class, style and title data. |
local collapsibleContainerClass = formatAttributes( |
local collapsibleContainerClass = formatAttributes( |
'class', |
'class', |
'collapsible-list', |
'collapsible-list', |
'mw-collapsible', |
'mw-collapsible', |
not args.expand and 'mw-collapsed' |
not args.expand and 'mw-collapsed' |
) |
) |
local collapsibleContainerStyle = formatAttributes( |
local collapsibleContainerStyle = formatAttributes( |
'style', |
'style', |
-- mostly work around .infobox-full-data defaulting to centered |
-- mostly work around .infobox-full-data defaulting to centered |
'text-align: left;', |
'text-align: left;', |
args.frame_style, |
args.frame_style, |
args.framestyle |
args.framestyle |
) |
) |
local collapsibleTitleStyle = formatAttributes( |
local collapsibleTitleStyle = formatAttributes( |
'style', |
'style', |
'line-height: 1.6em; font-weight: bold;', |
'line-height: 1.6em; font-weight: bold;', |
args.title_style, |
args.title_style, |
args.titlestyle |
args.titlestyle |
) |
) |
local jumpyTitleStyle = formatAttributes( |
local jumpyTitleStyle = formatAttributes( |
'style', |
'style', |
centeredTitleSpacing |
centeredTitleSpacing |
) |
) |
local title = args.title or 'List' |
local title = args.title or 'List' |
local ulclass = formatAttributes( 'class', 'mw-collapsible-content', args.hlist and 'hlist' ) |
local ulclass = formatAttributes( 'class', 'mw-collapsible-content', args.hlist and 'hlist' ) |
local ulstyle = formatAttributes( |
local ulstyle = formatAttributes( |
'style', |
'style', |
'margin-top: 0; margin-bottom: 0; line-height: inherit;', |
'margin-top: 0; margin-bottom: 0; line-height: inherit;', |
not args.bullets and 'list-style: none; margin-left: 0;', |
not args.bullets and 'list-style: none; margin-left: 0;', |
args.list_style, |
args.list_style, |
args.liststyle |
args.liststyle |
) |
) |
local hlist_templatestyles = '' |
local hlist_templatestyles = '' |
if args.hlist then |
if args.hlist then |
hlist_templatestyles = mw.getCurrentFrame():extensionTag{ |
hlist_templatestyles = mw.getCurrentFrame():extensionTag{ |
name = 'templatestyles', args = { src = 'Hlist/styles.css' } |
name = 'templatestyles', args = { src = 'Hlist/styles.css' } |
} |
} |
end |
end |
-- Build the list. |
-- Build the list. |
return mw.ustring.format( |
return mw.ustring.format( |
'%s<div%s%s>\n<div%s><div%s>%s</div></div>\n<ul%s%s>%s</ul>\n</div>', |
'%s<div%s%s>\n<div%s><div%s>%s</div></div>\n<ul%s%s>%s</ul>\n</div>', |
hlist_templatestyles, collapsibleContainerClass, collapsibleContainerStyle, |
hlist_templatestyles, collapsibleContainerClass, collapsibleContainerStyle, |
collapsibleTitleStyle, jumpyTitleStyle, title, ulclass, ulstyle, listItems |
collapsibleTitleStyle, jumpyTitleStyle, title, ulclass, ulstyle, listItems |
) .. gettitlestyletracking(args.title_style or args.titlestyle) |
) .. gettitlestyletracking(args.title_style or args.titlestyle) |
end |
end |
function p.main( frame ) |
function p.main( frame ) |
local origArgs |
local origArgs |
if frame == mw.getCurrentFrame() then |
if frame == mw.getCurrentFrame() then |
origArgs = frame:getParent().args |
origArgs = frame:getParent().args |
for k, v in pairs( frame.args ) do |
for k, v in pairs( frame.args ) do |
origArgs = frame.args |
origArgs = frame.args |
break |
break |
end |
end |
else |
else |
origArgs = frame |
origArgs = frame |
end |
end |
local args = {} |
local args = {} |
for k, v in pairs( origArgs ) do |
for k, v in pairs( origArgs ) do |
if type( k ) == 'number' or v ~= '' then |
if type( k ) == 'number' or v ~= '' then |
args[ k ] = v |
args[ k ] = v |
end |
end |
end |
end |
return buildList( args ) |
return buildList( args ) |
end |
end |
return p |
return p |