def _open(self, bind, kwargs): """Return a ``'<partial'`` opener tag with no terminator.""" contents = kwargs.pop('contents', None) if PY2: attributes = _unicode_keyed(kwargs) else: attributes = kwargs tagname = self.tagname new_contents = transform( tagname, attributes, contents, self._context, bind) if not new_contents: new_contents = u'' elif hasattr(new_contents, '__html__'): new_contents = _unpack(new_contents) self.contents = self._markup(new_contents) if self._context[u'ordered_attributes']: pairs = sorted(attributes.items(), key=_attribute_sort_key) else: pairs = iteritems(attributes) guts = u' '.join(u'%s="%s"' % (k, _attribute_escape(v)) for k, v in pairs) if guts: return u'<' + tagname + u' ' + guts else: return u'<' + tagname
def _simplify_stream(stream, ctxt, vars): # consumes stream, send a list parts = [] for idx, (kind, data, pos) in enumerate(stream): if kind is TEXT: parts.append(data) elif kind is EXPR: value = _eval_expr(data, ctxt, vars) if hasattr(value, '__html__'): value = _unpack(value) if hasattr(value, '__next__') or hasattr(value, 'next'): while hasattr(value, '__next__') or hasattr(value, 'next'): value = list(value) value = _simplify_stream(value, ctxt, vars) if not isinstance(value, text_type): stream[idx:idx + 1] = value else: stream[idx] = (TEXT, value, pos) elif isinstance(value, bytestring_type): value = value.decode('utf8', 'replace') elif not isinstance(value, text_type): value = text_type(value) parts.append(value) else: return stream return u''.join(parts)
def _open(self, bind, kwargs): """Return a ``'<partial'`` opener tag with no terminator.""" contents = kwargs.pop('contents', None) if PY2: attributes = _unicode_keyed(kwargs) else: attributes = kwargs tagname = self.tagname new_contents = transform(tagname, attributes, contents, self._context, bind) if not new_contents: new_contents = u'' elif hasattr(new_contents, '__html__'): new_contents = _unpack(new_contents) self.contents = self._markup(new_contents) if self._context[u'ordered_attributes']: pairs = sorted(attributes.items(), key=_attribute_sort_key) else: pairs = iteritems(attributes) guts = u' '.join(u'%s="%s"' % (k, _attribute_escape(v)) for k, v in pairs) if guts: return u'<' + tagname + u' ' + guts else: return u'<' + tagname
def _attribute_escape(string): if not string: return u'' elif hasattr(string, '__html__'): return _unpack(string) else: return string. \ replace(u'&', u'&'). \ replace(u'<', u'<'). \ replace(u'>', u'>'). \ replace(u'"', u'"')
def __call__(self, bind=None, **attributes): """Return a complete, closed markup string.""" header = self._open(bind, attributes) contents = self.contents if not contents: if not self._always_paired: if self._context.xml: return self._markup(header + u' />') elif self._html_dangle: return self._markup(header + u'>') if hasattr(contents, '__html__'): contents = _unpack(contents) return self._markup(header + u'>' + contents + self._close())