in prompt/prompt-structure/src/commonMain/kotlin/ai/koog/prompt/structure/markdown/MarkdownParser.kt [67:115]
public fun build(): suspend (String) -> Unit {
return { markdown ->
// Split the markdown by lines
val lines = markdown.split("\n")
var inCodeBlock = false
var codeBlockContent = StringBuilder()
for (line in lines) {
val trimmedLine = line.trim()
// Process the line based on its type and current state
when {
// Handle code block markers
isBeginningOfCodeBlock(trimmedLine) -> {
inCodeBlock = handleCodeBlockMarker(
inCodeBlock,
codeBlockContent
)
}
// Handle content inside code blocks
inCodeBlock -> {
codeBlockContent.append(line).append("\n")
}
// Handle headers
trimmedLine.startsWith("#") -> {
processHeader(trimmedLine)
}
// Handle bullet points
trimmedLine.startsWith("-") -> {
processBulletPoint(trimmedLine)
}
}
// Always process line matching for non-code-block lines
if (!inCodeBlock && !isBeginningOfCodeBlock(trimmedLine) && trimmedLine.isNotEmpty()) {
processLineMatching(trimmedLine)
}
}
// Handle unclosed code block at the end of the document
if (inCodeBlock && codeBlockContent.isNotEmpty()) {
codeBlockHandler?.invoke(codeBlockContent.toString())
}
}
}