Modul:Navbar: Forskjell mellom sideversjoner
Hopp til navigering
Hopp til søk
(Let's not assume the error is because of the expensive function limit, it could be something else. Especially for people who import this module into MW 1.21 installations.) |
m (Én sideversjon ble importert) |
||
(40 mellomliggende versjoner av 18 brukere er ikke vist) | |||
Linje 1: | Linje 1: | ||
local p = {} |
local p = {} |
||
local cfg = mw.loadData('Module:Navbar/configuration') |
|||
local function get_title_arg(is_collapsible, template) |
|||
local HtmlBuilder = require('Module:HtmlBuilder') |
|||
local title_arg = 1 |
|||
if is_collapsible then title_arg = 2 end |
|||
function trim(s) |
|||
if template then title_arg = 'template' end |
|||
return mw.ustring.match( s, "^%s*(.-)%s*$" ) |
|||
return title_arg |
|||
end |
end |
||
function |
local function choose_links(template, args) |
||
-- The show table indicates the default displayed items. |
|||
local span = HtmlBuilder.create('span') |
|||
-- 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 |
|||
span |
|||
if remove_edit_link then show[3] = false end |
|||
.addClass('error') |
|||
.css('float', 'left') |
|||
return show |
|||
.css('white-space', 'nowrap') |
|||
.wikitext('Error: ' .. s) |
|||
end |
|||
local function add_link(link_description, ul, is_mini, font_style) |
|||
return tostring(span) |
|||
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 |
end |
||
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) |
|||
function getTitle( pageName ) |
|||
pageName = trim( pageName ); |
|||
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) |
|||
local page_title, talk_page_title; |
|||
if not title then |
|||
error(cfg.invalid_title .. title_text) |
|||
if mw.ustring.sub(pageName, 1, 1) == ':' then |
|||
end |
|||
page_title = mw.title.new( mw.ustring.sub(pageName, 2) ); |
|||
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' |
|||
else |
|||
page_title = mw.title.new( pageName, 'Template' ); |
|||
-- TODO: Get link_descriptions and show into the configuration module. |
|||
end |
|||
-- link_descriptions should be easier... |
|||
local link_descriptions = { |
|||
if page_title then |
|||
{ ['mini'] = 'v', ['full'] = 'vis', ['html_title'] = 'Vis denne malen', |
|||
talk_page_title = page_title.talkPageTitle; |
|||
['link'] = title.fullText, ['url'] = false }, |
|||
else |
|||
{ ['mini'] = 'd', ['full'] = 'diskuter', ['html_title'] = 'Diskuter denne malen', |
|||
talk_page_title = nil; |
|||
['link'] = talkpage, ['url'] = false }, |
|||
end |
|||
{ ['mini'] = 'r', ['full'] = 'rediger', ['html_title'] = 'Rediger denne malen', |
|||
['link'] = 'Special:EditPage/' .. title.fullText, ['url'] = false }, |
|||
return page_title, talk_page_title; |
|||
{ ['mini'] = 'h', ['full'] = 'historikk', ['html_title'] = 'Revisjonshistorikk for denne malen', |
|||
['link'] = 'Special:PageHistory/' .. title.fullText, ['url'] = false }, |
|||
{ ['mini'] = 'f', ['full'] = 'flytt', ['html_title'] = 'Flytt denne malen', |
|||
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, |
|||
{ ['mini'] = 'O', ['full'] = 'Overvåkning', ['html_title'] = 'Overvåk denne malen', |
|||
['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 |
|||
return ul:done() |
|||
end |
end |
||
function _navbar( |
function p._navbar(args) |
||
if not args[1] then |
|||
-- TODO: We probably don't need both fontstyle and fontcolor... |
|||
return error('No name provided') |
|||
local font_style = args.fontstyle |
|||
end |
|||
local font_color = args.fontcolor |
|||
local is_collapsible = args.collapsible |
|||
local good, title, talk_title; |
|||
local is_mini = args.mini |
|||
good, title, talk_title = pcall( getTitle, args[1] ); |
|||
local is_plain = args.plain |
|||
if not good then |
|||
return error(title); |
|||
local collapsible_class = nil |
|||
end |
|||
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') |
|||
div |
|||
:addClass(cfg.classes.navbar) |
|||
:addClass(cfg.classes.plainlinks) |
|||
:addClass(cfg.classes.horizontal_list) |
|||
:addClass(collapsible_class) -- we made the determination earlier |
|||
:cssText(navbar_style) |
|||
if is_mini then div:addClass(cfg.classes.mini) end |
|||
if not title then |
|||
return error('Page does not exist') |
|||
local box_text = (args.text or cfg.box_text) .. ' ' |
|||
end |
|||
-- the concatenated space guarantees the box text is separated |
|||
if not (is_mini or is_plain) then |
|||
local mainpage = title.fullText; |
|||
div |
|||
local talkpage = talk_title and talk_title.fullText or '' |
|||
:tag('span') |
|||
local editurl = title:fullUrl( 'action=edit' ); |
|||
:addClass(cfg.classes.box_text) |
|||
:cssText(font_style) |
|||
local viewLink, talkLink, editLink = 'view', 'talk', 'edit' |
|||
:wikitext(box_text) |
|||
if args.mini then |
|||
end |
|||
viewLink, talkLink, editLink = 'v', 't', 'e' |
|||
end |
|||
local template = args.template |
|||
local displayed_links = choose_links(template, args) |
|||
local div = HtmlBuilder.create( 'div' ) |
|||
local has_brackets = args.brackets |
|||
div |
|||
local title_arg = get_title_arg(is_collapsible, template) |
|||
.addClass( 'noprint' ) |
|||
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) |
|||
.addClass( 'plainlinks' ) |
|||
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) |
|||
.addClass( 'hlist' ) |
|||
div:node(list) |
|||
.addClass( 'navbar') |
|||
.cssText( args.style ) |
|||
if is_collapsible then |
|||
local title_text_class |
|||
if args.mini then div.addClass('mini') end |
|||
if is_mini then |
|||
title_text_class = cfg.classes.collapsible_title_mini |
|||
if not (args.mini or args.plain) then |
|||
else |
|||
div |
|||
title_text_class = cfg.classes.collapsible_title_full |
|||
.tag( 'span' ) |
|||
end |
|||
.css( 'word-spacing', 0 ) |
|||
div:done() |
|||
.cssText( args.fontstyle ) |
|||
:tag('div') |
|||
.wikitext( args.text or 'This box:' ) |
|||
:addClass(title_text_class) |
|||
.wikitext( ' ' ) |
|||
:cssText(font_style) |
|||
end |
|||
:wikitext(args[1]) |
|||
end |
|||
if args.brackets then |
|||
div |
|||
local frame = mw.getCurrentFrame() |
|||
.tag('span') |
|||
-- hlist -> navbar is best-effort to preserve old Common.css ordering. |
|||
.css('margin-right', '-0.125em') |
|||
return frame:extensionTag{ |
|||
.cssText( args.fontstyle ) |
|||
name = 'templatestyles', args = { src = cfg.hlist_templatestyles } |
|||
.wikitext( '[' ) |
|||
} .. frame:extensionTag{ |
|||
.newline(); |
|||
name = 'templatestyles', args = { src = cfg.templatestyles } |
|||
end |
|||
} .. tostring(div:done()) |
|||
local ul = div.tag('ul'); |
|||
ul |
|||
.tag( 'li' ) |
|||
.addClass( 'nv-view' ) |
|||
.wikitext( '[[' .. mainpage .. '|' ) |
|||
.tag( 'span ' ) |
|||
.attr( 'title', 'View this template' ) |
|||
.cssText( args.fontstyle or '' ) |
|||
.wikitext( viewLink ) |
|||
.done() |
|||
.wikitext( ']]' ) |
|||
.done() |
|||
.tag( 'li' ) |
|||
.addClass( 'nv-talk' ) |
|||
.wikitext( '[[' .. talkpage .. '|' ) |
|||
.tag( 'span ' ) |
|||
.attr( 'title', 'Discuss this template' ) |
|||
.cssText( args.fontstyle or '' ) |
|||
.wikitext( talkLink ) |
|||
.done() |
|||
.wikitext( ']]' ); |
|||
if not args.noedit then |
|||
ul |
|||
.tag( 'li' ) |
|||
.addClass( 'nv-edit' ) |
|||
.wikitext( '[' .. editurl .. ' ' ) |
|||
.tag( 'span ' ) |
|||
.attr( 'title', 'Edit this template' ) |
|||
.cssText( args.fontstyle or '' ) |
|||
.wikitext( editLink ) |
|||
.done() |
|||
.wikitext( ']' ); |
|||
end |
|||
if args.brackets then |
|||
div |
|||
.tag('span') |
|||
.css('margin-left', '-0.125em') |
|||
.cssText( args.fontstyle or '' ) |
|||
.wikitext( ']' ) |
|||
.newline(); |
|||
end |
|||
return tostring(div) |
|||
end |
end |
||
function p.navbar(frame) |
function p.navbar(frame) |
||
return p._navbar(require('Module:Arguments').getArgs(frame)) |
|||
local origArgs |
|||
-- If called via #invoke, use the args passed into the invoking template. |
|||
-- Otherwise, for testing purposes, assume args are being passed directly in. |
|||
if frame == mw.getCurrentFrame() then |
|||
origArgs = frame:getParent().args |
|||
else |
|||
origArgs = frame |
|||
end |
|||
-- ParserFunctions considers the empty string to be false, so to preserve the previous |
|||
-- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider |
|||
-- them false too. |
|||
args = {} |
|||
for k, v in pairs(origArgs) do |
|||
if v ~= '' then |
|||
args[k] = v |
|||
end |
|||
end |
|||
return _navbar(args) |
|||
end |
end |
||
return p |
return p |
Siste sideversjon per 26. feb. 2025 kl. 18:41
local p = {} local cfg = mw.loadData('Module:Navbar/configuration') 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 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 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 error(cfg.invalid_title .. title_text) 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'] = 'vis', ['html_title'] = 'Vis denne malen', ['link'] = title.fullText, ['url'] = false }, { ['mini'] = 'd', ['full'] = 'diskuter', ['html_title'] = 'Diskuter denne malen', ['link'] = talkpage, ['url'] = false }, { ['mini'] = 'r', ['full'] = 'rediger', ['html_title'] = 'Rediger denne malen', ['link'] = 'Special:EditPage/' .. title.fullText, ['url'] = false }, { ['mini'] = 'h', ['full'] = 'historikk', ['html_title'] = 'Revisjonshistorikk for denne malen', ['link'] = 'Special:PageHistory/' .. title.fullText, ['url'] = false }, { ['mini'] = 'f', ['full'] = 'flytt', ['html_title'] = 'Flytt denne malen', ['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true }, { ['mini'] = 'O', ['full'] = 'Overvåkning', ['html_title'] = 'Overvåk denne malen', ['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 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') div :addClass(cfg.classes.navbar) :addClass(cfg.classes.plainlinks) :addClass(cfg.classes.horizontal_list) :addClass(collapsible_class) -- we made the determination earlier :cssText(navbar_style) if is_mini then div:addClass(cfg.classes.mini) end 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 :tag('span') :addClass(cfg.classes.box_text) :cssText(font_style) :wikitext(box_text) 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 is_collapsible then local title_text_class if is_mini then title_text_class = cfg.classes.collapsible_title_mini else title_text_class = cfg.classes.collapsible_title_full end div:done() :tag('div') :addClass(title_text_class) :cssText(font_style) :wikitext(args[1]) end local frame = mw.getCurrentFrame() -- hlist -> navbar is best-effort to preserve old Common.css ordering. return frame:extensionTag{ name = 'templatestyles', args = { src = cfg.hlist_templatestyles } } .. frame:extensionTag{ name = 'templatestyles', args = { src = cfg.templatestyles } } .. tostring(div:done()) end function p.navbar(frame) return p._navbar(require('Module:Arguments').getArgs(frame)) end return p