MegaBites-AI/Windows-powershell
0372
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4using System;5using System.Collections.Generic;6using System.Globalization;7using System.IO;8using System.Management.Automation;9using System.Xml;10 11namespace Microsoft.PowerShell.Commands12{13 /// <summary>14 /// Helper class for writing formatting directives to XML.15 /// </summary>16 internal sealed class FormatXmlWriter17 {18 private XmlWriter _writer;19 private bool _exportScriptBlock;20 21 private FormatXmlWriter() { }22 23 /// <summary>24 /// Writes a collection of format view definitions to XML file.25 /// </summary>26 /// <param name="typeDefinitions">Collection of PSTypeDefinition.</param>27 /// <param name="filepath">Path to XML file.</param>28 /// <param name="cmdlet">Cmdlet from which this si used.</param>29 /// <param name="force">True - to force write the file.</param>30 /// <param name="writeScriptBlock">True - to export scriptblocks.</param>31 /// <param name="noclobber">True - do not overwrite the file.</param>32 /// <param name="isLiteralPath">True - bypass wildcard expansion on the file name.</param>33 internal static void WriteToPs1Xml(PSCmdlet cmdlet, List<ExtendedTypeDefinition> typeDefinitions,34 string filepath, bool force, bool noclobber, bool writeScriptBlock, bool isLiteralPath)35 {36 StreamWriter streamWriter;37 FileStream fileStream;38 FileInfo fileInfo;39 PathUtils.MasterStreamOpen(cmdlet, filepath, "ascii", true, false, force, noclobber,40 out fileStream, out streamWriter, out fileInfo, isLiteralPath);41 42 try43 {44 var settings = new XmlWriterSettings();45 settings.Indent = true;46 settings.IndentChars = " ";47 settings.NewLineOnAttributes = true;48 49 using (XmlWriter xmlWriter = XmlWriter.Create(streamWriter, settings))50 {51 var writer = new FormatXmlWriter52 {53 _writer = xmlWriter,54 _exportScriptBlock = writeScriptBlock55 };56 writer.WriteToXml(typeDefinitions);57 }58 }59 finally60 {61 streamWriter.Dispose();62 fileStream.Dispose();63 }64 }65 66 internal static void WriteToXml(XmlWriter writer, IEnumerable<ExtendedTypeDefinition> typeDefinitions, bool writeScriptBlock)67 {68 var formatXmlWriter = new FormatXmlWriter { _exportScriptBlock = writeScriptBlock, _writer = writer };69 formatXmlWriter.WriteToXml(typeDefinitions);70 }71 72 internal void WriteToXml(IEnumerable<ExtendedTypeDefinition> typeDefinitions)73 {74 var views = new Dictionary<Guid, List<ExtendedTypeDefinition>>();75 var formatdefs = new Dictionary<Guid, FormatViewDefinition>();76 77 foreach (ExtendedTypeDefinition typedefinition in typeDefinitions)78 {79 foreach (FormatViewDefinition viewdefinition in typedefinition.FormatViewDefinition)80 {81 List<ExtendedTypeDefinition> viewList;82 if (!views.TryGetValue(viewdefinition.InstanceId, out viewList))83 {84 viewList = new List<ExtendedTypeDefinition>();85 views.Add(viewdefinition.InstanceId, viewList);86 }87 88 if (!formatdefs.ContainsKey(viewdefinition.InstanceId))89 {90 formatdefs.Add(viewdefinition.InstanceId, viewdefinition);91 }92 93 viewList.Add(typedefinition);94 }95 }96 97 _writer.WriteStartElement("Configuration");98 99 _writer.WriteStartElement("ViewDefinitions");100 foreach (var pair in formatdefs)101 {102 Guid id = pair.Key;103 FormatViewDefinition formatdef = pair.Value;104 105 _writer.WriteStartElement("View");106 _writer.WriteElementString("Name", formatdef.Name);107 _writer.WriteStartElement("ViewSelectedBy");108 foreach (ExtendedTypeDefinition definition in views[id])109 {110 _writer.WriteElementString("TypeName", definition.TypeName);111 }112 113 _writer.WriteEndElement(/*</ViewSelectedBy>*/);114 115 var groupBy = formatdef.Control.GroupBy;116 if (groupBy != null)117 {118 _writer.WriteStartElement("GroupBy");119 WriteDisplayEntry(groupBy.Expression);120 if (!string.IsNullOrEmpty(groupBy.Label))121 {122 _writer.WriteElementString("Label", groupBy.Label);123 }124 125 if (groupBy.CustomControl != null)126 {127 WriteCustomControl(groupBy.CustomControl);128 }129 130 _writer.WriteEndElement(/*</GroupBy>*/);131 }132 133 if (formatdef.Control.OutOfBand)134 {135 _writer.WriteElementString("OutOfBand", string.Empty);136 }137 138 formatdef.Control.WriteToXml(this);139 _writer.WriteEndElement(/*</View>*/);140 }141 142 _writer.WriteEndElement(/*</ViewDefinitions>*/);143 144 _writer.WriteEndElement(/*</Configuration>*/);145 }146 147 internal void WriteTableControl(TableControl tableControl)148 {149 _writer.WriteStartElement("TableControl");150 if (tableControl.AutoSize)151 {152 _writer.WriteElementString("AutoSize", string.Empty);153 }154 155 if (tableControl.HideTableHeaders)156 {157 _writer.WriteElementString("HideTableHeaders", string.Empty);158 }159 160 _writer.WriteStartElement("TableHeaders");161 foreach (TableControlColumnHeader columnheader in tableControl.Headers)162 {163 _writer.WriteStartElement("TableColumnHeader");164 if (!string.IsNullOrEmpty(columnheader.Label))165 {166 _writer.WriteElementString("Label", columnheader.Label);167 }168 169 if (columnheader.Width > 0)170 {171 _writer.WriteElementString("Width", columnheader.Width.ToString(CultureInfo.InvariantCulture));172 }173 174 if (columnheader.Alignment != Alignment.Undefined)175 {176 _writer.WriteElementString("Alignment", columnheader.Alignment.ToString());177 }178 179 _writer.WriteEndElement(/*</TableColumnHeader>*/);180 }181 182 _writer.WriteEndElement(/*</TableHeaders>*/);183 184 _writer.WriteStartElement("TableRowEntries");185 foreach (TableControlRow row in tableControl.Rows)186 {187 _writer.WriteStartElement("TableRowEntry");188 if (row.Wrap)189 {190 _writer.WriteStartElement("Wrap");191 _writer.WriteEndElement(/*</Wrap>*/);192 }193 194 if (row.SelectedBy != null)195 {196 WriteEntrySelectedBy(row.SelectedBy);197 }198 199 _writer.WriteStartElement("TableColumnItems");200 foreach (TableControlColumn coldefn in row.Columns)201 {202 _writer.WriteStartElement("TableColumnItem");203 if (coldefn.Alignment != Alignment.Undefined)204 {205 _writer.WriteElementString("Alignment", coldefn.Alignment.ToString());206 }207 208 if (!string.IsNullOrEmpty(coldefn.FormatString))209 {210 _writer.WriteElementString("FormatString", coldefn.FormatString);211 }212 213 WriteDisplayEntry(coldefn.DisplayEntry);214 _writer.WriteEndElement(/*</TableColumnItem>*/);215 }216 217 _writer.WriteEndElement(/*<TableColumnItems>*/);218 _writer.WriteEndElement(/*<TableRowEntry>*/);219 }220 221 _writer.WriteEndElement(/*</TableRowEntries>*/);222 223 _writer.WriteEndElement(/*</TableControl>*/);224 }225 226 internal void WriteListControl(ListControl listControl)227 {228 _writer.WriteStartElement("ListControl");229 _writer.WriteStartElement("ListEntries");230 231 // write the list entry's one by one232 foreach (ListControlEntry entry in listControl.Entries)233 {234 _writer.WriteStartElement("ListEntry");235 236 // write entry selected by if available237 WriteEntrySelectedBy(entry.EntrySelectedBy);238 239 if (entry.Items.Count > 0)240 {241 _writer.WriteStartElement("ListItems");242 243 // write the list items244 foreach (ListControlEntryItem item in entry.Items)245 {246 _writer.WriteStartElement("ListItem");247 248 if (!string.IsNullOrEmpty(item.Label))249 {250 _writer.WriteElementString("Label", item.Label);251 }252 253 if (!string.IsNullOrEmpty(item.FormatString))254 {255 _writer.WriteElementString("FormatString", item.FormatString);256 }257 258 if (item.ItemSelectionCondition != null)259 {260 _writer.WriteStartElement("ItemSelectionCondition");261 WriteDisplayEntry(item.ItemSelectionCondition);262 _writer.WriteEndElement(/*</ItemSelectionCondition>*/);263 }264 265 // write the entry266 WriteDisplayEntry(item.DisplayEntry);267 268 _writer.WriteEndElement(/*</ListItem>*/);269 }270 271 _writer.WriteEndElement(/*</ListItems>*/);272 }273 274 _writer.WriteEndElement(/*</ListEntry>*/);275 }276 277 _writer.WriteEndElement(/*</ListEntries>*/);278 _writer.WriteEndElement(/*</ListControl>*/);279 }280 281 private void WriteEntrySelectedBy(EntrySelectedBy entrySelectedBy)282 {283 if (entrySelectedBy != null &&284 ((entrySelectedBy.TypeNames != null && entrySelectedBy.TypeNames.Count > 0) ||285 (entrySelectedBy.SelectionCondition != null && entrySelectedBy.SelectionCondition.Count > 0)))286 {287 _writer.WriteStartElement("EntrySelectedBy");288 289 if (entrySelectedBy.TypeNames != null)290 {291 foreach (string typename in entrySelectedBy.TypeNames)292 {293 _writer.WriteElementString("TypeName", typename);294 }295 }296 297 if (entrySelectedBy.SelectionCondition != null)298 {299 foreach (var condition in entrySelectedBy.SelectionCondition)300 {301 _writer.WriteStartElement("SelectionCondition");302 WriteDisplayEntry(condition);303 _writer.WriteEndElement(/*</SelectionCondition>*/);304 }305 }306 307 _writer.WriteEndElement(/*</EntrySelectedBy>*/);308 }309 }310 311 internal void WriteWideControl(WideControl wideControl)312 {313 _writer.WriteStartElement("WideControl");314 315 if (wideControl.Columns > 0)316 {317 _writer.WriteElementString("ColumnNumber", wideControl.Columns.ToString(CultureInfo.InvariantCulture));318 }319 320 if (wideControl.AutoSize)321 {322 _writer.WriteElementString("AutoSize", string.Empty);323 }324 325 _writer.WriteStartElement("WideEntries");326 foreach (WideControlEntryItem entry in wideControl.Entries)327 {328 _writer.WriteStartElement("WideEntry");329 330 WriteEntrySelectedBy(entry.EntrySelectedBy);331 332 _writer.WriteStartElement("WideItem");333 WriteDisplayEntry(entry.DisplayEntry);334 if (!string.IsNullOrEmpty(entry.FormatString))335 {336 _writer.WriteElementString("FormatString", entry.FormatString);337 }338 339 _writer.WriteEndElement(/*</WideItem>*/);340 341 _writer.WriteEndElement(/*</WideEntry>*/);342 }343 344 _writer.WriteEndElement(/*</WideEntries>*/);345 346 _writer.WriteEndElement(/*</WideControl>*/);347 }348 349 internal void WriteDisplayEntry(DisplayEntry displayEntry)350 {351 if (displayEntry.ValueType == DisplayEntryValueType.Property)352 {353 _writer.WriteElementString("PropertyName", displayEntry.Value);354 }355 else if (displayEntry.ValueType == DisplayEntryValueType.ScriptBlock)356 {357 _writer.WriteStartElement("ScriptBlock");358 _writer.WriteValue(_exportScriptBlock ? displayEntry.Value : ";");359 _writer.WriteEndElement(/*</ScriptBlock>*/);360 }361 }362 363 internal void WriteCustomControl(CustomControl customControl)364 {365 _writer.WriteStartElement("CustomControl");366 367 _writer.WriteStartElement("CustomEntries");368 foreach (var entry in customControl.Entries)369 {370 _writer.WriteStartElement("CustomEntry");371 WriteEntrySelectedBy(entry.SelectedBy);372 _writer.WriteStartElement("CustomItem");373 foreach (var item in entry.CustomItems)374 {375 WriteCustomItem(item);376 }377 378 _writer.WriteEndElement(/*</CustomItem>*/);379 _writer.WriteEndElement(/*</CustomEntry>*/);380 }381 382 _writer.WriteEndElement(/*</CustomEntries>*/);383 _writer.WriteEndElement(/*</CustomControl>*/);384 }385 386 internal void WriteCustomItem(CustomItemBase item)387 {388 if (item is CustomItemNewline newline)389 {390 for (int i = 0; i < newline.Count; i++)391 {392 _writer.WriteElementString("NewLine", string.Empty);393 }394 395 return;396 }397 398 if (item is CustomItemText text)399 {400 _writer.WriteElementString("Text", text.Text);401 return;402 }403 404 if (item is CustomItemExpression expr)405 {406 _writer.WriteStartElement("ExpressionBinding");407 if (expr.EnumerateCollection)408 {409 _writer.WriteElementString("EnumerateCollection", string.Empty);410 }411 412 if (expr.ItemSelectionCondition != null)413 {414 _writer.WriteStartElement("ItemSelectionCondition");415 WriteDisplayEntry(expr.ItemSelectionCondition);416 _writer.WriteEndElement(/*</ItemSelectionCondition>*/);417 }418 419 if (expr.Expression != null)420 {421 WriteDisplayEntry(expr.Expression);422 }423 424 if (expr.CustomControl != null)425 {426 WriteCustomControl(expr.CustomControl);427 }428 429 _writer.WriteEndElement(/*</ExpressionBinding>*/);430 return;431 }432 433 var frame = (CustomItemFrame)item;434 _writer.WriteStartElement("Frame");435 if (frame.LeftIndent != 0)436 _writer.WriteElementString("LeftIndent", frame.LeftIndent.ToString(CultureInfo.InvariantCulture));437 if (frame.RightIndent != 0)438 _writer.WriteElementString("RightIndent", frame.RightIndent.ToString(CultureInfo.InvariantCulture));439 if (frame.FirstLineHanging != 0)440 _writer.WriteElementString("FirstLineHanging", frame.FirstLineHanging.ToString(CultureInfo.InvariantCulture));441 if (frame.FirstLineIndent != 0)442 _writer.WriteElementString("FirstLineIndent", frame.FirstLineIndent.ToString(CultureInfo.InvariantCulture));443 444 _writer.WriteStartElement("CustomItem");445 foreach (var frameItem in frame.CustomItems)446 {447 WriteCustomItem(frameItem);448 }449 450 _writer.WriteEndElement(/*</CustomItem>*/);451 _writer.WriteEndElement(/*</Frame>*/);452 }453 }454}455 