PowerShellModuleManifest.psm1


Function Use-PSManifest
{
    $PSMM = Get-Module PowerShellModuleManifest
    $Module = get-item $PSMM.Path
    $ManifestBase = (get-item $Module.PSParentPath).PSParentPath.Replace('Microsoft.PowerShell.Core\FileSystem::','')
    $ManifestPath = Join-Path $ManifestBase Manifests
    $PowerShellModuleManifest = join-path $ManifestPath  ($PSMM.Name + '-' + $PSMM.Version.ToString() + '.html')
    
    
    if (!(Test-Path $PowerShellModuleManifest ))
    {
        Publish-PowerShellModuleManifest -ManifestPath $ManifestPath
    }
    Invoke-Item $PowerShellModuleManifest 
}

Function Publish-PowerShellModuleManifest
{
    Param 
    (
        $maxJobs = 10,
        [switch]$GenerateContents,
        $CompanyLogoURL
    )
    $VerbosePreference='Continue'
    
    
    $PSMM = Get-Module PowerShellModuleManifest
    $Module = get-item $PSMM.Path
    $ManifestBase = (get-item $Module.PSParentPath).PSParentPath.Replace('Microsoft.PowerShell.Core\FileSystem::','')
    $ManifestPath = Join-Path $ManifestBase Manifests
    
    if (!(test-path $ManifestPath)){New-Item -ItemType directory -Name Manifests -Path $ManifestBase}
    $PowerShellModuleManifest = join-path $ManifestPath "ReportHTML-1.3.2.2.html"# ($PSMM.Name + '-' + $PSMM.Version.ToString() + '.html')
    
    Publish-PowerShellModuleManifestContents  -Manifestpath $ManifestPath
    
    $InstalledModules = Get-Module -ListAvailable 
    $ExistingManifests = Get-ChildItem $ManifestPath  
    $PSMMPSD1 = (Get-Module PowerShellModuleManifest).path.Replace('.psm1','.psd1')
    foreach ($InstalledModule in $InstalledModules)
    {
        #$InstalledModule = $InstalledModules | ? {$_.name -eq 'PowerShellModuleManifest'}
        $ModuleName = $InstalledModule.Name
        $ModuleVersion = $InstalledModule.version.ToString()
        $ExistingManifest = $ExistingManifests | ? {$_.basename -eq  ($ModuleName + "-" + $ModuleVersion )}
        if ($ExistingManifest  -eq $null) 
        {
            Write-Verbose "Manifest Search returned nothing, Generating Job for $ModuleName for version $ModuleVersion to $ManifestPath"
            Start-Job -Name $ModuleName -ScriptBlock {Import-Module $args[3];Publish-PowerShellModuleReport -modulename $args[0] -ModuleVersion $args[1]  -ManifestPath  $args[2]  } -ArgumentList $ModuleName,$ModuleVersion ,$ManifestPath,$PSMMPSD1 
            sleep 3
        }
        else
        {
            Write-Verbose ("Manifest Search found Manifest " +  $ExistingManifest.FullName)
        }
        
        $jobs = @(Get-Job | ? {$_.state -eq 'Running'})
        while ($jobs.Count -ge $maxJobs) 
        {
            Write-Verbose ([string]$jobs.count + " Running jobs...waiting")
            $jobs = @(Get-Job | ? {$_.state -eq 'Running'})
            sleep 30
        } 
        
    }
    Invoke-Item $PowerShellModuleManifest
}

