iniformat.py (3783B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\eveprefs\iniformat.py 2 from __future__ import print_function 3 from cPickle import Unpickler, dumps 4 import cStringIO 5 import re 6 import types 7 from . import DEFAULT_ENCODING 8 from .filebased import FileBasedIniFile 9 10 class IniIniFile(FileBasedIniFile): 11 nopickles = [types.IntType, 12 types.FloatType, 13 types.LongType, 14 types.StringType, 15 types.UnicodeType] 16 number = re.compile('[\\-]?[\\d.]+') 17 18 def __init__(self, shortname, root = None, readOnly = False): 19 FileBasedIniFile.__init__(self, shortname, '.ini', root, readOnly) 20 self.keyval = {} 21 self.lines = self._Read().splitlines() 22 oldLines = self.lines 23 self.lines = [] 24 for newLine in oldLines: 25 try: 26 self.lines.append(unicode(newLine, DEFAULT_ENCODING).encode(DEFAULT_ENCODING)) 27 except: 28 print('Unencodable data discovered in ini file. Removing offending data.') 29 30 for line in self.lines: 31 sline = line.strip() 32 if sline and sline[0] not in '[;#': 33 sep = sline.find('=') 34 if sep >= 0: 35 key = sline[:sep].strip() 36 self.keyval[key] = line 37 38 def _GetKeySet(self): 39 return self.keyval 40 41 def _GetValue(self, key): 42 value = self.keyval[key] 43 sep = value.find('=') 44 value = value[sep + 1:].strip() 45 if not len(value): 46 return value 47 if value.startswith('"') and value.endswith('"'): 48 return unicode(value[1:-1]) 49 if value[:7] == 'pickle:': 50 io = cStringIO.StringIO(value[7:].replace('\x1f', '\n')) 51 return Unpickler(io).load() 52 if self.number.match(value): 53 try: 54 return int(value) 55 except ValueError: 56 pass 57 58 try: 59 return float(value) 60 except ValueError: 61 pass 62 63 return unicode(value) 64 65 def _SetValue(self, key, value, forcePickle): 66 line = self._GetLineFromFixedKeyAndValue(key, value, forcePickle) 67 if key in self.keyval: 68 old = self.keyval[key] 69 if line == self.keyval[key]: 70 return 71 lineno = self.lines.index(old) 72 self.lines.remove(old) 73 self.lines.insert(lineno, line) 74 else: 75 self.lines.append(line) 76 self.keyval[key] = line 77 self._FlushToDisk() 78 79 def _SpoofKey(self, key, value): 80 key = self.FixKey(key) 81 self.keyval[key] = self._GetLineFromFixedKeyAndValue(key, value) 82 83 def FixKey(self, key): 84 key = FileBasedIniFile.FixKey(self, key) 85 return key.strip().replace('|', '||').replace('=', '-|-') 86 87 def _GetLineFromFixedKeyAndValue(self, fixedKey, value, forcePickle = False): 88 if type(value) in types.StringTypes: 89 try: 90 value = value.encode(DEFAULT_ENCODING) 91 except UnicodeEncodeError: 92 forcePickle = True 93 except UnicodeDecodeError: 94 forcePickle = True 95 96 if forcePickle or type(value) not in self.nopickles: 97 value = 'pickle:' + dumps(value).replace('\n', '\x1f') 98 else: 99 value = unicode(value).strip() 100 return '%s=%s' % (fixedKey, value) 101 102 def _DeleteValue(self, key): 103 self.lines.remove(self.keyval[key]) 104 del self.keyval[key] 105 self._FlushToDisk() 106 107 def _GetSaveStr(self): 108 sortlines = [ (line.lower()[:3], line) for line in self.lines ] 109 sortlines.sort() 110 lines = [ line[1] for line in sortlines ] 111 savestr = '\r\n'.join(lines).encode('cp1252') 112 return savestr