OSDN Git Service

more strict process about to tags not to need close
authorHiromichi MATSUSHIMA <hirom@office-sv.osdn.jp>
Fri, 8 Jul 2011 09:16:10 +0000 (18:16 +0900)
committerHiromichi MATSUSHIMA <hirom@office-sv.osdn.jp>
Fri, 8 Jul 2011 09:16:10 +0000 (18:16 +0900)
htmltree.py

index 2bcb1da..8afcfb4 100644 (file)
@@ -28,6 +28,9 @@ class Renderer(object):
 
 class HTMLRenderer(Renderer):
     """Render HTMLElement as HTML."""
+    # TODO: check tags not need to close more strict...
+    UNCLOSABLE_TAGS = ["br", "link", "meta", "img"]
+
     def render_inner(self, elem):
         texts = []
         for child in elem:
@@ -44,7 +47,8 @@ class HTMLRenderer(Renderer):
             texts.append("<" + elem.name + self.attrs2str(elem) + ">")
             for child in elem:
                 self._recursive(child, texts)
-            texts.append("</" + elem.name + ">")
+            if not elem.name in self.UNCLOSABLE_TAGS:
+                texts.append("</" + elem.name + ">")
         elif elem.is_text():
             if elem.text():
                 texts.append(elem.text())
@@ -161,6 +165,11 @@ class HTMLElement(list):
         for i in self:
             i._r_get_elements_by_class(cls, buf)
 
+    # manipulation functions
+    def append_tag(self, tag, attrs):
+        elem = HTMLElement(HTMLElement.TAG, tag, attrs)
+        self.append(elem)
+
     # query functions
     # TODO: this function is under implementing...
     def select(self, expr):
@@ -249,6 +258,8 @@ class HTMLTree(HTMLParser.HTMLParser):
     JOIN_TEXT    = 0x0040
 
     TRUNC_BR = 0x0100
+    # TODO: check tags not need to close more strict...
+    UNCLOSABLE_TAGS = ["br", "link", "meta", "img", "input"]
 
     def __init__(self):
         "Constructor"
@@ -322,7 +333,7 @@ class HTMLTree(HTMLParser.HTMLParser):
     # Handlers
     def handle_starttag(self, tag, attrs):
         # some tags treat as start-end tag.
-        if tag in ["br",]:
+        if tag in self.UNCLOSABLE_TAGS:
             return self.handle_startendtag(tag, attrs)
             
         elem = HTMLElement(HTMLElement.TAG, tag, attrs)
@@ -339,7 +350,7 @@ class HTMLTree(HTMLParser.HTMLParser):
 
     def handle_endtag(self, tag):
         # some tags treat as start-end tag.
-        if tag in ["br",]:
+        if tag in self.UNCLOSABLE_TAGS:
             return
 
         self._cursor = self._cursor.parent()