@@ -45,8 +45,8 @@ function createSurfaceKeyMap(tokens: KuromojiToken[]): { [index: string]: Kuromo
45
45
) ;
46
46
}
47
47
48
- function matchExceptionRule ( tokens : KuromojiToken [ ] ) {
49
- const token = tokens [ 0 ] ;
48
+ function matchExceptionRule ( joshiTokens : KuromojiToken [ ] , allTokens : KuromojiToken [ ] ) {
49
+ const token = joshiTokens [ 0 ] ;
50
50
// "の" の重なりは例外
51
51
if ( token . pos_detail_1 === "連体化" ) {
52
52
return true ;
@@ -61,9 +61,23 @@ function matchExceptionRule(tokens: KuromojiToken[]) {
61
61
}
62
62
// 並立助詞は例外
63
63
// 登ったり降りたり
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
+ ) {
65
69
return true ;
66
70
}
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
+ }
67
81
return false ;
68
82
}
69
83
@@ -216,8 +230,8 @@ const report: TextlintRuleModule<Options> = function (context, options = {}) {
216
230
// https://github.com/textlint-ja/textlint-rule-no-doubled-joshi/issues/15
217
231
// 連語(助詞)の対応
218
232
// 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 ) => {
221
235
if ( isStrict ) {
222
236
return is助詞Token ( token ) ;
223
237
}
@@ -242,7 +256,7 @@ const report: TextlintRuleModule<Options> = function (context, options = {}) {
242
256
}
243
257
return is助詞Token ( token ) ;
244
258
} ) ;
245
- const joshiTokenSurfaceKeyMap = createSurfaceKeyMap ( countableTokens ) ;
259
+ const joshiTokenSurfaceKeyMap = createSurfaceKeyMap ( countableJoshiTokens ) ;
246
260
/*
247
261
# Data Structure
248
262
@@ -261,7 +275,7 @@ const report: TextlintRuleModule<Options> = function (context, options = {}) {
261
275
}
262
276
// strict mode ではない時例外を除去する
263
277
if ( ! isStrict ) {
264
- if ( matchExceptionRule ( joshiTokenSurfaceTokens ) ) {
278
+ if ( matchExceptionRule ( joshiTokenSurfaceTokens , tokens ) ) {
265
279
return ;
266
280
}
267
281
}
@@ -271,8 +285,8 @@ const report: TextlintRuleModule<Options> = function (context, options = {}) {
271
285
// if found differenceIndex less than
272
286
// tokes are sorted ascending order
273
287
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 ) ;
276
290
// 助詞token同士の距離が設定値以下ならエラーを報告する
277
291
const differenceIndex = otherPosition - startPosition ;
278
292
if ( differenceIndex <= minInterval ) {
0 commit comments