#!/usr/bin/env python # -*- coding: utf-8 -*- import os import json class TextConfig: def __init__(self, file): self._items=[] self._count = 0 self._file = file if file!=None: self.Load() def Load(self): self._items = [] count = 0 try: with open(self._file, "r") as f: for line in f: if " " in line and line.startswith("#")==False and line.startswith(";")==False: #var, val = line.split(" ",2); var, val = self._getKeyValueFromLine(line) val = val.strip() var = var.strip() if val.isnumeric(): self._items.append({"var":var.strip() ,"val": int(val) }) count+=1 elif val.isdecimal(): self._items.append({"var":var.strip() ,"val": float(val) }) count+=1 elif val.startswith('"') and val.endswith('"'): self._items.append({"var":var.strip() ,"val": val[1:-1] }) count+=1 elif val.startswith('{') and val.endswith('}'): self._items.append({"var":var.strip() ,"val": json.loads(val[1:-1]) }) count+=1 elif val.startswith('[') and val.endswith(']'): self._items.append({"var":var.strip() ,"val": json.loads(val[1:-1]) }) count+=1 except: print("Failed to load texts from file") self._count = count return self._items def Save(self): tmp="" keysStored=[] try: with open(self._file,"r") as f: for line in f: bWritte=False if line !="" and " " in line and line.startswith("#")==False and line.startswith(";")==False: #var, val = line.split(" ",2); var, val = self._getKeyValueFromLine(line) val2 = self.getValue(var) if val2 is int or val2 is float or isinstance(val2, int) or isinstance(val2, float) or val2.isnumeric() or val2.isdecimal(): tmp+=var+" "+str(val2)+"\n" keysStored.append(var) bWritte=True elif val2 is str or isinstance(val2, str): tmp+=var+' "'+val2+'"' + "\n" keysStored.append(var) bWritte=True elif val2 is dict or val2 is list or isinstance(val2, dict) or isinstance(val2, list): tmp+=var+" "+json.dumps(val2)+"\n" keysStored.append(var) bWritte=True if bWritte==False: tmp+=line except: print("Failed to load stats from file for saving") if os.path.isfile(self._file): os.remove(self._file) with open(self._file, 'w') as f: f.write(tmp) for i in range(0,self._count): if self._items[i]["var"] in keysStored == False: f.write("\n"+self._items[i]["var"]+" " + self._items[i]["val"]) def __getitem__(self,key): return self.getValue(key) def getValue(self,key): if self._count==0: return None if key is int or isinstance(key, int): return self._items[key] else: for i in range(0,self._count): if(self._items[i]["var"]==key): return self._items[i]["val"] def getItems(self): return self._items def setValue(self, key, value=None): if key is dict or isinstance(key,dict): for k in key: self.setValue(k, key[k]) elif key is list or isinstance(key, list): pass else: if key is int or isinstance(key, int): self._items[key] = value else: for i in range(0,self._count): if(self._items[i]["var"]==key): self._items[i]["val"]=value self._items.append({ "var":str(key), "val":value }) self._count+=1 def _getKeyValueFromLine(self, s:str): s.strip() bInKey=True lpos=len(s) pos1 = s.find(" ") pos2 = s.find("\t") pos3 = s.find("\n") pos4 = s.find("\r") if(lpos>pos1 and pos1>0): lpos=pos1 if(lpos>pos2 and pos2>0): lpos=pos2 if(lpos>pos3 and pos3>0): lpos=pos3 if(lpos>pos4 and pos4>0): lpos=pos4 return s[0:lpos].strip(), s[lpos:] def __setitem__(self,key,value): if key is int or isinstance(key, int): self._items[key] = value else: for i in range(0,self._count): if(self._items[i]["var"]==key): self._items[i]["val"]=value self._items.append({ "var":str(key), "val":value }) self._count+=1 @property def count(self): return self._count