diff options
Diffstat (limited to 'guix/graph.scm')
-rw-r--r-- | guix/graph.scm | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/guix/graph.scm b/guix/graph.scm index d2c1fa6c48..7af2cd3b80 100644 --- a/guix/graph.scm +++ b/guix/graph.scm @@ -22,6 +22,7 @@ #:use-module (guix monads) #:use-module (guix records) #:use-module (guix sets) + #:use-module (rnrs io ports) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-26) @@ -43,6 +44,7 @@ node-reachable-count %graph-backends + %d3js-backend %graphviz-backend graph-backend? graph-backend @@ -183,11 +185,58 @@ typically returned by 'node-edges' or 'node-back-edges'." ;;; +;;; d3js export. +;;; + +(define (emit-d3js-prologue name port) + (format port "\ +<!DOCTYPE html> +<html> + <head> + <meta charset=\"utf-8\"> + <style> +text { + font: 10px sans-serif; + pointer-events: none; +} + </style> + <script type=\"text/javascript\" src=\"~a\"></script> + </head> + <body> + <script type=\"text/javascript\"> +var nodes = {}, + nodeArray = [], + links = []; +" (search-path %load-path "d3.v3.js"))) + +(define (emit-d3js-epilogue port) + (format port "</script><script type=\"text/javascript\" src=\"~a\"></script></body></html>" + (search-path %load-path "graph.js"))) + +(define (emit-d3js-node id label port) + (format port "\ +nodes[\"~a\"] = {\"id\": \"~a\", \"label\": \"~a\", \"index\": nodeArray.length}; +nodeArray.push(nodes[\"~a\"]);~%" + id id label id)) + +(define (emit-d3js-edge id1 id2 port) + (format port "links.push({\"source\": \"~a\", \"target\": \"~a\"});~%" + id1 id2)) + +(define %d3js-backend + (graph-backend "d3js" + "Generate chord diagrams with d3js." + emit-d3js-prologue emit-d3js-epilogue + emit-d3js-node emit-d3js-edge)) + + +;;; ;;; Shared. ;;; (define %graph-backends - (list %graphviz-backend)) + (list %graphviz-backend + %d3js-backend)) (define* (export-graph sinks port #:key |