packages feed

graphviz 2999.15.0.1 → 2999.16.0.0

raw patch · 29 files changed

+1192/−638 lines, 29 filesdep +temporarydep ~wl-pprint-textPVP ok

version bump matches the API change (PVP)

Dependencies added: temporary

Dependency ranges changed: wl-pprint-text

API changes (from Hackage documentation)

- Data.GraphViz.Attributes.Complete: ShapeFile :: Text -> Attribute
- Data.GraphViz.Attributes.Complete: Z :: Double -> Attribute
- Data.GraphViz.Attributes.Complete: data LayerRange
- Data.GraphViz.Attributes.Complete: instance Eq LayerRange
- Data.GraphViz.Attributes.Complete: instance Ord LayerRange
- Data.GraphViz.Attributes.Complete: instance ParseDot LayerRange
- Data.GraphViz.Attributes.Complete: instance PrintDot LayerRange
- Data.GraphViz.Attributes.Complete: instance Read LayerRange
- Data.GraphViz.Attributes.Complete: instance Show LayerRange
- Data.GraphViz.Commands: instance Eq GraphvizCommand
- Data.GraphViz.Commands: instance Ord GraphvizCommand
- Data.GraphViz.Commands: instance Read GraphvizCommand
- Data.GraphViz.Commands: instance Show GraphvizCommand
- Data.GraphViz.Parsing: liftEqParse :: Parse a -> String -> (a -> b) -> Parse b
- Data.GraphViz.Parsing: liftEqParse' :: ParseDot a => String -> (a -> b) -> Parse b
- Data.GraphViz.Parsing: parseField :: ParseDot a => (a -> b) -> String -> [(String, Parse b)]
- Data.GraphViz.Parsing: parseFieldBool :: (Bool -> b) -> String -> [(String, Parse b)]
- Data.GraphViz.Parsing: parseFieldDef :: ParseDot a => (a -> b) -> a -> String -> [(String, Parse b)]
- Data.GraphViz.Parsing: parseFieldNumDef :: ParseDot a => (a -> b) -> a -> String -> [(String, Parse b)]
- Data.GraphViz.Parsing: parseFields :: ParseDot a => (a -> b) -> [String] -> [(String, Parse b)]
- Data.GraphViz.Parsing: parseFieldsBool :: (Bool -> b) -> [String] -> [(String, Parse b)]
- Data.GraphViz.Parsing: parseFieldsDef :: ParseDot a => (a -> b) -> a -> [String] -> [(String, Parse b)]
+ Data.GraphViz.Attributes: striped :: Style
+ Data.GraphViz.Attributes: wedged :: Style
+ Data.GraphViz.Attributes.Colors: WC :: Color -> Maybe Double -> WeightedColor
+ Data.GraphViz.Attributes.Colors: data WeightedColor
+ Data.GraphViz.Attributes.Colors: instance Eq WeightedColor
+ Data.GraphViz.Attributes.Colors: instance Ord WeightedColor
+ Data.GraphViz.Attributes.Colors: instance ParseDot WeightedColor
+ Data.GraphViz.Attributes.Colors: instance PrintDot WeightedColor
+ Data.GraphViz.Attributes.Colors: instance Read WeightedColor
+ Data.GraphViz.Attributes.Colors: instance Show WeightedColor
+ Data.GraphViz.Attributes.Colors: toColorList :: [Color] -> ColorList
+ Data.GraphViz.Attributes.Colors: toWC :: Color -> WeightedColor
+ Data.GraphViz.Attributes.Colors: toWColor :: NamedColor nc => nc -> WeightedColor
+ Data.GraphViz.Attributes.Colors: type ColorList = [WeightedColor]
+ Data.GraphViz.Attributes.Colors: wColor :: WeightedColor -> Color
+ Data.GraphViz.Attributes.Colors: weighting :: WeightedColor -> Maybe Double
+ Data.GraphViz.Attributes.Complete: Area :: Double -> Attribute
+ Data.GraphViz.Attributes.Complete: Circo :: GraphvizCommand
+ Data.GraphViz.Attributes.Complete: Curved :: EdgeType
+ Data.GraphViz.Attributes.Complete: Dot :: GraphvizCommand
+ Data.GraphViz.Attributes.Complete: Fdp :: GraphvizCommand
+ Data.GraphViz.Attributes.Complete: Head_LP :: Point -> Attribute
+ Data.GraphViz.Attributes.Complete: LLSep :: Text -> LayerListSep
+ Data.GraphViz.Attributes.Complete: LayerListSep :: LayerListSep -> Attribute
+ Data.GraphViz.Attributes.Complete: LayerSelect :: LayerRange -> Attribute
+ Data.GraphViz.Attributes.Complete: MDS :: Model
+ Data.GraphViz.Attributes.Complete: Neato :: GraphvizCommand
+ Data.GraphViz.Attributes.Complete: Ortho :: EdgeType
+ Data.GraphViz.Attributes.Complete: Osage :: GraphvizCommand
+ Data.GraphViz.Attributes.Complete: Patchwork :: GraphvizCommand
+ Data.GraphViz.Attributes.Complete: Sfdp :: GraphvizCommand
+ Data.GraphViz.Attributes.Complete: Striped :: StyleName
+ Data.GraphViz.Attributes.Complete: Tail_LP :: Point -> Attribute
+ Data.GraphViz.Attributes.Complete: TwoPi :: GraphvizCommand
+ Data.GraphViz.Attributes.Complete: VoronoiOverlap :: Overlap
+ Data.GraphViz.Attributes.Complete: Wedged :: StyleName
+ Data.GraphViz.Attributes.Complete: XLP :: Point -> Attribute
+ Data.GraphViz.Attributes.Complete: data GraphvizCommand
+ Data.GraphViz.Attributes.Complete: data LayerRangeElem
+ Data.GraphViz.Attributes.Complete: instance Bounded GraphvizCommand
+ Data.GraphViz.Attributes.Complete: instance Enum GraphvizCommand
+ Data.GraphViz.Attributes.Complete: instance Eq GraphvizCommand
+ Data.GraphViz.Attributes.Complete: instance Eq LayerListSep
+ Data.GraphViz.Attributes.Complete: instance Eq LayerRangeElem
+ Data.GraphViz.Attributes.Complete: instance Ord GraphvizCommand
+ Data.GraphViz.Attributes.Complete: instance Ord LayerListSep
+ Data.GraphViz.Attributes.Complete: instance Ord LayerRangeElem
+ Data.GraphViz.Attributes.Complete: instance ParseDot GraphvizCommand
+ Data.GraphViz.Attributes.Complete: instance ParseDot LayerListSep
+ Data.GraphViz.Attributes.Complete: instance ParseDot LayerRangeElem
+ Data.GraphViz.Attributes.Complete: instance PrintDot GraphvizCommand
+ Data.GraphViz.Attributes.Complete: instance PrintDot LayerListSep
+ Data.GraphViz.Attributes.Complete: instance PrintDot LayerRangeElem
+ Data.GraphViz.Attributes.Complete: instance Read GraphvizCommand
+ Data.GraphViz.Attributes.Complete: instance Read LayerListSep
+ Data.GraphViz.Attributes.Complete: instance Read LayerRangeElem
+ Data.GraphViz.Attributes.Complete: instance Show GraphvizCommand
+ Data.GraphViz.Attributes.Complete: instance Show LayerListSep
+ Data.GraphViz.Attributes.Complete: instance Show LayerRangeElem
+ Data.GraphViz.Attributes.Complete: newtype LayerListSep
+ Data.GraphViz.Attributes.Complete: rmUnwantedAttributes :: Attributes -> Attributes
+ Data.GraphViz.Attributes.Complete: type LayerRange = [LayerRangeElem]
+ Data.GraphViz.Commands: Sfdp :: GraphvizCommand
+ Data.GraphViz.Types: edgeInformationClean :: DotRepr dg n => Bool -> dg n -> [DotEdge n]
+ Data.GraphViz.Types: graphStructureInformationClean :: DotRepr dg n => dg n -> (GlobalAttributes, ClusterLookup)
+ Data.GraphViz.Types: nodeInformationClean :: DotRepr dg n => Bool -> dg n -> NodeLookup n
- Data.GraphViz.Attributes.Complete: BgColor :: [Color] -> Attribute
+ Data.GraphViz.Attributes.Complete: BgColor :: ColorList -> Attribute
- Data.GraphViz.Attributes.Complete: Color :: [Color] -> Attribute
+ Data.GraphViz.Attributes.Complete: Color :: ColorList -> Attribute
- Data.GraphViz.Attributes.Complete: FillColor :: [Color] -> Attribute
+ Data.GraphViz.Attributes.Complete: FillColor :: ColorList -> Attribute
- Data.GraphViz.Attributes.Complete: FontPath :: Text -> Attribute
+ Data.GraphViz.Attributes.Complete: FontPath :: Paths -> Attribute
- Data.GraphViz.Attributes.Complete: LRID :: LayerID -> LayerRange
+ Data.GraphViz.Attributes.Complete: LRID :: LayerID -> LayerRangeElem
- Data.GraphViz.Attributes.Complete: LRS :: LayerID -> LayerID -> LayerRange
+ Data.GraphViz.Attributes.Complete: LRS :: LayerID -> LayerID -> LayerRangeElem
- Data.GraphViz.Attributes.Complete: Layout :: Text -> Attribute
+ Data.GraphViz.Attributes.Complete: Layout :: GraphvizCommand -> Attribute

Files

