111 lines
2.7 KiB
Plaintext
111 lines
2.7 KiB
Plaintext
-- Copyright (C) 2025 ASTRONAND
|
|
local ini = {}
|
|
local fs=require("filesystem")
|
|
|
|
local function trim(s)
|
|
local i, j = 1, #s
|
|
while i <= j and (s:sub(i,i) == " " or s:sub(i,i) == "\t") do
|
|
i = i + 1
|
|
end
|
|
while j >= i and (s:sub(j,j) == " " or s:sub(j,j) == "\t") do
|
|
j = j - 1
|
|
end
|
|
return s:sub(i, j)
|
|
end
|
|
|
|
local function parse(list)
|
|
local lines=function ()
|
|
local i=0
|
|
return function()
|
|
i=i+1
|
|
return list[i]
|
|
end
|
|
end
|
|
local data = {}
|
|
local section = data
|
|
for line in lines() do
|
|
line = trim(line)
|
|
|
|
if line ~= "" and line:sub(1,1) ~= ";" and line:sub(1,1) ~= "#" then
|
|
if line:sub(1,1) == "[" and line:sub(-1) == "]" then
|
|
local secName = trim(line:sub(2, -2))
|
|
if secName ~= "" then
|
|
data[secName] = data[secName] or {}
|
|
section = data[secName]
|
|
end
|
|
else
|
|
local eq
|
|
for i = 1, #line do
|
|
if line:sub(i,i) == "=" then
|
|
eq = i
|
|
break
|
|
end
|
|
end
|
|
if eq then
|
|
local key = trim(line:sub(1, eq-1))
|
|
local value = trim(line:sub(eq+1))
|
|
|
|
local lower = value:lower()
|
|
if tonumber(value) then
|
|
value = tonumber(value)
|
|
elseif lower == "true" then
|
|
value = true
|
|
elseif lower == "false" then
|
|
value = false
|
|
end
|
|
section[key] = value
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return data
|
|
end
|
|
|
|
function ini.read(path)
|
|
local file, err = fs.open(path, "r")
|
|
if not file then return nil, err end
|
|
local list={}
|
|
for i in file.lines() do
|
|
list[#list+1] = i
|
|
end
|
|
file.close()
|
|
return parse(list)
|
|
end
|
|
|
|
function ini.get(text)
|
|
return parse(string.split(text, "\n"))
|
|
end
|
|
|
|
local function write(data)
|
|
local text=""
|
|
for k,v in pairs(data) do
|
|
if type(v) ~= "table" then
|
|
text=text..k .. " = " .. tostring(v) .. "\n"
|
|
end
|
|
end
|
|
|
|
for sec, tbl in pairs(data) do
|
|
if type(tbl) == "table" then
|
|
text=text.."\n[" .. sec .. "]\n"
|
|
for k,v in pairs(tbl) do
|
|
text=text..k .. " = " .. tostring(v) .. "\n"
|
|
end
|
|
end
|
|
end
|
|
|
|
return text
|
|
end
|
|
|
|
function ini.write(path, data)
|
|
local file=fs.open(path, "w")
|
|
file.write(write(data))
|
|
file.close()
|
|
return true
|
|
end
|
|
|
|
function ini.make(data)
|
|
return write(data)
|
|
end
|
|
|
|
return ini |