359 # main stream |
359 # main stream |
360 self.body = UStringIO() |
360 self.body = UStringIO() |
361 self.doctype = u'' |
361 self.doctype = u'' |
362 # xmldecl and html opening tag |
362 # xmldecl and html opening tag |
363 self.xmldecl = u'<?xml version="1.0" encoding="%s"?>\n' % req.encoding |
363 self.xmldecl = u'<?xml version="1.0" encoding="%s"?>\n' % req.encoding |
364 self.htmltag = u'<html xmlns="http://www.w3.org/1999/xhtml" ' \ |
364 self._namespaces = [('xmlns', 'http://www.w3.org/1999/xhtml'), |
365 'xmlns:cubicweb="http://www.logilab.org/2008/cubicweb" ' \ |
365 ('xmlns:cubicweb','http://www.logilab.org/2008/cubicweb')] |
366 'xml:lang="%s" lang="%s">' % (req.lang, req.lang) |
366 self._htmlattrs = [('xml:lang', req.lang), |
|
367 ('lang', req.lang)] |
367 # keep main_stream's reference on req for easier text/html demoting |
368 # keep main_stream's reference on req for easier text/html demoting |
368 req.main_stream = self |
369 req.main_stream = self |
|
370 |
|
371 def add_namespace(self, prefix, uri): |
|
372 self._namespaces.append( (prefix, uri) ) |
|
373 |
|
374 def set_namespaces(self, namespaces): |
|
375 self._namespaces = namespaces |
|
376 |
|
377 def add_htmlattr(self, attrname, attrvalue): |
|
378 self._htmlattrs.append( (attrname, attrvalue) ) |
|
379 |
|
380 def set_htmlattrs(self, attrs): |
|
381 self._htmlattrs = attrs |
|
382 |
|
383 def set_doctype(self, doctype, reset_xmldecl=True): |
|
384 self.doctype = doctype |
|
385 if reset_xmldecl: |
|
386 self.xmldecl = u'' |
369 |
387 |
370 def write(self, data): |
388 def write(self, data): |
371 """StringIO interface: this method will be assigned to self.w |
389 """StringIO interface: this method will be assigned to self.w |
372 """ |
390 """ |
373 self.body.write(data) |
391 self.body.write(data) |
|
392 |
|
393 @property |
|
394 def htmltag(self): |
|
395 attrs = ' '.join('%s="%s"' % (attr, xml_escape(value)) |
|
396 for attr, value in (self._namespaces + self._htmlattrs)) |
|
397 if attrs: |
|
398 return '<html %s>' % attrs |
|
399 return '<html>' |
374 |
400 |
375 def getvalue(self): |
401 def getvalue(self): |
376 """writes HTML headers, closes </head> tag and writes HTML body""" |
402 """writes HTML headers, closes </head> tag and writes HTML body""" |
377 return u'%s\n%s\n%s\n%s\n%s\n</html>' % (self.xmldecl, self.doctype, |
403 return u'%s\n%s\n%s\n%s\n%s\n</html>' % (self.xmldecl, self.doctype, |
378 self.htmltag, |
404 self.htmltag, |
379 self.head.getvalue(), |
405 self.head.getvalue(), |
380 self.body.getvalue()) |
406 self.body.getvalue()) |
381 |
|
382 |
407 |
383 try: |
408 try: |
384 # may not be there if cubicweb-web not installed |
409 # may not be there if cubicweb-web not installed |
385 if sys.version_info < (2, 6): |
410 if sys.version_info < (2, 6): |
386 import simplejson as json |
411 import simplejson as json |