d2-ui
Version:
77 lines (55 loc) • 2.59 kB
JavaScript
/**
* @fileoverview Enforce img alt attribute does not have the word image, picture, or photo.
* @author Ethan Cohen
*/
;
// ----------------------------------------------------------------------------
// Rule Definition
// ----------------------------------------------------------------------------
var _getAttribute = require('../util/getAttribute');
var _getAttribute2 = _interopRequireDefault(_getAttribute);
var _getAttributeValue = require('../util/getAttributeValue');
var _getAttributeValue2 = _interopRequireDefault(_getAttributeValue);
var _isHiddenFromScreenReader = require('../util/isHiddenFromScreenReader');
var _isHiddenFromScreenReader2 = _interopRequireDefault(_isHiddenFromScreenReader);
var _getNodeType = require('../util/getNodeType');
var _getNodeType2 = _interopRequireDefault(_getNodeType);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var REDUNDANT_WORDS = ['image', 'photo', 'picture'];
var errorMessage = 'Redundant alt attribute. Screen-readers already announce `img` tags as an image. ' + 'You don\'t need to use the words `image`, `photo,` or `picture` in the alt prop.';
var validTypes = ['LITERAL', 'TEMPLATELITERAL'];
module.exports = function (context) {
return {
JSXOpeningElement: function JSXOpeningElement(node) {
var type = (0, _getNodeType2.default)(node);
if (type !== 'img') {
return;
}
var altProp = (0, _getAttribute2.default)(node.attributes, 'alt');
// Return if alt prop is not present.
if (altProp === undefined) {
return;
}
// Only check literals, as we should not enforce variable names :P
var normalizedType = altProp.value && altProp.value.type.toUpperCase() === 'JSXEXPRESSIONCONTAINER' ? altProp.value.expression.type.toUpperCase() : altProp.value.type.toUpperCase();
if (validTypes.indexOf(normalizedType) === -1) {
return;
}
var value = (0, _getAttributeValue2.default)(altProp);
var isVisible = (0, _isHiddenFromScreenReader2.default)(type, node.attributes) === false;
if (Boolean(value) && typeof value === 'string' && isVisible) {
var hasRedundancy = REDUNDANT_WORDS.some(function (word) {
return Boolean(value.match(new RegExp('(?!{)' + word + '(?!})', 'gi')));
});
if (hasRedundancy === true) {
context.report({
node: node,
message: errorMessage
});
}
return;
}
}
};
};
module.exports.schema = [{ type: 'object' }];