    class docs for more info.

    class HTMLTagError(Exception):
        def __init__(self, msg, **values):

    class HTMLTagAttrLookupError(HTMLTagError, LookupError): pass

    class HTMLTagUnbalancedError(HTMLTagError): pass

    class HTMLNotAllowedError(HTMLTagError): pass

    class HTMLTagProcessingInstructionError(HTMLTagError): pass

    class HTMLTagIncompleteError(HTMLTagError): pass

    class HTMLTag:

        ## Init and reading ##
        def __init__(self, name):
        def readAttr(self, name, value):
        def addChild(self, child):

        ## Access ##
        def name(self):
        def attr(self, name, default=NoDefault):
        def hasAttr(self, name):
        def attrs(self):
        def numAttrs(self):
        def childAt(self, index):
        def numChildren(self):
        def children(self):
        def subtagAt(self, index):
        def numSubtags(self):
        def subtags(self):

        ## Printing ##
        def pprint(self, out=None, indent=0):
        def __repr__(self):

        ## Searching ##
        def tagWithMatchingAttr(self, name, value, default=NoDefault):
        def tagWithId(self, id, default=NoDefault):

        ## Self utility ##

    class HTMLReader(SGMLParser):

        ## Init ##
        def __init__(self, emptyTags=None, extraEmptyTags=None, fakeRootTagIfNeeded=1):

        ## Reading ##
        def readFileNamed(self, filename, retainRootTag=1):
        def readString(self, string, retainRootTag=1):

        ## Printing ##
        def pprint(self, out=None):

        ## Access ##
        def rootTag(self):
        def filename(self):
        def emptyTags(self):
        def setEmptyTags(self, tagList):
        def extendEmptyTags(self, tagList):

        ## Debugging ##
        def printsStack(self):
        def setPrintsStack(self, flag):

        ## Command line ##
        def main(self, args=None):
        def usage(self):

        ## SGMLParser handlers ##
        def handle_data(self, data):
        def handle_pi(self, data):
        def unknown_starttag(self, name, attrs):
        def unknown_endtag(self, name):
        def close(self):

        ## Self utility ##
        def computeTagContainmentConfig(self):

        ## Optimizations ##

    class TagConfig:
        def __init__(self, name, tags):
        def encounteredTag(self, tag, lineNum):

    class TagCanOnlyHaveConfig(TagConfig):
        def encounteredTag(self, tag, lineNum):

    class TagCannotHaveConfig(TagConfig):
        def encounteredTag(self, tag, lineNum):