From e25f1875505cdde40dfb02a6b6df7c7bd05d75aa Mon Sep 17 00:00:00 2001 From: Takeshi Kurosawa Date: Tue, 29 Jul 2014 08:31:36 +0900 Subject: [PATCH 1/6] Add alt of area[href] and input[type=image] rule --- src/rules/alt-not-empty.js | 34 ++++++++++++++ test/rules/alt-not-empty.js | 94 +++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 src/rules/alt-not-empty.js create mode 100644 test/rules/alt-not-empty.js diff --git a/src/rules/alt-not-empty.js b/src/rules/alt-not-empty.js new file mode 100644 index 000000000..8ea57b504 --- /dev/null +++ b/src/rules/alt-not-empty.js @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2013, Yanis Wang + * Copyright (c) 2014, Takeshi Kurosawa + * MIT Licensed + */ +HTMLHint.addRule({ + id: 'alt-not-empty', + description: 'Alt of input[type=image], area[href] must set value.', + init: function(parser, reporter){ + var self = this; + parser.addListener('tagstart', function(event){ + var tagName = event.tagName.toLowerCase(), + attrs = event.attrs, + attrMap = {}, + attr, + col = event.col + tagName.length + 1, + selector; + if (tagName !== 'area' && tagName !== 'input'){ + return; + } + for(var i=0, l=attrs.length;i + * Copyright (c) 2014, Takeshi Kurosawa + * MIT Licensed + */ + +var expect = require("expect.js"); + +var HTMLHint = require("../../index").HTMLHint; + +var ruldId = 'alt-not-empty', + ruleOptions = {}; + +ruleOptions[ruldId] = true; + +describe('Rules: '+ruldId, function(){ + + /* A tag can have shape and coords attributes and not have alt attribute */ + it('A tag have not alt attribute should not result in an error', function(){ + var code = ''; + var messages = HTMLHint.verify(code, ruleOptions); + expect(messages.length).to.be(0); + }); + + it('Area tag have not href and alt attribute should not result in an error', function(){ + var code = ''; + var messages = HTMLHint.verify(code, ruleOptions); + expect(messages.length).to.be(0); + }); + + it('Area[href] tag have not alt attribute should result in an error', function(){ + var code = ''; + var messages = HTMLHint.verify(code, ruleOptions); + expect(messages.length).to.be(1); + expect(messages[0].rule.id).to.be(ruldId); + expect(messages[0].line).to.be(1); + expect(messages[0].col).to.be(6); + expect(messages[0].type).to.be('warning'); + }); + + it('Area[href] tag have empty alt attribute should result in an error', function(){ + var code = ''; + var messages = HTMLHint.verify(code, ruleOptions); + expect(messages.length).to.be(1); + expect(messages[0].rule.id).to.be(ruldId); + expect(messages[0].line).to.be(1); + expect(messages[0].col).to.be(6); + expect(messages[0].type).to.be('warning'); + }); + + it('Area[href] tag have non emtpy alt attribute should not result in an error', function(){ + var code = 'test'; + var messages = HTMLHint.verify(code, ruleOptions); + expect(messages.length).to.be(0); + }); + + it('Input tag have not type and alt attribute should not result in an error', function(){ + var code = ''; + var messages = HTMLHint.verify(code, ruleOptions); + expect(messages.length).to.be(0); + }); + + it('Input[type="text"] tag have not alt attribute should not result in an error', function(){ + var code = ''; + var messages = HTMLHint.verify(code, ruleOptions); + expect(messages.length).to.be(0); + }); + + it('Input[type="image"] tag have not alt attribute should result in an error', function(){ + var code = ''; + var messages = HTMLHint.verify(code, ruleOptions); + expect(messages.length).to.be(1); + expect(messages[0].rule.id).to.be(ruldId); + expect(messages[0].line).to.be(1); + expect(messages[0].col).to.be(7); + expect(messages[0].type).to.be('warning'); + }); + + it('Input[type="image"] tag have empty alt attribute should result in an error', function(){ + var code = ''; + var messages = HTMLHint.verify(code, ruleOptions); + expect(messages.length).to.be(1); + expect(messages[0].rule.id).to.be(ruldId); + expect(messages[0].line).to.be(1); + expect(messages[0].col).to.be(7); + expect(messages[0].type).to.be('warning'); + }); + + it('Input[type="image"] tag have non emtpy alt attribute should not result in an error', function(){ + var code = ''; + var messages = HTMLHint.verify(code, ruleOptions); + expect(messages.length).to.be(0); + }); +}); \ No newline at end of file From 0090a35a8b4a33303282a211fb41770d0f32ec53 Mon Sep 17 00:00:00 2001 From: Takeshi Kurosawa Date: Tue, 29 Jul 2014 08:44:13 +0900 Subject: [PATCH 2/6] Fixed message --- src/rules/alt-not-empty.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rules/alt-not-empty.js b/src/rules/alt-not-empty.js index 8ea57b504..bd435494f 100644 --- a/src/rules/alt-not-empty.js +++ b/src/rules/alt-not-empty.js @@ -5,7 +5,7 @@ */ HTMLHint.addRule({ id: 'alt-not-empty', - description: 'Alt of input[type=image], area[href] must set value.', + description: 'Alt of area[href] and input[type=image] must set value.', init: function(parser, reporter){ var self = this; parser.addListener('tagstart', function(event){ @@ -26,7 +26,7 @@ HTMLHint.addRule({ (tagName === 'input' && attrMap['type'] === 'image')) { selector = tagName === 'area' ? 'area[href]' : 'input[type=image]'; if (!('alt' in attrMap) || attrMap['alt'] === '') { - reporter.warn('Alt of ' + tagName + ' must be set value.', event.line, col, self, event.raw); + reporter.warn('Alt of ' + selector + ' must be set value.', event.line, col, self, event.raw); } } }); From c0fb8fe5e12594e826afee3c390b4806720d9f36 Mon Sep 17 00:00:00 2001 From: Takeshi Kurosawa Date: Tue, 29 Jul 2014 08:52:19 +0900 Subject: [PATCH 3/6] Fix nits --- src/rules/alt-not-empty.js | 4 ++-- test/rules/alt-not-empty.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/rules/alt-not-empty.js b/src/rules/alt-not-empty.js index bd435494f..48af4f873 100644 --- a/src/rules/alt-not-empty.js +++ b/src/rules/alt-not-empty.js @@ -24,11 +24,11 @@ HTMLHint.addRule({ } if ((tagName === 'area' && 'href' in attrMap) || (tagName === 'input' && attrMap['type'] === 'image')) { - selector = tagName === 'area' ? 'area[href]' : 'input[type=image]'; if (!('alt' in attrMap) || attrMap['alt'] === '') { + selector = tagName === 'area' ? 'area[href]' : 'input[type=image]'; reporter.warn('Alt of ' + selector + ' must be set value.', event.line, col, self, event.raw); } } }); } -}); \ No newline at end of file +}); diff --git a/test/rules/alt-not-empty.js b/test/rules/alt-not-empty.js index e3173580d..2ce6c6bb4 100644 --- a/test/rules/alt-not-empty.js +++ b/test/rules/alt-not-empty.js @@ -91,4 +91,4 @@ describe('Rules: '+ruldId, function(){ var messages = HTMLHint.verify(code, ruleOptions); expect(messages.length).to.be(0); }); -}); \ No newline at end of file +}); From dfb166fef58d61f7a2649bd9efabdd1cb155e6a9 Mon Sep 17 00:00:00 2001 From: Takeshi Kurosawa Date: Tue, 29 Jul 2014 21:05:47 +0900 Subject: [PATCH 4/6] Use parser.getMapAttrs instead of using custom for loop --- src/rules/alt-not-empty.js | 14 ++++---------- test/rules/alt-not-empty.js | 4 ++-- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/rules/alt-not-empty.js b/src/rules/alt-not-empty.js index 48af4f873..2bdfddaab 100644 --- a/src/rules/alt-not-empty.js +++ b/src/rules/alt-not-empty.js @@ -10,21 +10,15 @@ HTMLHint.addRule({ var self = this; parser.addListener('tagstart', function(event){ var tagName = event.tagName.toLowerCase(), - attrs = event.attrs, - attrMap = {}, - attr, + mapAttrs = parser.getMapAttrs(event.attrs), col = event.col + tagName.length + 1, selector; if (tagName !== 'area' && tagName !== 'input'){ return; } - for(var i=0, l=attrs.length;i Date: Tue, 29 Jul 2014 21:24:55 +0900 Subject: [PATCH 5/6] Add support alt of img and remove previous rule --- .../{alt-not-empty.js => alt-require.js} | 14 +++---- src/rules/img-alt-require.js | 26 ------------- .../{alt-not-empty.js => alt-require.js} | 24 +++++++++++- test/rules/img-alt-require.spec.js | 39 ------------------- 4 files changed, 30 insertions(+), 73 deletions(-) rename src/rules/{alt-not-empty.js => alt-require.js} (65%) delete mode 100644 src/rules/img-alt-require.js rename test/rules/{alt-not-empty.js => alt-require.js} (78%) delete mode 100644 test/rules/img-alt-require.spec.js diff --git a/src/rules/alt-not-empty.js b/src/rules/alt-require.js similarity index 65% rename from src/rules/alt-not-empty.js rename to src/rules/alt-require.js index 2bdfddaab..4f26a4066 100644 --- a/src/rules/alt-not-empty.js +++ b/src/rules/alt-require.js @@ -4,8 +4,8 @@ * MIT Licensed */ HTMLHint.addRule({ - id: 'alt-not-empty', - description: 'Alt of area[href] and input[type=image] must set value.', + id: 'alt-require', + description: 'Alt of img must be present and alt of area[href] and input[type=image] must be set value.', init: function(parser, reporter){ var self = this; parser.addListener('tagstart', function(event){ @@ -13,12 +13,12 @@ HTMLHint.addRule({ mapAttrs = parser.getMapAttrs(event.attrs), col = event.col + tagName.length + 1, selector; - if (tagName !== 'area' && tagName !== 'input'){ - return; + if(tagName === 'img' && !('alt' in mapAttrs)){ + reporter.warn('Alt of img tag must be present.', event.line, col, self, event.raw); } - if ((tagName === 'area' && 'href' in mapAttrs) || - (tagName === 'input' && mapAttrs['type'] === 'image')) { - if (!('alt' in mapAttrs) || mapAttrs['alt'] === '') { + else if((tagName === 'area' && 'href' in mapAttrs) || + (tagName === 'input' && mapAttrs['type'] === 'image')){ + if(!('alt' in mapAttrs) || mapAttrs['alt'] === ''){ selector = tagName === 'area' ? 'area[href]' : 'input[type=image]'; reporter.warn('Alt of ' + selector + ' must be set value.', event.line, col, self, event.raw); } diff --git a/src/rules/img-alt-require.js b/src/rules/img-alt-require.js deleted file mode 100644 index 8337ecefb..000000000 --- a/src/rules/img-alt-require.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2013, Yanis Wang - * MIT Licensed - */ -HTMLHint.addRule({ - id: 'img-alt-require', - description: 'Alt of img tag must be set value.', - init: function(parser, reporter){ - var self = this; - parser.addListener('tagstart', function(event){ - if(event.tagName.toLowerCase() === 'img'){ - var attrs = event.attrs; - var haveAlt = false; - for(var i=0, l=attrs.length;i - * MIT Licensed - */ - -var expect = require("expect.js"); - -var HTMLHint = require("../../index").HTMLHint; - -var ruldId = 'img-alt-require', - ruleOptions = {}; - -ruleOptions[ruldId] = true; - -describe('Rules: '+ruldId, function(){ - - it('Img tag have not alt attr should result in an error', function(){ - var code = ''; - var messages = HTMLHint.verify(code, ruleOptions); - expect(messages.length).to.be(1); - expect(messages[0].rule.id).to.be(ruldId); - expect(messages[0].line).to.be(1); - expect(messages[0].col).to.be(1); - expect(messages[0].type).to.be('warning'); - }); - - it('Img tag have alt attr should not result in an error', function(){ - var code = 'test'; - var messages = HTMLHint.verify(code, ruleOptions); - expect(messages.length).to.be(0); - }); - - it('Img tag have empty alt attr should not result in an error', function(){ - var code = ''; - var messages = HTMLHint.verify(code, ruleOptions); - expect(messages.length).to.be(0); - }); - -}); \ No newline at end of file From 649458e575c951e7d9f05b714de5f696cc217d91 Mon Sep 17 00:00:00 2001 From: Takeshi Kurosawa Date: Tue, 29 Jul 2014 21:34:38 +0900 Subject: [PATCH 6/6] Fixed test failures (core-spec.js) --- test/core-spec.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/core-spec.js b/test/core-spec.js index d63cf823b..5ee960a68 100644 --- a/test/core-spec.js +++ b/test/core-spec.js @@ -12,7 +12,7 @@ describe('Core', function(){ it('Set false to rule no effected should result in an error', function(){ var code = ''; var messages = HTMLHint.verify(code, { - 'img-alt-require': false + 'alt-require': false }); expect(messages.length).to.be(0); }); @@ -30,18 +30,18 @@ describe('Core', function(){ }); it('Inline ruleset not worked should result in an error', function(){ - var code = '\r\n'; + var code = '\r\n'; var messages = HTMLHint.verify(code, { - 'img-alt-require': false + 'alt-require': false }); expect(messages.length).to.be(1); - expect(messages[0].rule.id).to.be('img-alt-require'); + expect(messages[0].rule.id).to.be('alt-require'); expect(messages[0].line).to.be(2); - expect(messages[0].col).to.be(1); + expect(messages[0].col).to.be(5); - code = '\r\n'; + code = '\r\n'; messages = HTMLHint.verify(code, { - 'img-alt-require': true + 'alt-require': true }); expect(messages.length).to.be(0); });