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;