Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes372downloads
FormatXMLWriter.cs455 linesDownload Raw Back to common
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