(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))