Merge pull request #249 from InusualZ/token-write-string

Fix TokenWriter::WriteString not escaping properly special characters
This commit is contained in:
Eliot Jones 2020-12-23 10:52:58 -04:00 committed by GitHub
commit f3b2960211
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 0 deletions

View File

@ -0,0 +1,30 @@
namespace UglyToad.PdfPig.Tests.Writer
{
using Integration;
using PdfPig.Writer;
using System.IO;
using UglyToad.PdfPig.Tokens;
using Xunit;
public class TokenWriterTests
{
[Fact]
public void EscapeSpecialCharacter()
{
using (var memStream = new MemoryStream())
{
TokenWriter.WriteToken(new StringToken("\\"), memStream);
TokenWriter.WriteToken(new StringToken("(Hello)"), memStream);
// Read Test
memStream.Position = 0;
using (var streamReader = new StreamReader(memStream))
{
var line = streamReader.ReadToEnd();
Assert.Equal("(\\\\) (\\(Hello\\)) ", line);
}
}
}
}
}

View File

@ -16,6 +16,8 @@
/// </summary>
public class TokenWriter
{
private static readonly byte Backslash = GetByte("\\");
private static readonly byte ArrayStart = GetByte("[");
private static readonly byte ArrayEnd = GetByte("]");
@ -374,6 +376,12 @@
for (var i = 0; i < stringToken.Data.Length; i++)
{
var c = stringToken.Data[i];
if (c == (char) StringStart || c == (char)StringEnd || c == (char) Backslash)
{
stringToken = new StringToken(stringToken.Data.Insert(i++, "\\"), stringToken.EncodedWith);
}
// Close enough.
if (c > 250)
{