Webサイトの特定ページのテキストをtextlintでチェックする方法

textlintでWebページをチェックする

テキストのチェックをする際にtextlintを使用することがある。

textlintは基本的にはテキストのファイルをチェックするためのものなのでtextlint自体にはWebサイトの特定ページのテキストをチェックするための機能はない。

しかし、node-fetchとjsdomをimportで読み込めばtextlintでWebサイトの特定ページのテキストをチェックができるようになる。

必要なライブラリをインストール

今回は以下のようなprh.ymlを作成してルールに一致するものはエラーで表示されるようにする。

version: 1
rules:
  - patterns: /whitelist/i
    expected: allowlist

  - patterns: /blacklist/i
    expected: denylist

  - patterns: ホワイトリスト
    expected: アローリスト

  - patterns: ブラックリスト
    expected: デニーリスト

まず、任意のディレクトリを作成してcdで移動したあと、次のコマンドで必要なものをすべてインストールする。

mkdir webtextlint; cd webtextlint; npm init -y; npm i -D textlint textlint-rule-prh node-fetch jsdom

次に.textlintrcファイルを作成して内容を以下の通りにする。

{
  "rules": {
    "prh": {
      "rulePaths": ["prh.yml"]
    }
  }
}

次に以下のコマンドでindex.mjsを作成する。

touch index.mjs; chmod 700 index.mjs

index.mjsファイルを作成したら、中身を以下のように記述する。

#!/usr/bin/env node

import fetch from 'node-fetch';
import jsdom from 'jsdom';
import textlint from 'textlint';

const { JSDOM } = jsdom;
const { TextLintEngine } = textlint;

(async() => {
    const target = 'body'
    const res = await fetch(process.argv[2])
    const html = await res.text()
    const dom = new JSDOM(html)
    const document = dom.window.document
    const post = document.querySelector(target)
    const text = post.textContent.trim()

    const engine = new TextLintEngine({
        rulePaths: ["node_modules/textlint-rule-prh"]
    })

    engine.executeOnText(text).then(results => {
        if (engine.isErrorResults(results)) {
            const output = engine.formatResults(results)
            console.log(output)
        } else {
            console.log('エラーはありませんでした。')
        }
    })
})()

あとはターミナルで./index.mjs 【URL】で実行すれば指定したページのURLのテキストをtextlintでチェックすることができる。

node -vでバージョンが14以上でない場合はアップデート推奨。

target = 'body' でbodyタグ全体のテキストをチェックするようになっているが、target = '.editArea' のようにすれば特定の要素内のテキストのみチェックすることができる。

# 実行例
$ ./index.mjs https://www.dentsu.co.jp/news/release/2019/0206-009744.html

<text>
  307:54   ✓ error  ホワイトリスト => アローリスト prh
  307:71   ✓ error  ブラックリスト => デニーリスト prh
  316:116  ✓ error  Whitelist => allowlist prh
  316:131  ✓ error  ホワイトリスト => アローリスト prh
  316:149  ✓ error  Blacklist => denylist prh
  316:166  ✓ error  ブラックリスト => デニーリスト prh
  317:30   ✓ error  Whitelist => allowlist prh
  317:165  ✓ error  ホワイトリスト => アローリスト prh
  317:411  ✓ error  Blacklist => denylist prh
  317:450  ✓ error  Blacklist => denylist prh

✖ 10 problems (10 errors, 0 warnings)

ちなみにURLに?が含まれている場合はクォーテーションで囲む必要がある。

$ ./index.mjs 'https://example.com/?p=1234'

Webサイトの特定ページのテキストをtextlintでチェックするサンプル