forked from Nuitka/Nuitka
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTreeXML.py
87 lines (70 loc) · 2.41 KB
/
TreeXML.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# Copyright 2016, Kay Hayen, mailto:[email protected]
#
# Part of "Nuitka", an optimizing Python compiler that is compatible and
# integrates with CPython, but also works on its own.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
""" XML node tree handling
Means to create XML elements from Nuitka tree nodes and to convert the
XML tree to ASCII or output it.
"""
from nuitka.PythonVersions import python_version
from . import Tracing
def indent(elem, level = 0, more_sibs = False):
i = '\n'
if level:
i += (level-1) * " "
num_kids = len(elem)
if num_kids:
if not elem.text or not elem.text.strip():
elem.text = i + " "
if level:
elem.text += " "
count = 0
for kid in elem:
indent(kid, level+1, count < num_kids - 1)
count += 1
if not elem.tail or not elem.tail.strip():
elem.tail = i
if more_sibs:
elem.tail += " "
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
if more_sibs:
elem.tail += " "
return elem
try:
import lxml.etree # pylint: disable=F0401,I0021
xml_module = lxml.etree
Element = xml_module.Element
xml_tostring = lambda tree: lxml.etree.tostring(tree, pretty_print = True)
except ImportError:
try:
import xml.etree.ElementTree
xml_module = xml.etree.ElementTree
Element = xml.etree.ElementTree.Element
xml_tostring = lambda tree: xml_module.tostring(indent(tree))
except ImportError:
xml_module = None
Element = None
xml_tostring = None
def toString(tree):
result = xml_tostring(tree)
if python_version >= 300:
result = result.decode("utf-8")
return result
def dump(tree):
value = toString(tree).rstrip()
Tracing.printLine(value)