I once create a simple getFirstPara function which you could adapt:
<?php
function getFirstPara($string){
$start = strpos($string, '<p>');
$string = substr($string,$start, strpos($string, "</p>")+4);
return $string;
}
?>
In your markdown, you could insert a comment
<!-- more -->
and then get everything before that comment
<?php
function getExcerpt($string){
$start = strpos($string, '<p>');
$string = substr($string,$start, strpos($string, "<!-- more -->"));
return $string;
}
?>
Then in your template
<?php echo getExcerpt($page->text()->kt()) ?>
The downside is, that this function does not output anything if the read more tag is missing but you could extend this further. [Edit] Also, anything before the first opening p-element will be discarded as well.
[Edit:] You may also have a look at this post that uses explode for an alternative method https://www.texniq.de/en/blog/kirby-cms-split-long-posts-into-pages (needs to be adapted for the current use case though)
[Edit] An alternative would be having a separate excerpt field for total control of the text that appears as an excerpt.