summaryrefslogtreecommitdiff
path: root/giscanner/xmlwriter.py
diff options
context:
space:
mode:
Diffstat (limited to 'giscanner/xmlwriter.py')
-rwxr-xr-xgiscanner/xmlwriter.py93
1 files changed, 28 insertions, 65 deletions
diff --git a/giscanner/xmlwriter.py b/giscanner/xmlwriter.py
index fb34adf1..5fdcffed 100755
--- a/giscanner/xmlwriter.py
+++ b/giscanner/xmlwriter.py
@@ -24,51 +24,11 @@ import os
from contextlib import contextmanager
from cStringIO import StringIO
-from xml.sax.saxutils import escape, quoteattr
+from xml.sax.saxutils import escape
from .libtoolimporter import LibtoolImporter
-def _calc_attrs_length(attributes, indent, self_indent):
- if indent == -1:
- return -1
- attr_length = 0
- for attr, value in attributes:
- # FIXME: actually, if we have attributes with None as value this
- # should be considered a bug and raise an error. We are just
- # ignoring them here while we fix GIRParser to create the right
- # ast with the correct attributes.
- if value is None:
- continue
- attr_length += 2 + len(attr) + len(quoteattr(value))
- return attr_length + indent + self_indent
-
-
-def collect_attributes(tag_name, attributes, self_indent,
- self_indent_char, indent=-1):
- if not attributes:
- return ''
- if _calc_attrs_length(attributes, indent, self_indent) > 79:
- indent_len = self_indent + len(tag_name) + 1
- else:
- indent_len = 0
- first = True
- attr_value = ''
- for attr, value in attributes:
- # FIXME: actually, if we have attributes with None as value this
- # should be considered a bug and raise an error. We are just
- # ignoring them here while we fix GIRParser to create the right
- # ast with the correct attributes.
- if value is None:
- continue
- if indent_len and not first:
- attr_value += '\n%s' % (self_indent_char * indent_len)
- attr_value += ' %s=%s' % (attr, quoteattr(value))
- if first:
- first = False
- return attr_value
-
-
with LibtoolImporter(None, None):
if 'UNINSTALLED_INTROSPECTION_SRCDIR' in os.environ:
from _giscanner import collect_attributes
@@ -76,6 +36,25 @@ with LibtoolImporter(None, None):
from giscanner._giscanner import collect_attributes
+def build_xml_tag(tag_name, attributes=None, data=None, self_indent=0,
+ self_indent_char=' '):
+ if attributes is None:
+ attributes = []
+ prefix = u'<%s' % (tag_name, )
+ if data is not None:
+ if isinstance(data, str):
+ data = data.decode('UTF-8')
+ suffix = u'>%s</%s>' % (escape(data), tag_name)
+ else:
+ suffix = u'/>'
+ attrs = collect_attributes(
+ tag_name, attributes,
+ self_indent,
+ self_indent_char,
+ len(prefix) + len(suffix))
+ return prefix + attrs + suffix
+
+
class XMLWriter(object):
def __init__(self):
@@ -91,10 +70,8 @@ class XMLWriter(object):
def _open_tag(self, tag_name, attributes=None):
if attributes is None:
attributes = []
- attrs = collect_attributes(
- tag_name, attributes, self._indent,
- self._indent_char,
- len(tag_name) + 2)
+ attrs = collect_attributes(tag_name, attributes,
+ self._indent, self._indent_char, len(tag_name) + 2)
self.write_line(u'<%s%s>' % (tag_name, attrs))
def _close_tag(self, tag_name):
@@ -118,12 +95,11 @@ class XMLWriter(object):
line = line.decode('utf-8')
assert isinstance(line, unicode)
if do_escape:
- line = escape(line.encode('utf-8')).decode('utf-8')
+ line = escape(line)
if indent:
- self._data.write('%s%s%s' % (
- self._indent_char * self._indent,
- line.encode('utf-8'),
- self._newline_char))
+ self._data.write('%s%s%s' % (self._indent_char * self._indent,
+ line.encode('utf-8'),
+ self._newline_char))
else:
self._data.write('%s%s' % (line.encode('utf-8'), self._newline_char))
@@ -131,21 +107,8 @@ class XMLWriter(object):
self.write_line('<!-- %s -->' % (text, ))
def write_tag(self, tag_name, attributes, data=None):
- if attributes is None:
- attributes = []
- prefix = u'<%s' % (tag_name, )
- if data is not None:
- if isinstance(data, str):
- data = data.decode('UTF-8')
- suffix = u'>%s</%s>' % (escape(data), tag_name)
- else:
- suffix = u'/>'
- attrs = collect_attributes(
- tag_name, attributes,
- self._indent,
- self._indent_char,
- len(prefix) + len(suffix))
- self.write_line(prefix + attrs + suffix)
+ self.write_line(build_xml_tag(tag_name, attributes, data,
+ self._indent, self._indent_char))
def push_tag(self, tag_name, attributes=None):
if attributes is None: