The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Revision history for Graph::Easy (formerly known as Graph::Simple):

2005-07-13 v0.22 Tels 686 tests - Fix, fix, fix, fix the bugs...
Fixed:
  * Edge/Parser: edge style '~~' (wave)
  * Layouter: assign layers, process nodes sorted by layers
    (fixes the '"[B] [A]->[B]" being laid out different from "[A]->[B]"' bug)
  * Edge.pm: remove needless new()
  * Makefile.PL check for As_svg was borked
Added:
  * Node.pm: add columns(), rows(), grow(), connections()
  * Layout.pm: add _assign_layers()
  * Easy.pm: sorted_nodes() takes 1 or 2 optional field names to sort on
  * _near_places() moved into Graph::Easy::Node, make it multi-cell aware
  * started laying down the foundation for multi-celled nodes
    support in Path.pm/Scout.pm

2005-07-10 v0.21 Tels 605 tests - Fix, fix, fix, fix the bugs...
  * As_graphviz: default nodes to filled, fontsize 11
  * As_graphviz: quote attribute values if nec.
  * As_graphviz: remap attribute names (background => fillcolor etc)
  * As_graphviz: output edge attributes
  * As_txt: use remap_attribute()
  * Easy: add remap_attributes(), as_svg_file(), as_ascii_file()
  * Easy: fix POD for add_node(), rem doc about add_vertex(), vertices()
  * Easy: add_node() returns newly added node and copes with ("name")

2005-06-25 v0.20 Tels 589 tests - Fix, fix, fix, fix the bugs...
  * put SVG code into a seperate package, see there for CHANGES
  * add some details to POD
  * border-style "dotdashed" renamed to "dot-dash"
  * added border and edge-styles: "dot-dot-dash", "wave"
  * make "border" set the attributes border-width, border-style, border-color
  * as_txt(): output "border" as it used to, even though only
    /border-(style|width|color)/ exist now
  * as_txt(): sort attributes by name on output to make it more predictable
  * as_ascii(): render border styles: double, wave, dot-dash, dot-dot-dash
  * as_ascii(): render edge styles: wave, dot-dash, dot-dot-dash
  * as_html(): fix overly big circles on labels with line breaks
  * as_html(): fix edge style on edges with labels
  * Easy: add_edge() returns the newly added edge
  * Parser: handle edge styles "~~" (wave), ".-" (dot-dash) and "..-" (dot-dot-dash)
  * Parser: recognize all official W3C color names from SVG spec as input
  * Parser: reject invalid colors and node shapes
  * Parser: allow 'Graph::Easy::Parser->from_file(...);'
  * Parser: improve POD
  * Node: streamline attribute() and title()

2005-06-12 v0.19 Tels 573 tests - Shape, shape, shape, shape the nodes...
  * moved manual and Pod2HTML to Graph::Easy::Manual to avoid dependency
    on Pod::Simple
  * Graph/Easy.pm: add seed(), randomize(), as_ascii_html()
  * Graph/Easy.pm: rem stray debug print in add_edge()
  * fix POD about limitations, multi-edges are possible since v0.18
  * Parser: allow GLOB and similiar things as file to from_file()
  * Easy: add/del of clusters/groups invalidates the current layout
  * as_ascii(): fix output of nodes with "border: none;"
  * as_ascii(): implement border "dashed;", "dotdashed" and "bold"
  * Easy: add _framebuffer(): generate empty framebuffer for as_ascii()
  * Easy: make _framebuffer() twice as fast
 
Renamed to Graph::Easy:

