2017-01-30 6 views
0

현재 일부 입력 데이터를 기반으로 일부 SVG를 생성해야하는 프로젝트에서 작업 중입니다. 현재이 모든 SVG 세대는 d3 라이브러리를 사용하여 자바 스크립트로 구현됩니다. 필자의 목표는이 논리를 재사용하고 구현하지 않는 것입니다.jint를 사용하여 C에서 d3을 사용하여 javascript 호출 #

제 문제는이 자바 스크립트를 C#에서 호출 할 수 있기를 바랍니다.

나는 PhantomJS를 사용하여 시도하고 나는 SVG를 생성 할 수 있어요하지만 내가 만족하지

  • 내가 자바 스크립트를 호출 할 때마다이 새로운 프로세스를 시작하고 난 그것을 사용하는 것으로 나타났습니다 때문에 많은 기억 (내 경우에는 너무 많이 내 경우에는 100 메가 바이트 을 보았습니다)
  • 조금 불안정한 것 같습니다. 나는 과정 단지 (자바 스크립트 측면에서)
  • 개발을 중단 내가 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에 고해상도 = jintEngine.Invoke ("testFunc") ToObject();. 예외를 throw합니다. 내가

 jintEngine = jintEngine.Execute("function testFunc() { d3.select(\"body\"); return 42;}"); 

와 라인

 jintEngine = jintEngine.Execute("function testFunc() { d3.select(\"body\").append(\"span\").text(\"Hello, world!\"); return 42;}"); 

를 교체하려고하면

Exception screenshot

다음 기능은 예외없이 실행 할 수 있습니다. 로직을 조금 연주함으로써 나는 예외를 발생시키는 것이 .append (\ "span \")라는 결론을 내 렸습니다.

나는 누군가가 나를 올바른 방향으로 가르 킬 수있는 아이디어를 가지기를 기대하면서 조금 붙어 있습니다.

답변

0

문제를 파악했습니다.

1) parser.Parse (source)에 의해 반환 된 문서. d3이 사용하는 createElementNS 함수를 구현하지 않습니다. 나는이 호출을 위임하는 래퍼를 사용하여이 문제를 해결했다.

2) d3은 내가 설정하지 않은 변수 ownerDocument를 사용합니다. 따라서 다음을 추가해야합니다.

jintEngine.SetValue("ownerDocument", new MyDocumentWrapper(document)); 

전체 d3 라이브러리가 작동하는 것은 아닙니다. 또한 d3.geopath()에 대한 몇 가지 문제점을 발견했지만 이러한 수정을 통해 초기 예제를 실행할 수 있습니다.