class ElementNode(HamlNode): '''Node which represents a HTML tag''' def __init__(self, haml): HamlNode.__init__(self, haml) self.django_variable = False def _render(self): self.element = Element(self.haml, self.attr_wrapper) self.django_variable = self.element.django_variable self.before = self._render_before(self.element) self.after = self._render_after(self.element) self._render_children() def _render_before(self, element): '''Render opening tag and inline content''' start = ["%s<%s" % (self.spaces, element.tag)] if element.id: start.append(" id=%s" % self.element.attr_wrap( self.replace_inline_variables(element.id))) if element.classes: start.append(" class=%s" % self.element.attr_wrap( self.replace_inline_variables(element.classes))) if element.attributes: start.append(' ' + self.replace_inline_variables(element.attributes)) content = self._render_inline_content(self.element.inline_content) if element.nuke_inner_whitespace and content: content = content.strip() if element.self_close and not content: start.append(" />") elif content: start.append(">%s" % (content)) elif self.children: start.append(">%s" % (self.render_newlines())) else: start.append(">") return ''.join(start) def _render_after(self, element): '''Render closing tag''' if element.inline_content: return "</%s>%s" % (element.tag, self.render_newlines()) elif element.self_close: return self.render_newlines() elif self.children: return "%s</%s>\n" % (self.spaces, element.tag) else: return "</%s>\n" % (element.tag) def _post_render(self): # Inner whitespace removal if self.element.nuke_inner_whitespace: self.before = self.before.rstrip() self.after = self.after.lstrip() if self.children: node = self # If node renders nothing, do removal on its first child instead if node.children[0].empty_node == True: node = node.children[0] if node.children: node.children[0].before = node.children[0].before.lstrip() node = self if node.children[-1].empty_node == True: node = node.children[-1] if node.children: node.children[-1].after = node.children[-1].after.rstrip() # Outer whitespace removal if self.element.nuke_outer_whitespace: left_sibling = self.left_sibling() if left_sibling: # If node has left sibling, strip whitespace after left sibling left_sibling.after = left_sibling.after.rstrip() left_sibling.newlines = 0 else: # If not, whitespace comes from it's parent node, # so strip whitespace before the node self.parent.before = self.parent.before.rstrip() self.parent.newlines = 0 self.before = self.before.lstrip() self.after = self.after.rstrip() right_sibling = self.right_sibling() if right_sibling: right_sibling.before = right_sibling.before.lstrip() else: self.parent.after = self.parent.after.lstrip() self.parent.newlines = 0 super(ElementNode, self)._post_render() def _render_inline_content(self, inline_content): if inline_content == None or len(inline_content) == 0: return None if self.django_variable: content = "{{ " + inline_content.strip() + " }}" return content else: return self.replace_inline_variables(inline_content)
class ElementNode(HamlNode): '''Node which represents a HTML tag''' def __init__(self, haml): HamlNode.__init__(self, haml) self.django_variable = False def _render(self): self.element = Element(self.haml, self.attr_wrapper) self.django_variable = self.element.django_variable self.before = self._render_before(self.element) self.after = self._render_after(self.element) self._render_children() def _render_before(self, element): '''Render opening tag and inline content''' start = ["%s<%s" % (self.spaces, element.tag)] if element.id: start.append(" id=%s" % self.element.attr_wrap(self.replace_inline_variables(element.id))) if element.classes: start.append(" class=%s" % self.element.attr_wrap(self.replace_inline_variables(element.classes))) if element.attributes: start.append(' ' + self.replace_inline_variables(element.attributes)) content = self._render_inline_content(self.element.inline_content) if element.nuke_inner_whitespace and content: content = content.strip() if element.self_close and not content: start.append(" />") elif content: start.append(">%s" % (content)) elif self.children: start.append(">%s" % (self.render_newlines())) else: start.append(">") return ''.join(start) def _render_after(self, element): '''Render closing tag''' if element.inline_content: return "</%s>%s" % (element.tag, self.render_newlines()) elif element.self_close: return self.render_newlines() elif self.children: return "%s</%s>\n" % (self.spaces, element.tag) else: return "</%s>\n" % (element.tag) def _post_render(self): # Inner whitespace removal if self.element.nuke_inner_whitespace: self.before = self.before.rstrip() self.after = self.after.lstrip() if self.children: node = self # If node renders nothing, do removal on its first child instead if node.children[0].empty_node == True: node = node.children[0] if node.children: node.children[0].before = node.children[0].before.lstrip() node = self if node.children[-1].empty_node == True: node = node.children[-1] if node.children: node.children[-1].after = node.children[-1].after.rstrip() # Outer whitespace removal if self.element.nuke_outer_whitespace: left_sibling = self.left_sibling() if left_sibling: # If node has left sibling, strip whitespace after left sibling left_sibling.after = left_sibling.after.rstrip() left_sibling.newlines = 0 else: # If not, whitespace comes from it's parent node, # so strip whitespace before the node self.parent.before = self.parent.before.rstrip() self.parent.newlines = 0 self.before = self.before.lstrip() self.after = self.after.rstrip() right_sibling = self.right_sibling() if right_sibling: right_sibling.before = right_sibling.before.lstrip() else: self.parent.after = self.parent.after.lstrip() self.parent.newlines = 0 super(ElementNode, self)._post_render() def _render_inline_content(self, inline_content): if inline_content == None or len(inline_content) == 0: return None if self.django_variable: content = "{{ " + inline_content.strip() + " }}" return content else: return self.replace_inline_variables(inline_content)