textlint のルール「textlint-rule-no-dead-link」を使うと,ドキュメントにある「リンク切れ」を検知することができる.最近とあるドキュメントをレビューするときに,比較的リンクが多く,作業を効率化するために導入した.インストール手順は GitHub に書いてある.
正常
以下のように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
にフォールバックする実装になっている.また .textlintrc
で preferGET
を有効化した場合は最初から GET
になる.
まとめ
- textlint のルール「textlint-rule-no-dead-link」を使うと「リンク切れ」を検知できる
- ドキュメントレビューを効率化できる
- デフォルトだとリダイレクトもエラーになる
- リダイレクトを自動的に修正できる
--fix
オプションもある
- リダイレクトを自動的に修正できる