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)
     }
 }