Function Publish-PowerShellModuleManifestContents
{
    param
    (
        $Manifestpath
    )

    $InstalledModules = Get-Module -ListAvailable
# $Modules = @()
# foreach ($InstalledModule in $InstalledModules)
# {
# Write-Verbose ("Trying " + $InstalledModule.name)
# Try
# {
# $PSGallery = Find-Module $InstalledModule
# $InstalledModule | Add-Member -Name PSgalleryResult -Value $PSGallery -MemberType NoteProperty
# }
# Catch
# {
# $InstalledModule | Add-Member -Name PSgalleryResult -Value "Missing" -MemberType NoteProperty
# }
# Finally
# {
# $Modules += $InstalledModule
# }
# }
    
    $ModuleReportList = $InstalledModules | select `
        @{n='Module Report';e={"URL01$Manifestpath\" + $_.Name+ "-" + $_.version + ".htmlURL02" + $_.Name + "URL03"}}, `
        @{n='Installed Version';e={$_.version}}, `
        #@{n='PSGallery Latest';e={$_.PSgalleryResult.version}},`
        #@{n='Repository Source';e={$_.RepositorySourceLocation}},`
        ModuleType ,
        @{n='Web Search';e={"URL01Newhttps://www.google.ca/search?q=powershell module" + $_.Name + "URL02SearchURL03"}} `
        | sort 'Module Report' 

    $rptManifest= @()
    $rptManifest += get-htmltabcontentopen -TabName 'Module Manifest' -tabheading ' '
        $rptManifest  += Get-HTMLContentOpen -HeaderText 'PowerShell Module Manifest'
            $rptManifest  += Get-HTMLContentTable $ModuleReportList 
        $rptManifest  += Get-HTMLContentClose
    $rptManifest += get-htmltabcontentclose
    
    $rptManifest += get-htmltabcontentopen -TabName 'About' -tabheading ' '
        $rptManifest  += Get-HTMLContentOpen -HeaderText 'About PowerShell Module Manifest'
            $rptManifest  += Get-HTMLContentText -Heading "This code" -Detail "was written to help use powershell help easier"
        $rptManifest  += Get-HTMLContentClose
    $rptManifest += get-htmltabcontentclose
    
    $rptManifest | Set-Content "$Manifestpath\Contents.Part"
    $InstalledModules | select name, version | Export-Csv -Path "$Manifestpath\PSModuleContents.csv"

}

Function Publish-PowerShellModuleReport
{
    param 
    (
        $ModuleName = 'ReportHTML',
        $ModuleVersion = '1.3.2.2',
        $ManifestPath  = 'C:\Users\matt.quickenden\Documents\GitHub\Manifests'
    )

    Import-Module $ModuleName
    $Module = Get-Module $ModuleName | ? {$_.version -eq $ModuleVersion}
    $Mpath = Get-Item $Module.Path
    $FunctionList = @(get-command -module $ModuleName)
    $AllFunctions = Get-Functions -path $Mpath.PSParentPath
    $PSGallery = Find-Module $ModuleName 

    $rpt = @()
    $rpt += Get-HTMLOpenPage -TitleText ("Powershell Module Manifest - " + $ModuleName + " (" + $Module.Version + ")") -leftLogoName Corporate -RightLogoName PowerShell
    $rpt += Get-HTMLTabHeader -TabNames 'Summary','Cmdlet Descriptions','Cmdlets with Parameters','Module Manifest','About'

    $rpt += Get-Content "$ManifestPath\contents.part"



    #region Details
    $rpt += get-htmltabcontentopen -TabName "Summary" -tabheading ' '
        $rpt += Get-HTMLContentOpen -HeaderText "$ModuleName Details" -BackgroundShade 2
            
            $rpt += Get-HTMLContentOpen -HeaderText "Module Details" 
                $rpt += Get-HTMLContentText  -Heading "Author" -Detail $Module.Author
                $rpt += Get-HTMLContentText  -Heading "CompanyName" -detail $Module.CompanyName
                $rpt += Get-HTMLContentText  -Heading "Description" -detail $Module.Description    
                $rpt += Get-HTMLContentText  -Heading "Path" -Detail $Module.Path
            $rpt += Get-HTMLContentClose
        
            $InstalledPSG = Get-InstalledModule $ModuleName
            $PSG = Find-Module $ModuleName
            $rpt += Get-HTMLContentOpen -HeaderText 'PS Gallery'
                $rpt += Get-HTMLContentText  -Heading "Description" -Detail $InstalledPSG.Description
                $rpt += Get-HTMLContentText  -Heading "PublishedDate" -detail $InstalledPSG.PublishedDate
                $rpt += Get-HTMLContentText  -Heading "Install Date" -detail $InstalledPSG.InstalledDate
                $rpt += Get-HTMLContentText  -Heading "Install Location" -detail $InstalledPSG.InstalledLocation
                $rpt += Get-HTMLContentText  -Heading "Installed Version" -detail $InstalledPSG.Version
                $rpt += Get-HTMLContentText  -Heading "Avaliable Version" -detail $PSGallery.Version.ToString()
                $rpt += Get-HTMLContentText  -Heading "ProjectUri" -detail ("URL01$InstalledPSG.ProjectUriURL02Project LinkURL03")
                $Dependancies = ''
                ($PSG.Dependencies | %{ $Dependancies += $_.Name + ", "} )
                $rpt += Get-HTMLContentText  -Heading "Dependencies" -detail $Dependancies
                
            $rpt += Get-HTMLContentClose
            
            $rpt += Get-HtmlContentOpen -HeaderText "Cmdlets List" 
                $rpt += Get-HTMLContentTable  ($AllFunctions | select FunctionName)
            $rpt += Get-HtmlContentclose

            $rpt += Get-HtmlContentOpen -HeaderText "Functions in Code"  -IsHidden
                $rpt += Get-HTMLContentTable  (($AllFunctions | sort FileName,Line) | select FileName, FunctionName, Line    ) -GroupBy FileName    
            $rpt += Get-HtmlContentclose
            
        $rpt += Get-HTMLContentClose
    $rpt += get-htmltabcontentclose
    #Endregion

    #region FunctionList
        $rpt += get-htmltabcontentopen -TabName 'Cmdlet Descriptions' -tabheading ' '
            $rpt += Get-HtmlContentOpen -HeaderText "Functions with Parameters" -BackgroundShade 2
            foreach ($function in ( $FunctionList  | sort Name))
            {
                    $rpt += Get-HtmlContentOpen  -HeaderText ($function.Name)
                    $FunctionHelp = Get-Help $function.Name
                        $rpt += Get-HTMLContentText -Heading "Name" -Detail ($FunctionHelp.Name)
                        $rpt += Get-HTMLContentText -Heading "Synopsis" -Detail ($FunctionHelp.synopsis)
                        #$rpt += Get-HTMLContentText -Heading "syntax" -Detail ($FunctionHelp.syntax)
                        $rpt += Get-HTMLContentText -Heading "Remarks" -Detail ($FunctionHelp.Remarks)
                        $rpt += Get-HTMLContentText -Heading "Examples" -Detail ($FunctionHelp.Examples)
                    $rpt += Get-HtmlContentclose
            }
            $rpt += Get-Htmlcontentclose
        $rpt += get-htmltabcontentclose
    #endregion

    #region Params
    $rpt += get-htmltabcontentopen -TabName 'Cmdlets with Parameters' -tabheading ' '
    $rpt += Get-HTMLAnchor -AnchorName "Top"
        $rpt += Get-HtmlContentOpen -HeaderText "Available Functions "  
              $rpt += ($FunctionList | % { (Get-HTMLAnchorLink -AnchorName $_.Name -AnchorText $_.Name ) + '<BR>'} )
        $rpt += Get-HtmlContentclose
              $rpt += Get-HtmlContentOpen -HeaderText "Functions with Parameters" -BackgroundShade 2
              foreach ($function in ( $FunctionList | sort Name)){
                    $rpt += Get-HTMLAnchorlink -AnchorName Top -AnchorText 'Back To List'
                    $Params = @(Get-Parameters -Cmdlet $function.Name)
                    
                    if ($Params.count -gt 0) {
                          $rpt += Get-HtmlContentOpen  -HeaderText ($function.Name) -Anchor $function.Name
                          $FunctionHelp = Get-Help $function.Name
                          $rpt += Get-HTMLContentText -Heading "Name" -Detail ($FunctionHelp.Name)
                          $rpt += Get-HTMLContentText -Heading "Synopsis" -Detail ($FunctionHelp.synopsis)
                          $rpt += Get-HTMLContentText -Heading "Remarks" -Detail ($FunctionHelp.Remarks)
                          $rpt += Get-HTMLContentText -Heading "Examples" -Detail ($FunctionHelp.Examples)
                                $rpt += Get-HtmlContentOpen -HeaderText 'Functions Parameters' 
                                      $rpt += Get-HtmlContentTable (Set-TableRowColor ($Params | select ParameterSet, Name ,Type ,IsMandatory  ,Pipeline ) -Alternating ) -GroupBy ParameterSet -Fixed 
                                $rpt += Get-HtmlContentclose
                          $rpt += Get-HtmlContentclose
                    }
              }
            $rpt += Get-Htmlcontentclose
        $rpt += get-htmltabcontentclose
    #endregion

    $rpt += Get-HTMLClosePage 
    Write-Output $ManifestPath
    $Helpfile = Save-HTMLReport -ReportContent $rpt -ReportPath $ManifestPath -ReportName ($ModuleName + "-" + $Module.Version)

}