UNPKG

d2-ui

Version:
77 lines (55 loc) 2.59 kB
/** * @fileoverview Enforce img alt attribute does not have the word image, picture, or photo. * @author Ethan Cohen */ 'use strict'; // ---------------------------------------------------------------------------- // 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' }];