Changes

1,473 bytes added ,  18:13, 29 December 2022
add hlist support, move related strings to cfg, add support for finding classes in any class parameter
Line 70: Line 70:  
end
 
end
   −
-- we will want this later when we want to add tstyles for hlist/plainlist
   
local function has_navbar()
 
local function has_navbar()
 
return args[cfg.arg.navbar] ~= cfg.keyword.navbar_off
 
return args[cfg.arg.navbar] ~= cfg.keyword.navbar_off
Line 262: Line 261:  
end
 
end
   −
-- uses this now to make the needHlistCategory correct
  −
-- to use later for when we add list styles via navbox
   
local function has_list_class(htmlclass)
 
local function has_list_class(htmlclass)
local class_args = { -- rough order of probability of use
  −
cfg.arg.bodyclass, cfg.arg.listclass, cfg.arg.aboveclass,
  −
cfg.arg.belowclass, cfg.arg.titleclass, cfg.arg.navboxclass,
  −
cfg.arg.groupclass, cfg.arg.imageclass
  −
}
   
local patterns = {
 
local patterns = {
 
'^' .. htmlclass .. '$',
 
'^' .. htmlclass .. '$',
Line 277: Line 269:  
}
 
}
 
 
for _, arg in ipairs(class_args) do
+
for arg, _ in pairs(args) do
for _, pattern in ipairs(patterns) do
+
if type(arg) == 'string' and mw.ustring.find(arg, cfg.pattern.class) then
if mw.ustring.find(args[arg] or '', pattern) then
+
for _, pattern in ipairs(patterns) do
return true
+
if mw.ustring.find(args[arg] or '', pattern) then
 +
return true
 +
end
 
end
 
end
 
end
 
end
 
end
 
end
 
return false
 
return false
 +
end
 +
 +
-- there are a lot of list classes in the wild, so we add their TemplateStyles
 +
local function add_list_styles()
 +
local frame = mw.getCurrentFrame()
 +
local function add_list_templatestyles(htmlclass, templatestyles)
 +
if has_list_class(htmlclass) then
 +
return frame:extensionTag{
 +
name = 'templatestyles', args = { src = templatestyles }
 +
}
 +
else
 +
return ''
 +
end
 +
end
 +
 +
local hlist_styles = add_list_templatestyles('hlist', cfg.hlist_templatestyles)
 +
local plainlist_styles = add_list_templatestyles('plainlist', cfg.plainlist_templatestyles)
 +
 +
-- a second workaround for [[phab:T303378]]
 +
-- when that issue is fixed, we can actually use has_navbar not to emit the
 +
-- tag here if we want
 +
if has_navbar() and hlist_styles == '' then
 +
hlist_styles = frame:extensionTag{
 +
name = 'templatestyles', args = { src = cfg.hlist_templatestyles }
 +
}
 +
end
 +
 +
-- hlist -> plainlist is best-effort to preserve old Common.css ordering.
 +
-- this ordering is not a guarantee because most navboxes will emit only
 +
-- one of these classes [hlist_note]
 +
return hlist_styles .. plainlist_styles
 
end
 
end
   Line 387: Line 412:  
end
 
end
   −
local function add_navbox_styles()
+
local function add_navbox_styles(hiding_templatestyles)
 
local frame = mw.getCurrentFrame()
 
local frame = mw.getCurrentFrame()
 
-- This is a lambda so that it doesn't need the frame as a parameter
 
-- This is a lambda so that it doesn't need the frame as a parameter
Line 405: Line 430:  
local child_templatestyles = add_user_styles(args[cfg.arg.child_templatestyles])
 
local child_templatestyles = add_user_styles(args[cfg.arg.child_templatestyles])
   −
-- The 'navbox-styles' div exists for two reasons:
+
-- The 'navbox-styles' div exists to wrap the styles to work around T200206
--  1. To wrap the styles to work around T200206 more elegantly. Instead
+
-- more elegantly. Instead of combinatorial rules, this ends up being linear
--    of combinatorial rules, this ends up being linear number of CSS rules.
+
-- number of CSS rules.
--  2. To allow MobileFrontend to rip the styles out with 'nomobile' such that
  −
--    they are not dumped into the mobile view.
   
return mw.html.create('div')
 
return mw.html.create('div')
 
:addClass(cfg.class.navbox_styles)
 
:addClass(cfg.class.navbox_styles)
:addClass(cfg.class.nomobile)
+
:wikitext(
:wikitext(base_templatestyles .. templatestyles .. child_templatestyles)
+
add_list_styles() .. -- see [hlist_note] applied to 'before base_templatestyles'
 +
base_templatestyles ..
 +
templatestyles ..
 +
child_templatestyles ..
 +
table.concat(hiding_templatestyles)
 +
)
 
:done()
 
:done()
 +
end
 +
 +
-- work around [[phab:T303378]]
 +
-- for each arg: find all the templatestyles strip markers, insert them into a
 +
-- table. then remove all templatestyles markers from the arg
 +
local function move_hiding_templatestyles(args)
 +
local gfind = string.gfind
 +
local gsub = string.gsub
 +
local templatestyles_markers = {}
 +
local strip_marker_pattern = '(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)'
 +
for k, arg in pairs(args) do
 +
for marker in gfind(arg, strip_marker_pattern) do
 +
table.insert(templatestyles_markers, marker)
 +
end
 +
args[k] = gsub(arg, strip_marker_pattern, '')
 +
end
 +
return templatestyles_markers
 
end
 
end
    
function p._navbox(navboxArgs)
 
function p._navbox(navboxArgs)
 
args = navboxArgs
 
args = navboxArgs
 +
local hiding_templatestyles = move_hiding_templatestyles(args)
 
local listnums = {}
 
local listnums = {}
   Line 441: Line 487:     
if border == cfg.keyword.border_none then
 
if border == cfg.keyword.border_none then
res:node(add_navbox_styles())
+
res:node(add_navbox_styles(hiding_templatestyles))
 
local nav = res:tag('div')
 
local nav = res:tag('div')
 
:attr('role', 'navigation')
 
:attr('role', 'navigation')
Line 467: Line 513:  
:wikitext('<div>')
 
:wikitext('<div>')
 
else
 
else
res:node(add_navbox_styles())
+
res:node(add_navbox_styles(hiding_templatestyles))
 
local nav = res:tag('div')
 
local nav = res:tag('div')
 
:attr('role', 'navigation')
 
:attr('role', 'navigation')
Anonymous user