|
|
|
@ -22,6 +22,8 @@ import re
|
|
|
|
|
import xml.dom.minidom
|
|
|
|
|
from xml import xpath
|
|
|
|
|
import popen2
|
|
|
|
|
import types
|
|
|
|
|
import copy
|
|
|
|
|
|
|
|
|
|
tr = cl_base.lang()
|
|
|
|
|
tr.setLocalDomain('cl_lib')
|
|
|
|
@ -4089,3 +4091,465 @@ class kde(samba):
|
|
|
|
|
if isinstance(kdeObj, kde):
|
|
|
|
|
self.docObj.joinDoc(kdeObj.doc)
|
|
|
|
|
self.postXML()
|
|
|
|
|
|
|
|
|
|
class plasma(samba):
|
|
|
|
|
"""Класс для обработки конфигурационного файла типа kde
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
_comment = "#"
|
|
|
|
|
configName = "kde"
|
|
|
|
|
configVersion = "0.1"
|
|
|
|
|
reHeader = re.compile("^[\t ]*\[[^\[\]]+\].*\n?",re.M)
|
|
|
|
|
reBody = re.compile(".+",re.M|re.S)
|
|
|
|
|
reComment = re.compile("^\s*%s.*"%(_comment))
|
|
|
|
|
reSeparator = re.compile("=")
|
|
|
|
|
sepFields = "\n"
|
|
|
|
|
reSepFields = re.compile(sepFields)
|
|
|
|
|
|
|
|
|
|
def __init__(self,text):
|
|
|
|
|
samba.__init__(self,text)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Делим текст на области включая вложенные (areas массив областей)
|
|
|
|
|
def splitToAllArea(self, text, areas):
|
|
|
|
|
"""Делит текст на области включая вложенные
|
|
|
|
|
|
|
|
|
|
возвращает список объектов областей (переменная areas)
|
|
|
|
|
"""
|
|
|
|
|
class area:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self.header = False
|
|
|
|
|
self.start = False
|
|
|
|
|
self.fields = []
|
|
|
|
|
self.end = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def findPathArea(listPath, areaF):
|
|
|
|
|
"""Ищет путь в области
|
|
|
|
|
|
|
|
|
|
areaF - объект area
|
|
|
|
|
listPath - cписок названий областей
|
|
|
|
|
"""
|
|
|
|
|
ret = False
|
|
|
|
|
if not listPath:
|
|
|
|
|
return ret
|
|
|
|
|
flagList = False
|
|
|
|
|
if type(areaF) == types.ListType:
|
|
|
|
|
fields = areaF
|
|
|
|
|
flagList = True
|
|
|
|
|
else:
|
|
|
|
|
fields = areaF.fields
|
|
|
|
|
if areaF.header == listPath[0]:
|
|
|
|
|
ret = areaF
|
|
|
|
|
else:
|
|
|
|
|
return ret
|
|
|
|
|
for i in fields:
|
|
|
|
|
if str(i.__class__.__name__) == "area":
|
|
|
|
|
add = False
|
|
|
|
|
if not flagList:
|
|
|
|
|
add = listPath.pop(0)
|
|
|
|
|
if not listPath:
|
|
|
|
|
break
|
|
|
|
|
ret = False
|
|
|
|
|
if i.header == listPath[0]:
|
|
|
|
|
ret = findPathArea(listPath, i)
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
if add:
|
|
|
|
|
listPath.insert(0,add)
|
|
|
|
|
if ret == areaF and len(listPath)>1:
|
|
|
|
|
ret = False
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
blTmp = self.blocTextObj.findBloc(self.text,self.reHeader,self.reBody)
|
|
|
|
|
blocs = self.getFullAreas(blTmp)
|
|
|
|
|
reH = re.compile("\[([^\[\]]+)\]")
|
|
|
|
|
# Список имен блоков
|
|
|
|
|
namesBlockList = []
|
|
|
|
|
# Временные поля
|
|
|
|
|
fieldsTmp = []
|
|
|
|
|
# Добавляем заголовки
|
|
|
|
|
z = 0
|
|
|
|
|
for h in blocs[0]:
|
|
|
|
|
if not h:
|
|
|
|
|
if blocs[1][z] == "":
|
|
|
|
|
fieldsTmp.append("\n")
|
|
|
|
|
else:
|
|
|
|
|
fieldsTmp.append(blocs[1][z])
|
|
|
|
|
#print '"' + blocs[1][z] + '"'
|
|
|
|
|
z += 1
|
|
|
|
|
continue
|
|
|
|
|
#print '"' + blocs[1][z] + '"'
|
|
|
|
|
z += 1
|
|
|
|
|
slpNamesBlock = reH.split(h)
|
|
|
|
|
# Отступ слева для заголовка
|
|
|
|
|
indentionLeft = slpNamesBlock[0]
|
|
|
|
|
namesBlock = filter(lambda x: x.strip(), slpNamesBlock)
|
|
|
|
|
#namesBlock = map(lambda x: self.removeSymbolTerm(x), namesBlock)
|
|
|
|
|
findArea = findPathArea(copy.copy(namesBlock), areas)
|
|
|
|
|
namesBlockList.append(namesBlock)
|
|
|
|
|
if findArea:
|
|
|
|
|
findArea.start = indentionLeft + "[" + \
|
|
|
|
|
"][".join(namesBlock) + "]"
|
|
|
|
|
else:
|
|
|
|
|
i = 0
|
|
|
|
|
lenNamesBlock = len(namesBlock)
|
|
|
|
|
namesBlockTmp = []
|
|
|
|
|
for nameB in namesBlock:
|
|
|
|
|
namesBlockTmp.append(nameB)
|
|
|
|
|
findArea = findPathArea(copy.copy(namesBlockTmp), areas)
|
|
|
|
|
i += 1
|
|
|
|
|
if not findArea:
|
|
|
|
|
areaNew = area()
|
|
|
|
|
areaNew.header = nameB
|
|
|
|
|
if lenNamesBlock == i:
|
|
|
|
|
areaNew.start = indentionLeft + "[" + \
|
|
|
|
|
"][".join(namesBlock) + "]"
|
|
|
|
|
else:
|
|
|
|
|
areaNew.start = ""
|
|
|
|
|
areaNew.end = ""
|
|
|
|
|
if i == 1:
|
|
|
|
|
if lenNamesBlock == i:
|
|
|
|
|
areas += fieldsTmp
|
|
|
|
|
areas.append(areaNew)
|
|
|
|
|
findAreaPrev = areas[-1]
|
|
|
|
|
else:
|
|
|
|
|
if lenNamesBlock == i:
|
|
|
|
|
findAreaPrev.fields.append("")
|
|
|
|
|
findAreaPrev.fields += fieldsTmp
|
|
|
|
|
#findAreaPrev.fields += "RRRRRRRRRRRRRRRRRRRRRR\n"
|
|
|
|
|
findAreaPrev.fields.append(areaNew)
|
|
|
|
|
findAreaPrev = findAreaPrev.fields[-1]
|
|
|
|
|
else:
|
|
|
|
|
findAreaPrev = findArea
|
|
|
|
|
|
|
|
|
|
#print namesBlock, fieldsTmp
|
|
|
|
|
#if namesBlock[:-1]:
|
|
|
|
|
#pass
|
|
|
|
|
#findPrArea = findPathArea(namesBlock[:-1], areas)
|
|
|
|
|
#findPrFields = findPrArea.fields
|
|
|
|
|
#else:
|
|
|
|
|
#findPrFields = areas
|
|
|
|
|
#findPrFields += fieldsTmp
|
|
|
|
|
fieldsTmp = []
|
|
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
|
delt = 0
|
|
|
|
|
# Добавляем тела
|
|
|
|
|
for body in blocs[1]:
|
|
|
|
|
#print "#" + body + "#"
|
|
|
|
|
#print
|
|
|
|
|
if not blocs[0][i]:
|
|
|
|
|
i += 1
|
|
|
|
|
delt +=1
|
|
|
|
|
continue
|
|
|
|
|
## В случае последнего комментария не добавляем перевод строки
|
|
|
|
|
#if self.reComment.search(body.splitlines()[-1]):
|
|
|
|
|
body = "\n" + body
|
|
|
|
|
#else:
|
|
|
|
|
#if body[-1] == "\n":
|
|
|
|
|
#body = "\n" + body + "\n"
|
|
|
|
|
#else:
|
|
|
|
|
#body = "\n" + body
|
|
|
|
|
|
|
|
|
|
namesBlock = namesBlockList[i-delt]
|
|
|
|
|
findArea = findPathArea(copy.copy(namesBlock), areas)
|
|
|
|
|
if findArea:
|
|
|
|
|
if findArea.fields:
|
|
|
|
|
if type(findArea.fields[0]) == types.StringType:
|
|
|
|
|
findArea.fields.pop(0)
|
|
|
|
|
findArea.fields.insert(0, body)
|
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
|
#eee = 1
|
|
|
|
|
#def prAreas(ar, eee):
|
|
|
|
|
#for a in ar:
|
|
|
|
|
#if type(a) == types.StringType:
|
|
|
|
|
#print 'field', a
|
|
|
|
|
#else:
|
|
|
|
|
#print "--------------------"
|
|
|
|
|
#print "HEADER =", a.header
|
|
|
|
|
#print "START =", a.start
|
|
|
|
|
#print "FIELDS =", a.fields
|
|
|
|
|
#print "LEVEL", eee
|
|
|
|
|
#if type(a) != types.StringType:
|
|
|
|
|
#if a.fields:
|
|
|
|
|
#eee += 1
|
|
|
|
|
#prAreas(a.fields, eee)
|
|
|
|
|
|
|
|
|
|
#prAreas(areas, eee)
|
|
|
|
|
return areas
|
|
|
|
|
|
|
|
|
|
def createCaptionTerm(self, header, start, end, docObj):
|
|
|
|
|
"""Создание пустой области с заголовком
|
|
|
|
|
|
|
|
|
|
при создании области проверяется первый символ заголовка
|
|
|
|
|
и добавляется тег action
|
|
|
|
|
"!" - <action>drop</action>
|
|
|
|
|
"-" - <action>replace</action>
|
|
|
|
|
"""
|
|
|
|
|
areaAction = False
|
|
|
|
|
if header:
|
|
|
|
|
if header[0] == "!":
|
|
|
|
|
docObj.createCaption(header[1:], [start,
|
|
|
|
|
end.replace("\n","")])
|
|
|
|
|
areaAction = "drop"
|
|
|
|
|
elif header[0] == "-":
|
|
|
|
|
docObj.createCaption(header[1:], [start,
|
|
|
|
|
end.replace("\n","")])
|
|
|
|
|
areaAction = "replace"
|
|
|
|
|
else:
|
|
|
|
|
docObj.createCaption(header, [start,
|
|
|
|
|
end.replace("\n","")])
|
|
|
|
|
else:
|
|
|
|
|
docObj.createCaption(header, [start,
|
|
|
|
|
end.replace("\n","")])
|
|
|
|
|
|
|
|
|
|
areaXML = docObj.createArea()
|
|
|
|
|
if areaAction:
|
|
|
|
|
docObj.setActionArea(areaXML, areaAction)
|
|
|
|
|
return areaXML
|
|
|
|
|
|
|
|
|
|
def createXML(self, areas, rootNode, docObj):
|
|
|
|
|
"""Создаем из массивов областей XML"""
|
|
|
|
|
for i in areas:
|
|
|
|
|
if str(i.__class__.__name__) == "area":
|
|
|
|
|
if i.header:
|
|
|
|
|
areaXML = self.createCaptionTerm(i.header, i.start,
|
|
|
|
|
i.end.replace("\n",""),
|
|
|
|
|
docObj)
|
|
|
|
|
for f in i.fields:
|
|
|
|
|
if str(f.__class__.__name__) == "area":
|
|
|
|
|
if f.header:
|
|
|
|
|
areaXMLChild = self.createCaptionTerm(f.header,
|
|
|
|
|
f.start,
|
|
|
|
|
f.end.replace("\n",""),
|
|
|
|
|
docObj)
|
|
|
|
|
|
|
|
|
|
self.createXML(f.fields, areaXMLChild, docObj)
|
|
|
|
|
|
|
|
|
|
areaXML.appendChild(areaXMLChild)
|
|
|
|
|
else:
|
|
|
|
|
self.createXML(f.fields, areaXML, docObj)
|
|
|
|
|
if "\n" in f.end:
|
|
|
|
|
fieldXMLBr = docObj.createField("br",[],
|
|
|
|
|
"",[],
|
|
|
|
|
False, False)
|
|
|
|
|
areaXML.appendChild(fieldXMLBr)
|
|
|
|
|
else:
|
|
|
|
|
if not f:
|
|
|
|
|
continue
|
|
|
|
|
fields = self.splitToFields(f)
|
|
|
|
|
for field in fields:
|
|
|
|
|
if field.name != False:
|
|
|
|
|
fieldXML = self.createFieldTerm(field.name,
|
|
|
|
|
field.value,
|
|
|
|
|
field.br, docObj)
|
|
|
|
|
areaXML.appendChild(fieldXML)
|
|
|
|
|
if field.br[-1] == "\n":
|
|
|
|
|
fieldXMLBr = docObj.createField("br",[],
|
|
|
|
|
"",[],
|
|
|
|
|
False, False)
|
|
|
|
|
areaXML.appendChild(fieldXMLBr)
|
|
|
|
|
elif field.comment != False:
|
|
|
|
|
fieldXML = docObj.createField("comment",
|
|
|
|
|
[field.comment],
|
|
|
|
|
"", [],
|
|
|
|
|
False, False)
|
|
|
|
|
areaXML.appendChild(fieldXML)
|
|
|
|
|
elif field.br != False:
|
|
|
|
|
brText = field.br.replace("\n","")
|
|
|
|
|
if brText:
|
|
|
|
|
fieldXML = docObj.createField('br',
|
|
|
|
|
[brText],
|
|
|
|
|
"", [],
|
|
|
|
|
False, False)
|
|
|
|
|
else:
|
|
|
|
|
fieldXML = docObj.createField('br',
|
|
|
|
|
[],
|
|
|
|
|
"", [],
|
|
|
|
|
False, False)
|
|
|
|
|
if areaXML:
|
|
|
|
|
areaXML.appendChild(fieldXML)
|
|
|
|
|
|
|
|
|
|
if i.header:
|
|
|
|
|
rootNode.appendChild(areaXML)
|
|
|
|
|
if "\n" in i.end:
|
|
|
|
|
fieldXMLBr = docObj.createField("br",[],
|
|
|
|
|
"",[],
|
|
|
|
|
False, False)
|
|
|
|
|
rootNode.appendChild(fieldXMLBr)
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
fields = self.splitToFields(i)
|
|
|
|
|
for field in fields:
|
|
|
|
|
if field.name != False:
|
|
|
|
|
fieldXML = self.createFieldTerm(field.name,
|
|
|
|
|
field.value,
|
|
|
|
|
field.br, docObj)
|
|
|
|
|
rootNode.appendChild(fieldXML)
|
|
|
|
|
if field.br[-1] == "\n":
|
|
|
|
|
fieldXMLBr = docObj.createField("br",[],"", [],
|
|
|
|
|
False, False)
|
|
|
|
|
rootNode.appendChild(fieldXMLBr)
|
|
|
|
|
elif field.comment != False:
|
|
|
|
|
fieldXML = docObj.createField("comment",
|
|
|
|
|
[field.comment],
|
|
|
|
|
"", [],
|
|
|
|
|
False, False)
|
|
|
|
|
rootNode.appendChild(fieldXML)
|
|
|
|
|
elif field.br != False:
|
|
|
|
|
brText = field.br.replace("\n","")
|
|
|
|
|
if brText:
|
|
|
|
|
fieldXML = docObj.createField('br', [brText],"",[],
|
|
|
|
|
False, False)
|
|
|
|
|
else:
|
|
|
|
|
fieldXML = docObj.createField('br', [], "", [],
|
|
|
|
|
False, False)
|
|
|
|
|
rootNode.appendChild(fieldXML)
|
|
|
|
|
#rootNode.appendChild(areaXML)
|
|
|
|
|
|
|
|
|
|
def _textToXML(self):
|
|
|
|
|
"""Преобразуем текст в XML"""
|
|
|
|
|
areas = []
|
|
|
|
|
if self.text.strip():
|
|
|
|
|
self.splitToAllArea(self.text, areas)
|
|
|
|
|
docObj = xmlDoc()
|
|
|
|
|
# Создание объекта документ c пустым разделителем между полями
|
|
|
|
|
docObj.createDoc(self.configName, self.configVersion)
|
|
|
|
|
if not areas:
|
|
|
|
|
return docObj
|
|
|
|
|
self.createXML(areas, docObj.getNodeBody(), docObj)
|
|
|
|
|
return docObj
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def postXML(self):
|
|
|
|
|
"""Последующая постобработка XML"""
|
|
|
|
|
# Для добавления перевода строки между областями если его нет
|
|
|
|
|
#print self.docObj.body.toprettyxml()
|
|
|
|
|
def getQuotesArea(xmlArea):
|
|
|
|
|
quotes = []
|
|
|
|
|
xmlQuotes = xpath.Evaluate('child::caption/quote',xmlArea)
|
|
|
|
|
for node in xmlQuotes:
|
|
|
|
|
if node.firstChild:
|
|
|
|
|
quotes.append(node.firstChild.nodeValue)
|
|
|
|
|
if len(quotes) == 0:
|
|
|
|
|
quotes.append("")
|
|
|
|
|
quotes.append("")
|
|
|
|
|
elif len(quotes) == 1:
|
|
|
|
|
quotes.append("")
|
|
|
|
|
return quotes
|
|
|
|
|
|
|
|
|
|
xmlAreas = xpath.Evaluate("descendant::area", self.docObj.body)
|
|
|
|
|
#print "-------------------------------------------------------"
|
|
|
|
|
#print xmlAreas
|
|
|
|
|
if xmlAreas:
|
|
|
|
|
prXmlArea = xmlAreas[0]
|
|
|
|
|
for xmlArea in xmlAreas:
|
|
|
|
|
#firstArea = False
|
|
|
|
|
#xmlFields = xpath.Evaluate("child::field", xmlArea)
|
|
|
|
|
#if not (xmlFields and\
|
|
|
|
|
#(self.docObj.getTypeField(xmlFields[0]) == "br" or\
|
|
|
|
|
#self.docObj.getTypeField(xmlFields[0]) == "comment")):
|
|
|
|
|
#xmlArea.insertBefore(self.docObj.createField("br",
|
|
|
|
|
#[],"",[],
|
|
|
|
|
#False,False),
|
|
|
|
|
#xmlFields[0])
|
|
|
|
|
|
|
|
|
|
# Собираем поля в кучку
|
|
|
|
|
xmlChildAreas = xpath.Evaluate("child::area", xmlArea)
|
|
|
|
|
if xmlChildAreas:
|
|
|
|
|
childNodes = self.docObj.getFieldsArea(xmlArea)
|
|
|
|
|
firstChildArea = xmlChildAreas[0]
|
|
|
|
|
if firstChildArea.previousSibling and\
|
|
|
|
|
self.docObj.getTypeField(firstChildArea.previousSibling)=="br":
|
|
|
|
|
if firstChildArea.previousSibling.previousSibling:
|
|
|
|
|
if self.docObj.getTypeField(\
|
|
|
|
|
firstChildArea.previousSibling.previousSibling)=="br":
|
|
|
|
|
firstChildArea = firstChildArea.previousSibling
|
|
|
|
|
|
|
|
|
|
flagFoundArea = False
|
|
|
|
|
it = 0
|
|
|
|
|
lenChild = len(childNodes)
|
|
|
|
|
for node in childNodes:
|
|
|
|
|
it += 1
|
|
|
|
|
if node.tagName == "area":
|
|
|
|
|
flagFoundArea = True
|
|
|
|
|
continue
|
|
|
|
|
if flagFoundArea and node.tagName == "field":
|
|
|
|
|
if self.docObj.getTypeField(node) == "var":
|
|
|
|
|
xmlArea.insertBefore(node, firstChildArea)
|
|
|
|
|
if it < lenChild:
|
|
|
|
|
if self.docObj.getTypeField(childNodes[it])==\
|
|
|
|
|
"br":
|
|
|
|
|
xmlArea.insertBefore(childNodes[it],
|
|
|
|
|
firstChildArea)
|
|
|
|
|
xmlArea.insertBefore(\
|
|
|
|
|
self.docObj.createField("br",
|
|
|
|
|
[],"",[],
|
|
|
|
|
False,False),
|
|
|
|
|
firstChildArea)
|
|
|
|
|
else:
|
|
|
|
|
xmlArea.insertBefore(\
|
|
|
|
|
self.docObj.createField("br",
|
|
|
|
|
[],"",[],
|
|
|
|
|
False,False),
|
|
|
|
|
firstChildArea)
|
|
|
|
|
#continue
|
|
|
|
|
if getQuotesArea(xmlArea) == ["",""]:
|
|
|
|
|
if xmlArea.previousSibling:
|
|
|
|
|
if self.docObj.getTypeField(xmlArea.previousSibling)=="br":
|
|
|
|
|
parentNode = xmlArea.parentNode
|
|
|
|
|
parentNode.removeChild(xmlArea.previousSibling)
|
|
|
|
|
continue
|
|
|
|
|
if not xmlArea.previousSibling:
|
|
|
|
|
if not xmlArea.nextSibling:
|
|
|
|
|
parentNode = xmlArea.parentNode
|
|
|
|
|
nextNode = xmlArea.nextSibling
|
|
|
|
|
parentNode.insertBefore(self.docObj.createField("br",
|
|
|
|
|
[],"",[],
|
|
|
|
|
False,False),
|
|
|
|
|
nextNode)
|
|
|
|
|
#else:
|
|
|
|
|
#addBr = False
|
|
|
|
|
#prSibling = xmlArea.previousSibling
|
|
|
|
|
#if xmlArea.previousSibling.tagName == "area":
|
|
|
|
|
#xmlFields = xpath.Evaluate("child::field",
|
|
|
|
|
#xmlArea.previousSibling)
|
|
|
|
|
#if not (xmlFields and\
|
|
|
|
|
#(self.docObj.getTypeField(xmlFields[-1]) == "br" or\
|
|
|
|
|
#self.docObj.getTypeField(xmlFields[-1]) == "comment")):
|
|
|
|
|
#if xmlArea.nextSibling:
|
|
|
|
|
#parentNode = xmlArea.parentNode
|
|
|
|
|
#nextNode = xmlArea.nextSibling
|
|
|
|
|
#parentNode.insertBefore(self.docObj.createField("br",
|
|
|
|
|
#[],"",[],
|
|
|
|
|
#False,False),
|
|
|
|
|
#nextNode)
|
|
|
|
|
#addBr = True
|
|
|
|
|
|
|
|
|
|
#if addBr:
|
|
|
|
|
#print "ADD_BR"
|
|
|
|
|
#prPrSibling = xmlArea.previousSibling.previousSibling
|
|
|
|
|
#print prPrSibling.tagName
|
|
|
|
|
#if self.docObj.getTypeField(prSibling) == "br":
|
|
|
|
|
#if not self.docObj.getTypeField(prPrSibling) == "br":
|
|
|
|
|
#parentNode = xmlArea.parentNode
|
|
|
|
|
#parentNode.insertBefore(self.docObj.createField("br",
|
|
|
|
|
#[],"",[],
|
|
|
|
|
#False,False),
|
|
|
|
|
#xmlArea)
|
|
|
|
|
#else:
|
|
|
|
|
#parentNode = xmlArea.parentNode
|
|
|
|
|
#parentNode.insertBefore(self.docObj.createField("br",
|
|
|
|
|
#[],"",[],
|
|
|
|
|
#False,False),
|
|
|
|
|
#xmlArea)
|
|
|
|
|
#prXmlArea = xmlArea
|
|
|
|
|
|
|
|
|
|
def join(self, kdeObj):
|
|
|
|
|
"""Объединяем конфигурации"""
|
|
|
|
|
if isinstance(kdeObj, plasma):
|
|
|
|
|
self.docObj.joinDoc(kdeObj.doc)
|
|
|
|
|
self.postXML()
|
|
|
|
|