Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add lint for a link reference without a corresponding link definition (or vice versa) #456

Closed
gibfahn opened this issue Nov 5, 2021 · 22 comments

Comments

@gibfahn
Copy link

gibfahn commented Nov 5, 2021

Often (especially when refactoring) links using the definition/reference style will get broken. It would be useful for markdownlint to catch this.

Two examples are:

Link Ref without Def

See [Docs][] for more info.

<!-- Should have a link definition below like:
[docs]: https://example.com
-->

Link Def without Ref

See [New Docs][] for more info.

<!-- None of the link definitions match the link reference above. -->
[docs]: https://example.com
@jasonsnell
Copy link

Yes, agreed with this completely. A friend and I were working on a small standalone Markdown linter for writing purposes and this was actually our first feature! So strange that it's not in there.

@DavidAnson
Copy link
Owner

@jasonsnell, I think I listen to your podcasts sometimes. :) Yes, there is a set of link-based rules in the queue I just haven't got to yet.

@nschonni
Copy link
Contributor

I usually use https://www.npmjs.com/package/markdown-link-check since when you start to link check outside of the same document, you need to have a concept of a layout and replacements

@gibfahn
Copy link
Author

gibfahn commented Dec 24, 2021

Just tried markdown-link-check with the snippets from above:

echo 'See [Docs][] for more info.

<!-- Should have a link definition below like:
[docs]: https://example.com
-->' > ref_without_def.md
docker run -v ${PWD}:/tmp:ro --rm -i ghcr.io/tcort/markdown-link-check:stable /tmp/ref_without_def.md

echo 'See [New Docs][] for more info.

<!-- None of the link definitions match the link reference above. -->
[docs]: https://example.com' > def_without_ref.md
docker run -v ${PWD}:/tmp:ro --rm -i ghcr.io/tcort/markdown-link-check:stable /tmp/def_without_ref.md

Output (0 exit code):

FILE: /tmp/ref_without_def.md
  No hyperlinks found!

  0 links checked.

FILE: /tmp/def_without_ref.md
  No hyperlinks found!

  0 links checked.

so doesn't actually seem like it catches this case, possibly because it considers having extra refs/defs to be an okay thing to do (whereas for me it's nearly always copy-pasta, or someone forgetting how the defs/refs actually work.

@nschonni
Copy link
Contributor

Right, I missread this, but it looks like a duplicate of #144

@DavidAnson
Copy link
Owner

Agree, I'll probably try to add this for the next (not pending) release.

@nschonni
Copy link
Contributor

Here is the remark-lint version of this rule https://github.com/remarkjs/remark-lint/tree/main/packages/remark-lint-no-undefined-references to see if they have any edge case code that might be needed

@jasonsnell
Copy link

jasonsnell commented Dec 24, 2021 via email

@gibfahn
Copy link
Author

gibfahn commented Dec 27, 2021

Right, I missread this, but it looks like a duplicate of #144

Ahh, good point, failed to find that in the issue search.

@DavidAnson
Copy link
Owner

Two new rules will be available in the next release of the library:

They will report errors for:

  • Link and image references missing a label
  • Link/image reference definitions that are unused
  • Link/image reference definitions that are duplicated

The latter two scenarios can be automatically fixed by the library (by deleting the unneeded reference definition).

/cc @jasonsnell

@jasonsnell
Copy link

thank you @DavidAnson ! My friend might have invented Markdown? ;-)

@DavidAnson
Copy link
Owner

@jasonsnell Hopefully the idea of a Markdown linter does not offend him too much.

@jasonsnell
Copy link

He's working on a little one of his own for person writing use, much less comprehensive than this one. I think he likes the idea! But I don't want to speak for him.

@DavidAnson
Copy link
Owner

@jasonsnell Cool. If there's anything ya'll think I should be doing here to make it more compelling (other than adding more rules), please let me know.

For example: editor integration. I happen to think the VS Code integration is pretty good (because I wrote it), but maybe you have a different favorite editor.

https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint

@waldyrious
Copy link

@DavidAnson could there be an option for MD052 to force checking in shortcut link syntax? It could default to false, but in my case markdownlint was missing a reference-type link with an undefined target because of this, and I'd like to set up a check to avoid that in the future.

Happy to open a separate issue if that's preferred.

@DavidAnson
Copy link
Owner

@waldyrious See #845

@waldyrious
Copy link

@DavidAnson thanks for the pointer. I read the discussion and code in the PR and maybe I'm missing something, but it seems to be about enforcing the inline-vs-reference link style, rather than enforcing that, for reference-style links, the shortcut type may not be used.

Additionally, there seem to be different notions of what a shortcut-type reference link means. In the relevant commit from that PR, it seems to be [foo][], whereas in Rules.md (across the entire file, but especially in the MD052 section) it seems to be understood as just [foo]. For clarity, I am interested in an option to make MD0052 process the latter the same way it processes the former.

@DavidAnson
Copy link
Owner

Per the specification at https://spec.commonmark.org/0.30/#links:

There are three kinds of reference links: full, collapsed, and shortcut.

I try to be accurate when referring to this, but may have made a mistake somewhere in the documentation.

You are right that the issue I linked to focuses more on in line styles. You may be asking for a similar rule for the different kinds of reference link.

@DavidAnson
Copy link
Owner

Please open a new issue for a new rule to specify which types of reference links to allow. Thank you!

@waldyrious
Copy link

Ah, I see. So the [foo][] syntax is called "collapsed", not "shortcut". That's good to know, thanks!

I'll open a new issue.

@waldyrious
Copy link

Btw, responding more directly to the suggestion of

a new rule to specify which types of reference links to allow

I do agree it might be a good addition to the upcoming MD054/link-style rule to have an option to specify whether reference links should use shortcut, collapsed or full syntax. Such an option would not be my preferred resolution for the issue I had with shortcut-style reference links (which is why I made a slightly different request in #915), but I'm happy to open a separate issue for the option to customize MD054/link-style once #845 is merged. Does that sound OK?

@DavidAnson
Copy link
Owner

I'd suggest proposing a new reference link style rule as a different rule because MD054 already feels tricky enough.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants