45 lines
1.2 KiB
Clojure
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))
|