Module:Sandbox/TiiJ7/StringBuilder

-- 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