Modul:Navbar: Forskjell mellom sideversjoner

Fra wikisida.no
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 57 sideversjoner ble importert
 
(48 mellomliggende versjoner av 22 brukere er ikke vist)
Linje 1: Linje 1:
local p = {}
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')


local HtmlBuilder = require('Module:HtmlBuilder')
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 trim(s)
local function choose_links(template, args)
    return mw.ustring.match( s, "^%s*(.-)%s*$" )
-- 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
end


function error(s)
local function add_link(link_description, ul, is_mini, font_style)
    local span = HtmlBuilder.create('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


    span
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
        .addClass('error')
        .css('float', 'left')
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
        .css('white-space', 'nowrap')
if not title then
        .wikitext('Error: ' .. s)
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 }
}


    return tostring(span)
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 getTitle( pageName )
function p._navbar(args)
    pageName = trim( pageName );
    local page_title, talk_page_title;
-- TODO: We probably don't need both fontstyle and fontcolor...
   
local font_style = args.fontstyle
    if mw.ustring.sub(pageName, 1, 1) == ':' then
local font_color = args.fontcolor
        page_title = mw.title.new( mw.ustring.sub(pageName, 2) );
local is_collapsible = args.collapsible
    else
local is_mini = args.mini
        page_title = mw.title.new( pageName, 'Template' );
local is_plain = args.plain
    end   
   
local collapsible_class = nil
    if page_title then
if is_collapsible then
        talk_page_title = page_title.talkPageTitle;
collapsible_class = cfg.classes.collapsible
    else
if not is_plain then is_mini = 1 end
        talk_page_title = nil;
if font_color then
    end
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
   
end
    return page_title, talk_page_title;   
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


function _navbar( args )
local box_text = (args.text or cfg.box_text) .. ' '
    if not args[1] then
-- the concatenated space guarantees the box text is separated
        return error('No name provided')
if not (is_mini or is_plain) then
    end
div
:tag('span')
    local good, title, talk_title;
:addClass(cfg.classes.box_text)
    good, title, talk_title = pcall( getTitle, args[1] );
:cssText(font_style)
    if not good then
:wikitext(box_text)
        return error(title);
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 not title then
if is_collapsible then
        return error('Page does not exist')
local title_text_class
    end
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
    local mainpage = title.fullText;
else
    local talkpage = talk_title and talk_title.fullText or ''
title_text_class = cfg.classes.collapsible_title_full
    local editurl = title:fullUrl( 'action=edit' );
end
div:done()
    local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
:tag('div')
    if args.mini then
:addClass(title_text_class)
        viewLink, talkLink, editLink = 'v', 't', 'e'
:cssText(font_style)
    end
:wikitext(args[1])
end
    local div = HtmlBuilder.create( 'div' )
    div
local frame = mw.getCurrentFrame()
        .addClass( 'noprint' )
-- hlist -> navbar is best-effort to preserve old Common.css ordering.
        .addClass( 'plainlinks' )
return frame:extensionTag{
        .addClass( 'hlist' )
name = 'templatestyles', args = { src = cfg.hlist_templatestyles }
        .addClass( 'navbar')
} .. frame:extensionTag{
        .cssText( args.style )
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
    if args.mini then div.addClass('mini') end
    if not (args.mini or args.plain) then
        div
            .tag( 'span' )
                .css( 'word-spacing', 0 )
                .cssText( args.fontstyle )
                .wikitext( args.text or 'This box:' )
                .wikitext( ' ' )
    end
    if args.brackets then
        div
            .tag('span')
                .css('margin-right', '-0.125em')
                .cssText( args.fontstyle )
                .wikitext( '[' )
                .newline();
    end
    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)
    local origArgs
return p._navbar(require('Module:Arguments').getArgs(frame))
    -- 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 22. apr. 2026 kl. 01:25


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