Package Torello.HTML

Class PageStats

  • All Implemented Interfaces:
    java.io.Serializable, java.lang.Cloneable, java.lang.Comparable<PageStats>

    public class PageStats
    extends java.lang.Object
    implements java.io.Serializable, java.lang.Comparable<PageStats>, java.lang.Cloneable
    Computes miscellaneous statistics for a web-page, or sub-page.

    The original intention of this class was to have a simple way of "page-equality checking." Sometimes downloading from a URL will return an HTML page that has changed. This class does some common statistics/features calculations about the page - count the number of nodes (for instance), and count common node-occurrences like the presence of both opening and closing HTML tags (this is sometimes thought of as 'well-formed HTML').

    It will also do a complete java.lang.String hash-code on the entire page, so it is almost 100% likely that a PageStats instance is a unique-identifier of the actual HTML page. Also, there is some basic information available in the class which may (or may not) be of use to a programmer.


    Note about Use:
    When this class is converted to a String - using: StringParse.objToStr(instance); - the java-string that is generated could be used as a "Unique Identifier" (similar to a Primary Key in a DataBase) to guarantee that two pages, when compared, are either identical or are different.

    This could avoid the lengthy process of checking whether each and every string in each and ever HTMLNode were exactly equal. Mostly, because one of the statistics collected is a hash-code that hashes the page as as if it were a single string - the likelihood that using the public boolean 'equals(Object o)' method that's included in the class PageStats makes the chance of making an 'equality mistake' extremely, extremely low.


    IMPORTANT:
    The number of features that are polled or 'counted' when building an instance of this class creates enough pieces of information, 'data', to suite more than just the original purposes of the class PageStats. As mentioned, this module was written to help detect "page-equality" when downloading pages from similar or identical URL's. Hopefully, it is obvious that the list of statistics available when creating an instance of this class might be useful for many general purpose uses - besides equality checking.

    Each of the individual fields in an instance of PageStats are all public & final fields. This does also mean that if a vectorized-html web-page is modified, the constructor to this class needs to generate an entire new instance of the class.
    See Also:
    Serialized Form


    • Field Detail

      • serialVersionUID

        🡇     🗕  🗗  🗖
        public static final long serialVersionUID
        This fulfils the SerialVersion UID requirement for all classes that implement Java's interface java.io.Serializable. Using the Serializable Implementation offered by java is very easy, and can make saving program state when debugging a lot easier. It can also be used in place of more complicated systems like "hibernate" to store data as well.
        See Also:
        Constant Field Values
        Code:
        Exact Field Declaration Expression:
         public static final long serialVersionUID = 1;
        
      • hasAVclass

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVclass
        The number of HTML TagNode elements that have a 'class' attribute, when queried using TagNode.AV("class")
      • hasAVstyle

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVstyle
        The number of HTML TagNode elements that have a 'style' attribute, when queried using TagNode.AV("style")
      • hasAVid

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVid
        The number of HTML TagNode elements that have an 'id' attribute, when queried using TagNode.AV("id")
      • hasAVtitle

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVtitle
        The number of HTML TagNode elements that have a 'title' attribute, when queried using TagNode.AV("title")
      • hasAVhref

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVhref
        The number of HTML TagNode elements that have an 'href' attribute, when queried using TagNode.AV("href")
      • hasAVhreflang

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVhreflang
        The number of HTML TagNode elements that have a 'hreflang' attribute, when queried using TagNode.AV("hreflang")
      • hasAVsrc

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVsrc
        The number of HTML TagNode elements that have a 'src' attribute, when queried using TagNode.AV("src")
      • hasAVsrcset

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVsrcset
        The number of HTML TagNode elements that have a 'srcset' attribute, when queried using TagNode.AV("srcset")
      • hasAVsrclang

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVsrclang
        The number of HTML TagNode elements that have a 'srclang' attribute, when queried using TagNode.AV("srclang")
      • hasAVsrcdoc

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVsrcdoc
        The number of HTML TagNode elements that have a 'srcdoc' attribute, when queried using TagNode.AV("srcdoc")
      • hasAValt

        🡅  🡇     🗕  🗗  🗖
        public final short hasAValt
        The number of HTML TagNode elements that have an 'alt' attribute, when queried using TagNode.AV("alt")
      • hasAVtarget

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVtarget
        The number of HTML TagNode elements that have a 'target' attribute, when queried using TagNode.AV("target")
      • hasAVwidth

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVwidth
        The number of HTML TagNode elements that have a 'width' attribute, when queried using TagNode.AV("width")
      • hasAVheight

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVheight
        The number of HTML TagNode elements that have a 'height' attribute, when queried using TagNode.AV("height")
      • hasAVsize

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVsize
        The number of HTML TagNode elements that have a 'size' attribute, when queried using TagNode.AV("size")
      • hasAVsizes

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVsizes
        The number of HTML TagNode elements that have a 'sizes' attribute, when queried using TagNode.AV("sizes")
      • hasAVcols

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVcols
        The number of HTML TagNode elements that have a 'cols' attribute, when queried using TagNode.AV("cols")
      • hasAVcolspan

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVcolspan
        The number of HTML TagNode elements that have a 'colspan' attribute, when queried using TagNode.AV("colspan")
      • hasAVrows

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVrows
        The number of HTML TagNode elements that have a 'rows' attribute, when queried using TagNode.AV("rows")
      • hasAVrowspan

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVrowspan
        The number of HTML TagNode elements that have a 'rowspan' attribute, when queried using TagNode.AV("rowspan")
      • hasAVwrap

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVwrap
        The number of HTML TagNode elements that have a 'wrap' attribute, when queried using TagNode.AV("wrap")
      • hasAVvalue

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVvalue
        The number of HTML TagNode elements that have a 'value' attribute, when queried using TagNode.AV("value")
      • hasAVtype

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVtype
        The number of HTML TagNode elements that have a 'type' attribute, when queried using TagNode.AV("type")
      • hasAVname

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVname
        The number of HTML TagNode elements that have a 'name' attribute, when queried using TagNode.AV("name")
      • hasAVmin

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVmin
        The number of HTML TagNode elements that have a 'min' attribute, when queried using TagNode.AV("min")
      • hasAVmax

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVmax
        The number of HTML TagNode elements that have a 'max' attribute, when queried using TagNode.AV("max")
      • hasAVminlength

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVminlength
        The number of HTML TagNode elements that have a 'minlength' attribute, when queried using TagNode.AV("minlength")
      • hasAVmaxlength

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVmaxlength
        The number of HTML TagNode elements that have a 'maxlength' attribute, when queried using TagNode.AV("maxlength")
      • hasAVaccept

        🡅  🡇     🗕  🗗  🗖
        public final short hasAVaccept
        The number of HTML TagNode elements that have a 'accept' attribute, when queried using TagNode.AV("accept")
      • numImages

        🡅  🡇     🗕  🗗  🗖
        public final short numImages
        The total number of HTML <IMG ...> 'TagNode' elements found on the page.

        NOTE: This is considered an HTML-5 'Singleton' element, and thusly should only have an "Opening-Tag Version" of the Element. If there are (accidentally) closing-versions of this tag, they will not be counted by class PageStats
      • numMeta

        🡅  🡇     🗕  🗗  🗖
        public final short numMeta
        The total number of HTML <META ...> 'TagNode' elements found on the page.

        NOTE: This is considered an HTML-5 'Singleton' element, and thusly should only have an "Opening-Tag Version" of the Element. If there are (accidentally) closing-versions of this tag, they will not be counted by class PageStats
      • numLink

        🡅  🡇     🗕  🗗  🗖
        public final short numLink
        The total number of HTML <LINK ...> 'TagNode' elements found on the page.

        NOTE: This is considered an HTML-5 'Singleton' element, and thusly should only have an "Opening-Tag Version" of the Element. If there are (accidentally) closing-versions of this tag, they will not be counted by class PageStats
      • numInput

        🡅  🡇     🗕  🗗  🗖
        public final short numInput
        The total number of HTML <INPUT ...> 'TagNode' elements found on the page.

        NOTE: This is considered an HTML-5 'Singleton' element, and thusly should only have an "Opening-Tag Version" of the Element. If there are (accidentally) closing-versions of this tag, they will not be counted by class PageStats
      • numEmbed

        🡅  🡇     🗕  🗗  🗖
        public final short numEmbed
        The total number of HTML <EMBED ...> 'TagNode' elements found on this page.

        NOTE: This is considered an HTML-5 'Singleton' element, and thusly should only have an "Opening-Tag Version" of the Element. If there are (accidentally) closing-versions of this tag, they will not be counted by class PageStats
      • numHR

        🡅  🡇     🗕  🗗  🗖
        public final short numHR
        The total number of HTML <HR> 'TagNode' elements found on the page.

        NOTE: This is considered an HTML-5 'Singleton' element, and thusly should only have an "Opening-Tag Version" of the Element. If there are (accidentally) closing-versions of this tag, they will not be counted by class PageStats
      • numBR

        🡅  🡇     🗕  🗗  🗖
        public final short numBR
        The total number of HTML <BR> 'TagNode' elements found on the page.

        NOTE: This is considered an HTML-5 'Singleton' element, and thusly should only have an "Opening-Tag Version" of the Element. If there are (accidentally) closing-versions of this tag, they will not be counted by class PageStats
      • numOpenTables

        🡅  🡇     🗕  🗗  🗖
        public final short numOpenTables
        The total number of <TABLE>, TC.OpeningTags, TagNode elements found on the page. Any element-internal attributes / inner-tags actually found inside the HTML element will just be ignored for the purposes of this count.
      • numOpenAnchors

        🡅  🡇     🗕  🗗  🗖
        public final short numOpenAnchors
        The total number of <A> (Anchor), TC.OpeningTags, TagNode elements found on the page. Any element-internal attributes / inner-tags actually found inside the HTML element will just be ignored for the purposes of this count.
      • numOpenParagraphs

        🡅  🡇     🗕  🗗  🗖
        public final short numOpenParagraphs
        The total number of <P> (Paragraph), TC.OpeningTags, TagNode elements found on the page. Any element-internal attributes / inner-tags actually found inside the HTML element will just be ignored for the purposes of this count.
      • numOpenDivs

        🡅  🡇     🗕  🗗  🗖
        public final short numOpenDivs
        The total number of <DIV> (Divider), TC.OpeningTags, TagNode elements found on the page. Any element-internal attributes / inner-tags actually found inside the HTML element will just be ignored for the purposes of this count.
      • numOpenSpans

        🡅  🡇     🗕  🗗  🗖
        public final short numOpenSpans
        The total number of <SPAN>, TC.OpeningTags, TagNode elements found on the page. Any element-internal attributes / inner-tags actually found inside the HTML element will just be ignored for the purposes of this count.
      • numOpenScripts

        🡅  🡇     🗕  🗗  🗖
        public final short numOpenScripts
        The total number of <SCRIPT>, TC.OpeningTags, TagNode elements found on the page. Any element-internal attributes / inner-tags actually found inside the HTML element will just be ignored for the purposes of this count.
      • numOpenStyles

        🡅  🡇     🗕  🗗  🗖
        public final short numOpenStyles
        The total number of <STYLE>, TC.OpeningTags, TagNode elements found on the page. Any element-internal attributes / inner-tags actually found inside the HTML element will just be ignored for the purposes of this count.
      • numOpenFrames

        🡅  🡇     🗕  🗗  🗖
        public final short numOpenFrames
        The total number of <FRAME>, TC.OpeningTags, TagNode elements found on the page. Any element-internal attributes / inner-tags actually found inside the HTML element will just be ignored for the purposes of this count.
      • numOpenIFrames

        🡅  🡇     🗕  🗗  🗖
        public final short numOpenIFrames
        The total number of <IFRAME>, TC.OpeningTags, TagNode elements found on the page. Any element-internal attributes / inner-tags actually found inside the HTML element will just be ignored for the purposes of this count.
      • numOpenForms

        🡅  🡇     🗕  🗗  🗖
        public final short numOpenForms
        The total number of <FORM>, TC.OpeningTags, TagNode elements found on the page. Any element-internal attributes / inner-tags actually found inside the HTML element will just be ignored for the purposes of this count.
    • Method Detail

      • equals

        🡅  🡇     🗕  🗗  🗖
        public boolean equals​(java.lang.Object o)
        Java's public boolean equals(Object o) requirements.
        Overrides:
        equals in class java.lang.Object
        Parameters:
        o - This may be any Java Object, but only ones of 'this' type whose internal-values are identical will cause this method to return TRUE.
        Returns:
        TRUE if 'this' instance of PageStats is identical to parameter 'o'.
        Code:
        Exact Method Body:
         if (! (o instanceof PageStats)) return false;
        
         PageStats otherPageStats = (PageStats) o;
        
         return
             (this.strLength             == otherPageStats.strLength)            &&
             (this.hash                  == otherPageStats.hash)                 &&
             (this.numNodes              == otherPageStats.numNodes)             &&
             (this.numTagNodes           == otherPageStats.numTagNodes)          &&
             (this.numTextNodes          == otherPageStats.numTextNodes)         &&
             (this.numCommentNodes       == otherPageStats.numCommentNodes)      &&
             (this.numNewLines           == otherPageStats.numNewLines)          &&
        
        
             (this.hasAVclass            == otherPageStats.hasAVclass)           &&
             (this.hasAVstyle            == otherPageStats.hasAVstyle)           &&
             (this.hasAVid               == otherPageStats.hasAVid)              &&
             (this.hasAVtitle            == otherPageStats.hasAVtitle)           &&
             (this.hasAVhref             == otherPageStats.hasAVhref)            &&
             (this.hasAVhreflang         == otherPageStats.hasAVhreflang)        &&
             (this.hasAVsrc              == otherPageStats.hasAVsrc)             &&
             (this.hasAVsrcset           == otherPageStats.hasAVsrcset)          &&
             (this.hasAVsrclang          == otherPageStats.hasAVsrclang)         &&
             (this.hasAVsrcdoc           == otherPageStats.hasAVsrcdoc)          &&
             (this.hasAValt              == otherPageStats.hasAValt)             &&
             (this.hasAVtarget           == otherPageStats.hasAVtarget)          &&
             (this.hasAVwidth            == otherPageStats.hasAVwidth)           &&
             (this.hasAVheight           == otherPageStats.hasAVheight)          &&
             (this.hasAVsize             == otherPageStats.hasAVsize)            &&
             (this.hasAVsizes            == otherPageStats.hasAVsizes)           &&
             (this.hasAVcols             == otherPageStats.hasAVcols)            &&
             (this.hasAVcolspan          == otherPageStats.hasAVcolspan)         &&
             (this.hasAVrows             == otherPageStats.hasAVrows)            &&
             (this.hasAVrowspan          == otherPageStats.hasAVrowspan)         &&
             (this.hasAVwrap             == otherPageStats.hasAVwrap)            &&
             (this.hasAVvalue            == otherPageStats.hasAVvalue)           &&
             (this.hasAVtype             == otherPageStats.hasAVtype)            &&
             (this.hasAVname             == otherPageStats.hasAVname)            &&
             (this.hasAVmin              == otherPageStats.hasAVmin)             &&
             (this.hasAVmax              == otherPageStats.hasAVmax)             &&
             (this.hasAVminlength        == otherPageStats.hasAVminlength)       &&
             (this.hasAVmaxlength        == otherPageStats.hasAVmaxlength)       &&
             (this.hasAVaccept           == otherPageStats.hasAVaccept)          &&
        
        
             (this.numImages             == otherPageStats.numImages)            &&
             (this.numMeta               == otherPageStats.numMeta)              &&
             (this.numLink               == otherPageStats.numLink)              &&
             (this.numInput              == otherPageStats.numInput)             &&
             (this.numEmbed              == otherPageStats.numEmbed)             &&
             (this.numHR                 == otherPageStats.numHR)                &&
             (this.numBR                 == otherPageStats.numBR)                &&
        
        
             (this.numOpenTables         == otherPageStats.numOpenTables)        &&
             (this.numClosedTables       == otherPageStats.numClosedTables)      &&
        
             (this.numOpenAnchors        == otherPageStats.numOpenAnchors)       &&
             (this.numClosedAnchors      == otherPageStats.numClosedAnchors)     &&
        
             (this.numOpenParagraphs     == otherPageStats.numOpenParagraphs)    &&
             (this.numClosedParagraphs   == otherPageStats.numClosedParagraphs)  &&
        
             (this.numOpenDivs           == otherPageStats.numOpenDivs)          &&
             (this.numClosedDivs         == otherPageStats.numClosedDivs)        &&
        
             (this.numOpenSpans          == otherPageStats.numOpenSpans)         &&
             (this.numClosedSpans        == otherPageStats.numClosedSpans)       &&
        
             (this.numOpenScripts        == otherPageStats.numOpenScripts)       &&
             (this.numClosedScripts      == otherPageStats.numClosedScripts)     &&
        
             (this.numOpenStyles         == otherPageStats.numOpenStyles)        &&
             (this.numClosedStyles       == otherPageStats.numClosedStyles)      &&
        
             (this.numOpenFrames         == otherPageStats.numOpenFrames)        &&
             (this.numClosedFrames       == otherPageStats.numClosedFrames)      &&
        
             (this.numOpenIFrames        == otherPageStats.numOpenIFrames)       &&
             (this.numClosedIFrames      == otherPageStats.numClosedIFrames)     &&
        
             (this.numOpenForms          == otherPageStats.numOpenForms)         &&
             (this.numClosedForms        == otherPageStats.numClosedForms);
        
      • hashCode

        🡅  🡇     🗕  🗗  🗖
        public int hashCode()
        Java's hash-code requirement. Notice that this method is not static, and provides the hashCode that was computed for the vectorized-webpage when this instance of PageStats was created. Perhaps the subtlety is noticeable - there is also a public static version of method int hashCode(); Both of them will return the same number, but only one of them actually computes a hash-code (the static-method). This non-static merely retrieves the hash that was created when this instance was built by the constructor.
        Overrides:
        hashCode in class java.lang.Object
        Returns:
        A hash-code that may be used when storing this node in a java sorted-collection.
        Code:
        Exact Method Body:
         return this.hash;
        
      • compareTo

        🡅  🡇     🗕  🗗  🗖
        public int compareTo​(PageStats other)
        Java's interface Comparable<T> requirements. This does a very simple comparison using the underlying field final String str that all HTMLNode's contain.
        Specified by:
        compareTo in interface java.lang.Comparable<PageStats>
        Parameters:
        other - Any other PageStats to be compared to 'this' PageStats
        Returns:
        An integer that fulfills Java's interface Comparable<T> public boolean compareTo(T t) method requirements.
        Code:
        Exact Method Body:
         int compare1 = this.numNodes - other.numNodes;
         if (compare1 != 0) return compare1;
         return this.strLength - other.strLength;
        
      • toB64String

        🡅  🡇     🗕  🗗  🗖
        public java.lang.String toB64String()
        This converts a PageStats object to a simple-string (Base64 Encoded) object that may be passed and transmitted as a String.
        Returns:
        Zipped, Serialized, Base-64 Encoded String version of this object.
        See Also:
        StringParse.objToB64Str(Object)
        Code:
        Exact Method Body:
         try { return StringParse.objToB64Str(this); } catch (Exception e) { return null; }
        
      • fromB64String

        🡅  🡇     🗕  🗗  🗖
        public static PageStats fromB64String​(java.lang.String minimized)
        Convets a Base65 Encoded String into an instance of PageStats
        Parameters:
        minimized - A previously minimized, compressed, Serialized version of this object (PageStats).
        Returns:
        An instance of this class.
        See Also:
        StringParse.b64StrToObj(String)
        Code:
        Exact Method Body:
         try
             { return (PageStats) StringParse.b64StrToObj(minimized); }
        
         catch (Exception e) { return null; }
        
      • clone

        🡅  🡇     🗕  🗗  🗖
        public PageStats clone()
        Generates a carbon copy of passed reference instance 'PageStats'
        Overrides:
        clone in class java.lang.Object
        Returns:
        Returns a 'clone' of this vector. Utilizes 'this' class, protected constructor.
        Code:
        Exact Method Body:
         return new PageStats(this);
        
      • toString

        🡅     🗕  🗗  🗖
        public java.lang.String toString()
        Generates a java string representation of 'this' instance of class PageStats
        Overrides:
        toString in class java.lang.Object
        Returns:
        a java string of all the details encapsulated by a PageStats object reference.
        Code:
        Exact Method Body:
         return
             "strLength            = " + strLength               + '\n' +
             "hash                 = " + hash                    + '\n' +
             "numNodes             = " + numNodes                + '\n' +
             "numTagNodes          = " + numTagNodes             + '\n' +
             "numTextNodes         = " + numTextNodes            + '\n' +
             "numCommentNodes      = " + numCommentNodes         + '\n' +
             "numNewLines          = " + numNewLines             + '\n' +
        
             "\n" +
        
             "hasAVclass           = " + hasAVclass              + "\n" + 
             "hasAVstyle           = " + hasAVstyle              + "\n" + 
             "hasAVid              = " + hasAVid                 + "\n" + 
             "hasAVtitle           = " + hasAVtitle              + "\n" + 
             "hasAVhref            = " + hasAVhref               + "\n" + 
             "hasAVhreflang        = " + hasAVhreflang           + "\n" + 
             "hasAVsrc             = " + hasAVsrc                + "\n" + 
             "hasAVsrcset          = " + hasAVsrcset             + "\n" + 
             "hasAVsrclang         = " + hasAVsrclang            + "\n" + 
             "hasAVsrcdoc          = " + hasAVsrcdoc             + "\n" + 
             "hasAValt             = " + hasAValt                + "\n" + 
             "hasAVtarget          = " + hasAVtarget             + "\n" + 
             "hasAVwidth           = " + hasAVwidth              + "\n" + 
             "hasAVheight          = " + hasAVheight             + "\n" + 
             "hasAVsize            = " + hasAVsize               + "\n" + 
             "hasAVsizes           = " + hasAVsizes              + "\n" + 
             "hasAVcols            = " + hasAVcols               + "\n" + 
             "hasAVcolspan         = " + hasAVcolspan            + "\n" + 
             "hasAVrows            = " + hasAVrows               + "\n" + 
             "hasAVrowspan         = " + hasAVrowspan            + "\n" + 
             "hasAVwrap            = " + hasAVwrap               + "\n" + 
             "hasAVvalue           = " + hasAVvalue              + "\n" + 
             "hasAVtype            = " + hasAVtype               + "\n" + 
             "hasAVname            = " + hasAVname               + "\n" + 
             "hasAVmin             = " + hasAVmin                + "\n" + 
             "hasAVmax             = " + hasAVmax                + "\n" + 
             "hasAVminlength       = " + hasAVminlength          + "\n" + 
             "hasAVmaxlength       = " + hasAVmaxlength          + "\n" + 
             "hasAVaccept          = " + hasAVaccept             + "\n" + 
        
             "\n" +
        
             "numImages            = " + numImages               + '\n' +
             "numMeta              = " + numMeta                 + '\n' +
             "numLink              = " + numLink                 + '\n' +
             "numInput             = " + numInput                + '\n' +
             "numEmbed             = " + numEmbed                + '\n' +
             "numHR                = " + numHR                   + '\n' +
             "numBR                = " + numBR                   + '\n' +
        
             "\n" +
        
             "numOpenTables        = " + numOpenTables           + '\n' +
             "numClosedTables      = " + numClosedTables         + '\n' +
        
             "numOpenAnchors       = " + numOpenAnchors          + '\n' +
             "numClosedAnchors     = " + numClosedAnchors        + '\n' +
        
             "numOpenParagraphs    = " + numOpenParagraphs       + '\n' +
             "numClosedParagraphs  = " + numClosedParagraphs     + '\n' +
        
             "numOpenDivs          = " + numOpenDivs             + '\n' +
             "numClosedDivs        = " + numClosedDivs           + '\n' +
        
             "numOpenSpans         = " + numOpenSpans            + '\n' +
             "numClosedSpans       = " + numClosedSpans          + '\n' +
        
             "numOpenScripts       = " + numOpenScripts          + '\n' +
             "numClosedScripts     = " + numClosedScripts        + '\n' +
        
             "numOpenStyles        = " + numOpenStyles           + '\n' +
             "numClosedStyles      = " + numClosedStyles         + '\n' +
        
             "numOpenFrames        = " + numOpenFrames           + '\n' +
             "numClosedFrames      = " + numClosedFrames         + '\n' +
        
             "numOpenIFrames       = " + numOpenIFrames          + '\n' +
             "numClosedIFrames     = " + numClosedIFrames        + '\n' +
        
             "numOpenForms         = " + numOpenForms            + '\n' +
             "numClosedForms       = " + numClosedForms          + '\n';