git-svn-id: http://svn.calculate.ru/calculate2/calculate-lib/trunk@24 c91db197-33c1-4113-bf15-f8a5c547ca64

develop
asamoukin 16 years ago
parent bed09010f3
commit 02af30bb52

@ -192,7 +192,7 @@ class calcHeader(_terms):
# Удаление Заголовка Calculate
if comment:
reCalcHeader =\
re.compile("\s*%s\-+\s+%s.+Calculate.+\s+%s.+\s+%s\-+\s*"%(\
re.compile("\s*%s\-+\s+%s.+Calculate.+\s+%s.+\s+%s\-+\s?"%(\
comment,
comment,
comment,
@ -293,6 +293,22 @@ class objShare:
"""Общий клас для объектов, наследуем
"""
def removeSymbolTerm(self, text):
"""Удаляет первый символ названия переменной в строке
Если первый встречающийся символ с начала строки
'+', '-', '!' то он из этой строки будет удален,
если перед этим символом были пробельные символы,
то они будут сохранены, так-же если в строке есть символ
перевода строки он будет удален.
"""
reTerm = re.compile("^[ \t]*(\!|\+|\-)")
textNS = text.replace("\n","")
res = reTerm.search(textNS)
if res:
textNS = textNS[res.start():res.end()-1] + textNS[res.end():]
return textNS
def getConfig(self):
"""Выдает конфигурационный файл"""
listConfigTxt = []
@ -624,133 +640,8 @@ class xmlDoc:
newNode = nodeObj.createNode(self.doc, "action", actionTxt)
xmlCaptions[0].appendChild(newNode)
def joinField1(self, xmlArea, xmlNewField):
print "----------------------------------------------------"
#print self.getQuoteField(xmlNewField)
"""Объединяет XML ноду область и XML ноду поле"""
fieldNames = xpath.Evaluate('child::field/name',xmlArea)
newFieldNames = xpath.Evaluate('child::name',xmlNewField)
newFieldVals = xpath.Evaluate('child::value',xmlNewField)
newFieldsAction = self.getActionField(xmlNewField)
flagFindField = False
flagGlobalCompareFields = False
appSplLst = []
if not newFieldNames:
return False
newNameField = newFieldNames[0].firstChild.nodeValue
for fn in fieldNames:
# если найден параметр, изменяем его значение
# в том случае если значения разные
if newNameField == fn.firstChild.nodeValue:
flagFindField = True
# Удаление полей
if newFieldsAction:
if newFieldsAction == "drop":
if (fn.parentNode.nextSibling):
if self.getTypeField\
(fn.parentNode.nextSibling) == "br":
xmlArea.removeChild(fn.parentNode.nextSibling)
xmlArea.removeChild(fn.parentNode)
continue
fieldsVal = xpath.Evaluate('child::value',fn.parentNode)
z =0
flagNoCompareFields = False
for val in fieldsVal:
if not val.firstChild or not newFieldVals[z].firstChild:
flagNoCompareFields = True
break
if val.firstChild.nodeValue != \
newFieldVals[z].firstChild.nodeValue:
flagNoCompareFields = True
break
z += 1
if not flagNoCompareFields:
flagGlobalCompareFields = True
print "FLAG", flagGlobalCompareFields
if flagNoCompareFields or\
self.getTypeField(xmlNewField) == "seplist":
#Действия при добавлении распределенного списка
if self.getTypeField(xmlNewField) == "seplist":
xmlOldField = fn.parentNode
seplistNewXML = self.getSepListToField(xmlNewField)
seplistOldXML = self.getSepListToField(xmlOldField)
if not seplistOldXML:
seplistOldXML = [xmlOldField,]
xmlAreaOld = xmlOldField.parentNode
for nodeSeplistRemove in seplistOldXML[:-1]:
if self.getTypeField(nodeSeplistRemove) == "var":
xmlAreaOld.removeChild(nodeSeplistRemove)
if nodeSeplistRemove.nextSibling and\
self.getTypeField(\
nodeSeplistRemove.nextSibling) == "br":
xmlAreaOld.removeChild(\
nodeSeplistRemove.nextSibling)
for nodeSeplist in seplistNewXML:
if self.getActionField(nodeSeplist) != "drop":
if newFieldsAction == "join":
self.setActionField(nodeSeplist,"append")
nextNode = seplistOldXML[-1].nextSibling
newInsNode = nodeSeplist.cloneNode(True)
if nextNode:
appSplLst.append((newInsNode,
nextNode,
"insert"))
else:
appSplLst.append((newInsNode,
False,
"append"))
else:
xmlArea.insertBefore(\
nodeSeplist.cloneNode(True),
seplistOldXML[-1])
parentNode = nodeSeplist.parentNode
parentNode.removeChild(nodeSeplist)
if seplistNewXML:
parentNode = seplistOldXML[-1].parentNode
if parentNode and newFieldsAction != "join":
parentNode.removeChild(seplistOldXML[-1])
#print "--------------------------------------"
#print nodeSeplist.toprettyxml()
#xmlArea.removeChild(fn.parentNode)
else:
# Устанавливаем action=replace
self.setActionField(xmlNewField, "replace")
# Если параметры поля не сходятся заменяем поле
xmlArea.replaceChild(xmlNewField.cloneNode(True),
fn.parentNode)
print "FLAG-FLAG", flagGlobalCompareFields
if not flagGlobalCompareFields:
print xmlNewField.toprettyxml()
for newNode, nxtNode, app in appSplLst:
if app == "insert":
pass
xmlArea.insertBefore(newNode,nxtNode)
elif app == "append":
pass
xmlArea.appendChild(newNode)
#print newNode, nextNode, app
#
#if newFieldsAction == "join":
#self.setActionField(xmlNewField,"append")
#xmlArea.appendChild(xmlNewField)
#return True
# Если поле не найдено добавляем его
if not flagFindField:
if self.getActionField(xmlNewField) != "drop":
self.setActionField(xmlNewField, "append")
xmlArea.appendChild(xmlNewField)
return True
def joinField(self, xmlArea, xmlNewField):
"""Объединяет XML ноду область и XML ноду поле"""
print xmlNewField.toprettyxml()
newNameField = self.getNameField(xmlNewField)
if not newNameField or not newNameField.strip():
return False
@ -788,7 +679,10 @@ class xmlDoc:
appSplLst = []
insSplLst = []
if typeNewField == "seplist":
xmlOldField = fieldsOldComp[-1]
if fieldsOldComp:
xmlOldField = fieldsOldComp[-1]
else:
xmlOldField = False
seplistNewXML = self.getSepListToField(xmlNewField)
if seplistNewXML:
for nodeSeplist in seplistNewXML:
@ -819,8 +713,15 @@ class xmlDoc:
newInsNode = nodeSeplist.cloneNode(True)
if self.getActionField(newInsNode) == "join":
self.setActionField(newInsNode,"append")
insSplLst.append((newInsNode,
xmlOldField))
if xmlOldField:
insSplLst.append((newInsNode,
xmlOldField,
"insert"))
else:
insSplLst.append((newInsNode,
False,
"append"))
#xmlArea.insertBefore(\
#nodeSeplist.cloneNode(True),
#xmlOldField)
@ -829,7 +730,7 @@ class xmlDoc:
parentNode.removeChild(nodeSeplist)
insNodesRepl = []
for newNode, nxtNode in insSplLst:
for newNode, nxtNode, app in insSplLst:
flagCompareSeplist = False
newValues = self.getFieldValues(newNode)
for nodeRepl, nxtNode in insNodesRepl:
@ -839,14 +740,18 @@ class xmlDoc:
flagCompareSeplist = True
break
if not flagCompareSeplist:
insNodesRepl.append((newNode, nxtNode))
for newNode, nxtNode in insNodesRepl:
xmlArea.insertBefore(newNode,nxtNode)
parentNode = xmlOldField.parentNode
if parentNode and newFieldsAction != "join":
parentNode.removeChild(xmlOldField)
if xmlOldField:
insNodesRepl.append((newNode, nxtNode, app))
for newNode, nxtNode, app in insNodesRepl:
if app == "insert":
xmlArea.insertBefore(newNode,nxtNode)
elif app == "append":
xmlArea.appendChild(newNode)
if xmlOldField:
parentNode = xmlOldField.parentNode
if parentNode and newFieldsAction != "join":
parentNode.removeChild(xmlOldField)
for newNode, nxtNode, app in appSplLst:
if app == "insert":
@ -925,10 +830,52 @@ class xmlDoc:
xmlNewAreas = xpath.Evaluate('child::area',newBody)
for xmlNewArea in xmlNewAreas:
self.joinArea(baseBody,xmlNewArea)
removeNodesDict = {}
notRemoveNodesDict = {}
joinNewFields = xpath.Evaluate("child::field[child::action='join']"
,newBody)
self.addNewFielsOldArea(newFields, joinNewFields, baseBody)
def getRemoveNodeSepList(self, removeNodesDict, baseNode, xmNewlField):
"""Находит элементы разделенного списка
Параметры:
removeNodesDict - оварь удаляемых полей разделенного списка
формируется программой
baseNode - Нода в которой идет поиск
xmNewlField - Нода field которая проверяется на принадлежность
к разделенному списку
"""
flagNewNodeSeplist = False
if self.getTypeField(xmNewlField) == "seplist":
flagNewNodeSeplist = True
nameNewField = self.getNameField(xmNewlField)
if nameNewField:
if removeNodesDict.has_key(nameNewField):
return removeNodesDict[nameNewField]
else:
oldFields = xpath.Evaluate('child::field', baseNode)
removeNodes = []
lenOldFields = len(oldFields)
for i in range(lenOldFields):
oldNode = oldFields[i]
flagSep = self.getTypeField(oldNode) == "seplist"
if flagNewNodeSeplist:
flagSep = True
if flagSep and\
nameNewField == self.getNameField(oldNode):
removeNodes.append(oldNode)
if i+1<lenOldFields:
nextNode = oldFields[i+1]
if self.getTypeField(nextNode) == "br":
removeNodes.append(nextNode)
removeNodesDict[nameNewField] = removeNodes
return removeNodes
def addNewFielsOldArea(self, newFields, joinNewFields, xmlOldArea):
"""Добавляет новые XML поля в область профиля"""
removeNodesDict = {}
notRemoveNodesDict = {}
for notRemNode in joinNewFields:
nameField = self.getNameField(notRemNode)
if not notRemoveNodesDict.has_key(nameField):
@ -939,7 +886,7 @@ class xmlDoc:
notSepListField = []
sepListField = []
for nField in newFields:
if self.getRemoveNodeSepList(removeNodesDict, baseBody,
if self.getRemoveNodeSepList(removeNodesDict, xmlOldArea,
nField):
sepListField.append(nField)
else:
@ -956,13 +903,14 @@ class xmlDoc:
removeNodes = removeNodes[:-2]
for removeNode in removeNodes:
baseBody.removeChild(removeNode)
xmlOldArea.removeChild(removeNode)
for node in sepListField:
node.setAttribute("type", "seplist")
if self.getActionField(node) != "join":
if not (self.getActionField(node) == "join" or\
self.getActionField(node) == "drop"):
self.setActionField(node,"insert")
self.joinField(baseBody, node)
self.joinField(xmlOldArea, node)
#else:
#self.setActionField(node, "append")
#baseBody.appendChild(node)
@ -971,46 +919,9 @@ class xmlDoc:
#if removeNodesDict.has_key(self.getNameField(node)):
#print removeNodesDict[self.getNameField(node)]
self.setActionField(node, "append")
baseBody.appendChild(node)
else:
self.joinField(baseBody, node)
def getRemoveNodeSepList(self, removeNodesDict, baseNode, xmNewlField):
"""Находит элементы разделенного списка
Параметры:
removeNodesDict - оварь удаляемых полей разделенного списка
формируется программой
baseNode - Нода в которой идет поиск
xmNewlField - Нода field которая проверяется на принадлежность
к разделенному списку
"""
flagNewNodeSeplist = False
if self.getTypeField(xmNewlField) == "seplist":
flagNewNodeSeplist = True
nameNewField = self.getNameField(xmNewlField)
if nameNewField:
if removeNodesDict.has_key(nameNewField):
return removeNodesDict[nameNewField]
xmlOldArea.appendChild(node)
else:
oldFields = xpath.Evaluate('child::field', baseNode)
removeNodes = []
lenOldFields = len(oldFields)
for i in range(lenOldFields):
oldNode = oldFields[i]
flagSep = self.getTypeField(oldNode) == "seplist"
if flagNewNodeSeplist:
flagSep = True
if flagSep and\
nameNewField == self.getNameField(oldNode):
removeNodes.append(oldNode)
if i+1<lenOldFields:
nextNode = oldFields[i+1]
if self.getTypeField(nextNode) == "br":
removeNodes.append(nextNode)
removeNodesDict[nameNewField] = removeNodes
return removeNodes
self.joinField(xmlOldArea, node)
@ -1079,26 +990,10 @@ class xmlDoc:
baseNodes.append(oName.parentNode.parentNode)
newFields = xpath.Evaluate('child::field',xmlNewArea)
removeNodesDict = {}
notSepListField = []
sepListField = []
for nField in newFields:
if self.getRemoveNodeSepList(removeNodesDict, oArea,
nField):
sepListField.append(nField)
else:
if self.getNameField(nField):
notSepListField.append(nField)
for removeNodes in removeNodesDict.values():
for removeNode in removeNodes:
oArea.removeChild(removeNode)
for node in sepListField:
if self.getActionField(node) != "drop":
self.setActionField(node, "append")
oArea.appendChild(node)
for node in notSepListField:
self.joinField(oArea, node)
joinNewFields = xpath.Evaluate(\
"child::field[child::action='join']"
,xmlNewArea)
self.addNewFielsOldArea(newFields, joinNewFields, oArea)
if not flagFindArea:
@ -2144,13 +2039,14 @@ class profile(_file, _terms):
objHeadOld = calcHeader(self.oldProfile, objProfNew._comment)
if objHeadOld.body:
self.oldProfile = objHeadOld.body
else:
self.oldProfile = ""
exec ("objProfOld=%s(self.oldProfile)"%\
(objHeadNew.fileType))
#print "#%s#" %(objProfOld.docObj.body.toprettyxml())
#print "#%s#" %(objProfNew.docObj.body.toprettyxml())
objProfOld.join(objProfNew)
if objHeadNew.execStr:
self.oldProfile = objHeadNew.execStr + title +\
objProfOld.getConfig().encode("UTF-8")
@ -2298,10 +2194,6 @@ class samba(objShare):
rootNode = docObj.getNodeBody()
# Если пустой текст то создаем пустой документ
if not blocs:
# у пустой области обязателен заголовок
#docObj.createCaption("", ["",""])
#area = docObj.createArea()
#rootNode.appendChild(area)
return docObj
for h in blocs[0]:
@ -2348,12 +2240,16 @@ class samba(objShare):
fields = self._splitToFields(bodys[z])
for f in fields:
if f.name != False and f.value!=False and f.br!=False:
# Удаляемое в дальнейшем поле
if f.name[0] == "!":
# Обработка условий для samba
if f.name[0] == "!" or f.name[0] == "-" or\
f.name[0] == "+":
qns = self.removeSymbolTerm(f.br)
xmlField = docObj.createField("var",
[f.br.replace("\n","")],
[qns],
f.name[1:], [f.value])
docObj.setActionField(xmlField, "drop")
if f.name[0] == "!":
# Удаляемое в дальнейшем поле
docObj.setActionField(xmlField, "drop")
else:
docObj.createField("var",[f.br.replace("\n","")],
f.name, [f.value])
@ -2554,23 +2450,27 @@ class named(objShare):
docObj.setActionArea(areaXML, areaAction)
return areaXML
def createFieldTerm(self, name, value, quote, docObj):
"""Создание поля переменная - значение
при создании поля проверяется первый символ названия переменной
и добавляется тег action
"!" - <action>drop</action>
"!" - <action>drop</action> удаляет
"+" - <action>join</action> добавляет
"-" - <action>replace</action> заменяет
"""
fieldAction = False
if name:
if name[0] == "!" or name[0] == "-" or name[0] == "+":
fieldXML = docObj.createField("var",
[quote.replace("\n","")[1:]],
qnt = self.removeSymbolTerm(quote)
fieldXML = docObj.createField("var",[qnt],
name[1:], [value],
False, False)
if name[0] == "!":
fieldAction = "drop"
elif name[0] == "+":
fieldXML.setAttribute("type", "seplist")
fieldAction = "join"
else:
fieldXML = docObj.createField("var",
@ -2694,10 +2594,6 @@ class named(objShare):
# Создание объекта документ c пустым разделителем между полями
docObj.createDoc(self.configName, self.configVersion)
if not areas:
# у пустой области обязателен заголовок
docObj.createCaption("", ["",""])
area = docObj.createArea()
docObj.getNodeBody().appendChild(area)
return docObj
self.createXML(areas, docObj.getNodeBody(), docObj)
return docObj
@ -2893,10 +2789,6 @@ class apache(named):
# Создание объекта документ c пустым разделителем между полями
docObj.createDoc(self.configName, self.configVersion)
if not areas:
# у пустой области обязателен заголовок
docObj.createCaption("", ["",""])
area = docObj.createArea()
docObj.getNodeBody().appendChild(area)
return docObj
self.createXML(areas, docObj.getNodeBody(), docObj)
return docObj
@ -2946,10 +2838,6 @@ class postfix(apache):
# Создание объекта документ c пустым разделителем между полями
docObj.createDoc(self.configName, self.configVersion)
if not areas:
# у пустой области обязателен заголовок
docObj.createCaption("", ["",""])
area = docObj.createArea()
docObj.getNodeBody().appendChild(area)
return docObj
self.createXML(areas, docObj.getNodeBody(), docObj)
return docObj

Loading…
Cancel
Save