Private/Get-RunBlock.ps1

function Get-RunBlock {
    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    param(
        [Parameter(Mandatory)]
        [string]$Content
    )

    $blocks = [System.Collections.Generic.List[PSCustomObject]]::new()
    if ([string]::IsNullOrWhiteSpace($Content)) {
        return $blocks.ToArray()
    }

    $lines = $Content -split "`n"

    for ($i = 0; $i -lt $lines.Count; $i++) {
        $line = $lines[$i]
        if ($line -match '^\s*#') {
            continue
        }

        if ($line -notmatch '^(?<indent>\s*)(?:-\s*)?run\s*:\s*(?<value>.*)$') {
            continue
        }

        $baseIndent = $Matches.indent.Length
        $value = $Matches.value.Trim()
        $startLine = $i + 1

        $isBlockScalar = $value -match '^[|>][+-]?$'
        $isImplicitMultiline = [string]::IsNullOrWhiteSpace($value)

        if ($isBlockScalar -or $isImplicitMultiline) {
            $blockLines = [System.Collections.Generic.List[string]]::new()
            $j = $i + 1

            while ($j -lt $lines.Count) {
                $nextLine = $lines[$j]

                if ($nextLine -match '^\s*$') {
                    $blockLines.Add('')
                    $j++
                    continue
                }

                $nextIndent = ([regex]::Match($nextLine, '^\s*')).Value.Length
                if ($nextIndent -le $baseIndent) {
                    break
                }

                $trimCount = [Math]::Min($nextLine.Length, $baseIndent + 2)
                $blockLines.Add($nextLine.Substring($trimCount))
                $j++
            }

            $blocks.Add([PSCustomObject]@{
                    StartLine = $startLine
                    EndLine   = if ($j -gt $startLine) { $j } else { $startLine }
                    Content   = $blockLines -join "`n"
                })

            $i = $j - 1
            continue
        }

        $blocks.Add([PSCustomObject]@{
                StartLine = $startLine
                EndLine   = $startLine
                Content   = $value
            })
    }

    $blocks.ToArray()
}