我目前正在开发一个项目,我们需要根据一些输入数据生成一些SVG。目前,所有这些SVG生成都是使用d3库在javascript中实现的。请注意,我的目标是能够重用此逻辑而不是全部实现它。
我的问题是我希望能够从C#调用这个javascript。
我尝试过使用PhantomJS并且能够生成SVG,但我不满意,因为
因为我对PhantomJS不满意,所以我也试过使用jint,这似乎很适合。不幸的是,我还没有成功地获得一个有效的例子。目前我正在使用AngleSharp来提供DOM,以便D3有一个写入其数据的位置。这给了我以下示例:
static void TestJint()
{
//We require a custom configuration with JavaScript and CSS
var config = Configuration.Default.WithJavaScript().WithCss();
//Let's create a new parser using this configuration
var parser = new HtmlParser(config);
//This is our sample source, we will do some DOM manipulation
var source = "<!doctype html> <html><head></head> <body> </body></html>";
var document = parser.Parse(source);
var jintEngine = new Engine();
jintEngine.SetValue("document", document.Implementation);
jintEngine = jintEngine.Execute(File.ReadAllText("d3.min.js"));
jintEngine = jintEngine.Execute("function testFunc() { d3.select(\"body\").append(\"span\").text(\"Hello, world!\"); return 42;}");
var res = jintEngine.Invoke("testFunc").ToObject();
}
问题是行var res = jintEngine.Invoke(&#34; testFunc&#34;)。ToObject();抛出异常。
如果我尝试更换行
jintEngine = jintEngine.Execute("function testFunc() { d3.select(\"body\").append(\"span\").text(\"Hello, world!\"); return 42;}");
与
jintEngine = jintEngine.Execute("function testFunc() { d3.select(\"body\"); return 42;}");
然后该函数可以无任何异常地运行。通过使用逻辑稍微玩一下,我得出的结论是.append(\&#34; span \&#34;)会导致异常。
我有点陷入困境,所以我希望有人可能会有一个能让我指向正确方向的想法。
答案 0 :(得分:0)
我已经找到了问题。
1)parser.Parse(source)返回的文件;没有实现d3使用的函数createElementNS。我通过使用委托调用的包装器来解决这个问题。
2)d3使用我没有设置的变量ownerDocument。所以我还要添加以下内容
jintEngine.SetValue("ownerDocument", new MyDocumentWrapper(document));
请注意,这并不能使整个d3库工作。我也注意到了d3.geopath()的一些问题,但是通过这些修复,我能够执行我的初始示例。