X-Git-Url: http://dolda2000.com/gitweb/?p=wrw.git;a=blobdiff_plain;f=wrw%2Fsp%2Futil.py;h=5138f17de082ac8d85dba6c22b062d8694145a2b;hp=02f61f083f45a69be32a77e31e068b269e111f2f;hb=cb66c33fdb75345266af29fc4063bf833100cca5;hpb=7e9080af248b38edec371f117eb4749b09a3caca diff --git a/wrw/sp/util.py b/wrw/sp/util.py index 02f61f0..5138f17 100644 --- a/wrw/sp/util.py +++ b/wrw/sp/util.py @@ -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 @@ def findnsnames(el): 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 @@ 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 @@ class formatter(object): 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 @@ class formatter(object): 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 @@ class formatter(object): elif ev == "$": self.end(el) - def next(self): + def __next__(self): if self.src is None: raise StopIteration() try: @@ -159,8 +159,8 @@ class formatter(object): 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 @@ class formatter(object): 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,27 @@ class formatter(object): @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 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 +243,7 @@ class indenter(formatter): 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 @@ -269,45 +269,45 @@ class indenter(formatter): 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: self.br() - 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 +329,7 @@ class response(dispatch.restart): formatter = indenter def __init__(self, root): - super(response, self).__init__() + super().__init__() self.root = root @property