Skip to content

Commit be03f35

Browse files
author
Adrián Bolonio
authored
Add new linter rule: LinkHasHref
1 parent 959dc15 commit be03f35

File tree

4 files changed

+83
-0
lines changed

4 files changed

+83
-0
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ linters:
3131
enabled: true
3232
GitHub::Accessibility::ImageHasAlt:
3333
enabled: true
34+
GitHub::Accessibility::LinkHasHref:
35+
enabled: true
3436
GitHub::Accessibility::NoAriaLabelMisuseCounter:
3537
enabled: true
3638
GitHub::Accessibility::NoPositiveTabIndex:
@@ -47,6 +49,7 @@ linters:
4749
- [GitHub::Accessibility::AvoidGenericLinkTextCounter](./docs/rules/accessibility/avoid-generic-link-text-counter.md)
4850
- [GitHub::Accessibility::IframeHasTitle](./docs/rules/accessibility/iframe-has-title.md)
4951
- [GitHub::Accessibility::ImageHasAlt](./docs/rules/accessibility/image-has-alt.md)
52+
- [GitHub::Accessibility::LinkHasHref](./docs/rules/accessibility/link_has_href.md)
5053
- [GitHub::Accessibility::NoAriaLabelMisuseCounter](./docs/rules/accessibility/no-aria-label-misuse-counter.md)
5154
- [GitHub::Accessibility::NoPositiveTabIndex](./docs/rules/accessibility/no-positive-tab-index.md)
5255
- [GitHub::Accessibility::NoRedundantImageAlt](./docs/rules/accessibility/no-redundant-image-alt.md)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Link Has Href
2+
3+
## Rule Details
4+
5+
Links should go somewhere, you probably want to use a `<button>` instead.
6+
7+
## Resources
8+
9+
- [`<a>`: The Anchor element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a)
10+
- [Primer: Links](https://primer.style/design/accessibility/links)
11+
12+
## Examples
13+
### **Incorrect** code for this rule 👎
14+
15+
```erb
16+
<!-- incorrect -->
17+
<a>Go to GitHub</a>
18+
```
19+
20+
### **Correct** code for this rule 👍
21+
22+
```erb
23+
<!-- correct -->
24+
<a href='https://github.com/'>Go to GitHub</a>
25+
```
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# frozen_string_literal: true
2+
3+
require_relative "../../custom_helpers"
4+
5+
module ERBLint
6+
module Linters
7+
module GitHub
8+
module Accessibility
9+
class LinkHasHref < Linter
10+
include ERBLint::Linters::CustomHelpers
11+
include LinterRegistry
12+
13+
MESSAGE = "Links should go somewhere, you probably want to use a <button> instead."
14+
15+
def run(processed_source)
16+
tags(processed_source).each do |tag|
17+
next if tag.name != "a"
18+
next if tag.closing?
19+
20+
href = possible_attribute_values(tag, "href")
21+
name = tag.attributes["name"]
22+
23+
generate_offense(self.class, processed_source, tag) if (!name && href.empty?) || href.include?("#")
24+
end
25+
26+
rule_disabled?(processed_source)
27+
end
28+
end
29+
end
30+
end
31+
end
32+
end
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# frozen_string_literal: true
2+
3+
require "test_helper"
4+
5+
class LinkHasHref < LinterTestCase
6+
def linter_class
7+
ERBLint::Linters::GitHub::Accessibility::LinkHasHref
8+
end
9+
10+
def test_warns_if_link_has_no_href_attribute
11+
@file = "<a>Go to GitHub</a>"
12+
@linter.run(processed_source)
13+
14+
refute_empty @linter.offenses
15+
end
16+
17+
def test_does_not_warn_if_link_has_href_attribute
18+
@file = "<a href='https://github.com/'>Go to GitHub</a>"
19+
@linter.run(processed_source)
20+
21+
assert_empty @linter.offenses
22+
end
23+
end

0 commit comments

Comments
 (0)