cmark

My personal build of CMark ✏️

Commit
b142a396090798ed06e89475dcf6fd77362e312f
Parent
694a826bf0caef60330e3f4fcd195611a70ec77e
Author
John MacFarlane <jgm@berkeley.edu>
Date

Fixed #214 C and JS implementations.

They were gobbling whitespace after shortcut reference links, e.g.

[foo] bar

[foo]: url

Closes #214.

Diffstat

2 files changed, 13 insertions, 1 deletion

Status File Name N° Changes Insertions Deletions
Modified js/lib/inlines.js 4 4 0
Modified src/inlines.c 10 9 1
diff --git a/js/lib/inlines.js b/js/lib/inlines.js
@@ -575,6 +575,10 @@ var parseCloseBracket = function(inlines) {
         } else {
             reflabel = this.subject.slice(beforelabel, beforelabel + n);
         }
+        if (n === 0) {
+            // If shortcut reference link, rewind before spaces we skipped.
+            this.pos = savepos;
+        }
 
         // lookup rawlabel in refmap
         var link = this.refmap[normalizeReference(reflabel)];
diff --git a/src/inlines.c b/src/inlines.c
@@ -658,6 +658,7 @@ static cmark_node* handle_close_bracket(subject* subj, cmark_node *parent)
 	cmark_node *link_text;
 	cmark_node *inl;
 	chunk raw_label;
+	int found_label;
 
 	advance(subj);  // advance past ]
 	initial_pos = subj->pos;
@@ -717,12 +718,19 @@ static cmark_node* handle_close_bracket(subject* subj, cmark_node *parent)
 	// skip spaces
 	subj->pos = subj->pos + scan_spacechars(&subj->input, subj->pos);
 	raw_label = chunk_literal("");
-	if (!link_label(subj, &raw_label) || raw_label.len == 0) {
+	found_label = link_label(subj, &raw_label);
+	if (!found_label || raw_label.len == 0) {
 		chunk_free(&raw_label);
 		raw_label = chunk_dup(&subj->input, opener->position,
 				      initial_pos - opener->position - 1);
 	}
 
+	if (!found_label) {
+		// If we have a shortcut reference link, back up
+		// to before the spacse we skipped.
+		subj->pos = initial_pos;
+	}
+
 	ref = reference_lookup(subj->refmap, &raw_label);
 	chunk_free(&raw_label);