Skip to content

Commit aa0b654

Browse files
committed
fix(4.3.5): "Code"のペアを見つけることができない問題を修正
対が同じ文字である"において、`code`によりStrが分断されていることにより、 ペアを探索できない問題があった <p>"<code>code</code>"</p> が正しく動作するように修正 refs #49
1 parent c81125a commit aa0b654

File tree

4 files changed

+43
-21
lines changed

4 files changed

+43
-21
lines changed

src/util/pair-checker.js

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

test/4.3.4-test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var tester = new TextLintTester();
66
tester.run("4.3.4.二重かぎかっこ『』", rule, {
77
valid: [
88
"彼は『『×××』を参照してください』と言った。",
9+
"彼は『『`×××`』を**参照**してください』と言った。",
910
`これは複数行の例
1011
1112
彼は『『×××』を参照してください』と言った。

test/4.3.5-test.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ var tester = new TextLintTester();
66
tester.run('4.3.5.二重引用符""', rule, {
77
valid: [
88
'彼は"×××"を参照してくださいと言った。',
9+
'彼は"`×××`"を参照してくださいと言った。',
10+
'彼は"**×××**"を参照してくださいと言った。',
911
`これは複数行の例
1012
1113
彼は"×××"を参照してくださいと言った。

test/4.3.7-test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var tester = new TextLintTester();
66
tester.run('4.3.7.山かっこ<>', rule, {
77
valid: [
88
'彼は<×××>を参照してくださいと言った。',
9+
'彼は<`×××`>を参照してくださいと言った。',
910
'- 彼は<×××>を参照してくださいと言った。'
1011
],
1112
invalid: [

0 commit comments

Comments
 (0)