Dolda2000 GitWeb
/
wrw.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' into python3
[wrw.git]
/
wrw
/
sp
/
util.py
diff --git
a/wrw/sp/util.py
b/wrw/sp/util.py
index
96e9880
..
ad99e8b
100644
(file)
--- a/
wrw/sp/util.py
+++ b/
wrw/sp/util.py
@@
-1,4
+1,6
@@
-import cons
+import io
+from .. import dispatch
+from . import cons
def findnsnames(el):
names = {}
def findnsnames(el):
names = {}
@@
-6,7
+8,7
@@
def findnsnames(el):
def proc(el):
if isinstance(el, cons.element):
if el.ns not in names:
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)
nid[:] = [nid[0] + 1]
for ch in el.children:
proc(ch)
@@
-32,28
+34,31
@@
class formatter(object):
def quotewrite(self, buf):
for ch in buf:
def quotewrite(self, buf):
for ch in buf:
- if ch ==
u
'&':
- self.write(
u
"&")
- elif ch ==
u
'<':
- self.write(
u
"<")
- elif ch ==
u
'>':
- self.write(
u
">")
+ if ch == '&':
+ self.write("&")
+ elif ch == '<':
+ self.write("<")
+ elif ch == '>':
+ self.write(">")
else:
self.write(ch)
def text(self, el):
self.quotewrite(el)
else:
self.write(ch)
def text(self, el):
self.quotewrite(el)
+ def rawcode(self, el):
+ self.write(el)
+
def attrval(self, buf):
def attrval(self, buf):
- qc, qt = (
u"'", u"'") if u'"' in buf else (u'"', u
""")
+ qc, qt = (
"'", "'") if '"' in buf else ('"',
""")
self.write(qc)
for ch in buf:
self.write(qc)
for ch in buf:
- if ch ==
u
'&':
- self.write(
u
"&")
- elif ch ==
u
'<':
- self.write(
u
"<")
- elif ch ==
u
'>':
- self.write(
u
">")
+ if ch == '&':
+ self.write("&")
+ elif ch == '<':
+ self.write("<")
+ elif ch == '>':
+ self.write(">")
elif ch == qc:
self.write(qt)
else:
elif ch == qc:
self.write(qt)
else:
@@
-62,40
+67,40
@@
class formatter(object):
def attr(self, k, v):
self.write(k)
def attr(self, k, v):
self.write(k)
- self.write(
u
'=')
+ self.write('=')
self.attrval(v)
def shorttag(self, el, **extra):
self.attrval(v)
def shorttag(self, el, **extra):
- self.write(
u
'<' + self.elname(el))
- for k, v in el.attrs.ite
rite
ms():
- self.write(
u
' ')
+ self.write('<' + self.elname(el))
+ for k, v in el.attrs.items():
+ self.write(' ')
self.attr(k, v)
self.attr(k, v)
- for k, v in extra.ite
rite
ms():
- self.write(
u
' ')
+ for k, v in extra.items():
+ self.write(' ')
self.attr(k, v)
self.attr(k, v)
- self.write(
u
" />")
+ self.write(" />")
def elname(self, el):
ns = self.nsnames[el.ns]
if ns is None:
return el.name
else:
def elname(self, el):
ns = self.nsnames[el.ns]
if ns is None:
return el.name
else:
- return ns +
u
':' + el.name
+ return ns + ':' + el.name
def starttag(self, el, **extra):
def starttag(self, el, **extra):
- self.write(
u
'<' + self.elname(el))
- for k, v in el.attrs.ite
rite
ms():
- self.write(
u
' ')
+ self.write('<' + self.elname(el))
+ for k, v in el.attrs.items():
+ self.write(' ')
self.attr(k, v)
self.attr(k, v)
- for k, v in extra.ite
rite
ms():
- self.write(
u
' ')
+ for k, v in extra.items():
+ self.write(' ')
self.attr(k, v)
self.attr(k, v)
- self.write(
u
'>')
+ self.write('>')
def endtag(self, el):
def endtag(self, el):
- self.write(
u'</' + self.elname(el) + u
'>')
+ self.write(
'</' + self.elname(el) +
'>')
- def longtag(self, el):
+ def longtag(self, el
, **extra
):
self.starttag(el, **extra)
for ch in el.children:
self.node(ch)
self.starttag(el, **extra)
for ch in el.children:
self.node(ch)
@@
-112,29
+117,41
@@
class formatter(object):
self.element(el)
elif isinstance(el, cons.text):
self.text(el)
self.element(el)
elif isinstance(el, cons.text):
self.text(el)
+ elif isinstance(el, cons.raw):
+ self.rawcode(el)
else:
raise Exception("Unknown object in element tree: " + el)
def start(self):
else:
raise Exception("Unknown object in element tree: " + el)
def start(self):
- self.write(
u'<?xml version="1.0" encoding="' + self.charset + u
'" ?>\n')
+ self.write(
'<?xml version="1.0" encoding="' + self.charset +
'" ?>\n')
if self.doctype:
if self.doctype:
- self.write(
u
'<!DOCTYPE %s PUBLIC "%s" "%s">\n' % (self.root.name,
-
self.doctype[0],
-
self.doctype[1]))
+ self.write('<!DOCTYPE %s PUBLIC "%s" "%s">\n' % (self.root.name,
+ self.doctype[0],
+ self.doctype[1]))
extra = {}
extra = {}
- for uri, nm in self.nsnames.ite
rite
ms():
+ for uri, nm in self.nsnames.items():
if uri is None:
continue
if nm is None:
if uri is None:
continue
if nm is None:
- extra[
u
"xmlns"] = uri
+ extra["xmlns"] = uri
else:
else:
- extra[
u
"xmlns:" + nm] = uri
+ extra["xmlns:" + nm] = uri
self.element(self.root, **extra)
@classmethod
def output(cls, out, el, *args, **kw):
cls(out=out, root=el, *args, **kw).start()
self.element(self.root, **extra)
@classmethod
def output(cls, out, el, *args, **kw):
cls(out=out, root=el, *args, **kw).start()
+ @classmethod
+ def fragment(cls, out, el, *args, **kw):
+ cls(out=out, root=el, *args, **kw).node(el)
+
+ @classmethod
+ def format(cls, el, *args, **kw):
+ buf = io.BytesIO()
+ cls.output(buf, el, *args, **kw)
+ return buf.getvalue()
+
def update(self, **ch):
ret = type(self).__new__(type(self))
ret.__dict__.update(self.__dict__)
def update(self, **ch):
ret = type(self).__new__(type(self))
ret.__dict__.update(self.__dict__)
@@
-148,8
+165,9
@@
class iwriter(object):
self.col = 0
def write(self, buf):
self.col = 0
def write(self, buf):
- for c in buf:
- if c == '\n':
+ for i in range(len(buf)):
+ c = buf[i:i + 1]
+ if c == b'\n':
self.col = 0
else:
self.col += 1
self.col = 0
else:
self.col += 1
@@
-160,16
+178,16
@@
class iwriter(object):
if self.atbol:
return
if self.col != 0:
if self.atbol:
return
if self.col != 0:
- self.write('\n')
+ self.write(
b
'\n')
self.write(indent)
self.atbol = True
class indenter(formatter):
self.write(indent)
self.atbol = True
class indenter(formatter):
- def __init__(self, indent=
u
" ", *args, **kw):
+ def __init__(self, indent=" ", *args, **kw):
super(indenter, self).__init__(*args, **kw)
self.out = iwriter(self.out)
self.indent = indent
super(indenter, self).__init__(*args, **kw)
self.out = iwriter(self.out)
self.indent = indent
- self.curind =
u
""
+ self.curind = ""
def simple(self, el):
for ch in el.children:
def simple(self, el):
for ch in el.children:
@@
-183,19
+201,39
@@
class indenter(formatter):
reind = False
if not self.simple(el):
sub = self.update(curind=self.curind + self.indent)
reind = False
if not self.simple(el):
sub = self.update(curind=self.curind + self.indent)
- sub.
out.indent(sub.curind
)
+ sub.
reindent(
)
reind = True
for ch in el.children:
sub.node(ch)
if reind:
reind = True
for ch in el.children:
sub.node(ch)
if reind:
- self.
out.indent(self.curind
)
+ self.
reindent(
)
self.endtag(el)
def element(self, el, **extra):
super(indenter, self).element(el, **extra)
if self.out.col > 80 and self.simple(el):
self.endtag(el)
def element(self, el, **extra):
super(indenter, self).element(el, **extra)
if self.out.col > 80 and self.simple(el):
- self.out.indent(self.curind)
+ self.reindent()
+
+ def reindent(self):
+ self.out.indent(self.curind.encode(self.charset))
def start(self):
super(indenter, self).start()
self.write('\n')
def start(self):
super(indenter, self).start()
self.write('\n')
+
+class response(dispatch.restart):
+ charset = "utf-8"
+ doctype = None
+ formatter = indenter
+
+ def __init__(self, root):
+ super().__init__()
+ self.root = root
+
+ @property
+ def ctype(self):
+ raise Exception("a subclass of wrw.sp.util.response must override ctype")
+
+ def handle(self, req):
+ req.ohead["Content-Type"] = self.ctype
+ return [self.formatter.format(self.root, doctype=self.doctype, charset=self.charset)]