Skip to content

Commit 2522ce8

Browse files
authored
Merge pull request #17 from textlint-ja/feature/no-ai-colon-block-pattern
feat: add no-ai-colon-continuation rule with kuromojin morphological analysis
1 parent 4f87500 commit 2522ce8

8 files changed

+384
-50
lines changed

README.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,54 @@ AIライティングで過度に使用されがちな誇張表現やハイプ的
8282

8383
AIが機械的に生成しがちな強調パターンを検出します。
8484

85+
### no-ai-colon-continuation
86+
87+
コロンの直後にブロック要素が続く英語的なパターンを検出します。日本語として自然な表現を促進するルールです。
88+
89+
このルールは形態素解析(kuromojin)を使用して、コロンの前の文が述語(動詞・形容詞・助動詞)で終わっているかを判定します。「使用方法:」のような名詞で終わる表現は自然な日本語として許可され、「実行します:」のような述語で終わる表現のみを検出します。
90+
91+
#### 検出される例
92+
93+
````markdown
94+
実行します:
95+
96+
```bash
97+
command
98+
```
99+
100+
説明します:
101+
102+
- 項目1
103+
- 項目2
104+
105+
例えば:
106+
107+
- 具体的な例
108+
````
109+
110+
#### より自然な日本語表現
111+
112+
````markdown
113+
実行方法は以下の通りです。
114+
115+
```bash
116+
command
117+
```
118+
119+
説明の内容は以下の通りです。
120+
121+
- 項目1
122+
- 項目2
123+
124+
たとえば、次のような例があります。
125+
126+
- 具体的な例
127+
128+
例:
129+
130+
- 具体的な例
131+
````
132+
85133
### ai-tech-writing-guideline
86134

87135
テクニカルライティングのベストプラクティスに基づいて、文書品質の改善提案を行います。
@@ -279,6 +327,13 @@ AIを利用しやすくするプラットフォームです。
279327
"disableAbstractPatterns": false,
280328
"disabledPredictivePatterns": false
281329
},
330+
"no-ai-colon-continuation": {
331+
"allows": ["許可したいテキスト", "/正規表現パターン/"],
332+
"disableCodeBlock": false,
333+
"disableList": false,
334+
"disableQuote": false,
335+
"disableTable": false
336+
},
282337
"ai-tech-writing-guideline": {
283338
"severity": "info", // サジェストとして扱う
284339
"allows": ["許可したいテキスト", "/正規表現パターン/"],
@@ -304,6 +359,16 @@ AIを利用しやすくするプラットフォームです。
304359
- `disableBoldListItems`: `true`にすると強調リストアイテムの検出を無効にする
305360
- `disableEmojiListItems`: `true`にすると絵文字リストアイテムの検出を無効にする
306361

362+
#### no-ai-colon-continuation
363+
364+
- `allows`: 指定したパターンにマッチする場合、エラーを報告しません
365+
- 文字列: `"許可したいテキスト"`
366+
- 正規表現: `"/パターン/フラグ"` (例: `"/使用方法.*/i"`)
367+
- `disableCodeBlock`: `true`にするとコロン後のコードブロック検出を無効にする
368+
- `disableList`: `true`にするとコロン後のリスト検出を無効にする
369+
- `disableQuote`: `true`にするとコロン後の引用検出を無効にする
370+
- `disableTable`: `true`にするとコロン後のテーブル検出を無効にする
371+
307372
### 正規表現パターンの使用例
308373

309374
`allows`オプションでは、[regexp-string-matcher](https://github.com/textlint/regexp-string-matcher)の形式で正規表現パターンを指定できます。

package-lock.json

Lines changed: 1 addition & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
},
7070
"dependencies": {
7171
"@textlint/regexp-string-matcher": "^2.0.2",
72+
"kuromojin": "^3.0.1",
7273
"textlint-util-to-string": "^3.3.4"
7374
},
7475
"packageManager": "npm@10.9.2+sha512.8ab88f10f224a0c614cb717a7f7c30499014f77134120e9c1f0211ea3cf3397592cbe483feb38e0c4b3be1c54e347292c76a1b5edb94a3289d5448484ab8ac81"

src/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,24 @@ import noAiListFormatting from "./rules/no-ai-list-formatting";
22
import noAiHypeExpressions from "./rules/no-ai-hype-expressions";
33
import noAiEmphasisPatterns from "./rules/no-ai-emphasis-patterns";
44
import aiTechWritingGuideline from "./rules/ai-tech-writing-guideline";
5+
import noAiColonContinuation from "./rules/no-ai-colon-continuation";
56

67
const preset = {
78
rules: {
89
"no-ai-list-formatting": noAiListFormatting,
910
"no-ai-hype-expressions": noAiHypeExpressions,
1011
"no-ai-emphasis-patterns": noAiEmphasisPatterns,
11-
"ai-tech-writing-guideline": aiTechWritingGuideline
12+
"ai-tech-writing-guideline": aiTechWritingGuideline,
13+
"no-ai-colon-continuation": noAiColonContinuation
1214
},
1315
rulesConfig: {
1416
"no-ai-list-formatting": true,
1517
"no-ai-hype-expressions": true,
1618
"no-ai-emphasis-patterns": true,
1719
"ai-tech-writing-guideline": {
1820
severity: "info"
19-
}
21+
},
22+
"no-ai-colon-continuation": true
2023
}
2124
};
2225

src/rules/ai-tech-writing-guideline.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ const rule: TextlintRuleModule<Options> = (context, options = {}) => {
188188

189189
/**
190190
* 機械的な段落と箇条書きの組み合わせパターンを検出
191+
* 注意: コロン関連のパターンは no-ai-colon-continuation ルールで処理されます
191192
*/
192193
const detectMechanicalListIntroPattern = (node: any) => {
193194
const children = node.children || [];
@@ -213,14 +214,10 @@ const rule: TextlintRuleModule<Options> = (context, options = {}) => {
213214
let isDetected = false;
214215
let message = "";
215216

216-
// パターン1: コロン(:、:)で終わる段落
217-
if (/[:][\s]*$/.test(paragraphText.trim())) {
218-
isDetected = true;
219-
message =
220-
"【構造化】コロン(:)で終わる文の直後の箇条書きは機械的な印象を与える可能性があります。「たとえば、次のような点があります。」のような導入文を使った自然な表現を検討してください。";
221-
}
222-
// パターン2: 「例えば。」「具体的には。」など、接続表現+句点で終わる段落
223-
else if (/(?:|||||)[\s]*$/.test(paragraphText.trim())) {
217+
// 注意: コロンパターンは no-ai-colon-continuation で処理されるため削除
218+
219+
// パターン: 「例えば。」「具体的には。」など、接続表現+句点で終わる段落
220+
if (/(?:|||||)[\s]*$/.test(paragraphText.trim())) {
224221
isDetected = true;
225222
message =
226223
"【構造化】接続表現と句点で終わる文の直後の箇条書きは機械的な印象を与える可能性があります。「たとえば、次のような点があります。」のような自然な導入文を検討してください。";
@@ -254,7 +251,8 @@ const rule: TextlintRuleModule<Options> = (context, options = {}) => {
254251
return;
255252
}
256253

257-
// コロン + 箇条書きパターンの検出
254+
// 接続表現 + 箇条書きパターンの検出
255+
// 注意: コロン + ブロック要素パターンは no-ai-colon-continuation ルールで処理
258256
detectMechanicalListIntroPattern(node);
259257
// 将来的にここに他の文書レベルの構造化パターンを追加できます
260258
// 例:

0 commit comments

Comments
 (0)