src/formatFuncs.ps1


function formatOutPut($Property, $result) {
   if (!$Property) {
      return $result
   }
   $showType = ($Property -join '')
   $showProps = $Property

   if (!$result) {
      return
   }

   if ($result.getType().name -eq 'Object[]') {
      $showType += 'arrayType'
      $result | ForEach-Object {
         foreach ($p in $_.PSObject.Properties) {
            if ($p.Value -and $p.Value.getType().name -eq 'Object[]' -and $p.Value.length -eq 3) {
               $p.Value = $p.Value[1]
            }            
         }
         $_.PSObject.TypeNames.Insert(0, $showType)
      }
   }
   else {
      $result.PSObject.TypeNames.Insert(0, $showType)
   }

   if (!(Get-TypeData $showType)) {

      if ($result.getType().name -eq 'Object[]') {
         # XML formating for arrays (table view with fixed column width)
         $XML_Path = "$([System.IO.Path]::GetTempPath())XmsOut.format.ps1xml"
         createNewFormatXML
         Update-FormatData -PrependPath $XML_Path
      }
      else {
         # Adapting formating for objects (table view selecting automatically for low number or props)
         $TypeData = @{
            TypeName                  = $showType
            DefaultDisplayPropertySet = $showProps
         }
         Update-TypeData @TypeData
      }
   }
   return $result
}

function createNewFormatXML() {
    
   $typeName = $showType

   $xDoc = [xml]'<?xml version="1.0" encoding="utf-8" ?><Configuration><ViewDefinitions><View></View></ViewDefinitions></Configuration>';
   $viewNode = $xDoc.SelectSingleNode("//Configuration//ViewDefinitions//View")
   $nameNode = $viewNode.AppendChild($xDoc.CreateElement("Name"))
   [void]$nameNode.AppendChild($xDoc.CreateTextNode($typeName))
   $ViewSelectedByNode = $viewNode.AppendChild($xDoc.CreateElement("ViewSelectedBy"))
   $TypeNameNode = $ViewSelectedByNode.AppendChild($xDoc.CreateElement("TypeName"))
   [void]$TypeNameNode.AppendChild($xDoc.CreateTextNode($typeName))
   $TableControlNode = $viewNode.AppendChild($xDoc.CreateElement("TableControl"))
   $TableHeadersNode = $TableControlNode.AppendChild($xDoc.CreateElement("TableHeaders"))
   $TableRowEntriesNode = $TableControlNode.AppendChild($xDoc.CreateElement("TableRowEntries"))
   $TableRowEntryNode = $TableRowEntriesNode.AppendChild($xDoc.CreateElement("TableRowEntry"))
   $TableColumnItemsNode = $TableRowEntryNode.AppendChild($xDoc.CreateElement("TableColumnItems"))

   addPropsInFormatXML 
   $xDoc.Save($XML_Path)
}

function addPropsInFormatXML () {
   $len = $showProps.length
   foreach ($prop in $showProps) {
      $TableColumnHeaderNode = $TableHeadersNode.AppendChild($xDoc.CreateElement("TableColumnHeader"))
      if ($len -gt 4) {
         $WidthNode = $TableColumnHeaderNode.AppendChild($xDoc.CreateElement("Width"))
         if ($prop -eq 'index') {
            $w = 7
         }
         else {
            $w = 20
         }
         [void]($WidthNode.AppendChild($xDoc.CreateTextNode($w)))
      }

      $TableColumnItemsNode = $TableRowEntryNode.AppendChild($xDoc.CreateElement("TableColumnItems"))
      $TableColumnItemNode = $TableColumnItemsNode.AppendChild($xDoc.CreateElement("TableColumnItem"))
      $PropertyNameNode = $TableColumnItemNode.AppendChild($xDoc.CreateElement("PropertyName"))
      [void]($PropertyNameNode.AppendChild($xDoc.CreateTextNode($prop)))
   }
}