| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #!/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 texts 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
|