Module:Toolbar: Difference between revisions

From the Croc Wiki, the Croc encyclopedia
Jump to navigationJump to search
Content added Content deleted
(generate more natural html if class and style arguments are absent)
(use a more efficient string-building algorithm)
Line 1: Line 1:
local p = {}
local p = {}
local args = {}


-- Get the keys of the numerical arguments that are present.
-- Get the keys of the numerical arguments that are present.
local function getArgNums()
local function getArgNums(args)
local nums = {}
local nums = {}
local tinsert = table.insert
for k, v in pairs(args) do
for k, v in pairs(args) do
if type(k) == 'number' then
if type(k) == 'number' then
table.insert(nums, k)
tinsert(nums, k)
end
end
end
end
Line 14: Line 14:
end
end


local function makeToolbarItems()
local function makeToolbarItems(args)
-- Get numerical argument keys.
-- Get numerical argument keys.
local nums = getArgNums()
local nums = getArgNums(args)
-- Get the separator text.
-- Get the separator text.
local sep = (args.separator or 'pipe') .. '-separator'
local sep = (args.separator or 'pipe') .. '-separator'
Line 22: Line 22:
-- Generate the toolbar items.
-- Generate the toolbar items.
local ret = ''
local ret = {}
local tinsert = table.insert
for i, v in ipairs(nums) do
for i, v in ipairs(nums) do
ret = ret .. args[v]
tinsert(ret, args[v])
if nums[i + 1] then
ret = ret .. sep
end
end
end
return ret
return table.concat(ret, sep)
end
end


local function makeToolbar()
local function makeToolbar(args)
return mw.ustring.format(
local class = (args.class and (' ' .. args.class)) or ''
'<span class="plainlinks%s"%s>(%s)</span>',
local style = (args.style and (' style="' .. args.style .. '"')) or ''
type(args.class) == 'string' and ' ' .. args.class or '',
local ret = '<span class="plainlinks' .. class .. '"' .. style .. '>'
type(args.style) == 'string' and mw.ustring.format(' style="%s"', args.style) or '',
.. '(' .. makeToolbarItems() .. ')'
makeToolbarItems(args)
)
.. '</span>'
return ret
end
end


Line 49: Line 45:
if frame == mw.getCurrentFrame() then
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
origArgs = frame:getParent().args
for k, v in pairs(frame.args) do
origArgs = frame.args
break
end
else
else
origArgs = frame
origArgs = frame
Line 54: Line 54:
-- Strip whitespace and remove nil values
-- Strip whitespace and remove nil values
local args = {}
for k, v in pairs(origArgs) do
for k, v in pairs(origArgs) do
v = mw.text.trim(v)
if type(v) == 'string' then
v = mw.text.trim(v)
end
if v ~= '' then
if v ~= '' then
args[k] = v
args[k] = v
Line 61: Line 64:
end
end
return makeToolbar()
return makeToolbar(args)
end
end

Revision as of 09:51, September 10, 2013

This module implements {{toolbar}}. Please see the template page for documentation.

See also


local p = {}

-- Get the keys of the numerical arguments that are present.
local function getArgNums(args)
    local nums = {}
    local tinsert = table.insert
    for k, v in pairs(args) do
        if type(k) == 'number' then
            tinsert(nums, k)
        end
    end
    table.sort(nums)
    return nums
end

local function makeToolbarItems(args)
    -- Get numerical argument keys.
    local nums = getArgNums(args)
    -- Get the separator text.
    local sep = (args.separator or 'pipe') .. '-separator'
    sep = mw.message.new(sep):plain()
    
    -- Generate the toolbar items.
    local ret = {}
    local tinsert = table.insert
    for i, v in ipairs(nums) do
    	tinsert(ret, args[v])
    end
    return table.concat(ret, sep)
end

local function makeToolbar(args)
    return mw.ustring.format(
    	'<span class="plainlinks%s"%s>(%s)</span>',
    	type(args.class) == 'string' and ' ' .. args.class or '',
    	type(args.style) == 'string' and mw.ustring.format(' style="%s"', args.style) or '',
    	makeToolbarItems(args)
    )
end

function p.main(frame)
    -- If called via #invoke, use the args passed into the invoking template.
    -- Otherwise, for testing purposes, assume args are being passed directly in.
    local origArgs
    if frame == mw.getCurrentFrame() then
        origArgs = frame:getParent().args
        for k, v in pairs(frame.args) do
        	origArgs = frame.args
        	break
    	end
    else
        origArgs = frame
    end
    
    -- Strip whitespace and remove nil values
    local args = {}
    for k, v in pairs(origArgs) do
    	if type(v) == 'string' then
    		v = mw.text.trim(v)
    	end
        if v ~= '' then
            args[k] = v
        end
    end
    
    return makeToolbar(args)
end
 
return p