E4XML/ProjectHandler.py

changeset 0
de9c2efb9d02
child 5
fa319c01b604
diff -r 000000000000 -r de9c2efb9d02 E4XML/ProjectHandler.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/E4XML/ProjectHandler.py	Mon Dec 28 16:03:33 2009 +0000
@@ -0,0 +1,652 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2003 - 2009 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the handler class for reading an XML project file.
+"""
+
+import os
+
+from Config import projectFileFormatVersion
+from XMLHandlerBase import XMLHandlerBase
+
+import Utilities
+
+class ProjectHandler(XMLHandlerBase):
+    """
+    Class implementing a sax handler to read an XML project file.
+    """
+    def __init__(self, project):
+        """
+        Constructor
+        
+        @param project Reference to the project object to store the
+                information into.
+        """
+        XMLHandlerBase.__init__(self)
+        
+        self.startDocumentSpecific = self.startDocumentProject
+        
+        self.elements.update({
+            'Project' : (self.startProject, self.defaultEndElement),
+            'Language' : (self.defaultStartElement, self.endLanguage), 
+            'ProjectWordList' : (self.defaultStartElement, self.endProjectWordList), 
+            'ProjectExcludeList' : (self.defaultStartElement, 
+                                    self.endProjectExcludeList), 
+            'ProgLanguage' : (self.startProgLanguage, self.endProgLanguage),
+            'ProjectType' : (self.defaultStartElement, self.endProjectType),
+            'Description' : (self.defaultStartElement, self.endDescription),
+            'Version' : (self.defaultStartElement, self.endVersion),
+            'Author' : (self.defaultStartElement, self.endAuthor),
+            'Email' : (self.defaultStartElement, self.endEmail),
+            'VcsType' : (self.defaultStartElement, self.endVcsType),
+            'VcsOptions' : (self.startVcsOptions, self.endVcsOptions),
+            'VcsOtherData' : (self.startVcsOtherData, self.endVcsOtherData),
+            'Dir' : (self.defaultStartElement, self.endDir),
+            'Name' : (self.defaultStartElement, self.endName),
+            'Source' : (self.startSource, self.endSource),
+            'Form' : (self.startForm, self.endForm),
+            'Translation' : (self.startTranslation, self.endTranslation),
+            'TranslationPattern' : (self.defaultStartElement, 
+                                    self.endTranslationPattern),
+            'TranslationsBinPath' : (self.startTranslationsBinPath, 
+                                     self.endTranslationsBinPath),
+            'TranslationException' : (self.startTranslationException, 
+                                      self.endTranslationException),
+            'Resource' : (self.startResource, self.endResource),
+            'Interface' : (self.startInterface, self.endInterface),
+            'Other' : (self.startOther, self.endOther),
+            'MainScript' : (self.startMainScript, self.endMainScript),
+            'FiletypeAssociation' : (self.startFiletypeAssociation, 
+                                     self.defaultEndElement),
+            'LexerAssociation' : (self.startLexerAssociation, 
+                                  self.defaultEndElement), 
+            'ProjectTypeSpecificData' : (self.startProjectTypeSpecificData, 
+                                     self.endProjectTypeSpecificData), 
+            'DocumentationParams' : (self.startDocumentationParams, 
+                                     self.endDocumentationParams), 
+            'PackagersParams' : (self.startPackagersParams, self.endPackagersParams), 
+            'CheckersParams' : (self.startCheckersParams, self.endCheckersParams),
+            'OtherToolsParams' : (self.startOtherToolsParams, self.endOtherToolsParams),
+            # parameters kept for backward compatibility
+            'UIType' : (self.defaultStartElement, self.endUIType),
+            'TranslationPrefix' : (self.startTranslationPrefix, 
+                                   self.endTranslationPrefix),
+            'Eric4DocParams' : (self.startEric4DocParams, self.endEric4DocParams),
+            'Eric4ApiParams' : (self.startEric4ApiParams, self.endEric4ApiParams),
+            'CxfreezeParams' : (self.startCxfreezeParams, self.endCxfreezeParams),
+            'PyLintParams' : (self.startPyLintParams, self.endPyLintParams),
+            # for really old project files
+            'HappyDocParams' : (self.defaultStartElement, self.defaultEndElement),
+        })
+        
+        self.project = project
+        
+    def startDocumentProject(self):
+        """
+        Handler called, when the document parsing is started.
+        """
+        self.version = ''
+        self.pathStack = []
+    
+    ###################################################
+    ## below follow the individual handler functions
+    ###################################################
+    
+    def endLanguage(self):
+        """
+        Handler method for the "Language" end tag.
+        """
+        self.buffer = self.utf8_to_code(self.buffer)
+        self.project.pdata["SPELLLANGUAGE"] = [self.buffer]
+        
+    def endProjectWordList(self):
+        """
+        Handler method for the "ProjectWordList" end tag.
+        """
+        path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        self.project.pdata["SPELLWORDS"] = [path]
+        
+    def endProjectExcludeList(self):
+        """
+        Handler method for the "ProjectExcludeList" end tag.
+        """
+        path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        self.project.pdata["SPELLEXCLUDES"] = [path]
+        
+    def startProgLanguage(self, attrs):
+        """
+        Handler method for the "Source" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        mixedLanguage = int(attrs.get("mixed", "0"))
+        self.project.pdata["MIXEDLANGUAGE"] = [mixedLanguage]
+        self.buffer = ""
+        
+    def endProgLanguage(self):
+        """
+        Handler method for the "ProgLanguage" end tag.
+        """
+        self.buffer = self.utf8_to_code(self.buffer)
+        self.project.pdata["PROGLANGUAGE"] = [self.buffer]
+        
+    def endProjectType(self):
+        """
+        Handler method for the "ProjectType" end tag.
+        """
+        self.buffer = self.utf8_to_code(self.buffer)
+        self.project.pdata["PROJECTTYPE"] = [self.buffer]
+        
+    def endDescription(self):
+        """
+        Handler method for the "Description" end tag.
+        """
+        self.buffer = self.unescape(self.utf8_to_code(self.buffer))
+        if self.version >= '4.3':
+            self.project.pdata["DESCRIPTION"] = [self.decodedNewLines(self.buffer)]
+        else:
+            self.project.pdata["DESCRIPTION"] = [self.buffer]
+        
+    def endVersion(self):
+        """
+        Handler method for the "Version" end tag.
+        """
+        self.buffer = self.unescape(self.utf8_to_code(self.buffer))
+        self.project.pdata["VERSION"] = [self.buffer]
+        
+    def endAuthor(self):
+        """
+        Handler method for the "Author" end tag.
+        """
+        self.buffer = self.unescape(self.utf8_to_code(self.buffer))
+        self.project.pdata["AUTHOR"] = [self.buffer]
+        
+    def endEmail(self):
+        """
+        Handler method for the "Email" end tag.
+        """
+        self.buffer = self.unescape(self.utf8_to_code(self.buffer))
+        self.project.pdata["EMAIL"] = [self.buffer]
+        
+    def endVcsType(self):
+        """
+        Handler method for the "VcsType" end tag.
+        """
+        self.buffer = self.utf8_to_code(self.buffer)
+        self.project.pdata["VCS"] = [self.buffer]
+        
+    def startVcsOptions(self, attrs):
+        """
+        Handler method for the "VcsOptions" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endVcsOptions(self):
+        """
+        Handler method for the "VcsOptions" end tag.
+        """
+        try:
+            self.project.pdata["VCSOPTIONS"] = [self.stack[-1]]
+        except IndexError:
+            self.project.pdata["VCSOPTIONS"] = []
+        
+    def startVcsOtherData(self, attrs):
+        """
+        Handler method for the "VcsOtherData" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endVcsOtherData(self):
+        """
+        Handler method for the "VcsOtherData" end tag.
+        """
+        try:
+            self.project.pdata["VCSOTHERDATA"] = [self.stack[-1]]
+        except IndexError:
+            self.project.pdata["VCSOTHERDATA"] = []
+        
+    def startProjectTypeSpecificData(self, attrs):
+        """
+        Handler method for the "ProjectTypeSpecificData" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endProjectTypeSpecificData(self):
+        """
+        Handler method for the "ProjectTypeSpecificData" end tag.
+        """
+        try:
+            self.project.pdata["PROJECTTYPESPECIFICDATA"] = self.stack[-1]
+        except IndexError:
+            self.project.pdata["PROJECTTYPESPECIFICDATA"] = {}
+        
+    def startDocumentationParams(self, attrs):
+        """
+        Handler method for the "DocumentationParams" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endDocumentationParams(self):
+        """
+        Handler method for the "DocumentationParams" end tag.
+        """
+        try:
+            self.project.pdata["DOCUMENTATIONPARMS"] = self.stack[-1]
+        except IndexError:
+            self.project.pdata["DOCUMENTATIONPARMS"] = {}
+        
+    def startPackagersParams(self, attrs):
+        """
+        Handler method for the "PackagersParams" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endPackagersParams(self):
+        """
+        Handler method for the "PackagersParams" end tag.
+        """
+        try:
+            self.project.pdata["PACKAGERSPARMS"] = self.stack[-1]
+        except IndexError:
+            self.project.pdata["PACKAGERSPARMS"] = {}
+        
+    def startCheckersParams(self, attrs):
+        """
+        Handler method for the "CheckersParams" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endCheckersParams(self):
+        """
+        Handler method for the "CheckersParams" end tag.
+        """
+        try:
+            self.project.pdata["CHECKERSPARMS"] = self.stack[-1]
+        except IndexError:
+            self.project.pdata["CHECKERSPARMS"] = {}
+        
+    def startOtherToolsParams(self, attrs):
+        """
+        Handler method for the "OtherToolsParams" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endOtherToolsParams(self):
+        """
+        Handler method for the "OtherToolsParams" end tag.
+        """
+        try:
+            self.project.pdata["OTHERTOOLSPARMS"] = self.stack[-1]
+        except IndexError:
+            self.project.pdata["OTHERTOOLSPARMS"] = {}
+        
+    def endDir(self):
+        """
+        Handler method for the "Dir" end tag.
+        """
+        self.buffer = self.utf8_to_code(self.buffer)
+        self.pathStack.append(self.buffer)
+        
+    def endName(self):
+        """
+        Handler method for the "Name" end tag.
+        """
+        self.buffer = self.utf8_to_code(self.buffer)
+        self.pathStack.append(self.buffer)
+        
+    def endTranslationPattern(self):
+        """
+        Handler method for the "TranslationPattern" end tag.
+        """
+        self.project.pdata["TRANSLATIONPATTERN"].append(
+            unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer))))
+        
+    def startTranslationsBinPath(self, attrs):
+        """
+        Handler method for the "TranslationsBinPath" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.pathStack = []
+        self.buffer = ""
+        
+    def endTranslationsBinPath(self):
+        """
+        Handler method for the "TranslationsBinPath" end tag.
+        """
+        if self.version >= '4.3':
+            path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        else:
+            path = self.__buildPath()
+        self.project.pdata["TRANSLATIONSBINPATH"].append(path)
+        
+    def startSource(self, attrs):
+        """
+        Handler method for the "Source" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.pathStack = []
+        self.buffer = ""
+        
+    def endSource(self):
+        """
+        Handler method for the "Source" end tag.
+        """
+        if self.version >= '4.3':
+            path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        else:
+            path = self.__buildPath()
+        self.project.pdata["SOURCES"].append(path)
+        
+    def startForm(self, attrs):
+        """
+        Handler method for the "Form" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.pathStack = []
+        self.buffer = ""
+        
+    def endForm(self):
+        """
+        Handler method for the "Form" end tag.
+        """
+        if self.version >= '4.3':
+            path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        else:
+            path = self.__buildPath()
+        self.project.pdata["FORMS"].append(path)
+        
+    def startTranslation(self, attrs):
+        """
+        Handler method for the "Translation" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.pathStack = []
+        self.buffer = ""
+        
+    def endTranslation(self):
+        """
+        Handler method for the "Translation" end tag.
+        """
+        if self.version >= '4.3':
+            path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        else:
+            path = self.__buildPath()
+        self.project.pdata["TRANSLATIONS"].append(path)
+        
+    def startTranslationException(self, attrs):
+        """
+        Handler method for the "TranslationException" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.pathStack = []
+        self.buffer = ""
+        
+    def endTranslationException(self):
+        """
+        Handler method for the "TranslationException" end tag.
+        """
+        if self.version >= '4.3':
+            path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        else:
+            path = self.__buildPath()
+        self.project.pdata["TRANSLATIONEXCEPTIONS"].append(path)
+        
+    def startResource(self, attrs):
+        """
+        Handler method for the "Resource" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.pathStack = []
+        self.buffer = ""
+        
+    def endResource(self):
+        """
+        Handler method for the "Resource" end tag.
+        """
+        if self.version >= '4.3':
+            path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        else:
+            path = self.__buildPath()
+        self.project.pdata["RESOURCES"].append(path)
+        
+    def startInterface(self, attrs):
+        """
+        Handler method for the "Interface" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.pathStack = []
+        self.buffer = ""
+        
+    def endInterface(self):
+        """
+        Handler method for the "Interface" end tag.
+        """
+        if self.version >= '4.3':
+            path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        else:
+            path = self.__buildPath()
+        self.project.pdata["INTERFACES"].append(path)
+        
+    def startOther(self, attrs):
+        """
+        Handler method for the "Other" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.pathStack = []
+        self.buffer = ""
+        
+    def endOther(self):
+        """
+        Handler method for the "Other" end tag.
+        """
+        if self.version >= '4.3':
+            path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        else:
+            path = self.__buildPath()
+        self.project.pdata["OTHERS"].append(path)
+        
+    def startMainScript(self, attrs):
+        """
+        Handler method for the "MainScript" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.pathStack = []
+        self.buffer = ""
+        
+    def endMainScript(self):
+        """
+        Handler method for the "MainScript" end tag.
+        """
+        if self.version >= '4.3':
+            path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        else:
+            path = self.__buildPath()
+        self.project.pdata["MAINSCRIPT"] = [path]
+        
+    def startFiletypeAssociation(self, attrs):
+        """
+        Handler method for the "FiletypeAssociation" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        pattern = attrs.get("pattern", "")
+        filetype = attrs.get("type", "OTHERS")
+        if pattern:
+            self.project.pdata["FILETYPES"][pattern] = filetype
+        
+    def startLexerAssociation(self, attrs):
+        """
+        Handler method for the "LexerAssociation" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        pattern = attrs.get("pattern", "")
+        lexer = attrs.get("lexer", "")
+        if pattern:
+            self.project.pdata["LEXERASSOCS"][pattern] = lexer
+        
+    def __buildPath(self):
+        """
+        Private method to assemble a path.
+        
+        @return The ready assembled path. (string)
+        """
+        path = ""
+        if self.pathStack and not self.pathStack[0]:
+            self.pathStack[0] = os.sep
+        for p in self.pathStack:
+            path = os.path.join(path, p)
+        return path
+        
+    def startProject(self, attrs):
+        """
+        Handler method for the "Project" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.version = attrs.get('version', projectFileFormatVersion)
+        
+    def getVersion(self):
+        """
+        Public method to retrieve the version of the project.
+        
+        @return String containing the version number.
+        """
+        return self.version
+    
+    ###############################################################
+    ## below are handler methods kept for backward compatibility
+    ###############################################################
+    
+    def endUIType(self):
+        """
+        Handler method for the "UIType" end tag.
+        """
+        self.buffer = self.utf8_to_code(self.buffer)
+        self.project.pdata["PROJECTTYPE"] = [self.buffer]
+        
+    def startTranslationPrefix(self, attrs):
+        """
+        Handler method for the "TranslationPrefix" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.pathStack = []
+        self.buffer = ""
+        
+    def endTranslationPrefix(self):
+        """
+        Handler method for the "TranslationPrefix" end tag.
+        """
+        if self.version >= '4.3':
+            path = unicode(Utilities.toNativeSeparators(self.utf8_to_code(self.buffer)))
+        else:
+            path = self.__buildPath()
+        if not path.endswith("_"):
+            path = "%s_" % path
+        self.project.pdata["TRANSLATIONPATTERN"].append("%s%%language%%.ts" % path)
+        
+    def startEric4DocParams(self, attrs):
+        """
+        Handler method for the "Eric4DocParams" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endEric4DocParams(self):
+        """
+        Handler method for the "Eric4DocParams" end tag.
+        """
+        try:
+            self.project.pdata["DOCUMENTATIONPARMS"]["ERIC4DOC"] = self.stack[-1]
+        except IndexError:
+            pass
+        
+    def startEric4ApiParams(self, attrs):
+        """
+        Handler method for the "Eric4ApiParams" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endEric4ApiParams(self):
+        """
+        Handler method for the "Eric4ApiParams" end tag.
+        """
+        try:
+            self.project.pdata["DOCUMENTATIONPARMS"]["ERIC4API"] = self.stack[-1]
+        except IndexError:
+            pass
+        
+    def startCxfreezeParams(self, attrs):
+        """
+        Handler method for the "CxfreezeParams" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endCxfreezeParams(self):
+        """
+        Handler method for the "CxfreezeParams" end tag.
+        """
+        try:
+            self.project.pdata["PACKAGERSPARMS"]["CXFREEZE"] = self.stack[-1]
+        except IndexError:
+            self.project.pdata["PACKAGERSPARMS"] = {}
+        
+    def startPyLintParams(self, attrs):
+        """
+        Handler method for the "PyLintParams" start tag.
+        
+        @param attrs list of tag attributes
+        """
+        self.defaultStartElement(attrs)
+        self._prepareBasics()
+        
+    def endPyLintParams(self):
+        """
+        Handler method for the "PyLintParams" end tag.
+        """
+        try:
+            self.project.pdata["CHECKERSPARMS"]["PYLINT"] = self.stack[-1]
+        except IndexError:
+            self.project.pdata["CHECKERSPARMS"] = {}

eric ide

mercurial