// This file is part of YamlDotNet - A .NET library for YAML. // Copyright (c) Antoine Aubry and contributors // // Permission is hereby granted, free of charge, to any person obtaining a copy of // this software and associated documentation files (the "Software"), to deal in // the Software without restriction, including without limitation the rights to // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies // of the Software, and to permit persons to whom the Software is furnished to do // so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. using System; using System.IO; using YamlDotNet.Core; using YamlDotNet.Core.Events; namespace YamlDotNet.RepresentationModel { /// /// Represents a LibYAML event stream. /// public class LibYamlEventStream { private readonly IParser parser; /// /// Initializes a new instance of the class /// from the specified . /// public LibYamlEventStream(IParser iParser) { parser = iParser ?? throw new ArgumentNullException(nameof(iParser)); } public void WriteTo(TextWriter textWriter) { while (parser.MoveNext()) { switch (parser.Current) { case AnchorAlias anchorAlias: textWriter.Write("=ALI *"); textWriter.Write(anchorAlias.Value); break; case DocumentEnd documentEnd: textWriter.Write("-DOC"); if (!documentEnd.IsImplicit) { textWriter.Write(" ..."); } break; case DocumentStart documentStart: textWriter.Write("+DOC"); if (!documentStart.IsImplicit) { textWriter.Write(" ---"); } break; case MappingEnd _: textWriter.Write("-MAP"); break; case MappingStart mappingStart: textWriter.Write("+MAP"); WriteAnchorAndTag(textWriter, mappingStart); break; case Scalar scalar: textWriter.Write("=VAL"); WriteAnchorAndTag(textWriter, scalar); switch (scalar.Style) { case ScalarStyle.DoubleQuoted: textWriter.Write(" \""); break; case ScalarStyle.SingleQuoted: textWriter.Write(" '"); break; case ScalarStyle.Folded: textWriter.Write(" >"); break; case ScalarStyle.Literal: textWriter.Write(" |"); break; default: textWriter.Write(" :"); break; } foreach (var character in scalar.Value) { switch (character) { case '\b': textWriter.Write("\\b"); break; case '\t': textWriter.Write("\\t"); break; case '\n': textWriter.Write("\\n"); break; case '\r': textWriter.Write("\\r"); break; case '\\': textWriter.Write("\\\\"); break; default: textWriter.Write(character); break; } } break; case SequenceEnd _: textWriter.Write("-SEQ"); break; case SequenceStart sequenceStart: textWriter.Write("+SEQ"); WriteAnchorAndTag(textWriter, sequenceStart); break; case StreamEnd _: textWriter.Write("-STR"); break; case StreamStart _: textWriter.Write("+STR"); break; } textWriter.WriteLine(); } } private void WriteAnchorAndTag(TextWriter textWriter, NodeEvent nodeEvent) { if (!nodeEvent.Anchor.IsEmpty) { textWriter.Write(" &"); textWriter.Write(nodeEvent.Anchor); } if (!nodeEvent.Tag.IsEmpty) { textWriter.Write(" <"); textWriter.Write(nodeEvent.Tag.Value); textWriter.Write(">"); } } } }