! Copyright (C) 2011 Alex Vondrak. ! See http://factorcode.org/license.txt for BSD license. USING: graphviz graphviz.attributes help.markup help.syntax kernel present sequences ; IN: graphviz.notation { add-edge add-edge[ -- ~-- --[ } related-words { add-edge add-edge[ -> ~-> ->[ } related-words { add-node[ add-edge[ --[ ->[ node[ edge[ graph[ ]; } related-words HELP: -- { $values { "graph" { $or graph subgraph } } { "tail" object } { "head" object } { "graph'" { $or graph subgraph } } } { $description "Shorthand for " { $link add-edge } ". Makes undirected " { $link graph } "s read more like graphs in the DOT language." } { $examples "Instead of writing" { $code "" " 1 2 add-edge" " 3 4 add-edge" " 5 6 add-edge" } "it looks better to write" { $code "" " 1 2 --" " 3 4 --" " 5 6 --" } "Compare this with the DOT language, where you'd write" { $code "graph {" " 1 -- 2" " 3 -- 4" " 5 -- 6" "}" } } ; HELP: -> { $values { "graph" { $or graph subgraph } } { "tail" object } { "head" object } { "graph'" { $or graph subgraph } } } { $description "Shorthand for " { $link add-edge } ". Makes directed " { $link graph } "s read more like digraphs in the DOT language." } { $examples "Instead of writing" { $code "" " 1 2 add-edge" " 3 4 add-edge" " 5 6 add-edge" } "it looks better to write" { $code "" " 1 2 ->" " 3 4 ->" " 5 6 ->" } "Compare this with the DOT language, where you'd write" { $code "digraph {" " 1 -> 2" " 3 -> 4" " 5 -> 6" "}" } } ; HELP: --[ { $values { "tail" object } { "head" object } { "edge" edge } } { $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that undirected " { $link graph } "s read more like graphs in the DOT language." } { $examples "Instead of writing" { $code "" " 1 2 \"red\" =color add" } "it looks better to write" { $code "" " 1 2 --[ \"red\" =color ];" } "Compare this with the DOT language, where you'd write" { $code "graph {" " 1 -- 2 [ color=\"red\" ];" "}" } } ; HELP: ->[ { $values { "tail" object } { "head" object } { "edge" edge } } { $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that directed " { $link graph } "s read more like digraphs in the DOT language." } { $examples "Instead of writing" { $code "" " 1 2 \"red\" =color add" } "it looks better to write" { $code "" " 1 2 ->[ \"red\" =color ];" } "Compare this with the DOT language, where you'd write" { $code "digraph {" " 1 -> 2 [ color=\"red\" ];" "}" } } ; HELP: ]; { $values { "graph" { $or graph subgraph } } { "statement" object } { "graph'" { $or graph subgraph } } } { $description "Synonym for " { $link add } " meant to be the \"other half\" of various " { $vocab-link "graphviz.notation" } " words like " { $links add-edge[ add-node[ graph[ } ", etc." } { $examples "Refer to the documentation for the complementary words listed below." } ; HELP: add-edge[ { $values { "tail" object } { "head" object } { "edge" edge } } { $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that setting an " { $link edge } "'s " { $slot "attributes" } " reads more like the equivalent in the DOT language." } { $examples "Instead of writing" { $code "" " 1 2 \"red\" =color add" } "it looks better to write" { $code "" " 1 2 add-edge[ \"red\" =color ];" } "Compare this with the DOT language, where you'd write" { $code "graph {" " 1 -- 2 [ color=\"red\" ];" "}" } $nl "This has the advantage over " { $link --[ } " and " { $link ->[ } " of reading nicely for both directed " { $emphasis "and" } " undirected " { $link graph } "s." } ; HELP: add-node[ { $values { "id" object } { "node" node } } { $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that setting a " { $link node } "'s " { $slot "attributes" } " reads more like the equivalent in the DOT language." } { $examples "Instead of writing" { $code "" " \"foo\" \"red\" =color add" } "it looks better to write" { $code "" " \"foo\" add-node[ \"red\" =color ];" } "Compare this with the DOT language, where you'd write" { $code "graph {" " foo [ color=\"red\" ];" "}" } } ; HELP: edge[ { $values { "attrs" edge-attributes } } { $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that adding " { $link edge-attributes } " to a " { $link graph } " or " { $link subgraph } " reads more like the equivalent in the DOT language." } { $examples "Instead of writing" { $code "" " \"red\" =color add" } "it looks better to write" { $code "" " edge[ \"red\" =color ];" } "Compare this with the DOT language, where you'd write" { $code "graph {" " edge[ color=\"red\" ];" "}" } } ; HELP: graph[ { $values { "attrs" graph-attributes } } { $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that adding " { $link graph-attributes } " to a " { $link graph } " or " { $link subgraph } " reads more like the equivalent in the DOT language." } { $notes "This word is rendered redundant by the " { $link graph } " and " { $link subgraph } " methods defined by " { $vocab-link "graphviz.notation" } " for setting attributes. Sometimes it still might look better to delineate certain attribute-setting code." } { $examples "Instead of writing" { $code "" " \"LR\" =rankdir \"blah\" =label add" } "it looks better to write" { $code "" " graph[ \"LR\" =rankdir \"blah\" =label ];" } "Compare this with the DOT language, where you'd write" { $code "graph {" " graph[ rankdir=\"LR\" label=\"blah\" ];" "}" } $nl "Of course, you could just write" { $code "" " \"LR\" =rankdir" " \"blah\" =label" } "Similarly, in the DOT language you could just write" { $code "graph {" " rankdir=\"LR\"" " label=\"blah\"" "}" } } ; HELP: node[ { $values { "attrs" node-attributes } } { $description "Shorthand for " { $link } " to be used with " { $link ]; } " and attribute-setting generic words (see " { $link { "graphviz.notation" "=attrs" } } ") so that adding " { $link node-attributes } " to a " { $link graph } " or " { $link subgraph } " reads more like the equivalent in the DOT language." } { $examples "Instead of writing" { $code "" " \"red\" =color add" } "it looks better to write" { $code "" " node[ \"red\" =color ];" } "Compare this with the DOT language, where you'd write" { $code "graph {" " node[ color=\"red\" ];" "}" } } ; HELP: ~-- { $values { "graph" { $or graph subgraph } } { "nodes" sequence } { "graph'" { $or graph subgraph } } } { $description "Shorthand for " { $link add-path } ". Meant to be a Factor replacement for the DOT language's more verbose path notation." } { $examples "Instead of writing" { $code "" " 1 2 --" " 2 3 --" " 3 4 --" } "you can write" { $code "" " { 1 2 3 4 } ~--" } "whereas in the DOT language you'd write" { $code "graph {" " 1 -- 2 -- 3 -- 4" "}" } } ; HELP: ~-> { $values { "graph" { $or graph subgraph } } { "nodes" sequence } { "graph'" { $or graph subgraph } } } { $description "Shorthand for " { $link add-path } ". Meant to be a Factor replacement for the DOT language's more verbose path notation." } { $examples "Instead of writing" { $code "" " 1 2 ->" " 2 3 ->" " 3 4 ->" } "you can write" { $code "" " { 1 2 3 4 } ~->" } "whereas in the DOT language you'd write" { $code "digraph {" " 1 -> 2 -> 3 -> 4" "}" } } ; ARTICLE: { "graphviz.notation" "=attrs" } "Notation for setting Graphviz attributes" "The " { $vocab-link "graphviz.notation" } " vocabulary provides words for setting Graphviz attributes in a way that looks similar to the DOT language (see " { $url "http://graphviz.org/content/dot-language" } ")." $nl "For every slot named, say, " { $snippet "attr" } " in the " { $link node-attributes } ", " { $link edge-attributes } ", and " { $link graph-attributes } " tuples, a generic word named " { $snippet "=attr" } " is defined with the stack effect " { $snippet "( graphviz-obj val -- graphviz-obj' )" } "." $nl "In each such " { $snippet "=attr" } " word, " { $snippet "val" } " must be an object supported by the " { $link present } " word, which is always called on " { $snippet "val" } " before it's stored in a slot." $nl "These generics will \"do the right thing\" in setting the corresponding attribute of " { $snippet "graphviz-obj" } "." $nl "For example, since " { $link graph-attributes } " has a " { $slot "label" } " slot, the generic " { $link =label } " is defined, along with methods so that if " { $snippet "graphviz-obj" } " is a..." { $list { "..." { $link graph } " or " { $link subgraph } ", a new " { $link graph-attributes } " instance is created, has its " { $slot "label" } " slot is set to " { $snippet "val" } ", and is " { $link add } "ed to " { $snippet "graphviz-obj" } "." } { "..." { $link graph-attributes } " instance, its " { $slot "label" } " slot is set to " { $snippet "val" } "." } } $nl "Since " { $link edge-attributes } " has a " { $slot "label" } " slot, further methods are defined so that if " { $snippet "graphviz-obj" } " is an..." { $list { "..." { $link edge } ", its " { $slot "attributes" } " slot has its " { $slot "label" } " slot set to " { $snippet "val" } "." } { "..." { $link edge-attributes } " instance, its " { $slot "label" } " slot is set to " { $snippet "val" } "." } } $nl "Finally, since " { $link node-attributes } " has a " { $slot "label" } " slot, still more methods are defined so that if " { $snippet "graphviz-obj" } " is a..." { $list { "..." { $link node } ", its " { $slot "attributes" } " slot has its " { $slot "label" } " slot set to " { $snippet "val" } "." } { "..." { $link node-attributes } " instance, its " { $slot "label" } " slot is set to " { $snippet "val" } "." } } $nl "Thus, instead of" { $code "" " " " \"Bad-ass graph\" >>label" " add" " 1 2 dup attributes>>" " \"This edge is dumb\" swap label<<" " add" " 3 dup attributes>>" " \"This node is cool\" swap label<<" " add" } "you can simply write" { $code "" " \"Bad-ass graph\" =label" " 1 2 " " \"This edge is dumb\" =label" " add" " 3 " " \"This node is cool\" =label" " add" } $nl "However, since the slot " { $slot "labelloc" } " only exists in " { $link graph-attributes } " and " { $link node-attributes } ", there won't be a method for " { $link edge } " or " { $link edge-attributes } " objects:" { $example "USING: continuations graphviz graphviz.notation io kernel ;" "" " ! This is OK:" " \"t\" =labelloc" "" " ! This is not OK:" " [ 1 2 \"b\" =labelloc add ]" " [ 2drop \"not for edges!\" write ] recover" "not for edges!" } $nl "For the full list of attribute-setting words, consult the list of generic words for the " { $vocab-link "graphviz.notation" } " vocabulary." ; ARTICLE: { "graphviz.notation" "synonyms" } "Aliases that resemble DOT code" "The " { $vocab-link "graphviz.notation" } " vocabulary provides aliases for words defined in the " { $vocab-link "graphviz" } " and " { $vocab-link "graphviz.attributes" } " vocabularies. These will make Factor code read more like DOT code (see " { $url "http://graphviz.org/content/dot-language" } ")." $nl "Notation for edges without attributes:" { $subsections -- -> ~-- ~-> } "Notation for nodes/edges with local attributes:" { $subsections add-node[ add-edge[ --[ ->[ } "Notation for global attributes:" { $subsections node[ edge[ graph[ } "Word to \"close off\" notation for attributes:" { $subsections ]; } ; ARTICLE: "graphviz.notation" "Graphviz notation" "The " { $vocab-link "graphviz.notation" } " vocabulary provides words for building " { $link graph } "s in a way that looks similar to the DOT language (see " { $url "http://graphviz.org/content/dot-language" } ")." $nl "The " { $vocab-link "graphviz" } " vocabulary alone already follows the general structure of the DOT language: " { $link graph } "s and " { $link subgraph } "s consist of an ordered sequence of " { $slot "statements" } "; each statement will " { $link add } " either a " { $link node } ", an " { $link edge } ", or some attribute declaration (" { $links graph-attributes node-attributes edge-attributes } "); and " { $slot "attributes" } " may be set on individual " { $link node } "s and " { $link edge } "s. Even some DOT niceties are already supported, like being able to have an " { $link edge } " between anonymous " { $link subgraph } "s. For instance, compare" { $code "" " { 1 2 3 } { 4 5 6 } add-edge" } "with the DOT code" { $code "digraph {" " { 1 2 3 } -> { 4 5 6 }" "}" } $nl "However, there are some rough points that this vocabulary addresses:" { $subsections { "graphviz.notation" "=attrs" } { "graphviz.notation" "synonyms" } } ; ABOUT: "graphviz.notation"