Sfoglia il codice sorgente

added HTMLStringToElements and str2elements

Darren Ranalli 16 anni fa
parent
commit
78476db3cb
1 ha cambiato i file con 60 aggiunte e 0 eliminazioni
  1. 60 0
      direct/src/showbase/PythonUtil.py

+ 60 - 0
direct/src/showbase/PythonUtil.py

@@ -51,6 +51,8 @@ import traceback
 import __builtin__
 import __builtin__
 from StringIO import StringIO
 from StringIO import StringIO
 import marshal
 import marshal
+import ElementTree as ET
+from HTMLParser import HTMLParser
 
 
 from direct.directutil import Verify
 from direct.directutil import Verify
 # Don't import libpandaexpressModules, which doesn't get built until
 # Don't import libpandaexpressModules, which doesn't get built until
@@ -4050,6 +4052,64 @@ if __debug__:
     assert unescapeHtmlString('as%32df') == 'as2df'
     assert unescapeHtmlString('as%32df') == 'as2df'
     assert unescapeHtmlString('asdf%32') == 'asdf2'
     assert unescapeHtmlString('asdf%32') == 'asdf2'
 
 
+class HTMLStringToElements(HTMLParser):
+    def __init__(self, str, *a, **kw):
+        self._elements = []
+        self._elementStack = Stack()
+        HTMLParser.__init__(self, *a, **kw)
+        self.feed(str)
+        self.close()
+
+    def getElements(self):
+        return self._elements
+        
+    def _handleNewElement(self, element):
+        if len(self._elementStack):
+            self._elementStack.top().append(element)
+        else:
+            self._elements.append(element)
+        self._elementStack.push(element)
+
+    def handle_starttag(self, tag, attrs):
+        kwArgs = {}
+        for name, value in attrs:
+            kwArgs[name] = value
+        el = ET.Element(tag, **kwArgs)
+        self._handleNewElement(el)
+
+    def handle_data(self, data):
+        # this ignores text outside of a tag
+        if len(self._elementStack):
+            self._elementStack.top().text = data
+
+    def handle_endtag(self, tag):
+        self._elementStack.pop()
+
+    def handle_comment(self, data):
+        comment = ET.Comment(data)
+        self._handleNewElement(comment)
+
+def str2elements(str):
+    return HTMLStringToElements(str).getElements()
+
+if __debug__:
+    s = ScratchPad()
+    assert len(str2elements('')) == 0
+    s.br = str2elements('<br>')
+    assert len(s.br) == 1
+    assert s.br[0].tag == 'br'
+    s.b = str2elements('<b><br></b>')
+    assert len(s.b) == 1
+    assert len(s.b[0].getchildren()) == 1
+    s.a = str2elements('<a href=\'/\'>test</a>')
+    assert len(s.a) == 1
+    assert s.a[0].get('href') == '/'
+    assert s.a[0].text == 'test'
+    s.c = str2elements('<!--testComment-->')
+    assert len(s.c) == 1
+    assert s.c[0].text == 'testComment'
+    del s
+
 import __builtin__
 import __builtin__
 __builtin__.Functor = Functor
 __builtin__.Functor = Functor
 __builtin__.Stack = Stack
 __builtin__.Stack = Stack