# Regular tag bar ==> Document(Element(OpenTag(StartTag,TagName,EndTag),Text,CloseTag(StartCloseTag,TagName,EndTag))) # Nested tag c
==> Document(Element(OpenTag(StartTag,TagName,EndTag), Element(OpenTag(StartTag,TagName,EndTag),Text,CloseTag(StartCloseTag,TagName,EndTag)), Element(SelfClosingTag(StartTag,TagName,EndTag)), CloseTag(StartCloseTag,TagName,EndTag))) # Attribute
==> Document(Element(SelfClosingTag(StartTag,TagName,Attribute(AttributeName,Is,AttributeValue),EndTag))) # Multiple attributes ==> Document(Element(OpenTag(StartTag,TagName, Attribute(AttributeName,Is,AttributeValue), Attribute(AttributeName,Is,AttributeValue), Attribute(AttributeName,Is,AttributeValue),EndTag), CloseTag(StartCloseTag,TagName,EndTag))) # Value-less attributes ==> Document(Element(OpenTag(StartTag,TagName, Attribute(AttributeName), Attribute(AttributeName,Is,AttributeValue), Attribute(AttributeName),EndTag), CloseTag(StartCloseTag,TagName,EndTag))) # Unquoted attributes ==> Document(Element(OpenTag(StartTag,TagName, Attribute(AttributeName,Is,UnquotedAttributeValue), Attribute(AttributeName), Attribute(AttributeName,Is,UnquotedAttributeValue),EndTag), CloseTag(StartCloseTag,TagName,EndTag))) # Unquoted attributes with slashes ==> Document(Element(SelfClosingTag(StartTag,TagName, Attribute(AttributeName,Is,UnquotedAttributeValue), Attribute(AttributeName,Is,UnquotedAttributeValue), Attribute(AttributeName,Is,UnquotedAttributeValue), Attribute(AttributeName,Is,UnquotedAttributeValue), EndTag))) # Single-quoted attributes ==> Document(Element(SelfClosingTag(StartTag, TagName, Attribute(AttributeName, Is, AttributeValue), Attribute(AttributeName, Is, AttributeValue(EntityReference)), EndTag))) # Entities &C ==> Document(Element(OpenTag(StartTag,TagName, Attribute(AttributeName,Is,AttributeValue(EntityReference)),EndTag), EntityReference,CharacterReference, CloseTag(StartCloseTag,TagName,EndTag))) # Doctype ==> Document(DoctypeDecl,Text,Element(OpenTag(StartTag,TagName,EndTag),CloseTag(StartCloseTag,TagName,EndTag))) # Processing instructions ==> Document(ProcessingInst,Element(OpenTag(StartTag,TagName,EndTag),ProcessingInst,CloseTag(StartCloseTag,TagName,EndTag))) # Comments text ==> Document(Comment,Text,Element(OpenTag(StartTag,TagName,EndTag),Comment,Text,CloseTag(StartCloseTag,TagName,EndTag)),Text,Comment,Text,Comment) # Mismatched tag ==> Document(Element(OpenTag(StartTag,TagName,EndTag),MismatchedCloseTag(StartCloseTag,TagName,EndTag))) # Unclosed tag ==> Document(Element(OpenTag(StartTag,TagName,EndTag))) # Ignore pseudo-xml self-closers
==> Document(Element(SelfClosingTag(StartTag,TagName,EndTag))) # Unclosed implicitly closed tag

