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 +78/−0
- Data/GraphViz/Algorithms.hs +189/−134
- Data/GraphViz/Attributes.hs +17/−5
- Data/GraphViz/Attributes/Colors.hs +65/−2
- Data/GraphViz/Attributes/Complete.hs +384/−151
- Data/GraphViz/Attributes/HTML.hs +3/−3
- Data/GraphViz/Attributes/Internal.hs +1/−1
- Data/GraphViz/Attributes/Same.hs +4/−0
- Data/GraphViz/Commands.hs +5/−20
- Data/GraphViz/Commands/IO.hs +19/−13
- Data/GraphViz/Parsing.hs +0/−60
- Data/GraphViz/Printing.hs +1/−1
- Data/GraphViz/State.hs +14/−0
- Data/GraphViz/Types.hs +38/−3
- Data/GraphViz/Types/Common.hs +11/−0
- Data/GraphViz/Types/Generalised.hs +7/−2
- Data/GraphViz/Types/Graph.hs +9/−9
- Data/GraphViz/Types/Monadic.hs +1/−2
- Data/GraphViz/Types/State.hs +4/−4
- Data/GraphViz/Util.hs +1/−1
- FAQ.md +3/−1
- TODO.md +5/−0
- graphviz.cabal +4/−2
- tests/Data/GraphViz/Testing.hs +48/−2
- tests/Data/GraphViz/Testing/Instances/Attributes.hs +40/−10
- tests/Data/GraphViz/Testing/Instances/Common.hs +6/−2
- tests/Data/GraphViz/Testing/Instances/Helpers.hs +3/−3
- tests/Data/GraphViz/Testing/Properties.hs +28/−7
- utils/AttributeGenerator.hs +204/−200
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 | -}