diff --git a/lib/normalize_opts.mjs b/lib/normalize_opts.mjs index 69899ff..b84f580 100644 --- a/lib/normalize_opts.mjs +++ b/lib/normalize_opts.mjs @@ -41,6 +41,7 @@ export default function normalize_opts (options) { names = keys .map(name => { return `:${name}:` }) .concat(Object.keys(shortcuts)) + .concat(Object.values(emojies)) .sort() .reverse() .map(name => { return quoteRE(name) }) diff --git a/lib/replace.mjs b/lib/replace.mjs index fa81a58..34287df 100644 --- a/lib/replace.mjs +++ b/lib/replace.mjs @@ -8,6 +8,7 @@ export default function create_rule (md, emojies, shortcuts, scanRE, replaceRE) const ucm = md.utils.lib.ucmicro const has = md.utils.has const ZPCc = new RegExp([ucm.Z.source, ucm.P.source, ucm.Cc.source].join('|')) + const emojies_rev = reverse_object(emojies) function splitTextToken (text, level, Token) { let last_pos = 0 @@ -27,8 +28,12 @@ export default function create_rule (md, emojies, shortcuts, scanRE, replaceRE) if (offset + match.length < src.length && !ZPCc.test(src[offset + match.length])) { return } - } else { + } else if (match[0] === ':' && match[match.length - 1] === ':') { + // emoji_name specified like :smile: emoji_name = match.slice(1, -1) + } else { + // replace unicode emoji using canonical name + emoji_name = emojies_rev[match] } // Add new tokens to pending list @@ -83,3 +88,10 @@ export default function create_rule (md, emojies, shortcuts, scanRE, replaceRE) } } }; + +function reverse_object (obj) { + return Object.fromEntries(Object + .entries(obj) + .map(([key, value]) => [value, key]) + ) +} diff --git a/test/fixtures/renderer.txt b/test/fixtures/renderer.txt new file mode 100644 index 0000000..1f8c796 --- /dev/null +++ b/test/fixtures/renderer.txt @@ -0,0 +1,27 @@ +--- +desc: Wrap emojis using renderer rules +--- + + +Replace emojis +. +before :smile: test __1__ +. +
before 😄 test 1
+. + + +alias + original +. +:) :smiley: +. +😃 😃
+. + + +Unicode emojies are also wrapped +. +aaa 😂 bbb 😊 ccc 😘 ddd +. +aaa 😂 bbb 😊 ccc 😘 ddd
+. diff --git a/test/test.mjs b/test/test.mjs index 4dfb9fe..fe3ac0b 100644 --- a/test/test.mjs +++ b/test/test.mjs @@ -111,3 +111,13 @@ describe('integrity', function () { } }) }) + +describe('renderer rules', function () { + const md = markdownit().use(emoji_full) + + md.renderer.rules.emoji = function (tokens, idx) { + return '' + tokens[idx].content + '' + } + + generate(fileURLToPath(new URL('fixtures/renderer.txt', import.meta.url)), { header: true }, md) +})