diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 1906d530a..f84851319 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -299,17 +299,26 @@ const superSubScripts = { const definitionListsInline = { name : 'definitionListsInline', level : 'block', - start(src) { return src.match(/^[^\n]*?::[^\n]*/m)?.index; }, // Hint to Marked.js to stop and check for a match + start(src) { return src.match(/\n[^\n]*?::[^\n]*/m)?.index; }, // Hint to Marked.js to stop and check for a match tokenizer(src, tokens) { const regex = /^([^\n]*?)::([^\n]*)(?:\n|$)/ym; let match; let endIndex = 0; const definitions = []; while (match = regex.exec(src)) { - definitions.push({ - dt : this.lexer.inlineTokens(match[1].trim()), - dd : this.lexer.inlineTokens(match[2].trim()) - }); + let originalLine = match[0]; // This line and below to handle conflict with emojis + let firstLine = originalLine; // Remove in V4 when definitionListsInline updated to + this.lexer.inlineTokens(firstLine.trim()) // require spaces around `::` + .filter(t => t.type == 'emoji') + .map(emoji => firstLine = firstLine.replace(emoji.raw, 'x'.repeat(emoji.raw.length))); + + let newMatch = /^([^\n]*?)::([^\n]*)(?:\n|$)/ym.exec(firstLine); + if(newMatch) { + definitions.push({ + dt : this.lexer.inlineTokens(originalLine.slice(0, newMatch[1].length).trim()), + dd : this.lexer.inlineTokens(originalLine.slice(newMatch[1].length + 2).trim()) + }); + } // End of emoji hack. endIndex = regex.lastIndex; } if(definitions.length) {