@@ -6,6 +6,17 @@ import {getTokenizer} from "kuromojin";
66import splitSentences from "sentence-splitter" ;
77import Source from "structured-source" ;
88const defaultOptions = { max : 3 } ;
9+
10+ function isSandwichedMeishi ( {
11+ before,
12+ token,
13+ after
14+ } ) {
15+ if ( before === undefined || after === undefined || token === undefined ) {
16+ return false ;
17+ }
18+ return before . pos === "名詞" && after . pos === "名詞" ;
19+ }
920/**
1021 * @param {RuleContext } context
1122 * @param {object } options
@@ -37,9 +48,18 @@ export default function (context, options = {}) {
3748 let currentTenCount = 0 ;
3849 let tokens = tokenizer . tokenizeForSentence ( text ) ;
3950 let lastToken = null ;
40- tokens . forEach ( token => {
51+ tokens . forEach ( ( token , index ) => {
4152 let surface = token . surface_form ;
4253 if ( surface === "、" ) {
54+ // 名詞に過去まわれている場合は例外とする
55+ let isSandwiched = isSandwichedMeishi ( {
56+ before : tokens [ index - 1 ] ,
57+ token : token ,
58+ after : tokens [ index + 1 ]
59+ } ) ;
60+ if ( isSandwiched ) {
61+ return ;
62+ }
4363 currentTenCount ++ ;
4464 lastToken = token ;
4565 }
@@ -51,8 +71,8 @@ export default function (context, options = {}) {
5171 if ( currentTenCount >= maxLen ) {
5272 let position = source . indexToPosition ( lastToken . word_position - 1 ) ;
5373 let ruleError = new context . RuleError ( `一つの文で"、"を${ maxLen } つ以上使用しています` , {
54- line : position . line - 1 ,
55- column :position . column
74+ line : position . line - 1 ,
75+ column : position . column
5676 } ) ;
5777 report ( node , ruleError ) ;
5878 currentTenCount = 0 ;
0 commit comments