@@ -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 ) {
0 commit comments