Public/Show-TerminalPresentation.ps1

function Read-TerminalPresentationKey {
    $script:NativePresentationKeyReader.Invoke($true)
}

function Show-TerminalPresentation {
    [CmdletBinding(DefaultParameterSetName='Presentation')]
    param(
        [Parameter(Mandatory, ParameterSetName='Presentation')][TerminalSlides.Schema.V1.TerminalPresentation]$Presentation,
        [Parameter(Mandatory, ParameterSetName='Path')][string]$Path
    )

    if ($PSCmdlet.ParameterSetName -eq 'Path') {
        $Presentation = Import-TerminalPresentation -Path $Path
    }
    if ($Presentation) {
        $Presentation = New-TerminalPresentationView -Presentation $Presentation
    }
    if (-not $Presentation -or -not $Presentation.Slides.Count) {
        Write-Error 'Presentation contains no slides.'
        return
    }

    $capability = Get-TerminalPresentationCapability
    if (-not $capability.Interactive -or $capability.IsRedirected -or -not $capability.AnsiSupport) {
        for ($i = 0; $i -lt $Presentation.Slides.Count; $i++) {
            $maximumRevealStep = Get-TerminalSlideMaximumRevealStep -Slide $Presentation.Slides[$i]
            $text = Render-TerminalPresentationToString -Presentation $Presentation -SlideIndex $i -RevealStep $maximumRevealStep -PlainText -Capability $capability
            Write-Output $text
            if ($i -lt $Presentation.Slides.Count - 1) { Write-Output ("`n" + ('-' * 40) + "`n") }
        }
        return
    }

    $session = New-TerminalPresentationSession
    $startTime = [datetime]::UtcNow
    $escAltOn = "`e[?1049h"
    $escAltOff = "`e[?1049l"
    $hideCursor = "`e[?25l"
    $showCursor = "`e[?25h"

    try {
        if ($capability.AlternateBuffer) { Write-Host -NoNewline ($escAltOn + $hideCursor) }
        else { Write-Host -NoNewline $hideCursor }
        do {
            $elapsed = [datetime]::UtcNow - $startTime
            $rendered = Render-TerminalPresentationToString -Presentation $Presentation -SlideIndex $session.SlideIndex -RevealStep $session.RevealStep -ShowNotes:$session.ShowNotes -DisplayMode $session.DisplayMode -Elapsed $elapsed -ShowTimer:$session.ShowTimer -Capability $capability
            Write-Host -NoNewline $rendered
            $key = Read-TerminalPresentationKey
            $action = ConvertTo-TerminalPresentationAction -Key $key
            $session = Invoke-TerminalPresentationAction -Session $session -Action $action -Presentation $Presentation
        } while ($session.IsRunning)
    }
    finally {
        Write-Host -NoNewline (Get-AnsiReset)
        if ($capability.AlternateBuffer) { Write-Host -NoNewline ($showCursor + $escAltOff) }
        else { Write-Host -NoNewline $showCursor }
    }
}