@@ -6,20 +6,21 @@ import {split as splitSentences, Syntax as SentenceSyntax} from "sentence-splitt
66import StringSource from "textlint-util-to-string" ;
77import {
88 is助詞Token , is読点Token ,
9- createKeyFromKey , restoreToSurfaceFromKey
9+ concatJoishiTokens ,
10+ createKeyFromKey ,
11+ restoreToSurfaceFromKey
1012} from "./token-utils" ;
1113/**
1214 * Create token map object
1315 * {
14- * "で": [token, token],
15- * "の": [token, token]
16+ * "は:助詞.係助詞": [token, token]
1617 * }
1718 * @param tokens
1819 * @returns {* }
1920 */
2021function createSurfaceKeyMap ( tokens ) {
2122 // 助詞のみを対象とする
22- return tokens . filter ( is助詞Token ) . reduce ( ( keyMap , token ) => {
23+ return tokens . reduce ( ( keyMap , token ) => {
2324 // "は:助詞.係助詞" : [token]
2425 const tokenKey = createKeyFromKey ( token ) ;
2526 if ( ! keyMap [ tokenKey ] ) {
@@ -70,7 +71,7 @@ export default function(context, options = {}) {
7071 const isStrict = options . strict || defaultOptions . strict ;
7172 const allow = options . allow || defaultOptions . allow ;
7273 const separatorChars = options . separatorChars || defaultOptions . separatorChars ;
73- const { Syntax, report, getSource , RuleError} = context ;
74+ const { Syntax, report, RuleError} = context ;
7475 return {
7576 [ Syntax . Paragraph ] ( node ) {
7677 if ( helper . isChildNode ( node , [ Syntax . Link , Syntax . Image , Syntax . BlockQuote , Syntax . Emphasis ] ) ) {
@@ -81,13 +82,18 @@ export default function(context, options = {}) {
8182 const isSentenceNode = node => {
8283 return node . type === SentenceSyntax . Sentence ;
8384 } ;
84- let sentences = splitSentences ( text , {
85+ const sentences = splitSentences ( text , {
8586 separatorChars : separatorChars
8687 } ) . filter ( isSentenceNode ) ;
8788 return getTokenizer ( ) . then ( tokenizer => {
8889 const checkSentence = ( sentence ) => {
89- let tokens = tokenizer . tokenizeForSentence ( sentence . raw ) ;
90- let countableTokens = tokens . filter ( token => {
90+ const tokens = tokenizer . tokenizeForSentence ( sentence . raw ) ;
91+ // 助詞 + 助詞は 一つの助詞として扱う
92+ // https://github.com/textlint-ja/textlint-rule-no-doubled-joshi/issues/15
93+ // 連語(助詞)の対応
94+ // http://www.weblio.jp/parts-of-speech/%E9%80%A3%E8%AA%9E(%E5%8A%A9%E8%A9%9E)_1
95+ const concatTokens = concatJoishiTokens ( tokens ) ;
96+ const countableTokens = concatTokens . filter ( token => {
9197 if ( isStrict ) {
9298 return is助詞Token ( token ) ;
9399 }
@@ -96,14 +102,14 @@ export default function(context, options = {}) {
96102 // https://github.com/azu/textlint-rule-no-doubled-joshi/issues/2
97103 return is助詞Token ( token ) || is読点Token ( token ) ;
98104 } ) ;
99- let joshiTokenSurfaceKeyMap = createSurfaceKeyMap ( countableTokens ) ;
105+ const joshiTokenSurfaceKeyMap = createSurfaceKeyMap ( countableTokens ) ;
100106 /*
101107 # Data Structure
102108
103109 joshiTokens = [tokenA, tokenB, tokenC, tokenD, tokenE, tokenF]
104110 joshiTokenSurfaceKeyMap = {
105- "は:助詞.係助詞": [tokenA, tokenC, tokenE],
106- "で:助詞.係助詞": [tokenB, tokenD, tokenF]
111+ "は:助詞.係助詞": [tokenA, tokenC, tokenE],
112+ "で:助詞.係助詞": [tokenB, tokenD, tokenF]
107113 }
108114 */
109115 Object . keys ( joshiTokenSurfaceKeyMap ) . forEach ( key => {
0 commit comments