We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
anchor-ambiguous-text
1 parent 8b889bf commit bbae2c4Copy full SHA for bbae2c4
4 files changed
__tests__/src/rules/anchor-ambiguous-text-test.js
@@ -75,6 +75,13 @@ ruleTester.run('anchor-ambiguous-text', rule, {
75
{ code: '<a>HERE</a>;', errors: [expectedError] },
76
{ code: '<a>click here</a>;', errors: [expectedError] },
77
{ code: '<a>learn more</a>;', errors: [expectedError] },
78
+ { code: '<a>learn more</a>;', errors: [expectedError] },
79
+ { code: '<a>learn more.</a>;', errors: [expectedError] },
80
+ { code: '<a>learn more?</a>;', errors: [expectedError] },
81
+ { code: '<a>learn more,</a>;', errors: [expectedError] },
82
+ { code: '<a>learn more!</a>;', errors: [expectedError] },
83
+ { code: '<a>learn more;</a>;', errors: [expectedError] },
84
+ { code: '<a>learn more:</a>;', errors: [expectedError] },
85
{ code: '<a>link</a>;', errors: [expectedError] },
86
{ code: '<a>a link</a>;', errors: [expectedError] },
87
{ code: '<a aria-label="click here">something</a>;', errors: [expectedError] },
__tests__/src/util/getAccessibleChildText-test.js
@@ -64,6 +64,30 @@ describe('getAccessibleChildText', () => {
64
), elementType)).toBe('bar');
65
});
66
67
+ it('returns trimmed literal value for JSXText child', () => {
68
+ expect(getAccessibleChildText(JSXElementMock(
69
+ 'a',
70
+ [],
71
+ [{ type: 'Literal', value: ' bar ' }],
72
+ ), elementType)).toBe('bar');
73
+ });
74
+
+ it('returns space-collapsed literal value for JSXText child', () => {
+ [{ type: 'Literal', value: 'foo bar' }],
+ ), elementType)).toBe('foo bar');
+ it('returns punctuation-stripped literal value for JSXText child', () => {
+ [{ type: 'Literal', value: 'foo, bar. baz? foo; bar:' }],
88
+ ), elementType)).toBe('foo bar baz foo bar');
89
90
91
it('returns recursive value for JSXElement child', () => {
92
expect(getAccessibleChildText(JSXElementMock(
93
'a',
docs/rules/anchor-ambiguous-text.md
@@ -30,7 +30,7 @@ The logic to calculate the inner text of an anchor is as follows:
30
31
Note that this rule still disallows ambiguous `aria-label` or `alt` values.
32
33
-Note that this rule is case-insensitive and trims whitespace. It only looks for **exact matches**.
+Note that this rule is case-insensitive, trims whitespace, and ignores certain punctuation (`[,.?¿!‽¡;:]`). It only looks for **exact matches**.
34
35
### Succeed
36
```jsx
@@ -43,8 +43,15 @@ Note that this rule is case-insensitive and trims whitespace. It only looks for
43
44
<a>here</a>
45
<a>HERE</a>
46
-<a>click here</a>
47
<a>link</a>
+<a>click here</a>
48
+<a>learn more</a>
49
+<a>learn more.</a>
50
+<a>learn more,</a>
51
+<a>learn more?</a>
52
+<a>learn more!</a>
53
+<a>learn more:</a>
54
+<a>learn more;</a>
55
<a>a link</a>
56
<a> a link </a>
57
<a><span> click </span> here</a> // goes through element children
src/util/getAccessibleChildText.js
@@ -10,10 +10,14 @@ import isHiddenFromScreenReader from './isHiddenFromScreenReader';
10
* Returns a new "standardized" string: all whitespace is collapsed to one space,
11
* and the string is lowercase
12
* @param {string} input
13
- * @returns lowercase, single-spaced, trimmed string
+ * @returns lowercase, single-spaced, punctuation-stripped, trimmed string
14
*/
15
function standardizeSpaceAndCase(input: string): string {
16
- return input.trim().replace(/\s\s+/g, ' ').toLowerCase();
+ return input
17
+ .trim()
18
+ .replace(/[,.?¿!‽¡;:]/g, '') // strip punctuation
19
+ .replace(/\s\s+/g, ' ') // collapse spaces
20
+ .toLowerCase();
21
}
22
23
/**
0 commit comments