Grunt plugin for HTML validation, using the vnu.jar markup checker.
This fork publishes a new grunt-html-dev
NPM module, which depends on vnu-jar@next
instead of the latest release of vnu-jar
. The W3C Markup Validation Service uses the development version of vnu-jar
too. If you want to get consistent results from on-line and off-line testing, you should use grunt-html-dev
instead of grunt-html
in your project.
Install this grunt plugin next to your project's Gruntfile.js with:
npm install grunt-html-dev --save-dev
Then add this line to your project's Gruntfile.js
:
grunt.loadNpmTasks('grunt-html-dev');
Then specify what files to validate in your config:
grunt.initConfig({
htmllint: {
all: ['demos/**/*.html', 'tests/**/*.html']
}
});
For fast validation, keep that in a single group, as the validator initialization takes a few seconds.
When combined with a watching task (such as grunt-contrib-watch), even faster validation can be achieved by starting the validator in client mode and connecting to an already-running instance of the validator in server mode. This removes the time required by repeated initializations. See the server
option below.
- Type:
Array
,String
, orRegExp
- Default:
null
Use this to specify the error message(s) to ignore. For example:
all: {
options: {
ignore: 'The “clear” attribute on the “br” element is obsolete. Use CSS instead.'
},
src: 'html4.html'
}
The ignore
option also supports regular expressions. For example, to ignore AngularJS directive attributes:
all: {
options: {
ignore: /attribute “ng-[a-z-]+” not allowed/
},
src: 'app.html'
}
- Type:
Object
,Function
, or a falsy value - Default:
false
When server
is set to a falsy value, the validator is invoked using java -jar
, which can be considered normal operation.
Set server
to an object to start the validator in client mode and connect to an already-running instance of the validator in server mode.
To start the validator in server mode, use java -cp "path/to/vnu.jar" nu.validator.servlet.Main <port>
.
all: {
options: {
// connect to a validator instance running in server mode on localhost:8888
server: {}
},
src: 'app.html'
}
The server
object also accepts the host
and port
keys, specifying the location of the server.
all: {
options: {
server: {
// your team's local dev tool machine, for example
host: '192.168.0.5',
port: 8877
}
},
src: 'app.html'
}
The following configuration in Gruntfile.js uses grunt-vnuserver to start the validator in server mode and sets up a watch task to run htmllint
every time the source file changes.
By starting the validator in server mode once using the vnuserver
task, validations by htmllint
can be performed much faster by simply connecting to this already-running server.
module.exports = function (grunt) {
grunt.initConfig({
vnuserver: {
},
htmllint: {
all: {
options: {
server: {}
},
src: 'app.html'
}
},
watch: {
all: {
tasks: ['htmllint'],
files: 'app.html'
}
}
});
grunt.loadNpmTasks('grunt-vnuserver');
grunt.loadNpmTasks('grunt-html-dev');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.registerTask('default', ['vnuserver', 'watch']);
};
If the port of the validator in server mode becomes know first during the grunt execution, you will not be able to write a specific port to the server
option of the htmllint
task. Set server
to a function, which would return the object. The function will be evaluated by the htmllint
task first during its execution, which will geve some other code enough time to obtain the actual port of the validator in server mode. For example:
module.exports = function (grunt) {
var vnuPort;
grunt.initConfig({
vnuserver: {
// Name the task to be able to listen to its events.
server: {
// Start with the first free ephemeral port.
port: 49152,
// Try other ports, up to port + 30, if the first one is not free.
useAvailablePort: true
}
},
htmllint: {
options: {
// Connect to the vnu server on the dynamically chosen port.
server: function () {
return {
port: vnuPort
};
}
},
all: {
src: "app.html"
}
},
watch: {
all: {
tasks: ['htmllint'],
files: "app.html"
}
},
});
grunt.loadNpmTasks('grunt-vnuserver');
grunt.loadNpmTasks('grunt-html');
grunt.loadNpmTasks('grunt-contrib-watch');
// Obtain the port, which the vnu server is listening to.
grunt.event.on('vnuserver.server.listening', function (port) {
vnuPort = port;
});
grunt.registerTask('default', ['vnuserver', 'watch']);
};
- Type:
Array
- Default:
'info','warning','error'
Set errorlevels
to control which error types are returned from the validator. Ignores all other returned types.
- Type:
Boolean
- Default:
false
Set force
to true
to report errors but not fail the grunt
task.
- Type:
String
- Default:
null
Allows you to modify the output format. By default, this plugin will use a built-in Grunt reporter. Set the path to your own custom reporter or to one of the provided reporters: checkstyle
, junit
or json
.
- Type:
String
- Default:
null
Specify a filepath to output the results of a reporter. If reporterOutput
is specified then all output will be written to the given filepath rather than printed to stdout
.
- Type:
Boolean
- Default:
false
Set absoluteFilePathsForReporter
to true
to use absolute file paths in generated reports.
- Type:
Boolean
- Default:
false
Set noLangDetect
to true
to skip the checking of the language of the page.
Since vnu.jar requires Java 8 environment, you might have trouble setting Travis CI to work with grunt-html. In that case see this patch and the Travis CI doc page.
Copyright Jörn Zaefferer.
Licensed under the MIT license.