InformationArchitecture.ps1

<#
    .SYNOPSIS
        Converts a simplified information architecture json file into a
        Valo compatible information architecture.
    .DESCRIPTION
        Converts a simplified information architecture json file into a
        Valo compatible information architecture.
    .LINK
        Nexus Innovations : http://www.nexusinno.com
#>




function global:ConvertFrom-SimplifiedArchitecture {
    [CmdletBinding()]
    Param (
        [ValidateScript( { Test-Path $_ -PathType Leaf })]
        [Parameter(Mandatory = $true)]
        [string]$SimplifiedIAPath,

        [Parameter(Mandatory = $true)]
        [string]$GenesisPath
    )

    $defaultTemplateCollection = (
        @{ 
            templateName = "ValoLocationsPage.xml"
        }, 
        @{ 
            templateName         = "ValoPeopleDirectory.xml"
            postExecutionScripts = (
                @{
                    script     = "Fix-ConnectedWebParts"
                    parameters = (
                        @{
                            parameterValue = "People-Directory"
                        }
                    )
                }
            )
        },
        @{ 
            templateName         = "ValoNewsHub.xml"
            postExecutionScripts = (
                @{
                    script     = "Fix-ConnectedWebParts"
                    parameters = (
                        @{
                            parameterValue = "News-Hub"
                        }
                    )
                }
            )
        },
        @{ 
            templateName         = "ValoSearchHub.xml"
            postExecutionScripts = (
                @{
                    script     = "Fix-ConnectedWebParts"
                    parameters = (
                        @{
                            parameterValue = "Search-Hub"
                        }
                    )
                }
            )
        },
        @{ 
            templateName = "ValoSocialHub.xml"
        },
        @{ 
            templateName = "ValoFAQ.xml"
        },
        @{ 
            templateName = "ValoPeopleMeta.xml"
        }
    )
    $defaultPageTemplate = "SingleColumn.Template.xml"


    $simpleSiteCollection = @{ }
    # Is input file's json valid?
    try {
        $simpleSiteCollection = Get-Content -Path $SimplifiedIAPath -Raw -Encoding UTF8 | ConvertFrom-Json
    }
    catch {
        throw $_.Exception.Message
    }

    $valoSiteCollection = @()
    $valoNavigationStructure = @()
    foreach ($site in $simpleSiteCollection.Sites) {
        $siteTitle = $site.Site
        if ($siteTitle.length -eq 0) {
            throw "Input json is not a valid json."
        }
        $siteSimplifiedTitle = $siteTitle | ConvertTo-SafeString

        $valoNavigationNodes = @()
        $valoSitePageCollection = @()

        foreach ($sitePage in $site.SitePages) {
            $sitePageTitle = $sitePage.PageTitle
            $sitePageSimplifiedTitle = $sitePageTitle | ConvertTo-SafeString

            $valoSitePageCollection +=
            @{
                title        = $sitePageTitle
                fileName     = "$($sitePageSimplifiedTitle).aspx"
                templateName = $defaultPageTemplate
            }
            

            $valoNavigationNodeItems = @()
            foreach ($subPage in $sitePage.SubPages) {

                $subPageTitle = $subPage.PageTitle
                $subPageSimplifiedTitle = $subPageTitle | ConvertTo-SafeString

                $valoSitePageCollection +=
                @{
                    title        = $subPageTitle
                    fileName     = "$($subPageSimplifiedTitle).aspx"
                    templateName = $defaultPageTemplate
                }
                

                $valoNavigationNodeItems +=
                @{
                    url   = "{prefix}$($siteSimplifiedTitle){suffix}/SitePages/$($subPageSimplifiedTitle).aspx"
                    title = $subPageTitle
                }
                
            }
            $valoNavigationNodes +=
            @{
                url             = "{prefix}$($siteSimplifiedTitle){suffix}/SitePages/$($sitePageSimplifiedTitle).aspx"
                title           = $sitePageTitle
                navigationNodes = $valoNavigationNodeItems
            }
        }

        foreach ($sitePage in $site.NonNavSitePages) {
            $valoSitePageCollection += @{
                title        = $sitePage
                fileName     = $sitePage | ConvertTo-SafeString
                templateName = $defaultPageTemplate
            }
        }

        $valoSiteCollection += @{
            url              = "{prefix}$($siteSimplifiedTitle){suffix}"
            title            = $siteTitle
            basetemplate     = "CommunicationSite"
            valoPnpTemplates = $defaultTemplateCollection
            pages            = $valoSitePageCollection
        }

        $valoNavigationStructure += @{
            url              = "{prefix}$($siteSimplifiedTitle){suffix}"
            title            = $siteTitle
            navigationNodes  = $valoNavigationNodes
            customProperties = @()
        }
    }

    # TODO: Don't create a new file for the output. Instead, load the valo config file, modify the target fields, and save changes.
    $valoGenesisConfigFile = Get-Content -Path $GenesisPath -Raw -Encoding UTF8 -ErrorAction SilentlyContinue | ConvertFrom-Json

    $valoGenesisConfigFile.valoSite.associatedSites = $valoSiteCollection
    $valoGenesisConfigFile.navigationStructure = $valoNavigationStructure

    $valoGenesisConfigFile | `
        ConvertTo-Json -Depth 8 | `
        ForEach-Object { [System.Text.RegularExpressions.Regex]::Unescape($_) } | `
        Out-File $GenesisPath -Encoding utf8

}
function script:Remove-LatinCharacters {
    Param (
        [string]$InputString
    )

    return [Text.Encoding]::UTF8.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes($InputString))
}

function script:ConvertTo-SafeString {
    Param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string]$InputString
    )
    return Remove-LatinCharacters($InputString -replace " ", "-" -replace "'", "-" `
            -replace "\(", "-" -replace "\)", "-" -replace ",", "-").ToLowerInvariant()
}