Module:Toolbar: Difference between revisions

From Zoophilia Wiki
Jump to navigationJump to search
meta>Mr. Stradivarius
generate more natural html if class and style arguments are absent
meta>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

Documentation for this module may be created at Module:Toolbar/doc

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