X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=wrw%2Fsp%2Futil.py;h=ad99e8b0e27a110d2d499ce5b365afb0fb216f44;hb=a9a78095b1696f56946abfc7c284f86a21fdcc2d;hp=54f9457d8f24d3b47fe0e26e0b465a2a8d306c8d;hpb=388ed0605123d84cf2ed23dcd8a89de1b749a7b1;p=wrw.git diff --git a/wrw/sp/util.py b/wrw/sp/util.py index 54f9457..ad99e8b 100644 --- a/wrw/sp/util.py +++ b/wrw/sp/util.py @@ -1,3 +1,5 @@ +import io +from .. import dispatch from . import cons def findnsnames(el): @@ -98,7 +100,7 @@ class formatter(object): def endtag(self, el): self.write('') - def longtag(self, el): + def longtag(self, el, **extra): self.starttag(el, **extra) for ch in el.children: self.node(ch) @@ -142,7 +144,13 @@ class formatter(object): @classmethod def fragment(cls, out, el, *args, **kw): - cls(out=out, root=el, *args, **kw).element(el) + 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)) @@ -212,3 +220,20 @@ class indenter(formatter): 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)]