diff options
Diffstat (limited to 'giscanner/xmlwriter.py')
-rwxr-xr-x | giscanner/xmlwriter.py | 93 |
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: |