| 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') |