|
|
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 title_arg = 1 |
| | if is_collapsible then title_arg = 2 end |
| | if template then title_arg = 'template' end |
| | return title_arg |
| | end |
|
| |
|
| function p._navbar(args) | | local function choose_links(template, args) |
| local titleArg = 1 | | -- The show table indicates the default displayed items. |
| | | -- view, talk, edit, hist, move, watch |
| if args.collapsible then | | -- TODO: Move to configuration. |
| titleArg = 2 | | local show = {true, true, true, false, false, false} |
| if not args.plain then | | if template then |
| args.mini = 1 | | 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 |
| if args.fontcolor then
| |
| args.fontstyle = 'color:' .. args.fontcolor .. ';'
| |
| end
| |
| args.style = 'float:left; text-align:left; width:6em;'
| |
| end | | end |
|
| |
|
| local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) | | local remove_edit_link = args.noedit |
| local title = mw.title.new(mw.text.trim(titleText), 'Template');
| | 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 |
| | if link_description.url then |
| | l = {'[', '', ']'} |
| | else |
| | l = {'[[', '|', ']]'} |
| | end |
| | ul:tag('li') |
| | :addClass('nv-' .. link_description.full) |
| | :wikitext(l[1] .. link_description.link .. l[2]) |
| | :tag(is_mini and 'abbr' or 'span') |
| | :attr('title', link_description.html_title) |
| | :cssText(font_style) |
| | :wikitext(is_mini and link_description.mini or link_description.full) |
| | :done() |
| | :wikitext(l[3]) |
| | :done() |
| | end |
|
| |
|
| | local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) |
| | |
| | local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) |
| if not title then | | if not title then |
| error('Invalid title ' .. titleText) | | error(cfg.invalid_title .. title_text) |
| end | | end |
| | 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 talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''; | | 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 |
| | return ul:done() |
| | |
| | end |
|
| |
|
| | function p._navbar(args) |
| | |
| | -- TODO: We probably don't need both fontstyle and fontcolor... |
| | local font_style = args.fontstyle |
| | local font_color = args.fontcolor |
| | local is_collapsible = args.collapsible |
| | local is_mini = args.mini |
| | local is_plain = args.plain |
| | |
| | local collapsible_class = nil |
| | if is_collapsible then |
| | collapsible_class = cfg.classes.collapsible |
| | if not is_plain then is_mini = 1 end |
| | if font_color then |
| | font_style = (font_style or '') .. '; color: ' .. font_color .. ';' |
| | end |
| | end |
| | |
| | local navbar_style = args.style |
| 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 |
| | |
| | local template = args.template |
| | local displayed_links = choose_links(template, args) |
| | local has_brackets = args.brackets |
| | local title_arg = get_title_arg(is_collapsible, template) |
| | local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) |
| | local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) |
| | div:node(list) |
|
| |
|
| if args.brackets then | | if is_collapsible then |
| div | | local title_text_class |
| :tag('span')
| | if is_mini then |
| :css('margin-right', '-0.125em')
| | title_text_class = cfg.classes.collapsible_title_mini |
| :cssText(args.fontstyle)
| | else |
| :wikitext('[')
| | title_text_class = cfg.classes.collapsible_title_full |
| :newline();
| | end |
| end
| | div:done() |
| | | :tag('div') |
| local ul = div:tag('ul');
| | :addClass(title_text_class) |
| | | :cssText(font_style) |
| ul
| |
| :tag('li')
| |
| :addClass('nv-view')
| |
| :wikitext('[[' .. title.fullText .. '|')
| |
| :tag('span')
| |
| :attr('title', 'View this template')
| |
| :cssText(args.fontstyle)
| |
| :wikitext(args.mini and 'v' or 'view')
| |
| :done()
| |
| :wikitext(']]')
| |
| :done()
| |
| :tag('li') | |
| :addClass('nv-talk')
| |
| :wikitext('[[' .. talkpage .. '|')
| |
| :tag('span')
| |
| :attr('title', 'Discuss this template')
| |
| :cssText(args.fontstyle)
| |
| :wikitext(args.mini and 't' or 'talk')
| |
| :done()
| |
| :wikitext(']]');
| |
| | |
| if not args.noedit then
| |
| ul
| |
| :tag('li') | |
| :addClass('nv-edit')
| |
| :wikitext('[' .. title:fullUrl('action=edit') .. ' ')
| |
| :tag('span')
| |
| :attr('title', 'Edit this template')
| |
| :cssText(args.fontstyle)
| |
| :wikitext(args.mini and 'e' or 'edit')
| |
| :done()
| |
| :wikitext(']');
| |
| end
| |
| | |
| if args.brackets then
| |
| div | |
| :tag('span') | |
| :css('margin-left', '-0.125em')
| |
| :cssText(args.fontstyle)
| |
| :wikitext(']')
| |
| :newline();
| |
| end
| |
| | |
| if args.collapsible then
| |
| div | |
| :done()
| |
| :tag('span')
| |
| :css('font-size', '110%') | |
| :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 |