Module:Zandbak/Msj/StringBuilder

Documentatie voor deze module kan aangemaakt worden op de volgende pagina: Module:Zandbak/Msj/StringBuilder/doc

-- Quick module to help creating a concatenated string.
-- To be used in other modules.
--
-- By User:TiiJ7
------------------------------------------------------------
 
local StringBuilder = {}
StringBuilder.__index = StringBuilder
local StringBuilderModes = { convert = true, ignore = true, error = true }
 
-- Creates a new string builder
function StringBuilder.new()
    local sb = {}
    setmetatable(sb,StringBuilder)
    sb._buffer = {}
    sb._mode = 'convert'
    sb._separator = ''
    return sb
end
 
-- Sets the mode of the string builder, see doc
function StringBuilder:setMode(mode)
    if not mode then return self end
    if StringBuilderModes[mode] then
        self._mode = mode
    end
    return self -- Method chaining
end
 
-- Sets the separator with which the strings are concatted
function StringBuilder:setSeparator(separator)
    if not separator then return self end
    separator = tostring(separator)
    if separator ~= nil then self._separator = separator end
    return self -- Method chaining
end
 
-- Appends a string
function StringBuilder:append(str)
    if str then
        self:_addString(str,self._buffer)
    end
    return self -- Method chaining
end
 
-- Appends multiple strings
function StringBuilder:appendAll(...)
    local argcount = select('#',...)
    if argcount then
        local b = self._buffer
        local f = self._addString
        for i=1,argcount do
           f(self,select(i,...),b)
        end
    end
    return self -- Method chaining
end
 
-- Clears the internal buffer
function StringBuilder:clear()
    local b = self._buffer
    for i=1,#b do
        b[i] = nil     
    end
    return self -- Method chaining
end
 
-- Returns the result as a string
function StringBuilder:toString()
    local b = self._buffer
    if #b == 0 then return '' end
    return table.concat(b,self._separator)
end
 
-- Adds a single string
function StringBuilder:_addString(str,t)
    if type(str) ~= 'string' and type(str) ~= 'number' then
        local m = self._mode
        if m == 'convert' then
            str = tostring(str)
            if not str then return end
        elseif m == 'error' then
            error( 'ERROR: Trying to append object of type "' .. type(str) .. '"' )
        else
            return
        end
    end
    t[#t+1] = str
end
 
-- Meta tostring function
function StringBuilder:__tostring()
    return self:toString()
end
 
-- Some function aliases...
StringBuilder.a = StringBuilder.append
StringBuilder.aa = StringBuilder.appendAll
StringBuilder.c = StringBuilder.clear
StringBuilder.m = StringBuilder.setMode
StringBuilder.s = StringBuilder.setSeparator
 
return StringBuilder