Jump to content

Module:Toolbar: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
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, 10 September 2013

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