2005-06-11 v0.18 Tels 573 tests - Shape, shape, shape, shape the nodes...
  * renamed from Graph::Simple to Graph::Easy
  * small cleanups (bumping $VERSIONS, remove unnec. error() routines etc)
  * fix =begin graph/end graph in doc/manual/*
  * Graph::Easy::Pod2HTML and examples/pod2html support outputformat,
    especially "html" and "src,html"
  * fix Graph::Easy::Pod2HTML to work almost (the graphs still appear
    somewhat out-of-order in the output...)
  * forgot to include doc/manual/index.pod
  * add one more test for ASCII rendering of autosplit nodes (with hole)
  * Parser: do not create empty nodes on autosplit clusters
  * re-factor code to allow multi-edges (more than one edge from A to B)
  * add tests for multiedges
  * call "_correct_size_$format()" if possible
  * As_svg: add _correct_size_svg() for Nodes and Edge/Cells
  * As_svg: correctly center text for node labels
  * As_svg: draw hor/ver lines for edges
  * As_svg: draw arrow heads for edges
  * As_svg: include a comment with edge type and source/target node
  * As_svg: fix position/size for nodes with shape diamond/circle/ellipse
  * _prepare_layout() expands cells sizes to maximum column/row size
  * Node: add shape()

2005-05-29 v0.17 Tels 559 tests - Edge, edge, edge, edge towards the node...
  * rename examples/txt2ascii to examples/as_ascii
  * fix examples/as_ascii to actually work
  * add examples/as_html
  * amend INSTALL, README
  * add complete manual (doc/manual/*) and doc/gen_manual to generate HTML
    version of the manual
  * add Graph::Simple::Pod2HTML
  * include tests for different node shapes
  * suppress attribute "shape" in HTML output
  * as_html: for "shape: invisible", output empty table cell
  * as_html: for shape rounded and circle, use moz-rounded-border
  * as_html: treat "\n" in edge labels properly
  * as_svg: handle shape: invisible
  * as_svg: fix output for "shape: rounded;"
  * as_svg: fix general output to be valid
  * as_txt: output [ name ], not wrongly [ label ]
  * as_ascii: node size depends on label, not name
  * as_ascii: handle multiline labels correctly
  * as_ascii: avoid framebuffer underruns on certain layouts
  * added Graph::Simple::Cluster - list of relatively positioned nodes
  * Node  : added add_to_cluster(), origin(), cluster(), relpos(), place(),
	    dimensions()
  * Node  : allow label => 'label' to be passed to new()
  * Node  : move as_graphviz() to As_graphviz.pm
  * Node  : _correct_w() to _correct_size() and pass it the format name
	    (ascii, svg etc)
  * Simple: amended LIMITATIONS in pod
  * Simple: added output_format(), output(), cluster(), clusters(),
	    add_clusters()
  * Parser: support clusters and autosplit nodes like "[ A |  | B || C ]"
  * Parser: remove multiple spaces in node names to normalize them
  * Parser: fix parse_error() and add tests for that
  * Layout: make layouter more robust (better placement of nodes)
  * Layout: finally find paths with one bend properly
  * Layout: move pathfinding code to Graph::Simple::Layout::Scout
  * Layout: move path management code to Graph::Simple::Layout::Path
  * Layout: find path loops (from one node back to same node again)
  * Layout: find U-shaped paths
  * Edge  : add styles for EDGE_x_y (x = N/S, y = E/W)

2005-05-17 v0.16 Tels 426 tests - Make, make, make, make the invisible nodes...
  * forgot to include As_svg.pm
  * Simple.pm: Note other formats in NAME and SYNOPSIS sections
  * As_svg: small cleanups

2005-05-16 v0.15 Tels 422 tests - Make, make, make, make the invisible nodes...
  * load the As_*() modules on-demand
  * fixed NAME in As_graphviz
  * add basic support for node shapes
  * Node: add del_attribute(), as_svg(), title()
  * Parser: check attributes more closely
  * Parser: support [] for anonymous, invisible nodes
  * added Graph::Simple::Node::Anon
  * Graph: move code to prepare layout from as_ascii() to _prepare_layout()
    since it can be reused by as_svg()
  * as_html: deal better with empty graphs
  * as_graphviz: default node shape is rectangular
  * Node: successor/predecessor did corrupt nodes w/o a graph
  * Node: add _reset_id() for testsuite
  * require Graph 0.65

2005-04-11 v0.14 Tels 354 tests - Lay, lay, lay, lay out the edges...
  * add experimental graphviz output
  * require Graph 0.61

2005-02-12 v0.13 Tels 345 tests - Group, group, group, group the nodes...
  * shorten CSS considerable (especially for graphs with groups)
  * fix CSS for Opera/Firefox for vertical edges
  * fix node-borders for Firefox/Opera by inserting dummy cells at each row

2005-02-07 v0.12 Tels 345 tests - Group, group, group, group the nodes...
  * register groups with the graph when adding them
  * Parser: parse attributes on groups like: "( Group [ Node ] ) { ... }"
  * Parser: parse attributes on edges like: "[ 1 ] -> { ... } [ 2 ]"
  * Group: handle attribute "nodeclass" - put nodes into that class
  * Node: handle attribute "group" - puts node into that group
  * Node: query "node.class" from graph before trying just "node"
  * Node: convert literal "\n" in label/name to "<br>"
  * Layout: padd around all cells with filler cells (to make group backgrounds
    really work)
  * Layout: cleanup on group output
  * as_txt(): output attributes of a group
  * add Graph::Simple::Node::Cell, Graph::Simple::Group::Cell
  * moved Graph::Simple::Path to Graph::Simple::Edge::Cell
  * Graph: shorten HTML output by combining table cells with colspan=X
  * Graph: use CSS child selectors to shorten classnames (and remove
    class='fill' or class='' from output)
  * Graph: as_html(): fix IDs on labels, lines etc
  * Graph: fix layout code for edges with labels: no longer needs position:
    relative, allows better copy&paste and is not garbled on scrolling
  * syntax.pl: support custom template name
  * simplifiy and generalize t/simple.t
  * always run test files under -w
  * don't use warnings (for older perls)
  * remove needless routines in subclasses of "Node"
  * use Test::Differences if t/ascii.t fails

2005-01-31 v0.11 Tels 294 tests - Close, close, close, close the ugly holes...
  * Parser: add parsing of groups like in "( Groupname [ Node ] )"
  * Parser: fix for "[1] -> [2] -> [3] { ... }" to not lose attributes on 3 
  * Parser: can now handle "[1], [2], [3] -> [4]" correctly
  * Parser: cut out rendundant parsing code
  * Graph: add group(), add_group(), del_group(), groups()
  * Graph: fix css(): 'link', 'label' and 'title' do not need to appear in CSS
  * Graph: suppress default attributes from groups, too
  * Graph: close "holes" in "arrows" (edges) with line-height & letter-spacing
  * Graph: inherit background from page, no border as default
  * Graph: as_html() - remove trailing empty tags for shorter output
  * Node: add group(), groups(), add_to_groups()
  * Node: rename as_txt_node() to as_pure_txt(), document it
  * Node: add label() and the handling of the label-attribute
  * Node: support "label" as property in autolink/autotitle
  * Node: as_txt(): no need to quote ":" and " " in attribute values
  * Node: as_html(): quote " " in URLs
  * Move as_txt() to As_txt.pm to reduce code size
  * Group: keep nodes indexed by their name
  * Group: fix as_txt() to quote group name, and include nodes
  * Group: fix: add_nodes() did include the group itself by accident
  * include examples/base.css for output of syntax.pl
  * fix examples/syntax.tpl to have a non-scrolling menu
  * add command-line dirnames to syntax.pl
  * include t/fun/ - fun with graph-examples
  * added Graph::Simple::Path and refactored Edge code - an edge now only
    knows as_txt(); The other two, as_html() and as_ascii() are handled by
    Path.pm (for each element of the edge seperately)
  * more syntax examples

2005-01-24 v0.10 Tels 248 tests - Color, color, color, color the pretty graph...
  * added more stress/syntax tests
  * fix parser to not treat colors in attributes as comments (like in
    "color: #808080")
  * use a pre-compiled regexp to match edges (cut down code-duplication)
  * parser now handles successfully node chains like:
    [ Ulm ] -> [ Lahn ] -> [ Bonn ]
    -> [ Trier ]
    [ Stein ] -> [ Wahns ]
  * Simple.pm: fix edges() in list context to actually work
  * require Graph v0.55 (to be safe)
  * Node: add attributes_as_txt(), as_txt_node() to allow $graph->as_txt() to
    output node attributes only once
  * Graph: as_txt(): output node attributes only once
  * Graph: add set_attribute()
  * examples/syntax.pl: generate headlines from comments in input, add footer
  * Graph: support attributes: linkbase, autolink, autotitle, link, title
  * Graph: as_html(): output title attributes, as well as links

2005-01-12 v0.09 Tels 147 tests - Place, place, place, place the pesky nodes...
  * Layout: try to place node with only one predecessor around the predecessor
  * add a stress test with a star-shaped graph (5 nodes)
  * add a syntax test with newlines and one without any spaces
  * Parser: accumulate left-over fragments to parse examples broken by newlines
  * Parser: use compiled regexps for nodes, attributes etc
  * Parser: finally handle trailing attributes on nodes
  * Node: add set_attributes() for setting multiple ones at once
  * Node: setting attribute "class" will set subclass instead
  * add tests for parsing:
    [ node ] { attribute: value; }
    [ node ] { attribute: value; } -> [ node2] { attribute: value }
  * fix edges going to the left
  * tests for quoting in node names

2005-01-10 v0.08 Tels 133 tests - Fix, fix, fix, fix the stupid bugs...
  * grapher tries to place nodes without any incoming edges into first column
    (this fixes all the examples which have groups of not-connected nodes)
  * in HTML, use monospaced font for edges (prepare for box-art)
  * Layout: set error if layout stage fails
  * Edge: add EDGE_N_E, EDGE_N_W, EDGE_N_E_W etc for corner pieces
  * Edge: add clear_cells()
  * make _trace_path() more general by having _trace_straight_path() creating
    the edge types
  * Node: as_html(): no longer outputs 'style="border: none"' for class="edge"
  * Node: include attributes in as_txt() as well as classes (for subclasses)
  * Node: add class()
  * Graph: always register nodes/edges with the graph
  * Graph: as_txt() includes attributes (unless they are the defaults)
  * Node: postpone calculation of 'w' (called by as_ascii() from Graph)
  * add a stress test with a bend edge

2005-01-09 v0.07 Tels 124 tests
  * Parser: ignore empty lines
  * Parser: unquote all special chars, not only the first 
  * Node: quote node name in as_txt()
  * Parser: _parse_attributes();
  * Graph: added attribute(), set_attributes()
  * Graph: added id() to set/get a unique ID per graph
  * Graph: default ID is '', CSS code contains ID in class names
  * Parser: teach it to parse CSS and call $graph->set_attributes() 
  * Edge: output name in as_txt()
  * Layout: use strict, fix _trace_straight_path()
  * t/layout.t: add tests for _trace_straight_path()
  * Layout: simplify _trace_path() by using _trace_straight_path()
  * Layout: can trace straight edges occupying multiple cells

2005-01-08 v0.06 Tels 94 tests
  * fix version in Layout
  * Edge: add EDGE_START, EDGE_END, EDGE_HOR, EDGE_VER, EDGE_CROSS
  * Edge: add cell_type(), add_cell()
  * fix pod with "=end graph" (vs. "=end") sections
  * fix error message in t/ascii.t when reading file fails
  * fix parser: did not add edge if both nodes already existed
  * Layout: add _trace_straight_path() - trace a path horizontal/vertical
  * Layout: add _remove_path() - remove a traced path
  * tests: add t/layout.t, t/syntax/*
  * add examples/syntax.pl, examples/syntax.tpl to create automatic
    syntax test page for website
  * Parser: add reset() and call it from from_text()
  * Parser: handle quoted characters in node names
  * Parser: handle comments

2005-01-03 v0.05 Tels 87 tests
  * fix special paragraphs in pod to use =begin instead of =for
  * typos in pod
  * some more clarifications for LIMITATIONS
  * move the layout code to Graph::Simple::Layout
  * add a testcase with two not-connected node-pools in one graph
  * amend README, INSTALL

2005-01-03 v0.04 Tels 84 tests
  * change code to work with Graph 0.50
  * require Graph 0.50
  * added: Group.pm -- a group of nodes
  * added: examples/html.pl, examples/common.pl and TODO
  * tests: use strict;, add t/edge.t
  * Parser: document the different edge directions and styles
  * Parser: construct edges with the proper style
  * Parser: allow '..>' style
  * Node: 
    + document successorts()/predecessors(), as_txt(), as_html()
    + implement as_html($tag)
  * Graph:
    + _trace_path() can also trace short, straight paths upwards
    + as_txt() uses $edge->as_txt() to render edge
    + as_ascii() generates proper output for edges with the right style
    + as_ascii() no longer generates trailing whitespace on lines
    + add css(), as_html_page(), html_page_footer(), html_page_header()
    + extend documentation, fix typos, add list of limitations

Renamed to Graph::Simple:

2004-12-29 v0.03 Tels 52 tests
  * is a subclass of Graph::Directed, so add it as prereq again :o)
  * Graph::Layout::Simple::Parser - parse graph from text
  * Graph::Layout::Simple::Edge - an edge between two nodes
  * Graph: added node() -  find node by name
  * Graph: add quite some more documentation
  * Graph, Node: added as_txt()
  * Node: added incoming(), and track incoming edges from other nodes
  * added t/parser.t - test text parser
  * added t/ascii.t - parse various text files to ascii

2004-12-28 v0.02 Tels 20 tests
  * added a stack-based, backtracking layout routine, that stuffs nodes and
    paths between them into cells
  * Simple.pm: as_ascii: deal with cell-layout and convert this to ASCII
  * Simple.pm: add doc stub for METHODS
  * Simple.pm: add score(), as_XXX() do layout if it hasn't done before
  * Node.pm: revised code, and better parameter handling
  * no longer needs Graph::Directed or Graph::Layout::Aesthetic as prereq
  * added examples/ascii.pl
  * forgot to add graph.t to MANIFEST

2004-12-27 v0.01 Tels 18 tests
  * original version; created by h2xs 1.23 with options
    -A -X -n Graph::Layout::Simple -b 5.6.1 --skip-autoloader