diff --git a/lib/utility.lua b/lib/utility.lua index 88e7e20..3eda5f8 100644 --- a/lib/utility.lua +++ b/lib/utility.lua @@ -32,7 +32,7 @@ else } end -utility.version = "1.4.0" +utility.version = "1.5.2" -- WARNING: This will return "./" if the original script is called locally instead of with an absolute path! if arg[0] ~= nil then utility.path = (arg[0]:match("@?(.*/)") or arg[0]:match("@?(.*\\)")) -- inspired by discussion in https://stackoverflow.com/q/6380820 @@ -124,14 +124,6 @@ standard_library_addition(string, "enquote", function(s) return "\"" .. s:gsub("\"", "\\\"") .. "\"" end) -standard_library_addition(string, "split", function(s, delimiter) - local result = {} - for item in s:gsplit(delimiter) do - result[#result + 1] = item - end - return result -end) - standard_library_addition(string, "gsplit", function(s, delimiter) local function escape_special_characters(s) local special_characters = "[()%%.[^$%]*+%-?]" @@ -144,6 +136,14 @@ standard_library_addition(string, "gsplit", function(s, delimiter) return s:gmatch("(.-)" .. escape_special_characters(delimiter)) end) +standard_library_addition(string, "split", function(s, delimiter) + local result = {} + for item in s:gsplit(delimiter) do + result[#result + 1] = item + end + return result +end) + -- modified from my fork of lume @@ -301,7 +301,7 @@ utility.release_lock = function(file_path, lock_uuid) local lock_file_path = file_path .. ".lock" if lock_uuid then utility.open(lock_file_path, "r", function(file) - if not file:read("*all") == lock_uuid then + if not (file:read("*all") == lock_uuid) then error("\n\n Lock UUID changed while lock was obtained. Data loss may have occurred. \n\n") end end) @@ -348,12 +348,47 @@ utility.save_config = function() end end +local data_file_locations = {} +utility.load_data = function(file_path) + local data = utility.open(file_path, "r", function(data_file) + local json = utility.require("dkjson") + return json.decode(data_file:read("*all")) + end) + data_file_locations[data] = file_path + return data +end + +utility.save_data = function(data, file_path) + local keys, loop = {} + loop = function(tab) + if type(tab) == "table" then + for k,v in pairs(tab) do + if not (type(k) == "number") then + keys[k] = true + end + loop(v) + end + end + end + loop(data) + local order = {} + for k in pairs(keys) do order[#order + 1] = k end + table.sort(order) + + file_path = file_path or data_file_locations[data] + assert(file_path, "The object must have been loaded by utility.load_data or you must pass a path as the second argument.") + utility.open(file_path, "w", function(data_file) + local json = utility.require("dkjson") + data_file:write(json.encode(data, { indent = true, keyorder = order, })) + data_file:write("\n") + end) +end + utility.deepcopy = function(tab) - local _type = type(tab) local copy - if _type == "table" then + if type(tab) == "table" then copy = {} for key, value in next, tab, nil do copy[utility.deepcopy(key)] = utility.deepcopy(value)