7 if isinstance(el, cons.element):
9 names[el.ns] = u"n" + unicode(nid[0])
11 for ch in el.children:
20 class formatter(object):
21 def __init__(self, out, root, nsnames=None, charset="utf-8", doctype=None):
24 nsnames = findnsnames(root)
25 self.nsnames = nsnames
27 self.charset = charset
28 self.doctype = doctype
30 def write(self, text):
31 self.out.write(text.encode(self.charset))
33 def quotewrite(self, buf):
47 def attrval(self, buf):
48 qc, qt = (u"'", u"'") if u'"' in buf else (u'"', u""")
68 def shorttag(self, el, **extra):
69 self.write(u'<' + self.elname(el))
70 for k, v in el.attrs.iteritems():
73 for k, v in extra.iteritems():
79 ns = self.nsnames[el.ns]
83 return ns + u':' + el.name
85 def starttag(self, el, **extra):
86 self.write(u'<' + self.elname(el))
87 for k, v in el.attrs.iteritems():
90 for k, v in extra.iteritems():
96 self.write(u'</' + self.elname(el) + u'>')
98 def longtag(self, el):
99 self.starttag(el, **extra)
100 for ch in el.children:
104 def element(self, el, **extra):
105 if len(el.children) == 0:
106 self.shorttag(el, **extra)
108 self.longtag(el, **extra)
111 if isinstance(el, cons.element):
113 elif isinstance(el, cons.text):
116 raise Exception("Unknown object in element tree: " + el)
119 self.write(u'<?xml version="1.0" encoding="' + self.charset + u'" ?>\n')
121 self.write(u'<!DOCTYPE %s PUBLIC "%s" "%s">\n' % (self.root.name,
125 for uri, nm in self.nsnames.iteritems():
129 extra[u"xmlns"] = uri
131 extra[u"xmlns:" + nm] = uri
132 self.element(self.root, **extra)
135 def output(cls, out, el, *args, **kw):
136 cls(out=out, root=el, *args, **kw).start()
138 def update(self, **ch):
139 ret = type(self).__new__(type(self))
140 ret.__dict__.update(self.__dict__)
141 ret.__dict__.update(ch)
144 class iwriter(object):
145 def __init__(self, out):
150 def write(self, buf):
159 def indent(self, indent):
167 class indenter(formatter):
168 def __init__(self, indent=u" ", *args, **kw):
169 super(indenter, self).__init__(*args, **kw)
170 self.out = iwriter(self.out)
174 def simple(self, el):
175 for ch in el.children:
176 if not isinstance(ch, cons.text):
180 def longtag(self, el, **extra):
181 self.starttag(el, **extra)
184 if not self.simple(el):
185 sub = self.update(curind=self.curind + self.indent)
188 for ch in el.children:
194 def element(self, el, **extra):
195 super(indenter, self).element(el, **extra)
196 if self.out.col > 80 and self.simple(el):
200 self.out.indent(self.curind.encode(self.charset))
203 super(indenter, self).start()