Difference between revisions of "Module:Toolbar"

From blackwiki
Jump to navigation Jump to search
blackwiki>Mr. Stradivarius
(generate more natural html if class and style arguments are absent)
blackwiki>Mr. Stradivarius
(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)
     local class = (args.class and (' ' .. args.class))  or ''
+
     return mw.ustring.format(
    local style = (args.style and (' style="' .. args.style .. '"')) or ''
+
    '<span class="plainlinks%s"%s>(%s)</span>',
   
+
    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
 
   
 
   
 
return p
 
return p

Revision as of 09:51, 10 September 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