public void StringEscaping() { RootGraph root = RootGraph.CreateNew("Graph with escaped strings", GraphType.Directed); Node.IntroduceAttribute(root, "label", "\\N"); Node nodeA = root.GetOrAddNode("A"); // Several characters and character sequences can have special meanings in labels, like \N. // When you want to have a literal string in a label, we provide a convenience function for you to do just that. nodeA.SetAttribute("label", CGraphThing.EscapeLabel("Some string literal \\N \\n |}>")); root.ComputeLayout(); // When defining portnames, some characters, like ':' and '|', are not allowed and they can't be escaped either. // This can be troubling if you have an externally defined ID for such a port. // We provide a function that maps strings to valid portnames. var somePortId = "port id with :| special characters"; var validPortName = Edge.ConvertUidToPortName(somePortId); Node nodeB = root.GetOrAddNode("B"); nodeB.SafeSetAttribute("shape", "record", ""); nodeB.SafeSetAttribute("label", $"<{validPortName}>1|2", "\\N"); // The function makes sure different strings don't accidentally map onto the same portname Assert.That(Edge.ConvertUidToPortName(":"), Is.Not.EqualTo(Edge.ConvertUidToPortName("|"))); }
public void TestLabelEscaping(bool escape) { string label1 = "|"; string label2 = @"\N\n\L"; string label3 = "3"; if (escape) { label1 = CGraphThing.EscapeLabel(label1); label2 = CGraphThing.EscapeLabel(label2); } { RootGraph root = CreateUniqueTestGraph(); Node node1 = root.GetOrAddNode("1"); node1.SafeSetAttribute("shape", "record", ""); node1.SafeSetAttribute("label", label1, ""); Node node2 = root.GetOrAddNode("2"); node2.SafeSetAttribute("label", label2, ""); Node node3 = root.GetOrAddNode("3"); node3.SafeSetAttribute("label", label3, ""); root.ToDotFile(GetTestFilePath("out.gv")); } { var root = RootGraph.FromDotFile(GetTestFilePath("out.gv")); Node node1 = root.GetNode("1"); Assert.That(node1.GetAttribute("label"), Is.EqualTo(label1)); Node node2 = root.GetNode("2"); Assert.That(node2.GetAttribute("label"), Is.EqualTo(label2)); Node node3 = root.GetNode("3"); Assert.That(node3.GetAttribute("label"), Is.EqualTo(label3)); root.ComputeLayout(); root.ToSvgFile(GetTestFilePath("out.svg")); root.ToDotFile(GetTestFilePath("out.dot")); var rects = node1.GetRecordRectangles(); if (escape) { Assert.That(rects.Count, Is.EqualTo(1)); Assert.That(node2.BoundingBox().Height, Is.EqualTo(node3.BoundingBox().Height)); } else { Assert.That(rects.Count, Is.EqualTo(2)); Assert.That(node2.BoundingBox().Height, Is.Not.EqualTo(node3.BoundingBox().Height)); } } }