diff --git a/.github/workflows/update-version-number.yaml b/.github/workflows/update-version-number.yaml index 94859c2..8e52094 100644 --- a/.github/workflows/update-version-number.yaml +++ b/.github/workflows/update-version-number.yaml @@ -72,7 +72,7 @@ jobs: - name: Update Directory.Build.props ${{ steps.configure.outputs.git-tag }} run: | - ruby -i -pe 'gsub(%r{()[\d\.]+()}, %q{\1${{ steps.configure.outputs.git-tag }}\2})' Directory.Build.props + ruby -i -pe 'gsub(%r{()([\d\.]+)()}, %q{\1${{ steps.configure.outputs.git-tag }}\3})' Directory.Build.props - name: Update README.md ${{ steps.configure.outputs.git-tag }} run: | diff --git a/VYaml.Tests/Emitter/Utf8YamlEmitterTest.cs b/VYaml.Tests/Emitter/Utf8YamlEmitterTest.cs index f707f0e..522fc1b 100644 --- a/VYaml.Tests/Emitter/Utf8YamlEmitterTest.cs +++ b/VYaml.Tests/Emitter/Utf8YamlEmitterTest.cs @@ -356,6 +356,113 @@ public void BlockSequence_Nested1() )); } + [Test] + public void BlockSequence_Nested2() + { + var emitter = CreateEmitter(); + emitter.BeginMapping(MappingStyle.Block); + { + emitter.WriteString("matrix"); + emitter.BeginSequence(SequenceStyle.Block); + { + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(100); + emitter.WriteInt32(200); + } + emitter.EndSequence(); + + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(300); + emitter.WriteInt32(400); + } + emitter.EndSequence(); + } + emitter.EndSequence(); + } + emitter.EndMapping(); + + Assert.That(ToString(in emitter), Is.EqualTo( + "matrix: \n" + + "- [100, 200]\n" + + "- [300, 400]\n" + )); + } + + [Test] + public void BlockSequence_Nested3() + { + var emitter = CreateEmitter(); + emitter.BeginMapping(MappingStyle.Block); + { + emitter.WriteString("key1"); + emitter.BeginMapping(MappingStyle.Block); + { + emitter.WriteString("matrix"); + emitter.BeginSequence(SequenceStyle.Block); + { + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(100); + emitter.WriteInt32(200); + } + emitter.EndSequence(); + + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(300); + emitter.WriteInt32(400); + } + emitter.EndSequence(); + } + emitter.EndSequence(); + } + emitter.EndMapping(); + } + emitter.EndMapping(); + + Assert.That(ToString(in emitter), Is.EqualTo( + "key1: \n" + + " matrix: \n" + + " - [100, 200]\n" + + " - [300, 400]\n" + )); + } + + [Test] + public void BlockSequence_Nested4() + { + var emitter = CreateEmitter(); + emitter.BeginSequence(SequenceStyle.Block); + { + emitter.BeginSequence(SequenceStyle.Block); + { + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(100); + emitter.WriteInt32(200); + } + emitter.EndSequence(); + + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(300); + emitter.WriteInt32(400); + } + emitter.EndSequence(); + } + emitter.EndSequence(); + } + emitter.EndSequence(); + + Assert.That(ToString(in emitter), Is.EqualTo( + "- \n" + + " - [100, 200]\n" + + " - [300, 400]\n" + )); + } + [Test] public void BlockSequence_NestedDeeply() { diff --git a/VYaml.Unity/Assets/Tests/Emitter/Utf8YamlEmitterTest.cs b/VYaml.Unity/Assets/Tests/Emitter/Utf8YamlEmitterTest.cs index f707f0e..522fc1b 100644 --- a/VYaml.Unity/Assets/Tests/Emitter/Utf8YamlEmitterTest.cs +++ b/VYaml.Unity/Assets/Tests/Emitter/Utf8YamlEmitterTest.cs @@ -356,6 +356,113 @@ public void BlockSequence_Nested1() )); } + [Test] + public void BlockSequence_Nested2() + { + var emitter = CreateEmitter(); + emitter.BeginMapping(MappingStyle.Block); + { + emitter.WriteString("matrix"); + emitter.BeginSequence(SequenceStyle.Block); + { + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(100); + emitter.WriteInt32(200); + } + emitter.EndSequence(); + + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(300); + emitter.WriteInt32(400); + } + emitter.EndSequence(); + } + emitter.EndSequence(); + } + emitter.EndMapping(); + + Assert.That(ToString(in emitter), Is.EqualTo( + "matrix: \n" + + "- [100, 200]\n" + + "- [300, 400]\n" + )); + } + + [Test] + public void BlockSequence_Nested3() + { + var emitter = CreateEmitter(); + emitter.BeginMapping(MappingStyle.Block); + { + emitter.WriteString("key1"); + emitter.BeginMapping(MappingStyle.Block); + { + emitter.WriteString("matrix"); + emitter.BeginSequence(SequenceStyle.Block); + { + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(100); + emitter.WriteInt32(200); + } + emitter.EndSequence(); + + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(300); + emitter.WriteInt32(400); + } + emitter.EndSequence(); + } + emitter.EndSequence(); + } + emitter.EndMapping(); + } + emitter.EndMapping(); + + Assert.That(ToString(in emitter), Is.EqualTo( + "key1: \n" + + " matrix: \n" + + " - [100, 200]\n" + + " - [300, 400]\n" + )); + } + + [Test] + public void BlockSequence_Nested4() + { + var emitter = CreateEmitter(); + emitter.BeginSequence(SequenceStyle.Block); + { + emitter.BeginSequence(SequenceStyle.Block); + { + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(100); + emitter.WriteInt32(200); + } + emitter.EndSequence(); + + emitter.BeginSequence(SequenceStyle.Flow); + { + emitter.WriteInt32(300); + emitter.WriteInt32(400); + } + emitter.EndSequence(); + } + emitter.EndSequence(); + } + emitter.EndSequence(); + + Assert.That(ToString(in emitter), Is.EqualTo( + "- \n" + + " - [100, 200]\n" + + " - [300, 400]\n" + )); + } + [Test] public void BlockSequence_NestedDeeply() { diff --git a/VYaml.Unity/Assets/VYaml/Runtime/Emitter/Utf8YamlEmitter.cs b/VYaml.Unity/Assets/VYaml/Runtime/Emitter/Utf8YamlEmitter.cs index e3392e4..e4484b0 100644 --- a/VYaml.Unity/Assets/VYaml/Runtime/Emitter/Utf8YamlEmitter.cs +++ b/VYaml.Unity/Assets/VYaml/Runtime/Emitter/Utf8YamlEmitter.cs @@ -142,9 +142,7 @@ public void BeginSequence(SequenceStyle style = SequenceStyle.Block) { var output = writer.GetSpan(currentIndentLevel * options.IndentWidth + BlockSequenceEntryHeader.Length + 1); var offset = 0; - WriteIndent(output, ref offset); - BlockSequenceEntryHeader.CopyTo(output[offset..]); - offset += BlockSequenceEntryHeader.Length; + WriteBlockSequenceEntryHeader(output, ref offset); output[offset++] = YamlCodes.FlowSequenceStart; writer.Advance(offset); break; @@ -299,9 +297,7 @@ public void BeginMapping(MappingStyle style = MappingStyle.Block) { var output = writer.GetSpan(currentIndentLevel * options.IndentWidth + BlockSequenceEntryHeader.Length + FlowMappingHeader.Length + GetTagLength() + 1); var offset = 0; - WriteIndent(output, ref offset); - BlockSequenceEntryHeader.CopyTo(output[offset..]); - offset += BlockSequenceEntryHeader.Length; + WriteBlockSequenceEntryHeader(output, ref offset); if (TryWriteTag(output, ref offset)) { output[offset++] = YamlCodes.Space; @@ -698,21 +694,32 @@ void WriteRaw1(byte value) [MethodImpl(MethodImplOptions.AggressiveInlining)] void WriteBlockSequenceEntryHeader() + { + var output = writer.GetSpan(BlockSequenceEntryHeader.Length + currentIndentLevel * options.IndentWidth + 2); + var offset = 0; + WriteBlockSequenceEntryHeader(output, ref offset); + writer.Advance(offset); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + void WriteBlockSequenceEntryHeader(Span output, ref int offset) { if (IsFirstElement) { switch (PreviousState) { case EmitState.BlockSequenceEntry: - WriteRaw1(YamlCodes.Lf); + output[offset++] = YamlCodes.Lf; IncreaseIndent(); break; case EmitState.BlockMappingValue: - WriteRaw1(YamlCodes.Lf); + output[offset++] = YamlCodes.Lf; break; } } - WriteRaw(BlockSequenceEntryHeader, true, false); + WriteIndent(output, ref offset); + BlockSequenceEntryHeader.CopyTo(output[offset..]); + offset += BlockSequenceEntryHeader.Length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -751,23 +758,7 @@ void BeginScalar(Span output, ref int offset) { case EmitState.BlockSequenceEntry: { - // first nested element - if (IsFirstElement) - { - switch (PreviousState) - { - case EmitState.BlockSequenceEntry: - IncreaseIndent(); - output[offset++] = YamlCodes.Lf; - break; - case EmitState.BlockMappingValue: - output[offset++] = YamlCodes.Lf; - break; - } - } - WriteIndent(output, ref offset); - BlockSequenceEntryHeader.CopyTo(output[offset..]); - offset += BlockSequenceEntryHeader.Length; + WriteBlockSequenceEntryHeader(output, ref offset); if (TryWriteTag(output, ref offset)) { diff --git a/VYaml/Emitter/Utf8YamlEmitter.cs b/VYaml/Emitter/Utf8YamlEmitter.cs index e3392e4..e4484b0 100644 --- a/VYaml/Emitter/Utf8YamlEmitter.cs +++ b/VYaml/Emitter/Utf8YamlEmitter.cs @@ -142,9 +142,7 @@ public void BeginSequence(SequenceStyle style = SequenceStyle.Block) { var output = writer.GetSpan(currentIndentLevel * options.IndentWidth + BlockSequenceEntryHeader.Length + 1); var offset = 0; - WriteIndent(output, ref offset); - BlockSequenceEntryHeader.CopyTo(output[offset..]); - offset += BlockSequenceEntryHeader.Length; + WriteBlockSequenceEntryHeader(output, ref offset); output[offset++] = YamlCodes.FlowSequenceStart; writer.Advance(offset); break; @@ -299,9 +297,7 @@ public void BeginMapping(MappingStyle style = MappingStyle.Block) { var output = writer.GetSpan(currentIndentLevel * options.IndentWidth + BlockSequenceEntryHeader.Length + FlowMappingHeader.Length + GetTagLength() + 1); var offset = 0; - WriteIndent(output, ref offset); - BlockSequenceEntryHeader.CopyTo(output[offset..]); - offset += BlockSequenceEntryHeader.Length; + WriteBlockSequenceEntryHeader(output, ref offset); if (TryWriteTag(output, ref offset)) { output[offset++] = YamlCodes.Space; @@ -698,21 +694,32 @@ void WriteRaw1(byte value) [MethodImpl(MethodImplOptions.AggressiveInlining)] void WriteBlockSequenceEntryHeader() + { + var output = writer.GetSpan(BlockSequenceEntryHeader.Length + currentIndentLevel * options.IndentWidth + 2); + var offset = 0; + WriteBlockSequenceEntryHeader(output, ref offset); + writer.Advance(offset); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + void WriteBlockSequenceEntryHeader(Span output, ref int offset) { if (IsFirstElement) { switch (PreviousState) { case EmitState.BlockSequenceEntry: - WriteRaw1(YamlCodes.Lf); + output[offset++] = YamlCodes.Lf; IncreaseIndent(); break; case EmitState.BlockMappingValue: - WriteRaw1(YamlCodes.Lf); + output[offset++] = YamlCodes.Lf; break; } } - WriteRaw(BlockSequenceEntryHeader, true, false); + WriteIndent(output, ref offset); + BlockSequenceEntryHeader.CopyTo(output[offset..]); + offset += BlockSequenceEntryHeader.Length; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -751,23 +758,7 @@ void BeginScalar(Span output, ref int offset) { case EmitState.BlockSequenceEntry: { - // first nested element - if (IsFirstElement) - { - switch (PreviousState) - { - case EmitState.BlockSequenceEntry: - IncreaseIndent(); - output[offset++] = YamlCodes.Lf; - break; - case EmitState.BlockMappingValue: - output[offset++] = YamlCodes.Lf; - break; - } - } - WriteIndent(output, ref offset); - BlockSequenceEntryHeader.CopyTo(output[offset..]); - offset += BlockSequenceEntryHeader.Length; + WriteBlockSequenceEntryHeader(output, ref offset); if (TryWriteTag(output, ref offset)) {