66 lines
1.7 KiB
Lua
66 lines
1.7 KiB
Lua
-- TOML serialization module
|
|
local toml = {}
|
|
|
|
-- Convert table to TOML
|
|
function toml.serialize(tb, isinner)
|
|
local text = ""
|
|
for k, v in pairs(tb) do
|
|
local tp = type(v)
|
|
if tp ~= "table" then
|
|
text = text..k.." = "
|
|
if tp == "string" then
|
|
text = text..string.format("%q", v)
|
|
else
|
|
text = text..tostring(v)
|
|
end
|
|
text = text.."\n"
|
|
end
|
|
end
|
|
for k, v in pairs(tb) do
|
|
local tp = type(v)
|
|
if tp == "table" then
|
|
if isinner then
|
|
error("only one level of subtables supported")
|
|
end
|
|
text = text.."["..k.."]\n"..toml.serialize(v).."\n"
|
|
end
|
|
end
|
|
return text
|
|
end
|
|
|
|
-- Parse TOML to new table
|
|
function toml.deserialize(s)
|
|
local output = {}
|
|
local current = output
|
|
local lines = {}
|
|
for line in string.gmatch(s, "[^\r\n]+") do
|
|
line = string.gsub(line, "%s+", "")
|
|
table.insert(lines, line)
|
|
end
|
|
for i = 1,#lines do
|
|
local s = lines[i]
|
|
if string.sub(s, 1, 1) == "[" then
|
|
local section = s.sub(s, 2, #s-1)
|
|
current = {}
|
|
output[section] = current
|
|
else
|
|
for k, v in string.gmatch(s, "(%w+)=(.+)" ) do
|
|
v = string.gsub(v, "%s+", "")
|
|
if v.sub(v, 1, 1) == "\"" then
|
|
current[k] = v.sub(v, 2, #v-1)
|
|
elseif v == "true" or v == "false" then
|
|
current[k] = v == "true"
|
|
end
|
|
|
|
local num = tonumber(v)
|
|
if num ~= nil then
|
|
current[k] = num
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return output
|
|
end
|
|
|
|
return toml
|