DscResource.Tests/DscResource.DocumentationHelper/PowerShellHelp.psm1

<#
.SYNOPSIS
 
New-DscResourcePowerShellHelp generates PowerShell compatable help files for a DSC
resource module
 
.DESCRIPTION
 
The New-DscResourcePowerShellHelp cmdlet will review all of the MOF based resources
in a specified module directory and will inject PowerShell help files for each resource
in to the specified directory. These help files include details on the property types for
each resource, as well as a text description and examples where they exist.
 
.PARAMETER OutputPath
 
Where should the files be saved to (ususally the "en-US" folder inside the module for US english)
 
.PARAMETER ModulePath
 
The path to the root of the DSC resource module (where the PSD1 file is found, not the folder for
and individual DSC resource)
 
.EXAMPLE
 
This example shows how to generate help for a specific module
 
    New-DscResourcePowerShellHelp -ModulePath C:\repos\SharePointdsc -OutputPath C:\repos\SharePointDsc\en-US
 
#>

function New-DscResourcePowerShellHelp
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $OutputPath,

        [parameter(Mandatory = $true)]
        [System.String]
        $ModulePath
    )

    Import-Module (Join-Path -Path $PSScriptRoot -ChildPath "MofHelper.psm1")

    $mofSearchPath = (Join-Path -Path $ModulePath -ChildPath "\**\*.schema.mof")
    $mofSchemas = Get-ChildItem -Path $mofSearchPath -Recurse
    $mofSchemas | ForEach-Object {
        $mofFileObject = $_

        $descriptionPath = Join-Path -Path $_.DirectoryName -ChildPath "readme.md"
        if (Test-Path -Path $descriptionPath)
        {
            $result = (Get-MofSchemaObject -FileName $_.FullName) | Where-Object {
                ($_.ClassName -eq $mofFileObject.Name.Replace(".schema.mof", "")) `
                    -and ($null -ne $_.FriendlyName)
            }
            Write-Verbose -Message "Generating help document for $($result.FriendlyName)"

            $output = ".NAME" + [Environment]::NewLine
            $output += " $($result.FriendlyName)"
            $output += [Environment]::NewLine + [Environment]::NewLine

            $descriptionContent = Get-Content -Path $descriptionPath -Raw
            $descriptionContent = $descriptionContent.Replace("**Description**", ".DESCRIPTION")
            $descriptionContent = $descriptionContent -replace "\n", "`n "

            $output += $descriptionContent
            $output += [Environment]::NewLine

            foreach ($property in $result.Attributes)
            {
                $output += ".PARAMETER $($property.Name)" + [Environment]::NewLine
                $output += " $($property.State) - $($property.DataType)"
                $output += [Environment]::NewLine

                if ([string]::IsNullOrEmpty($property.ValueMap) -ne $true)
                {
                    $output += " Allowed values: "
                    $property.ValueMap | ForEach-Object {
                        $output += $_ + ", "
                    }
                    $output = $output.TrimEnd(" ")
                    $output = $output.TrimEnd(",")
                    $output +=  [Environment]::NewLine
                }
                $output += " " + $property.Description
                $output += [Environment]::NewLine + [Environment]::NewLine
            }

            $exampleSearchPath = "\Examples\Resources\$($result.FriendlyName)\*.ps1"
            $examplesPath = (Join-Path -Path $ModulePath -ChildPath $exampleSearchPath)
            $exampleFiles = Get-ChildItem -Path $examplesPath -ErrorAction SilentlyContinue

            if ($null -ne $exampleFiles)
            {
                foreach ($exampleFile in $exampleFiles)
                {
                    $exampleContent = Get-Content -Path $exampleFile.FullName -Raw
                    $exampleContent = $exampleContent -replace "<#"
                    $exampleContent = $exampleContent -replace "#>"

                    $output += $exampleContent
                    $output += [Environment]::NewLine
                }
            }

            $savePath = Join-Path -Path $OutputPath -ChildPath "about_$($result.FriendlyName).help.txt"
            $output | Out-File -FilePath $savePath -Encoding utf8 -Force
        }
    }
}

Export-ModuleMember -Function *