Coverage Summary for Class: EmojiExtensionKt (io.heapy.kotmark.ext.emoji)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| EmojiExtensionKt |
100%
(1/1)
|
100%
(1/1)
|
|
100%
(2/2)
|
100%
(14/14)
|
package io.heapy.kotmark.ext.emoji
import io.heapy.kotmark.Extension
import io.heapy.kotmark.ExtensionsBuilder
import io.heapy.kotmark.ext.emoji.internal.EmojiInlineParser
import io.heapy.kotmark.ext.emoji.internal.emojiNodeRenderers
import io.heapy.kotmark.ext.emoji.internal.generated.gemojiAliases
import io.heapy.kotmark.parser.Parser
import io.heapy.kotmark.renderer.html.HtmlRenderer
import io.heapy.kotmark.renderer.markdown.MarkdownRenderer
import io.heapy.kotmark.renderer.text.TextContentRenderer
import kotlin.jvm.JvmStatic
/** Resolves case-sensitive GitHub gemoji shortcodes to Unicode, without network access. */
class EmojiExtension private constructor(private val aliases: Map<String, String>) :
Parser.ParserExtension,
HtmlRenderer.HtmlRendererExtension,
TextContentRenderer.TextContentRendererExtension,
MarkdownRenderer.MarkdownRendererExtension {
override fun extend(parserConfiguration: Parser.Configuration) {
parserConfiguration.customInlineContentParserFactory(EmojiInlineParser.Factory(aliases))
}
override fun extend(rendererConfiguration: HtmlRenderer.Configuration) {
rendererConfiguration.emojiNodeRenderers()
}
override fun extend(rendererConfiguration: TextContentRenderer.Configuration) {
rendererConfiguration.emojiNodeRenderers()
}
override fun extend(rendererConfiguration: MarkdownRenderer.Configuration) {
rendererConfiguration.emojiNodeRenderers()
}
companion object {
/**
* Creates an extension with the bundled dictionary plus [customAliases].
* Keys omit colons and follow [Emoji]'s shortcode rules. Values are nonempty,
* single-line text. Custom entries replace matching built-in aliases.
* The supplied map is copied; later mutations do not affect this extension.
*/
@JvmStatic
fun create(customAliases: Map<String, String> = emptyMap()): Extension {
val additions = customAliases.toMap()
for ([shortcode, unicode] in additions) {
require(shortcode.isNotEmpty() && shortcode.all(::isShortcodeCharacter)) {
"Invalid emoji shortcode: $shortcode"
}
require(unicode.isNotEmpty() && '\n' !in unicode && '\r' !in unicode) {
"Emoji text must be nonempty and fit on one line: $shortcode"
}
}
return EmojiExtension(if (additions.isEmpty()) gemojiAliases else gemojiAliases + additions)
}
}
}
/** Creates and appends [EmojiExtension], optionally adding or overriding shortcode mappings. */
fun ExtensionsBuilder.emoji(customAliases: Map<String, String> = emptyMap()) {
add(EmojiExtension.create(customAliases))
}