in src/commonMain/kotlin/org/intellij/markdown/parser/sequentialparsers/impl/EmphStrongParser.kt [22:75]
override fun parse(tokens: TokensCache, rangesToGlue: List<IntRange>): SequentialParser.ParsingResult {
val result = SequentialParser.ParsingResultBuilder()
var iterator = tokens.RangesListIterator(rangesToGlue)
val openingOnes = ArrayList<OpeningEmphInfo>()
while (iterator.type != null) {
if (iterator.type != MarkdownTokenTypes.EMPH) {
iterator = iterator.advance()
continue
}
var thisEmphWasEaten = false
var numCanEnd = canEndNumber(iterator)
while (numCanEnd > 0) {
val stackIndex = openingOnes.indexOfLast { it.type == getType(iterator) }
if (stackIndex == -1) {
break
}
val opening = openingOnes[stackIndex]
val toMakeMax = min(opening.numChars, numCanEnd)
val toMake = if (toMakeMax % 2 == 0) 2 else 1
val from = opening.pos + (opening.numChars - toMake)
val to = iterator.index + toMake - 1
val nodeType = if (toMake == 2) MarkdownElementTypes.STRONG else MarkdownElementTypes.EMPH
result.withNode(SequentialParser.Node(from..to + 1, nodeType))
openingOnes.subList(stackIndex, openingOnes.size).clear()
thisEmphWasEaten = true
kotlin.repeat(toMake) { iterator = iterator.advance() }
numCanEnd -= toMake
if (opening.numChars > toMake) {
openingOnes.add(OpeningEmphInfo(opening.pos, opening.numChars - toMake, opening.type))
}
}
if (thisEmphWasEaten) {
continue
}
val numCanStart = canStartNumber(iterator)
if (numCanStart != 0) {
openingOnes.add(OpeningEmphInfo(iterator.index, numCanStart, getType(iterator)))
kotlin.repeat(numCanStart) { iterator = iterator.advance() }
continue
}
iterator = iterator.advance()
}
return result
}