axe-core
Version:
Accessibility engine for automated Web UI testing
72 lines (64 loc) • 1.84 kB
JavaScript
import {
accessibleText,
isHumanInterpretable,
visibleTextNodes,
isIconLigature,
sanitize,
removeUnicode
} from '../../commons/text';
/**
* Check if a given text exists in another
*
* @param {String} compare given text to check
* @param {String} compareWith text against which to be compared
* @returns {Boolean}
*/
function isStringContained(compare, compareWith) {
const curatedCompareWith = curateString(compareWith);
const curatedCompare = curateString(compare);
if (!curatedCompareWith || !curatedCompare) {
return false;
}
return curatedCompareWith.includes(curatedCompare);
}
/**
* Curate given text, by removing emoji's, punctuations, unicode and trim whitespace.
*
* @param {String} str given text to curate
* @returns {String}
*/
function curateString(str) {
const noUnicodeStr = removeUnicode(str, {
emoji: true,
nonBmp: true,
punctuations: true
});
return sanitize(noUnicodeStr);
}
function labelContentNameMismatchEvaluate(node, options, virtualNode) {
const { pixelThreshold, occuranceThreshold } = options || {};
const accText = accessibleText(node).toLowerCase();
if (isHumanInterpretable(accText) < 1) {
return undefined;
}
const textVNodes = visibleTextNodes(virtualNode);
const nonLigatureText = textVNodes
.filter(
textVNode =>
!isIconLigature(textVNode, pixelThreshold, occuranceThreshold)
)
.map(textVNode => textVNode.actualNode.nodeValue)
.join('');
const visibleText = sanitize(nonLigatureText).toLowerCase();
if (!visibleText) {
return true;
}
if (isHumanInterpretable(visibleText) < 1) {
if (isStringContained(visibleText, accText)) {
return true;
}
return undefined;
}
return isStringContained(visibleText, accText);
}
export default labelContentNameMismatchEvaluate;