Skip to content

Commit

Permalink
fix(4.3.5): "Code"のペアを見つけることができない問題を修正
Browse files Browse the repository at this point in the history
対が同じ文字である"において、`code`によりStrが分断されていることにより、
ペアを探索できない問題があった

<p>"<code>code</code>"</p>

が正しく動作するように修正

refs #49
  • Loading branch information
azu committed Jul 13, 2016
1 parent c81125a commit aa0b654
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 21 deletions.
60 changes: 39 additions & 21 deletions src/util/pair-checker.js
Expand Up @@ -15,47 +15,65 @@ export function checkPair(context, {left, right}) {
let {Syntax, RuleError, report, getSource} = context;
let helper = new RuleHelper(context);
let isInParagraph = false;
let matchParentheses = [];
let currentStrInParagraph = [];
/**
* `Str` nodeの配列を受け取り、pairが見つからないnodeを返す
* @param {Object} currentStrInParagraph
* @returns {{node, index}[]}
*/
const foundMissingPairNodes = (currentStrInParagraph) => {
let foundLeft = false;
let matchParentheses = [];
currentStrInParagraph.forEach(node => {
const text = getSource(node);
// left を探す
let leftIndex = -1;
if (!foundLeft) {
leftIndex = text.indexOf(left);
if (leftIndex !== -1) {
matchParentheses.push({
node,
index: leftIndex
});
foundLeft = true
}
}
// right を探す
let pairIndex = text.indexOf(right, leftIndex + 1);
if (pairIndex !== -1) {
matchParentheses.pop();
foundLeft = false;
}
});
return matchParentheses;
};
return {
[Syntax.Paragraph](node){
if (helper.isChildNode(node, [Syntax.BlockQuote])) {
return;
}
currentStrInParagraph = [];
isInParagraph = true
},
[Syntax.Str](node){
if (!isInParagraph) {
return;
}
let text = getSource(node);
// left を探す
let index = text.indexOf(left);
if (index !== -1) {
matchParentheses.push({
node,
index
});
}
// right を探す
let pairIndex = text.indexOf(right, index + 1);
if (pairIndex !== -1) {
matchParentheses.pop();
}
currentStrInParagraph.push(node);
},
[`${Syntax.Paragraph}:exit`](node){
[`${Syntax.Paragraph}:exit`](){
const missingPairList = foundMissingPairNodes(currentStrInParagraph);
// 探索おわり
isInParagraph = false;
// 全ての対が見つかったなら配列は空になる
if (matchParentheses.length === 0) {
if (missingPairList.length === 0) {
return;
}

matchParentheses.forEach(({node, index}) => {
missingPairList.forEach(({node, index}) => {
report(node, new RuleError(`${left}の対となる${right}が見つかりません。${left}${right}`, {
index
}));
});
// clear state
matchParentheses = [];
}
};

Expand Down
1 change: 1 addition & 0 deletions test/4.3.4-test.js
Expand Up @@ -6,6 +6,7 @@ var tester = new TextLintTester();
tester.run("4.3.4.二重かぎかっこ『』", rule, {
valid: [
"彼は『『×××』を参照してください』と言った。",
"彼は『『`×××`』を**参照**してください』と言った。",
`これは複数行の例
彼は『『×××』を参照してください』と言った。
Expand Down
2 changes: 2 additions & 0 deletions test/4.3.5-test.js
Expand Up @@ -6,6 +6,8 @@ var tester = new TextLintTester();
tester.run('4.3.5.二重引用符""', rule, {
valid: [
'彼は"×××"を参照してくださいと言った。',
'彼は"`×××`"を参照してくださいと言った。',
'彼は"**×××**"を参照してくださいと言った。',
`これは複数行の例
彼は"×××"を参照してくださいと言った。
Expand Down
1 change: 1 addition & 0 deletions test/4.3.7-test.js
Expand Up @@ -6,6 +6,7 @@ var tester = new TextLintTester();
tester.run('4.3.7.山かっこ<>', rule, {
valid: [
'彼は<×××>を参照してくださいと言った。',
'彼は<`×××`>を参照してくださいと言った。',
'- 彼は<×××>を参照してくださいと言った。'
],
invalid: [
Expand Down

0 comments on commit aa0b654

Please sign in to comment.