clojurecup2015-mailhead/src/mailhead/visualize.clj

45 lines
1.2 KiB
Clojure

(ns mailhead.visualize
(:use [tangle.core])
(:require [mailhead.parser :as parser]))
(defn edge-path [receive-path]
(let [path (reverse receive-path)
chain (concat (map :sender (butlast path)) [(:receiver (last path))])
cleaned-chain (map clojure.string/lower-case chain)]
(partition 2 (interleave cleaned-chain (rest cleaned-chain)))))
(defn edges [path]
(let [p (map-indexed
#(concat %2 [{:label (str (inc %1)) :fillcolor "gray" :color "gray"}])
(edge-path path))]
(into [] (map #(into [] %)) p)))
(defn draw-path [receive-path]
(graph->dot
[]
(edges receive-path)
{:node {:shape :box
:fontname "Arial"
:fontsize 12
:style "filled"
:fillcolor "darkgoldenrod1"
:color "darkgoldenrod3"}
:edge {:fontname "Arial"
:fontsize 10}
:directed? true
:graph {:rankdir :LR
:color "transparent"}}))
(defn save-image [dot token]
(let [path (str "generated-images/" token ".svg")]
(clojure.java.io/make-parents path)
(spit path (dot->svg dot))))
(defn next-token []
(str (java.util.UUID/randomUUID)))
(defn draw [parsed-email]
(let [token (next-token)]
(save-image (draw-path parsed-email) token)
token))