HTML Linter
===========

.. image:: https://badge.fury.io/py/html-linter.png
    :target: http://badge.fury.io/py/html-linter

.. image:: https://travis-ci.org/deezer/html-linter.png?branch=master
    :target: https://travis-ci.org/deezer/html-linter

.. image:: https://coveralls.io/repos/deezer/html-linter/badge.png?branch=master
    :target: https://coveralls.io/r/deezer/html-linter?branch=master


HTML Linter is an HTML5 linter that follows the style guide defined by Google.

Motivation
----------

Handling HTML5 files generated by lots of different of people is a difficult
task, because the standard is evolving quite fast and also because browsers are
quite open to accept any malformed/invalid/incomplete input.

That's why we decided to have an automated tool to check our coding standard.

We start with the
`Google standard <https://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml>`_
and we enhance it with some extra rules deinfed by the project
`html-minifier <https://github.com/kangax/html-minifier>`_. You can read his
detailed `article <http://perfectionkills.com/experimenting-with-html-minifier/#remove_redundant_attributes>`_.

The list of extra rules we added are:

* Boolean attributes should not have an explicit value.
* Do not use the name attribute in a tags.
* Do not use the language attribute in script tags.
* Do not use the charset attribute in script tags when there is no source.
* Javascript:void(0) links are evil.
* onclick='javascript: ...' is not required. This will raise also a Concerns Separation error.
* meta http-equiv: use only standard properties + X-UA-compatible
* No extra whitespaces between attributes or before the opening or closing tag.

What is missing?
----------------

Check if the file has BOM.

The abbility to validate the HTML using the tool
`HTML5 tidy <https://w3c.github.io/tidy-html5/>`_ and to integrate some
schema.org or microdata validator.

However, we do not have any short terms plans to handle the latter, due to a
couple of reasons:

* Tidy can be easily integrated using the tool `git-lint <https://github.com/sk-/git-lint>`_
* Any other validator can also be integrated with `git-lint <https://github.com/sk-/git-lint>`_
* Adding any extra validator would pull many more dependencies and change the scope.

Limitations
-----------

html_linter used the project
`template-remover <https://github.com/deezer/template-remover>`_ to remove the
PHP and Jinja markup from the files and this project works has some limitations.


One example that won't work is the following:::

  <?php echo "?>" ?>

The reason it does not work is because when the method sees the first '?>'
(the one inside the string), it thinks it's a closing tag.


Example use
-----------

Below are example of how template_remover.py is used::

  $ html_lint.py filename.html


Installation
------------

You can install, upgrade or uninstall git-lint with these commands::

  $ pip install html-linter
  $ pip install --upgrade html-linter
  $ pip uninstall html-linter

Python Versions
---------------

Python 2.7, 3.2 and 3.3 are officially supported.

Development
-----------

Help for this project is more than welcomed, so feel free to create an issue or
to send a pull request via http://github.com/deezer/html-linter.

Tests are run using nose, either with::

  $ python -R setup.py nosetests
  $ nosetests

Use the tool `git-lint <https://github.com/sk-/git-lint>`_ before any commit, so
errors and style problems are caught early.

TODOS and Possible Features
---------------------------

* Make the output less verbose.
* Integrate with HTML5 tidy.
* Integrate with a schema.org/micrdata validator.


Changelog
=========

v0.1 (2014-05-07)
-------------------

* Initial commit.