class TestText(TestCase): def setUp(self): self.node = Node() self.df = DocumentFragment() self.tnode = Text('text') def test_nodename(self): self.assertEqual(self.tnode.nodeName, '#text') def test_html_escape(self): self.assertEqual(self.tnode.html, 'text') self.tnode.textContent = '<' # not escape it has no parent self.assertEqual(self.tnode.html, '<') self.df.appendChild(self.tnode) # escape its parent is DocumentFragment or Element or... self.assertEqual(self.tnode.html, '<') self.assertEqual(Text('<', parent=self.df).html, '<') self.assertEqual(Text('>', parent=self.df).html, '>') self.assertEqual(Text('&', parent=self.df).html, '&') self.assertEqual(Text('"', parent=self.df).html, '"') self.assertEqual(Text('\'', parent=self.df).html, ''') def test_appned(self): self.node.appendChild(self.tnode) self.assertTrue(self.node.hasChildNodes()) self.assertIs(self.tnode.parentNode, self.node) node1 = Node() node2 = Node() self.node.appendChild(node1) self.assertIs(self.tnode.nextSibling, node1) self.assertIs(self.tnode, node1.previousSibling) self.node.insertBefore(node2, self.tnode) self.assertIs(self.tnode.previousSibling, node2) self.assertIs(self.tnode, node2.nextSibling)
class FragmentParser(HTMLParser): """Parser class to parse HTML fragment strings. If unknown tag is found, ``default_class`` is used to generate noew. """ #: Class of unknown tag default_class = None # type: Optional[type] def __init__(self, *args: Any, element_factory: _T_ElementFactory = None, **kwargs: Any) -> None: """Initialize parser.""" super().__init__(*args, **kwargs) # type: ignore from wdom.node import DocumentFragment from wdom.document import create_element self.elm = DocumentFragment() # type: ParentNode self.root = self.elm self.current_tag = '' self.element_factory = element_factory or create_element def handle_starttag(self, tag: str, attr: List[Tuple[str, str]]) -> None: # noqa: D102 self.current_tag = tag attrs = dict(attr) elm = self.element_factory(tag, attrs.get('is'), self.default_class, attrs) if self.elm: self.elm.appendChild(elm) if tag not in HTML_EMPTY: self.elm = elm def handle_endtag(self, tag: str) -> None: # noqa: D102 parent = self.elm.parentNode if parent is None: if self.elm is not self.root: raise ValueError('Parse Failed') else: self.elm = parent def handle_data(self, data: str) -> None: # noqa: D102 if data: self.elm.appendChild(Text(data)) def handle_comment(self, comment: str) -> None: # noqa: D102 from wdom.node import Comment self.elm.appendChild(Comment(comment))
class TestDocumentFragment(TestCase): def setUp(self): self.df = DocumentFragment() self.elm = Element('a') self.c1 = Element('c1') self.c2 = Element('c2') self.c3 = Element('c3') def test_nodename(self): self.assertEqual(self.df.nodeName, '#document-fragment') def test_children(self): self.assertFalse(self.df.hasChildNodes()) appended_child = self.df.appendChild(self.elm) self.assertEqual(self.df.html, '<a></a>') self.assertIs(appended_child, self.elm) def test_append_to_element(self): appended_child1 = self.df.appendChild(self.c1) appended_child2 = self.df.appendChild(self.c2) self.assertIs(self.df, self.c1.parentNode) self.assertIs(self.df, self.c2.parentNode) self.assertIs(appended_child1, self.c1) self.assertIs(appended_child2, self.c2) appended_df = self.elm.appendChild(self.df) self.assertIs(appended_df, self.df) self.assertEqual(self.df.length, 0) self.assertEqual(self.elm.length, 2) self.assertFalse(self.df.hasChildNodes()) self.assertIsNone(self.df.parentNode) self.assertIs(self.elm, self.c1.parentNode) self.assertIs(self.elm, self.c2.parentNode) self.assertIsNone(self.df.parentNode) def test_insert_to_element(self): self.df.appendChild(self.c1) self.df.appendChild(self.c2) self.elm.appendChild(self.c3) inserted_node = self.elm.insertBefore(self.df, self.c3) self.assertIs(inserted_node, self.df) self.assertEqual(self.df.length, 0) self.assertEqual(self.elm.length, 3) self.assertFalse(self.df.hasChildNodes()) self.assertIsNone(self.df.parentNode) self.assertIs(self.elm, self.c1.parentNode) self.assertIs(self.elm, self.c2.parentNode) self.assertIsNone(self.c1.previousSibling) self.assertIs(self.c1.nextSibling, self.c2) self.assertIs(self.c2.previousSibling, self.c1) self.assertIs(self.c2.nextSibling, self.c3) self.assertIs(self.c3.previousSibling, self.c2) self.assertIsNone(self.c3.nextSibling) self.assertIs(self.elm.firstChild, self.c1) self.assertIs(self.elm.lastChild, self.c3) def test_child(self): appended_child1 = self.df.appendChild(self.c1) appended_child2 = self.df.appendChild(self.c2) self.assertIs(appended_child1, self.c1) self.assertIs(appended_child2, self.c2) self.assertEqual(self.c1.html, '<c1></c1>') self.assertEqual(self.df.html, '<c1></c1><c2></c2>') def test_clone_node_sharrow(self): self.df.appendChild(self.c1) clone = self.df.cloneNode() self.assertEqual(self.df.length, 1) self.assertEqual(clone.length, 0) clone.appendChild(self.c2) self.assertEqual(self.df.length, 1) self.assertEqual(clone.length, 1) def test_clone_node_deep(self): self.df.appendChild(self.c1) clone = self.df.cloneNode(deep=True) self.assertEqual(self.df.length, 1) self.assertEqual(clone.length, 1) self.assertEqual(clone.html, '<c1></c1>') clone.appendChild(self.c2) self.assertEqual(self.df.length, 1) self.assertEqual(clone.length, 2) self.df.removeChild(self.c1) self.assertEqual(self.df.length, 0) self.assertEqual(clone.length, 2)