NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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