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') == "$$"
}
}