From: Fredrik Tolf Date: Sat, 28 Dec 2013 05:48:03 +0000 (+0100) Subject: Merge branch 'master' into python3 X-Git-Url: http://git.dolda2000.com/gitweb/?a=commitdiff_plain;h=537064f6656c313c601126692d31628a85de663d;hp=-c;p=wrw.git Merge branch 'master' into python3 Conflicts: wrw/sp/util.py --- 537064f6656c313c601126692d31628a85de663d diff --combined wrw/sp/util.py index 5138f17,2599206..931cbdb --- a/wrw/sp/util.py +++ b/wrw/sp/util.py @@@ -1,6 -1,6 +1,6 @@@ -import itertools, StringIO -from wrw import dispatch -import cons +import itertools, io +from .. import dispatch +from . import cons def findnsnames(el): names = {} @@@ -8,7 -8,7 +8,7 @@@ def proc(el): if isinstance(el, cons.element): if el.ns not in names: - names[el.ns] = u"n" + unicode(nid[0]) + names[el.ns] = "n" + str(nid[0]) nid[:] = [nid[0] + 1] for ch in el.children: proc(ch) @@@ -56,9 -56,9 +56,9 @@@ class formatter(object) self.buf.extend(text.encode(self.charset)) def quotewrite(self, buf): - buf = buf.replace(u'&', u"&") - buf = buf.replace(u'<', u"<") - buf = buf.replace(u'>', u">") + buf = buf.replace('&', "&") + buf = buf.replace('<', "<") + buf = buf.replace('>', ">") self.write(buf) def __iter__(self): @@@ -69,53 -69,53 +69,53 @@@ if ns is None: return el.name else: - return ns + u":" + el.name + return ns + ":" + el.name def attrval(self, v): - qc, qt = (u"'", u"'") if u'"' in v else (u'"', u""") + qc, qt = ("'", "'") if '"' in v else ('"', """) self.write(qc) - v = v.replace(u'&', u"&") - v = v.replace(u'<', u"<") - v = v.replace(u'>', u">") + v = v.replace('&', "&") + v = v.replace('<', "<") + v = v.replace('>', ">") v = v.replace(qc, qt) self.write(v) self.write(qc) def attr(self, k, v): self.write(k) - self.write(u"=") + self.write("=") self.attrval(v) def attrs(self, attrs): for k, v in attrs: - self.write(u" ") + self.write(" ") self.attr(k, v) def inittag(self, el): - self.write(u"<" + self.elname(el)) - attrs = el.attrs.iteritems() + self.write("<" + self.elname(el)) + attrs = el.attrs.items() if self.first: nsnames = [] - for ns, name in self.nsnames.iteritems(): + for ns, name in self.nsnames.items(): if ns is None: if name is not None: raise Exception("null namespace must have null name, not" + name) continue - nsnames.append((u"xmlns" if name is None else (u"xmlns:" + name), ns)) + nsnames.append(("xmlns" if name is None else ("xmlns:" + name), ns)) attrs = itertools.chain(attrs, iter(nsnames)) self.first = False self.attrs(attrs) def starttag(self, el): self.inittag(el) - self.write(u">") + self.write(">") def shorttag(self, el): self.inittag(el) - self.write(u" />") + self.write(" />") def endtag(self, el): - self.write(u"") + self.write("") def text(self, el): self.quotewrite(el) @@@ -124,9 -124,9 +124,9 @@@ self.write(el) def start(self, el): - self.write(u'\n') + self.write('\n') if isinstance(el, cons.doctype): - self.write(u'\n' % (el.rootname, + self.write('\n' % (el.rootname, el.pubid, el.dtdid)) self.first = True @@@ -150,7 -150,7 +150,7 @@@ elif ev == "$": self.end(el) - def next(self): + def __next__(self): if self.src is None: raise StopIteration() try: @@@ -159,8 -159,8 +159,8 @@@ self.src = None ev, el = "$", None self.handle(ev, el) - ret = str(self.buf) - self.buf[:] = "" + ret = bytes(self.buf) + self.buf[:] = b"" return ret def nsname(self, el): @@@ -170,7 -170,7 +170,7 @@@ return ret if el.ns is None: return None - ret = u"n" + unicode(self.nextns) + ret = "n" + str(self.nextns) self.nextns += 1 return ret @@@ -215,27 -215,28 +215,28 @@@ @classmethod def format(cls, root, **kw): - buf = StringIO.StringIO() + buf = io.BytesIO() cls.output(buf, root, **kw) return buf.getvalue() class indenter(formatter): - def __init__(self, indent=u" ", *args, **kw): - super(indenter, self).__init__(*args, **kw) + def __init__(self, indent=" ", *args, **kw): + super().__init__(*args, **kw) self.indent = indent self.col = 0 - self.curind = u"" + self.curind = "" self.atbreak = True self.inline = False self.stack = [] self.last = None, None + self.lastendbr = True def write(self, text): - lines = text.split(u"\n") + lines = text.split("\n") if len(lines) > 1: for ln in lines[:-1]: self.buf.extend(ln.encode(self.charset)) - self.buf.extend("\n") + self.buf.extend(b"\n") self.col = 0 self.buf.extend(lines[-1].encode(self.charset)) self.col += len(lines[-1]) @@@ -243,7 -244,7 +244,7 @@@ def br(self): if not self.atbreak: - self.buf.extend((u"\n" + self.curind).encode(self.charset)) + self.buf.extend(("\n" + self.curind).encode(self.charset)) self.col = 0 self.atbreak = True @@@ -262,52 -263,55 +263,55 @@@ def starttag(self, el): if not self.inline: - if self.last[0] == "<" and self.last[1].name == el.name: + if self.last[0] == "<" and self.last[1].name == el.name and self.lastendbr: pass else: self.br() self.push(el) self.inline = self.inline or self.inlinep(el) self.curind += self.indent - super(indenter, self).starttag(el) + super().starttag(el) def shorttag(self, el): if not self.inline: self.br() - super(indenter, self).shorttag(el) + super().shorttag(el) def endtag(self, el): il = self.inline self.pop() - if not il: + if il or (self.last[0] == ">" and self.last[1] == el): + self.lastendbr = False + else: self.br() + self.lastendbr = True - super(indenter, self).endtag(el) + super().endtag(el) def start(self, el): - super(indenter, self).start(el) + super().start(el) self.atbreak = True def end(self, el): self.br() def handle(self, ev, el): - super(indenter, self).handle(ev, el) + super().handle(ev, el) self.last = ev, el class textindenter(indenter): maxcol = 70 def text(self, el): - left = unicode(el) + left = str(el) while True: if len(left) + self.col > self.maxcol: bp = max(self.maxcol - self.col, 0) - for i in xrange(bp, -1, -1): + for i in range(bp, -1, -1): if left[i].isspace(): while i > 0 and left[i - 1].isspace(): i -= 1 break else: - for i in xrange(bp + 1, len(left)): + for i in range(bp + 1, len(left)): if left[i].isspace(): break else: @@@ -329,7 -333,7 +333,7 @@@ class response(dispatch.restart) formatter = indenter def __init__(self, root): - super(response, self).__init__() + super().__init__() self.root = root @property