nomsu/string2.lua

177 lines
4.4 KiB
Lua

local reverse, upper, lower, find, byte, match, gmatch, gsub, sub, format, rep, char
do
local _obj_0 = string
reverse, upper, lower, find, byte, match, gmatch, gsub, sub, format, rep, char = _obj_0.reverse, _obj_0.upper, _obj_0.lower, _obj_0.find, _obj_0.byte, _obj_0.match, _obj_0.gmatch, _obj_0.gsub, _obj_0.sub, _obj_0.format, _obj_0.rep, _obj_0.char
end
local isplit
isplit = function(self, sep)
if sep == nil then
sep = '%s+'
end
local step
step = function(self, i)
local start = self.pos
if not (start) then
return
end
i = i + 1
local nl = find(self.str, self.sep, start)
self.pos = nl and (nl + 1) or nil
local line = sub(self.str, start, nl and (nl - 1) or #self.str)
return i, line, start, (nl and (nl - 1) or #self.str)
end
return step, {
str = self,
pos = 1,
sep = sep
}, 0
end
local lua_keywords = {
["and"] = true,
["break"] = true,
["do"] = true,
["else"] = true,
["elseif"] = true,
["end"] = true,
["false"] = true,
["for"] = true,
["function"] = true,
["goto"] = true,
["if"] = true,
["in"] = true,
["local"] = true,
["nil"] = true,
["not"] = true,
["or"] = true,
["repeat"] = true,
["return"] = true,
["then"] = true,
["true"] = true,
["until"] = true,
["while"] = true
}
local is_lua_id
is_lua_id = function(str)
return match(str, "^[_a-zA-Z][_a-zA-Z0-9]*$") and not lua_keywords[str]
end
local string2 = {
isplit = isplit,
uppercase = upper,
lowercase = lower,
reversed = reverse,
is_lua_id = is_lua_id,
capitalized = function(self)
return gsub(self, '%l', upper, 1)
end,
byte = byte,
bytes = function(self, i, j)
return {
byte(self, i or 1, j or -1)
}
end,
split = function(self, sep)
local _accum_0 = { }
local _len_0 = 1
for i, chunk in isplit(self, sep) do
_accum_0[_len_0] = chunk
_len_0 = _len_0 + 1
end
return _accum_0
end,
lines = function(self)
local _accum_0 = { }
local _len_0 = 1
for i, line in isplit(self, '\n') do
_accum_0[_len_0] = line
_len_0 = _len_0 + 1
end
return _accum_0
end,
line = function(self, line_num)
for i, line, start in isplit(self, '\n') do
if i == line_num then
return line
end
end
end,
line_at = function(self, pos)
assert(type(pos) == 'number', "Invalid string position")
for i, line, start, stop in isplit(self, '\n') do
if stop + 1 >= pos then
return line, i, (pos - start + 1)
end
end
end,
wrap = function(self, maxlen, buffer)
if maxlen == nil then
maxlen = 80
end
if buffer == nil then
buffer = 8
end
local lines = { }
local _list_0 = self:lines()
for _index_0 = 1, #_list_0 do
local line = _list_0[_index_0]
while #line > maxlen do
local chunk = line:sub(1, maxlen)
local split = chunk:find(' ', maxlen - buffer, true) or maxlen
chunk = line:sub(1, split)
line = line:sub(split + 1, -1)
lines[#lines + 1] = chunk
end
lines[#lines + 1] = line
end
return table.concat(lines, "\n")
end,
as_lua = function(self)
local escaped = gsub(self, "\\", "\\\\")
escaped = gsub(escaped, "\n", "\\n")
escaped = gsub(escaped, '"', '\\"')
escaped = gsub(escaped, "[^ %g]", function(c)
return format("\\%03d", byte(c, 1))
end)
return '"' .. escaped .. '"'
end,
as_nomsu = function(self)
local escaped = gsub(self, "\\", "\\\\")
escaped = gsub(escaped, "\n", "\\n")
escaped = gsub(escaped, '"', '\\"')
escaped = gsub(escaped, "[^ %g]", function(c)
return format("\\%03d", byte(c, 1))
end)
return '"' .. escaped .. '"'
end,
as_lua_id = function(str)
local orig = str
str = gsub(str, "^ *$", "%1 ")
str = gsub(str, "x([0-9A-F][0-9A-F])", "x78%1")
str = gsub(str, "%W", function(c)
if c == ' ' then
return '_'
else
return format("x%02X", byte(c))
end
end)
if not (is_lua_id(str:match("^_*(.*)$"))) then
str = "_" .. str
end
return str
end,
from_lua_id = function(str)
if not (is_lua_id("^_+(.*)$")) then
str = str:sub(2, -1)
end
str = gsub(str, "_", " ")
str = gsub(str, "x([0-9A-F][0-9A-F])", function(hex)
return char(tonumber(hex, 16))
end)
str = gsub(str, "^ ([ ]*)$", "%1")
return str
end
}
for k, v in pairs(string) do
string2[k] = string2[k] or v
end
return string2