|
|
(4 intermediate revisions by 4 users not shown) |
Line 1: |
Line 1: |
| | require('strict') |
| local p = {} | | local p = {} |
| local navbar = require('Module:Navbar')._navbar | | local navbar = require('Module:Navbar')._navbar |
Line 70: |
Line 71: |
| 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 98: |
Line 98: |
|
| |
|
| local titleRow = tbl:tag('tr') | | local titleRow = tbl:tag('tr') |
|
| |
| if args[cfg.arg.titlegroup] then
| |
| titleRow
| |
| :tag('th')
| |
| :attr('scope', 'row')
| |
| :addClass(cfg.class.navbox_group)
| |
| :addClass(args[cfg.arg.titlegroupclass])
| |
| :cssText(args[cfg.arg.basestyle])
| |
| :cssText(args[cfg.arg.groupstyle])
| |
| :cssText(args[cfg.arg.titlegroupstyle])
| |
| :wikitext(args[cfg.arg.titlegroup])
| |
| end
| |
|
| |
|
| local titleCell = titleRow:tag('th'):attr('scope', 'col') | | local titleCell = titleRow:tag('th'):attr('scope', 'col') |
|
| |
| if args[cfg.arg.titlegroup] then
| |
| titleCell
| |
| :css('border-left', '2px solid #fdfdfd')
| |
| :css('width', '100%')
| |
| end
| |
|
| |
|
| local titleColspan = 2 | | local titleColspan = 2 |
| if args[cfg.arg.imageleft] then titleColspan = titleColspan + 1 end | | if args[cfg.arg.imageleft] then titleColspan = titleColspan + 1 end |
| if args[cfg.arg.image] then titleColspan = titleColspan + 1 end | | if args[cfg.arg.image] then titleColspan = titleColspan + 1 end |
| if args[cfg.arg.titlegroup] then titleColspan = titleColspan - 1 end
| |
|
| |
|
| titleCell | | titleCell |
Line 161: |
Line 142: |
| :tag('div') | | :tag('div') |
| -- id for aria-labelledby attribute, if no title | | -- id for aria-labelledby attribute, if no title |
| :attr('id', args[cfg.arg.title] and nil or mw.uri.anchorEncode(args[cfg.arg.above])) | | :attr('id', (not args[cfg.arg.title]) and mw.uri.anchorEncode(args[cfg.arg.above]) or nil) |
| :wikitext(processItem(args[cfg.arg.above], args[cfg.arg.nowrapitems])) | | :wikitext(processItem(args[cfg.arg.above], args[cfg.arg.nowrapitems])) |
| end | | end |
Line 281: |
Line 262: |
| 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.titlegroupclass, cfg.arg.imageclass
| |
| }
| |
| local patterns = { | | local patterns = { |
| '^' .. htmlclass .. '$', | | '^' .. htmlclass .. '$', |
Line 296: |
Line 270: |
| } | | } |
| | | |
| 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 319: |
Line 326: |
| return true | | return true |
| end | | end |
| end
| |
| return false
| |
| end
| |
|
| |
| local function hasTitleGroup()
| |
| if args[cfg.arg.titlegroup] and args[cfg.arg.titlegroup] ~= '' then
| |
| return true
| |
| end | | end |
| return false | | return false |
Line 358: |
Line 358: |
| if isIllegible() then table.insert(cats, cfg.category.illegible) end | | if isIllegible() then table.insert(cats, cfg.category.illegible) end |
| if hasBorders() then table.insert(cats, cfg.category.borders) end | | if hasBorders() then table.insert(cats, cfg.category.borders) end |
| if hasTitleGroup() then table.insert(cats, cfg.category.titlegroup) end
| |
| return cats | | return cats |
| end | | end |
Line 414: |
Line 413: |
| 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 432: |
Line 431: |
| 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 468: |
Line 488: |
|
| |
|
| 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 494: |
Line 514: |
| :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') |