home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- '''
- Base Class for DesktopEntry, IconTheme and IconData
- '''
- import re
- import os.path as os
- import codecs
- from Exceptions import *
- import xdg.Locale as xdg
- import gettext
-
- class IniFile:
- defaultGroup = ''
- fileExtension = ''
- filename = ''
- gettext_domain = None
- tainted = False
-
- def __init__(self, filename = None):
- self.content = dict()
- if filename:
- self.parse(filename)
-
-
-
- def parse(self, filename, headers):
- content = self.content
- if not os.path.isfile(filename):
- raise ParsingError('File not found', filename)
- os.path.isfile(filename)
-
- try:
- file(filename, 'r')
- except IOError:
- return None
-
- for line in file(filename, 'r'):
- line = line.strip()
- if not line:
- continue
- continue
- if line[0] == '#':
- continue
- continue
- if line[0] == '[':
- currentGroup = line.lstrip('[').rstrip(']')
- if debug and self.hasGroup(currentGroup):
- raise DuplicateGroupError(currentGroup, filename)
- self.hasGroup(currentGroup)
- content[currentGroup] = { }
- continue
- index = line.find('=')
- key = line[0:index].strip()
- value = line[index + 1:].strip()
-
- try:
- if debug and self.hasKey(key, currentGroup):
- raise DuplicateKeyError(key, currentGroup, filename)
- self.hasKey(key, currentGroup)
- content[currentGroup][key] = value
- continue
- except (IndexError, UnboundLocalError):
- raise ParsingError('[%s]-Header missing' % headers[0], filename)
- continue
-
-
-
- self.filename = filename
- self.tainted = False
- for header in headers:
- if content.has_key(header):
- self.defaultGroup = header
- break
- continue
- None<EXCEPTION MATCH>(IndexError, UnboundLocalError)
- else:
- raise ParsingError('[%s]-Header missing' % headers[0], filename)
- e = None.content.get('Desktop Entry', { })
- self.gettext_domain = e.get('X-GNOME-Gettext-Domain', e.get('X-Ubuntu-Gettext-Domain', None))
-
-
- def get(self, key, group = None, locale = False, type = 'string', list = False):
- if not group:
- group = self.defaultGroup
-
- if self.content.has_key(group) and self.content[group].has_key(key):
- if locale:
- key = self._IniFile__addLocale(key, group)
- if key.endswith(']') or not (self.gettext_domain):
- value = self.content[group][key]
- else:
- value = gettext.dgettext(self.gettext_domain, self.content[group][key])
- else:
- value = self.content[group][key]
- elif debug:
- if not self.content.has_key(group):
- raise NoGroupError(group, self.filename)
- self.content.has_key(group)
- if not self.content[group].has_key(key):
- raise NoKeyError(key, group, self.filename)
- self.content[group].has_key(key)
- else:
- value = ''
- if list == True:
- values = self.getList(value)
- result = []
- else:
- values = [
- value]
- for value in values:
- if type == 'string' and locale == True:
- value = value.decode('utf-8', 'ignore')
- elif type == 'boolean':
- value = self._IniFile__getBoolean(value)
- elif type == 'integer':
-
- try:
- value = int(value)
- except ValueError:
- value = 0
- except:
- None<EXCEPTION MATCH>ValueError
-
-
- None<EXCEPTION MATCH>ValueError
- if type == 'numeric':
-
- try:
- value = float(value)
- except ValueError:
- value = 0
- except:
- None<EXCEPTION MATCH>ValueError
-
-
- None<EXCEPTION MATCH>ValueError
- if type == 'regex':
- value = re.compile(value)
- elif type == 'point':
- value = value.split(',')
-
- if list == True:
- result.append(value)
- continue
- result = value
-
- return result
-
-
- def getList(self, string):
- if re.search('(?<!\\\\)\\;', string):
- list = re.split('(?<!\\\\);', string)
- elif re.search('(?<!\\\\)\\|', string):
- list = re.split('(?<!\\\\)\\|', string)
- elif re.search('(?<!\\\\),', string):
- list = re.split('(?<!\\\\),', string)
- else:
- list = [
- string]
- if list[-1] == '':
- list.pop()
-
- return list
-
-
- def __getBoolean(self, boolean):
- if boolean == 1 and boolean == 'true' or boolean == 'True':
- return True
- if boolean == 0 and boolean == 'false' or boolean == 'False':
- return False
- return False
-
-
- def __addLocale(self, key, group = None):
- '''add locale to key according the current lc_messages'''
- if not group:
- group = self.defaultGroup
-
- for lang in xdg.Locale.langs:
- if self.content[group].has_key(key + '[' + lang + ']'):
- return key + '[' + lang + ']'
-
- return key
-
-
- def validate(self, report = 'All'):
- '''validate ... report = All / Warnings / Errors'''
- self.warnings = []
- self.errors = []
- self.fileExtension = os.path.splitext(self.filename)[1]
- self.checkExtras()
- for group in self.content:
- self.checkGroup(group)
- for key in self.content[group]:
- self.checkKey(key, self.content[group][key], group)
- if self.content[group][key] == '':
- self.warnings.append("Value of Key '%s' is empty" % key)
- continue
-
-
- msg = ''
- if report == 'All' or report == 'Warnings':
- for line in self.warnings:
- msg += '\n- ' + line
-
-
- if report == 'All' or report == 'Errors':
- for line in self.errors:
- msg += '\n- ' + line
-
-
- if msg:
- raise ValidationError(msg, self.filename)
- msg
-
-
- def checkGroup(self, group):
- pass
-
-
- def checkKey(self, key, value, group):
- pass
-
-
- def checkValue(self, key, value, type = 'string', list = False):
- if list == True:
- values = self.getList(value)
- else:
- values = [
- value]
- for value in values:
- if type == 'string':
- code = self.checkString(value)
- elif type == 'boolean':
- code = self.checkBoolean(value)
- elif type == 'number':
- code = self.checkNumber(value)
- elif type == 'integer':
- code = self.checkInteger(value)
- elif type == 'regex':
- code = self.checkRegex(value)
- elif type == 'point':
- code = self.checkPoint(value)
-
- if code == 1:
- self.errors.append("'%s' is not a valid %s" % (value, type))
- continue
- if code == 2:
- self.warnings.append("Value of key '%s' is deprecated" % key)
- continue
-
-
-
- def checkExtras(self):
- pass
-
-
- def checkBoolean(self, value):
- if value == '1' or value == '0':
- return 2
- if not value == 'true' or value == 'false':
- return 1
-
-
- def checkNumber(self, value):
-
- try:
- float(value)
- except:
- return 1
-
-
-
- def checkInteger(self, value):
-
- try:
- int(value)
- except:
- return 1
-
-
-
- def checkPoint(self, value):
- if not re.match('^[0-9]+,[0-9]+$', value):
- return 1
-
-
- def checkString(self, value):
- if not value.decode('utf-8', 'ignore').encode('ascii', 'ignore') == value:
- return 1
-
-
- def checkRegex(self, value):
-
- try:
- re.compile(value)
- except:
- return 1
-
-
-
- def write(self, filename = None):
- if not filename and not (self.filename):
- raise ParsingError('File not found', '')
- not (self.filename)
- if filename:
- self.filename = filename
- else:
- filename = self.filename
- if not os.path.isdir(os.path.dirname(filename)):
- os.makedirs(os.path.dirname(filename))
-
- fp = codecs.open(filename, 'w')
- if self.defaultGroup:
- fp.write('[%s]\n' % self.defaultGroup)
- for key, value in self.content[self.defaultGroup].items():
- fp.write('%s=%s\n' % (key, value))
-
- fp.write('\n')
-
- for name, group in self.content.items():
- if name != self.defaultGroup:
- fp.write('[%s]\n' % name)
- for key, value in group.items():
- fp.write('%s=%s\n' % (key, value))
-
- fp.write('\n')
- continue
-
- self.tainted = False
-
-
- def set(self, key, value, group = None, locale = False):
- if not group:
- group = self.defaultGroup
-
- if locale == True and len(xdg.Locale.langs) > 0:
- key = key + '[' + xdg.Locale.langs[0] + ']'
-
-
- try:
- if isinstance(value, unicode):
- self.content[group][key] = value.encode('utf-8', 'ignore')
- else:
- self.content[group][key] = value
- except KeyError:
- raise NoGroupError(group, self.filename)
-
- self.tainted = value == self.get(key, group)
-
-
- def addGroup(self, group):
- if self.hasGroup(group):
- if debug:
- raise DuplicateGroupError(group, self.filename)
- debug
- else:
- self.content[group] = { }
- self.tainted = True
-
-
- def removeGroup(self, group):
- existed = group in self.content
- if existed:
- del self.content[group]
- self.tainted = True
- elif debug:
- raise NoGroupError(group, self.filename)
-
- return existed
-
-
- def removeKey(self, key, group = None, locales = True):
- if not group:
- group = self.defaultGroup
-
-
- try:
- if locales:
- for name, value in self.content[group].items():
- if re.match('^' + key + xdg.Locale.regex + '$', name) and name != key:
- value = self.content[group][name]
- del self.content[group][name]
- continue
-
-
- value = self.content[group][key]
- del self.content[group][key]
- self.tainted = True
- return value
- except KeyError:
- e = None
- if debug:
- if e == group:
- raise NoGroupError(group, self.filename)
- e == group
- raise NoKeyError(key, group, self.filename)
- debug
- return ''
-
-
-
- def groups(self):
- return self.content.keys()
-
-
- def hasGroup(self, group):
- if self.content.has_key(group):
- return True
- return False
-
-
- def hasKey(self, key, group = None):
- if not group:
- group = self.defaultGroup
-
- if self.content[group].has_key(key):
- return True
- return False
-
-
- def getFileName(self):
- return self.filename
-
-
-