markdownlint/doc/md051.md

95 lines
2.8 KiB
Markdown
Raw Normal View History

# `MD051` - Link fragments should be valid
Tags: `links`
Aliases: `link-fragments`
Fixable: Some violations can be fixed by tooling
This rule is triggered when a link fragment does not match any of the fragments
that are automatically generated for headings in a document:
```markdown
# Heading Name
[Link](#fragment)
```
To fix this issue, change the link fragment to reference an existing heading's
generated name (see below):
```markdown
# Heading Name
[Link](#heading-name)
```
Furthermore, this rule mandates the use of lowercase for link fragments.
Thus, even though the link points to the correct fragment, the following example
will still trigger this rule:
```markdown
# Heading Name
[Link](#Heading-Name)
```
Alternatively, some platforms allow the syntax `{#named-anchor}` to be used
within a heading to provide a specific name (consisting of only lower-case
letters, numbers, `-`, and `_`):
```markdown
# Heading Name {#custom-name}
[Link](#custom-name)
```
Alternatively, any HTML tag with an `id` attribute or an `a` tag with a `name`
attribute can be used to define a fragment:
```markdown
<a id="bookmark"></a>
[Link](#bookmark)
```
An `a` tag can be useful in scenarios where a heading is not appropriate or for
control over the text of the fragment identifier.
GitHub supports links to [specific lines][github-lines-links].
For example, to link to line 12 of current Markdown file:
```markdown
[Go to line 12](#L12)
```
GitHub also allows to specify a column number:
```markdown
[Go to line 12, column 34](#L12-L34)
```
Or a range of lines/columns:
```markdown
[Go to lines 12-34](#L12-L34)
```
So this rule will not report violations when this syntax is used.
Rationale: [GitHub section links][github-section-links] are created
automatically for every heading when Markdown content is displayed on GitHub.
This makes it easy to link directly to different sections within a document.
However, section links change if headings are renamed or removed. This rule
helps identify broken section links within a document.
Section links are **not** part of the CommonMark specification. This rule
enforces the [GitHub heading algorithm][github-heading-algorithm] which is:
convert heading to lowercase, remove punctuation, convert spaces to dashes,
append an incrementing integer as needed for uniqueness.
[github-section-links]: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#section-links
[github-heading-algorithm]: https://github.com/gjtorikian/html-pipeline/blob/f13a1534cb650ba17af400d1acd3a22c28004c09/lib/html/pipeline/toc_filter.rb
[github-lines-links]: https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-a-permanent-link-to-a-code-snippet#linking-to-markdown#linking-to-markdown