Types/docker.help/Parse.ps.ps1
[ValidatePattern("^(?>docker(?:(?>-|\s)compose)?\s{1,}help|usage:)")] param( [vfp()] [string] $Content, [string] $CommandLine ) begin { $dockerCommandPattern = '^\s{2}(?<CmdName>\w+)(?<IsPlugin>\*)?\s+(?<Description>.+$)' $DockerOptionsPattern = '\s{2,}(?:\-{1,2}\w+)' $CurrentOutput = $null $DockerCommandHelp = object @{ PSTypeName = 'Docker.Help' CommandLine = $CommandLine Usage = '' Description = '' Options = @() Commands = @() } $inOptions = $false $inCommands = $false } process { foreach ($line in $content -split '[\r\n]+') { if (($line -match '^Usage\:') -and (-not $DockerCommandHelp.Usage)) { $DockerCommandHelp.Usage = $line -replace '^Usage\:\s{0,}' } elseif ($line -match '^\S+' -and $line -notmatch '^.+?\:$') { if (-not $DockerCommandHelp.Description) { $DockerCommandHelp.Description = $line } else { $DockerCommandHelp.Description += ([Environment]::NewLine + $line) } } if ($line -match $DockerOptionsPattern) { if ($CurrentOutput) { $DockerCommandHelp.Options += $CurrentOutput } $inOptions = $true if ($line -match '--[\w\-]+\s(?<type>\S+)') { $CurrentOutput = object @{ PSTypeName = 'Docker.Argument' OptionName = $(@($line -split '\s' -match '^-{2}')[0]) -as [string] OptionFlag = $line -split '\s' -match '^-\w' -replace '\,\s{,0}$' Type = $matches.type CommandLine = $CommandLine Description = @($line -split '\s{2,}')[-1] } } else { $CurrentOutput = object @{ PSTypeName = 'Docker.Argument' OptionName = $(@($line -split '\s' -match '^-{2}')[0]) -as [string] OptionFlag = $line -split '\s' -match '^-\w' -replace '\,\s{,0}$' CommandLine = $CommandLine Description = @($line -split '\s{2,}')[-1] } } } elseif ($line -match $dockerCommandPattern) { $inCommands = $true if ($matches.CmdName -eq 'docker') { continue } if ($CurrentOutput) { if ($CurrentOutput.OptionName) { $DockerCommandHelp.Options += $CurrentOutput } else { $DockerCommandHelp.Commands += $CurrentOutput } } $CurrentOutput = object @{ PSTypeName = 'Docker.Command' CommandName = $matches.CmdName Description = $matches.Description IsPlugin = $matches.IsPlugin -as [bool] } if ($CurrentOutput.CommandName -match '^\s{0,}$') { $CurrentOutput = $null } } elseif ($line -match '^\s{8,}' -and $CurrentOutput) { $CurrentOutput.Description += ($line -replace '^\s{8,}', ' ') } } } end { if ($CurrentOutput) { if ($CurrentOutput.CommandName) { $DockerCommandHelp.Commands += $CurrentOutput } else { $DockerCommandHelp.Options += $CurrentOutput } } $DockerCommandHelp } |