textlint-rule-no-dead-link icon indicating copy to clipboard operation
textlint-rule-no-dead-link copied to clipboard

Relative Link Resolution does not work with baseURI with Subdirectory

Open ahandsel opened this issue 2 years ago • 1 comments

Hello, I am looking for help to get textlint to verify my website's relative links within my HUGO website.

Any help would be greatly appreciated!

Thanks ~

Goal

  • We have a HUGO website that supports multi-language content
  • We use a language subdirectory (example.com/en/content)
  • We want to enable textlint to verify relative links with the baseURL with the language subdirectory. (Specifically English's /en/)

Problem

  • We have included the language tag in the baseURI, but it seems to be ignored.
    • Our settings: "baseURI": "https://example.com/en/",
    • textlint acts as if our baseURI is only https://example.com/.
  • Incorrect links are being tested and returned as 404 dead links.
    • Instead of https://example.com/en/blog1, it tests https://example.com/blog1 and returns 404.

Our configurations in .textlintrc

{
  "rules": {
    "prh": {
      "rulePaths": ["../../rules/global/prh.yml"]
    },
    "@textlint-rule/require-header-id": true,
    "@textlint-rule/no-invalid-control-character": true,
    "no-dead-link": {
      "checkRelative": true,
      "baseURI": "https://example.com/en/",
      "checkRelative": false,
      "baseURI": null,
      "ignore": [
        "https://example.com/**",
        "https://api.example.com/**",
        "https://www.linkedin.com/**",
        "https://github.com/**"
      ],
      "preferGET": [],
      "ignoreRedirects": true,
      "retry": 3,
      "userAgent": "textlint-rule-no-dead-link/1.0",
      "maxRetryTime": 10
    }
  },
  "filters": {
    "allowlist": {
      "allow": [
        "product: example"
      ],
      "allowlistConfigPaths": [
        "../../rules/allow.yml"
      ]
    },
    "comments": true
  }
}

Related Issue

Relative links and i18n · Issue #146

ahandsel avatar Oct 24 '22 04:10 ahandsel

baseURI + path is joined by url.resolve(from, to) https://github.com/textlint-rule/textlint-rule-no-dead-link/blob/e1e0cdd183b6d216c1eeeec005b19e053a192adc/src/no-dead-link.js#L272

Probably, your path is written as /blog1. As a result, url.resolve("https://example.com/en/", "/blog1") to be 'https://example.com/blog1'.

> url.resolve("https://example.com/en/", "/blog1")
'https://example.com/blog1'
> url.resolve("https://example.com/en/", "blog1")
'https://example.com/en/blog1'

We need to found suitable option/behavior for #146

📝 Some options:

  • use url-join instead of url.resolve
  • introduce another option

azu avatar Oct 24 '22 04:10 azu