Coverage Summary for Class: EmojiInlineParser (io.heapy.kotmark.ext.emoji.internal)
| Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| EmojiInlineParser |
100%
(2/2)
|
100%
(10/10)
|
100%
(16/16)
|
100%
(67/67)
|
| EmojiInlineParser$Factory |
100%
(2/2)
|
75%
(6/8)
|
100%
(4/4)
|
94.6%
(70/74)
|
| Total |
100%
(4/4)
|
88.9%
(16/18)
|
100%
(20/20)
|
97.2%
(137/141)
|
package io.heapy.kotmark.ext.emoji.internal
import io.heapy.kotmark.ext.emoji.Emoji
import io.heapy.kotmark.ext.emoji.isShortcodeCharacter
import io.heapy.kotmark.parser.beta.InlineContentParser
import io.heapy.kotmark.parser.beta.InlineContentParserFactory
import io.heapy.kotmark.parser.beta.InlineParserState
import io.heapy.kotmark.parser.beta.ParsedInline
internal class EmojiInlineParser(
private val aliases: Map<String, String>,
private val maxLength: Int,
) : InlineContentParser {
override fun tryParse(inlineParserState: InlineParserState): ParsedInline? {
val scanner = inlineParserState.scanner()
// InlineParserImpl restores the cursor when this attempt returns null.
scanner.next()
val start = scanner.position()
var length = 0
while (isShortcodeCharacter(scanner.peek())) {
if (length == maxLength) return null
scanner.next()
length++
}
if (length == 0 || scanner.peek() != ':') return null
val shortcode = scanner.getSource(start, scanner.position()).content
val unicode = aliases[shortcode] ?: return null
scanner.next()
return ParsedInline.of(Emoji(shortcode, unicode), scanner.position())
}
class Factory(private val aliases: Map<String, String>) : InlineContentParserFactory {
private val maxLength = aliases.keys.maxOfOrNull(String::length) ?: 0
override val triggerCharacters: Set<Char> = setOf(':')
override fun create(): InlineContentParser = EmojiInlineParser(aliases, maxLength)
}
}