Changelog.md view
@@ -7,6 +7,80 @@ The following is information about what major changes have gone into each release. +Changes in 2999.16.0.0+----------------------++* Add support for Graphviz-2.30.0:++    - New attributes:++        + `Area`+        + `Head_LP`+        + `LayerListSep`+        + `LayerSelect`+        + `Tail_LP`+        + `XLP`++    - `BgColor`, `Color` and `FillColor` now take a list of colors+      with optional weightings.++    - Layer handling now supports layer sub-ranges.++    - Added the voronoi-based option to `Overlap`.++    - Added the `Striped` and `Wedged` styles.++* Updates to attributes and their values:++    - The following attributes have had their values changed to better+      reflect what they represent:++        + `FontPath` takes a `Path` value.++        + `Layout` takes a `GraphvizCommand` (and thus+          `GraphvizCommand` has been moved to+          `Data.GraphViz.Attributes.Complete`).++    - Added `MDS` to `Model` (which had somehow been overlooked).++    - Various attributes now have defaults added/updated/removed if+      wrong.++    - Removed the following deprecated attributes:++        + `ShapeFile`++        + `Z`++* Now any value that has a defined default can be parsed when the Dot+  code just has `attribute=""` (which `dot -Tcanon` is fond of doing+  to "reset" attributes).++* `GraphvizCommand` now defines `Sfdp` (which had somehow been+  overlooked up till now).++* The `canonicalise` and related functions have been re-written;+  whilst there might be some cases where their behaviour does not+  fully match how `dot -Tcanon` and `tred` behave (due to the+  interaction of various attributes), the new implementation is much+  more sane.++* Use temporary files rather than pipes when running dot, etc.++    Makes it more portable, and also avoids issues where dot, etc. use+    100% CPU when a graph is passed in via stdin.++    Original patch by **Henning Thielemann**.++* `renderCompactDot` now outputs to just one line (which means it's+  shorter, but more difficult to read for a human).++* The QuickCheck instances are a bit smarter now to avoid having such+  ugly huge outputs when a test fails.++* More documentation to help you understand what certain data types+  are for, etc.+ Changes in 2999.15.0.1 ---------------------- @@ -69,6 +143,10 @@ * Error messages from parsing are improved to help you track down   where the parsing error occurred (in that it's easier to find which   attribute failed to parse, etc.).++* Some parsing combinators are no longer publicly accessible, but+  shouldn't be needed by end users anyway (as they were there for+  parsing the Attribute data type).  Changes in 2999.14.1.0 ----------------------
Data/GraphViz/Algorithms.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE MonadComprehensions #-}+ {- |    Module      : Data.GraphViz.Algorithms    Description : Various algorithms on Graphviz graphs.@@ -8,6 +10,10 @@    Defines various algorithms for use on 'DotRepr' graphs.  These are    typically re-implementations of behaviour found in existing Graphviz    tools but without the I/O requirement.++   Note that one way that these algorithms differ from those found in+   Graphviz is that the order of clusters is /not/ maintained, which may+   affect layout in some cases.  -} module Data.GraphViz.Algorithms        ( -- * Canonicalisation Options@@ -16,21 +22,24 @@        , defaultCanonOptions        , dotLikeOptions          -- * Canonicalisation+         -- $canonicalisation        , canonicalise        , canonicaliseOptions          -- * Dealing with transitive edges+         -- $transitive        , transitiveReduction        , transitiveReductionOptions        ) where -import Data.GraphViz.Attributes.Complete( Attributes, usedByClusters-                                        , defaultAttributeValue)+import Data.GraphViz.Attributes.Complete( Attributes, defaultAttributeValue) import Data.GraphViz.Attributes.Same import Data.GraphViz.Types import Data.GraphViz.Types.Canonical+import Data.GraphViz.Types.Common+import Data.GraphViz.Util(bool)  import Data.Function(on)-import Data.List(groupBy, sortBy, partition, (\\), sort, deleteBy)+import Data.List(groupBy, sortBy, partition, (\\), deleteBy) import Data.Maybe(listToMaybe, mapMaybe, fromMaybe) import qualified Data.DList as DList import qualified Data.Map as Map@@ -73,14 +82,38 @@  -- ----------------------------------------------------------------------------- --- | Implements similar functionality to @dot -Tcanon@.  However, this---   method requires no IO and doesn't care about image locations, etc.------   This function will create a single explicit definition for every---   node in the original graph and place it in the appropriate---   position in the cluster hierarchy.  All edges are found in the---   deepest cluster that contains both nodes.  Currently node and---   edge attributes are not grouped into global ones.+{- $canonicalisation++These functions implement similar functionality to @dot -Tcanon@+(i.e. creates a canonical form of any 'DotRepr' graph).  without+requiring IO.++Note that due to implementation specifics the behaviour is not+identical; in particular:++* Any specified 'Attributes' that equal the defaults are stripped out+  (unless required to override a previous attribute that doesn't apply+  here).++* Grouping of attributes (when @'groupAttributes = True'@) is much+  more conservative; only those node/edge attributes that are common to+  /all/ nodes and edges within that cluster (and within sub-clusters)+  are made global.++* Sub-graphs aren't kept, only clusters.++* 'ColorScheme' Attributes are removed (as all @Color@ values embed+  any needed color scheme anyway) as the output order of attributes may+  change (and this matters for the Haskell side of things).++In particular, note that this function will create a single explicit+definition for every node in the original graph and place it in the+appropriate position in the cluster hierarchy.  All edges are found in+the deepest cluster that contains both nodes.++-}++-- | Canonicalise with some sensible defaults. canonicalise :: (DotRepr dg n) => dg n -> DotGraph n canonicalise = canonicaliseOptions defaultCanonOptions @@ -89,126 +122,172 @@                        -> dg n -> DotGraph n canonicaliseOptions opts dg = cdg { strictGraph   = graphIsStrict dg                                   , directedGraph = graphIsDirected dg-                                  , graphID       = getID dg                                   }   where-    cdg = createCanonical opts gas cl nl es+    cdg = createCanonical opts (getID dg) gas cl nl es -    (gas, cl) = graphStructureInformation dg-    nl = nodeInformation True dg-    es = edgeInformation True dg+    (gas, cl) = graphStructureInformationClean dg+    nl = nodeInformationClean True dg+    es = edgeInformationClean True dg -createCanonical :: (Ord n) => CanonicaliseOptions -> GlobalAttributes+type NodePath n = ([Maybe GraphID], DotNode n)+type NodePaths n = [NodePath n]+type EdgeClusters n = Map (Maybe GraphID) [DotEdge n]+type EdgeLocations n = (EdgeClusters n, [DotEdge n])++data CanonControl n = CC { cOpts    :: !CanonicaliseOptions+                         , isGraph  :: !Bool+                         , clusters :: !ClusterLookup+                         , clustEs  :: !(EdgeLocations n)+                         , topID    :: !(Maybe GraphID)+                         , topAttrs :: !Attributes+                         }++createCanonical :: (Ord n) => CanonicaliseOptions -> Maybe GraphID -> GlobalAttributes                    -> ClusterLookup -> NodeLookup n -> [DotEdge n] -> DotGraph n-createCanonical opts gas cl nl es-  = DotGraph { strictGraph     = undefined-             , directedGraph   = undefined-             , graphID         = undefined-             , graphStatements = gStmts-             }+createCanonical opts gid gas cl nl es = promoteDSG $ makeGrouping cc ns   where-    gStmts = DotStmts { attrStmts = gas'-                      , subGraphs = sgs-                      , nodeStmts = topNs'-                      , edgeStmts = topEs'-                      }--    gas' = nonEmptyGAs [ gas-                       , NodeAttrs topNAs-                       , EdgeAttrs topEAs-                       ]     nUnlook (n,(p,as)) = (F.toList p, DotNode n as)     -- DotNodes paired and sorted by their paths     ns = sortBy (compLists `on` fst) . map nUnlook $ Map.toList nl-    -- nodes in clusters vs top-level-    (clustNs, topNs) = thisLevel ns-    -- edges in clusters vs top-level-    (clustEL, topEs) = if edgesInClusters opts-                       then edgeClusters nl es-                       else (Map.empty, es) -    -- The global attributes that are also applicable to clusters.-    topClustAs = filter usedByClusters $ attrs gas-    topClustAs' = toSAttr topClustAs+    es' = if edgesInClusters opts+          then edgeClusters nl es+          else (Map.empty, es) -    topNAs = mCommon nodeAttributes topNs-    topNAs' = toSAttr topNAs-    topNs' = map (\dn -> dn {nodeAttributes = nodeAttributes dn \\ topNAs}) topNs+    cc = CC { cOpts    = opts+            , isGraph  = True+            , clusters = cl+            , clustEs  = es'+            , topID    = gid+            , topAttrs = attrs gas+            } -    topEAs = mCommon edgeAttributes topEs-    topEAs' = toSAttr topEAs-    topEs' = map (\de -> de {edgeAttributes = edgeAttributes de \\ topEAs}) topEs+thisLevel :: NodePaths n -> (NodePaths n, [DotNode n])+thisLevel = second (map snd) . span (not . null . fst) -    sgs = clusts topClustAs topClustAs' topNAs topNAs' topEAs topEAs' clustNs+makeGrouping :: CanonControl n -> NodePaths n -> DotSubGraph n+makeGrouping cc cns = DotSG { isCluster = True+                            , subGraphID = cID+                            , subGraphStmts = stmts+                            }+  where+    cID | isGraph cc = topID cc+        | otherwise  = head . fst . head $ cns -    clusts oAs oAsS nAs nAsS eAs eAsS = map (toClust oAs oAsS nAs nAsS eAs eAsS)-                                        . groupBy ((==) `on` (listToMaybe . fst))+    (nestedNs, ns) = thisLevel+                     . bool (map $ first tail) id (isGraph cc)+                     $ cns -    -- Create a new cluster.-    -- oAs - outer cluster attributes-    -- nAs - outer node attributes-    -- eAs - outer edge attributes-    -- (*S variants are same thing but as sets; premature optimisation?)-    -- cns - nodes in this cluster-    toClust oAs oAsS nAs nAsS eAs eAsS cns-      = DotSG { isCluster     = True-              , subGraphID    = cID-              , subGraphStmts = stmts-              }-      where-        -- Find the ID for this cluster.-        cID = head . fst $ head cns+    es = bool (fromMaybe [] . Map.lookup cID . fst) snd (isGraph cc)+         $ clustEs cc -        -- Get the nodes that are deeper and the ones that belong-        -- here.-        (nested, here) = thisLevel $ map (first tail) cns+    gas | isGraph cc = topAttrs cc+        | otherwise  = attrs . snd $ clusters cc Map.! cID +    subGs = map (makeGrouping $ cc { isGraph = False })+            . groupBy ((==) `on` (listToMaybe . fst))+            $ nestedNs -        stmts = DotStmts { attrStmts = sgAs-                         , subGraphs = subSGs-                         , nodeStmts = here'-                         , edgeStmts = edges'-                         }+    stmts = setGlobal (cOpts cc) gas+            $ DotStmts { attrStmts = []+                       , subGraphs = subGs+                       , nodeStmts = ns+                       , edgeStmts = es+                       } -        -- Starting global attributes-        sgAs = nonEmptyGAs [ GraphAttrs as'-                           , NodeAttrs nas'-                           , EdgeAttrs eas'-                           ]+setGlobal :: CanonicaliseOptions+             -> Attributes -- Specified cluster attributes+             -> DotStatements n+             -> DotStatements n+setGlobal opts as stmts = stmts { attrStmts = globs'+                                , subGraphs = sgs'+                                , nodeStmts = ns'+                                , edgeStmts = es'+                                }+  where+    sgs = subGraphs stmts+    sStmts = map subGraphStmts sgs+    ns = nodeStmts stmts+    es = edgeStmts stmts -        -- Sub-clusters-        subSGs = clusts as asS nas nasS eas easS nested+    sGlobs = map (partitionGlobal . attrStmts) sStmts -        -- The attributes attached to this cluster ID in the original.-        as = attrs . snd $ cl Map.! cID-        asS = toSAttr as+    (sgas,snas,seas) = unzip3 sGlobs -        -- Get the global attributes that apply to this cluster,-        -- ignoring ones set globally.-        as' = fst $ innerAttributes oAs oAsS as+    gas' = as -- Can't change graph attrs! Need these!+    nas' = getCommonGlobs opts nodeStmts snas sStmts $ map nodeAttributes ns+    eas' = getCommonGlobs opts edgeStmts seas sStmts $ map edgeAttributes es -        -- The node attributes that can be stated globally.-        nas = mCommon nodeAttributes here-        nasS = toSAttr nas-        (nas',nOv) = innerAttributes nAs nAsS nas+    globs' = nonEmptyGAs [ GraphAttrs gas'+                         , NodeAttrs  nas'+                         , EdgeAttrs  eas'+                         ]+    ns' = map (\dn -> dn { nodeAttributes = nodeAttributes dn \\ nas' }) ns+    es' = map (\de -> de { edgeAttributes = edgeAttributes de \\ eas' }) es -        -- The nodes that belong here, with updated attributes.-        here' = map (\dn -> dn {nodeAttributes = nodeAttributes dn \\ (nas ++ nOv)}) here+    sgas' = updateGraphGlobs gas' sgas+    snas' = map (\\ nas') snas+    seas' = map (\\ eas') seas -        eas = mCommon edgeAttributes edges-        easS = toSAttr eas-        (eas',eOv) = innerAttributes eAs eAsS eas-        edges' = map (\de -> de {edgeAttributes = edgeAttributes de \\ (eas ++ eOv)}) edges+    sGlobs' = zip3 sgas' snas' seas'+    sStmts' = zipWith (\ sSt sGl -> sSt { attrStmts = nonEmptyGAs $ unPartitionGlobal sGl })+                      sStmts+                      sGlobs' -        -- Find edges that belong here-        edges = fromMaybe [] $ cID `Map.lookup` clustEL+    sgs' = zipWith (\ sg sSt -> sg { subGraphStmts = sSt }) sgs sStmts' -    thisLevel = second (map snd) . span (not . null . fst)+updateGraphGlobs :: Attributes -> [Attributes] -> [Attributes]+updateGraphGlobs gas = map go+  where+    gasS = Set.fromList gas -    mCommon f = if groupAttributes opts-                then commonAttrs f-                else const []+    override = toSAttr $ nonSameDefaults gas +    -- * Remove any identical values+    -- * Override any different values+    go = Set.toList+         . (`Set.difference` gasS) -- Remove identical values+         . unSameSet+         . (`Set.union` override) -- Keeps existing values of constructors+         . toSAttr++nonSameDefaults :: Attributes -> Attributes+nonSameDefaults = mapMaybe (\ a -> [ a' | a' <- defaultAttributeValue a, a' /= a] )++getCommonGlobs :: CanonicaliseOptions+                  -> (DotStatements n -> [a])+                  -> [Attributes] -- ^ From sub-graphs+                  -> [DotStatements n] -- ^ Statements from the sub-graphs for testing.+                  -> [Attributes] -- ^ From nodes/edges+                  -> Attributes+getCommonGlobs opts f sas stmts as+  | not $ groupAttributes opts = []+  | otherwise = case sas' ++ as of+                  []  -> []+                  [_] -> []+                  as' -> Set.toList . foldr1 Set.intersection+                         $ map Set.fromList as'+  where+    sas' = keepIfAny f sas stmts++-- Used to distinguish between having empty list of global attributes+-- for nodes or edges because there aren't any nodes/edges, or because+-- there aren't any common attributes+keepIfAny :: (DotStatements n -> [a]) -> [Attributes] -> [DotStatements n]+             -> [Attributes]+keepIfAny f sas = map fst . filter snd . zip sas . map (hasAny f)++hasAny      :: (DotStatements n -> [a]) -> DotStatements n -> Bool+hasAny f ds = not (null $ f ds) || any (hasAny f . subGraphStmts) (subGraphs ds)++promoteDSG     :: DotSubGraph n -> DotGraph n+promoteDSG dsg = DotGraph { strictGraph     = undefined+                          , directedGraph   = undefined+                          , graphID         = subGraphID dsg+                          , graphStatements = subGraphStmts dsg+                          }+ -- Same as compare for lists, except shorter lists are GT compLists :: (Ord a) => [a] -> [a] -> Ordering compLists []     []     = EQ@@ -221,20 +300,14 @@ nonEmptyGAs :: [GlobalAttributes] -> [GlobalAttributes] nonEmptyGAs = filter (not . null . attrs) --- Return all attributes found in every value.-commonAttrs         :: (a -> Attributes) -> [a] -> Attributes-commonAttrs _ []  = []-commonAttrs f [a] = f a-commonAttrs f xs  = Set.toList . foldr1 Set.intersection-                    $ map (Set.fromList . f) xs- -- Assign each edge into the cluster it belongs in. edgeClusters    :: (Ord n) => NodeLookup n -> [DotEdge n]-                   -> (Map (Maybe GraphID) [DotEdge n], [DotEdge n])+                   -> EdgeLocations n edgeClusters nl = (toM *** map snd) . partition (not . null . fst)                   . map inClust   where     nl' = Map.map (F.toList . fst) nl+    -- DotEdge n -> (Path, DotEdge n)     inClust de@(DotEdge n1 n2 _) = (flip (,) de)                                    . map fst . takeWhile (uncurry (==))                                    $ zip (nl' Map.! n1) (nl' Map.! n2)@@ -242,25 +315,6 @@           . Map.fromListWith (flip DList.append)           . map (last *** DList.singleton) --- Return only those attributes that are required within the inner--- sub-graph.  Also returns the overrides.-innerAttributes                    :: Attributes -> SAttrs-                                      -> Attributes -> (Attributes, Attributes)-innerAttributes outer outerS inner = (sort $ inner' ++ override, override)-  where-    -- Remove all Attributes that are also defined in the outer cluster-    inner' = inner \\ outer--    -- Need to consider those Attributes that were defined /after/ this value-    override = mapMaybe defAttr . unSame-               $ outerS `Set.difference` toSAttr inner--    -- A version of defaultAttributeValue that returns Nothing if the-    -- value it is replacing /is/ the default.-    defAttr a = case defaultAttributeValue a of-                  Just a' | a == a' -> Nothing-                  ma'               -> ma'- -- -----------------------------------------------------------------------------  {- $transitive@@ -299,6 +353,8 @@    Note that transitive reduction only makes sense for directed graphs;    for undirected graphs these functions are identical to the    canonicalisation functions above.++   The caveats for the canonicalisation functions also apply.  -}  transitiveReduction :: (DotRepr dg n) => dg n -> DotGraph n@@ -308,13 +364,12 @@                                       -> dg n -> DotGraph n transitiveReductionOptions opts dg = cdg { strictGraph = graphIsStrict dg                                          , directedGraph = graphIsDirected dg-                                         , graphID = getID dg                                          }   where-    cdg = createCanonical opts gas cl nl es'-    (gas, cl) = graphStructureInformation dg-    nl = nodeInformation True dg-    es = edgeInformation True dg+    cdg = createCanonical opts (getID dg) gas cl nl es'+    (gas, cl) = graphStructureInformationClean dg+    nl = nodeInformationClean True dg+    es = edgeInformationClean True dg     es' | graphIsDirected dg = rmTransEdges es         | otherwise          = es 
Data/GraphViz/Attributes.hs view
@@ -54,6 +54,8 @@        , invis        , filled        , diagonals+       , striped+       , wedged        , rounded        , tapered        , radial@@ -226,24 +228,24 @@ --   clusters, if @'style' 'filled'@ is used, then 'fillColor' will --   override it. bgColor :: (NamedColor nc) => nc -> Attribute-bgColor = BgColor . (:[]) . toColor+bgColor = BgColor . toColorList . (:[]) . toColor  -- | As with 'bgColor', but add a second color to create a gradient --   effect.  Requires Graphviz >= 2.29.0. bgColors       :: (NamedColor nc) => nc -> nc -> Attribute-bgColors c1 c2 = BgColor $ map toColor [c1,c2]+bgColors c1 c2 = BgColor . toColorList $ map toColor [c1,c2]  -- | Specify the fill color of a node, cluster or arrowhead.  Requires --   @'style' 'filled'@ for nodes and clusters.  For nodes and edges, --   if this isn't set then the 'color' value is used instead; for --   clusters, 'bgColor' is used. fillColor :: (NamedColor nc) => nc -> Attribute-fillColor = FillColor . (:[]) . toColor+fillColor = FillColor . toColorList . (:[]) . toColor  -- | As with 'fillColor', but add a second color to create a gradient --   effect.  Requires Graphviz >= 2.29.0. fillColors       :: (NamedColor nc) => nc -> nc -> Attribute-fillColors c1 c2 = FillColor $ map toColor [c1,c2]+fillColors c1 c2 = FillColor . toColorList $ map toColor [c1,c2]  -- | Specify the color of text. fontColor :: (NamedColor nc) => nc -> Attribute@@ -267,7 +269,7 @@ --     background color of nodes and clusters unless 'fillColor' or --     'bgColor' respectively is set. color :: (NamedColor nc) => nc -> Attribute-color = Color . (:[]) . toColor+color = Color . toColorList . (:[]) . toColor  -- ----------------------------------------------------------------------------- @@ -319,6 +321,16 @@ -- | Only available for nodes. diagonals :: Style diagonals = SItem Diagonals []++-- | Only available for rectangularly-shaped nodes and+--   clusters.  Requires Graphviz >= 2.30.0.+striped :: Style+striped = SItem Striped []++-- | Only available for elliptically-shaped nodes.  Requires Graphviz+--   >= 2.30.0.+wedged :: Style+wedged = SItem Wedged []  -- | Only available for edges; creates a tapered edge between the two --   nodes.  Requires Graphviz >= 2.29.0.
Data/GraphViz/Attributes/Colors.hs view
@@ -24,7 +24,12 @@          ColorScheme(..)          -- * Colors        , Color(..)+       , ColorList+       , WeightedColor(..)+       , toWC+       , toColorList        , NamedColor(toColor)+       , toWColor          -- * Conversion to\/from @Colour@.        , toColour        , fromColour@@ -162,7 +167,7 @@                                ++ show cs    parseList = fmap (:[])-              -- Unquoted single color+              -- Potentially unquoted single color               (oneOf [ parseNC (undefined :: BrewerColor) True                      , parseNC (undefined :: SVGColor) True                      , parseX11Color True@@ -175,6 +180,61 @@                  failBad $ "Error parsing list of Colors with color scheme of "                            ++ show cs +-- | The sum of the optional weightings /must/ sum to at most @1@.+type ColorList = [WeightedColor]++-- | A 'Color' tagged with an optional weighting.+data WeightedColor = WC { wColor :: Color+                          -- | Must be in range @0 <= W <= 1@.+                        , weighting :: Maybe Double+                        }+                   deriving (Eq, Ord, Show, Read)++-- | For colors without weightings.+toWC :: Color -> WeightedColor+toWC = (`WC` Nothing)++-- | For a list of colors without weightings.+toColorList :: [Color] -> ColorList+toColorList = map toWC++instance PrintDot WeightedColor where+  unqtDot (WC c mw) = unqtDot c+                      <> maybe empty ((semi<>) . unqtDot) mw++  toDot (WC c Nothing) = toDot c+  toDot wc             = dquotes $ unqtDot wc++  unqtListToDot = hcat . punctuate colon . mapM unqtDot++  -- Might not need quoting+  listToDot [wc] = toDot wc+  listToDot wcs  = dquotes $ unqtListToDot wcs++instance ParseDot WeightedColor where+  parseUnqt = WC <$> parseUnqt <*> optional (character ';' *> parseUnqt)++  parse = quotedParse parseUnqt+          `onFail`+          -- Using parse rather than parseUnqt as there shouldn't be+          -- any quotes, but to avoid copy-pasting the oneOf block.+          (toWC <$> parse)++  parseUnqtList = sepBy1 parseUnqt (character ':')+                  `onFail`+                  do cs <- getColorScheme+                     failBad $ "Error parsing a ColorList with color scheme of "+                               ++ show cs++  parseList = ((:[]) . toWC <$> parse)+              -- Potentially unquoted un-weighted single color+              `onFail`+              quotedParse parseUnqtList+              `onFail`+              do cs <- getColorScheme+                 failBad $ "Error parsing ColorList with color scheme of "+                           ++ show cs+ -- -----------------------------------------------------------------------------  -- | More easily convert named colors to an overall 'Color' value.@@ -188,9 +248,12 @@     -- | Bool is for whether quoting is needed.     parseNC' :: Bool -> Parse nc +toWColor :: (NamedColor nc) => nc -> WeightedColor+toWColor = toWC . toColor+ -- First value just used for type parseNC :: (NamedColor nc) => nc -> Bool -> Parse Color-parseNC nc q = fmap (toColor . flip asTypeOf nc)+parseNC nc q = fmap (toColor . (`asTypeOf` nc))                $ parseNC' q  instance NamedColor BrewerColor where
Data/GraphViz/Attributes/Complete.hs view
@@ -57,7 +57,9 @@    * Not every 'Attribute' is fully documented/described.  However,      all those which have specific allowed values should be covered. -   * Deprecated 'Overlap' algorithms are not defined.+   * Deprecated 'Overlap' algorithms are not defined.  Furthermore,+     the ability to specify an integer prefix for use with the fdp layout+     is /not/ supported.     * The global @Orientation@ attribute is not defined, as it is      difficult to distinguish from the node-based 'Orientation'@@ -81,6 +83,7 @@        , Attributes        , sameAttribute        , defaultAttributeValue+       , rmUnwantedAttributes          -- ** Validity functions on @Attribute@ values.        , usedByGraphs        , usedBySubGraphs@@ -147,6 +150,7 @@        , DPoint(..)           -- ** Layout+       , GraphvizCommand(..)        , GraphSize(..)        , AspectType(..)        , ClusterMode(..)@@ -172,7 +176,9 @@           -- ** Layers        , LayerSep(..)-       , LayerRange(..)+       , LayerListSep(..)+       , LayerRange+       , LayerRangeElem(..)        , LayerID(..)        , LayerList(..) @@ -184,17 +190,17 @@        ) where  import Data.GraphViz.Attributes.Colors-import Data.GraphViz.Attributes.Colors.X11(X11Color(Transparent, Black))+import Data.GraphViz.Attributes.Colors.X11(X11Color(Black)) import qualified Data.GraphViz.Attributes.HTML as Html import Data.GraphViz.Attributes.Internal import Data.GraphViz.Util import Data.GraphViz.Parsing import Data.GraphViz.Printing-import Data.GraphViz.State(getLayerSep, setLayerSep)+import Data.GraphViz.State(getLayerSep, setLayerSep, getLayerListSep, setLayerListSep) import Data.GraphViz.Exception(GraphvizException(NotCustomAttr), throw)  import Data.List(partition, intercalate)-import Data.Maybe(isJust)+import Data.Maybe(isJust, isNothing) import Data.Word(Word16) import qualified Data.Set as S import qualified Data.Text.Lazy as T@@ -245,24 +251,25 @@   = Damping Double                      -- ^ /Valid for/: G; /Default/: @0.99@; /Minimum/: @0.0@; /Notes/: neato only   | K Double                            -- ^ /Valid for/: GC; /Default/: @0.3@; /Minimum/: @0@; /Notes/: sfdp, fdp only   | URL EscString                       -- ^ /Valid for/: ENGC; /Default/: none; /Notes/: svg, postscript, map only+  | Area Double                         -- ^ /Valid for/: NC; /Default/: @1.0@; /Minimum/: @>0@; /Notes/: patchwork only, requires Graphviz >= 2.30.0   | ArrowHead ArrowType                 -- ^ /Valid for/: E; /Default/: @'normal'@   | ArrowSize Double                    -- ^ /Valid for/: E; /Default/: @1.0@; /Minimum/: @0.0@   | ArrowTail ArrowType                 -- ^ /Valid for/: E; /Default/: @'normal'@   | Aspect AspectType                   -- ^ /Valid for/: G; /Notes/: dot only   | BoundingBox Rect                    -- ^ /Valid for/: G; /Notes/: write only-  | ColorScheme ColorScheme             -- ^ /Valid for/: ENCG; /Default/: @'X11'@-  | BgColor [Color]                     -- ^ /Valid for/: GC; /Default/: @['X11Color' 'Transparent']@+  | BgColor ColorList                   -- ^ /Valid for/: GC; /Default/: @[]@   | Center Bool                         -- ^ /Valid for/: G; /Default/: @'False'@; /Parsing Default/: 'True'   | ClusterRank ClusterMode             -- ^ /Valid for/: G; /Default/: @'Local'@; /Notes/: dot only-  | Color [Color]                       -- ^ /Valid for/: ENC; /Default/: @['X11Color' 'Black']@+  | Color ColorList                     -- ^ /Valid for/: ENC; /Default/: @['WC' ('X11Color' 'Black') Nothing]@+  | ColorScheme ColorScheme             -- ^ /Valid for/: ENCG; /Default/: @'X11'@   | Comment Text                        -- ^ /Valid for/: ENG; /Default/: @\"\"@   | Compound Bool                       -- ^ /Valid for/: G; /Default/: @'False'@; /Parsing Default/: 'True'; /Notes/: dot only   | Concentrate Bool                    -- ^ /Valid for/: G; /Default/: @'False'@; /Parsing Default/: 'True'   | Constraint Bool                     -- ^ /Valid for/: E; /Default/: @'True'@; /Parsing Default/: 'True'; /Notes/: dot only   | Decorate Bool                       -- ^ /Valid for/: E; /Default/: @'False'@; /Parsing Default/: 'True'-  | DefaultDist Double                  -- ^ /Valid for/: G; /Default/: @1+(avg. len)*sqrt(abs(V))@; /Minimum/: @epsilon@; /Notes/: neato only, only if @'Pack' 'DontPack'@-  | Dim Int                             -- ^ /Valid for/: G; /Default/: @2@; /Minimum/: @2@; /Notes/: sfdp, fdp, neato only-  | Dimen Int                           -- ^ /Valid for/: G; /Default/: @2@; /Minimum/: @2@; /Notes/: sfdp, fdp, neato only+  | DefaultDist Double                  -- ^ /Valid for/: G; /Default/: @1+(avg. len)*sqrt(abs(V))@ (unable to statically define); /Minimum/: The value of 'Epsilon'.; /Notes/: neato only, only if @'Pack' 'DontPack'@+  | Dim Int                             -- ^ /Valid for/: G; /Default/: @2@; /Minimum/: @2@; /Notes/: maximum of @10@; sfdp, fdp, neato only+  | Dimen Int                           -- ^ /Valid for/: G; /Default/: @2@; /Minimum/: @2@; /Notes/: maximum of @10@; sfdp, fdp, neato only   | Dir DirType                         -- ^ /Valid for/: E; /Default/: @'Forward'@ (directed), @'NoDir'@ (undirected)   | DirEdgeConstraints DEConstraints    -- ^ /Valid for/: G; /Default/: @'NoConstraints'@; /Parsing Default/: 'EdgeConstraints'; /Notes/: neato only   | Distortion Double                   -- ^ /Valid for/: N; /Default/: @0.0@; /Minimum/: @-100.0@@@ -272,17 +279,18 @@   | EdgeTooltip EscString               -- ^ /Valid for/: E; /Default/: @\"\"@; /Notes/: svg, cmap only   | Epsilon Double                      -- ^ /Valid for/: G; /Default/: @.0001 * # nodes@ (@mode == 'KK'@), @.0001@ (@mode == 'Major'@); /Notes/: neato only   | ESep DPoint                         -- ^ /Valid for/: G; /Default/: @'DVal' 3@; /Notes/: not dot-  | FillColor [Color]                   -- ^ /Valid for/: NEC; /Default/: @['X11Color' 'LightGray']@ (nodes), @['X11Color' 'Black']@ (clusters)+  | FillColor ColorList                 -- ^ /Valid for/: NEC; /Default/: @['WC' ('X11Color' 'LightGray') Nothing]@ (nodes), @['WC' ('X11Color' 'Black') Nothing]@ (clusters)   | FixedSize Bool                      -- ^ /Valid for/: N; /Default/: @'False'@; /Parsing Default/: 'True'   | FontColor Color                     -- ^ /Valid for/: ENGC; /Default/: @'X11Color' 'Black'@   | FontName Text                       -- ^ /Valid for/: ENGC; /Default/: @\"Times-Roman\"@   | FontNames SVGFontNames              -- ^ /Valid for/: G; /Default/: @'SvgNames'@; /Notes/: svg only-  | FontPath Text                       -- ^ /Valid for/: G; /Default/: system dependent+  | FontPath Paths                      -- ^ /Valid for/: G; /Default/: system dependent   | FontSize Double                     -- ^ /Valid for/: ENGC; /Default/: @14.0@; /Minimum/: @1.0@-  | ForceLabels Bool                    -- ^ /Valid for/: G; /Default/: @'False'@; /Parsing Default/: 'True'; /Notes/: Only for 'XLabel' attributes, requires Graphviz >= 2.29.0+  | ForceLabels Bool                    -- ^ /Valid for/: G; /Default/: @'True'@; /Parsing Default/: 'True'; /Notes/: only for 'XLabel' attributes, requires Graphviz >= 2.29.0   | GradientAngle Int                   -- ^ /Valid for/: NCG; /Default/: 0; /Notes/: requires Graphviz >= 2.29.0   | Group Text                          -- ^ /Valid for/: N; /Default/: @\"\"@; /Notes/: dot only   | HeadURL EscString                   -- ^ /Valid for/: E; /Default/: @\"\"@; /Notes/: svg, map only+  | Head_LP Point                       -- ^ /Valid for/: E; /Notes/: write only, requires Graphviz >= 2.30.0   | HeadClip Bool                       -- ^ /Valid for/: E; /Default/: @'True'@; /Parsing Default/: 'True'   | HeadLabel Label                     -- ^ /Valid for/: E; /Default/: @'StrLabel' \"\"@   | HeadPort PortPos                    -- ^ /Valid for/: E; /Default/: @'CompassPoint' 'CenterPoint'@@@ -307,13 +315,15 @@   | LabelTarget EscString               -- ^ /Valid for/: E; /Default/: none; /Notes/: svg, map only   | LabelTooltip EscString              -- ^ /Valid for/: E; /Default/: @\"\"@; /Notes/: svg, cmap only   | Landscape Bool                      -- ^ /Valid for/: G; /Default/: @'False'@; /Parsing Default/: 'True'-  | Layer LayerRange                    -- ^ /Valid for/: EN+  | Layer LayerRange                    -- ^ /Valid for/: EN; /Default/: @[]@+  | LayerListSep LayerListSep           -- ^ /Valid for/: G; /Default/: @'LLSep' \",\"@; /Notes/: requires Graphviz >= 2.30.0   | Layers LayerList                    -- ^ /Valid for/: G; /Default/: @'LL' []@+  | LayerSelect LayerRange              -- ^ /Valid for/: G; /Default/: @[]@   | LayerSep LayerSep                   -- ^ /Valid for/: G; /Default/: @'LSep' \" :\t\"@-  | Layout Text                         -- ^ /Valid for/: G; /Default/: @\"\"@+  | Layout GraphvizCommand              -- ^ /Valid for/: G   | Len Double                          -- ^ /Valid for/: E; /Default/: @1.0@ (neato), @0.3@ (fdp); /Notes/: fdp, neato only-  | LevelsGap Double                    -- ^ /Valid for/: G; /Default/: @0.0@; /Notes/: neato only   | Levels Int                          -- ^ /Valid for/: G; /Default/: @'maxBound'@; /Minimum/: @0@; /Notes/: sfdp only+  | LevelsGap Double                    -- ^ /Valid for/: G; /Default/: @0.0@; /Notes/: neato only   | LHead Text                          -- ^ /Valid for/: E; /Default/: @\"\"@; /Notes/: dot only   | LHeight Double                      -- ^ /Valid for/: GC; /Notes/: write only, requires Graphviz >= 2.28.0   | LPos Point                          -- ^ /Valid for/: EGC; /Notes/: write only@@ -367,18 +377,18 @@   | SearchSize Int                      -- ^ /Valid for/: G; /Default/: @30@; /Notes/: dot only   | Sep DPoint                          -- ^ /Valid for/: G; /Default/: @'DVal' 4@; /Notes/: not dot   | Shape Shape                         -- ^ /Valid for/: N; /Default/: @'Ellipse'@-  | ShapeFile Text                      -- ^ /Valid for/: N; /Default/: @\"\"@-  | ShowBoxes Int                       -- ^ /Valid for/: ENG; /Default/: @0@; /Minimum/: @0@; /Notes/: dot only+  | ShowBoxes Int                       -- ^ /Valid for/: ENG; /Default/: @0@; /Minimum/: @0@; /Notes/: dot only; used for debugging by printing PostScript guide boxes   | Sides Int                           -- ^ /Valid for/: N; /Default/: @4@; /Minimum/: @0@   | Size GraphSize                      -- ^ /Valid for/: G   | Skew Double                         -- ^ /Valid for/: N; /Default/: @0.0@; /Minimum/: @-100.0@   | Smoothing SmoothType                -- ^ /Valid for/: G; /Default/: @'NoSmooth'@; /Notes/: sfdp only   | SortV Word16                        -- ^ /Valid for/: GCN; /Default/: @0@; /Minimum/: @0@-  | Splines EdgeType                    -- ^ /Valid for/: G; /Parsing Default/: 'SplineEdges'-  | Start StartType                     -- ^ /Valid for/: G; /Notes/: fdp, neato only+  | Splines EdgeType                    -- ^ /Valid for/: G; /Default/: @'SplineEdges'@ (dot), @'LineEdges'@ (other); /Parsing Default/: 'SplineEdges'+  | Start StartType                     -- ^ /Valid for/: G; /Default/: @'StartStyleSeed' 'RandomStyle' seed@ for some unknown fixed seed.; /Notes/: fdp, neato only   | Style [StyleItem]                   -- ^ /Valid for/: ENC   | StyleSheet Text                     -- ^ /Valid for/: G; /Default/: @\"\"@; /Notes/: svg only   | TailURL EscString                   -- ^ /Valid for/: E; /Default/: @\"\"@; /Notes/: svg, map only+  | Tail_LP Point                       -- ^ /Valid for/: E; /Notes/: write only   | TailClip Bool                       -- ^ /Valid for/: E; /Default/: @'True'@; /Parsing Default/: 'True'   | TailLabel Label                     -- ^ /Valid for/: E; /Default/: @'StrLabel' \"\"@   | TailPort PortPos                    -- ^ /Valid for/: E; /Default/: @'CompassPoint' 'CenterPoint'@@@ -393,7 +403,7 @@   | Weight Double                       -- ^ /Valid for/: E; /Default/: @1.0@; /Minimum/: @0@ (dot), @1@ (neato,fdp,sfdp)   | Width Double                        -- ^ /Valid for/: N; /Default/: @0.75@; /Minimum/: @0.01@   | XLabel Label                        -- ^ /Valid for/: EN; /Default/: @'StrLabel' \"\"@; /Notes/: requires Graphviz >= 2.29.0-  | Z Double                            -- ^ /Valid for/: N; /Default/: @0.0@; /Minimum/: @-MAXFLOAT@, @-1000@+  | XLP Point                           -- ^ /Valid for/: EN; /Notes/: write only, requires Graphviz >= 2.29.0   | UnknownAttribute AttributeName Text -- ^ /Valid for/: Assumed valid for all; the fields are 'Attribute' name and value respectively.   deriving (Eq, Ord, Show, Read) @@ -406,16 +416,17 @@   unqtDot (Damping v)            = printField "Damping" v   unqtDot (K v)                  = printField "K" v   unqtDot (URL v)                = printField "URL" v+  unqtDot (Area v)               = printField "area" v   unqtDot (ArrowHead v)          = printField "arrowhead" v   unqtDot (ArrowSize v)          = printField "arrowsize" v   unqtDot (ArrowTail v)          = printField "arrowtail" v   unqtDot (Aspect v)             = printField "aspect" v   unqtDot (BoundingBox v)        = printField "bb" v-  unqtDot (ColorScheme v)        = printField "colorscheme" v   unqtDot (BgColor v)            = printField "bgcolor" v   unqtDot (Center v)             = printField "center" v   unqtDot (ClusterRank v)        = printField "clusterrank" v   unqtDot (Color v)              = printField "color" v+  unqtDot (ColorScheme v)        = printField "colorscheme" v   unqtDot (Comment v)            = printField "comment" v   unqtDot (Compound v)           = printField "compound" v   unqtDot (Concentrate v)        = printField "concentrate" v@@ -444,6 +455,7 @@   unqtDot (GradientAngle v)      = printField "gradientangle" v   unqtDot (Group v)              = printField "group" v   unqtDot (HeadURL v)            = printField "headURL" v+  unqtDot (Head_LP v)            = printField "head_lp" v   unqtDot (HeadClip v)           = printField "headclip" v   unqtDot (HeadLabel v)          = printField "headlabel" v   unqtDot (HeadPort v)           = printField "headport" v@@ -469,12 +481,14 @@   unqtDot (LabelTooltip v)       = printField "labeltooltip" v   unqtDot (Landscape v)          = printField "landscape" v   unqtDot (Layer v)              = printField "layer" v+  unqtDot (LayerListSep v)       = printField "layerlistsep" v   unqtDot (Layers v)             = printField "layers" v+  unqtDot (LayerSelect v)        = printField "layerselect" v   unqtDot (LayerSep v)           = printField "layersep" v   unqtDot (Layout v)             = printField "layout" v   unqtDot (Len v)                = printField "len" v-  unqtDot (LevelsGap v)          = printField "levelsgap" v   unqtDot (Levels v)             = printField "levels" v+  unqtDot (LevelsGap v)          = printField "levelsgap" v   unqtDot (LHead v)              = printField "lhead" v   unqtDot (LHeight v)            = printField "LHeight" v   unqtDot (LPos v)               = printField "lp" v@@ -528,7 +542,6 @@   unqtDot (SearchSize v)         = printField "searchsize" v   unqtDot (Sep v)                = printField "sep" v   unqtDot (Shape v)              = printField "shape" v-  unqtDot (ShapeFile v)          = printField "shapefile" v   unqtDot (ShowBoxes v)          = printField "showboxes" v   unqtDot (Sides v)              = printField "sides" v   unqtDot (Size v)               = printField "size" v@@ -540,6 +553,7 @@   unqtDot (Style v)              = printField "style" v   unqtDot (StyleSheet v)         = printField "stylesheet" v   unqtDot (TailURL v)            = printField "tailURL" v+  unqtDot (Tail_LP v)            = printField "tail_lp" v   unqtDot (TailClip v)           = printField "tailclip" v   unqtDot (TailLabel v)          = printField "taillabel" v   unqtDot (TailPort v)           = printField "tailport" v@@ -554,36 +568,37 @@   unqtDot (Weight v)             = printField "weight" v   unqtDot (Width v)              = printField "width" v   unqtDot (XLabel v)             = printField "xlabel" v-  unqtDot (Z v)                  = printField "z" v+  unqtDot (XLP v)                = printField "xlp" v   unqtDot (UnknownAttribute a v) = toDot a <> equals <> toDot v    listToDot = unqtListToDot  instance ParseDot Attribute where-  parseUnqt = stringParse (concat [ parseFieldNumDef Damping 0.99 "Damping"-                                  , parseFieldNumDef K 0.3 "K"+  parseUnqt = stringParse (concat [ parseField Damping "Damping"+                                  , parseField K "K"                                   , parseFields URL ["URL", "href"]+                                  , parseField Area "area"                                   , parseField ArrowHead "arrowhead"-                                  , parseFieldNumDef ArrowSize 1 "arrowsize"+                                  , parseField ArrowSize "arrowsize"                                   , parseField ArrowTail "arrowtail"                                   , parseField Aspect "aspect"                                   , parseField BoundingBox "bb"-                                  , parseField ColorScheme "colorscheme"                                   , parseField BgColor "bgcolor"                                   , parseFieldBool Center "center"                                   , parseField ClusterRank "clusterrank"                                   , parseField Color "color"+                                  , parseField ColorScheme "colorscheme"                                   , parseField Comment "comment"                                   , parseFieldBool Compound "compound"                                   , parseFieldBool Concentrate "concentrate"                                   , parseFieldBool Constraint "constraint"                                   , parseFieldBool Decorate "decorate"                                   , parseField DefaultDist "defaultdist"-                                  , parseFieldNumDef Dim 2 "dim"-                                  , parseFieldNumDef Dimen 2 "dimen"+                                  , parseField Dim "dim"+                                  , parseField Dimen "dimen"                                   , parseField Dir "dir"                                   , parseFieldDef DirEdgeConstraints EdgeConstraints "diredgeconstraints"-                                  , parseFieldNumDef Distortion 0 "distortion"+                                  , parseField Distortion "distortion"                                   , parseFields DPI ["dpi", "resolution"]                                   , parseFields EdgeURL ["edgeURL", "edgehref"]                                   , parseField EdgeTarget "edgetarget"@@ -596,17 +611,18 @@                                   , parseField FontName "fontname"                                   , parseField FontNames "fontnames"                                   , parseField FontPath "fontpath"-                                  , parseFieldNumDef FontSize 14 "fontsize"+                                  , parseField FontSize "fontsize"                                   , parseFieldBool ForceLabels "forcelabels"-                                  , parseFieldNumDef GradientAngle 0 "gradientangle"+                                  , parseField GradientAngle "gradientangle"                                   , parseField Group "group"                                   , parseFields HeadURL ["headURL", "headhref"]+                                  , parseField Head_LP "head_lp"                                   , parseFieldBool HeadClip "headclip"                                   , parseField HeadLabel "headlabel"                                   , parseField HeadPort "headport"                                   , parseField HeadTarget "headtarget"                                   , parseField HeadTooltip "headtooltip"-                                  , parseFieldNumDef Height 0.5 "height"+                                  , parseField Height "height"                                   , parseField ID "id"                                   , parseField Image "image"                                   , parseField ImagePath "imagepath"@@ -614,24 +630,26 @@                                   , parseField Label "label"                                   , parseFields LabelURL ["labelURL", "labelhref"]                                   , parseField LabelScheme "label_scheme"-                                  , parseFieldNumDef LabelAngle (-25) "labelangle"-                                  , parseFieldNumDef LabelDistance 1 "labeldistance"+                                  , parseField LabelAngle "labelangle"+                                  , parseField LabelDistance "labeldistance"                                   , parseFieldBool LabelFloat "labelfloat"                                   , parseField LabelFontColor "labelfontcolor"                                   , parseField LabelFontName "labelfontname"-                                  , parseFieldNumDef LabelFontSize 14 "labelfontsize"+                                  , parseField LabelFontSize "labelfontsize"                                   , parseField LabelJust "labeljust"                                   , parseField LabelLoc "labelloc"                                   , parseField LabelTarget "labeltarget"                                   , parseField LabelTooltip "labeltooltip"                                   , parseFieldBool Landscape "landscape"                                   , parseField Layer "layer"+                                  , parseField LayerListSep "layerlistsep"                                   , parseField Layers "layers"+                                  , parseField LayerSelect "layerselect"                                   , parseField LayerSep "layersep"                                   , parseField Layout "layout"                                   , parseField Len "len"-                                  , parseFieldNumDef LevelsGap 0 "levelsgap"-                                  , parseFieldNumDef Levels maxBound "levels"+                                  , parseField Levels "levels"+                                  , parseField LevelsGap "levelsgap"                                   , parseField LHead "lhead"                                   , parseField LHeight "LHeight"                                   , parseField LPos "lp"@@ -639,34 +657,34 @@                                   , parseField LWidth "lwidth"                                   , parseField Margin "margin"                                   , parseField MaxIter "maxiter"-                                  , parseFieldNumDef MCLimit 1 "mclimit"-                                  , parseFieldNumDef MinDist 1 "mindist"-                                  , parseFieldNumDef MinLen 1 "minlen"+                                  , parseField MCLimit "mclimit"+                                  , parseField MinDist "mindist"+                                  , parseField MinLen "minlen"                                   , parseField Mode "mode"                                   , parseField Model "model"                                   , parseFieldBool Mosek "mosek"-                                  , parseFieldNumDef NodeSep 0.25 "nodesep"+                                  , parseField NodeSep "nodesep"                                   , parseFieldBool NoJustify "nojustify"                                   , parseFieldBool Normalize "normalize"                                   , parseField Nslimit "nslimit"                                   , parseField Nslimit1 "nslimit1"                                   , parseField Ordering "ordering"-                                  , parseFieldNumDef Orientation 0 "orientation"+                                  , parseField Orientation "orientation"                                   , parseField OutputOrder "outputorder"                                   , parseFieldDef Overlap KeepOverlaps "overlap"-                                  , parseFieldNumDef OverlapScaling (-4) "overlap_scaling"+                                  , parseField OverlapScaling "overlap_scaling"                                   , parseFieldDef Pack DoPack "pack"                                   , parseField PackMode "packmode"                                   , parseField Pad "pad"                                   , parseField Page "page"                                   , parseField PageDir "pagedir"                                   , parseField PenColor "pencolor"-                                  , parseFieldNumDef PenWidth 1 "penwidth"-                                  , parseFieldNumDef Peripheries 1 "peripheries"+                                  , parseField PenWidth "penwidth"+                                  , parseField Peripheries "peripheries"                                   , parseFieldBool Pin "pin"                                   , parseField Pos "pos"                                   , parseFieldDef QuadTree NormalQT "quadtree"-                                  , parseFieldNumDef Quantum 0 "quantum"+                                  , parseField Quantum "quantum"                                   , parseField Rank "rank"                                   , parseField RankDir "rankdir"                                   , parseField RankSep "ranksep"@@ -674,22 +692,21 @@                                   , parseField Rects "rects"                                   , parseFieldBool Regular "regular"                                   , parseFieldBool ReMinCross "remincross"-                                  , parseFieldNumDef RepulsiveForce 1 "repulsiveforce"+                                  , parseField RepulsiveForce "repulsiveforce"                                   , parseFieldDef Root IsCentral "root"-                                  , parseFieldNumDef Rotate 0 "rotate"-                                  , parseFieldNumDef Rotation 0 "rotation"+                                  , parseField Rotate "rotate"+                                  , parseField Rotation "rotation"                                   , parseField SameHead "samehead"                                   , parseField SameTail "sametail"                                   , parseField SamplePoints "samplepoints"                                   , parseField Scale "scale"-                                  , parseFieldNumDef SearchSize 30 "searchsize"+                                  , parseField SearchSize "searchsize"                                   , parseField Sep "sep"                                   , parseField Shape "shape"-                                  , parseField ShapeFile "shapefile"-                                  , parseFieldNumDef ShowBoxes 0 "showboxes"-                                  , parseFieldNumDef Sides 4 "sides"+                                  , parseField ShowBoxes "showboxes"+                                  , parseField Sides "sides"                                   , parseField Size "size"-                                  , parseFieldNumDef Skew 0 "skew"+                                  , parseField Skew "skew"                                   , parseField Smoothing "smoothing"                                   , parseField SortV "sortv"                                   , parseFieldDef Splines SplineEdges "splines"@@ -697,6 +714,7 @@                                   , parseField Style "style"                                   , parseField StyleSheet "stylesheet"                                   , parseFields TailURL ["tailURL", "tailhref"]+                                  , parseField Tail_LP "tail_lp"                                   , parseFieldBool TailClip "tailclip"                                   , parseField TailLabel "taillabel"                                   , parseField TailPort "tailport"@@ -707,16 +725,16 @@                                   , parseFieldBool TrueColor "truecolor"                                   , parseField Vertices "vertices"                                   , parseField ViewPort "viewport"-                                  , parseFieldNumDef VoroMargin 0.05 "voro_margin"+                                  , parseField VoroMargin "voro_margin"                                   , parseField Weight "weight"-                                  , parseFieldNumDef Width 0.75 "width"+                                  , parseField Width "width"                                   , parseField XLabel "xlabel"-                                  , parseFieldNumDef Z 0 "z"+                                  , parseField XLP "xlp"                                   ])               `onFail`               do attrName <- stringBlock-                 liftEqParse' ("UnknownAttribute (" ++ T.unpack attrName ++ ")")-                              (UnknownAttribute attrName)+                 liftEqParse ("UnknownAttribute (" ++ T.unpack attrName ++ ")")+                             (UnknownAttribute attrName)    parse = parseUnqt @@ -729,10 +747,10 @@ usedByGraphs URL{}                = True usedByGraphs Aspect{}             = True usedByGraphs BoundingBox{}        = True-usedByGraphs ColorScheme{}        = True usedByGraphs BgColor{}            = True usedByGraphs Center{}             = True usedByGraphs ClusterRank{}        = True+usedByGraphs ColorScheme{}        = True usedByGraphs Comment{}            = True usedByGraphs Compound{}           = True usedByGraphs Concentrate{}        = True@@ -757,11 +775,13 @@ usedByGraphs LabelJust{}          = True usedByGraphs LabelLoc{}           = True usedByGraphs Landscape{}          = True+usedByGraphs LayerListSep{}       = True usedByGraphs Layers{}             = True+usedByGraphs LayerSelect{}        = True usedByGraphs LayerSep{}           = True usedByGraphs Layout{}             = True-usedByGraphs LevelsGap{}          = True usedByGraphs Levels{}             = True+usedByGraphs LevelsGap{}          = True usedByGraphs LHeight{}            = True usedByGraphs LPos{}               = True usedByGraphs LWidth{}             = True@@ -817,9 +837,10 @@ usedByClusters                    :: Attribute -> Bool usedByClusters K{}                = True usedByClusters URL{}              = True-usedByClusters ColorScheme{}      = True+usedByClusters Area{}             = True usedByClusters BgColor{}          = True usedByClusters Color{}            = True+usedByClusters ColorScheme{}      = True usedByClusters FillColor{}        = True usedByClusters FontColor{}        = True usedByClusters FontName{}         = True@@ -852,8 +873,9 @@ -- | Determine if this 'Attribute' is valid for use with Nodes. usedByNodes                    :: Attribute -> Bool usedByNodes URL{}              = True-usedByNodes ColorScheme{}      = True+usedByNodes Area{}             = True usedByNodes Color{}            = True+usedByNodes ColorScheme{}      = True usedByNodes Comment{}          = True usedByNodes Distortion{}       = True usedByNodes FillColor{}        = True@@ -883,7 +905,6 @@ usedByNodes Root{}             = True usedByNodes SamplePoints{}     = True usedByNodes Shape{}            = True-usedByNodes ShapeFile{}        = True usedByNodes ShowBoxes{}        = True usedByNodes Sides{}            = True usedByNodes Skew{}             = True@@ -894,7 +915,7 @@ usedByNodes Vertices{}         = True usedByNodes Width{}            = True usedByNodes XLabel{}           = True-usedByNodes Z{}                = True+usedByNodes XLP{}              = True usedByNodes UnknownAttribute{} = True usedByNodes _                  = False @@ -904,8 +925,8 @@ usedByEdges ArrowHead{}        = True usedByEdges ArrowSize{}        = True usedByEdges ArrowTail{}        = True-usedByEdges ColorScheme{}      = True usedByEdges Color{}            = True+usedByEdges ColorScheme{}      = True usedByEdges Comment{}          = True usedByEdges Constraint{}       = True usedByEdges Decorate{}         = True@@ -918,6 +939,7 @@ usedByEdges FontName{}         = True usedByEdges FontSize{}         = True usedByEdges HeadURL{}          = True+usedByEdges Head_LP{}          = True usedByEdges HeadClip{}         = True usedByEdges HeadLabel{}        = True usedByEdges HeadPort{}         = True@@ -948,6 +970,7 @@ usedByEdges ShowBoxes{}        = True usedByEdges Style{}            = True usedByEdges TailURL{}          = True+usedByEdges Tail_LP{}          = True usedByEdges TailClip{}         = True usedByEdges TailLabel{}        = True usedByEdges TailPort{}         = True@@ -957,6 +980,7 @@ usedByEdges Tooltip{}          = True usedByEdges Weight{}           = True usedByEdges XLabel{}           = True+usedByEdges XLP{}              = True usedByEdges UnknownAttribute{} = True usedByEdges _                  = False @@ -965,16 +989,17 @@ sameAttribute Damping{}               Damping{}               = True sameAttribute K{}                     K{}                     = True sameAttribute URL{}                   URL{}                   = True+sameAttribute Area{}                  Area{}                  = True sameAttribute ArrowHead{}             ArrowHead{}             = True sameAttribute ArrowSize{}             ArrowSize{}             = True sameAttribute ArrowTail{}             ArrowTail{}             = True sameAttribute Aspect{}                Aspect{}                = True sameAttribute BoundingBox{}           BoundingBox{}           = True-sameAttribute ColorScheme{}           ColorScheme{}           = True sameAttribute BgColor{}               BgColor{}               = True sameAttribute Center{}                Center{}                = True sameAttribute ClusterRank{}           ClusterRank{}           = True sameAttribute Color{}                 Color{}                 = True+sameAttribute ColorScheme{}           ColorScheme{}           = True sameAttribute Comment{}               Comment{}               = True sameAttribute Compound{}              Compound{}              = True sameAttribute Concentrate{}           Concentrate{}           = True@@ -1003,6 +1028,7 @@ sameAttribute GradientAngle{}         GradientAngle{}         = True sameAttribute Group{}                 Group{}                 = True sameAttribute HeadURL{}               HeadURL{}               = True+sameAttribute Head_LP{}               Head_LP{}               = True sameAttribute HeadClip{}              HeadClip{}              = True sameAttribute HeadLabel{}             HeadLabel{}             = True sameAttribute HeadPort{}              HeadPort{}              = True@@ -1028,12 +1054,14 @@ sameAttribute LabelTooltip{}          LabelTooltip{}          = True sameAttribute Landscape{}             Landscape{}             = True sameAttribute Layer{}                 Layer{}                 = True+sameAttribute LayerListSep{}          LayerListSep{}          = True sameAttribute Layers{}                Layers{}                = True+sameAttribute LayerSelect{}           LayerSelect{}           = True sameAttribute LayerSep{}              LayerSep{}              = True sameAttribute Layout{}                Layout{}                = True sameAttribute Len{}                   Len{}                   = True-sameAttribute LevelsGap{}             LevelsGap{}             = True sameAttribute Levels{}                Levels{}                = True+sameAttribute LevelsGap{}             LevelsGap{}             = True sameAttribute LHead{}                 LHead{}                 = True sameAttribute LHeight{}               LHeight{}               = True sameAttribute LPos{}                  LPos{}                  = True@@ -1087,7 +1115,6 @@ sameAttribute SearchSize{}            SearchSize{}            = True sameAttribute Sep{}                   Sep{}                   = True sameAttribute Shape{}                 Shape{}                 = True-sameAttribute ShapeFile{}             ShapeFile{}             = True sameAttribute ShowBoxes{}             ShowBoxes{}             = True sameAttribute Sides{}                 Sides{}                 = True sameAttribute Size{}                  Size{}                  = True@@ -1099,6 +1126,7 @@ sameAttribute Style{}                 Style{}                 = True sameAttribute StyleSheet{}            StyleSheet{}            = True sameAttribute TailURL{}               TailURL{}               = True+sameAttribute Tail_LP{}               Tail_LP{}               = True sameAttribute TailClip{}              TailClip{}              = True sameAttribute TailLabel{}             TailLabel{}             = True sameAttribute TailPort{}              TailPort{}              = True@@ -1113,7 +1141,7 @@ sameAttribute Weight{}                Weight{}                = True sameAttribute Width{}                 Width{}                 = True sameAttribute XLabel{}                XLabel{}                = True-sameAttribute Z{}                     Z{}                     = True+sameAttribute XLP{}                   XLP{}                   = True sameAttribute (UnknownAttribute a1 _) (UnknownAttribute a2 _) = a1 == a2 sameAttribute _                       _                       = False @@ -1122,14 +1150,15 @@ defaultAttributeValue Damping{}            = Just $ Damping 0.99 defaultAttributeValue K{}                  = Just $ K 0.3 defaultAttributeValue URL{}                = Just $ URL ""+defaultAttributeValue Area{}               = Just $ Area 1.0 defaultAttributeValue ArrowHead{}          = Just $ ArrowHead normal-defaultAttributeValue ArrowSize{}          = Just $ ArrowSize 1+defaultAttributeValue ArrowSize{}          = Just $ ArrowSize 1.0 defaultAttributeValue ArrowTail{}          = Just $ ArrowTail normal-defaultAttributeValue ColorScheme{}        = Just $ ColorScheme X11-defaultAttributeValue BgColor{}            = Just $ BgColor [X11Color Transparent]+defaultAttributeValue BgColor{}            = Just $ BgColor [] defaultAttributeValue Center{}             = Just $ Center False defaultAttributeValue ClusterRank{}        = Just $ ClusterRank Local-defaultAttributeValue Color{}              = Just $ Color [X11Color Black]+defaultAttributeValue Color{}              = Just $ Color [toWColor Black]+defaultAttributeValue ColorScheme{}        = Just $ ColorScheme X11 defaultAttributeValue Comment{}            = Just $ Comment "" defaultAttributeValue Compound{}           = Just $ Compound False defaultAttributeValue Concentrate{}        = Just $ Concentrate False@@ -1138,16 +1167,18 @@ defaultAttributeValue Dim{}                = Just $ Dim 2 defaultAttributeValue Dimen{}              = Just $ Dimen 2 defaultAttributeValue DirEdgeConstraints{} = Just $ DirEdgeConstraints NoConstraints-defaultAttributeValue Distortion{}         = Just $ Distortion 0+defaultAttributeValue Distortion{}         = Just $ Distortion 0.0+defaultAttributeValue DPI{}                = Just $ DPI 96.0 defaultAttributeValue EdgeURL{}            = Just $ EdgeURL ""+defaultAttributeValue EdgeTooltip{}        = Just $ EdgeTooltip "" defaultAttributeValue ESep{}               = Just $ ESep (DVal 3)-defaultAttributeValue FillColor{}          = Just $ FillColor [X11Color Black]+defaultAttributeValue FillColor{}          = Just $ FillColor [toWColor Black] defaultAttributeValue FixedSize{}          = Just $ FixedSize False defaultAttributeValue FontColor{}          = Just $ FontColor (X11Color Black) defaultAttributeValue FontName{}           = Just $ FontName "Times-Roman" defaultAttributeValue FontNames{}          = Just $ FontNames SvgNames-defaultAttributeValue FontSize{}           = Just $ FontSize 14-defaultAttributeValue ForceLabels{}        = Just $ ForceLabels False+defaultAttributeValue FontSize{}           = Just $ FontSize 14.0+defaultAttributeValue ForceLabels{}        = Just $ ForceLabels True defaultAttributeValue GradientAngle{}      = Just $ GradientAngle 0 defaultAttributeValue Group{}              = Just $ Group "" defaultAttributeValue HeadURL{}            = Just $ HeadURL ""@@ -1164,26 +1195,28 @@ defaultAttributeValue Label{}              = Just $ Label (StrLabel "") defaultAttributeValue LabelURL{}           = Just $ LabelURL "" defaultAttributeValue LabelScheme{}        = Just $ LabelScheme NotEdgeLabel-defaultAttributeValue LabelAngle{}         = Just $ LabelAngle (-25)-defaultAttributeValue LabelDistance{}      = Just $ LabelDistance 1+defaultAttributeValue LabelAngle{}         = Just $ LabelAngle (-25.0)+defaultAttributeValue LabelDistance{}      = Just $ LabelDistance 1.0 defaultAttributeValue LabelFloat{}         = Just $ LabelFloat False defaultAttributeValue LabelFontColor{}     = Just $ LabelFontColor (X11Color Black) defaultAttributeValue LabelFontName{}      = Just $ LabelFontName "Times-Roman"-defaultAttributeValue LabelFontSize{}      = Just $ LabelFontSize 14+defaultAttributeValue LabelFontSize{}      = Just $ LabelFontSize 14.0 defaultAttributeValue LabelJust{}          = Just $ LabelJust JCenter defaultAttributeValue LabelLoc{}           = Just $ LabelLoc VTop defaultAttributeValue LabelTarget{}        = Just $ LabelTarget "" defaultAttributeValue LabelTooltip{}       = Just $ LabelTooltip "" defaultAttributeValue Landscape{}          = Just $ Landscape False+defaultAttributeValue Layer{}              = Just $ Layer []+defaultAttributeValue LayerListSep{}       = Just $ LayerListSep (LLSep ",") defaultAttributeValue Layers{}             = Just $ Layers (LL [])+defaultAttributeValue LayerSelect{}        = Just $ LayerSelect [] defaultAttributeValue LayerSep{}           = Just $ LayerSep (LSep " :\t")-defaultAttributeValue Layout{}             = Just $ Layout ""-defaultAttributeValue LevelsGap{}          = Just $ LevelsGap 0 defaultAttributeValue Levels{}             = Just $ Levels maxBound+defaultAttributeValue LevelsGap{}          = Just $ LevelsGap 0.0 defaultAttributeValue LHead{}              = Just $ LHead "" defaultAttributeValue LTail{}              = Just $ LTail ""-defaultAttributeValue MCLimit{}            = Just $ MCLimit 1-defaultAttributeValue MinDist{}            = Just $ MinDist 1+defaultAttributeValue MCLimit{}            = Just $ MCLimit 1.0+defaultAttributeValue MinDist{}            = Just $ MinDist 1.0 defaultAttributeValue MinLen{}             = Just $ MinLen 1 defaultAttributeValue Mode{}               = Just $ Mode Major defaultAttributeValue Model{}              = Just $ Model ShortPath@@ -1191,7 +1224,7 @@ defaultAttributeValue NodeSep{}            = Just $ NodeSep 0.25 defaultAttributeValue NoJustify{}          = Just $ NoJustify False defaultAttributeValue Normalize{}          = Just $ Normalize False-defaultAttributeValue Orientation{}        = Just $ Orientation 0+defaultAttributeValue Orientation{}        = Just $ Orientation 0.0 defaultAttributeValue OutputOrder{}        = Just $ OutputOrder BreadthFirst defaultAttributeValue Overlap{}            = Just $ Overlap KeepOverlaps defaultAttributeValue OverlapScaling{}     = Just $ OverlapScaling (-4)@@ -1200,7 +1233,7 @@ defaultAttributeValue Pad{}                = Just $ Pad (DVal 0.0555) defaultAttributeValue PageDir{}            = Just $ PageDir Bl defaultAttributeValue PenColor{}           = Just $ PenColor (X11Color Black)-defaultAttributeValue PenWidth{}           = Just $ PenWidth 1+defaultAttributeValue PenWidth{}           = Just $ PenWidth 1.0 defaultAttributeValue Peripheries{}        = Just $ Peripheries 1 defaultAttributeValue Pin{}                = Just $ Pin False defaultAttributeValue QuadTree{}           = Just $ QuadTree NormalQT@@ -1208,7 +1241,7 @@ defaultAttributeValue RankDir{}            = Just $ RankDir FromTop defaultAttributeValue Regular{}            = Just $ Regular False defaultAttributeValue ReMinCross{}         = Just $ ReMinCross False-defaultAttributeValue RepulsiveForce{}     = Just $ RepulsiveForce 1+defaultAttributeValue RepulsiveForce{}     = Just $ RepulsiveForce 1.0 defaultAttributeValue Root{}               = Just $ Root (NodeName "") defaultAttributeValue Rotate{}             = Just $ Rotate 0 defaultAttributeValue Rotation{}           = Just $ Rotation 0@@ -1217,13 +1250,11 @@ defaultAttributeValue SearchSize{}         = Just $ SearchSize 30 defaultAttributeValue Sep{}                = Just $ Sep (DVal 4) defaultAttributeValue Shape{}              = Just $ Shape Ellipse-defaultAttributeValue ShapeFile{}          = Just $ ShapeFile "" defaultAttributeValue ShowBoxes{}          = Just $ ShowBoxes 0 defaultAttributeValue Sides{}              = Just $ Sides 4-defaultAttributeValue Skew{}               = Just $ Skew 0+defaultAttributeValue Skew{}               = Just $ Skew 0.0 defaultAttributeValue Smoothing{}          = Just $ Smoothing NoSmooth defaultAttributeValue SortV{}              = Just $ SortV 0-defaultAttributeValue Splines{}            = Just $ Splines SplineEdges defaultAttributeValue StyleSheet{}         = Just $ StyleSheet "" defaultAttributeValue TailURL{}            = Just $ TailURL "" defaultAttributeValue TailClip{}           = Just $ TailClip True@@ -1234,9 +1265,9 @@ defaultAttributeValue Target{}             = Just $ Target "" defaultAttributeValue Tooltip{}            = Just $ Tooltip "" defaultAttributeValue VoroMargin{}         = Just $ VoroMargin 0.05+defaultAttributeValue Weight{}             = Just $ Weight 1.0 defaultAttributeValue Width{}              = Just $ Width 0.75 defaultAttributeValue XLabel{}             = Just $ XLabel (StrLabel "")-defaultAttributeValue Z{}                  = Just $ Z 0 defaultAttributeValue _                    = Nothing  -- | Determine if the provided 'Text' value is a valid name for an 'UnknownAttribute'.@@ -1249,16 +1280,17 @@                , "K"                , "URL"                , "href"+               , "area"                , "arrowhead"                , "arrowsize"                , "arrowtail"                , "aspect"                , "bb"-               , "colorscheme"                , "bgcolor"                , "center"                , "clusterrank"                , "color"+               , "colorscheme"                , "comment"                , "compound"                , "concentrate"@@ -1290,6 +1322,7 @@                , "group"                , "headURL"                , "headhref"+               , "head_lp"                , "headclip"                , "headlabel"                , "headport"@@ -1316,12 +1349,14 @@                , "labeltooltip"                , "landscape"                , "layer"+               , "layerlistsep"                , "layers"+               , "layerselect"                , "layersep"                , "layout"                , "len"-               , "levelsgap"                , "levels"+               , "levelsgap"                , "lhead"                , "LHeight"                , "lp"@@ -1375,7 +1410,6 @@                , "searchsize"                , "sep"                , "shape"-               , "shapefile"                , "showboxes"                , "sides"                , "size"@@ -1388,6 +1422,7 @@                , "stylesheet"                , "tailURL"                , "tailhref"+               , "tail_lp"                , "tailclip"                , "taillabel"                , "tailport"@@ -1402,15 +1437,70 @@                , "weight"                , "width"                , "xlabel"-               , "z"+               , "xlp"                , "charset" -- Defined upstream, just not used here.                ])             `S.union`             keywords {- Delete to here -} +-- | Remove attributes that we don't want to consider:+--+--   * Those that are defaults+--   * colorscheme (as the colors embed it anyway)+rmUnwantedAttributes :: Attributes -> Attributes+rmUnwantedAttributes = filter (not . (`any` tests) . flip ($))+  where+    tests = [isDefault, isColorScheme]++    isDefault a = maybe False (a==) $ defaultAttributeValue a++    isColorScheme ColorScheme{} = True+    isColorScheme _             = False+ -- -----------------------------------------------------------------------------+-- These parsing combinators are defined here for customisation purposes. +parseField       :: (ParseDot a) => (a -> Attribute) -> String+                    -> [(String, Parse Attribute)]+parseField c fld = [(fld, liftEqParse fld c)]++parseFields   :: (ParseDot a) => (a -> Attribute) -> [String]+                 -> [(String, Parse Attribute)]+parseFields c = concatMap (parseField c)++parseFieldBool :: (Bool -> Attribute) -> String -> [(String, Parse Attribute)]+parseFieldBool = (`parseFieldDef` True)++-- | For 'Bool'-like data structures where the presence of the field+--   name without a value implies a default value.+parseFieldDef         :: (ParseDot a) => (a -> Attribute) -> a -> String+                         -> [(String, Parse Attribute)]+parseFieldDef c d fld = [(fld, p)]+  where+    p = liftEqParse fld c+        `onFail`+        do nxt <- optional $ satisfy restIDString+           bool (fail "Not actually the field you were after")+                (return $ c d)+                (isNothing nxt)++-- | Attempt to parse the @\"=value\"@ part of a @key=value@ pair.  If+--   there is an equal sign but the @value@ part doesn't parse, throw+--   an un-recoverable error.+liftEqParse :: (ParseDot a) => String -> (a -> Attribute) -> Parse Attribute+liftEqParse k c = parseEq+                  *> ( hasDef (fmap c parse)+                       `adjustErrBad`+                       (("Unable to parse key=value with key of " ++ k+                         ++ "\n\t") ++)+                     )+  where+    hasDef p = maybe p (onFail p . (`stringRep` "\"\""))+               . defaultAttributeValue $ c undefined++-- -----------------------------------------------------------------------------+ {- | If performing any custom pre-/post-processing on Dot code, you      may wish to utilise some custom 'Attributes'.  These are wrappers      around the 'UnknownAttribute' constructor (and thus 'CustomAttribute'@@ -1476,6 +1566,53 @@  -- ----------------------------------------------------------------------------- +-- | The available Graphviz commands.  The following directions are+--   based upon those in the Graphviz man page (available online at+--   <http://graphviz.org/pdf/dot.1.pdf>, or if installed on your+--   system @man graphviz@).  Note that any command can be used on+--   both directed and undirected graphs.+--+--   When used with the 'Layout' attribute, it overrides any actual+--   command called on the dot graph.+data GraphvizCommand = Dot       -- ^ For hierachical graphs (ideal for+                                 --   directed graphs).+                     | Neato     -- ^ For symmetric layouts of graphs+                                 --   (ideal for undirected graphs).+                     | TwoPi     -- ^ For radial layout of graphs.+                     | Circo     -- ^ For circular layout of graphs.+                     | Fdp       -- ^ Spring-model approach for+                                 --   undirected graphs.+                     | Sfdp      -- ^ As with Fdp, but ideal for large+                                 --   graphs.+                     | Osage     -- ^ Filter for drawing clustered graphs,+                                 --   requires Graphviz >= 2.28.0.+                     | Patchwork -- ^ Draw clustered graphs as treemaps,+                                 --   requires Graphviz >= 2.28.0.+                     deriving (Eq, Ord, Bounded, Enum, Show, Read)++instance PrintDot GraphvizCommand where+  unqtDot Dot       = text "dot"+  unqtDot Neato     = text "neato"+  unqtDot TwoPi     = text "twopi"+  unqtDot Circo     = text "circo"+  unqtDot Fdp       = text "fdp"+  unqtDot Sfdp      = text "sfdp"+  unqtDot Osage     = text "osage"+  unqtDot Patchwork = text "patchwork"++instance ParseDot GraphvizCommand where+  parseUnqt = stringValue [ ("dot", Dot)+                          , ("neato", Neato)+                          , ("twopi", TwoPi)+                          , ("circo", Circo)+                          , ("fdp", Fdp)+                          , ("sfdp", Sfdp)+                          , ("osage", Osage)+                          , ("patchwork", Patchwork)+                          ]++-- -----------------------------------------------------------------------------+ {- |     Some 'Attribute's (mainly label-like ones) take a 'String' argument@@ -1570,15 +1707,15 @@                 deriving (Eq, Ord, Bounded, Enum, Show, Read)  instance PrintDot ArrowShape where-  unqtDot Box      = unqtText "box"-  unqtDot Crow     = unqtText "crow"-  unqtDot Diamond  = unqtText "diamond"-  unqtDot DotArrow = unqtText "dot"-  unqtDot Inv      = unqtText "inv"-  unqtDot NoArrow  = unqtText "none"-  unqtDot Normal   = unqtText "normal"-  unqtDot Tee      = unqtText "tee"-  unqtDot Vee      = unqtText "vee"+  unqtDot Box      = text "box"+  unqtDot Crow     = text "crow"+  unqtDot Diamond  = text "diamond"+  unqtDot DotArrow = text "dot"+  unqtDot Inv      = text "inv"+  unqtDot NoArrow  = text "none"+  unqtDot Normal   = text "normal"+  unqtDot Tee      = text "tee"+  unqtDot Vee      = text "vee"  instance ParseDot ArrowShape where   parseUnqt = stringValue [ ("box", Box)@@ -1692,15 +1829,18 @@  -- ----------------------------------------------------------------------------- +-- | If 'Local', then sub-graphs that are clusters are given special+--   treatment.  'Global' and 'NoCluster' currently appear to be+--   identical and turn off the special cluster processing. data ClusterMode = Local                  | Global                  | NoCluster                  deriving (Eq, Ord, Bounded, Enum, Show, Read)  instance PrintDot ClusterMode where-  unqtDot Local     = unqtText "local"-  unqtDot Global    = unqtText "global"-  unqtDot NoCluster = unqtText "none"+  unqtDot Local     = text "local"+  unqtDot Global    = text "global"+  unqtDot NoCluster = text "none"  instance ParseDot ClusterMode where   parseUnqt = oneOf [ stringRep Local "local"@@ -1720,10 +1860,10 @@              deriving (Eq, Ord, Bounded, Enum, Show, Read)  instance PrintDot DirType where-  unqtDot Forward = unqtText "forward"-  unqtDot Back    = unqtText "back"-  unqtDot Both    = unqtText "both"-  unqtDot NoDir   = unqtText "none"+  unqtDot Forward = text "forward"+  unqtDot Back    = text "back"+  unqtDot Both    = text "both"+  unqtDot NoDir   = text "none"  instance ParseDot DirType where   parseUnqt = oneOf [ stringRep Forward "forward"@@ -1772,11 +1912,12 @@   toDot (PVal p) = printPoint2D p  instance ParseDot DPoint where-  parseUnqt = fmap PVal parsePoint2D-              `onFail`-              fmap DVal parseUnqt+  parseUnqt = optional (character '+')+              *> oneOf [ PVal <$> parsePoint2D+                       , DVal <$> parseUnqt+                       ] -  parse = quotedParse parseUnqt+  parse = quotedParse parseUnqt -- A `+' would need to be quoted.           `onFail`           fmap DVal parseUnqt @@ -1862,17 +2003,20 @@ data Model = ShortPath            | SubSet            | Circuit+           | MDS            deriving (Eq, Ord, Bounded, Enum, Show, Read)  instance PrintDot Model where   unqtDot ShortPath = text "shortpath"   unqtDot SubSet    = text "subset"   unqtDot Circuit   = text "circuit"+  unqtDot MDS       = text "mds"  instance ParseDot Model where   parseUnqt = oneOf [ stringRep ShortPath "shortpath"                     , stringRep SubSet "subset"                     , stringRep Circuit "circuit"+                    , stringRep MDS "mds"                     ]  -- -----------------------------------------------------------------------------@@ -2057,15 +2201,35 @@  -- ----------------------------------------------------------------------------- +-- | How to deal with node overlaps.+--+--   Defaults to 'KeepOverlaps' /except/ for fdp and sfdp.+--+--   The ability to specify the number of tries for fdp's initial+--   force-directed technique is /not/ supported (by default, fdp uses+--   @9@ passes of its in-built technique, and then @'PrismOverlap'+--   Nothing@).+--+--   For sfdp, the default is @'PrismOverlap' (Just 0)@. data Overlap = KeepOverlaps-             | ScaleOverlaps-             | ScaleXYOverlaps-             | PrismOverlap (Maybe Word16) -- ^ Only when sfdp is-                                           --   available, @'Nothing'@+             | ScaleOverlaps -- ^ Remove overlaps by uniformly scaling in x and y.+             | ScaleXYOverlaps -- ^ Remove overlaps by separately scaling x and y.+             | PrismOverlap (Maybe Word16) -- ^ Requires the Prism+                                           --   library to be+                                           --   available (if not,+                                           --   this is equivalent to+                                           --   'VoronoiOverlap'). @'Nothing'@                                            --   is equivalent to                                            --   @'Just' 1000@.-             | CompressOverlap-             | VpscOverlap+                                           --   Influenced by+                                           --   'OverlapScaling'.+             | VoronoiOverlap -- ^ Requires Graphviz >= 2.30.0.+             | CompressOverlap -- ^ Scale layout down as much as+                               --   possible without introducing+                               --   overlaps, assuming none to begin+                               --   with.+             | VpscOverlap -- ^ Uses quadratic optimization to+                           --   minimize node displacement.              | IpsepOverlap -- ^ Only when @mode == 'IpSep'@              deriving (Eq, Ord, Show, Read) @@ -2074,16 +2238,21 @@   unqtDot ScaleOverlaps    = text "scale"   unqtDot ScaleXYOverlaps  = text "scalexy"   unqtDot (PrismOverlap i) = maybe id (flip (<>) . unqtDot) i $ text "prism"+  unqtDot VoronoiOverlap   = text "voronoi"   unqtDot CompressOverlap  = text "compress"   unqtDot VpscOverlap      = text "vpsc"   unqtDot IpsepOverlap     = text "ipsep" +-- | Note that @overlap=false@ defaults to @'PrismOverlap' Nothing@,+--   but if the Prism library isn't available then it is equivalent to+--   'VoronoiOverlap'. instance ParseDot Overlap where   parseUnqt = oneOf [ stringRep KeepOverlaps "true"                     , stringRep ScaleXYOverlaps "scalexy"                     , stringRep ScaleOverlaps "scale"                     , string "prism" *> fmap PrismOverlap (optional parse)                     , stringRep (PrismOverlap Nothing) "false"+                    , stringRep VoronoiOverlap "voronoi"                     , stringRep CompressOverlap "compress"                     , stringRep VpscOverlap "vpsc"                     , stringRep IpsepOverlap "ipsep"@@ -2108,11 +2277,30 @@              setLayerSep $ T.unpack ls              return $ LSep ls -data LayerRange = LRID LayerID-                | LRS LayerID LayerID-                deriving (Eq, Ord, Show, Read)+newtype LayerListSep = LLSep Text+                     deriving (Eq, Ord, Show, Read) -instance PrintDot LayerRange where+instance PrintDot LayerListSep where+  unqtDot (LLSep ls) = setLayerListSep (T.unpack ls) *> unqtDot ls++  toDot (LLSep ls) = setLayerListSep (T.unpack ls) *> toDot ls++instance ParseDot LayerListSep where+  parseUnqt = do ls <- parseUnqt+                 setLayerListSep $ T.unpack ls+                 return $ LLSep ls++  parse = do ls <- parse+             setLayerListSep $ T.unpack ls+             return $ LLSep ls++type LayerRange = [LayerRangeElem]++data LayerRangeElem = LRID LayerID+                    | LRS LayerID LayerID+                    deriving (Eq, Ord, Show, Read)++instance PrintDot LayerRangeElem where   unqtDot (LRID lid)    = unqtDot lid   unqtDot (LRS id1 id2) = do ls <- getLayerSep                              let s = unqtDot $ head ls@@ -2121,33 +2309,49 @@   toDot (LRID lid) = toDot lid   toDot lrs        = dquotes $ unqtDot lrs -instance ParseDot LayerRange where+  unqtListToDot lr = do lls <- getLayerListSep+                        let s = unqtDot $ head lls+                        hcat . punctuate s $ mapM unqtDot lr++  listToDot [lre] = toDot lre+  listToDot lrs   = dquotes $ unqtListToDot lrs++instance ParseDot LayerRangeElem where   parseUnqt = ignoreSep LRS parseUnqt parseLayerSep parseUnqt               `onFail`               fmap LRID parseUnqt -   parse = quotedParse (ignoreSep LRS parseUnqt parseLayerSep parseUnqt)           `onFail`           fmap LRID parse +  parseUnqtList = sepBy parseUnqt parseLayerListSep++  parseList = quotedParse parseUnqtList+              `onFail`+              fmap ((:[]) . LRID) parse+ parseLayerSep :: Parse () parseLayerSep = do ls <- getLayerSep                    many1Satisfy (`elem` ls) *> return ()  parseLayerName :: Parse Text-parseLayerName = parseEscaped False [] =<< getLayerSep+parseLayerName = parseEscaped False [] =<< liftA2 (++) getLayerSep getLayerListSep  parseLayerName' :: Parse Text parseLayerName' = stringBlock                   `onFail`                   quotedParse parseLayerName +parseLayerListSep :: Parse ()+parseLayerListSep = do lls <- getLayerListSep+                       many1Satisfy (`elem` lls) *> return ()+ -- | You should not have any layer separator characters for the --   'LRName' option, as they won't be parseable. data LayerID = AllLayers              | LRInt Int-             | LRName Text -- ^ Should not be a number of @"all"@.+             | LRName Text -- ^ Should not be a number or @"all"@.              deriving (Eq, Ord, Show, Read)  instance PrintDot LayerID where@@ -2182,9 +2386,13 @@                then AllLayers                else LRName str --- | A list of layer names.  The names should all be 'LRName' values,---   and when printed will use an arbitrary character from---   'defLayerSep'.+-- Remember: this /must/ be a newtype as we can't use arbitrary+-- LayerID values!++-- | A list of layer names.  The names should all be unique 'LRName'+--   values, and when printed will use an arbitrary character from+--   'defLayerSep'.  The values in the list are implicitly numbered+--   @1, 2, ...@. newtype LayerList = LL [LayerID]                   deriving (Eq, Ord, Show, Read) @@ -2270,13 +2478,13 @@     where       addNum = maybe id (flip (<>) . unqtDot) mi       isUnder = if c || u-                then flip (<>) $ char '_'+                then (<> char '_')                 else id       isC = if c-            then flip (<>) $ char 'c'+            then (<> char 'c')             else id       isU = if u-            then flip (<>) $ char 'u'+            then (<> char 'u')             else id  instance ParseDot PackMode where@@ -2293,7 +2501,7 @@     where       hasCharacter ms c = maybe False (elem c) ms       -- Also checks and removes quote characters-      isCU = flip elem ['c', 'u']+      isCU = (`elem` ['c', 'u'])  -- ----------------------------------------------------------------------------- @@ -2323,18 +2531,27 @@ -- -----------------------------------------------------------------------------  -- | Controls how (and if) edges are represented.-data EdgeType = SplineEdges+--+--   For @dot@, the default is 'SplineEdges'; for all other layouts+--   the default is 'LineEdges'.+data EdgeType = SplineEdges -- ^ Except for dot, requires+                            --   non-overlapping nodes (see+                            --   'Overlap').               | LineEdges               | NoEdges               | PolyLine+              | Ortho -- ^ Does not handle ports or edge labels in dot.+              | Curved -- ^ Requires Graphviz >= 2.30.0.               | CompoundEdge -- ^ fdp only               deriving (Eq, Ord, Bounded, Enum, Show, Read)  instance PrintDot EdgeType where-  unqtDot SplineEdges  = toDot True-  unqtDot LineEdges    = toDot False+  unqtDot SplineEdges  = text "spline"+  unqtDot LineEdges    = text "line"   unqtDot NoEdges      = empty   unqtDot PolyLine     = text "polyline"+  unqtDot Ortho        = text "ortho"+  unqtDot Curved       = text "curved"   unqtDot CompoundEdge = text "compound"    toDot NoEdges = dquotes empty@@ -2345,7 +2562,10 @@   parseUnqt = oneOf [ bool LineEdges SplineEdges <$> parse                     , stringRep SplineEdges "spline"                     , stringRep LineEdges "line"+                    , stringRep NoEdges "none"                     , stringRep PolyLine "polyline"+                    , stringRep Ortho "ortho"+                    , stringRep Curved "curved"                     , stringRep CompoundEdge "compound"                     ] @@ -2510,15 +2730,19 @@  -- ----------------------------------------------------------------------------- +-- | Geometries of shapes are affected by the attributes 'Regular',+--   'Peripheries' and 'Orientation'. data Shape     = BoxShape -- ^ Has synonyms of /rect/ and /rectangle/.-    | Polygon+    | Polygon  -- ^ Also affected by 'Sides', 'Skew' and 'Distortion'.     | Ellipse  -- ^ Has synonym of /oval/.     | Circle-    | PointShape+    | PointShape -- ^ Only affected by 'Peripheries', 'Width' and+                 --   'Height'.     | Egg     | Triangle-    | PlainText -- ^ Has synonym of /none/.+    | PlainText -- ^ Has synonym of /none/.  Recommended for+                --   'HtmlLabel's.     | DiamondShape     | Trapezium     | Parallelogram@@ -2771,7 +2995,7 @@    parse = quotedParse (liftA2 SItem parseUnqt parseArgs)           `onFail`-          fmap (flip SItem []) parse+          fmap (`SItem` []) parse    parseUnqtList = sepBy1 parseUnqt parseComma @@ -2792,13 +3016,17 @@                | Bold      -- ^ Nodes and Edges                | Invisible -- ^ Nodes and Edges                | Filled    -- ^ Nodes and Clusters+               | Striped   -- ^ Rectangularly-shaped Nodes and+                           --   Clusters; requires Graphviz >= 2.30.0+               | Wedged    -- ^ Elliptically-shaped Nodes only;+                           --   requires Graphviz >= 2.30.0                | Diagonals -- ^ Nodes only                | Rounded   -- ^ Nodes and Clusters                | Tapered   -- ^ Edges only; requires Graphviz >=-                           --   2.29.0.+                           --   2.29.0                | Radial    -- ^ Nodes, Clusters and Graphs, for use                            --   with 'GradientAngle'; requires-                           --   Graphviz >= 2.29.0.+                           --   Graphviz >= 2.29.0                | DD Text   -- ^ Device Dependent                deriving (Eq, Ord, Show, Read) @@ -2809,6 +3037,8 @@   unqtDot Bold      = text "bold"   unqtDot Invisible = text "invis"   unqtDot Filled    = text "filled"+  unqtDot Striped   = text "striped"+  unqtDot Wedged    = text "wedged"   unqtDot Diagonals = text "diagonals"   unqtDot Rounded   = text "rounded"   unqtDot Tapered   = text "tapered"@@ -2833,6 +3063,8 @@                 "bold"      -> Bold                 "invis"     -> Invisible                 "filled"    -> Filled+                "striped"   -> Striped+                "wedged"    -> Wedged                 "diagonals" -> Diagonals                 "rounded"   -> Rounded                 "tapered"   -> Tapered@@ -2862,7 +3094,7 @@                $ focus vp     where       vs = hcat . punctuate comma-           $ mapM (unqtDot . flip ($) vp) [wVal, hVal, zVal]+           $ mapM (unqtDot . ($vp)) [wVal, hVal, zVal]    toDot = dquotes . unqtDot @@ -2917,6 +3149,7 @@  -- ----------------------------------------------------------------------------- +-- | A list of search paths. newtype Paths = Paths { paths :: [FilePath] }     deriving (Eq, Ord, Show, Read) 
Data/GraphViz/Attributes/HTML.hs view
@@ -269,7 +269,7 @@               `adjustErr`               ("Can't parse Html.Cell\n\t"++)     where-      parseCell = flip parseTag "TD"+      parseCell = (`parseTag` "TD")    parse = parseUnqt @@ -577,7 +577,7 @@ htmlUnescapes :: [(T.Text, Char)] htmlUnescapes = maybeEscaped                 ++-                map (uncurry (flip (,))) htmlEscapes+                map (uncurry $ flip (,)) htmlEscapes   where     maybeEscaped = [("nbsp", ' '), ("apos", '\'')] @@ -628,7 +628,7 @@                  <* whitespace  parseFontTag :: (Attributes -> val -> tag) -> Parse val -> Parse tag-parseFontTag = flip parseTag "FONT"+parseFontTag = (`parseTag` "FONT")  -- Should this just be specialised for tagName ~ Format ? 
Data/GraphViz/Attributes/Internal.hs view
@@ -88,7 +88,7 @@  checkPortName    :: PortName -> PortPos checkPortName pn = maybe (LabelledPort pn Nothing) CompassPoint-                   . flip Map.lookup compassLookup+                   . (`Map.lookup` compassLookup)                    $ portName pn  -- | When attached to a node in a DotEdge definition, the 'PortName'
Data/GraphViz/Attributes/Same.hs view
@@ -16,6 +16,7 @@        , SAttrs        , toSAttr        , unSame+       , unSameSet        ) where  import Data.GraphViz.Attributes.Complete(Attribute, Attributes, sameAttribute)@@ -47,3 +48,6 @@  unSame :: SAttrs -> Attributes unSame = map getAttr . Set.toList++unSameSet :: SAttrs -> Set Attribute+unSameSet = Set.mapMonotonic getAttr
Data/GraphViz/Commands.hs view
@@ -47,7 +47,7 @@  import Data.GraphViz.Types -- This is here just for Haddock linking purposes.-import Data.GraphViz.Attributes.Complete(Attribute(Z))+import Data.GraphViz.Attributes.Complete(GraphvizCommand(..)) import Data.GraphViz.Commands.IO(runCommand) import Data.GraphViz.Exception @@ -61,30 +61,13 @@  -- ----------------------------------------------------------------------------- --- | The available Graphviz commands.  The following directions are---   based upon those in the Graphviz man page (available online at---   <http://graphviz.org/pdf/dot.1.pdf>, or if installed on your---   system @man graphviz@).  Note that any command can be used on---   both directed and undirected graphs.-data GraphvizCommand = Dot       -- ^ For hierachical graphs (ideal for-                                 --   directed graphs).-                     | Neato     -- ^ For symmetric layouts of graphs-                                 --   (ideal for undirected graphs).-                     | TwoPi     -- ^ For radial layout of graphs.-                     | Circo     -- ^ For circular layout of graphs.-                     | Fdp       -- ^ For symmetric layout of graphs.-                     | Osage     -- ^ Filter for drawing clustered graphs,-                                 --   requires Graphviz >= 2.28.0.-                     | Patchwork -- ^ Draw clustered graphs as treemaps,-                                 --   requires Graphviz >= 2.28.0.-                     deriving (Eq, Ord, Show, Read)- showCmd           :: GraphvizCommand -> String showCmd Dot       = "dot" showCmd Neato     = "neato" showCmd TwoPi     = "twopi" showCmd Circo     = "circo" showCmd Fdp       = "fdp"+showCmd Sfdp      = "sfdp" showCmd Osage     = "osage" showCmd Patchwork = "patchwork" @@ -166,7 +149,9 @@                                 --   usually preferred.                     | Vrml      -- ^ Virtual Reality Modeling Language                                 --   format; requires nodes to have a-                                --   'Z' attribute.+                                --   third dimension set via the @Pos@+                                --   attribute (and with a @Dim@ value+                                --   of at least @3@).                     | WBmp      -- ^ Wireless BitMap format;                                 --   monochrome format usually used                                 --   for mobile computing devices.
Data/GraphViz/Commands/IO.hs view
@@ -30,7 +30,7 @@ import Data.GraphViz.Types(PrintDotRepr, ParseDotRepr, printDotGraph, parseDotGraph) import Data.GraphViz.Printing(toDot) import Data.GraphViz.Exception-import Text.PrettyPrint.Leijen.Text(displayT, renderCompact)+import Text.PrettyPrint.Leijen.Text(displayT, renderOneLine)  import qualified Data.Text.Lazy.Encoding as T import Data.Text.Encoding.Error(UnicodeException)@@ -42,19 +42,22 @@ import Control.Monad.Trans.State import System.IO(Handle, IOMode(ReadMode,WriteMode)                 , withFile, stdout, stdin, hPutChar-                , hClose, hGetContents, hSetBinaryMode)+                , hClose, hGetContents)+import System.IO.Temp(withSystemTempFile) import System.Exit(ExitCode(ExitSuccess)) import System.Process(runInteractiveProcess, waitForProcess)-import Control.Exception(IOException, evaluate)+import System.FilePath((<.>))+import Control.Exception(IOException, evaluate, finally) import Control.Concurrent(MVar, forkIO, newEmptyMVar, putMVar, takeMVar) + -- -----------------------------------------------------------------------------  -- | Correctly render Graphviz output in a more machine-oriented form --   (i.e. more compact than the output of 'renderDot'). renderCompactDot :: (PrintDotRepr dg n) => dg n -> Text-renderCompactDot = displayT . renderCompact-                   . flip evalState initialState+renderCompactDot = displayT . renderOneLine+                   . (`evalState` initialState)                    . toDot  -- -----------------------------------------------------------------------------@@ -133,6 +136,10 @@ -- --   If the command was unsuccessful, then a 'GraphvizException' is --   thrown.+--+--   For performance reasons, a temporary file is used to store the+--   generated Dot code.  As such, this is only suitable for local+--   commands. runCommand :: (PrintDotRepr dg n)               => String           -- ^ Command to run               -> [String]         -- ^ Command-line arguments@@ -140,17 +147,16 @@               -> dg n               -> IO a runCommand cmd args hf dg-  = mapException notRunnable-    $ bracket-        (runInteractiveProcess cmd args Nothing Nothing)+  = mapException notRunnable $+    withSystemTempFile ("graphviz" <.> "dot") $ \dotFile dotHandle -> do+      finally (hPutCompactDot dotHandle dg) (hClose dotHandle)+      bracket+        (runInteractiveProcess cmd (args ++ [dotFile]) Nothing Nothing)         (\(inh,outh,errh,_) -> hClose inh >> hClose outh >> hClose errh)         $ \(inp,outp,errp,prc) -> do -          hSetBinaryMode inp True-          hSetBinaryMode errp False--          -- Make sure we close the input or it will hang!!!!!!!-          forkIO $ hPutCompactDot inp dg >> hClose inp+          -- Not using it, so close it off directly.+          hClose inp            -- Need to make sure both the output and error handles are           -- really fully consumed.
Data/GraphViz/Parsing.hs view
@@ -63,15 +63,6 @@     , tryParseList     , tryParseList'     , consumeLine-    , parseField-    , parseFields-    , parseFieldBool-    , parseFieldsBool-    , parseFieldDef-    , parseFieldsDef-    , parseFieldNumDef-    , liftEqParse-    , liftEqParse'     , commaSep     , commaSepUnqt     , commaSep'@@ -424,57 +415,6 @@  parseEq :: Parse () parseEq = wrapWhitespace (character '=') *> return ()--parseField       :: (ParseDot a) => (a -> b) -> String -> [(String, Parse b)]-parseField c fld = [(fld, liftEqParse' fld c)]--parseFields   :: (ParseDot a) => (a -> b) -> [String] -> [(String, Parse b)]-parseFields c = concatMap (parseField c)--parseFieldBool :: (Bool -> b) -> String -> [(String, Parse b)]-parseFieldBool = flip parseFieldDef True--parseFieldsBool   :: (Bool -> b) -> [String] -> [(String, Parse b)]-parseFieldsBool c = concatMap (parseFieldBool c)---- | For 'Bool'-like data structures where the presence of the field---   name without a value implies a default value.-parseFieldDef         :: (ParseDot a) => (a -> b) -> a -> String -> [(String, Parse b)]-parseFieldDef c d fld = [(fld, p)]-  where-    p = liftEqParse' fld c-        `onFail`-        do nxt <- optional $ satisfy restIDString-           bool (fail "Not actually the field you were after")-                (return $ c d)-                (isNothing nxt)--parseFieldsDef     :: (ParseDot a) => (a -> b) -> a -> [String] -> [(String, Parse b)]-parseFieldsDef c d = concatMap (parseFieldDef c d)---- | For numeric attributes, @dot -Tdot@ seems to use @\"\"@ to---   indicate the default value.-parseFieldNumDef :: (ParseDot a) => (a -> b) -> a -> String -> [(String, Parse b)]-parseFieldNumDef c d fld = [(fld, liftEqParse p fld c)]-  where-    p = stringRep d "\"\""-        `onFail`-        parse---- | 'liftEqParse'' using 'parse' as the parser.-liftEqParse' :: (ParseDot a) => String -> (a -> b) -> Parse b-liftEqParse' = liftEqParse parse---- | Attempt to parse the @\"=value\"@ part of a @key=value@ pair.  If---   there is an equal sign but the @value@ part doesn't parse, throw---   an un-recoverable error.-liftEqParse :: Parse a -> String -> (a -> b) -> Parse b-liftEqParse p k c = parseEq-                    *> ( fmap c p-                         `adjustErrBad`-                         (("Unable to parse key=value with key of " ++ k-                           ++ "\n\t") ++)-                       )  -- | The opposite of 'bracket'. ignoreSep :: (a -> b -> c) -> Parse a -> Parse sep -> Parse b -> Parse c
Data/GraphViz/Printing.hs view
@@ -102,7 +102,7 @@ -- | Correctly render Graphviz output. renderDot :: DotCode -> Text renderDot = PP.displayT . PP.renderPretty 0.4 80-            . flip evalState initialState+            . (`evalState` initialState)  -- | A class used to correctly print parts of the Graphviz Dot language. --   Minimal implementation is 'unqtDot'.
Data/GraphViz/State.hs view
@@ -21,6 +21,8 @@        , getDirectedness        , setLayerSep        , getLayerSep+       , setLayerListSep+       , getLayerListSep        , setColorScheme        , getColorScheme        ) where@@ -57,6 +59,7 @@ -- | Several aspects of Dot code are either global or mutable state. data GraphvizState = GS { directedEdges :: !Bool                         , layerSep      :: [Char]+                        , layerListSep  :: [Char]                         , attributeType :: !AttributeType                         , graphColor    :: !ColorScheme                         , clusterColor  :: !ColorScheme@@ -68,6 +71,7 @@ initialState :: GraphvizState initialState = GS { directedEdges = True                   , layerSep      = defLayerSep+                  , layerListSep  = defLayerListSep                   , attributeType = GraphAttribute                   , graphColor    = X11                   , clusterColor  = X11@@ -93,6 +97,12 @@ getLayerSep :: (GraphvizStateM m) => m [Char] getLayerSep = getsGS layerSep +setLayerListSep     :: (GraphvizStateM m) => [Char] -> m ()+setLayerListSep sep = modifyGS (\ gs -> gs { layerListSep = sep } )++getLayerListSep :: (GraphvizStateM m) => m [Char]+getLayerListSep = getsGS layerListSep+ setColorScheme    :: (GraphvizStateM m) => ColorScheme -> m () setColorScheme cs = do tp <- getsGS attributeType                        modifyGS $ \gs -> case tp of@@ -116,3 +126,7 @@ -- | The default separators for 'LayerSep'. defLayerSep :: [Char] defLayerSep = [' ', ':', '\t']++-- | The default separators for 'LayerListSep'.+defLayerListSep :: [Char]+defLayerListSep = [',']
Data/GraphViz/Types.hs view
@@ -103,6 +103,9 @@        , ClusterLookup        , NodeLookup        , Path+       , graphStructureInformationClean+       , nodeInformationClean+       , edgeInformationClean          -- * Obtaining the @DotNode@s and @DotEdges@.        , graphNodes        , graphEdges@@ -115,9 +118,11 @@  import Data.GraphViz.Types.Canonical( DotGraph(..), DotStatements(..)                                     , DotSubGraph(..))-import Data.GraphViz.Types.Common( GraphID(..), GlobalAttributes(..)+import Data.GraphViz.Types.Common( GraphID(..), GlobalAttributes(..), withGlob                                  , DotNode(..), DotEdge(..), numericValue) import Data.GraphViz.Types.State+import Data.GraphViz.Attributes.Complete( rmUnwantedAttributes, usedByGraphs+                                        , usedByClusters, usedByNodes, usedByEdges) import Data.GraphViz.Util(bool) import Data.GraphViz.Parsing(ParseDot(..), runParser, checkValidParse, parse, adjustErr) import Data.GraphViz.PreProcessing(preProcess)@@ -125,7 +130,7 @@  import qualified Data.Text.Lazy as T import Data.Text.Lazy(Text)-import Control.Arrow(first)+import Control.Arrow(first, second, (***)) import Control.Monad.Trans.State(get, put, modify, execState, evalState)  -- -----------------------------------------------------------------------------@@ -187,6 +192,36 @@   --   from 'graphStructureInformation').   unAnonymise :: dg n -> dg n +-- | A variant of 'graphStructureInformation' with default attributes+--   removed and only attributes usable by graph/cluster kept (where+--   applicable).+graphStructureInformationClean :: (DotRepr dg n) => dg n+                                  -> (GlobalAttributes, ClusterLookup)+graphStructureInformationClean = (globOnly *** fmap (second clustOnly))+                                 . graphStructureInformation+  where+    globOnly = withGlob $ filter usedByGraphs . rmUnwantedAttributes++    clustOnly = withGlob $ filter usedByClusters . rmUnwantedAttributes+++-- | A variant of 'nodeInformation' with default attributes removed+--   and only attributes used by nodes kept.+nodeInformationClean :: (DotRepr dg n) => Bool -> dg n -> NodeLookup n+nodeInformationClean = (fmap (second nodeOnly) .) . nodeInformation+  where+    nodeOnly = filter usedByNodes . rmUnwantedAttributes++-- | A variant of 'edgeInformation' with default attributes removed+--   and only attributes used by edges kept.+edgeInformationClean :: (DotRepr dg n) => Bool -> dg n -> [DotEdge n]+edgeInformationClean = (map rmEdgeAs .) . edgeInformation+  where+    rmEdgeAs de = de { edgeAttributes = edgeOnly $ edgeAttributes de }++    edgeOnly = filter usedByEdges . rmUnwantedAttributes++ -- | This class exists just to make type signatures nicer; all --   instances of 'DotRepr' should also be an instance of --   'PrintDotRepr'.@@ -316,7 +351,7 @@  maxSGInt    :: DotGraph n -> Int maxSGInt dg = execState (stInt $ graphStatements dg)-              . flip check 0+              . (`check` 0)               $ graphID dg   where     check = maybe id max . (numericValue =<<)
Data/GraphViz/Types/Common.hs view
@@ -100,6 +100,12 @@                                  NodeAttrs  as -> (gs, as ++ ns, es)                                  EdgeAttrs  as -> (gs, ns, as ++ es) +unPartitionGlobal :: (Attributes, Attributes, Attributes) -> [GlobalAttributes]+unPartitionGlobal (gas,nas,eas) = [ GraphAttrs gas+                                  , NodeAttrs  nas+                                  , EdgeAttrs  eas+                                  ]+ printGlobAttrType              :: GlobalAttributes -> DotCode printGlobAttrType GraphAttrs{} = text "graph" printGlobAttrType NodeAttrs{}  = text "node"@@ -153,6 +159,11 @@   | otherwise           = EdgeAttrs attr' -- Must be for edges.   where     attr' = [attr]++withGlob :: (Attributes -> Attributes) -> GlobalAttributes -> GlobalAttributes+withGlob f (GraphAttrs as) = GraphAttrs $ f as+withGlob f (NodeAttrs  as) = NodeAttrs  $ f as+withGlob f (EdgeAttrs  as) = EdgeAttrs  $ f as  -- ----------------------------------------------------------------------------- 
Data/GraphViz/Types/Generalised.hs view
@@ -130,7 +130,10 @@               <*> parseBracesBased GraphAttribute parseGStmts    parse = parseUnqt -- Don't want the option of quoting+          `adjustErr`+          ("Not a valid generalised DotGraph\n\t"++) + -- | Assumed to be an injective mapping function. instance Functor DotGraph where   fmap f g = g { graphStatements = (fmap . fmap) f $ graphStatements g }@@ -153,7 +156,9 @@ printGStmts = toDot . F.toList  parseGStmts :: (ParseDot n) => Parse (DotStatements n)-parseGStmts = Seq.fromList <$> parse+parseGStmts = (Seq.fromList <$> parse)+              `adjustErr`+              ("Not a valid generalised DotStatements\n\t"++)  statementStructure :: DotStatements n -> GraphState () statementStructure = F.mapM_ stmtStructure@@ -311,7 +316,7 @@  maxSGInt    :: DotGraph n -> Int maxSGInt dg = execState (stsInt $ graphStatements dg)-              . flip check 0+              . (`check` 0)               $ graphID dg   where     check = maybe id max . (numericValue =<<)
Data/GraphViz/Types/Graph.hs view
@@ -182,7 +182,7 @@                deriving (Eq, Ord, Show, Read)  adjacent :: Context n -> [DotEdge n]-adjacent c = mapU (flip DotEdge n) (predecessors c)+adjacent c = mapU (`DotEdge` n) (predecessors c)              ++ mapU (DotEdge n) (successors c)   where     n = node c@@ -312,7 +312,7 @@  -- Used to make sure that the parent cluster exists addEmptyCluster :: Maybe GraphID -> DotGraph n -> DotGraph n-addEmptyCluster = maybe id (withClusters . flip dontReplace defCI)+addEmptyCluster = maybe id (withClusters . (`dontReplace` defCI))   where     dontReplace = M.insertWith (const id)     defCI = CI Nothing emptyGA@@ -335,7 +335,7 @@  -- | Create a graph with no clusters. mkGraph :: (Ord n) => [DotNode n] -> [DotEdge n] -> DotGraph n-mkGraph ns es = flip (foldl' (flip addDotEdge)) es+mkGraph ns es = flip (foldl' $ flip addDotEdge) es                 $ foldl' (flip addDotNode) emptyGraph ns  -- | Convert this DotGraph into canonical form.  All edges are found@@ -506,7 +506,7 @@ --   equivalent to 'adjacentTo'. predecessorsOf :: (Ord n) => DotGraph n -> n -> [DotEdge n] predecessorsOf dg t-  | directedGraph dg = emToDE (flip DotEdge t)+  | directedGraph dg = emToDE (`DotEdge` t)                        . _predecessors $ values dg M.! t   | otherwise        = adjacentTo dg t @@ -524,7 +524,7 @@   where     ni = values dg M.! n     sucs = emToDE (DotEdge n) $ _successors ni-    preds = emToDE (flip DotEdge n) $ n `M.delete` _predecessors ni+    preds = emToDE (`DotEdge` n) $ n `M.delete` _predecessors ni  emToDE :: (Ord n) => (n -> Attributes -> DotEdge n)           -> EdgeMap n -> [DotEdge n]@@ -578,7 +578,7 @@   parseUnqt = fromGDot <$> parseUnqt     where       -- fromGDot :: G.DotGraph n -> DotGraph n-      fromGDot = fromDotRepr . flip asTypeOf (undefined :: G.DotGraph n)+      fromGDot = fromDotRepr . (`asTypeOf` (undefined :: G.DotGraph n))    parse = parseUnqt -- Don't want the option of quoting @@ -699,7 +699,7 @@         as = _attributes ni         mp = _inCluster ni         pth = fromMaybe Seq.empty $ mp `M.lookup` pM-        pAs = fromMaybe gGlob $ flip M.lookup aM =<< mp+        pAs = fromMaybe gGlob $ (`M.lookup` aM) =<< mp         as' | withGlob  = unSame $ toSAttr as `S.union` pAs             | otherwise = as @@ -732,7 +732,7 @@       where         as = af $ clusterAttrs ci         p = parentCluster ci-        pAs = fromMaybe gGlob $ flip M.lookup aM =<< p+        pAs = fromMaybe gGlob $ (`M.lookup` aM) =<< p  clusterPath :: DotGraph n -> Map (Maybe GraphID) St.Path clusterPath = M.mapKeysMonotonic Just . M.map (fmap Just) . clusterPath'@@ -747,7 +747,7 @@     pathOf c ci = pPth Seq.|> c       where         mp = parentCluster ci-        pPth = fromMaybe Seq.empty $ flip M.lookup pM =<< mp+        pPth = fromMaybe Seq.empty $ (`M.lookup` pM) =<< mp  -- ----------------------------------------------------------------------------- 
Data/GraphViz/Types/Monadic.hs view
@@ -195,7 +195,7 @@  -- | Add a node with no attributes to the graph. node' :: n -> Dot n-node' = flip node []+node' = (`node` [])  -- ----------------------------------------------------------------------------- -- Edges@@ -217,4 +217,3 @@ infixr 9 <->  -- ------------------------------------------------------------------------------
Data/GraphViz/Types/State.hs view
@@ -121,7 +121,7 @@  getGraphInfo :: GraphState a -> (GlobalAttributes, ClusterLookup) getGraphInfo = ((graphGlobal . globalAttrs) &&& (convert . value))-               . flip execState initState+               . (`execState` initState)   where     convert = Map.map ((uniq . DList.toList) *** toGlobal)     toGlobal = GraphAttrs . filter usedByClusters . unSame@@ -172,7 +172,7 @@ toDotNodes = map (\(n,(_,as)) -> DotNode n as) . Map.assocs  getNodeLookup       :: (Ord n) => Bool -> NodeState n a -> NodeLookup n-getNodeLookup addGs = Map.map combine . value . flip execState initState+getNodeLookup addGs = Map.map combine . value . (`execState` initState)   where     initState = SV Set.empty addGs Seq.empty Map.empty     combine ni = (location ni, unSame $ atts ni `Set.union` gAtts ni)@@ -230,7 +230,7 @@ type EdgeState n a = GVState (DList (DotEdge n)) a  getDotEdges       :: Bool -> EdgeState n a -> [DotEdge n]-getDotEdges addGs = DList.toList . value . flip execState initState+getDotEdges addGs = DList.toList . value . (`execState` initState)   where     initState = SV Set.empty addGs Seq.empty DList.empty @@ -242,4 +242,4 @@ addEdge de@DotEdge{edgeAttributes = as}   = do gas <- getGlobals        let de' = de { edgeAttributes = unSame $ unionWith gas as }-       modifyValue $ flip DList.snoc de'+       modifyValue $ (`DList.snoc` de')
Data/GraphViz/Util.hs view
@@ -128,7 +128,7 @@ descapeQuotes (c:str)        = c : descapeQuotes str  isKeyword :: Text -> Bool-isKeyword = flip Set.member keywords . T.toLower+isKeyword = (`Set.member` keywords) . T.toLower  -- | The following are Dot keywords and are not valid as labels, etc. unquoted. keywords :: Set Text
FAQ.md view
@@ -118,7 +118,9 @@ * The global `orientation` attribute is not defined; however its   behaviour is duplicated by the `rotate` attribute. -* The deprecated `overlap` algorithms have not been defined.+* The deprecated `overlap` algorithms have not been defined, and the+  ability to specify an integer prefix for use with the `fdp` layout+  tool is not available.  * `pointf` and `point` values have been combined into one datatype; as   such, when constructing values such as `Rect` care should be taken
TODO.md view
@@ -18,6 +18,11 @@ * Add nicer syntax for record labels, and specifying ports in Monadic   Dot graphs. +* Add support for custom shapes; in particular, a nice way of+  re-defining the `Shape` datatype (as just adding a non-nullary+  constructor would make it unwieldy to make sure tests, etc. were+  kept up-to-date).+ * Define new classes to distinguish between printing/parsing Attribute   values and other values (as only the former requires quoted   variants).
graphviz.cabal view
@@ -1,5 +1,5 @@ Name:               graphviz-Version:            2999.15.0.1+Version:            2999.16.0.0 Stability:          Beta Synopsis:           Bindings to Graphviz for graph visualisation. Description: {@@ -58,6 +58,7 @@                            containers,                            process,                            directory,+                           temporary >=1.1 && <1.2,                            fgl == 5.4.*,                            filepath,                            polyparse >= 1.7 && < 1.9,@@ -65,7 +66,7 @@                            colour == 2.3.*,                            transformers >= 0.2 && < 0.4,                            text,-                           wl-pprint-text >= 1.0.0.0 && < 1.2.0.0,+                           wl-pprint-text >= 1.1.0.0 && < 1.2.0.0,                            dlist == 0.5.*          Exposed-Modules:   Data.GraphViz@@ -117,6 +118,7 @@                            containers,                            process,                            directory,+                           temporary,                            fgl,                            filepath,                            polyparse,
tests/Data/GraphViz/Testing.hs view
@@ -53,7 +53,10 @@        , test_dotizeAugment        , test_dotizeAugmentUniq        , test_canonicalise+       , test_canonicaliseNodes+       , test_canonicaliseEdges        , test_transitive+       , test_transitiveNodes         -- * Re-exporting modules for manual testing.        , module Data.GraphViz        , module Data.GraphViz.Testing.Properties@@ -75,6 +78,7 @@ import Data.GraphViz.Testing.Properties  import Data.GraphViz+import Data.GraphViz.Algorithms(CanonicaliseOptions) import Data.GraphViz.Parsing(parseIt, parseIt', runParser) import Data.GraphViz.PreProcessing(preProcess) import Data.GraphViz.Printing(printIt, renderDot)@@ -170,7 +174,10 @@                , test_findAllEdges                , test_noGraphInfo                , test_canonicalise+               , test_canonicaliseNodes+               , test_canonicaliseEdges                , test_transitive+               , test_transitiveNodes                ]  -- | Test that 'Attributes' can be printed and then parsed back.@@ -352,11 +359,37 @@          , tests      = [qCheck prop]          }   where-    prop :: DotGraph Int -> Bool+    prop :: CanonicaliseOptions -> DotGraph Int -> Bool     prop = prop_canonicalise      dsc = "Repeated application of canonicalise shouldn't have any further affect." +test_canonicaliseNodes :: Test+test_canonicaliseNodes+  = Test { name       = "Canonicalisation shouldn't change any nodes"+         , lookupName = "canonicalisenodes"+         , desc       = dsc+         , tests      = [qCheck prop]+         }+  where+    prop :: CanonicaliseOptions -> DotGraph Int -> Bool+    prop = prop_canonicaliseNodes++    dsc = "Canonicalisation shouldn't change or remove any nodes."++test_canonicaliseEdges :: Test+test_canonicaliseEdges+  = Test { name       = "Canonicalisation shouldn't change any edges"+         , lookupName = "canonicaliseedges"+         , desc       = dsc+         , tests      = [qCheck prop]+         }+  where+    prop :: CanonicaliseOptions -> DotGraph Int -> Bool+    prop = prop_canonicaliseEdges++    dsc = "Canonicalisation shouldn't change or remove any edges."+ test_transitive :: Test test_transitive   = Test { name       = "Transitive reduction should be idempotent"@@ -365,10 +398,23 @@          , tests      = [qCheck prop]          }   where-    prop :: DotGraph Int -> Bool+    prop :: CanonicaliseOptions -> DotGraph Int -> Bool     prop = prop_transitive      dsc = "Repeated application of transitiveReduction shouldn't have any further affect."++test_transitiveNodes :: Test+test_transitiveNodes+  = Test { name       = "Transitive reduction shouldn't change any nodes"+         , lookupName = "transitivenodes"+         , desc       = dsc+         , tests      = [qCheck prop]+         }+  where+    prop :: CanonicaliseOptions -> DotGraph Int -> Bool+    prop = prop_transitiveNodes++    dsc = "Transitive reduction shouldn't change or remove any nodes."  -- ----------------------------------------------------------------------------- 
tests/Data/GraphViz/Testing/Instances/Attributes.hs view
@@ -25,7 +25,7 @@ import Data.GraphViz.Attributes.Colors.X11(X11Color) import Data.GraphViz.Attributes.Colors.SVG(SVGColor) import Data.GraphViz.Attributes.Internal(compassLookup)-import Data.GraphViz.State(initialState, layerSep)+import Data.GraphViz.State(initialState, layerSep, layerListSep) import Data.GraphViz.Util(bool)  import Test.QuickCheck@@ -62,16 +62,17 @@   arbitrary = oneof [ liftM Damping arbitrary                     , liftM K arbitrary                     , liftM URL arbitrary+                    , liftM Area arbitrary                     , liftM ArrowHead arbitrary                     , liftM ArrowSize arbitrary                     , liftM ArrowTail arbitrary                     , liftM Aspect arbitrary                     , liftM BoundingBox arbitrary-                    , liftM ColorScheme arbitrary                     , liftM BgColor arbList                     , liftM Center arbitrary                     , liftM ClusterRank arbitrary                     , liftM Color arbList+                    , liftM ColorScheme arbitrary                     , liftM Comment arbitrary                     , liftM Compound arbitrary                     , liftM Concentrate arbitrary@@ -100,6 +101,7 @@                     , liftM GradientAngle arbitrary                     , liftM Group arbitrary                     , liftM HeadURL arbitrary+                    , liftM Head_LP arbitrary                     , liftM HeadClip arbitrary                     , liftM HeadLabel arbitrary                     , liftM HeadPort arbitrary@@ -125,12 +127,14 @@                     , liftM LabelTooltip arbitrary                     , liftM Landscape arbitrary                     , liftM Layer arbitrary+                    , liftM LayerListSep arbitrary                     , liftM Layers arbitrary+                    , liftM LayerSelect arbitrary                     , liftM LayerSep arbitrary                     , liftM Layout arbitrary                     , liftM Len arbitrary-                    , liftM LevelsGap arbitrary                     , liftM Levels arbitrary+                    , liftM LevelsGap arbitrary                     , liftM LHead arbitrary                     , liftM LHeight arbitrary                     , liftM LPos arbitrary@@ -184,7 +188,6 @@                     , liftM SearchSize arbitrary                     , liftM Sep arbitrary                     , liftM Shape arbitrary-                    , liftM ShapeFile arbitrary                     , liftM ShowBoxes arbitrary                     , liftM Sides arbitrary                     , liftM Size arbitrary@@ -196,6 +199,7 @@                     , liftM Style arbList                     , liftM StyleSheet arbitrary                     , liftM TailURL arbitrary+                    , liftM Tail_LP arbitrary                     , liftM TailClip arbitrary                     , liftM TailLabel arbitrary                     , liftM TailPort arbitrary@@ -210,23 +214,24 @@                     , liftM Weight arbitrary                     , liftM Width arbitrary                     , liftM XLabel arbitrary-                    , liftM Z arbitrary+                    , liftM XLP arbitrary                     , liftM2 UnknownAttribute (suchThat arbIDString validUnknown) arbitrary                     ]    shrink (Damping v)            = map Damping             $ shrink v   shrink (K v)                  = map K                   $ shrink v   shrink (URL v)                = map URL                 $ shrink v+  shrink (Area v)               = map Area                $ shrink v   shrink (ArrowHead v)          = map ArrowHead           $ shrink v   shrink (ArrowSize v)          = map ArrowSize           $ shrink v   shrink (ArrowTail v)          = map ArrowTail           $ shrink v   shrink (Aspect v)             = map Aspect              $ shrink v   shrink (BoundingBox v)        = map BoundingBox         $ shrink v-  shrink (ColorScheme v)        = map ColorScheme         $ shrink v   shrink (BgColor v)            = map BgColor             $ nonEmptyShrinks v   shrink (Center v)             = map Center              $ shrink v   shrink (ClusterRank v)        = map ClusterRank         $ shrink v   shrink (Color v)              = map Color               $ nonEmptyShrinks v+  shrink (ColorScheme v)        = map ColorScheme         $ shrink v   shrink (Comment v)            = map Comment             $ shrink v   shrink (Compound v)           = map Compound            $ shrink v   shrink (Concentrate v)        = map Concentrate         $ shrink v@@ -255,6 +260,7 @@   shrink (GradientAngle v)      = map GradientAngle       $ shrink v   shrink (Group v)              = map Group               $ shrink v   shrink (HeadURL v)            = map HeadURL             $ shrink v+  shrink (Head_LP v)            = map Head_LP             $ shrink v   shrink (HeadClip v)           = map HeadClip            $ shrink v   shrink (HeadLabel v)          = map HeadLabel           $ shrink v   shrink (HeadPort v)           = map HeadPort            $ shrink v@@ -280,12 +286,14 @@   shrink (LabelTooltip v)       = map LabelTooltip        $ shrink v   shrink (Landscape v)          = map Landscape           $ shrink v   shrink (Layer v)              = map Layer               $ shrink v+  shrink (LayerListSep v)       = map LayerListSep        $ shrink v   shrink (Layers v)             = map Layers              $ shrink v+  shrink (LayerSelect v)        = map LayerSelect         $ shrink v   shrink (LayerSep v)           = map LayerSep            $ shrink v   shrink (Layout v)             = map Layout              $ shrink v   shrink (Len v)                = map Len                 $ shrink v-  shrink (LevelsGap v)          = map LevelsGap           $ shrink v   shrink (Levels v)             = map Levels              $ shrink v+  shrink (LevelsGap v)          = map LevelsGap           $ shrink v   shrink (LHead v)              = map LHead               $ shrink v   shrink (LHeight v)            = map LHeight             $ shrink v   shrink (LPos v)               = map LPos                $ shrink v@@ -339,7 +347,6 @@   shrink (SearchSize v)         = map SearchSize          $ shrink v   shrink (Sep v)                = map Sep                 $ shrink v   shrink (Shape v)              = map Shape               $ shrink v-  shrink (ShapeFile v)          = map ShapeFile           $ shrink v   shrink (ShowBoxes v)          = map ShowBoxes           $ shrink v   shrink (Sides v)              = map Sides               $ shrink v   shrink (Size v)               = map Size                $ shrink v@@ -351,6 +358,7 @@   shrink (Style v)              = map Style               $ nonEmptyShrinks v   shrink (StyleSheet v)         = map StyleSheet          $ shrink v   shrink (TailURL v)            = map TailURL             $ shrink v+  shrink (Tail_LP v)            = map Tail_LP             $ shrink v   shrink (TailClip v)           = map TailClip            $ shrink v   shrink (TailLabel v)          = map TailLabel           $ shrink v   shrink (TailPort v)           = map TailPort            $ shrink v@@ -365,10 +373,13 @@   shrink (Weight v)             = map Weight              $ shrink v   shrink (Width v)              = map Width               $ shrink v   shrink (XLabel v)             = map XLabel              $ shrink v-  shrink (Z v)                  = map Z                   $ shrink v+  shrink (XLP v)                = map XLP                 $ shrink v   shrink (UnknownAttribute a v) = liftM2 UnknownAttribute (liftM (filter validUnknown) shrink a) (shrink v) {- delete to here -} +instance Arbitrary GraphvizCommand where+  arbitrary = arbBounded+ instance Arbitrary ArrowType where   arbitrary = liftM AType               -- Arrow specifications have between 1 and 4 elements.@@ -500,6 +511,7 @@       simpleOverlap = elements [ KeepOverlaps                                , ScaleOverlaps                                , ScaleXYOverlaps+                               , VoronoiOverlap                                , CompressOverlap                                , VpscOverlap                                , IpsepOverlap@@ -513,6 +525,11 @@   -- one because of arbLayerName   arbitrary = return . LSep . T.pack $ layerSep initialState +instance Arbitrary LayerListSep where+  -- Since Arbitrary isn't stateful, we can't generate an arbitrary+  -- one because of arbLayerName+  arbitrary = return . LLSep . T.pack $ layerListSep initialState+ instance Arbitrary LayerList where   arbitrary = liftM LL $ listOf1 arbName     where@@ -523,7 +540,7 @@    shrink (LL ll) = map LL $ nonEmptyShrinks ll -instance Arbitrary LayerRange where+instance Arbitrary LayerRangeElem where   arbitrary = oneof [ liftM LRID arbitrary                     , liftM2 LRS arbitrary arbitrary                     ]@@ -666,6 +683,8 @@                                , Bold                                , Invisible                                , Filled+                               , Striped+                               , Wedged                                , Diagonals                                , Rounded                                , Tapered@@ -677,6 +696,8 @@                                 , "bold"                                 , "invis"                                 , "filled"+                                , "striped"+                                , "wedged"                                 , "diagonals"                                 , "rounded"                                 , "tapered"@@ -786,6 +807,15 @@                                 return $ RGBA rs gs bs as   shrink (BrewerColor c) = map BrewerColor $ shrink c   shrink _               = [] -- Shrinking 0<=h,s,v<=1 does nothing++-- | No guarantees are made as to sanity of generated weightings.+instance Arbitrary WeightedColor where+  arbitrary = liftM2 WC arbitrary arbitrary++  -- No color shrinks to itself, so no sanity checking needed.+  shrink (WC c mw) = do c' <- shrink c+                        mw' <- shrink mw+                        return $ WC c' mw'  instance Arbitrary X11Color where   arbitrary = arbBounded
tests/Data/GraphViz/Testing/Instances/Common.hs view
@@ -20,6 +20,7 @@ import Data.GraphViz.Attributes(Attributes) import Data.GraphViz.Types.Common( DotNode(..), DotEdge(..)                                  , GlobalAttributes(..), GraphID(..))+import Data.GraphViz.Algorithms(CanonicaliseOptions(..))  import Test.QuickCheck @@ -41,12 +42,12 @@ instance (Arbitrary n) => Arbitrary (DotNode n) where   arbitrary = liftM2 DotNode arbitrary arbNodeAttrs -  shrink (DotNode n as) = map (DotNode n) $ shrinkList as+  shrink (DotNode n as) = map (DotNode n) $ shrink as  instance (Arbitrary n) => Arbitrary (DotEdge n) where   arbitrary = liftM3 DotEdge arbitrary arbitrary arbEdgeAttrs -  shrink (DotEdge f t as) = map (DotEdge f t) $ shrinkList as+  shrink (DotEdge f t as) = map (DotEdge f t) $ shrink as  instance Arbitrary GlobalAttributes where   arbitrary = gaGraph@@ -69,3 +70,6 @@                 , liftM NodeAttrs  arbNodeAttrs                 , liftM EdgeAttrs  arbEdgeAttrs                 ]++instance Arbitrary CanonicaliseOptions where+  arbitrary = liftM2 COpts arbitrary arbitrary
tests/Data/GraphViz/Testing/Instances/Helpers.hs view
@@ -12,7 +12,7 @@ module Data.GraphViz.Testing.Instances.Helpers where  import Data.GraphViz.Parsing(isNumString)-import Data.GraphViz.State(initialState, layerSep)+import Data.GraphViz.State(initialState, layerSep, layerListSep)  import Test.QuickCheck @@ -74,7 +74,7 @@ arbLayerName :: Gen Text arbLayerName = suchThat arbitrary (T.all notLayerSep)   where-    defLayerSep = layerSep initialState+    defLayerSep = layerSep initialState ++ layerListSep initialState     notLayerSep = (`notElem` defLayerSep)  arbStyleName :: Gen Text@@ -86,7 +86,7 @@ arbList = listOf1 arbitrary  nonEmptyShrinks :: (Arbitrary a) => [a] -> [[a]]-nonEmptyShrinks = filter (not . null) . shrinkList+nonEmptyShrinks = filter (not . null) . shrink  nonEmptyShrinks' :: [a] -> [[a]] nonEmptyShrinks' = filter (not . null) . shrinkList'
tests/Data/GraphViz/Testing/Properties.hs view
@@ -16,7 +16,7 @@ import Data.GraphViz.Types( DotRepr(..), PrintDotRepr                           , DotNode(..), DotEdge(..), GlobalAttributes(..)                           , printDotGraph, graphNodes, graphEdges-                          , graphStructureInformation)+                          , nodeInformationClean, edgeInformationClean) import Data.GraphViz.Types.Canonical(DotGraph(..), DotStatements(..)) import qualified Data.GraphViz.Types.Generalised as G import Data.GraphViz.Printing(PrintDot(..), printIt)@@ -149,16 +149,37 @@     info = graphStructureInformation dg  -- | Canonicalisation should be idempotent.-prop_canonicalise   :: (ParseDot n, PrintDot n, DotRepr dg n) => dg n -> Bool-prop_canonicalise g = cdg == canonicalise cdg+prop_canonicalise :: (DotRepr dg n) => CanonicaliseOptions -> dg n -> Bool+prop_canonicalise copts g = cdg == canonicaliseOptions copts cdg   where-    cdg = canonicalise g+    cdg = canonicaliseOptions copts g +-- | Canonicalisation shouldn't change any nodes.+prop_canonicaliseNodes :: (DotRepr dg n) => CanonicaliseOptions -> dg n -> Bool+prop_canonicaliseNodes copts g = nodeInformationClean True g+                                 == nodeInformationClean True cdg+  where+    cdg = canonicaliseOptions copts g++-- | Canonicalisation shouldn't change any edges.+prop_canonicaliseEdges :: (DotRepr dg n) => CanonicaliseOptions -> dg n -> Bool+prop_canonicaliseEdges copts g = sort (edgeInformationClean True g)+                                 == sort (edgeInformationClean True cdg)+  where+    cdg = canonicaliseOptions copts g+ -- | Removing transitive edges should be idempotent.-prop_transitive   :: (DotRepr dg n) => dg n -> Bool-prop_transitive g = tdg == transitiveReduction tdg+prop_transitive :: (DotRepr dg n) => CanonicaliseOptions -> dg n -> Bool+prop_transitive copts g = tdg == transitiveReductionOptions copts tdg   where-    tdg = transitiveReduction g+    tdg = transitiveReductionOptions copts g++-- | Transitive reduction shouldn't change any nodes.+prop_transitiveNodes :: (DotRepr dg n) => CanonicaliseOptions -> dg n -> Bool+prop_transitiveNodes copts g = nodeInformationClean True g+                               == nodeInformationClean True cdg+  where+    cdg = transitiveReductionOptions copts g  -- ----------------------------------------------------------------------------- -- Helper utility functions
utils/AttributeGenerator.hs view
@@ -67,7 +67,6 @@                    , parseNames   :: [Code]                    , valtype      :: VType                    , parseDef     :: Maybe Code-                   , emptyParse   :: Maybe Code -- ^ What the empty string gets parsed as.                    , defValue     :: Maybe Code                    , forGraphs    :: Bool                    , forClusters  :: Bool@@ -88,7 +87,6 @@                                    , valtype      = v -- just in case need to do fancy                                                       -- stuff                                    , parseDef     = liftM text df-                                   , emptyParse   = liftM text dfP                                    , defValue     = liftM text d                                    , forGraphs    = isFor 'G'                                    , forClusters  = isFor 'C' || forSG@@ -102,11 +100,6 @@       isFor f = f `elem` u       forSG = isFor 'S'       df' = if v == Bl then Just "'True'" else fmap ( \ t -> '\'' : t ++ "'") df-      isNumeric = case v of-                    Integ -> True-                    Dbl   -> True-                    _     -> False-      dfP = bool Nothing d isNumeric       mDoc (f,fc) = f <> colon <+> text fc       addF f = fmap (\ dc -> (wrap (char '/') (text f), dc))       cm' = hsep@@ -237,7 +230,6 @@       pType b a           | valtype a == Bl       = pFld <> text "Bool" <+> cnst a           | isJust $ parseDef a   = pFld <> text "Def"  <+> cnst a <+> fromJust (parseDef a)-          | isJust $ emptyParse a = pFld <> text "NumDef" <+> cnst a <+> fromJust (emptyParse a)           | otherwise             = pFld <+> cnst a           where             pFld = text "parseField" <> if b then char 's' else empty@@ -248,7 +240,7 @@       unknownName = text "attrName"       pUnknown = text "do"                  <+> (   (unknownName <+> text "<- stringBlock")-                      $$ (text "liftEqParse'"+                      $$ (text "liftEqParse"                           <+> (parens (text "\"" <> unknownAttr <+> text "(\""                                        <+> text "++ T.unpack" <+> unknownName                                        <+> text "++ \")\"")@@ -328,17 +320,21 @@                 . concatMap parseNames                 $ atts att -arbitraryFor                :: VType -> Doc-arbitraryFor (Cust ('[':_)) = text "arbList"-arbitraryFor _              = text "arbitrary"+arbitraryFor :: VType -> Doc+arbitraryFor = text . bool "arbitrary" "arbList" . isListType  arbitraryFor' :: Attribute -> Doc arbitraryFor' = arbitraryFor . valtype  shrinkFor :: VType -> Doc-shrinkFor (Cust ('[':_)) = text "nonEmptyShrinks"-shrinkFor _              = text "shrink"+shrinkFor = text . bool "shrink" "nonEmptyShrinks" . isListType +-- Some types are aliases for lists.+isListType :: VType -> Bool+isListType (Cust ('[':_))     = True+isListType (Cust "ColorList") = True+isListType _                  = False+ usedByFunc          :: String -> (Attribute -> Bool) -> Atts -> Code usedByFunc nm p att = cmnt $$ asRows (tpSig : trs ++ [fls])     where@@ -474,44 +470,46 @@   makeAttr "Damping" ["Damping"] "G" (Dbl) Nothing (Just "0.99") (Just "@0.99@") (Just "@0.0@") (Just "neato only"),   makeAttr "K" ["K"] "GC" (Dbl) Nothing (Just "0.3") (Just "@0.3@") (Just "@0@") (Just "sfdp, fdp only"),   makeAttr "URL" ["URL", "href"] "ENGC" (EStrng) Nothing (Just "\"\"") (Just "none") Nothing (Just "svg, postscript, map only"),+  makeAttr "Area" ["area"] "NC" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@>0@") (Just "patchwork only, requires Graphviz >= 2.30.0"),   makeAttr "ArrowHead" ["arrowhead"] "E" (Cust "ArrowType") Nothing (Just "normal") (Just "@'normal'@") Nothing Nothing,-  makeAttr "ArrowSize" ["arrowsize"] "E" (Dbl) Nothing (Just "1") (Just "@1.0@") (Just "@0.0@") Nothing,+  makeAttr "ArrowSize" ["arrowsize"] "E" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0.0@") Nothing,   makeAttr "ArrowTail" ["arrowtail"] "E" (Cust "ArrowType") Nothing (Just "normal") (Just "@'normal'@") Nothing Nothing,   makeAttr "Aspect" ["aspect"] "G" (Cust "AspectType") Nothing Nothing Nothing Nothing (Just "dot only"),   makeAttr "BoundingBox" ["bb"] "G" (Cust "Rect") Nothing Nothing Nothing Nothing (Just "write only"),-  makeAttr "ColorScheme" ["colorscheme"] "ENCG" (Cust "ColorScheme") Nothing (Just "X11") (Just "@'X11'@") Nothing Nothing,-  makeAttr "BgColor" ["bgcolor"] "GC" (Cust "[Color]") Nothing (Just "[X11Color Transparent]") (Just "@['X11Color' 'Transparent']@") Nothing Nothing,+  makeAttr "BgColor" ["bgcolor"] "GC" (Cust "ColorList") Nothing (Just "[]") (Just "@[]@") Nothing Nothing,   makeAttr "Center" ["center"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,   makeAttr "ClusterRank" ["clusterrank"] "G" (Cust "ClusterMode") Nothing (Just "Local") (Just "@'Local'@") Nothing (Just "dot only"),-  makeAttr "Color" ["color"] "ENC" (Cust "[Color]") Nothing (Just "[X11Color Black]") (Just "@['X11Color' 'Black']@") Nothing Nothing,+  makeAttr "Color" ["color"] "ENC" (Cust "ColorList") Nothing (Just "[toWColor Black]") (Just "@['WC' ('X11Color' 'Black') Nothing]@") Nothing Nothing,+  makeAttr "ColorScheme" ["colorscheme"] "ENCG" (Cust "ColorScheme") Nothing (Just "X11") (Just "@'X11'@") Nothing Nothing,   makeAttr "Comment" ["comment"] "ENG" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing Nothing,   makeAttr "Compound" ["compound"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing (Just "dot only"),   makeAttr "Concentrate" ["concentrate"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,   makeAttr "Constraint" ["constraint"] "E" (Bl) (Just "True") (Just "True") (Just "@'True'@") Nothing (Just "dot only"),   makeAttr "Decorate" ["decorate"] "E" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,-  makeAttr "DefaultDist" ["defaultdist"] "G" (Dbl) Nothing Nothing (Just "@1+(avg. len)*sqrt(abs(V))@") (Just "@epsilon@") (Just "neato only, only if @'Pack' 'DontPack'@"),-  makeAttr "Dim" ["dim"] "G" (Integ) Nothing (Just "2") (Just "@2@") (Just "@2@") (Just "sfdp, fdp, neato only"),-  makeAttr "Dimen" ["dimen"] "G" (Integ) Nothing (Just "2") (Just "@2@") (Just "@2@") (Just "sfdp, fdp, neato only"),+  makeAttr "DefaultDist" ["defaultdist"] "G" (Dbl) Nothing Nothing (Just "@1+(avg. len)*sqrt(abs(V))@ (unable to statically define)") (Just "The value of 'Epsilon'.") (Just "neato only, only if @'Pack' 'DontPack'@"),+  makeAttr "Dim" ["dim"] "G" (Integ) Nothing (Just "2") (Just "@2@") (Just "@2@") (Just "maximum of @10@; sfdp, fdp, neato only"),+  makeAttr "Dimen" ["dimen"] "G" (Integ) Nothing (Just "2") (Just "@2@") (Just "@2@") (Just "maximum of @10@; sfdp, fdp, neato only"),   makeAttr "Dir" ["dir"] "E" (Cust "DirType") Nothing Nothing (Just "@'Forward'@ (directed), @'NoDir'@ (undirected)") Nothing Nothing,   makeAttr "DirEdgeConstraints" ["diredgeconstraints"] "G" (Cust "DEConstraints") (Just "EdgeConstraints") (Just "NoConstraints") (Just "@'NoConstraints'@") Nothing (Just "neato only"),-  makeAttr "Distortion" ["distortion"] "N" (Dbl) Nothing (Just "0") (Just "@0.0@") (Just "@-100.0@") Nothing,-  makeAttr "DPI" ["dpi", "resolution"] "G" (Dbl) Nothing Nothing (Just "@96.0@, @0.0@") Nothing (Just "svg, bitmap output only; \\\"resolution\\\" is a synonym"),+  makeAttr "Distortion" ["distortion"] "N" (Dbl) Nothing (Just "0.0") (Just "@0.0@") (Just "@-100.0@") Nothing,+  makeAttr "DPI" ["dpi", "resolution"] "G" (Dbl) Nothing (Just "96.0") (Just "@96.0@, @0.0@") Nothing (Just "svg, bitmap output only; \\\"resolution\\\" is a synonym"),   makeAttr "EdgeURL" ["edgeURL", "edgehref"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, map only"),   makeAttr "EdgeTarget" ["edgetarget"] "E" (EStrng) Nothing Nothing (Just "none") Nothing (Just "svg, map only"),-  makeAttr "EdgeTooltip" ["edgetooltip"] "E" (EStrng) Nothing Nothing (Just "@\\\"\\\"@") Nothing (Just "svg, cmap only"),+  makeAttr "EdgeTooltip" ["edgetooltip"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, cmap only"),   makeAttr "Epsilon" ["epsilon"] "G" (Dbl) Nothing Nothing (Just "@.0001 * # nodes@ (@mode == 'KK'@), @.0001@ (@mode == 'Major'@)") Nothing (Just "neato only"),   makeAttr "ESep" ["esep"] "G" (Cust "DPoint") Nothing (Just "(DVal 3)") (Just "@'DVal' 3@") Nothing (Just "not dot"),-  makeAttr "FillColor" ["fillcolor"] "NEC" (Cust "[Color]") Nothing (Just "[X11Color Black]") (Just "@['X11Color' 'LightGray']@ (nodes), @['X11Color' 'Black']@ (clusters)") Nothing Nothing,+  makeAttr "FillColor" ["fillcolor"] "NEC" (Cust "ColorList") Nothing (Just "[toWColor Black]") (Just "@['WC' ('X11Color' 'LightGray') Nothing]@ (nodes), @['WC' ('X11Color' 'Black') Nothing]@ (clusters)") Nothing Nothing,   makeAttr "FixedSize" ["fixedsize"] "N" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,   makeAttr "FontColor" ["fontcolor"] "ENGC" (Cust "Color") Nothing (Just "(X11Color Black)") (Just "@'X11Color' 'Black'@") Nothing Nothing,   makeAttr "FontName" ["fontname"] "ENGC" (Strng) Nothing (Just "\"Times-Roman\"") (Just "@\\\"Times-Roman\\\"@") Nothing Nothing,   makeAttr "FontNames" ["fontnames"] "G" (Cust "SVGFontNames") Nothing (Just "SvgNames") (Just "@'SvgNames'@") Nothing (Just "svg only"),-  makeAttr "FontPath" ["fontpath"] "G" (Strng) Nothing Nothing (Just "system dependent") Nothing Nothing,-  makeAttr "FontSize" ["fontsize"] "ENGC" (Dbl) Nothing (Just "14") (Just "@14.0@") (Just "@1.0@") Nothing,-  makeAttr "ForceLabels" ["forcelabels"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing (Just "Only for 'XLabel' attributes, requires Graphviz >= 2.29.0"),+  makeAttr "FontPath" ["fontpath"] "G" (Cust "Paths") Nothing Nothing (Just "system dependent") Nothing Nothing,+  makeAttr "FontSize" ["fontsize"] "ENGC" (Dbl) Nothing (Just "14.0") (Just "@14.0@") (Just "@1.0@") Nothing,+  makeAttr "ForceLabels" ["forcelabels"] "G" (Bl) (Just "True") (Just "True") (Just "@'True'@") Nothing (Just "only for 'XLabel' attributes, requires Graphviz >= 2.29.0"),   makeAttr "GradientAngle" ["gradientangle"] "NCG" (Integ) Nothing (Just "0") (Just "0") Nothing (Just "requires Graphviz >= 2.29.0"),   makeAttr "Group" ["group"] "N" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "dot only"),   makeAttr "HeadURL" ["headURL", "headhref"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, map only"),+  makeAttr "Head_LP" ["head_lp"] "E" (Cust "Point") Nothing Nothing Nothing Nothing (Just "write only, requires Graphviz >= 2.30.0"),   makeAttr "HeadClip" ["headclip"] "E" (Bl) (Just "True") (Just "True") (Just "@'True'@") Nothing Nothing,   makeAttr "HeadLabel" ["headlabel"] "E" (Cust "Label") Nothing (Just "(StrLabel \"\")") (Just "@'StrLabel' \\\"\\\"@") Nothing Nothing,   makeAttr "HeadPort" ["headport"] "E" (Cust "PortPos") Nothing (Just "(CompassPoint CenterPoint)") (Just "@'CompassPoint' 'CenterPoint'@") Nothing Nothing,@@ -525,24 +523,26 @@   makeAttr "Label" ["label"] "ENGC" (Cust "Label") Nothing (Just "(StrLabel \"\")") (Just "@'StrLabel' \\\"\\\\N\\\"@ (nodes), @'StrLabel' \\\"\\\"@ (otherwise)") Nothing Nothing,   makeAttr "LabelURL" ["labelURL", "labelhref"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, map only"),   makeAttr "LabelScheme" ["label_scheme"] "G" (Cust "LabelScheme") Nothing (Just "NotEdgeLabel") (Just "@'NotEdgeLabel'@") Nothing (Just "sfdp only, requires Graphviz >= 2.28.0"),-  makeAttr "LabelAngle" ["labelangle"] "E" (Dbl) Nothing (Just "(-25)") (Just "@-25.0@") (Just "@-180.0@") Nothing,-  makeAttr "LabelDistance" ["labeldistance"] "E" (Dbl) Nothing (Just "1") (Just "@1.0@") (Just "@0.0@") Nothing,+  makeAttr "LabelAngle" ["labelangle"] "E" (Dbl) Nothing (Just "(-25.0)") (Just "@-25.0@") (Just "@-180.0@") Nothing,+  makeAttr "LabelDistance" ["labeldistance"] "E" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0.0@") Nothing,   makeAttr "LabelFloat" ["labelfloat"] "E" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,   makeAttr "LabelFontColor" ["labelfontcolor"] "E" (Cust "Color") Nothing (Just "(X11Color Black)") (Just "@'X11Color' 'Black'@") Nothing Nothing,   makeAttr "LabelFontName" ["labelfontname"] "E" (Strng) Nothing (Just "\"Times-Roman\"") (Just "@\\\"Times-Roman\\\"@") Nothing Nothing,-  makeAttr "LabelFontSize" ["labelfontsize"] "E" (Dbl) Nothing (Just "14") (Just "@14.0@") (Just "@1.0@") Nothing,+  makeAttr "LabelFontSize" ["labelfontsize"] "E" (Dbl) Nothing (Just "14.0") (Just "@14.0@") (Just "@1.0@") Nothing,   makeAttr "LabelJust" ["labeljust"] "GC" (Cust "Justification") Nothing (Just "JCenter") (Just "@'JCenter'@") Nothing Nothing,   makeAttr "LabelLoc" ["labelloc"] "GCN" (Cust "VerticalPlacement") Nothing (Just "VTop") (Just "@'VTop'@ (clusters), @'VBottom'@ (root graphs), @'VCenter'@ (nodes)") Nothing Nothing,   makeAttr "LabelTarget" ["labeltarget"] "E" (EStrng) Nothing (Just "\"\"") (Just "none") Nothing (Just "svg, map only"),   makeAttr "LabelTooltip" ["labeltooltip"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, cmap only"),   makeAttr "Landscape" ["landscape"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,-  makeAttr "Layer" ["layer"] "EN" (Cust "LayerRange") Nothing Nothing Nothing Nothing Nothing,+  makeAttr "Layer" ["layer"] "EN" (Cust "LayerRange") Nothing (Just "[]") (Just "@[]@") Nothing Nothing,+  makeAttr "LayerListSep" ["layerlistsep"] "G" (Cust "LayerListSep") Nothing (Just "(LLSep \",\")") (Just "@'LLSep' \\\",\\\"@") Nothing (Just "requires Graphviz >= 2.30.0"),   makeAttr "Layers" ["layers"] "G" (Cust "LayerList") Nothing (Just "(LL [])") (Just "@'LL' []@") Nothing Nothing,+  makeAttr "LayerSelect" ["layerselect"] "G" (Cust "LayerRange") Nothing (Just "[]") (Just "@[]@") Nothing Nothing,   makeAttr "LayerSep" ["layersep"] "G" (Cust "LayerSep") Nothing (Just "(LSep \" :\\t\")") (Just "@'LSep' \\\" :\\t\\\"@") Nothing Nothing,-  makeAttr "Layout" ["layout"] "G" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing Nothing,+  makeAttr "Layout" ["layout"] "G" (Cust "GraphvizCommand") Nothing Nothing Nothing Nothing Nothing,   makeAttr "Len" ["len"] "E" (Dbl) Nothing Nothing (Just "@1.0@ (neato), @0.3@ (fdp)") Nothing (Just "fdp, neato only"),-  makeAttr "LevelsGap" ["levelsgap"] "G" (Dbl) Nothing (Just "0") (Just "@0.0@") Nothing (Just "neato only"),   makeAttr "Levels" ["levels"] "G" (Integ) Nothing (Just "maxBound") (Just "@'maxBound'@") (Just "@0@") (Just "sfdp only"),+  makeAttr "LevelsGap" ["levelsgap"] "G" (Dbl) Nothing (Just "0.0") (Just "@0.0@") Nothing (Just "neato only"),   makeAttr "LHead" ["lhead"] "E" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "dot only"),   makeAttr "LHeight" ["LHeight"] "GC" (Dbl) Nothing Nothing Nothing Nothing (Just "write only, requires Graphviz >= 2.28.0"),   makeAttr "LPos" ["lp"] "EGC" (Cust "Point") Nothing Nothing Nothing Nothing (Just "write only"),@@ -550,8 +550,8 @@   makeAttr "LWidth" ["lwidth"] "GC" (Dbl) Nothing Nothing Nothing Nothing (Just "write only, requires Graphviz >= 2.28.0"),   makeAttr "Margin" ["margin"] "NG" (Cust "DPoint") Nothing Nothing (Just "device dependent") Nothing Nothing,   makeAttr "MaxIter" ["maxiter"] "G" (Integ) Nothing Nothing (Just "@100 * # nodes@ (@mode == 'KK'@), @200@ (@mode == 'Major'@), @600@ (fdp)") Nothing (Just "fdp, neato only"),-  makeAttr "MCLimit" ["mclimit"] "G" (Dbl) Nothing (Just "1") (Just "@1.0@") Nothing (Just "dot only"),-  makeAttr "MinDist" ["mindist"] "G" (Dbl) Nothing (Just "1") (Just "@1.0@") (Just "@0.0@") (Just "circo only"),+  makeAttr "MCLimit" ["mclimit"] "G" (Dbl) Nothing (Just "1.0") (Just "@1.0@") Nothing (Just "dot only"),+  makeAttr "MinDist" ["mindist"] "G" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0.0@") (Just "circo only"),   makeAttr "MinLen" ["minlen"] "E" (Integ) Nothing (Just "1") (Just "@1@") (Just "@0@") (Just "dot only"),   makeAttr "Mode" ["mode"] "G" (Cust "ModeType") Nothing (Just "Major") (Just "@'Major'@") Nothing (Just "neato only"),   makeAttr "Model" ["model"] "G" (Cust "Model") Nothing (Just "ShortPath") (Just "@'ShortPath'@") Nothing (Just "neato only"),@@ -562,7 +562,7 @@   makeAttr "Nslimit" ["nslimit"] "G" (Dbl) Nothing Nothing Nothing Nothing (Just "dot only"),   makeAttr "Nslimit1" ["nslimit1"] "G" (Dbl) Nothing Nothing Nothing Nothing (Just "dot only"),   makeAttr "Ordering" ["ordering"] "GN" (Cust "Order") Nothing Nothing (Just "none") Nothing (Just "dot only"),-  makeAttr "Orientation" ["orientation"] "N" (Dbl) Nothing (Just "0") (Just "@0.0@") (Just "@360.0@") Nothing,+  makeAttr "Orientation" ["orientation"] "N" (Dbl) Nothing (Just "0.0") (Just "@0.0@") (Just "@360.0@") Nothing,   makeAttr "OutputOrder" ["outputorder"] "G" (Cust "OutputMode") Nothing (Just "BreadthFirst") (Just "@'BreadthFirst'@") Nothing Nothing,   makeAttr "Overlap" ["overlap"] "G" (Cust "Overlap") (Just "KeepOverlaps") (Just "KeepOverlaps") (Just "@'KeepOverlaps'@") Nothing (Just "not dot"),   makeAttr "OverlapScaling" ["overlap_scaling"] "G" (Dbl) Nothing (Just "(-4)") (Just "@-4@") (Just "@-1.0e10@") (Just "prism only"),@@ -572,7 +572,7 @@   makeAttr "Page" ["page"] "G" (Cust "Point") Nothing Nothing Nothing Nothing Nothing,   makeAttr "PageDir" ["pagedir"] "G" (Cust "PageDir") Nothing (Just "Bl") (Just "@'Bl'@") Nothing Nothing,   makeAttr "PenColor" ["pencolor"] "C" (Cust "Color") Nothing (Just "(X11Color Black)") (Just "@'X11Color' 'Black'@") Nothing Nothing,-  makeAttr "PenWidth" ["penwidth"] "CNE" (Dbl) Nothing (Just "1") (Just "@1.0@") (Just "@0.0@") Nothing,+  makeAttr "PenWidth" ["penwidth"] "CNE" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0.0@") Nothing,   makeAttr "Peripheries" ["peripheries"] "NC" (Integ) Nothing (Just "1") (Just "shape default (nodes), @1@ (clusters)") (Just "0") Nothing,   makeAttr "Pin" ["pin"] "N" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing (Just "fdp, neato only"),   makeAttr "Pos" ["pos"] "EN" (Cust "Pos") Nothing Nothing Nothing Nothing Nothing,@@ -585,7 +585,7 @@   makeAttr "Rects" ["rects"] "N" (Cust "[Rect]") Nothing Nothing Nothing Nothing (Just "write only"),   makeAttr "Regular" ["regular"] "N" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing Nothing,   makeAttr "ReMinCross" ["remincross"] "G" (Bl) (Just "True") (Just "False") (Just "@'False'@") Nothing (Just "dot only"),-  makeAttr "RepulsiveForce" ["repulsiveforce"] "G" (Dbl) Nothing (Just "1") (Just "@1.0@") (Just "@0.0@") (Just "sfdp only"),+  makeAttr "RepulsiveForce" ["repulsiveforce"] "G" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0.0@") (Just "sfdp only"),   makeAttr "Root" ["root"] "GN" (Cust "Root") (Just "IsCentral") (Just "(NodeName \"\")") (Just "@'NodeName' \\\"\\\"@ (graphs), @'NotCentral'@ (nodes)") Nothing (Just "circo, twopi only"),   makeAttr "Rotate" ["rotate"] "G" (Integ) Nothing (Just "0") (Just "@0@") Nothing Nothing,   makeAttr "Rotation" ["rotation"] "G" (Dbl) Nothing (Just "0") (Just "@0@") Nothing (Just "sfdp only, requires Graphviz >= 2.28.0"),@@ -596,18 +596,18 @@   makeAttr "SearchSize" ["searchsize"] "G" (Integ) Nothing (Just "30") (Just "@30@") Nothing (Just "dot only"),   makeAttr "Sep" ["sep"] "G" (Cust "DPoint") Nothing (Just "(DVal 4)") (Just "@'DVal' 4@") Nothing (Just "not dot"),   makeAttr "Shape" ["shape"] "N" (Cust "Shape") Nothing (Just "Ellipse") (Just "@'Ellipse'@") Nothing Nothing,-  makeAttr "ShapeFile" ["shapefile"] "N" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing Nothing,-  makeAttr "ShowBoxes" ["showboxes"] "ENG" (Integ) Nothing (Just "0") (Just "@0@") (Just "@0@") (Just "dot only"),+  makeAttr "ShowBoxes" ["showboxes"] "ENG" (Integ) Nothing (Just "0") (Just "@0@") (Just "@0@") (Just "dot only; used for debugging by printing PostScript guide boxes"),   makeAttr "Sides" ["sides"] "N" (Integ) Nothing (Just "4") (Just "@4@") (Just "@0@") Nothing,   makeAttr "Size" ["size"] "G" (Cust "GraphSize") Nothing Nothing Nothing Nothing Nothing,-  makeAttr "Skew" ["skew"] "N" (Dbl) Nothing (Just "0") (Just "@0.0@") (Just "@-100.0@") Nothing,+  makeAttr "Skew" ["skew"] "N" (Dbl) Nothing (Just "0.0") (Just "@0.0@") (Just "@-100.0@") Nothing,   makeAttr "Smoothing" ["smoothing"] "G" (Cust "SmoothType") Nothing (Just "NoSmooth") (Just "@'NoSmooth'@") Nothing (Just "sfdp only"),   makeAttr "SortV" ["sortv"] "GCN" (Cust "Word16") Nothing (Just "0") (Just "@0@") (Just "@0@") Nothing,-  makeAttr "Splines" ["splines"] "G" (Cust "EdgeType") (Just "SplineEdges") (Just "SplineEdges") Nothing Nothing Nothing,-  makeAttr "Start" ["start"] "G" (Cust "StartType") Nothing Nothing Nothing Nothing (Just "fdp, neato only"),+  makeAttr "Splines" ["splines"] "G" (Cust "EdgeType") (Just "SplineEdges") Nothing (Just "@'SplineEdges'@ (dot), @'LineEdges'@ (other)") Nothing Nothing,+  makeAttr "Start" ["start"] "G" (Cust "StartType") Nothing Nothing (Just "@'StartStyleSeed' 'RandomStyle' seed@ for some unknown fixed seed.") Nothing (Just "fdp, neato only"),   makeAttr "Style" ["style"] "ENC" (Cust "[StyleItem]") Nothing Nothing Nothing Nothing Nothing,   makeAttr "StyleSheet" ["stylesheet"] "G" (Strng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg only"),   makeAttr "TailURL" ["tailURL", "tailhref"] "E" (EStrng) Nothing (Just "\"\"") (Just "@\\\"\\\"@") Nothing (Just "svg, map only"),+  makeAttr "Tail_LP" ["tail_lp"] "E" (Cust "Point") Nothing Nothing Nothing Nothing (Just "write only"),   makeAttr "TailClip" ["tailclip"] "E" (Bl) (Just "True") (Just "True") (Just "@'True'@") Nothing Nothing,   makeAttr "TailLabel" ["taillabel"] "E" (Cust "Label") Nothing (Just "(StrLabel \"\")") (Just "@'StrLabel' \\\"\\\"@") Nothing Nothing,   makeAttr "TailPort" ["tailport"] "E" (Cust "PortPos") Nothing (Just "(CompassPoint CenterPoint)") (Just "@'CompassPoint' 'CenterPoint'@") Nothing Nothing,@@ -619,10 +619,10 @@   makeAttr "Vertices" ["vertices"] "N" (Cust "[Point]") Nothing Nothing Nothing Nothing (Just "write only"),   makeAttr "ViewPort" ["viewport"] "G" (Cust "ViewPort") Nothing Nothing (Just "none") Nothing Nothing,   makeAttr "VoroMargin" ["voro_margin"] "G" (Dbl) Nothing (Just "0.05") (Just "@0.05@") (Just "@0.0@") (Just "not dot"),-  makeAttr "Weight" ["weight"] "E" (Dbl) Nothing Nothing (Just "@1.0@") (Just "@0@ (dot), @1@ (neato,fdp,sfdp)") Nothing,+  makeAttr "Weight" ["weight"] "E" (Dbl) Nothing (Just "1.0") (Just "@1.0@") (Just "@0@ (dot), @1@ (neato,fdp,sfdp)") Nothing,   makeAttr "Width" ["width"] "N" (Dbl) Nothing (Just "0.75") (Just "@0.75@") (Just "@0.01@") Nothing,   makeAttr "XLabel" ["xlabel"] "EN" (Cust "Label") Nothing (Just "(StrLabel \"\")") (Just "@'StrLabel' \\\"\\\"@") Nothing (Just "requires Graphviz >= 2.29.0"),-  makeAttr "Z" ["z"] "N" (Dbl) Nothing (Just "0") (Just "@0.0@") (Just "@-MAXFLOAT@, @-1000@") Nothing+  makeAttr "XLP" ["xlp"] "EN" (Cust "Point") Nothing Nothing Nothing Nothing (Just "write only, requires Graphviz >= 2.29.0")   -- END RECEIVE ORGTBL Attributes   ] @@ -650,160 +650,164 @@   double-quotes should be escaped.  #+ORGTBL: SEND Attributes orgtbl-to-generic :skip 2 :splice t :hline nil :no-escape t :lstart "  makeAttr " :lend "," :llend "" :sep " " :fmt (1 cell-quote 2 cell-to-list 3 cell-quote 4 cell-parens 5 cell-to-maybe 6 cell-to-maybe 7 cell-to-maybe 8 cell-to-maybe 9 cell-to-maybe)-| Constructor        | Allowed names      | Used By | Type                     | Parsing default | Default value              | Default for Documentation                                                | Minimum                         | Comment notes                                                    |-|--------------------+--------------------+---------+--------------------------+-----------------+----------------------------+--------------------------------------------------------------------------+---------------------------------+------------------------------------------------------------------|-| Damping            | Damping            | G       | Dbl                      |                 | 0.99                       | @0.99@                                                                   | @0.0@                           | neato only                                                       |-| K                  | K                  | GC      | Dbl                      |                 | 0.3                        | @0.3@                                                                    | @0@                             | sfdp, fdp only                                                   |-| URL                | URL href           | ENGC    | EStrng                   |                 | \"\"                       | none                                                                     |                                 | svg, postscript, map only                                        |-| ArrowHead          | arrowhead          | E       | Cust "ArrowType"         |                 | normal                     | @'normal'@                                                               |                                 |                                                                  |-| ArrowSize          | arrowsize          | E       | Dbl                      |                 | 1                          | @1.0@                                                                    | @0.0@                           |                                                                  |-| ArrowTail          | arrowtail          | E       | Cust "ArrowType"         |                 | normal                     | @'normal'@                                                               |                                 |                                                                  |-| Aspect             | aspect             | G       | Cust "AspectType"        |                 |                            |                                                                          |                                 | dot only                                                         |-| BoundingBox        | bb                 | G       | Cust "Rect"              |                 |                            |                                                                          |                                 | write only                                                       |-| ColorScheme        | colorscheme        | ENCG    | Cust "ColorScheme"       |                 | X11                        | @'X11'@                                                                  |                                 |                                                                  |-| BgColor            | bgcolor            | GC      | Cust "[Color]"           |                 | [X11Color Transparent]     | @['X11Color' 'Transparent']@                                             |                                 |                                                                  |-| Center             | center             | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |-| ClusterRank        | clusterrank        | G       | Cust "ClusterMode"       |                 | Local                      | @'Local'@                                                                |                                 | dot only                                                         |-| Color              | color              | ENC     | Cust "[Color]"           |                 | [X11Color Black]           | @['X11Color' 'Black']@                                                   |                                 |                                                                  |-| Comment            | comment            | ENG     | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 |                                                                  |-| Compound           | compound           | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 | dot only                                                         |-| Concentrate        | concentrate        | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |-| Constraint         | constraint         | E       | Bl                       | True            | True                       | @'True'@                                                                 |                                 | dot only                                                         |-| Decorate           | decorate           | E       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |-| DefaultDist        | defaultdist        | G       | Dbl                      |                 |                            | @1+(avg. len)*sqrt(abs(V))@                                              | @epsilon@                       | neato only, only if @'Pack' 'DontPack'@                          |-| Dim                | dim                | G       | Integ                    |                 | 2                          | @2@                                                                      | @2@                             | sfdp, fdp, neato only                                            |-| Dimen              | dimen              | G       | Integ                    |                 | 2                          | @2@                                                                      | @2@                             | sfdp, fdp, neato only                                            |-| Dir                | dir                | E       | Cust "DirType"           |                 |                            | @'Forward'@ (directed), @'NoDir'@ (undirected)                           |                                 |                                                                  |-| DirEdgeConstraints | diredgeconstraints | G       | Cust "DEConstraints"     | EdgeConstraints | NoConstraints              | @'NoConstraints'@                                                        |                                 | neato only                                                       |-| Distortion         | distortion         | N       | Dbl                      |                 | 0                          | @0.0@                                                                    | @-100.0@                        |                                                                  |-| DPI                | dpi resolution     | G       | Dbl                      |                 |                            | @96.0@, @0.0@                                                            |                                 | svg, bitmap output only; \\\"resolution\\\" is a synonym         |-| EdgeURL            | edgeURL edgehref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, map only                                                    |-| EdgeTarget         | edgetarget         | E       | EStrng                   |                 |                            | none                                                                     |                                 | svg, map only                                                    |-| EdgeTooltip        | edgetooltip        | E       | EStrng                   |                 |                            | @\\\"\\\"@                                                               |                                 | svg, cmap only                                                   |-| Epsilon            | epsilon            | G       | Dbl                      |                 |                            | @.0001 * # nodes@ (@mode == 'KK'@), @.0001@ (@mode == 'Major'@)          |                                 | neato only                                                       |-| ESep               | esep               | G       | Cust "DPoint"            |                 | (DVal 3)                   | @'DVal' 3@                                                               |                                 | not dot                                                          |-| FillColor          | fillcolor          | NEC     | Cust "[Color]"           |                 | [X11Color Black]           | @['X11Color' 'LightGray']@ (nodes), @['X11Color' 'Black']@ (clusters)    |                                 |                                                                  |-| FixedSize          | fixedsize          | N       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |-| FontColor          | fontcolor          | ENGC    | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                     |                                 |                                                                  |-| FontName           | fontname           | ENGC    | Strng                    |                 | \"Times-Roman\"            | @\\\"Times-Roman\\\"@                                                    |                                 |                                                                  |-| FontNames          | fontnames          | G       | Cust "SVGFontNames"      |                 | SvgNames                   | @'SvgNames'@                                                             |                                 | svg only                                                         |-| FontPath           | fontpath           | G       | Strng                    |                 |                            | system dependent                                                         |                                 |                                                                  |-| FontSize           | fontsize           | ENGC    | Dbl                      |                 | 14                         | @14.0@                                                                   | @1.0@                           |                                                                  |-| ForceLabels        | forcelabels        | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 | Only for 'XLabel' attributes, requires Graphviz >= 2.29.0        |-| GradientAngle      | gradientangle      | NCG     | Integ                    |                 | 0                          | 0                                                                        |                                 | requires Graphviz >= 2.29.0                                      |-| Group              | group              | N       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | dot only                                                         |-| HeadURL            | headURL headhref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, map only                                                    |-| HeadClip           | headclip           | E       | Bl                       | True            | True                       | @'True'@                                                                 |                                 |                                                                  |-| HeadLabel          | headlabel          | E       | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                    |                                 |                                                                  |-| HeadPort           | headport           | E       | Cust "PortPos"           |                 | (CompassPoint CenterPoint) | @'CompassPoint' 'CenterPoint'@                                           |                                 |                                                                  |-| HeadTarget         | headtarget         | E       | EStrng                   |                 | \"\"                       | none                                                                     |                                 | svg, map only                                                    |-| HeadTooltip        | headtooltip        | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, cmap only                                                   |-| Height             | height             | N       | Dbl                      |                 | 0.5                        | @0.5@                                                                    | @0.02@                          |                                                                  |-| ID                 | id                 | GNE     | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, postscript, map only                                        |-| Image              | image              | N       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 |                                                                  |-| ImagePath          | imagepath          | G       | Cust "Paths"             |                 | (Paths [])                 | @'Paths' []@                                                             |                                 | Printing and parsing is OS-specific, requires Graphviz >= 2.29.0 |-| ImageScale         | imagescale         | N       | Cust "ScaleType"         | UniformScale    | NoScale                    | @'NoScale'@                                                              |                                 |                                                                  |-| Label              | label              | ENGC    | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\\N\\\"@ (nodes), @'StrLabel' \\\"\\\"@ (otherwise)    |                                 |                                                                  |-| LabelURL           | labelURL labelhref | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, map only                                                    |-| LabelScheme        | label_scheme       | G       | Cust "LabelScheme"       |                 | NotEdgeLabel               | @'NotEdgeLabel'@                                                         |                                 | sfdp only, requires Graphviz >= 2.28.0                           |-| LabelAngle         | labelangle         | E       | Dbl                      |                 | (-25)                      | @-25.0@                                                                  | @-180.0@                        |                                                                  |-| LabelDistance      | labeldistance      | E       | Dbl                      |                 | 1                          | @1.0@                                                                    | @0.0@                           |                                                                  |-| LabelFloat         | labelfloat         | E       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |-| LabelFontColor     | labelfontcolor     | E       | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                     |                                 |                                                                  |-| LabelFontName      | labelfontname      | E       | Strng                    |                 | \"Times-Roman\"            | @\\\"Times-Roman\\\"@                                                    |                                 |                                                                  |-| LabelFontSize      | labelfontsize      | E       | Dbl                      |                 | 14                         | @14.0@                                                                   | @1.0@                           |                                                                  |-| LabelJust          | labeljust          | GC      | Cust "Justification"     |                 | JCenter                    | @'JCenter'@                                                              |                                 |                                                                  |-| LabelLoc           | labelloc           | GCN     | Cust "VerticalPlacement" |                 | VTop                       | @'VTop'@ (clusters), @'VBottom'@ (root graphs), @'VCenter'@ (nodes)      |                                 |                                                                  |-| LabelTarget        | labeltarget        | E       | EStrng                   |                 | \"\"                       | none                                                                     |                                 | svg, map only                                                    |-| LabelTooltip       | labeltooltip       | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, cmap only                                                   |-| Landscape          | landscape          | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |-| Layer              | layer              | EN      | Cust "LayerRange"        |                 |                            |                                                                          |                                 |                                                                  |-| Layers             | layers             | G       | Cust "LayerList"         |                 | (LL [])                    | @'LL' []@                                                                |                                 |                                                                  |-| LayerSep           | layersep           | G       | Cust "LayerSep"          |                 | (LSep \" :\\t\")           | @'LSep' \\\" :\\t\\\"@                                                   |                                 |                                                                  |-| Layout             | layout             | G       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 |                                                                  |-| Len                | len                | E       | Dbl                      |                 |                            | @1.0@ (neato), @0.3@ (fdp)                                               |                                 | fdp, neato only                                                  |-| LevelsGap          | levelsgap          | G       | Dbl                      |                 | 0                          | @0.0@                                                                    |                                 | neato only                                                       |-| Levels             | levels             | G       | Integ                    |                 | maxBound                   | @'maxBound'@                                                             | @0@                             | sfdp only                                                        |-| LHead              | lhead              | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | dot only                                                         |-| LHeight            | LHeight            | GC      | Dbl                      |                 |                            |                                                                          |                                 | write only, requires Graphviz >= 2.28.0                          |-| LPos               | lp                 | EGC     | Cust "Point"             |                 |                            |                                                                          |                                 | write only                                                       |-| LTail              | ltail              | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | dot only                                                         |-| LWidth             | lwidth             | GC      | Dbl                      |                 |                            |                                                                          |                                 | write only, requires Graphviz >= 2.28.0                          |-| Margin             | margin             | NG      | Cust "DPoint"            |                 |                            | device dependent                                                         |                                 |                                                                  |-| MaxIter            | maxiter            | G       | Integ                    |                 |                            | @100 * # nodes@ (@mode == 'KK'@), @200@ (@mode == 'Major'@), @600@ (fdp) |                                 | fdp, neato only                                                  |-| MCLimit            | mclimit            | G       | Dbl                      |                 | 1                          | @1.0@                                                                    |                                 | dot only                                                         |-| MinDist            | mindist            | G       | Dbl                      |                 | 1                          | @1.0@                                                                    | @0.0@                           | circo only                                                       |-| MinLen             | minlen             | E       | Integ                    |                 | 1                          | @1@                                                                      | @0@                             | dot only                                                         |-| Mode               | mode               | G       | Cust "ModeType"          |                 | Major                      | @'Major'@                                                                |                                 | neato only                                                       |-| Model              | model              | G       | Cust "Model"             |                 | ShortPath                  | @'ShortPath'@                                                            |                                 | neato only                                                       |-| Mosek              | mosek              | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 | neato only; requires the Mosek software                          |-| NodeSep            | nodesep            | G       | Dbl                      |                 | 0.25                       | @0.25@                                                                   | @0.02@                          | dot only                                                         |-| NoJustify          | nojustify          | GCNE    | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |-| Normalize          | normalize          | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 | not dot                                                          |-| Nslimit            | nslimit            | G       | Dbl                      |                 |                            |                                                                          |                                 | dot only                                                         |-| Nslimit1           | nslimit1           | G       | Dbl                      |                 |                            |                                                                          |                                 | dot only                                                         |-| Ordering           | ordering           | GN      | Cust "Order"             |                 |                            | none                                                                     |                                 | dot only                                                         |-| Orientation        | orientation        | N       | Dbl                      |                 | 0                          | @0.0@                                                                    | @360.0@                         |                                                                  |-| OutputOrder        | outputorder        | G       | Cust "OutputMode"        |                 | BreadthFirst               | @'BreadthFirst'@                                                         |                                 |                                                                  |-| Overlap            | overlap            | G       | Cust "Overlap"           | KeepOverlaps    | KeepOverlaps               | @'KeepOverlaps'@                                                         |                                 | not dot                                                          |-| OverlapScaling     | overlap_scaling    | G       | Dbl                      |                 | (-4)                       | @-4@                                                                     | @-1.0e10@                       | prism only                                                       |-| Pack               | pack               | G       | Cust "Pack"              | DoPack          | DontPack                   | @'DontPack'@                                                             |                                 | not dot                                                          |-| PackMode           | packmode           | G       | Cust "PackMode"          |                 | PackNode                   | @'PackNode'@                                                             |                                 | not dot                                                          |-| Pad                | pad                | G       | Cust "DPoint"            |                 | (DVal 0.0555)              | @'DVal' 0.0555@ (4 points)                                               |                                 |                                                                  |-| Page               | page               | G       | Cust "Point"             |                 |                            |                                                                          |                                 |                                                                  |-| PageDir            | pagedir            | G       | Cust "PageDir"           |                 | Bl                         | @'Bl'@                                                                   |                                 |                                                                  |-| PenColor           | pencolor           | C       | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                     |                                 |                                                                  |-| PenWidth           | penwidth           | CNE     | Dbl                      |                 | 1                          | @1.0@                                                                    | @0.0@                           |                                                                  |-| Peripheries        | peripheries        | NC      | Integ                    |                 | 1                          | shape default (nodes), @1@ (clusters)                                    | 0                               |                                                                  |-| Pin                | pin                | N       | Bl                       | True            | False                      | @'False'@                                                                |                                 | fdp, neato only                                                  |-| Pos                | pos                | EN      | Cust "Pos"               |                 |                            |                                                                          |                                 |                                                                  |-| QuadTree           | quadtree           | G       | Cust "QuadType"          | NormalQT        | NormalQT                   | @'NormalQT'@                                                             |                                 | sfdp only                                                        |-| Quantum            | quantum            | G       | Dbl                      |                 | 0                          | @0.0@                                                                    | @0.0@                           |                                                                  |-| Rank               | rank               | S       | Cust "RankType"          |                 |                            |                                                                          |                                 | dot only                                                         |-| RankDir            | rankdir            | G       | Cust "RankDir"           |                 | FromTop                    | @'FromTop'@                                                              |                                 | dot only                                                         |-| RankSep            | ranksep            | G       | Cust "[Double]"          |                 |                            | @[0.5]@ (dot), @[1.0]@ (twopi)                                           | [0.02]                          | twopi, dot only                                                  |-| Ratio              | ratio              | G       | Cust "Ratios"            |                 |                            |                                                                          |                                 |                                                                  |-| Rects              | rects              | N       | Cust "[Rect]"            |                 |                            |                                                                          |                                 | write only                                                       |-| Regular            | regular            | N       | Bl                       | True            | False                      | @'False'@                                                                |                                 |                                                                  |-| ReMinCross         | remincross         | G       | Bl                       | True            | False                      | @'False'@                                                                |                                 | dot only                                                         |-| RepulsiveForce     | repulsiveforce     | G       | Dbl                      |                 | 1                          | @1.0@                                                                    | @0.0@                           | sfdp only                                                        |-| Root               | root               | GN      | Cust "Root"              | IsCentral       | (NodeName \"\")            | @'NodeName' \\\"\\\"@ (graphs), @'NotCentral'@ (nodes)                   |                                 | circo, twopi only                                                |-| Rotate             | rotate             | G       | Integ                    |                 | 0                          | @0@                                                                      |                                 |                                                                  |-| Rotation           | rotation           | G       | Dbl                      |                 | 0                          | @0@                                                                      |                                 | sfdp only, requires Graphviz >= 2.28.0                           |-| SameHead           | samehead           | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | dot only                                                         |-| SameTail           | sametail           | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | dot only                                                         |-| SamplePoints       | samplepoints       | N       | Integ                    |                 |                            | @8@ (output), @20@ (overlap and image maps)                              |                                 |                                                                  |-| Scale              | scale              | G       | Cust "DPoint"            |                 |                            |                                                                          |                                 | twopi only, requires Graphviz >= 2.28.0                          |-| SearchSize         | searchsize         | G       | Integ                    |                 | 30                         | @30@                                                                     |                                 | dot only                                                         |-| Sep                | sep                | G       | Cust "DPoint"            |                 | (DVal 4)                   | @'DVal' 4@                                                               |                                 | not dot                                                          |-| Shape              | shape              | N       | Cust "Shape"             |                 | Ellipse                    | @'Ellipse'@                                                              |                                 |                                                                  |-| ShapeFile          | shapefile          | N       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 |                                                                  |-| ShowBoxes          | showboxes          | ENG     | Integ                    |                 | 0                          | @0@                                                                      | @0@                             | dot only                                                         |-| Sides              | sides              | N       | Integ                    |                 | 4                          | @4@                                                                      | @0@                             |                                                                  |-| Size               | size               | G       | Cust "GraphSize"         |                 |                            |                                                                          |                                 |                                                                  |-| Skew               | skew               | N       | Dbl                      |                 | 0                          | @0.0@                                                                    | @-100.0@                        |                                                                  |-| Smoothing          | smoothing          | G       | Cust "SmoothType"        |                 | NoSmooth                   | @'NoSmooth'@                                                             |                                 | sfdp only                                                        |-| SortV              | sortv              | GCN     | Cust "Word16"            |                 | 0                          | @0@                                                                      | @0@                             |                                                                  |-| Splines            | splines            | G       | Cust "EdgeType"          | SplineEdges     | SplineEdges                |                                                                          |                                 |                                                                  |-| Start              | start              | G       | Cust "StartType"         |                 |                            |                                                                          |                                 | fdp, neato only                                                  |-| Style              | style              | ENC     | Cust "[StyleItem]"       |                 |                            |                                                                          |                                 |                                                                  |-| StyleSheet         | stylesheet         | G       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg only                                                         |-| TailURL            | tailURL tailhref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, map only                                                    |-| TailClip           | tailclip           | E       | Bl                       | True            | True                       | @'True'@                                                                 |                                 |                                                                  |-| TailLabel          | taillabel          | E       | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                    |                                 |                                                                  |-| TailPort           | tailport           | E       | Cust "PortPos"           |                 | (CompassPoint CenterPoint) | @'CompassPoint' 'CenterPoint'@                                           |                                 |                                                                  |-| TailTarget         | tailtarget         | E       | EStrng                   |                 | \"\"                       | none                                                                     |                                 | svg, map only                                                    |-| TailTooltip        | tailtooltip        | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, cmap only                                                   |-| Target             | target             | ENGC    | EStrng                   |                 | \"\"                       | none                                                                     |                                 | svg, map only                                                    |-| Tooltip            | tooltip            | NEC     | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                               |                                 | svg, cmap only                                                   |-| TrueColor          | truecolor          | G       | Bl                       | True            |                            |                                                                          |                                 | bitmap output only                                               |-| Vertices           | vertices           | N       | Cust "[Point]"           |                 |                            |                                                                          |                                 | write only                                                       |-| ViewPort           | viewport           | G       | Cust "ViewPort"          |                 |                            | none                                                                     |                                 |                                                                  |-| VoroMargin         | voro_margin        | G       | Dbl                      |                 | 0.05                       | @0.05@                                                                   | @0.0@                           | not dot                                                          |-| Weight             | weight             | E       | Dbl                      |                 |                            | @1.0@                                                                    | @0@ (dot), @1@ (neato,fdp,sfdp) |                                                                  |-| Width              | width              | N       | Dbl                      |                 | 0.75                       | @0.75@                                                                   | @0.01@                          |                                                                  |-| XLabel             | xlabel             | EN      | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                    |                                 | requires Graphviz >= 2.29.0                                      |-| Z                  | z                  | N       | Dbl                      |                 | 0                          | @0.0@                                                                    | @-MAXFLOAT@, @-1000@            |                                                                  |+| Constructor        | Allowed names      | Used By | Type                     | Parsing default | Default value              | Default for Documentation                                                                           | Minimum                         | Comment notes                                                    |+|--------------------+--------------------+---------+--------------------------+-----------------+----------------------------+-----------------------------------------------------------------------------------------------------+---------------------------------+------------------------------------------------------------------|+| Damping            | Damping            | G       | Dbl                      |                 | 0.99                       | @0.99@                                                                                              | @0.0@                           | neato only                                                       |+| K                  | K                  | GC      | Dbl                      |                 | 0.3                        | @0.3@                                                                                               | @0@                             | sfdp, fdp only                                                   |+| URL                | URL href           | ENGC    | EStrng                   |                 | \"\"                       | none                                                                                                |                                 | svg, postscript, map only                                        |+| Area               | area               | NC      | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @>0@                            | patchwork only, requires Graphviz >= 2.30.0                      |+| ArrowHead          | arrowhead          | E       | Cust "ArrowType"         |                 | normal                     | @'normal'@                                                                                          |                                 |                                                                  |+| ArrowSize          | arrowsize          | E       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0.0@                           |                                                                  |+| ArrowTail          | arrowtail          | E       | Cust "ArrowType"         |                 | normal                     | @'normal'@                                                                                          |                                 |                                                                  |+| Aspect             | aspect             | G       | Cust "AspectType"        |                 |                            |                                                                                                     |                                 | dot only                                                         |+| BoundingBox        | bb                 | G       | Cust "Rect"              |                 |                            |                                                                                                     |                                 | write only                                                       |+| BgColor            | bgcolor            | GC      | Cust "ColorList"         |                 | []                         | @[]@                                                                                                |                                 |                                                                  |+| Center             | center             | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |+| ClusterRank        | clusterrank        | G       | Cust "ClusterMode"       |                 | Local                      | @'Local'@                                                                                           |                                 | dot only                                                         |+| Color              | color              | ENC     | Cust "ColorList"         |                 | [toWColor Black]           | @['WC' ('X11Color' 'Black') Nothing]@                                                               |                                 |                                                                  |+| ColorScheme        | colorscheme        | ENCG    | Cust "ColorScheme"       |                 | X11                        | @'X11'@                                                                                             |                                 |                                                                  |+| Comment            | comment            | ENG     | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 |                                                                  |+| Compound           | compound           | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 | dot only                                                         |+| Concentrate        | concentrate        | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |+| Constraint         | constraint         | E       | Bl                       | True            | True                       | @'True'@                                                                                            |                                 | dot only                                                         |+| Decorate           | decorate           | E       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |+| DefaultDist        | defaultdist        | G       | Dbl                      |                 |                            | @1+(avg. len)*sqrt(abs(V))@ (unable to statically define)                                           | The value of 'Epsilon'.         | neato only, only if @'Pack' 'DontPack'@                          |+| Dim                | dim                | G       | Integ                    |                 | 2                          | @2@                                                                                                 | @2@                             | maximum of @10@; sfdp, fdp, neato only                           |+| Dimen              | dimen              | G       | Integ                    |                 | 2                          | @2@                                                                                                 | @2@                             | maximum of @10@; sfdp, fdp, neato only                           |+| Dir                | dir                | E       | Cust "DirType"           |                 |                            | @'Forward'@ (directed), @'NoDir'@ (undirected)                                                      |                                 |                                                                  |+| DirEdgeConstraints | diredgeconstraints | G       | Cust "DEConstraints"     | EdgeConstraints | NoConstraints              | @'NoConstraints'@                                                                                   |                                 | neato only                                                       |+| Distortion         | distortion         | N       | Dbl                      |                 | 0.0                        | @0.0@                                                                                               | @-100.0@                        |                                                                  |+| DPI                | dpi resolution     | G       | Dbl                      |                 | 96.0                       | @96.0@, @0.0@                                                                                       |                                 | svg, bitmap output only; \\\"resolution\\\" is a synonym         |+| EdgeURL            | edgeURL edgehref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, map only                                                    |+| EdgeTarget         | edgetarget         | E       | EStrng                   |                 |                            | none                                                                                                |                                 | svg, map only                                                    |+| EdgeTooltip        | edgetooltip        | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, cmap only                                                   |+| Epsilon            | epsilon            | G       | Dbl                      |                 |                            | @.0001 * # nodes@ (@mode == 'KK'@), @.0001@ (@mode == 'Major'@)                                     |                                 | neato only                                                       |+| ESep               | esep               | G       | Cust "DPoint"            |                 | (DVal 3)                   | @'DVal' 3@                                                                                          |                                 | not dot                                                          |+| FillColor          | fillcolor          | NEC     | Cust "ColorList"         |                 | [toWColor Black]           | @['WC' ('X11Color' 'LightGray') Nothing]@ (nodes), @['WC' ('X11Color' 'Black') Nothing]@ (clusters) |                                 |                                                                  |+| FixedSize          | fixedsize          | N       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |+| FontColor          | fontcolor          | ENGC    | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                                                |                                 |                                                                  |+| FontName           | fontname           | ENGC    | Strng                    |                 | \"Times-Roman\"            | @\\\"Times-Roman\\\"@                                                                               |                                 |                                                                  |+| FontNames          | fontnames          | G       | Cust "SVGFontNames"      |                 | SvgNames                   | @'SvgNames'@                                                                                        |                                 | svg only                                                         |+| FontPath           | fontpath           | G       | Cust "Paths"             |                 |                            | system dependent                                                                                    |                                 |                                                                  |+| FontSize           | fontsize           | ENGC    | Dbl                      |                 | 14.0                       | @14.0@                                                                                              | @1.0@                           |                                                                  |+| ForceLabels        | forcelabels        | G       | Bl                       | True            | True                       | @'True'@                                                                                            |                                 | only for 'XLabel' attributes, requires Graphviz >= 2.29.0        |+| GradientAngle      | gradientangle      | NCG     | Integ                    |                 | 0                          | 0                                                                                                   |                                 | requires Graphviz >= 2.29.0                                      |+| Group              | group              | N       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | dot only                                                         |+| HeadURL            | headURL headhref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, map only                                                    |+| Head_LP            | head_lp            | E       | Cust "Point"             |                 |                            |                                                                                                     |                                 | write only, requires Graphviz >= 2.30.0                          |+| HeadClip           | headclip           | E       | Bl                       | True            | True                       | @'True'@                                                                                            |                                 |                                                                  |+| HeadLabel          | headlabel          | E       | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                                               |                                 |                                                                  |+| HeadPort           | headport           | E       | Cust "PortPos"           |                 | (CompassPoint CenterPoint) | @'CompassPoint' 'CenterPoint'@                                                                      |                                 |                                                                  |+| HeadTarget         | headtarget         | E       | EStrng                   |                 | \"\"                       | none                                                                                                |                                 | svg, map only                                                    |+| HeadTooltip        | headtooltip        | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, cmap only                                                   |+| Height             | height             | N       | Dbl                      |                 | 0.5                        | @0.5@                                                                                               | @0.02@                          |                                                                  |+| ID                 | id                 | GNE     | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, postscript, map only                                        |+| Image              | image              | N       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 |                                                                  |+| ImagePath          | imagepath          | G       | Cust "Paths"             |                 | (Paths [])                 | @'Paths' []@                                                                                        |                                 | Printing and parsing is OS-specific, requires Graphviz >= 2.29.0 |+| ImageScale         | imagescale         | N       | Cust "ScaleType"         | UniformScale    | NoScale                    | @'NoScale'@                                                                                         |                                 |                                                                  |+| Label              | label              | ENGC    | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\\N\\\"@ (nodes), @'StrLabel' \\\"\\\"@ (otherwise)                               |                                 |                                                                  |+| LabelURL           | labelURL labelhref | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, map only                                                    |+| LabelScheme        | label_scheme       | G       | Cust "LabelScheme"       |                 | NotEdgeLabel               | @'NotEdgeLabel'@                                                                                    |                                 | sfdp only, requires Graphviz >= 2.28.0                           |+| LabelAngle         | labelangle         | E       | Dbl                      |                 | (-25.0)                    | @-25.0@                                                                                             | @-180.0@                        |                                                                  |+| LabelDistance      | labeldistance      | E       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0.0@                           |                                                                  |+| LabelFloat         | labelfloat         | E       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |+| LabelFontColor     | labelfontcolor     | E       | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                                                |                                 |                                                                  |+| LabelFontName      | labelfontname      | E       | Strng                    |                 | \"Times-Roman\"            | @\\\"Times-Roman\\\"@                                                                               |                                 |                                                                  |+| LabelFontSize      | labelfontsize      | E       | Dbl                      |                 | 14.0                       | @14.0@                                                                                              | @1.0@                           |                                                                  |+| LabelJust          | labeljust          | GC      | Cust "Justification"     |                 | JCenter                    | @'JCenter'@                                                                                         |                                 |                                                                  |+| LabelLoc           | labelloc           | GCN     | Cust "VerticalPlacement" |                 | VTop                       | @'VTop'@ (clusters), @'VBottom'@ (root graphs), @'VCenter'@ (nodes)                                 |                                 |                                                                  |+| LabelTarget        | labeltarget        | E       | EStrng                   |                 | \"\"                       | none                                                                                                |                                 | svg, map only                                                    |+| LabelTooltip       | labeltooltip       | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, cmap only                                                   |+| Landscape          | landscape          | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |+| Layer              | layer              | EN      | Cust "LayerRange"        |                 | []                         | @[]@                                                                                                |                                 |                                                                  |+| LayerListSep       | layerlistsep       | G       | Cust "LayerListSep"      |                 | (LLSep \",\")              | @'LLSep' \\\",\\\"@                                                                                 |                                 | requires Graphviz >= 2.30.0                                      |+| Layers             | layers             | G       | Cust "LayerList"         |                 | (LL [])                    | @'LL' []@                                                                                           |                                 |                                                                  |+| LayerSelect        | layerselect        | G       | Cust "LayerRange"        |                 | []                         | @[]@                                                                                                |                                 |                                                                  |+| LayerSep           | layersep           | G       | Cust "LayerSep"          |                 | (LSep \" :\\t\")           | @'LSep' \\\" :\\t\\\"@                                                                              |                                 |                                                                  |+| Layout             | layout             | G       | Cust "GraphvizCommand"   |                 |                            |                                                                                                     |                                 |                                                                  |+| Len                | len                | E       | Dbl                      |                 |                            | @1.0@ (neato), @0.3@ (fdp)                                                                          |                                 | fdp, neato only                                                  |+| Levels             | levels             | G       | Integ                    |                 | maxBound                   | @'maxBound'@                                                                                        | @0@                             | sfdp only                                                        |+| LevelsGap          | levelsgap          | G       | Dbl                      |                 | 0.0                        | @0.0@                                                                                               |                                 | neato only                                                       |+| LHead              | lhead              | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | dot only                                                         |+| LHeight            | LHeight            | GC      | Dbl                      |                 |                            |                                                                                                     |                                 | write only, requires Graphviz >= 2.28.0                          |+| LPos               | lp                 | EGC     | Cust "Point"             |                 |                            |                                                                                                     |                                 | write only                                                       |+| LTail              | ltail              | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | dot only                                                         |+| LWidth             | lwidth             | GC      | Dbl                      |                 |                            |                                                                                                     |                                 | write only, requires Graphviz >= 2.28.0                          |+| Margin             | margin             | NG      | Cust "DPoint"            |                 |                            | device dependent                                                                                    |                                 |                                                                  |+| MaxIter            | maxiter            | G       | Integ                    |                 |                            | @100 * # nodes@ (@mode == 'KK'@), @200@ (@mode == 'Major'@), @600@ (fdp)                            |                                 | fdp, neato only                                                  |+| MCLimit            | mclimit            | G       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               |                                 | dot only                                                         |+| MinDist            | mindist            | G       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0.0@                           | circo only                                                       |+| MinLen             | minlen             | E       | Integ                    |                 | 1                          | @1@                                                                                                 | @0@                             | dot only                                                         |+| Mode               | mode               | G       | Cust "ModeType"          |                 | Major                      | @'Major'@                                                                                           |                                 | neato only                                                       |+| Model              | model              | G       | Cust "Model"             |                 | ShortPath                  | @'ShortPath'@                                                                                       |                                 | neato only                                                       |+| Mosek              | mosek              | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 | neato only; requires the Mosek software                          |+| NodeSep            | nodesep            | G       | Dbl                      |                 | 0.25                       | @0.25@                                                                                              | @0.02@                          | dot only                                                         |+| NoJustify          | nojustify          | GCNE    | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |+| Normalize          | normalize          | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 | not dot                                                          |+| Nslimit            | nslimit            | G       | Dbl                      |                 |                            |                                                                                                     |                                 | dot only                                                         |+| Nslimit1           | nslimit1           | G       | Dbl                      |                 |                            |                                                                                                     |                                 | dot only                                                         |+| Ordering           | ordering           | GN      | Cust "Order"             |                 |                            | none                                                                                                |                                 | dot only                                                         |+| Orientation        | orientation        | N       | Dbl                      |                 | 0.0                        | @0.0@                                                                                               | @360.0@                         |                                                                  |+| OutputOrder        | outputorder        | G       | Cust "OutputMode"        |                 | BreadthFirst               | @'BreadthFirst'@                                                                                    |                                 |                                                                  |+| Overlap            | overlap            | G       | Cust "Overlap"           | KeepOverlaps    | KeepOverlaps               | @'KeepOverlaps'@                                                                                    |                                 | not dot                                                          |+| OverlapScaling     | overlap_scaling    | G       | Dbl                      |                 | (-4)                       | @-4@                                                                                                | @-1.0e10@                       | prism only                                                       |+| Pack               | pack               | G       | Cust "Pack"              | DoPack          | DontPack                   | @'DontPack'@                                                                                        |                                 | not dot                                                          |+| PackMode           | packmode           | G       | Cust "PackMode"          |                 | PackNode                   | @'PackNode'@                                                                                        |                                 | not dot                                                          |+| Pad                | pad                | G       | Cust "DPoint"            |                 | (DVal 0.0555)              | @'DVal' 0.0555@ (4 points)                                                                          |                                 |                                                                  |+| Page               | page               | G       | Cust "Point"             |                 |                            |                                                                                                     |                                 |                                                                  |+| PageDir            | pagedir            | G       | Cust "PageDir"           |                 | Bl                         | @'Bl'@                                                                                              |                                 |                                                                  |+| PenColor           | pencolor           | C       | Cust "Color"             |                 | (X11Color Black)           | @'X11Color' 'Black'@                                                                                |                                 |                                                                  |+| PenWidth           | penwidth           | CNE     | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0.0@                           |                                                                  |+| Peripheries        | peripheries        | NC      | Integ                    |                 | 1                          | shape default (nodes), @1@ (clusters)                                                               | 0                               |                                                                  |+| Pin                | pin                | N       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 | fdp, neato only                                                  |+| Pos                | pos                | EN      | Cust "Pos"               |                 |                            |                                                                                                     |                                 |                                                                  |+| QuadTree           | quadtree           | G       | Cust "QuadType"          | NormalQT        | NormalQT                   | @'NormalQT'@                                                                                        |                                 | sfdp only                                                        |+| Quantum            | quantum            | G       | Dbl                      |                 | 0                          | @0.0@                                                                                               | @0.0@                           |                                                                  |+| Rank               | rank               | S       | Cust "RankType"          |                 |                            |                                                                                                     |                                 | dot only                                                         |+| RankDir            | rankdir            | G       | Cust "RankDir"           |                 | FromTop                    | @'FromTop'@                                                                                         |                                 | dot only                                                         |+| RankSep            | ranksep            | G       | Cust "[Double]"          |                 |                            | @[0.5]@ (dot), @[1.0]@ (twopi)                                                                      | [0.02]                          | twopi, dot only                                                  |+| Ratio              | ratio              | G       | Cust "Ratios"            |                 |                            |                                                                                                     |                                 |                                                                  |+| Rects              | rects              | N       | Cust "[Rect]"            |                 |                            |                                                                                                     |                                 | write only                                                       |+| Regular            | regular            | N       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 |                                                                  |+| ReMinCross         | remincross         | G       | Bl                       | True            | False                      | @'False'@                                                                                           |                                 | dot only                                                         |+| RepulsiveForce     | repulsiveforce     | G       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0.0@                           | sfdp only                                                        |+| Root               | root               | GN      | Cust "Root"              | IsCentral       | (NodeName \"\")            | @'NodeName' \\\"\\\"@ (graphs), @'NotCentral'@ (nodes)                                              |                                 | circo, twopi only                                                |+| Rotate             | rotate             | G       | Integ                    |                 | 0                          | @0@                                                                                                 |                                 |                                                                  |+| Rotation           | rotation           | G       | Dbl                      |                 | 0                          | @0@                                                                                                 |                                 | sfdp only, requires Graphviz >= 2.28.0                           |+| SameHead           | samehead           | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | dot only                                                         |+| SameTail           | sametail           | E       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | dot only                                                         |+| SamplePoints       | samplepoints       | N       | Integ                    |                 |                            | @8@ (output), @20@ (overlap and image maps)                                                         |                                 |                                                                  |+| Scale              | scale              | G       | Cust "DPoint"            |                 |                            |                                                                                                     |                                 | twopi only, requires Graphviz >= 2.28.0                          |+| SearchSize         | searchsize         | G       | Integ                    |                 | 30                         | @30@                                                                                                |                                 | dot only                                                         |+| Sep                | sep                | G       | Cust "DPoint"            |                 | (DVal 4)                   | @'DVal' 4@                                                                                          |                                 | not dot                                                          |+| Shape              | shape              | N       | Cust "Shape"             |                 | Ellipse                    | @'Ellipse'@                                                                                         |                                 |                                                                  |+| ShowBoxes          | showboxes          | ENG     | Integ                    |                 | 0                          | @0@                                                                                                 | @0@                             | dot only; used for debugging by printing PostScript guide boxes  |+| Sides              | sides              | N       | Integ                    |                 | 4                          | @4@                                                                                                 | @0@                             |                                                                  |+| Size               | size               | G       | Cust "GraphSize"         |                 |                            |                                                                                                     |                                 |                                                                  |+| Skew               | skew               | N       | Dbl                      |                 | 0.0                        | @0.0@                                                                                               | @-100.0@                        |                                                                  |+| Smoothing          | smoothing          | G       | Cust "SmoothType"        |                 | NoSmooth                   | @'NoSmooth'@                                                                                        |                                 | sfdp only                                                        |+| SortV              | sortv              | GCN     | Cust "Word16"            |                 | 0                          | @0@                                                                                                 | @0@                             |                                                                  |+| Splines            | splines            | G       | Cust "EdgeType"          | SplineEdges     |                            | @'SplineEdges'@ (dot), @'LineEdges'@ (other)                                                        |                                 |                                                                  |+| Start              | start              | G       | Cust "StartType"         |                 |                            | @'StartStyleSeed' 'RandomStyle' seed@ for some unknown fixed seed.                                  |                                 | fdp, neato only                                                  |+| Style              | style              | ENC     | Cust "[StyleItem]"       |                 |                            |                                                                                                     |                                 |                                                                  |+| StyleSheet         | stylesheet         | G       | Strng                    |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg only                                                         |+| TailURL            | tailURL tailhref   | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, map only                                                    |+| Tail_LP            | tail_lp            | E       | Cust "Point"             |                 |                            |                                                                                                     |                                 | write only                                                       |+| TailClip           | tailclip           | E       | Bl                       | True            | True                       | @'True'@                                                                                            |                                 |                                                                  |+| TailLabel          | taillabel          | E       | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                                               |                                 |                                                                  |+| TailPort           | tailport           | E       | Cust "PortPos"           |                 | (CompassPoint CenterPoint) | @'CompassPoint' 'CenterPoint'@                                                                      |                                 |                                                                  |+| TailTarget         | tailtarget         | E       | EStrng                   |                 | \"\"                       | none                                                                                                |                                 | svg, map only                                                    |+| TailTooltip        | tailtooltip        | E       | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, cmap only                                                   |+| Target             | target             | ENGC    | EStrng                   |                 | \"\"                       | none                                                                                                |                                 | svg, map only                                                    |+| Tooltip            | tooltip            | NEC     | EStrng                   |                 | \"\"                       | @\\\"\\\"@                                                                                          |                                 | svg, cmap only                                                   |+| TrueColor          | truecolor          | G       | Bl                       | True            |                            |                                                                                                     |                                 | bitmap output only                                               |+| Vertices           | vertices           | N       | Cust "[Point]"           |                 |                            |                                                                                                     |                                 | write only                                                       |+| ViewPort           | viewport           | G       | Cust "ViewPort"          |                 |                            | none                                                                                                |                                 |                                                                  |+| VoroMargin         | voro_margin        | G       | Dbl                      |                 | 0.05                       | @0.05@                                                                                              | @0.0@                           | not dot                                                          |+| Weight             | weight             | E       | Dbl                      |                 | 1.0                        | @1.0@                                                                                               | @0@ (dot), @1@ (neato,fdp,sfdp) |                                                                  |+| Width              | width              | N       | Dbl                      |                 | 0.75                       | @0.75@                                                                                              | @0.01@                          |                                                                  |+| XLabel             | xlabel             | EN      | Cust "Label"             |                 | (StrLabel \"\")            | @'StrLabel' \\\"\\\"@                                                                               |                                 | requires Graphviz >= 2.29.0                                      |+| XLP                | xlp                | EN      | Cust "Point"             |                 |                            |                                                                                                     |                                 | write only, requires Graphviz >= 2.29.0                          |  -}