Coverage Summary for Class: MathBlockParser (io.heapy.kotmark.ext.math.internal)

Class Method, % Branch, % Line, % Instruction, %
MathBlockParser 100% (4/4) 80% (8/10) 100% (16/16) 100% (82/82)
MathBlockParser$Companion 100% (1/1) 100% (2/2) 100% (3/3) 100% (30/30)
MathBlockParser$Factory 100% (2/2) 100% (2/2) 100% (3/3) 100% (26/26)
Total 100% (7/7) 85.7% (12/14) 100% (22/22) 100% (138/138)


 package io.heapy.kotmark.ext.math.internal
 
 import io.heapy.kotmark.ext.math.MathBlock
 import io.heapy.kotmark.parser.SourceLine
 import io.heapy.kotmark.parser.block.AbstractBlockParser
 import io.heapy.kotmark.parser.block.AbstractBlockParserFactory
 import io.heapy.kotmark.parser.block.BlockContinue
 import io.heapy.kotmark.parser.block.BlockStart
 import io.heapy.kotmark.parser.block.MatchedBlockParser
 import io.heapy.kotmark.parser.block.ParserState
 
 internal class MathBlockParser(private val fenceIndent: Int) : AbstractBlockParser() {
     override val block = MathBlock()
     private var openingLine = true
     private val content = StringBuilder()
 
     override fun tryContinue(parserState: ParserState): BlockContinue {
         if (isFence(parserState)) return BlockContinue.Finished
         var index = parserState.index
         var remaining = fenceIndent
         val line = parserState.line.content
         while (remaining > 0 && index < line.length && line[index] == ' ') {
             index++
             remaining--
         }
         return BlockContinue.AtIndex(index)
     }
 
     override fun addLine(line: SourceLine) {
         if (openingLine) {
             openingLine = false
         } else {
             content.append(line.content).append('\n')
         }
     }
 
     override fun closeBlock() {
         block.literal = content.toString()
     }
 
     class Factory : AbstractBlockParserFactory() {
         override fun tryStart(state: ParserState, matchedBlockParser: MatchedBlockParser): BlockStart? {
             if (!isFence(state)) return null
             return BlockStart.of(MathBlockParser(state.indent)).atIndex(state.line.content.length)
         }
     }
 
     companion object {
         private fun isFence(state: ParserState): Boolean =
             state.indent < 4 &&
                 state.line.content.subSequence(state.nextNonSpaceIndex, state.line.content.length)
                     .trimEnd(' ', '\t') == "$$"
     }
 }