--[[
* Ashita - Copyright ( c ) 2014 - 2017 atom0s [ atom0s @ live.com ]
*
* This work is licensed under the Creative Commons Attribution - NonCommercial - NoDerivatives 4.0 International License .
* To view a copy of this license , visit http : // creativecommons.org / licenses / by - nc - nd / 4.0 / or send a letter to
* Creative Commons , PO Box 1866 , Mountain View , CA 94042 , USA .
*
* By using Ashita , you agree to the above license and its terms .
*
* Attribution - You must give appropriate credit , provide a link to the license and indicate if changes were
* made . You must do so in any reasonable manner , but not in any way that suggests the licensor
* endorses you or your use .
*
* Non - Commercial - You may not use the material ( Ashita ) for commercial purposes .
*
* No - Derivatives - If you remix , transform , or build upon the material ( Ashita ) , you may not distribute the
* modified material . You are , however , allowed to submit the modified works back to the original
* Ashita project in attempt to have it added to the original project .
*
* You may not apply legal terms or technological measures that legally restrict others
* from doing anything the license permits .
*
* No warranties are given .
] ] --
ashita = ashita or { } ;
ashita.settings = ashita.settings or { } ;
if ( ashita.settings . JSON == nil ) then
ashita.settings . JSON = require ( ' json.json ' ) ;
end
----------------------------------------------------------------------------------------------------
-- func: normalize_path
-- desc: Normalizes a paths slashes to a single format.
----------------------------------------------------------------------------------------------------
local function normalize_path ( path )
local p = path : gsub ( ' / ' , ' \\ ' ) ;
local i = p : find ( ' \\ ' ) ;
while ( i ~= nil ) do
if ( p : sub ( i + 1 , i + 1 ) == ' \\ ' ) then
p = p : remove ( i ) ;
i = p : find ( ' \\ ' ) ;
else
i = p : find ( ' \\ ' , i + 1 ) ;
end
end
return p ;
end
----------------------------------------------------------------------------------------------------
-- func: path_from_file
-- desc: Obtains a path from a file location.
----------------------------------------------------------------------------------------------------
local function path_from_file ( f )
-- Ensure the given data has a file extension..
if ( f : find ( ' %. ' ) == nil ) then
return f ;
end
-- Find the location of the first slash..
local s = f : find ( ' \\ ' ) ;
if ( s == nil ) then return f ; end
-- Find the last slash location..
while ( true ) do
local c = f : find ( ' \\ ' , s + 1 ) ;
if ( c == nil ) then break ; end
s = c ;
end
-- Pull and return the file path..
return f : sub ( 0 , s - 1 ) ;
end
----------------------------------------------------------------------------------------------------
-- func: save_settings
-- desc: Saves a table, as JSON, to the given file.
----------------------------------------------------------------------------------------------------
local function save_settings ( name , t )
-- Convert the table to json..
local data = ashita.settings . JSON : encode_pretty ( t , nil , { pretty = true , align_keys = false , indent = ' ' } ) ;
if ( data == nil ) then
error ( ' Failed to convert data to JSON for saving. ' ) ;
return false ;
end
-- Normalize the path..
local name = normalize_path ( name ) ;
-- Ensure the path exists..
local dir = path_from_file ( name ) ;
if ( not ashita.file . dir_exists ( dir ) ) then
ashita.file . create_dir ( dir ) ;
end
-- Save the config file..
local f = io.open ( name , ' w ' ) ;
if ( f == nil ) then
error ( ' Failed to save configuration. ' ) ;
return false ;
end
-- Write and close the file..
f : write ( data ) ;
f : close ( ) ;
return true ;
end
ashita.settings . save = save_settings ;
----------------------------------------------------------------------------------------------------
-- func: load_settings
-- desc: Loads a json settings file and converts its data to a Lua table.
----------------------------------------------------------------------------------------------------
local function load_settings ( name )
-- Load the file for reading..
local f = io.open ( name , ' r ' ) ;
if ( f == nil ) then
return nil ;
end
-- Read the full file contents..
local raw = f : read ( ' *a ' ) ;
f : close ( ) ;
-- Convert the JSON to a Lua table..
local data = ashita.settings . JSON : decode ( raw ) ;
if ( type ( data ) == ' table ' ) then return data ; end
-- Failed to convert..
return nil ;
end
ashita.settings . load = load_settings ;
----------------------------------------------------------------------------------------------------
-- func: load_settings_merged
-- desc: Loads a json settings file and converts its data to a Lua table. Afterward, merges the
-- loaded settings into the parent table.
----------------------------------------------------------------------------------------------------
local function load_settings_merged ( name , parent )
-- Ensure the parent table is valid..
if ( parent == nil or type ( parent ) ~= ' table ' ) then
return nil ;
end
-- Load the settings..
local data = ashita.settings . load ( name ) ;
if ( data == nil ) then
return parent ;
end
-- Merge the tables..
return table.merge ( parent , data ) ;
end
ashita.settings . load_merged = load_settings_merged ;