mirror of
https://github.com/github/semantic.git
synced 2024-12-22 22:31:36 +03:00
Define serialization to DOT.
This commit is contained in:
parent
539c769ecc
commit
7df0afeb67
@ -1 +1,38 @@
|
||||
module Serializing.DOT where
|
||||
{-# LANGUAGE TypeFamilies #-}
|
||||
module Serializing.DOT
|
||||
( Style
|
||||
, serializeDOT
|
||||
) where
|
||||
|
||||
import Algebra.Graph.Class
|
||||
import Algebra.Graph.Export hiding (export, (<+>))
|
||||
import qualified Algebra.Graph.Export as E
|
||||
import Algebra.Graph.Export.Dot hiding (export)
|
||||
import Data.List
|
||||
import Data.String
|
||||
import Prologue
|
||||
|
||||
serializeDOT :: (IsString s, Monoid s, Ord a, ToGraph g, ToVertex g ~ a) => Style a s -> g -> s
|
||||
serializeDOT Style {..} g = render $ header <> body <> "}\n"
|
||||
where
|
||||
header = "digraph" <+> literal graphName <> "\n{\n"
|
||||
<> literal preamble <> "\n"
|
||||
with x as = if null as then mempty else line (x <+> attributes as)
|
||||
line s = indent 2 s <> "\n"
|
||||
body = ("graph" `with` graphAttributes)
|
||||
<> ("node" `with` defaultVertexAttributes)
|
||||
<> ("edge" `with` defaultEdgeAttributes)
|
||||
<> E.export vDoc eDoc g
|
||||
label = doubleQuotes . literal . vertexName
|
||||
vDoc x = line $ label x <+> attributes (vertexAttributes x)
|
||||
eDoc x y = line $ label x <> " -> " <> label y <+> attributes (edgeAttributes x y)
|
||||
|
||||
|
||||
(<+>) :: IsString s => Doc s -> Doc s -> Doc s
|
||||
x <+> y = x <> " " <> y
|
||||
|
||||
attributes :: IsString s => [Attribute s] -> Doc s
|
||||
attributes [] = mempty
|
||||
attributes as = brackets . mconcat . intersperse " " $ map dot as
|
||||
where
|
||||
dot (k := v) = literal k <> "=" <> doubleQuotes (literal v)
|
||||
|
Loading…
Reference in New Issue
Block a user