From bb0d8a36b320e2f295388ee3cc0a0f638f12c7eb Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 27 Aug 2015 22:49:59 -0700 Subject: [PATCH] Update fence logic to handle nested fences (per CommonMark spec; no handling of indentation). http://spec.commonmark.org/0.22/#fenced-code-blocks --- lib/rules.js | 7 ++- test/fenced_code_with_nesting.md | 73 ++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 test/fenced_code_with_nesting.md diff --git a/lib/rules.js b/lib/rules.js index 21b5950c..008c2cfb 100644 --- a/lib/rules.js +++ b/lib/rules.js @@ -40,12 +40,17 @@ function filterTokens(params, type, callback) { function forEachLine(params, callback) { if (!params.forEachLine) { var lineMetadata = new Array(params.lines.length); + var fenceStart = null; var inFence = false; // Find fenced code by pattern (parser ignores "``` close fence") params.lines.forEach(function forLine(line, lineIndex) { var metadata = 0; - if (/^(```|~~~)/.test(line)) { + var match = /^(`{3,}|~{3,})/.exec(line); + var fence = match && match[1]; + if (fence && + (!inFence || (fence.substr(0, fenceStart.length) === fenceStart))) { metadata = inFence ? -2 : 2; + fenceStart = inFence ? null : fence; inFence = !inFence; } else if (inFence) { metadata = 1; diff --git a/test/fenced_code_with_nesting.md b/test/fenced_code_with_nesting.md new file mode 100644 index 00000000..373399e5 --- /dev/null +++ b/test/fenced_code_with_nesting.md @@ -0,0 +1,73 @@ +# header + +text +```fence {MD031} +code +``` {MD031} +text +~~~fence {MD031} +code +~~~ {MD031} +text +```fence {MD031} +~~~fence +code +~~~ +``` {MD031} +text +~~~fence {MD031} +```fence +code +``` +~~~ {MD031} +text +```fence {MD031} + +~~~fence +code +~~~ + +``` {MD031} +text +~~~fence {MD031} + +```fence +code +``` + +~~~ {MD031} +text +```fence {MD031} +code +~~~ +``` {MD031} +text +~~~fence {MD031} +code +``` +~~~ {MD031} +text +````fence {MD031} +```fence +code +``` +```` {MD031} +text +~~~~fence {MD031} +~~~fence +code +~~~ +~~~~ {MD031} +text +````fence {MD031} +```fence +code +``` +````` {MD031} +text +~~~~fence {MD031} +~~~fence +code +~~~ +~~~~~ {MD031} +text