Skip to content

Commit

Permalink
Fix multiple of 3 rule for emphasis parsing (see commonmark/cmark#177)
Browse files Browse the repository at this point in the history
  • Loading branch information
robinst committed Aug 24, 2017
1 parent abe7269 commit ba53b35
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 10 deletions.
10 changes: 8 additions & 2 deletions commonmark/src/main/java/org/commonmark/internal/Delimiter.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public class Delimiter implements DelimiterRun {
public Delimiter previous;
public Delimiter next;

public int numDelims = 1;
public int length = 1;
public int originalLength = 1;

public Delimiter(Text node, char delimiterChar, boolean canOpen, boolean canClose, Delimiter previous) {
this.node = node;
Expand All @@ -46,6 +47,11 @@ public boolean canClose() {

@Override
public int length() {
return numDelims;
return length;
}

@Override
public int originalLength() {
return originalLength;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -448,15 +448,16 @@ private boolean parseDelimiters(DelimiterProcessor delimiterProcessor, char deli
if (res == null) {
return false;
}
int numDelims = res.count;
int length = res.count;
int startIndex = index;

index += numDelims;
index += length;
Text node = appendText(input, startIndex, index);

// Add entry to stack for this opener
lastDelimiter = new Delimiter(node, delimiterChar, res.canOpen, res.canClose, lastDelimiter);
lastDelimiter.numDelims = numDelims;
lastDelimiter.length = length;
lastDelimiter.originalLength = length;
if (lastDelimiter.previous != null) {
lastDelimiter.previous.next = lastDelimiter;
}
Expand Down Expand Up @@ -853,8 +854,8 @@ private void processDelimiters(Delimiter stackBottom) {
Text closerNode = closer.node;

// Remove number of used delimiters from stack and inline nodes.
opener.numDelims -= useDelims;
closer.numDelims -= useDelims;
opener.length -= useDelims;
closer.length -= useDelims;
openerNode.setLiteral(
openerNode.getLiteral().substring(0,
openerNode.getLiteral().length() - useDelims));
Expand All @@ -869,11 +870,11 @@ private void processDelimiters(Delimiter stackBottom) {
delimiterProcessor.process(openerNode, closerNode, useDelims);

// No delimiter characters left to process, so we can remove delimiter and the now empty node.
if (opener.numDelims == 0) {
if (opener.length == 0) {
removeDelimiterAndNode(opener);
}

if (closer.numDelims == 0) {
if (closer.length == 0) {
Delimiter next = closer.next;
removeDelimiterAndNode(closer);
closer = next;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public int getMinLength() {
@Override
public int getDelimiterUse(DelimiterRun opener, DelimiterRun closer) {
// "multiple of 3" rule for internal delimiter runs
if ((opener.canClose() || closer.canOpen()) && (opener.length() + closer.length()) % 3 == 0) {
if ((opener.canClose() || closer.canOpen()) && (opener.originalLength() + closer.originalLength()) % 3 == 0) {
return 0;
}
// calculate actual number of delimiters used from this closer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,10 @@ public interface DelimiterRun {
* @return the number of characters in this delimiter run (that are left for processing)
*/
int length();

/**
* @return the number of characters originally in this delimiter run; at the start of processing, this is the same
* as {{@link #length()}}
*/
int originalLength();
}
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,15 @@ public void linkLabelLength() {
"<p>[foo][12" + label2 + "]</p>\n<p>[12" + label2 + "]: /</p>\n");
}

// commonmark/CommonMark#468
@Test
public void linkReferenceBackslash() {
assertRendering("[\\]: test", "<p>[]: test</p>\n");
}

// commonmark/cmark#177
@Test
public void emphasisMultipleOf3Rule() {
assertRendering("a***b* c*", "<p>a*<em><em>b</em> c</em></p>\n");
}
}

0 comments on commit ba53b35

Please sign in to comment.