@@ -15,47 +15,65 @@ export function checkPair(context, {left, right}) {
1515 let { Syntax, RuleError, report, getSource} = context ;
1616 let helper = new RuleHelper ( context ) ;
1717 let isInParagraph = false ;
18- let matchParentheses = [ ] ;
18+ let currentStrInParagraph = [ ] ;
19+ /**
20+ * `Str` nodeの配列を受け取り、pairが見つからないnodeを返す
21+ * @param {Object } currentStrInParagraph
22+ * @returns {{node, index}[] }
23+ */
24+ const foundMissingPairNodes = ( currentStrInParagraph ) => {
25+ let foundLeft = false ;
26+ let matchParentheses = [ ] ;
27+ currentStrInParagraph . forEach ( node => {
28+ const text = getSource ( node ) ;
29+ // left を探す
30+ let leftIndex = - 1 ;
31+ if ( ! foundLeft ) {
32+ leftIndex = text . indexOf ( left ) ;
33+ if ( leftIndex !== - 1 ) {
34+ matchParentheses . push ( {
35+ node,
36+ index : leftIndex
37+ } ) ;
38+ foundLeft = true
39+ }
40+ }
41+ // right を探す
42+ let pairIndex = text . indexOf ( right , leftIndex + 1 ) ;
43+ if ( pairIndex !== - 1 ) {
44+ matchParentheses . pop ( ) ;
45+ foundLeft = false ;
46+ }
47+ } ) ;
48+ return matchParentheses ;
49+ } ;
1950 return {
2051 [ Syntax . Paragraph ] ( node ) {
2152 if ( helper . isChildNode ( node , [ Syntax . BlockQuote ] ) ) {
2253 return ;
2354 }
55+ currentStrInParagraph = [ ] ;
2456 isInParagraph = true
2557 } ,
2658 [ Syntax . Str ] ( node ) {
2759 if ( ! isInParagraph ) {
2860 return ;
2961 }
30- let text = getSource ( node ) ;
31- // left を探す
32- let index = text . indexOf ( left ) ;
33- if ( index !== - 1 ) {
34- matchParentheses . push ( {
35- node,
36- index
37- } ) ;
38- }
39- // right を探す
40- let pairIndex = text . indexOf ( right , index + 1 ) ;
41- if ( pairIndex !== - 1 ) {
42- matchParentheses . pop ( ) ;
43- }
62+ currentStrInParagraph . push ( node ) ;
4463 } ,
45- [ `${ Syntax . Paragraph } :exit` ] ( node ) {
64+ [ `${ Syntax . Paragraph } :exit` ] ( ) {
65+ const missingPairList = foundMissingPairNodes ( currentStrInParagraph ) ;
66+ // 探索おわり
4667 isInParagraph = false ;
4768 // 全ての対が見つかったなら配列は空になる
48- if ( matchParentheses . length === 0 ) {
69+ if ( missingPairList . length === 0 ) {
4970 return ;
5071 }
51-
52- matchParentheses . forEach ( ( { node, index} ) => {
72+ missingPairList . forEach ( ( { node, index} ) => {
5373 report ( node , new RuleError ( `${ left } の対となる${ right } が見つかりません。${ left } ${ right } ` , {
5474 index
5575 } ) ) ;
5676 } ) ;
57- // clear state
58- matchParentheses = [ ] ;
5977 }
6078 } ;
6179
0 commit comments