diff --git a/lib/rules.js b/lib/rules.js index 7c59e0d1..20ba2921 100644 --- a/lib/rules.js +++ b/lib/rules.js @@ -4,7 +4,8 @@ var shared = require("./shared"); // Returns the indent for a token function indentFor(token) { - return token.line.length - token.line.trimLeft().length; + var line = token.line.replace(/^[\s>]*(> |>)/, ""); + return line.length - line.trimLeft().length; } // Returns the heading style for a heading token @@ -575,17 +576,17 @@ module.exports = [ "tags": [ "blockquote", "whitespace", "indentation" ], "aliases": [ "no-multiple-space-blockquote" ], "func": function MD027(params, errors) { - var inBlockquote = false; + var blockquoteNesting = 0; params.tokens.forEach(function forToken(token) { if (token.type === "blockquote_open") { - inBlockquote = true; + blockquoteNesting++; } else if (token.type === "blockquote_close") { - inBlockquote = false; - } else if ((token.type === "inline") && inBlockquote) { + blockquoteNesting--; + } else if ((token.type === "inline") && (blockquoteNesting > 0)) { token.content.split(shared.newLineRe) .forEach(function forLine(line, offset) { if (/^\s/.test(line) || - (!offset && /^\s*>\s\s/.test(token.line))) { + (!offset && /^(\s*>)+\s\s/.test(token.line))) { errors.push(token.lineNumber + offset); } }); @@ -622,7 +623,7 @@ module.exports = [ if (!list.unordered) { var number = 1; list.items.forEach(function forItem(item) { - var re = new RegExp("^\\s*" + String(number) + "\\."); + var re = new RegExp("^[\\s>]*" + String(number) + "\\."); if (!re.test(item.line)) { errors.push(item.lineNumber); } @@ -652,7 +653,7 @@ module.exports = [ (allSingle ? ulSingle : ulMulti) : (allSingle ? olSingle : olMulti); list.items.forEach(function forItem(item) { - var match = /^\s*\S+(\s+)/.exec(item.line); + var match = /^[\s>]*\S+(\s+)/.exec(item.line); if (!match || (match[1].length !== expectedSpaces)) { errors.push(item.lineNumber); } diff --git a/test/blockquote-spaces-nested.md b/test/blockquote-spaces-nested.md new file mode 100644 index 00000000..3d4a1ab9 --- /dev/null +++ b/test/blockquote-spaces-nested.md @@ -0,0 +1,59 @@ +# Nested blockquote + +> A {MD027} +> +> > B {MD027} +> +> C {MD027} + +Text + +> A {MD027} +> +> > B {MD027} +> > +> > > C {MD027} +> > +> > D {MD027} +> +> E {MD027} + +Text + +> A {MD027} +> +>> B {MD027} +>> +>>> C {MD027} +>> +>> D {MD027} +> +> E {MD027} + +Text + +> > Text {MD027} + +Text + + > > Text {MD027} + +Text + + > > Text {MD027} + +Text + +> > Text {MD027} + +Text + +> > > Text {MD027} + +Text + +> > > > Text {MD027} + +Text + +>> >> Text {MD027} diff --git a/test/lists-in-blockquote.md b/test/lists-in-blockquote.md new file mode 100644 index 00000000..f34d9864 --- /dev/null +++ b/test/lists-in-blockquote.md @@ -0,0 +1,64 @@ +# Lists in blockquote + +> 1. The simplest ordered list in blockquote + +Text + +> + The simplest unordered list in blockquote + +Text + +>1. Item + +Text + +>+ Item + +Text + +>1. Item {MD030} + +Text + +>+ Item {MD030} + +Text + +> 1. Item +> 1. Item {MD027} + +Text + +> - Item +> - Item {MD027} + +Text + + > 1. Item + > 1. Item {MD027} + > 1. Item {MD027} {MD030} + +Text + + > * Item + > * Item {MD027} + > * Item {MD027} {MD030} + > * Item {MD027} {MD005} + > * Item {MD027} {MD005} + +Text + + > Text + > > - Item + > > - Item {MD027} + > > - Item + > > > - Item + > > > - Item {MD027} + > > > - Item {MD027} + +Text + +>* Item +> * Item +>>* Item +>> * Item