Revision history HTML::Lint and Test::HTML::Lint.

NOTE: All bugs and requests are now being handled through GitHub.

Please DO NOT send bug reports to

2.32    Fri Jun 22 15:57:39 CDT 2018

Note that this very well may be the final release of HTML::Lint that I
make. I've been spending my time on HTML::Tidy5, which works on HTML5,
checks for more problems, and is much faster. If you're interested in
maintaining HTML::Lint, send me email at  I'm not
sure I want to hand it off to anyone yet, but we can discuss.

    Allow "weblint -" to read from STDIN.  Thanks, Frank Dana.

2.30    Sun Jan  7 22:02:25 CST 2018
    No changes since 2.27_03.

2.27_03 Wed Jan  3 17:07:07 CST 2018
    Removed the text-invalid-entity and attr-invalid-entity, which were
    for entities that had an invalid numeric value, anything greater
    than &#65536.  There is no longer a restriction on the numeric values
    of HTML entities. (GH#60)

2.27_02 Wed Dec 27 11:46:28 CST 2017
    There are be no functionality changes since 2.27_01.

    Many Perl::Critic cleanups.

2.27_01 Fri Dec 22 15:54:32 CST 2017
    Adds checking of entities in attributes, not just text.  Thanks,
    Klaus S. Madsen.

    Calling ->parsefile() would generate an error.  Thanks, Shlomi
    Fish. (GH#58)

    Prepare for perl 5.26.0 which removes '.' from @INC.  Thanks,
    Jim Keenan.

    Fix disttest target.  Thanks, Shlomi Fish.

2.26    Thu Dec 29 22:36:54 CST 2016
    Stable release.  No changes from previous release.

2.25_02 Tue Dec 27 14:34:22 CST 2016
    html_fragment_ok() was not properly excluding document-level errors.
    It was effectively the same as html_ok().

2.25_01 Fri Dec 23 22:36:17 CST 2016
    Added two new types of errors to let you know you're using the
    API incorrectly.  You should be parsing files like this:

        my $lint = HTML::Lint->new;
        $lint->newfile( $filename );
        $lint->parse( $line );
        my @errors = $lint->errors();

    If you neglect to call ->parse or ->eof, you'll get an error returned
    in the list of errors from ->errors().

    Test::HTML::Lint::html_fragment_ok() was not properly calling ->eof.

2.24    Wed Dec  7 22:20:13 CST 2016
    Official release.  No changes from 2.23_01.

2.23_01 Tue Dec  6 22:48:56 CST 2016
    Added detection of unknown HTML entities, like "known &unclosed
    &entities are not found".  Also fixes the case where HTML::Lint
    gets confused by an entity like "²" which it thought was an
    unterminated "⊃" entity.  Thanks, Klaus S. Madsen.

    Errors of the type doc-tag-required did not come out in any defined
    order.  They are now sorted by tag name.  This was discovered
    because hash randomization caused tests to fail on Perl 5.18 and
    above. Thanks, Slaven Rezic, Andrew Main and Lisa Hare.

    Handle some warnings that get thrown if certain values are undef.
    Thanks, Yves Lavoie.

    Handle characters that are not handled by HTML::Entities. (GitHub
    issue #13) Thanks, Tim Landscheidt.

    Add a test to verify a fixed bug. Thanks to Lance Wicks as part of
    the CPAN Pull Request Challenge.

2.22    Mon Apr  6 15:47:11 CDT 2015
    Previously, html_ok() would not check the entire structure of a web
    page to check for <html>, <head>, <title> and <body> tags.  Now it
    will.  If you want to check fragments of HTML for validity but know
    that they are not valid HTML documents on their own, use the new

    Added new error, elem-input-alt-missing, that warns of <input
    type="image"> tags that are missing an alt="" attribute.  This helps
    for accessability to make sure that any images have alternate text
    for screen readers.

    Added ability to modify HTML::Lint's table of known tags and
    attributes, so you could do this:

        # Add an attribute that your company uses.
        HTML::Lint::HTML4::add_attribute( 'body', 'proprietary-attribute' );

        # Add the HTML 5 <canvas> tag.
        HTML::Lint::HTML4::add_tag( 'canvas' );
        HTML::Lint::HTML4::add_attribute( 'canvas', $_ ) for qw( height width );

    Test::HTML::Lint::html_ok() would not call the HTML::Lint eof()
    method, which meant it wouldn't do document-wide tests.

2.20    Fri Apr  6 00:49:51 CDT 2012
    Sometimes creating HTML::Lint-compliant HTML just isn't possible.
    Now, you can now turn individual errors on and off in your HTML
    via comment directives, like so:

        <!-- html-lint elem-img-sizes-missing: off, attr-unknown: off -->

    And if you have a batch of code that's hopeless:

        <!-- html-lint all: off -->

    Added check for unknown entities, such as "&foo;".

    Added check for unclosed entitities, such as "&amp" without the
    closing semicolon.

    Added a check for a bare ampersand that should be written as &amp;

2.10    Tue Dec  6 11:16:16 CST 2011
    Tags that were self-closed were being ignored.  For example, if you had

        <img src="blah.jpg" />

    then HTML::Lint would ignore the tag.  This has been fixed.

    HTML::Lint is now explicitly licensed under Artistic License 2.0,
    instead of the vague "same terms as Perl itself."

2.06    Thu Dec 18 00:07:54 CST 2008
    Added attributes to <frameset>.

    <strong> tag didn't allow any attributes.  Now it does.

    Removed the <listing> tag.

2.04    Mon Jun  2 11:41:16 CDT 2008
    <textarea> now knows about the wrap attribute.

    Lots of enhancements pointed out by Perl::Critic.

2.02    Thu Nov  3 11:49:18 CST 2005
    * The warnings for missing ALT and HEIGHT/WIDTH on your images
        now give the SRC attribute.

2.00    Tue Sep 20 23:10:39 CDT 2005
    * I've changed the object structure.  HTML::Lint now has-a
        HTML::Parser, and no longer is-a HTML::Parser.

    * weblint-cgi and weblint-original are no longer distributed
        with HTML::Lint.

    * Now requires Perl 5.6.0.

    * Line numbering is now correct if you parse more than one file.

    * Changed t/*.*.t so that they only had one period in the
        filename. Apparently VMS doesn't like filenames with multiple

    I've thrown away previous history because really, nobody cares
    what changed in this module prior to 2005.