override fun parse()

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
    }