otclient-redemption/modules/corelib/string.lua

196 lines
4.9 KiB
Lua
Raw Permalink Normal View History

2012-06-25 19:13:30 -03:00
-- @docclass string
function string:split(delim)
2021-07-19 19:24:59 -03:00
local start = 1
local results = {}
while true do
local pos = string.find(self, delim, start, true)
if not pos then
break
end
2021-07-19 19:24:59 -03:00
table.insert(results, string.sub(self, start, pos - 1))
start = pos + string.len(delim)
2012-06-25 19:13:30 -03:00
end
2021-07-19 19:24:59 -03:00
table.insert(results, string.sub(self, start))
table.removevalue(results, '')
return results
2012-06-25 19:13:30 -03:00
end
function string:starts(start)
return string.sub(self, 1, #start) == start
end
2012-06-25 19:13:30 -03:00
function string:ends(test)
return test == '' or string.sub(self, -string.len(test)) == test
end
2012-10-04 19:35:02 -03:00
function string:trim()
return string.match(self, '^%s*(.*%S)') or ''
end
2012-06-25 19:13:30 -03:00
function string:explode(sep, limit)
if type(sep) ~= 'string' or tostring(self):len() == 0 or sep:len() == 0 then
return {}
end
2012-06-25 19:13:30 -03:00
2022-04-29 23:14:24 -03:00
local i, pos, tmp, t = 0, 1, '', {}
for s, e in function()
return string.find(self, sep, pos)
end do
2021-07-19 19:24:59 -03:00
tmp = self:sub(pos, s - 1):trim()
table.insert(t, tmp)
pos = e + 1
2012-06-25 19:13:30 -03:00
2021-07-19 19:24:59 -03:00
i = i + 1
if limit ~= nil and i == limit then
break
end
2012-06-25 19:13:30 -03:00
end
2021-07-19 19:24:59 -03:00
tmp = self:sub(pos):trim()
table.insert(t, tmp)
return t
2012-06-25 19:13:30 -03:00
end
2014-07-31 20:25:31 +02:00
function string:contains(str, checkCase, start, plain)
2021-07-19 19:24:59 -03:00
if (not checkCase) then
self = self:lower()
str = str:lower()
end
2022-04-29 23:14:24 -03:00
return string.find(self, str, start and start or 1, plain == nil and true or false)
2014-07-31 20:25:31 +02:00
end
function string:wrap(width)
local wrapped = ""
local lineWidth = 0
for word in self:gmatch("%S+") do
local wordWidth = #word * 10 -- Assuming each character is 10 pixels wide
if lineWidth + wordWidth > width then
wrapped = wrapped .. "\n" .. word .. " "
lineWidth = wordWidth + 1
else
wrapped = wrapped .. word .. " "
lineWidth = lineWidth + wordWidth + 1
end
end
return wrapped
end
function string.empty(str)
return str == nil or str == "" or #str == 0
end
function string:titleCase()
return self:gsub("(%a)([%w_']*)", function(first, rest)
return first:upper() .. rest:lower()
end)
end
function string.unpack_custom(format, data)
local result = {}
local index = 1
local i = 1
while i <= #format do
local fmt = format:sub(i, i)
local nextChar = format:sub(i + 1, i + 1)
local specifier = fmt
if nextChar:match("%d") then
specifier = fmt .. nextChar
i = i + 1
end
if specifier == "I1" then
result[#result + 1] = string.byte(data, index)
index = index + 1
elseif specifier == "I2" then
local b1, b2 = string.byte(data, index, index + 1)
result[#result + 1] = b1 + (b2 * 256)
index = index + 2
elseif specifier == "I4" then
local b1, b2, b3, b4 = string.byte(data, index, index + 3)
result[#result + 1] = b1 + (b2 * 256) + (b3 * 65536) + (b4 * 16777216)
index = index + 4
else
error("Invalid format specifier: " .. specifier)
end
i = i + 1
end
return unpack(result)
end
function setStringColor(t, text, color)
table.insert(t, text)
table.insert(t, color)
end
function setStringFont(t, text, color, font)
table.insert(t, text)
table.insert(t, color)
table.insert(t, font)
end
function string.pack_custom(format, ...)
local args = {...}
local result = {}
local index = 1
local i = 1
while i <= #format do
local fmt = format:sub(i, i)
local nextChar = format:sub(i + 1, i + 1)
local specifier = fmt
if nextChar:match("%d") then
specifier = fmt .. nextChar
i = i + 1
end
local value = args[index] or 0
if specifier == "I1" then
if value < 0 or value > 255 then
error("Value out of range for I1: " .. tostring(value))
end
table.insert(result, string.char(value))
elseif specifier == "I2" then
if value < 0 or value > 65535 then
error("Value out of range for I2: " .. tostring(value))
end
table.insert(result, string.char(value % 256, math.floor(value / 256)))
elseif specifier == "I4" then
if value < 0 or value > 4294967295 then
error("Value out of range for I4: " .. tostring(value))
end
table.insert(result, string.char(
value % 256,
math.floor(value / 256) % 256,
math.floor(value / 65536) % 256,
math.floor(value / 16777216)
))
else
error("Invalid format specifier: " .. specifier)
end
index = index + 1
i = i + 1
end
return table.concat(result)
end
function string.capitalize(str)
if not str or str == "" then
return str
end
-- Zamiana pierwszej litery na wielką, reszta pozostaje bez zmian
return str:sub(1,1):upper() .. str:sub(2)
end