--require "mw.text"
--require "string"
--require "table"

local z = {}

-- This splits a string of name="value" pairs into a table.
-- The common use of this is to parse a single template argument that specifies HTML element attributes all in one lump.
function z.SplitHTMLElementParams(s)
    local params = {}
    for name,value in string.gmatch(s, "([%w_]+)=\"([^\"]*)\"%s*") do
        params[name] = value
    end
    return params
end

-- This returns a string quoted using quotation marks, using HTML character entities for embedded quotation marks and ampersands.
function z.quote(t)
    local chars = {}
    for i=1,#t do
        local char = t:sub(i,i)
        local byte = char:byte()
        if ( byte == 34 or byte == 38 ) then
            table.insert(chars, "&#" .. tostring(byte) .. ";")
        else
            table.insert(chars, char)
        end
    end
    return "\"" .. table.concat(chars) .. "\""
end

function z.CombineHTMLElementParams(params)
    local attrs = {}
    for n,v in pairs(params) do
        table.insert(attrs, n .. "=" .. z.quote(v))
    end
    return table.concat(attrs, " ")
end

function RawOpenHTMLTag(name,params)
    local attr = z.CombineHTMLElementParams(params)
    return "<" .. name .. " " .. attr .. ">"
end

function z.OpenHTMLTag(t)
    local name = t.name or "!-- --"
    if ( "nowiki" == name or "ref" == name or "pre" == name or "gallery" == name or "poem" == name or "references" == name ) then
        error(name .. ": OpenHTMLTag is for non-extension tags only.")
    end
    return RawOpenHTMLTag(name,t.params)
end

-- This returns the canonical form of an editor-supplied time, for use in cleanup category names.
function z.canonicalcleanuptime(t)
    return t -- FIXME: This isn't right.
end

-- This returns a list formatted into a (intended to be human-readable) comma-separated form.
function z.oxfordlist(args,separator,ampersand)
    local text = ""
    separator = separator or ","
    ampersand = ampersand or "and"
    for index,arg in ipairs(args) do
        if (index < 2) then 
            -- Add nothing before the first item.
        elseif (args[index + 1] ~= nil) then
            text = text .. separator .. " " 
        elseif (index > 2) then 
            text = text .. separator .. " " .. ampersand .. " "
        else
            text = text .. " " .. ampersand .. " "
        end
        text = text .. arg
    end
    return text
end

-- These return various CSS strings.
function z.columncountstyle(n)
    return "-moz-column-count:" .. n .. "; -webkit-column-count:" .. n .. "; column-count:" .. n .. ";"
end
function z.columnwidthstyle(n)
    return "-moz-column-width:" .. n .. "; -webkit-column-width:" .. n .. "; column-width:" .. n .. ";"
end
function z.liststyle(n)
    return "list-style-type:" .. n .. ";"
end

return z