kakakakakku blog

Weekly Tech Blog: Keep on Learning!

ドキュメントにある「リンク切れ」を検知できる「textlint-rule-no-dead-link」

textlint のルール「textlint-rule-no-dead-link」を使うと,ドキュメントにある「リンク切れ」を検知することができる.最近とあるドキュメントをレビューするときに,比較的リンクが多く,作業を効率化するために導入した.インストール手順は GitHub に書いてある.

github.com

正常

以下のようにREADME.md を準備する.

- https://kakakakakku.hatenablog.com

リンク切れはなく,正常に実行できる.

$ textlint --rule textlint-rule-no-dead-link README.md
$ echo $?
0

異常 (404 Not Found)

以下のようにREADME.md を準備する.意図的に誤ったリンクを追加している.

- https://kakakakakku.hatenablog.com
- https://kkkkkkkkkkk.hatenablog.com

実行すると,リンク切れを検知できる.これは便利!

$ textlint --rule textlint-rule-no-dead-link README.md

README.md
  2:3  error  https://kkkkkkkkkkk.hatenablog.com is dead. (404 Not Found)  no-dead-link

✖ 1 problem (1 error, 0 warnings)

$ echo $?
1

異常 (301 Moved Permanently)

以下のようにREADME.md を準備する.意図的にリダイレクトになるリンクを追加している(http → https).

- https://kakakakakku.hatenablog.com
- http://kakakakakku.hatenablog.com

デフォルト設定だとリダイレクトもエラーになる.後述する設定を有効化すると,リダイレクトを許可することもできる.

$ textlint --rule textlint-rule-no-dead-link README.md

README.md
  2:3  ✓ error  http://kakakakakku.hatenablog.com is redirected to https://kakakakakku.hatenablog.com/. (301 Moved Permanently)  no-dead-link

✖ 1 problem (1 error, 0 warnings)1 fixable problem.
Try to run: $ textlint --fix [file]

$ echo $?
1

自動修正 (--fix)

リダイレクトを検知した場合,実行時に --fix オプションを指定すると自動的に修正することもできる.

$ textlint --fix --rule textlint-rule-no-dead-link README.md

README.md
  2:3  ✔   http://kakakakakku.hatenablog.com is redirected to https://kakakakakku.hatenablog.com/. (301 Moved Permanently)  no-dead-link

✔ Fixed 1 problem

設定

「textlint-rule-no-dead-link」は現時点だと計5種類の設定をサポートしている.

  • checkRelative : 相対 URI を確認するかどうか(デフォルト true
  • baseURI : checkRelative と組み合わせて使う基底 URI を設定するかどうか(デフォルト null
  • ignore : 除外する URI を設定するかどうか(デフォルト []
  • preferGET : HEAD メソッドではなく GET メソッドで確認するかどうか(デフォルト []
  • ignoreRedirects : リダイレクトを除外するかどうか(デフォルト false

.textlintrc を以下のように書くと,設定を有効化できる.

{
  "rules": {
    "no-dead-link": {
      "checkRelative": true,
      "baseURI": null,
      "ignore": [],
      "preferGET": [],
      "ignoreRedirects": false
    }
  }
}

UserAgent は?

「textlint-rule-no-dead-link」の実装を読むと,実際に HTTP リクエストを飛ばしていたため,どんな UserAgent なのかを確認した.ローカル環境に nginx を起動して,Markdown に http://localhost を追加したところ,以下のような UserAgent だった.UserAgent を指定できる設定があっても良さそう.

HEAD node-fetch/1.0 (+https://github.com/bitinn/node-fetch)
GET  node-fetch/1.0 (+https://github.com/bitinn/node-fetch)

Method に関しては,基本的に HEAD を使って,エラーになった場合に GET にフォールバックする実装になっている.また .textlintrcpreferGET を有効化した場合は最初から GET になる.

まとめ

  • textlint のルール「textlint-rule-no-dead-link」を使うと「リンク切れ」を検知できる
  • ドキュメントレビューを効率化できる
  • デフォルトだとリダイレクトもエラーになる
    • リダイレクトを自動的に修正できる --fix オプションもある