Skip to content

Commit c14aa08

Browse files
committed
fix: escape clip name in TableClipStrategy.DefaultXml
1 parent 432368a commit c14aa08

2 files changed

Lines changed: 17 additions & 1 deletion

File tree

src/SharpFM.Model/ClipTypes/TableClipStrategy.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using SharpFM.Model.Parsing;
44
using SharpFM.Model.Schema;
5+
using SharpFM.Model.Scripting;
56

67
namespace SharpFM.Model.ClipTypes;
78

@@ -63,6 +64,6 @@ public ClipParseResult Parse(string xml)
6364

6465
public string DefaultXml(string clipName) =>
6566
_wrapsBaseTable
66-
? $"<fmxmlsnippet type=\"FMObjectList\"><BaseTable name=\"{clipName}\"></BaseTable></fmxmlsnippet>"
67+
? $"<fmxmlsnippet type=\"FMObjectList\"><BaseTable name=\"{XmlHelpers.XmlEscape(clipName)}\"></BaseTable></fmxmlsnippet>"
6768
: "<fmxmlsnippet type=\"FMObjectList\"></fmxmlsnippet>";
6869
}

tests/SharpFM.Tests/ClipTypes/TableClipStrategyTests.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,19 @@ public void DefaultXml_ProducesParseableSnippet()
6969
var result = TableClipStrategy.Table.Parse(seed);
7070
Assert.IsType<ParseSuccess>(result);
7171
}
72+
73+
[Theory]
74+
[InlineData("My \"favorite\" stuff")]
75+
[InlineData("A & B")]
76+
[InlineData("<Angle>")]
77+
public void Table_DefaultXml_EscapesPunctuationInName(string clipName)
78+
{
79+
var seed = TableClipStrategy.Table.DefaultXml(clipName);
80+
81+
var result = TableClipStrategy.Table.Parse(seed);
82+
83+
var success = Assert.IsType<ParseSuccess>(result);
84+
var model = Assert.IsType<TableClipModel>(success.Model);
85+
Assert.Equal(clipName, model.Table.Name);
86+
}
7287
}

0 commit comments

Comments
 (0)