Skip to content

Commit 9d2d4b1

Browse files
authored
fix: 〜かどうか を例外として許容する (#63)
* fix: 〜かどうか を例外として許容する * test: add test case
1 parent a7e9def commit 9d2d4b1

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,16 @@ textlint --rule no-doubled-joshi README.md
204204
205205
並立助詞(`たり`)は連続するのが意図した助詞であるため許可します。
206206

207+
### 〜かどうか
208+
209+
> これにする**かどう****検討する
210+
211+
このような場合、助詞(****)が連続していますが、"〜かどうか"表現は一般的であるため許可します。
212+
213+
- Issue: [質問: ~かどうか、について · Issue #62 · textlint-ja/textlint-rule-no-doubled-joshi](https://github.com/textlint-ja/textlint-rule-no-doubled-joshi/issues/62)
214+
- [文節中の「か」の用法](https://jumonji-u.repo.nii.ac.jp/record/700/files/22-1.pdf)
215+
- [かどうか/疑問詞・・・か](https://www.jpf.go.jp/j/urawa/j_rsorcs/textbook/setsumei_pdf/setsumei16_2.pdf>)
216+
207217
### 連語(助詞)
208218

209219
- [連語(助詞) - 修飾語 - 品詞の分類 - Weblio 辞書](http://www.weblio.jp/parts-of-speech/%E9%80%A3%E8%AA%9E(%E5%8A%A9%E8%A9%9E)_1 "連語(助詞) - 修飾語 - 品詞の分類 - Weblio 辞書")

src/no-doubled-joshi.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ function createSurfaceKeyMap(tokens: KuromojiToken[]): { [index: string]: Kuromo
4545
);
4646
}
4747

48-
function matchExceptionRule(tokens: KuromojiToken[]) {
49-
const token = tokens[0];
48+
function matchExceptionRule(joshiTokens: KuromojiToken[], allTokens: KuromojiToken[]) {
49+
const token = joshiTokens[0];
5050
// "の" の重なりは例外
5151
if (token.pos_detail_1 === "連体化") {
5252
return true;
@@ -61,9 +61,23 @@ function matchExceptionRule(tokens: KuromojiToken[]) {
6161
}
6262
// 並立助詞は例外
6363
// 登ったり降りたり
64-
if (tokens.length === 2 && tokens[0].pos_detail_1 === "並立助詞" && tokens[1].pos_detail_1 === "並立助詞") {
64+
if (
65+
joshiTokens.length === 2 &&
66+
joshiTokens[0].pos_detail_1 === "並立助詞" &&
67+
joshiTokens[1].pos_detail_1 === "並立助詞"
68+
) {
6569
return true;
6670
}
71+
// 〜か〜か のパターン
72+
// 〜かどうか は例外 として許容する
73+
if (joshiTokens.length === 2 && joshiTokens[0].surface_form === "か" && joshiTokens[1].surface_form === "か") {
74+
// 〜|か|どう|か|
75+
const lastかIndex = allTokens.indexOf(joshiTokens[1]);
76+
const douToken = allTokens[lastかIndex - 1];
77+
if (douToken && douToken.surface_form === "どう") {
78+
return true;
79+
}
80+
}
6781
return false;
6882
}
6983

@@ -216,8 +230,8 @@ const report: TextlintRuleModule<Options> = function (context, options = {}) {
216230
// https://github.com/textlint-ja/textlint-rule-no-doubled-joshi/issues/15
217231
// 連語(助詞)の対応
218232
// http://www.weblio.jp/parts-of-speech/%E9%80%A3%E8%AA%9E(%E5%8A%A9%E8%A9%9E)_1
219-
const concatTokens = concatJoishiTokens(tokens);
220-
const countableTokens = concatTokens.filter((token) => {
233+
const concatedJoshiTokens = concatJoishiTokens(tokens);
234+
const countableJoshiTokens = concatedJoshiTokens.filter((token) => {
221235
if (isStrict) {
222236
return is助詞Token(token);
223237
}
@@ -242,7 +256,7 @@ const report: TextlintRuleModule<Options> = function (context, options = {}) {
242256
}
243257
return is助詞Token(token);
244258
});
245-
const joshiTokenSurfaceKeyMap = createSurfaceKeyMap(countableTokens);
259+
const joshiTokenSurfaceKeyMap = createSurfaceKeyMap(countableJoshiTokens);
246260
/*
247261
# Data Structure
248262
@@ -261,7 +275,7 @@ const report: TextlintRuleModule<Options> = function (context, options = {}) {
261275
}
262276
// strict mode ではない時例外を除去する
263277
if (!isStrict) {
264-
if (matchExceptionRule(joshiTokenSurfaceTokens)) {
278+
if (matchExceptionRule(joshiTokenSurfaceTokens, tokens)) {
265279
return;
266280
}
267281
}
@@ -271,8 +285,8 @@ const report: TextlintRuleModule<Options> = function (context, options = {}) {
271285
// if found differenceIndex less than
272286
// tokes are sorted ascending order
273287
joshiTokenSurfaceTokens.reduce((prev, current) => {
274-
const startPosition = countableTokens.indexOf(prev);
275-
const otherPosition = countableTokens.indexOf(current);
288+
const startPosition = countableJoshiTokens.indexOf(prev);
289+
const otherPosition = countableJoshiTokens.indexOf(current);
276290
// 助詞token同士の距離が設定値以下ならエラーを報告する
277291
const differenceIndex = otherPosition - startPosition;
278292
if (differenceIndex <= minInterval) {

test/no-doubled-joshi-test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ tester.run("no-double-joshi", rule, {
2929
// 並立助詞
3030
"台に登ったり降りたりする",
3131
"AとBとCを持ってきて",
32+
// "〜か〜か" のパターン
33+
// "〜かどうか" は例外として許容する(誤検知が起きにくいため)
34+
// https://jumonji-u.repo.nii.ac.jp/record/700/files/22-1.pdf
35+
// Issue: https://github.com/textlint-ja/textlint-rule-no-doubled-joshi/issues/62
36+
// https://www.jpf.go.jp/j/urawa/j_rsorcs/textbook/setsumei_pdf/setsumei16_2.pdf
37+
"これにするかどうか検討する",
38+
"ここがわたしたちの席かどうか確かめましょう。",
39+
"日本料理が好きかどうか聞いてください",
3240
// fix regression - https://travis-ci.org/textlint-ja/textlint-rule-preset-ja-technical-writing/builds/207700760#L720
3341
"慣用的表現、熟語、概数、固有名詞、副詞など、漢数字を使用することが一般的な語句では漢数字を使います。",
3442
// カッコ内は別のセンテンスとしてみなす

0 commit comments

Comments
 (0)