Fix definition lists requiring 3 spaces after the marker (#384)
This commit is contained in:
1 parent
5a326ef5b7
commit
463eec7085
3 files changed
+70
-23
No files matched your search
@@ -101,7 +101,7 @@ namespace Markdig.Tests.Specs.DefinitionLists
|
||||
TestParser.TestSpec("Term 1\n\n: Definition\nwith lazy continuation.\n\n Second paragraph of the definition.", "<dl>\n<dt>Term 1</dt>\n<dd><p>Definition\nwith lazy continuation.</p>\n<p>Second paragraph of the definition.</p>\n</dd>\n</dl>", "definitionlists+attributes|advanced", context: "Example 2\nSection Extensions / Definition lists\n");
|
||||
}
|
||||
|
||||
// The definition must be indented to 4 characters including the `:`.
|
||||
// The `:` or `~` must be followed by at least one space or tab. A single space is enough:
|
||||
[Test]
|
||||
public void ExtensionsDefinitionLists_Example003()
|
||||
{
|
||||
@@ -109,17 +109,26 @@ namespace Markdig.Tests.Specs.DefinitionLists
|
||||
// Section: Extensions / Definition lists
|
||||
//
|
||||
// The following Markdown:
|
||||
// Term 1
|
||||
// : Invalid with less than 3 characters
|
||||
// First Term
|
||||
// : This is the definition of the first term.
|
||||
//
|
||||
// Second Term
|
||||
// : This is one definition of the second term.
|
||||
// ~ This is another definition of the second term.
|
||||
//
|
||||
// Should be rendered as:
|
||||
// <p>Term 1
|
||||
// : Invalid with less than 3 characters</p>
|
||||
// <dl>
|
||||
// <dt>First Term</dt>
|
||||
// <dd>This is the definition of the first term.</dd>
|
||||
// <dt>Second Term</dt>
|
||||
// <dd>This is one definition of the second term.</dd>
|
||||
// <dd>This is another definition of the second term.</dd>
|
||||
// </dl>
|
||||
|
||||
TestParser.TestSpec("Term 1\n: Invalid with less than 3 characters", "<p>Term 1\n: Invalid with less than 3 characters</p>", "definitionlists+attributes|advanced", context: "Example 3\nSection Extensions / Definition lists\n");
|
||||
TestParser.TestSpec("First Term\n: This is the definition of the first term.\n\nSecond Term\n: This is one definition of the second term.\n~ This is another definition of the second term.", "<dl>\n<dt>First Term</dt>\n<dd>This is the definition of the first term.</dd>\n<dt>Second Term</dt>\n<dd>This is one definition of the second term.</dd>\n<dd>This is another definition of the second term.</dd>\n</dl>", "definitionlists+attributes|advanced", context: "Example 3\nSection Extensions / Definition lists\n");
|
||||
}
|
||||
|
||||
// The `:` can be indented up to 3 spaces:
|
||||
// Without a space or tab after the `:`, the line is not a definition:
|
||||
[Test]
|
||||
public void ExtensionsDefinitionLists_Example004()
|
||||
{
|
||||
@@ -128,6 +137,24 @@ namespace Markdig.Tests.Specs.DefinitionLists
|
||||
//
|
||||
// The following Markdown:
|
||||
// Term 1
|
||||
// :Invalid without a space after the colon
|
||||
//
|
||||
// Should be rendered as:
|
||||
// <p>Term 1
|
||||
// :Invalid without a space after the colon</p>
|
||||
|
||||
TestParser.TestSpec("Term 1\n:Invalid without a space after the colon", "<p>Term 1\n:Invalid without a space after the colon</p>", "definitionlists+attributes|advanced", context: "Example 4\nSection Extensions / Definition lists\n");
|
||||
}
|
||||
|
||||
// The `:` can be indented up to 3 spaces:
|
||||
[Test]
|
||||
public void ExtensionsDefinitionLists_Example005()
|
||||
{
|
||||
// Example 5
|
||||
// Section: Extensions / Definition lists
|
||||
//
|
||||
// The following Markdown:
|
||||
// Term 1
|
||||
// : Valid even if `:` starts at most 3 spaces
|
||||
//
|
||||
// Should be rendered as:
|
||||
@@ -136,14 +163,14 @@ namespace Markdig.Tests.Specs.DefinitionLists
|
||||
// <dd>Valid even if <code>:</code> starts at most 3 spaces</dd>
|
||||
// </dl>
|
||||
|
||||
TestParser.TestSpec("Term 1\n : Valid even if `:` starts at most 3 spaces", "<dl>\n<dt>Term 1</dt>\n<dd>Valid even if <code>:</code> starts at most 3 spaces</dd>\n</dl>", "definitionlists+attributes|advanced", context: "Example 4\nSection Extensions / Definition lists\n");
|
||||
TestParser.TestSpec("Term 1\n : Valid even if `:` starts at most 3 spaces", "<dl>\n<dt>Term 1</dt>\n<dd>Valid even if <code>:</code> starts at most 3 spaces</dd>\n</dl>", "definitionlists+attributes|advanced", context: "Example 5\nSection Extensions / Definition lists\n");
|
||||
}
|
||||
|
||||
// But more than 3 spaces before `:` will trigger an indented code block:
|
||||
[Test]
|
||||
public void ExtensionsDefinitionLists_Example005()
|
||||
public void ExtensionsDefinitionLists_Example006()
|
||||
{
|
||||
// Example 5
|
||||
// Example 6
|
||||
// Section: Extensions / Definition lists
|
||||
//
|
||||
// The following Markdown:
|
||||
@@ -156,14 +183,14 @@ namespace Markdig.Tests.Specs.DefinitionLists
|
||||
// <pre><code>: Not valid
|
||||
// </code></pre>
|
||||
|
||||
TestParser.TestSpec("Term 1\n\n : Not valid", "<p>Term 1</p>\n<pre><code>: Not valid\n</code></pre>", "definitionlists+attributes|advanced", context: "Example 5\nSection Extensions / Definition lists\n");
|
||||
TestParser.TestSpec("Term 1\n\n : Not valid", "<p>Term 1</p>\n<pre><code>: Not valid\n</code></pre>", "definitionlists+attributes|advanced", context: "Example 6\nSection Extensions / Definition lists\n");
|
||||
}
|
||||
|
||||
// Definition lists can be nested inside list items
|
||||
[Test]
|
||||
public void ExtensionsDefinitionLists_Example006()
|
||||
public void ExtensionsDefinitionLists_Example007()
|
||||
{
|
||||
// Example 6
|
||||
// Example 7
|
||||
// Section: Extensions / Definition lists
|
||||
//
|
||||
// The following Markdown:
|
||||
@@ -189,7 +216,7 @@ namespace Markdig.Tests.Specs.DefinitionLists
|
||||
// </dl></li>
|
||||
// </ol>
|
||||
|
||||
TestParser.TestSpec("1. First\n \n2. Second\n \n Term 1\n : Definition\n \n Term 2\n : Second Definition", "<ol>\n<li><p>First</p></li>\n<li><p>Second</p>\n<dl>\n<dt>Term 1</dt>\n<dd>Definition</dd>\n<dt>Term 2</dt>\n<dd>Second Definition</dd>\n</dl></li>\n</ol>", "definitionlists+attributes|advanced", context: "Example 6\nSection Extensions / Definition lists\n");
|
||||
TestParser.TestSpec("1. First\n \n2. Second\n \n Term 1\n : Definition\n \n Term 2\n : Second Definition", "<ol>\n<li><p>First</p></li>\n<li><p>Second</p>\n<dl>\n<dt>Term 1</dt>\n<dd>Definition</dd>\n<dt>Term 2</dt>\n<dd>Second Definition</dd>\n</dl></li>\n</ol>", "definitionlists+attributes|advanced", context: "Example 7\nSection Extensions / Definition lists\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -72,14 +72,33 @@ with lazy continuation.</p>
|
||||
</dl>
|
||||
````````````````````````````````
|
||||
|
||||
The definition must be indented to 4 characters including the `:`.
|
||||
The `:` or `~` must be followed by at least one space or tab. A single space is enough:
|
||||
|
||||
```````````````````````````````` example
|
||||
First Term
|
||||
: This is the definition of the first term.
|
||||
|
||||
Second Term
|
||||
: This is one definition of the second term.
|
||||
~ This is another definition of the second term.
|
||||
.
|
||||
<dl>
|
||||
<dt>First Term</dt>
|
||||
<dd>This is the definition of the first term.</dd>
|
||||
<dt>Second Term</dt>
|
||||
<dd>This is one definition of the second term.</dd>
|
||||
<dd>This is another definition of the second term.</dd>
|
||||
</dl>
|
||||
````````````````````````````````
|
||||
|
||||
Without a space or tab after the `:`, the line is not a definition:
|
||||
|
||||
```````````````````````````````` example
|
||||
Term 1
|
||||
: Invalid with less than 3 characters
|
||||
:Invalid without a space after the colon
|
||||
.
|
||||
<p>Term 1
|
||||
: Invalid with less than 3 characters</p>
|
||||
:Invalid without a space after the colon</p>
|
||||
````````````````````````````````
|
||||
|
||||
The `:` can be indented up to 3 spaces:
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// This file is licensed under the BSD-Clause 2 license.
|
||||
// See the license.txt file in the project root for more information.
|
||||
|
||||
using Markdig.Helpers;
|
||||
using Markdig.Parsers;
|
||||
using Markdig.Syntax;
|
||||
|
||||
@@ -35,12 +36,12 @@ public class DefinitionListParser : BlockParser
|
||||
var startPosition = processor.Start;
|
||||
|
||||
var column = processor.ColumnBeforeIndent;
|
||||
processor.NextChar();
|
||||
var c = processor.NextChar();
|
||||
processor.ParseIndent();
|
||||
var delta = processor.Column - column;
|
||||
|
||||
// We expect to have a least
|
||||
if (delta < 4)
|
||||
// The marker must be followed by at least one space or tab
|
||||
if (!c.IsSpaceOrTab())
|
||||
{
|
||||
// Return back to original position
|
||||
processor.GoToColumn(column);
|
||||
@@ -144,12 +145,12 @@ public class DefinitionListParser : BlockParser
|
||||
{
|
||||
var startPosition = processor.Start;
|
||||
var column = processor.ColumnBeforeIndent;
|
||||
processor.NextChar();
|
||||
var c = processor.NextChar();
|
||||
processor.ParseIndent();
|
||||
var delta = processor.Column - column;
|
||||
|
||||
// We expect to have a least
|
||||
if (delta < 4)
|
||||
// The marker must be followed by at least one space or tab
|
||||
if (!c.IsSpaceOrTab())
|
||||
{
|
||||
// Remove the blankline before breaking this definition item
|
||||
if (lastBlankLine != null)
|
||||
|
||||
Reference in new issue
Block a user