From e6a8fbf52c73f3fc0f76f7d08c335bba237ca609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B0=D0=BC=D0=BE=D1=83=D0=BA=D0=B8=D0=BD=20=D0=90?= =?UTF-8?q?=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Tue, 2 Mar 2010 14:24:57 +0300 Subject: [PATCH] Add format 'plasma' in iniParser object --- pym/cl_base.py | 182 ++++++++++++++++++++++++++++++++++++++-------- pym/cl_profile.py | 31 ++++++++ 2 files changed, 181 insertions(+), 32 deletions(-) diff --git a/pym/cl_base.py b/pym/cl_base.py index d77e73b..b8b212b 100644 --- a/pym/cl_base.py +++ b/pym/cl_base.py @@ -333,15 +333,28 @@ class iniParser(cl_profile._error): dictVar - словарь переменных """ textIni = self.openIniFile() - if not self.checkIniFile(textIni): + nameFomat = self.checkIniFile(textIni) + if not nameFomat: return False - # создаем объект типа samba и записываем в него содержимое ini-файла - objIni = cl_profile.samba(textIni) - # создаем текст в формате samba из строки заголовка и + if type(strHeader) in (tuple, list): + # формат plasma + classObj = cl_profile.plasma + else: + if nameFomat == "plasma": + self.setError(_("In the file %s (format - 'plasma'), \ + write the variable in the format 'samba'")\ + %self.iniFile) + return False + # формат samba + classObj = cl_profile.samba + # создаем объект + # и записываем в него содержимое ini-файла + objIni = classObj(textIni) + # создаем текст из строки заголовка и # словаря переменных области txtConfig = objIni.createTxtConfig(strHeader, dictVar) - # создаем объект типа samba и записываем в него текст - objIniAdd = cl_profile.samba(txtConfig) + # создаем объект и записываем в него текст + objIniAdd = classObj(txtConfig) # объединяем объекты для получения результирующего текста objIni.join(objIniAdd) # получаем текст @@ -364,13 +377,27 @@ class iniParser(cl_profile._error): if textIni == False: self.checkIni = False return False - self.checkIni = True + self.checkIni = "samba" # В файле есть данные if not self.isEmptyFile(textIni): - objIni = cl_profile.samba(textIni) - xmlBody = objIni.docObj.getNodeBody() - if not xmlBody.firstChild: + try: + objIni = cl_profile.plasma(textIni) + except: + self.setError(_("Incorrect format file") + ": " + \ + self.iniFile) self.checkIni = False + return self.checkIni + allAreas = objIni.docObj.getAllAreas() + for xmlArea in allAreas: + parentNode = xmlArea.parentNode + if parentNode and parentNode.tagName == "area": + self.checkIni = "plasma" + break + if self.checkIni == "samba": + objIni = cl_profile.samba(textIni) + xmlBody = objIni.docObj.getNodeBody() + if not xmlBody.firstChild: + self.checkIni = False return self.checkIni def delVar(self, strHeader, nameVar): @@ -382,7 +409,13 @@ class iniParser(cl_profile._error): def delArea(self, strHeader): """Удаляем область из ini файла""" - delStrHeader = "!%s" %(strHeader) + if type(strHeader) in (tuple, list): + # Формат plasma + delStrHeader = strHeader[:] + delStrHeader[-1] = "!%s"%delStrHeader[-1] + else: + # Формат samba + delStrHeader = "!%s" %(strHeader) dictVar = {"del":"del"} res = self.setVar(delStrHeader, dictVar) return res @@ -390,49 +423,134 @@ class iniParser(cl_profile._error): def getVar(self, strHeader, nameVar): """Получаем значение переменной из ini-файла""" textIni = self.openIniFile() - if not self.checkIniFile(textIni): + nameFomat = self.checkIniFile(textIni) + if not nameFomat: return False - # создаем объект типа samba и записываем в него содержимое ini-файла - objIni = cl_profile.samba(textIni) + formatPlasma = False + if type(strHeader) in (tuple, list): + # формат plasma + classObj = cl_profile.plasma + formatPlasma = True + else: + if nameFomat == "plasma": + self.setError(_("In the file %s (format - 'plasma'), \ + get the variable in the format 'samba'")\ + %self.iniFile) + return False + # формат samba + classObj = cl_profile.samba + # создаем объект и записываем в него содержимое ini-файла + objIni = classObj(textIni) # получаем ноду body xmlBody = objIni.docObj.getNodeBody() - # находим в области переменную - res = objIni.docObj.getAreaFieldValues(strHeader, nameVar, xmlBody) - if res == False: + flagFound, xmlBody = self.getLastNode(objIni, xmlBody, strHeader, + formatPlasma) + if flagFound and xmlBody: + if formatPlasma: + strHeader = strHeader[-1] + # находим в области переменную + res = objIni.docObj.getAreaFieldValues(strHeader, nameVar, xmlBody) + else: + res = False + if res is False: return "" else: return res - def getAreaVars(self,strHeader): + + def getLastNode(self, objIni, xmlBody, strHeader, formatPlasma): + """Ищет область в XML в которой область с переменными""" + flagFound = True + lenStrHeader = len(strHeader) + if formatPlasma and lenStrHeader>0: + xmlAreas = [xmlBody] + for i in xrange(lenStrHeader-1): + flagFound = False + for xmlArea in xmlAreas: + xmlAreas = objIni.docObj.getArea(strHeader[i], xmlArea) + if xmlAreas: + flagFound = True + break + if xmlAreas: + xmlBody = xmlAreas[0] + return flagFound,xmlBody + + def getAreaVars(self, strHeader): """Получаем все переменнные области из ini-файла""" textIni = self.openIniFile() - if not self.checkIniFile(textIni): + nameFomat = self.checkIniFile(textIni) + if not nameFomat: return False + formatPlasma = False + if type(strHeader) in (tuple, list): + # формат plasma + classObj = cl_profile.plasma + formatPlasma = True + else: + if nameFomat == "plasma": + self.setError(_("In the file %s (format - 'plasma'), \ + get all variables in the format 'samba'")\ + %self.iniFile) + return False + # формат samba + classObj = cl_profile.samba # создаем объект типа samba и записываем в него содержимое ini-файла - objIni = cl_profile.samba(textIni) + objIni = classObj(textIni) # получаем ноду body xmlBody = objIni.docObj.getNodeBody() - # если находим область то выдаем словарем все переменные иначе False - res = objIni.docObj.getAreaFields(strHeader, xmlBody) - if res == False: + flagFound, xmlBody = self.getLastNode(objIni, xmlBody, strHeader, + formatPlasma) + if flagFound and xmlBody: + if formatPlasma: + strHeader = strHeader[-1] + # если находим область то выдаем словарем все переменные иначе False + res = objIni.docObj.getAreaFields(strHeader, xmlBody) + else: + res = False + if res is False: return {} else: return res def getAllSectionNames(self): - """Получаем все имена секций определенных в ini файле""" + """Получаем все имена секций определенных в ini файле + + Если формат ini файла plasma то имя секции - + имена нескольких секций через запятую + """ textIni = self.openIniFile() - if not self.checkIniFile(textIni): + nameFomat = self.checkIniFile(textIni) + if not nameFomat: return False - # создаем объект типа samba и записываем в него содержимое ini-файла - objIni = cl_profile.samba(textIni) - # получаем ноду body - xmlBody = objIni.docObj.getNodeBody() - xmlNodes = objIni.docObj.getFieldsArea(xmlBody) + if nameFomat == "samba": + # создаем объект типа samba и записываем в него содержимое ini-файла + objIni = cl_profile.samba(textIni) + elif nameFomat == "plasma": + # создаем объект типа plasma и записываем в него содержимое + # ini-файла + objIni = cl_profile.plasma(textIni) + else: + return [] + xmlNodes = objIni.docObj.getAllAreas() # Имена секций ini файла namesSection = [] - for xmlNode in xmlNodes: - if xmlNode.tagName == "area": + if nameFomat == "plasma": + for xmlNode in xmlNodes: + nSect = objIni.docObj.getNameArea(xmlNode) + if nSect: + namesSect = [nSect] + parentNode = xmlNode.parentNode + while parentNode != objIni.docObj.body: + nameSect = objIni.docObj.getNameArea(parentNode) + if nameSect: + namesSect.append(nameSect) + parentNode = parentNode.parentNode + else: + return [] + namesSection.append(",".join(reversed(namesSect))) + elif nameFomat == "samba": + # получаем ноду body + for xmlNode in xmlNodes: nSect = objIni.docObj.getNameArea(xmlNode) if nSect: namesSection.append(nSect) diff --git a/pym/cl_profile.py b/pym/cl_profile.py index 76f3798..ccd3656 100644 --- a/pym/cl_profile.py +++ b/pym/cl_profile.py @@ -1228,6 +1228,17 @@ class xmlDoc: fieldsVal[0]) return fieldValue[0].firstChild.nodeValue + def getAllAreas(self): + """Выдает все области""" + return xpath.Evaluate('descendant::area', self.body) + + def getArea(self, nameArea, xmlArea): + """По имени области находит области (первый потомок xmlArea)""" + namesAreaComare = xpath.Evaluate(\ + "child::area/child::caption[child::name='%s']" %(nameArea), + xmlArea) + return map(lambda x: x.parentNode, namesAreaComare) + def joinArea(self, baseNode, xmlNewArea): """Объединяет область c областью Body (xmlNewArea c baseNode)""" @@ -5704,6 +5715,26 @@ class plasma(samba): rootNode.appendChild(fieldXML) #rootNode.appendChild(areaXML) + + def createTxtConfig(self, strHeader, dictVar): + """Cоздает область с заголовком + + создает текст конфигурационного файла в формате samba из + заголовка (строка) и словаря переменных + """ + if not strHeader: + return "" + if type(strHeader) in (tuple, list): + outTxt = "".join(map(lambda x: "["+x+"]",strHeader)) + if not outTxt: + return "" + outTxt += "\n" + else: + outTxt = "[" + strHeader + "]\n" + for key in dictVar.keys(): + outTxt += "%s=%s\n" %(key,dictVar[key]) + return outTxt + def _textToXML(self): """Преобразуем текст в XML""" areas = []