@@ -4,17 +4,25 @@ import {RuleHelper} from "textlint-rule-helper";
4
4
import { getTokenizer } from "kuromojin" ;
5
5
import splitSentences , { Syntax as SentenceSyntax } from "sentence-splitter" ;
6
6
import StringSource from "textlint-util-to-string" ;
7
+ // 助詞どうか
8
+ const is助詞Token = token => {
9
+ return token . pos === "助詞" ;
10
+ } ;
11
+ const is読点Token = token => {
12
+ return token . surface_form === "、" && token . pos === "名詞" ;
13
+ } ;
7
14
/**
8
- * create a object that
9
- * map = {
10
- * // these token.surface_form === "Hoge"
11
- * "Hoge" [token, token]
15
+ * Create token map object
16
+ * {
17
+ * "で": [ token, token],
18
+ * "の": [token, token]
12
19
* }
13
20
* @param tokens
14
21
* @returns {* }
15
22
*/
16
23
function createSurfaceKeyMap ( tokens ) {
17
- return tokens . reduce ( ( keyMap , token ) => {
24
+ // 助詞のみを対象とする
25
+ return tokens . filter ( is助詞Token ) . reduce ( ( keyMap , token ) => {
18
26
// "は" : [token]
19
27
if ( ! keyMap [ token . surface_form ] ) {
20
28
keyMap [ token . surface_form ] = [ ] ;
@@ -43,7 +51,6 @@ const defaultOptions = {
43
51
strict : false
44
52
} ;
45
53
46
-
47
54
/*
48
55
1. Paragraph Node -> text
49
56
2. text -> sentences
@@ -74,11 +81,16 @@ export default function (context, options = {}) {
74
81
return getTokenizer ( ) . then ( tokenizer => {
75
82
const checkSentence = ( sentence ) => {
76
83
let tokens = tokenizer . tokenizeForSentence ( sentence . raw ) ;
77
- const isJoshiToken = token => {
78
- return token . pos === "助詞" ;
79
- } ;
80
- let joshiTokens = tokens . filter ( isJoshiToken ) ;
81
- let joshiTokenSurfaceKeyMap = createSurfaceKeyMap ( joshiTokens ) ;
84
+ let countableTokens = tokens . filter ( token => {
85
+ if ( isStrict ) {
86
+ return is助詞Token ( token ) ;
87
+ }
88
+ // デフォルトでは、"、"を間隔値の距離としてカウントする
89
+ // "、" があると助詞同士の距離が開くようにすることで、並列的な"、"の使い方を許容する目的
90
+ // https://github.com/azu/textlint-rule-no-doubled-joshi/issues/2
91
+ return is助詞Token ( token ) || is読点Token ( token ) ;
92
+ } ) ;
93
+ let joshiTokenSurfaceKeyMap = createSurfaceKeyMap ( countableTokens ) ;
82
94
/*
83
95
# Data Structure
84
96
@@ -102,8 +114,8 @@ export default function (context, options = {}) {
102
114
// if found differenceIndex less than
103
115
// tokes are sorted ascending order
104
116
tokens . reduce ( ( prev , current ) => {
105
- let startPosition = joshiTokens . indexOf ( prev ) ;
106
- let otherPosition = joshiTokens . indexOf ( current ) ;
117
+ let startPosition = countableTokens . indexOf ( prev ) ;
118
+ let otherPosition = countableTokens . indexOf ( current ) ;
107
119
// if difference
108
120
let differenceIndex = otherPosition - startPosition ;
109
121
if ( differenceIndex <= minInterval ) {
0 commit comments