@@ -5,12 +5,21 @@ import {getTokenizer} from "kuromojin";
5
5
import splitSentences , { Syntax as SentenceSyntax } from "sentence-splitter" ;
6
6
import StringSource from "textlint-util-to-string" ;
7
7
// 助詞どうか
8
- const is助詞Token = token => {
8
+ const is助詞Token = ( token ) => {
9
9
return token . pos === "助詞" ;
10
10
} ;
11
- const is読点Token = token => {
11
+ const is読点Token = ( token ) => {
12
12
return token . surface_form === "、" && token . pos === "名詞" ;
13
13
} ;
14
+ // 助詞tokenから品詞細分類1までを元にしたkeyを作る
15
+ const createKeyFromKey = ( token ) => {
16
+ // e.g.) は:助詞.係助詞
17
+ return `${ token . surface_form } :${ token . pos } .${ token . pos_detail_1 } `
18
+ } ;
19
+ // keyからsurfaceを取り出す
20
+ const restoreToSurfaceFromKey = ( key ) => {
21
+ return key . split ( ":" ) [ 0 ] ;
22
+ } ;
14
23
/**
15
24
* Create token map object
16
25
* {
@@ -23,11 +32,12 @@ const is読点Token = token => {
23
32
function createSurfaceKeyMap ( tokens ) {
24
33
// 助詞のみを対象とする
25
34
return tokens . filter ( is助詞Token ) . reduce ( ( keyMap , token ) => {
26
- // "は" : [token]
27
- if ( ! keyMap [ token . surface_form ] ) {
28
- keyMap [ token . surface_form ] = [ ] ;
35
+ // "は:助詞.係助詞" : [token]
36
+ const tokenKey = createKeyFromKey ( token ) ;
37
+ if ( ! keyMap [ tokenKey ] ) {
38
+ keyMap [ tokenKey ] = [ ] ;
29
39
}
30
- keyMap [ token . surface_form ] . push ( token ) ;
40
+ keyMap [ tokenKey ] . push ( token ) ;
31
41
return keyMap ;
32
42
} , { } ) ;
33
43
}
@@ -100,12 +110,13 @@ export default function (context, options = {}) {
100
110
101
111
joshiTokens = [tokenA, tokenB, tokenC, tokenD, tokenE, tokenF]
102
112
joshiTokenSurfaceKeyMap = {
103
- "は": [tokenA, tokenC, tokenE],
104
- "で": [tokenB, tokenD, tokenF]
113
+ "は:助詞.係助詞 ": [tokenA, tokenC, tokenE],
114
+ "で:助詞.係助詞 ": [tokenB, tokenD, tokenF]
105
115
}
106
116
*/
107
117
Object . keys ( joshiTokenSurfaceKeyMap ) . forEach ( key => {
108
- let tokens = joshiTokenSurfaceKeyMap [ key ] ;
118
+ const tokens = joshiTokenSurfaceKeyMap [ key ] ;
119
+ const joshiName = restoreToSurfaceFromKey ( key ) ;
109
120
// strict mode ではない時例外を除去する
110
121
if ( ! isStrict ) {
111
122
if ( matchExceptionRule ( tokens ) ) {
@@ -134,7 +145,7 @@ export default function (context, options = {}) {
134
145
// this is padding column start with 0 (== -1)
135
146
column : originalPosition . column
136
147
} ;
137
- report ( node , new RuleError ( `一文に二回以上利用されている助詞 "${ key } " がみつかりました。` , padding ) ) ;
148
+ report ( node , new RuleError ( `一文に二回以上利用されている助詞 "${ joshiName } " がみつかりました。` , padding ) ) ;
138
149
}
139
150
return current ;
140
151
} ) ;
0 commit comments