Skip to content

Commit f2b0d33

Browse files
authored
feat: 「〜てる」「〜でます」「〜てない」をい抜き言葉として検知できるように (#19)
* feat: 「〜てる」→「〜ている」のい抜き言葉を検知できるように * feat: 「〜でる」→「〜でいる」のい抜き言葉を検知できるように * feat: 「〜でます」→「〜でいます」と「〜てない」→「〜ていない」を検知できるように
1 parent 56aa752 commit f2b0d33

File tree

5 files changed

+2975
-2430
lines changed

5 files changed

+2975
-2430
lines changed

Diff for: README.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22

33
い抜き言葉を検出する[textlint](https://github.com/textlint/textlint "textlint")ルールです。
44

5-
- ◯ 開発しています。
6-
- ✗ 開発してます。
5+
|| × |
6+
| --- | --- |
7+
| 開発しています。 | 開発してます。 |
8+
| 見学している。 | 見学してる。 |
9+
| 勉強していない。 | 勉強してない。 |
10+
| 遊んでいる。 | 遊んでる。 |
711

812
## Installation
913

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
},
66
"dependencies": {
77
"kuromojin": "^3.0.0",
8-
"textlint-rule-helper": "^2.1.1"
8+
"textlint-rule-helper": "^2.3.1"
99
},
1010
"description": "い抜き言葉を検出するtextlint rule",
1111
"devDependencies": {

Diff for: src/no-dropping-i.js

+25-3
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,30 @@
33
import { RuleHelper } from "textlint-rule-helper";
44
import { tokenize } from "kuromojin";
55

6-
function isTargetWord(token) {
7-
return token.pos === "助詞" && token.pos_detail_1 === "接続助詞" && token.basic_form === "て";
6+
function isMasuTargetWord(token) {
7+
return token.pos === "助詞" && token.pos_detail_1 === "接続助詞" && (token.basic_form === "て" || token.basic_form === "で");
88
}
99

1010
function isMasuWord(token) {
1111
return token.pos === "助動詞" && token.pos_detail_1 === "*" && token.basic_form === "ます";
1212
}
1313

14+
function isTeruTargetWord(token) {
15+
return token.pos === "動詞" && token.pos_detail_1 === "自立";
16+
}
17+
18+
function isTeruWord(token) {
19+
return token.pos === "動詞" && token.pos_detail_1 === "非自立" && (token.basic_form === "てる" || token.basic_form === "でる");
20+
}
21+
22+
function isTenaiTargetWord(token) {
23+
return token.pos === "動詞" && token.pos_detail_1 === "非自立" && (token.basic_form === "て" || token.basic_form === "で");
24+
}
25+
26+
function isTenaiWord(token) {
27+
return token.pos === "助動詞" && token.conjugated_type === "特殊・ナイ" && token.basic_form === "ない";
28+
}
29+
1430
module.exports = function(context) {
1531
const helper = new RuleHelper(context);
1632
const { Syntax, report, getSource, RuleError } = context;
@@ -24,10 +40,16 @@ module.exports = function(context) {
2440
tokens.forEach((token, index) => {
2541
const current = token;
2642
const prev = tokens[index - 1];
43+
2744
if (!prev || !current) {
2845
return;
2946
}
30-
if (isTargetWord(prev) && isMasuWord(current)) {
47+
48+
const isMasuPattern = isMasuTargetWord(prev) && isMasuWord(current);
49+
const isTeruPattern = isTeruTargetWord(prev) && isTeruWord(current);
50+
const isTenaiPattern = isTenaiTargetWord(prev) && isTenaiWord(current);
51+
52+
if (isMasuPattern || isTeruPattern || isTenaiPattern) {
3153
report(
3254
node,
3355
new RuleError("い抜き言葉を使用しています。", {

Diff for: test/test.js

+70-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,16 @@ import TextLintTester from "textlint-tester";
33

44
const tester = new TextLintTester();
55
tester.run("no-dropping-i", rule, {
6-
valid: ["見ています", "開発しています。"],
6+
valid: [
7+
"見ています",
8+
"開発しています。",
9+
"休んでいました。",
10+
"笑っている。",
11+
"見学している。",
12+
"遊んでいる。",
13+
"勉強していない。",
14+
"困っていません。"
15+
],
716
invalid: [
817
{
918
text: "見てます。",
@@ -25,10 +34,65 @@ tester.run("no-dropping-i", rule, {
2534
}
2635
]
2736
},
28-
// TODO: support
29-
// {
30-
// text: "人が話してる",
31-
// errors: [{}]
32-
// }
37+
{
38+
text: "休んでました。",
39+
errors: [
40+
{
41+
message: "い抜き言葉を使用しています。",
42+
line: 1,
43+
column: 4
44+
}
45+
]
46+
},
47+
{
48+
text: "笑ってる。",
49+
errors: [
50+
{
51+
message: "い抜き言葉を使用しています。",
52+
line: 1,
53+
column: 3
54+
}
55+
]
56+
},
57+
{
58+
text: "見学してる。",
59+
errors: [
60+
{
61+
message: "い抜き言葉を使用しています。",
62+
line: 1,
63+
column: 4
64+
}
65+
]
66+
},
67+
{
68+
text: "遊んでる。",
69+
errors: [
70+
{
71+
message: "い抜き言葉を使用しています。",
72+
line: 1,
73+
column: 3
74+
}
75+
]
76+
},
77+
{
78+
text: "勉強してない。",
79+
errors: [
80+
{
81+
message: "い抜き言葉を使用しています。",
82+
line: 1,
83+
column: 4
84+
}
85+
]
86+
},
87+
{
88+
text: "困ってません。",
89+
errors: [
90+
{
91+
message: "い抜き言葉を使用しています。",
92+
line: 1,
93+
column: 4
94+
}
95+
]
96+
},
3397
]
3498
});

0 commit comments

Comments
 (0)