htmllint
Version:
An unofficial html5 linter.
54 lines (41 loc) • 1.43 kB
JavaScript
var Issue = require('../issue');
module.exports = {
name: 'focusable-tabindex-style',
on: ['tag'],
filter: ['a', 'area', 'button', 'input', 'img', 'select', 'textarea'],
desc: [
'If set, all focusable elements',
'(`a`, `area`, `button`, `input`, `img`, `select`, `textarea`)',
'must have a positive `tabindex` attribute, if any.',
'',
'Reasoning: [IITAA, 10.3 and 10.4](http://www.dhs.state.il.us/IITAA/IITAAWebImplementationGuidelines.html)'
].join('\n'),
detectedStyle: null
};
module.exports.end = function () {
this.detectedStyle = null;
};
module.exports.lint = function (element, opts) {
if (this.isDisabled(element)) {
return [];
}
var tabIndexStyle = this.getTabIndexStyle(element);
if (this.detectedStyle !== null &&
this.detectedStyle !== tabIndexStyle) {
var msg = tabIndexStyle ? 'remove the tabindex'
: 'add a positive tabindex';
return new Issue('E026', element.openLineCol, {op: msg});
}
this.detectedStyle = tabIndexStyle;
return [];
};
module.exports.isDisabled = function (element) {
return element.attribs && element.attribs.hasOwnProperty('disabled');
};
module.exports.getTabIndexStyle = function (element) {
var a = element.attribs;
if (a && a.hasOwnProperty('tabindex') && typeof a !== 'undefined') {
return a.tabindex.value > 0;
}
return false;
};