==> Document(Element(OpenTag(StartTag,TagName,EndTag))) # Nested mismatched tag ==> Document(Element(OpenTag(StartTag,TagName,EndTag), Element(OpenTag(StartTag,TagName,EndTag), Element(OpenTag(StartTag,TagName,EndTag),CloseTag(StartCloseTag,TagName,EndTag)), MismatchedCloseTag(StartCloseTag,TagName,EndTag), ⚠), CloseTag(StartCloseTag,TagName,EndTag))) # Mismatched tag with whitespace < foo bar="10"> blah ==> Document(Element(OpenTag(StartTag,TagName,EndTag), Text, Element(OpenTag(StartTag,TagName,Attribute(AttributeName,Is,AttributeValue),EndTag), Text, MismatchedCloseTag(StartCloseTag,TagName,EndTag), Text, ⚠), CloseTag(StartCloseTag,TagName,EndTag))) # Incomplete close tag ==> Document(Element(OpenTag(StartTag,TagName,EndTag), Element(OpenTag(StartTag,TagName,EndTag), IncompleteCloseTag, ⚠), CloseTag(StartCloseTag,TagName,EndTag))) # Re-synchronize close tags ==> Document(Element(OpenTag(StartTag,TagName,EndTag), Element(OpenTag(StartTag,TagName,EndTag), Element(OpenTag(StartTag,TagName,EndTag), MismatchedCloseTag(StartCloseTag,TagName,EndTag), CloseTag(StartCloseTag,TagName,EndTag)), ⚠), CloseTag(StartCloseTag,TagName,EndTag))) # Top-level mismatched close tag ==> Document( Element(OpenTag(StartTag,TagName,EndTag),CloseTag(StartCloseTag,TagName,EndTag)), MismatchedCloseTag(StartCloseTag,TagName,EndTag)) # Self-closing tags ==> Document(Element(OpenTag(StartTag,TagName,EndTag), Element(SelfClosingTag(StartTag,TagName,Attribute(AttributeName,Is,UnquotedAttributeValue),EndTag)), CloseTag(StartCloseTag,TagName,EndTag))) # Implicitly closed

Hello
==> Document(Element(OpenTag(StartTag,TagName,EndTag), Element(OpenTag(StartTag,TagName,EndTag),Text), CloseTag(StartCloseTag,TagName,EndTag))) # Closed by sibling

Foo

Bar

==> Document(Element(OpenTag(StartTag,TagName,EndTag), Text, Element(OpenTag(StartTag,TagName,EndTag),Text), Element(OpenTag(StartTag,TagName,EndTag),Text), CloseTag(StartCloseTag,TagName,EndTag))) # Closed by sibling at top

Foo

Bar ==> Document(Element(OpenTag(StartTag,TagName,EndTag),Text),Element(OpenTag(StartTag,TagName,EndTag),Text)) # Textarea

Enter something: ==> Document(Element(OpenTag(StartTag,TagName,EndTag), Text, Element(OpenTag(StartTag,TagName,Attribute(AttributeName,Is,UnquotedAttributeValue),EndTag), TextareaText, CloseTag(StartCloseTag,TagName,EndTag)))) # Script ==> Document(Element(OpenTag(StartTag,TagName,EndTag),ScriptText,CloseTag(StartCloseTag,TagName,EndTag))) # Allows whitespace in tags < body foo=bar >hi ==> Document(Element( OpenTag(StartTag,TagName,Attribute(AttributeName,Is,UnquotedAttributeValue),EndTag), Text, CloseTag(StartCloseTag,TagName,EndTag))) # Doesn't get confused by a stray ampersand a&b ==> Document(Element(OpenTag(StartTag,TagName,EndTag),Text,InvalidEntity,Text,CloseTag(StartCloseTag,TagName,EndTag))) # Can ignore mismatches {"dialect": "noMatch"}

foo

==> Document(Element(OpenTag(StartTag,TagName,EndTag),Text,CloseTag(StartCloseTag,TagName,EndTag))) # Can handle lone close tags {"dialect": "noMatch"} ==> Document(CloseTag(StartCloseTag,TagName,EndTag)) # Parses ampersands in attributes ==> Document(Element(SelfClosingTag(StartTag, TagName, Attribute(AttributeName, Is, AttributeValue(InvalidEntity)), EndTag))) # Supports self-closing dialect {"dialect": "selfClosing"}
==> Document(Element( OpenTag(StartTag,TagName,EndTag), Element(SelfClosingTag(StartTag,TagName,Attribute(AttributeName,Is,UnquotedAttributeValue),SelfClosingEndTag)), CloseTag(StartCloseTag,TagName,EndTag))) # Allows self-closing in foreign elements
==> Document(Element(OpenTag(StartTag,TagName,EndTag), Element(OpenTag(StartTag,TagName,EndTag), Element(SelfClosingTag(StartTag,TagName,SelfClosingEndTag)), CloseTag(StartCloseTag,TagName,EndTag)), CloseTag(StartCloseTag,TagName,EndTag))) # Parses multiple unfinished tags in a row
Document(Element(OpenTag(StartTag,TagName,⚠), Element(OpenTag(StartTag,TagName,⚠), Element(OpenTag(StartTag,TagName,⚠),⚠),⚠),⚠)) # Allows self-closing on special tags {"dialect": "selfClosing"}