Line 1: |
Line 1: |
| local p = {} | | local p = {} |
| + | local cfg = mw.loadData('Module:Navbar/configuration') |
| | | |
− | local getArgs | + | local function get_title_arg(is_collapsible, template) |
− | local ul | + | local title_arg = 1 |
| + | if is_collapsible then title_arg = 2 end |
| + | if template then title_arg = 'template' end |
| + | return title_arg |
| + | end |
| | | |
− | function p.addItem (mini, full, link, descrip, args, url) | + | local function choose_links(template, args) |
| + | -- The show table indicates the default displayed items. |
| + | -- view, talk, edit, hist, move, watch |
| + | -- TODO: Move to configuration. |
| + | local show = {true, true, true, false, false, false} |
| + | if template then |
| + | show[2] = false |
| + | show[3] = false |
| + | local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, |
| + | talk = 2, edit = 3, hist = 4, move = 5, watch = 6} |
| + | -- TODO: Consider removing TableTools dependency. |
| + | for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do |
| + | local num = index[v] |
| + | if num then show[num] = true end |
| + | end |
| + | end |
| + | |
| + | local remove_edit_link = args.noedit |
| + | if remove_edit_link then show[3] = false end |
| + | |
| + | return show |
| + | |
| + | end |
| + | |
| + | local function add_link(link_description, ul, is_mini, font_style) |
| local l | | local l |
− | if url then | + | if link_description.url then |
| l = {'[', '', ']'} | | l = {'[', '', ']'} |
| else | | else |
Line 12: |
Line 41: |
| end | | end |
| ul:tag('li') | | ul:tag('li') |
− | :addClass('nv-'..full) | + | :addClass('nv-' .. link_description.full) |
− | :wikitext(l[1] .. link .. l[2]) | + | :wikitext(l[1] .. link_description.link .. l[2]) |
− | :tag(args.mini and 'abbr' or 'span') | + | :tag(is_mini and 'abbr' or 'span') |
− | :attr('title', descrip..' this template') | + | :attr('title', link_description.html_title) |
− | :cssText(args.fontstyle) | + | :cssText(font_style) |
− | :wikitext(args.mini and mini or full) | + | :wikitext(is_mini and link_description.mini or link_description.full) |
| :done() | | :done() |
| :wikitext(l[3]) | | :wikitext(l[3]) |
| + | :done() |
| end | | end |
| | | |
− | function p.brackets (position, c, args, div) | + | local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) |
− | if args.brackets then | + | |
− | div | + | local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) |
− | :tag('span') | + | if not title then |
− | :css('margin-'..position, '-0.125em')
| + | error(cfg.invalid_title .. title_text) |
− | :cssText(args.fontstyle)
| + | end |
− | :wikitext(c)
| + | local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' |
| + | |
| + | -- TODO: Get link_descriptions and show into the configuration module. |
| + | -- link_descriptions should be easier... |
| + | local link_descriptions = { |
| + | { ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template', |
| + | ['link'] = title.fullText, ['url'] = false }, |
| + | { ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template', |
| + | ['link'] = talkpage, ['url'] = false }, |
| + | { ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template', |
| + | ['link'] = title:fullUrl('action=edit'), ['url'] = true }, |
| + | { ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template', |
| + | ['link'] = title:fullUrl('action=history'), ['url'] = true }, |
| + | { ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template', |
| + | ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, |
| + | { ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template', |
| + | ['link'] = title:fullUrl('action=watch'), ['url'] = true } |
| + | } |
| + | |
| + | local ul = mw.html.create('ul') |
| + | if has_brackets then |
| + | ul:addClass(cfg.classes.brackets) |
| + | :cssText(font_style) |
| + | end |
| + | |
| + | for i, _ in ipairs(displayed_links) do |
| + | if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end |
| end | | end |
| + | return ul:done() |
| + | |
| end | | end |
| | | |
| function p._navbar(args) | | function p._navbar(args) |
− | local show = {true, true, true, false, false, false}
| |
− | local titleArg = 1
| |
| | | |
− | if args.collapsible then | + | -- TODO: We probably don't need both fontstyle and fontcolor... |
− | titleArg = 2
| + | local font_style = args.fontstyle |
− | if not args.plain then args.mini = 1 end
| + | local font_color = args.fontcolor |
− | if args.fontcolor then
| + | local is_collapsible = args.collapsible |
− | args.fontstyle = 'color:' .. args.fontcolor .. ';'
| + | local is_mini = args.mini |
− | end
| + | local is_plain = args.plain |
− | args.style = 'float:left; text-align:left'
| |
− | end
| |
| | | |
− | if args.template then | + | local collapsible_class = nil |
− | titleArg = 'template' | + | if is_collapsible then |
− | show = {true, false, false, false, false, false} | + | collapsible_class = cfg.classes.collapsible |
− | local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} | + | if not is_plain then is_mini = 1 end |
− | for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
| + | if font_color then |
− | local num = index[v]
| + | font_style = (font_style or '') .. '; color: ' .. font_color .. ';' |
− | if num then show[num] = true end
| |
| end | | end |
| end | | end |
| | | |
− | if args.noedit then show[3] = false end
| + | local navbar_style = args.style |
− |
| |
− | local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) | |
− | local title = mw.title.new(mw.text.trim(titleText), 'Template')
| |
− | if not title then
| |
− | error('Invalid title ' .. titleText)
| |
− | end
| |
− | local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
| |
− |
| |
| local div = mw.html.create():tag('div') | | local div = mw.html.create():tag('div') |
| div | | div |
− | :addClass('plainlinks') | + | :addClass(cfg.classes.navbar) |
− | :addClass('hlist') | + | :addClass(cfg.classes.plainlinks) |
− | :addClass('navbar') | + | :addClass(cfg.classes.horizontal_list) |
− | :cssText(args.style) | + | :addClass(collapsible_class) -- we made the determination earlier |
| + | :cssText(navbar_style) |
| | | |
− | if args.mini then div:addClass('mini') end | + | if is_mini then div:addClass(cfg.classes.mini) end |
| | | |
− | if not (args.mini or args.plain) then | + | local box_text = (args.text or cfg.box_text) .. ' ' |
| + | -- the concatenated space guarantees the box text is separated |
| + | if not (is_mini or is_plain) then |
| div | | div |
| :tag('span') | | :tag('span') |
− | :css('word-spacing', 0) | + | :addClass(cfg.classes.box_text) |
− | :cssText(args.fontstyle) | + | :cssText(font_style) |
− | :wikitext(args.text or 'This box:')
| + | :wikitext(box_text) |
− | :wikitext(' ') | |
| end | | end |
| | | |
− | p.brackets('right', '[ ', args, div) | + | local template = args.template |
− | | + | local displayed_links = choose_links(template, args) |
− | ul = div:tag('ul') | + | local has_brackets = args.brackets |
− | if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end | + | local title_arg = get_title_arg(is_collapsible, template) |
− | if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end
| + | local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) |
− | if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end | + | local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) |
− | if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end | + | div:node(list) |
− | if show[5] then | + | |
− | local move = mw.title.new ('Special:Movepage') | + | if is_collapsible then |
− | p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end | + | local title_text_class |
− | if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end
| + | if is_mini then |
− |
| + | title_text_class = cfg.classes.collapsible_title_mini |
− | p.brackets('left', ' ]', args, div)
| + | else |
− |
| + | title_text_class = cfg.classes.collapsible_title_full |
− | if args.collapsible then
| + | end |
− | div | + | div:done() |
− | :done()
| + | :tag('div') |
− | :tag('div')
| + | :addClass(title_text_class) |
− | :css('font-size', '114%') | + | :cssText(font_style) |
− | :css('margin', args.mini and '0 4em' or '0 7em')
| |
− | :cssText(args.fontstyle) | |
| :wikitext(args[1]) | | :wikitext(args[1]) |
| end | | end |
− | | + | |
− | return tostring(div:done()) | + | return mw.getCurrentFrame():extensionTag{ |
| + | name = 'templatestyles', args = { src = cfg.templatestyles } |
| + | } .. tostring(div:done()) |
| end | | end |
| | | |
| function p.navbar(frame) | | function p.navbar(frame) |
− | if not getArgs then | + | return p._navbar(require('Module:Arguments').getArgs(frame)) |
− | getArgs = require('Module:Arguments').getArgs
| |
− | end
| |
− | return p._navbar(getArgs(frame))
| |
| end | | end |
| | | |
| return p | | return p |