public/Add-SkylineContentEditorWebPart.ps1

Function Add-SkylineContentEditorWebPart {
    <#
    .SYNOPSIS
    Uploads a content editor webpart to the Web Part Gallery
     
    .DESCRIPTION
    Uploads a content editor webpart to the Web Part Gallery
     
    .EXAMPLE
    Add new content editor web part with the group 'Intranet' and content link 'https://site.sharepoint.com/style library/webparts/widget1.html'
     
    Add-SkylineContentEditorWebPart -Title "Widget1" -Description "The best widget" -Group "Intranet" -ContentLink "https://site.sharepoint.com/style library/webparts/widget1.html"
 
    .PARAMETER Title
    Name of the webpart
 
    .PARAMETER ContentLink
    Absolute path of of the Content Link property
 
    Example: "https://site.sharepoint.com/style library/webparts/widget1.html"
 
    .PARAMETER Description
    Description of the webpart
 
    .PARAMETER Group
    Group which the webpart should belong to. Default is 'Custom'
     
    .PARAMETER FileName
    File name of the webpart file that gets uploaded to the web part gallery.
    File extension will be added if not included.
    Default is Title parameter with .dwp extension (e.g. -Title "MyWebPart" becomes -FileName "MyWebPart.dwp")
 
    .PARAMETER Web
    The web to apply the command to. Omit this parameter to use the current web.
 
    #>


    [cmdletbinding()]   
    param(
        [parameter(Mandatory = $True)]
        [string]$Title = '',
        [parameter(Mandatory = $True)]
        [string]$ContentLink = '',
        [parameter(Mandatory = $False)]
        [string]$Description = '',
        [parameter(Mandatory = $False)]
        [string]$Group = 'Custom',
        [parameter(Mandatory = $False)]
        [string]$FileName = '',
        [Microsoft.SharePoint.Client.Web]$Web
    )
    
    Process
    {
        Write-Debug ( "Running $($MyInvocation.MyCommand).`n" + "PSBoundParameters:`n$($PSBoundParameters | Format-List | Out-String)")

        #Stream varibles
        $DWPStream = $null
        $DWPStreamWriter = $null

        Try
        {   
            $PSBoundParameters.Remove("Title") | Out-Null
            $PSBoundParameters.Remove("ContentLink") | Out-Null
            $PSBoundParameters.Remove("Description") | Out-Null
            $PSBoundParameters.Remove("FileName") | Out-Null

            #Get Web Part DWP XML and replace tokens
            $WebPartTemplate = Get-Content ".\assets\ContentEditor.dwp" -Raw
            $WebPartTemplate = $WebPartTemplate.Replace("{{WebPartTitle}}", $Title)
            $WebPartTemplate = $WebPartTemplate.Replace("{{WebPartDescription}}", $Description)
            $WebPartTemplate = $WebPartTemplate.Replace("{{ContentLink}}", $ContentLink)
            
            #Ensure FileName is set
            if ([String]::IsNullOrEmpty($FileName))
            {
                $FileName = $Title
            }
            
            #Ensure FileName ends with .dwp extension
            if (-Not $FileName.ToLower().EndsWith('.dwp'))
            {
                $FileName = "$($FileName).dwp"
            }

            #Open memory stream of DWP XML
            $DWPStream = New-Object System.IO.MemoryStream
            $DWPStreamWriter = New-Object System.IO.StreamWriter $DWPStream
            $DWPStreamWriter.WriteLine($WebPartTemplate)
            $DWPStreamWriter.Flush()
            $DWPStream.Seek(0,"Begin")
            
            #Upload DWP XML to webpart gallery
            Add-SkylineWebPart -FileName $FileName -Stream $DWPStream @PSBoundParameters
        }
        Catch
        {
            Throw $_
        }
        Finally
        {
            #Dispose DWP stream objects
            if ($DWPStream -ne $null)
            {
                $DWPStream.Dispose()
            }
            if ($DWPStreamWriter -ne $null)
            {
                $DWPStreamWriter.Dispose()
            }
        }
    }
}