diff --git a/lib/rules_inline/entity.js b/lib/rules_inline/entity.js index 6fcc889..3a985ab 100644 --- a/lib/rules_inline/entity.js +++ b/lib/rules_inline/entity.js @@ -13,36 +13,43 @@ var NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i; module.exports = function entity(state, silent) { - var ch, code, match, pos = state.pos, max = state.posMax; + var ch, code, match, token, pos = state.pos, max = state.posMax; - if (state.src.charCodeAt(pos) !== 0x26/* & */) { return false; } + if (state.src.charCodeAt(pos) !== 0x26/* & */) return false; - if (pos + 1 < max) { - ch = state.src.charCodeAt(pos + 1); + if (pos + 1 >= max) return false; - if (ch === 0x23 /* # */) { - match = state.src.slice(pos).match(DIGITAL_RE); - if (match) { + ch = state.src.charCodeAt(pos + 1); + + if (ch === 0x23 /* # */) { + match = state.src.slice(pos).match(DIGITAL_RE); + if (match) { + if (!silent) { + code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10); + + token = state.push('text_special', '', 0); + token.content = isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD); + token.markup = match[0]; + token.info = 'entity'; + } + state.pos += match[0].length; + return true; + } + } else { + match = state.src.slice(pos).match(NAMED_RE); + if (match) { + if (has(entities, match[1])) { if (!silent) { - code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10); - state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD); + token = state.push('text_special', '', 0); + token.content = entities[match[1]]; + token.markup = match[0]; + token.info = 'entity'; } state.pos += match[0].length; return true; } - } else { - match = state.src.slice(pos).match(NAMED_RE); - if (match) { - if (has(entities, match[1])) { - if (!silent) { state.pending += entities[match[1]]; } - state.pos += match[0].length; - return true; - } - } } } - if (!silent) { state.pending += '&'; } - state.pos++; - return true; + return false; }; diff --git a/test/fixtures/markdown-it/smartquotes.txt b/test/fixtures/markdown-it/smartquotes.txt index 72bb2dc..afab445 100644 --- a/test/fixtures/markdown-it/smartquotes.txt +++ b/test/fixtures/markdown-it/smartquotes.txt @@ -177,3 +177,16 @@ Should be escapable:
"foo"
"foo"
. + +Should not replace entities: +. +"foo" + +"foo" + +"foo" +. +"foo"
+"foo"
+"foo"
+. diff --git a/test/fixtures/markdown-it/typographer.txt b/test/fixtures/markdown-it/typographer.txt index ca3cc0a..5968b89 100644 --- a/test/fixtures/markdown-it/typographer.txt +++ b/test/fixtures/markdown-it/typographer.txt @@ -67,6 +67,13 @@ copyright should be escapable(c)
. +shouldn't replace entities +. +(c) (c) (c) +. +(c) (c) ©
+. + dashes .