Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace unicode emoji characters, allowing them to be customized by renderer rules #53

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/normalize_opts.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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) })
Expand Down
14 changes: 13 additions & 1 deletion lib/replace.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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])
)
}
27 changes: 27 additions & 0 deletions test/fixtures/renderer.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
desc: Wrap emojis using renderer rules
---


Replace emojis
.
before :smile: test __1__
.
<p>before <span class="emoji emoji_smile">😄</span> test <strong>1</strong></p>
.


alias + original
.
:) :smiley:
.
<p><span class="emoji emoji_smiley">😃</span> <span class="emoji emoji_smiley">😃</span></p>
.


Unicode emojies are also wrapped
.
aaa 😂 bbb 😊 ccc 😘 ddd
.
<p>aaa <span class="emoji emoji_joy">😂</span> bbb <span class="emoji emoji_blush">😊</span> ccc <span class="emoji emoji_kissing_heart">😘</span> ddd</p>
.
10 changes: 10 additions & 0 deletions test/test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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 '<span class="emoji emoji_' + tokens[idx].markup + '">' + tokens[idx].content + '</span>'
}

generate(fileURLToPath(new URL('fixtures/renderer.txt', import.meta.url)), { header: true }, md)
})