Advertisement
Omsigames

grapes/Text.lua

Dec 25th, 2024
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.70 KB | None | 0 0
  1. local unicode = require("unicode")
  2.  
  3. local text = {}
  4.  
  5. --------------------------------------------------------------------------------
  6.  
  7. function text.serialize(t, prettyLook, indentator, recursionStackLimit)
  8.     checkArg(1, t, "table")
  9.  
  10.     recursionStackLimit = recursionStackLimit or math.huge
  11.     indentator = indentator or "  "
  12.    
  13.     local equalsSymbol = prettyLook and " = " or "="
  14.  
  15.     local function serialize(t, currentIndentationSymbol, currentRecusrionStack)
  16.         local result, nextIndentationSymbol, keyType, valueType, stringValue = {"{"}, currentIndentationSymbol .. indentator
  17.        
  18.         if prettyLook then
  19.             table.insert(result, "\n")
  20.         end
  21.        
  22.         for key, value in pairs(t) do
  23.             keyType, valueType, stringValue = type(key), type(value), tostring(value)
  24.  
  25.             if prettyLook then
  26.                 table.insert(result, nextIndentationSymbol)
  27.             end
  28.            
  29.             if keyType == "number" then
  30.                 table.insert(result, "[")
  31.                 table.insert(result, key)
  32.                 table.insert(result, "]")
  33.                 table.insert(result, equalsSymbol)
  34.             elseif keyType == "string" then
  35.                 -- Короч, если типа начинается с буковки, а также если это алфавитно-нумерическая поеботня
  36.                 if prettyLook and key:match("^%a") and key:match("^[%w%_]+$") then
  37.                     table.insert(result, key)
  38.                 else
  39.                     table.insert(result, "[\"")
  40.                     table.insert(result, key)
  41.                     table.insert(result, "\"]")
  42.                 end
  43.  
  44.                 table.insert(result, equalsSymbol)
  45.             end
  46.  
  47.             if valueType == "number" or valueType == "boolean" or valueType == "nil" then
  48.                 table.insert(result, stringValue)
  49.             elseif valueType == "string" or valueType == "function" then
  50.                 table.insert(result, "\"")
  51.                 table.insert(result, stringValue)
  52.                 table.insert(result, "\"")
  53.             elseif valueType == "table" then
  54.                 if currentRecusrionStack < recursionStackLimit then
  55.                     table.insert(
  56.                         result,
  57.                         table.concat(
  58.                             serialize(
  59.                                 value,
  60.                                 nextIndentationSymbol,
  61.                                 currentRecusrionStack + 1
  62.                             )
  63.                         )
  64.                     )
  65.                 else
  66.                     table.insert(result, "\"\"")
  67.                 end
  68.             end
  69.            
  70.             table.insert(result, ",")
  71.  
  72.             if prettyLook then
  73.                 table.insert(result, "\n")
  74.             end
  75.         end
  76.  
  77.         -- Удаляем запятую
  78.         if prettyLook then
  79.             if #result > 2 then
  80.                 table.remove(result, #result - 1)
  81.             end
  82.  
  83.             table.insert(result, currentIndentationSymbol)
  84.         else
  85.             if #result > 1 then
  86.                 table.remove(result, #result)
  87.             end
  88.         end
  89.  
  90.         table.insert(result, "}")
  91.  
  92.         return result
  93.     end
  94.    
  95.     return table.concat(serialize(t, "", 1))
  96. end
  97.  
  98. function text.deserialize(s)
  99.     checkArg(1, s, "string")
  100.    
  101.     local result, reason = load("return " .. s)
  102.     if result then
  103.         result, reason = pcall(result)
  104.        
  105.         if result then
  106.             return reason
  107.         else
  108.             return nil, reason
  109.         end
  110.     else
  111.         return nil, reason
  112.     end
  113. end
  114.  
  115. function text.split(s, delimiter)
  116.     local parts, index = {}, 1
  117.     for part in s:gmatch(delimiter) do
  118.         parts[index] = part
  119.         index = index + 1
  120.     end
  121.  
  122.     return parts
  123. end
  124.  
  125. function text.brailleChar(a, b, c, d, e, f, g, h)
  126.     return unicode.char(10240 + 128 * h + 64 * g + 32 * f + 16 * d + 8 * b + 4 * e + 2 * c + a)
  127. end
  128.  
  129. function text.unicodeFind(s, pattern, init, plain)
  130.     if init then
  131.         if init < 0 then
  132.             init = -#unicode.sub(s, init)
  133.         elseif init > 0 then
  134.             init = #unicode.sub(s, 1, init - 1) + 1
  135.         end
  136.     end
  137.    
  138.     a, b = s:find(pattern, init, plain)
  139.    
  140.     if a then
  141.         local ap, bp = s:sub(1, a - 1), s:sub(a,b)
  142.         a = unicode.len(ap) + 1
  143.         b = a + unicode.len(bp) - 1
  144.  
  145.         return a, b
  146.     else
  147.         return a
  148.     end
  149. end
  150.  
  151. function text.limit(s, limit, mode, noDots)
  152.     local length = unicode.len(s)
  153.    
  154.     if length <= limit then
  155.         return s
  156.     elseif mode == "left" then
  157.         if noDots then
  158.             return unicode.sub(s, length - limit + 1, -1)
  159.         else
  160.             return "…" .. unicode.sub(s, length - limit + 2, -1)
  161.         end
  162.     elseif mode == "center" then
  163.         local integer, fractional = math.modf(limit / 2)
  164.         if fractional == 0 then
  165.             return unicode.sub(s, 1, integer) .. "…" .. unicode.sub(s, -integer + 1, -1)
  166.         else
  167.             return unicode.sub(s, 1, integer) .. "…" .. unicode.sub(s, -integer, -1)
  168.         end
  169.     else
  170.         if noDots then
  171.             return unicode.sub(s, 1, limit)
  172.         else
  173.             return unicode.sub(s, 1, limit - 1) .. "…"
  174.         end
  175.     end
  176. end
  177.  
  178. function text.wrap(data, limit)
  179.     if type(data) == "string" then
  180.         data = { data }
  181.     end
  182.  
  183.     local wrappedLines, result, preResult, position = {}
  184.  
  185.     -- Дублируем таблицу строк, шоб не перекосоебить ченить переносами
  186.     for i = 1, #data do
  187.         wrappedLines[i] = data[i]
  188.     end
  189.  
  190.     -- Отсечение возврата каретки-ебуретки
  191.     local i = 1
  192.     while i <= #wrappedLines do
  193.         local position = wrappedLines[i]:find("\n")
  194.         if position then
  195.             table.insert(wrappedLines, i + 1, unicode.sub(wrappedLines[i], position + 1, -1))
  196.             wrappedLines[i] = unicode.sub(wrappedLines[i], 1, position - 1)
  197.         end
  198.  
  199.         i = i + 1
  200.     end
  201.  
  202.     -- Сам перенос
  203.     local i = 1
  204.     while i <= #wrappedLines do
  205.         result = ""
  206.  
  207.         for word in wrappedLines[i]:gmatch("[^%s]+") do
  208.             preResult = result .. word
  209.  
  210.             if unicode.len(preResult) > limit then
  211.                 if unicode.len(word) > limit then
  212.                     table.insert(wrappedLines, i + 1, unicode.sub(wrappedLines[i], limit + 1, -1))
  213.                     result = unicode.sub(wrappedLines[i], 1, limit)
  214.                 else
  215.                     table.insert(wrappedLines, i + 1, unicode.sub(wrappedLines[i], unicode.len(result) + 1, -1))   
  216.                 end
  217.  
  218.                 break  
  219.             else
  220.                 result = preResult .. " "
  221.             end
  222.         end
  223.  
  224.         wrappedLines[i] = result:gsub("%s+$", ""):gsub("^%s+", "")
  225.  
  226.         i = i + 1
  227.     end
  228.  
  229.     return wrappedLines
  230. end
  231.  
  232. --------------------------------------------------------------------------------
  233.  
  234. return text
Tags: ORMS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement