技術文書を書く時のユルい TextLint・MarkdownLint ルールプリセット

自分が技術系の文書を Markdown で書く時に使っていた、TextLint と MarkdownLint のルールプリセットを紹介。ルールはまぁまぁユルめ。最後に作ったのが1年前ぐらいなので、少々古いかも。

TextLint

{
  "rules": {
    // 日本語周りにおけるスペースの有無を決定するルールプリセット
    "preset-ja-spacing": {
      // カタカナ語間は中黒または半角スペースを用いてカタカナ語を区切る
      "ja-nakaguro-or-halfwidth-space-between-katakana": true,
      // カッコの外側・内側ともにスペースを入れない
      "ja-no-space-around-parentheses": true,
      // 全角文字同士の間にスペースを入れない
      "ja-no-space-between-full-width": true,
      // 半角文字と全角文字の間にスペースを入れる (句読点の前後には適用しない)
      "ja-space-between-half-and-full-width": {
        space: "always",
        exceptPunctuation: true
      },
      // 文末の感嘆符の後ろに全角スペースを強制しない
      "ja-space-after-exclamation": false,
      // 文末の疑問符の後ろに全角スペースを強制しない
      "ja-space-after-question": false,
      // インラインコードの前後にスペースを入れる
      "ja-space-around-code": {
        "before": true,
        "after": true
      }
    },
    // 技術文書向けのルールプリセット
    "preset-ja-technical-writing": {
      // 1文の長さ指定
      "sentence-length": {
        max: 140  // デフォルト : 90
      },
      // 1文中のカンマ数をチェックしない
      "max-comma": false,
      // 読点は1文中に3つまで
      "max-ten": {
        max: 3
      },
      // 連続できる最大の漢字長
      "max-kanji-continuous-len": {
        max: 5,  // デフォルトどおり5文字
        // 許容する文言
        allow: []
      },
      // 漢数字と算用数字を使い分ける
      "arabic-kanji-numbers": true,
      // 「ですます調」、「である調」を統一する
      "no-mix-dearu-desumasu": {
        // 見出しは自動
        "preferInHeader": "",
        // 本文はですます調
        "preferInBody": "ですます",
        // 箇条書きはである調
        "preferInList": "である",
        // 文末以外のチェックを緩める
        "strict": false
      },
      // 文末の句点記号に「。」を使う (リスト中の句点記号は textlint-rule-period-in-list-item にて指定)
      "ja-no-mixed-period": {
        "periodMark": "。"
      },
      // 二重否定は使用しない
      "no-double-negative-ja": true,
      // ら抜き言葉を使用しない
      "no-dropping-the-ra": true,
      // 逆接の接続助詞「が」を連続して使用しない
      "no-doubled-conjunctive-particle-ga": true,
      // 同じ接続詞を連続して使用しない
      "no-doubled-conjunction": true,
      // 同じ助詞を連続して使用しない
      "no-doubled-joshi": {
        "min_interval": 1
      },
      // UTF8-MAC 濁点を使用しない
      "no-nfd": true,
      // 感嘆符「!!??」を使用を許容する
      "no-exclamation-question-mark": false,  // デフォルト : true (使用を禁止する)
      // 半角カナを使用しない
      "no-hankaku-kana": true,
      // 弱い日本語表現の利用を使用しない
      "ja-no-weak-phrase": true,
      // 同一の単語を間違えて連続しているのをチェックする
      "ja-no-successive-word": true,
      // よくある日本語の誤用をチェックする
      "ja-no-abusage": true,
      // 冗長な表現を禁止する
      "ja-no-redundant-expression": true
    },
    // JTF 日本語標準スタイルガイドに即したルールプリセット
    "preset-jtf-style": {
      "1.1.1.本文": true,
      "1.1.2.見出し": true,
      // 箇条書き内の文体・文末の句点の有無に「統一感があるかどうか」で判断される
      "1.1.3.箇条書き": true,
      "1.1.5.図表のキャプション": true,
      "1.2.1.句点(。)と読点(、)": true,
      "1.2.2.ピリオド(.)とカンマ(,)": true,
      // 常用漢字外として「脆 (弱性)」や「雛 (形)」がヒットするため無効化
      "2.1.2.漢字": false,
      // 辞書ベース : 「プラットフォーム」を「プラットホーム」に直そうとしたりするため無効化
      "2.1.5.カタカナ": false,
      // 辞書ベース : 長音記号を必須化するため無効化
      "2.1.6.カタカナの長音": false,
      "2.1.8.算用数字": true,
      "2.1.9.アルファベット": true,
      "2.1.10.算用数字の位取りの表記": true,
      // 辞書ベース
      "2.2.1.ひらがなと漢字の使い分け": true,
      "2.2.2.算用数字と漢数字の使い分け": true,
      // 辞書ベース
      "2.2.3.一部の助数詞の表記": true,
      // 全角文字と半角文字の間にスペースを入れるので無効化
      "3.1.1.全角文字と半角文字の間": false,
      "3.1.2.全角文字どうし": true,
      "3.2.カタカナ語間のスペースの有無": true,
      "3.3.かっこ類と隣接する文字の間のスペースの有無": true,
      "4.1.1.句点(。)": true,
      "4.1.3.ピリオド(.)、カンマ(,)": true,
      "4.2.1.感嘆符(!)": true,
      "4.2.2.疑問符(?)": true,
      "4.2.4.中黒(・)": true,
      "4.2.5.波線(〜)": true,
      "4.2.6.ハイフン(-)": true,
      // 全角表記
      "4.2.7.コロン( : )": true,
      "4.2.8.セミコロン(;)": true,
      "4.2.9.ダッシュ(-)": true,
      // 全角の丸カッコを強制されるので無効化
      "4.3.1.丸かっこ()": false,
      // 全角の大カッコを強制されるので無効化
      "4.3.2.大かっこ[]": false,
      "4.3.3.かぎかっこ「」": true,
      "4.3.4.二重かぎかっこ『』": true,
      "4.3.5.二重引用符": true,
      "4.3.6.中かっこ{ }": true,
      "4.3.7.山かっこ<>": true,
      "4.3.8.一重引用符": true
    },
    // サ抜き、サ入れ表現の誤用
    "@textlint-ja/textlint-rule-no-insert-dropping-sa": true,
    // 制御文字のチェック
    "@textlint-rule/textlint-rule-no-invalid-control-character": true,
    // 漢字よりもひらがなで表記したほうが読みやすい補助動詞を指摘する
    "ja-hiragana-hojodoushi": true,
    // 不自然なアルファベットを検知する
    "ja-unnatural-alphabet": true,
    // 半角・全角アルファベットの混在チェック : デフォルトどおり半角を推奨する
    "no-mixed-zenkaku-and-hankaku-alphabet": {
      "prefer": "半角"
    },
    // サロゲートペア文字のチェック
    "no-surrogate-pair": true,
    // リスト中の末尾に句点記号を書かないようにする
    "period-in-list-item": true,
    // 例示・並列表現の「~たり、(~たり) する」をチェックする
    "prefer-tari-tari": true,
    // prh: proofreading helper を使ったスペリング・表記ゆれチェック
    "prh": {
      "rulePaths": ["./prh.yml"]
    },
    // 技術用語のスペリングチェック
    "terminology": {
      // デフォルトの用語集を使用する
      "defaultTerms": true,
      // スキップする要素を指定する
      "skip": ["Blockquote"]
    }
  },
  "filters": {
    // コメントによるルールの無効化切り替え
    "comments": true
  }
}

以下の package.json に記載のパッケージを入れて、.textlintrc を適用すれば OK。

{
  "dependencies": {
    "@textlint-ja/textlint-rule-no-insert-dropping-sa": "1.0.1",
    "@textlint-rule/textlint-rule-no-invalid-control-character": "1.0.1",
    "textlint": "8.2.1",
    "textlint-filter-rule-comments": "1.2.2",
    "textlint-rule-ja-hiragana-hojodoushi": "1.0.4",
    "textlint-rule-ja-unnatural-alphabet": "1.3.0",
    "textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet": "1.0.1",
    "textlint-rule-no-surrogate-pair": "1.0.1",
    "textlint-rule-period-in-list-item": "0.2.0",
    "textlint-rule-prefer-tari-tari": "1.0.3",
    "textlint-rule-preset-ja-spacing": "2.0.1",
    "textlint-rule-preset-ja-technical-writing": "2.0.0",
    "textlint-rule-preset-jtf-style": "2.3.1",
    "textlint-rule-prh": "5.0.1",
    "textlint-rule-terminology": "1.1.27"
  }
}

MarkdownLint

{
  "//": ".markdownlint.json : https://github.com/DavidAnson/markdownlint/blob/master/doc/Rules.md",
  "//": "MD001 : 見出しレベルのインクリメントチェック",
  "header-increment": true,
  "//": "MD002 : 最初に登場する見出しがレベル1であること",
  "first-header-h1": true,
  "//": "MD003 : 見出しのスタイル",
  "header-style": {
    "style": "atx"
  },
  "//": "MD004 : リストの記号をハイフンにする",
  "ul-style": {
    "style": "dash"
  },
  "//": "MD005 : リストのインデントを揃える",
  "list-indent": true,
  "//": "MD006 : トップレベルのリストをインデントしない",
  "ul-start-left": true,
  "//": "MD007 : リストのインデントに使用するスペースの数",
  "ul-indent": {
    "indent": 2
  },
  "//": "MD009 : 改行のための2スペースを除いて、行末の不要なスペースを検知する",
  "no-trailing-spaces": {
    "br_spaces": 2
  },
  "//": "MD010 : Tab によるインデントを禁止する",
  "no-hard-tabs": true,
  "//": "MD011 : リンク記法の誤りチェック",
  "no-reversed-links": true,
  "//": "MD012 : 連続する空行を最大2つまでにする",
  "no-multiple-blanks": {
    "maximum": 2
  },
  "//": "MD013 : 1行の長さを制御しない",
  "line-length": false,
  "//": "MD014 : コードブロックにコマンドを書く際、行頭に「$」記号を強制しない",
  "commands-show-output": false,
  "//": "MD018 : 見出しの「#」直後にスペースを入れること",
  "no-missing-space-atx": true,
  "//": "MD019 : 見出しの「#」直後に複数のスペースを入れないこと",
  "no-multiple-space-atx": true,
  "//": "MD020 : 見出しの「#」前後にスペースを入れること (Closed ATX スタイル向けのルールのため無意味)",
  "no-missing-space-closed-atx": true,
  "//": "MD021 : 見出しの「#」前後に複数のスペースを入れないこと (Closed ATX スタイル向けのルールのため無意味)",
  "no-multiple-space-closed-atx": true,
  "//": "MD022 : 見出しの前後に空行を入れること",
  "blanks-around-headers": true,
  "//": "MD023 : 見出しにインデントを付けない",
  "header-start-left": true,
  "//": "MD024 : 見出し文言の重複を許容する",
  "no-duplicate-header": false,
  "//": "MD025 : 見出しレベル1は1ファイル中に1つのみにする",
  "single-h1": true,
  "//": "MD026 : 見出しの文末に記載を禁止する記号 (句読点で終わらないこと)",
  "no-trailing-punctuation": {
    "punctuation": ".,:!?、。"
  },
  "//": "MD027 : 引用記号「>」直後にスペースを1つだけ入れること",
  "no-multiple-space-blockquote": true,
  "//": "MD028 : 引用ブロック中の空行を表現する際に引用記号「>」を書くこと",
  "no-blanks-blockquote": true,
  "//": "MD029 : 順序付きリストは連番を明記する",
  "ol-prefix": {
    "style": "ordered"
  },
  "//": "MD030 : リスト記号の直後にスペースを入れること",
  "list-marker-space": true,
  "//": "MD031 : コードブロックの前後に空行を入れること (リスト中にコードブロックを記載する際は、リスト全体で MD031・MD032 を無効化するようコメントを入れておく)",
  "blanks-around-fences": true,
  "//": "MD032 : リストの前後に空行を入れること",
  "blanks-around-lists": true,
  "//": "MD033 : HTML の記述を許容する",
  "no-inline-html": false,
  "//": "MD034 : URL のベタ書きを禁止する (リンク記法もしくはインラインコードとして表現する)",
  "no-bare-urls": true,
  "//": "MD035 : 水平区切り線のスタイル",
  "hr-style": {
    "style": "---"
  },
  "//": "MD036 : 強調構文を見出し風に使うことを許容する",
  "no-emphasis-as-header": false,
  "//": "MD037 : 強調構文の内側 (開始直後・終了直前) にスペースを書かないこと",
  "no-space-in-emphasis": true,
  "//": "MD038 : インラインコードの内側 (開始直後・終了直前) にスペースを書かないこと",
  "no-space-in-code": true,
  "//": "MD039 : リンクの内側 (開始直後・終了直前) にスペースを書かないこと",
  "no-space-in-links": true,
  "//": "MD040 : コードブロックには言語を必ず記載する (言語指定が不要な場合は「text」を記載する)",
  "fenced-code-language": true,
  "//": "MD041 : 1行目に見出しレベル1が記載されていなくても許容する (GitBook の extends 記法等が書かれるため無効化)",
  "first-line-h1": false,
  "//": "MD042 : URL が空のリンク記法をチェックする",
  "no-empty-links": true,
  "//": "MD043 : 特定の見出しレベル・見出し文言を強制する指定 (アウトラインの強制は不要なので無効化)",
  "required-headers": false,
  "//": "MD044 : 英単語の大文字・小文字表記ゆれチェック (textlint-rule-prh によるチェックに統一するため無効化)",
  "proper-names": false,
  "//": "MD045 : 画像記法に Alt Text を書くこと",
  "no-alt-text": true
}