markdownlint icon indicating copy to clipboard operation
markdownlint copied to clipboard

Rule to validate links via https://github.com/tcort/markdown-link-check/

Open nschonni opened this issue 6 years ago • 8 comments

I've been using https://github.com/tcort/markdown-link-check/ as a separate check to validate links in markdown. I was starting to see if I could leverage the .markdownlint.json as a config format for that project too and realized maybe it might make sense to just add that functionality as a rule in this project. Because it can go out and create network requests, I think having it off by default would make sense. I may just do it as a custom rule in the end, but I figured I'd check to see if there is interest in this as a core rule.

Example config schema:

    "valid-links": {
      "description": "MD###/valid-links - Validate links",
      "type": [
        "boolean",
        "object"
      ],
      "default": true,
      "properties": {
        "link_types": {
          "description": "Types of links to validate",
          "type": "string",
          "enum": [
            "all",
            "internal",
            "external"
          ],
          "default": "internal"
        },
        "ignore_patterns": {
          "description": "RegExp for ignoring links",
          "type": "array",
          "items": {
            "type": "string"
          },
          "default": []
        },
        "http_headers": {
          "description": "Url and HTTP header pairs when URLs need additional parameters",
          "type": "array",
          "items": {
            "type": "object"
          },
          "default": []
      },
      "additionalProperties": false

/cc @tcort @timmkrause

nschonni avatar May 23 '18 09:05 nschonni

Love the idea! This comes up from time to time, so definitely worth thinking about. I think it would be pretty straightforward to implement as a custom rule, especially because the parser will have already pulled out each of the URLs.

What I’d like to do is start everything as a custom rule, see how it does, then look at pulling successful ones into the core library. (With the caveat that I try hard to avoid new dependencies, so maybe attempt this using only the core Node.js modules.)

If you prototype something here, I'd be happy to answer any questions that come up!

(See also https://github.com/DavidAnson/check-pages for a project of mine that checks links.)

DavidAnson avatar May 23 '18 16:05 DavidAnson

Sounds good, I'll see if I can figure out setting up a separate rule repo. Any advice on naming conventions and namespacing for rules, just to avoid any future issues if you decide it would fit in core?

nschonni avatar May 23 '18 21:05 nschonni

Don’t assign an MDxxx name, just use a name like validate-links and it should be possible to pull it in pretty much as-is. Some other guidance here: https://github.com/DavidAnson/markdownlint/blob/master/doc/CustomRules.md

DavidAnson avatar May 23 '18 21:05 DavidAnson

Just wanted share my experience. I'm using both markdownlint-cli and textlint in my documentation projects. The following rule in textlint takes care of link validation:

https://github.com/textlint-rule/textlint-rule-no-dead-link

amimas avatar Feb 16 '20 17:02 amimas

Just going to note that even a subset of this feature, which would be checking local links like see [below](#another-heading) would be quite useful.

borekb avatar Nov 16 '20 07:11 borekb

Upcoming rule MD051 will implement this behavior for local links (#something).

https://github.com/DavidAnson/markdownlint/commit/33ee1cd85ee1eeaaca4ba4d7f18e7e2edf67a48d

DavidAnson avatar Jun 01 '22 06:06 DavidAnson

Update: I published a new npm package to add this custom rule (validating "dead" relative links): https://github.com/theoludwig/markdownlint-rule-relative-links. Contributions are welcome! :hugs:

theoludwig avatar Jan 02 '23 14:01 theoludwig

FYI the markdownlint-rule-relative-links plugin has been updated to support links to anchors like MD051 does.

igor-tsiglyar avatar Jan 12 '24 11:01 igor-tsiglyar