MineOS/Libraries/Text.lua
2019-01-26 13:08:02 +03:00

233 lines
5.4 KiB
Lua
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local text = {}
--------------------------------------------------------------------------------
function text.serialize(t, prettyLook, indentator, recursionStackLimit)
checkArg(1, t, "table")
recursionStackLimit = recursionStackLimit or math.huge
indentator = indentator or " "
local equalsSymbol = prettyLook and " = " or "="
local function serialize(t, currentIndentationSymbol, currentRecusrionStack)
local result, nextIndentationSymbol, keyType, valueType, stringValue = {"{"}, currentIndentationSymbol .. indentator
if prettyLook then
table.insert(result, "\n")
end
for key, value in pairs(t) do
keyType, valueType, stringValue = type(key), type(value), tostring(value)
if prettyLook then
table.insert(result, nextIndentationSymbol)
end
if keyType == "number" then
table.insert(result, "[")
table.insert(result, key)
table.insert(result, "]")
table.insert(result, equalsSymbol)
elseif keyType == "string" then
-- Короч, если типа начинается с буковки, а также если это алфавитно-нумерическая поеботня
if prettyLook and key:match("^%a") and key:match("^[%w%_]+$") then
table.insert(result, key)
else
table.insert(result, "[\"")
table.insert(result, key)
table.insert(result, "\"]")
end
table.insert(result, equalsSymbol)
end
if valueType == "number" or valueType == "boolean" or valueType == "nil" then
table.insert(result, stringValue)
elseif valueType == "string" or valueType == "function" then
table.insert(result, "\"")
table.insert(result, stringValue)
table.insert(result, "\"")
elseif valueType == "table" then
if currentRecusrionStack < recursionStackLimit then
table.insert(
result,
table.concat(
serialize(
value,
nextIndentationSymbol,
currentRecusrionStack + 1
)
)
)
else
table.insert(result, "\"\"")
end
end
table.insert(result, ",")
if prettyLook then
table.insert(result, "\n")
end
end
-- Удаляем запятую
if prettyLook then
if #result > 2 then
table.remove(result, #result - 1)
end
table.insert(result, currentIndentationSymbol)
else
if #result > 1 then
table.remove(result, #result)
end
end
table.insert(result, "}")
return result
end
return table.concat(serialize(t, "", 1))
end
function text.deserialize(s)
checkArg(1, s, "string")
local result, reason = load("return " .. s)
if result then
result, reason = pcall(result)
if result then
return reason
else
return nil, reason
end
else
return nil, reason
end
end
function text.split(s, delimiter)
local parts, index = {}, 1
for part in s:gmatch(delimiter) do
parts[index] = part
index = index + 1
end
return parts
end
function text.brailleChar(a, b, c, d, e, f, g, h)
return unicode.char(10240 + 128 * h + 64 * g + 32 * f + 16 * d + 8 * b + 4 * e + 2 * c + a)
end
function text.unicodeFind(s, pattern, init, plain)
if init then
if init < 0 then
init = -#unicode.sub(s, init)
elseif init > 0 then
init = #unicode.sub(s, 1, init - 1) + 1
end
end
a, b = s:find(pattern, init, plain)
if a then
local ap, bp = s:sub(1, a - 1), s:sub(a,b)
a = unicode.len(ap) + 1
b = a + unicode.len(bp) - 1
return a, b
else
return a
end
end
function text.limit(s, limit, mode, noDots)
local length = unicode.len(s)
if length <= limit then
return s
elseif mode == "left" then
if noDots then
return unicode.sub(s, length - limit + 1, -1)
else
return "" .. unicode.sub(s, length - limit + 2, -1)
end
elseif mode == "center" then
local integer, fractional = math.modf(limit / 2)
if fractional == 0 then
return unicode.sub(s, 1, integer) .. "" .. unicode.sub(s, -integer + 1, -1)
else
return unicode.sub(s, 1, integer) .. "" .. unicode.sub(s, -integer, -1)
end
else
if noDots then
return unicode.sub(s, 1, limit)
else
return unicode.sub(s, 1, limit - 1) .. ""
end
end
end
function text.wrap(data, limit)
if type(data) == "string" then
data = { data }
end
local wrappedLines, result, preResult, position = {}
-- Дублируем таблицу строк, шоб не перекосоебить ченить переносами
for i = 1, #data do
wrappedLines[i] = data[i]
end
-- Отсечение возврата каретки-ебуретки
local i = 1
while i <= #wrappedLines do
local position = wrappedLines[i]:find("\n")
if position then
table.insert(wrappedLines, i + 1, unicode.sub(wrappedLines[i], position + 1, -1))
wrappedLines[i] = unicode.sub(wrappedLines[i], 1, position - 1)
end
i = i + 1
end
-- Сам перенос
local i = 1
while i <= #wrappedLines do
result = ""
for word in wrappedLines[i]:gmatch("[^%s]+") do
preResult = result .. word
if unicode.len(preResult) > limit then
if unicode.len(word) > limit then
table.insert(wrappedLines, i + 1, unicode.sub(wrappedLines[i], limit + 1, -1))
result = unicode.sub(wrappedLines[i], 1, limit)
else
table.insert(wrappedLines, i + 1, unicode.sub(wrappedLines[i], unicode.len(result) + 1, -1))
end
break
else
result = preResult .. " "
end
end
wrappedLines[i] = result:gsub("%s+$", ""):gsub("^%s+", "")
i = i + 1
end
return wrappedLines
end
--------------------------------------------------------------------------------
return text