ConvertToPowerShellNoteBook.ps1
function ConvertTo-PowerShellNoteBook { <# .Example ConvertTo-PowerShellNoteBook -InputFileName c:\Temp\demo.txt -OutputNotebookName c:\Temp\demo.ipynb #> param( $InputFileName, $OutputNotebookName ) <################################################################################################# Parsing section. #################################################################################################> if ([System.Uri]::IsWellFormedUriString($InputFileName, [System.UriKind]::Absolute)) { $s = Invoke-RestMethod -Uri $InputFileName } else { $s = Get-Content -Raw ( Resolve-Path $InputFileName ) } try { # $CommentRanges = [System.Management.Automation.PSParser]::Tokenize((Get-Content -Raw $InputFileName), [ref]$null).Where( { $_.Type -eq 'Comment' }) | $CommentRanges = [System.Management.Automation.PSParser]::Tokenize($s, [ref]$null).Where( { $_.Type -eq 'Comment' }) | Select-Object -Property Start, Length, Type, Content } Catch { "This is not a valid PowerShell file" } $BlocksWitGaps = @() $Previous = $null foreach ($CommentBlock in $CommentRanges ) { $BlockOffsets = [ordered]@{ Start = $CommentBlock.Start; StopOffset = $CommentBlock.Start + $CommentBlock.Length; Length = $CommentBlock.Length; GapLength = [int] $CommentBlock.Start - $Previous.StopOffset; PreviousStart = $Previous.Start; PreviousStopOffset = $Previous.StopOffset; Type = 'Code'; GapText = IF ($CommentBlock.Start - $Previous.StopOffset -gt 1) { [string] $s.Substring($Previous.StopOffset, ($CommentBlock.Start - $Previous.StopOffset)).trimstart() }else { [string] '' }; Content = $CommentBlock.Content } $Previous = $BlockOffsets $BlocksWitGaps += [pscustomobject] $BlockOffsets } $AllBlocks = @() $Previous = $null $AllBlocks = $CommentRanges <# Catch anything missed from the tail of the file, add it to $AllBlocks #> if ($BlocksWitGaps.Count -eq 1) { <# This step handles ading the psobjects together if $CommentBlock isn't an array. #> $AllBlocks = @($CommentBlock; [pscustomobject][Ordered]@{ Start = ($CommentBlock.Start + $CommentBlock.Length); Length = $s.Length - ($CommentBlock.Start + $CommentBlock.Length); Type = 'Gap'; Content = $s.Substring(($CommentBlock.Start + $CommentBlock.Length), ($s.Length - ($CommentBlock.Start + $CommentBlock.Length))).trimstart() }) } else { if (($CommentBlock.Start + $CommentBlock.Length) -lt $s.Length) { $AllBlocks += [pscustomobject][ordered]@{ Start = ($CommentBlock.Start + $CommentBlock.Length); Length = $s.Length - ($CommentBlock.Start + $CommentBlock.Length); Type = 'Gap'; Content = $s.Substring(($CommentBlock.Start + $CommentBlock.Length), ($s.Length - ($CommentBlock.Start + $CommentBlock.Length))).trimstart() } } } foreach ($GapBlock in $BlocksWitGaps ) { $GapOffsets = [ordered]@{ Start = $GapBlock.PreviousStopOffset; StopOffset = $GapBlock.Start; Length = $GapBlock.GapLength; Type = 'Gap'; Content = $GapBlock.GapText.trimstart() } $Previous = $GapOffsets $AllBlocks += if ($GapOffsets.Length -gt 0) { [pscustomobject] $GapOffsets } } <################################################################################################# Notebook creation section. #################################################################################################> New-PSNotebook -NoteBookName $OutputNotebookName { foreach ($Block in $AllBlocks | Sort-Object Start ) { switch ($Block.Type) { 'Comment' { $TextBlock = $s.Substring($Block.Start, $Block.Length) -replace ("\n", " `n ") if ($TextBlock.Trim().length -gt 0) { Add-NotebookMarkdown -markdown (-join $TextBlock) } } 'Gap' { $GapBlock = $s.Substring($Block.Start, $Block.Length) if ($GapBlock.Trim().length -gt 0) { Add-NotebookCode -code (-join $GapBlock.trimstart().trimend()) -replace ("\n", " `n ") } } } } } } |