-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathCHANGES
1959 lines (1884 loc) · 98.4 KB
/
CHANGES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Revision history for Graph::Easy (formerly known as Graph::Simple):
2010-07-01 v0.69 Shlomi Fish 2938 tests
* Add support for GraphViz subgraphs.
- Thanks to a patch by Yves Agostini ( http://www.crium.univ-metz.fr/ )
2010-06-28 v0.68 Shlomi Fish 2933 tests
* Add .*\.swp to the MANIFEST.SKIP in order to skip vim temporary files.
* Fixed the signature file.
- https://rt.cpan.org/Ticket/Display.html?id=58892
- Thanks to Andreas Koenig (ANDK).
2010-05-28 v0.67 Shlomi Fish 2933 tests
* Fix the as_vcg() vs. as_vcg_file() test that sometimes failed due
to timestamp offsets in both files.
- See: http://www.cpantesters.org/cpan/report/07338331-b19f-3f77-b713-d32bba55d77f
2010-05-23 v0.66 Shlomi Fish 2933 tests
* Removed the leftover .orig files by request of a Debian maintainer (by
private E-mail).
2010-05-23 v0.65 Shlomi Fish 2933 tests
* Partial fix to bug #27663
+ Fix the name of the function in the code excerpt of as_graphviz()
+ Mark as_graphviz() and as_graphviz() as for internal use.
+ Make sure to indicate that one needs to load Graph::Easy::As_graphviz
beforehand.
* Fix for https://rt.cpan.org/Ticket/Display.html?id=48657
+ Specify what the default timeout is in the POD of Graph::Easy.
+ Thanks to MTHURN for reporting it.
* Fix for https://rt.cpan.org/Ticket/Display.html?id=51820
+ Changed C<..> to C<< ... >>> for correct POD rendering.
* Applied patch from https://rt.cpan.org/Ticket/Display.html?id=57777
+ Spelling errors.
2008-08-10 v0.64 Tels 2933 tests
* fix bug #37534 - overwrites input without warning (Thanx C. Khan!)
* fix bug #37566 - Graphviz (v2.16) output broken (Thanx C. Khan!)
* fix bug #37842 - typo in README (Thanx Craig Sparks!)
* fix add_nodes(), would return instead of skipping existing nodes
* as_graphml:
+ fix #36533: GraphML end tag (Thanx Thiago M. Venancio!)
+ fix indent and endtag of groups (Thanx Thiago M. Venancio!)
+ properly escape special characters in group/graph names
+ add format => 'yED' to output as yED compatible (Thanx to
Thiago M. Venancio for requesting and testing this!)
* Groups:
+ nodes added to the group are also put into the same graph as the group
+ add_node('A') etc. (add with non-object) works now
+ add_node('A') returns node, not group
+ add_edge('A','B) and add_edge_once('A','B') work now
* Graph::Easy:
+ add compatibility methods to mimick the interface of Graph:
add_edges, add_cycle, add_path, add_vertices, add_vertex,
set_vertex_attribute, and has_edge
(Thanx to Matt Spear for requesting this!)
2008-05-22 v0.63 Tels 2895 tests
* require Perl v5.8.2 (it fails badly on 5.8.1; due to hash order?)
* add examples/wikicrawl.pl - thanx integral from forum.xkcd.com!
* Parser/Graphviz:
+ HTML-like attributes can also appear in lower-case
+ generate the base name for HTML-like nodes from the actual name,
this allows things like "11 [ label=<<..>> ]\n 11:e -> 1" to work
+ try to handle <font> tags inside HTML-like labels
* graph-easy:
+ change default timeout to 240 seconds
+ --version also prints Perl and Graph::Easy::As_svg versions
+ handle UTF-8 output when piping to graphviz renders
* Base:
+ fix main_class() (caused lost group attributes in graphviz output)
* Group:
+ class for inner cells is "group gi", not "groupgi"
+ adding a node to a group via add_node() or add_member() also sets
the "group" attribute on that node
+ add_nodes() correctly registers nodes with the group
* Node:
+ add get_raw_attribute() as alias for raw_attribute()
* Attributes: also accept "auto-title", "auto-link" and "auto-label"
* _class_styles: fix graph class attribute output for SVG
* Layout:
+ A*: when we can't find a path, warn and continue gracefully
+ A*: raise max. number of tries from 50_000 to 2_000_000
+ make Heap do binary search upon insert, instead of sort upon extract,
this makes complex layouts much faster because the A* algorithm does
no longer spent 90% of its time to manage the heap
+ streamline _astar_distance() to be 50% faster
* as_graphviz():
+ quote "name":"portname" for HTML-like nodes
+ properly output arrows on bidirectional edges that join/split
(aka no more arrow heads on the invisible helper node)
+ put invisible helper nodes for join/split edges into the subcluster
if both from/to are in the same cluster
+ fix output of spacer TDs in HTML-like labels for relative nodes
2008-03-30 v0.62 Tels 2813 tests
* graph-easy:
+ better error handling, now dies on errors in the input text
* added the following options to graph-easy:
+ --jpg, --ps, --bmp etc.: support a lot more formats for dot
+ --renderer: set the program to render PNG, JPG etc. output
(to change "dot" to "neato" etc.)
* Parser:
+ fix autosplitting nodes with "empty" parts like "| |"
(was also broken in DOT parsing as the same code was used)
+ don't remove spaces at front of lines to support "\n || B"
* Parser/Graphviz:
+ detect missing "}" at end of file
+ bail out if "digraph {" is found twice in the input
+ better parsing of attributes in scopes (inside "{" and "}")
+ support ".7" (no leading zero) in color notation
+ fix parsing of shape=record labels like "{A||B}"
* Parser/VCG (also for GDL):
+ "layout_segments" is actually "linear_segments"
+ support "status" attribute for subgraphs
+ support "textmode" attribute for nodes
+ support "orientation" attribute on graphs
+ support "invisible" on nodes
+ handle "colorentry 7: ..." (more than one space)
+ port_sharing, inport_sharing and outport_sharing => autojoin/autosplit
+ fix attribute remapping to go through custom filter
+ strip out \\f- (hor line), \\f01 (colors) for now until we can
support them for real
+ improve detection of multi-line labels
+ better support for node shapes
+ handle both "0x0c" (aka ^L) and \\f in input
* as_vcg()/as_gdl():
+ remap flow to orientation for graph flows
+ remap align to textmode
+ output class attributes for edges/nodes
+ support "invisible" nodes
* as_graphviz():
+ handle "align" attribute on nodes properly
* unify error handling for unknown attributes
* remove Build.PL support (updated Module::Build to 0.71)
2008-03-16 v0.61 Tels 2778 tests
* graph-easy:
+ reject unknown input format specifications
+ support --from_vcg and --from_gdl, too
* various POD fixes
* relax rules for custom attributes by also allowing digits anywhere
* fix bug #32206: Fix for as_vcg.t test failures when disk io is very slow
* fix bug #31958: Missing methods in Edge class
+ add as_ascii() (and simplify it)
+ add as_txt() stub (require Graph::Easy::As_txt and call _as_txt)
+ add nodes()
+ remove the to_nodes() and from_nodes() POD entries
* disallow border attributes on edges (it was ignored in all output formats)
* make it possible to call Graph::Easy->new('[A]->[B]');
* add:
+ $graph->copy() - clone the entire graph
+ get_custom_attributes()
+ merge_nodes() takes a third parameter: the string to join the label
of the second node to the label of the first node (thanx Brad Bowman!)
* Parser/Graphviz:
+ handle "border: 0"
+ handle graph attributes: maxiter, minquit and pagedir
+ handle edge attribute: weight
+ better parsing of attributes on HTML-like labels (no longer generates
bogus attribute names like "balign" and warns about unknown ones)
+ convert <BR/> in HTML-like labels to line breaks
+ re-connect edges between nodes with HTML-like labels to the generated
autosplit parts (formerly, these edges were simply lost)
* Parser/VGC:
+ attributes like "node.color:" are valid for all following nodes only
* as_graphviz():
+ suppress style and peripheries for borderwidth == 0
2007-11-19 v0.60 Tels 2700 tests
* Base:
+ prepend 'Warning: ' to warnings
* Graph::Easy:
+ add add_anon_node()
+ _class_styles(): allow extra class names in overlay (for SVG)
+ fix typo in SYNOPSIS (thanx skim!)
* Graph::Easy::Node:
+ set attributes for origin/offset properly, too, so that get_attribute()
works for these (Thanx Amanda B Hickman!)
+ allow numbers on custom attributes so "infoname1" in VCG works correctly
* Parser:
+ warn on nodes with offset, but no origin (Thanx Amanda B Hickman!)
* Parser/VCG:
+ allow "layoutalgorithm" (Thanx Sid Touati for the report!)
+ handle 'classname 1: "foo"' correctly (Thanx Sid Touati again!)
* Layout:
+ remove one call to ->attribute() per Node by re-using the shape
+ fix A* boundaries cache: create it if it doesn't exist yet, otherwise
edges went missing (see t/in/3_cache_bug.txt for an example)
* as_vcg:
+ output classname attributes correctly (Thanx Sid Touati!)
* as_graphviz:
+ remap "\c" to "\n" since graphviz doesn't know "\c"
* Tests:
+ fix test failures in t/graphml.t when second changes while comparing
as_graphml() and as_graphml_file() output
+ fix test failures with Pod-Coverage v0.19 - a few alias routines in
Graph::Easy::Node need to have POD replicated from Graph::Easy
+ require Pod-Coverage v0.19
2007-09-10 v0.59 Tels 2686 tests
* fix test failures in t/graphml.t (oops)
2007-09-09 v0.58 Tels 2686 tests
* add Graph/Easy/As_graphml.pm - output graph as GraphML text
* bin/graph-easy:
+ make "graph-easy --png input.txt output.png" work
+ fix POD structure for example outputs
+ expand section about conversion limits and problems
* Parser: speed up all parsers by:
+ making the regexp for empty/commented lines simpler and by combining
two regexps to replace/remove tabs and 0x0d into one tr// (~ 5%)
+ cache regexps needed for _parse_attributes() as these calls can be
expensive and occur frequently per graph (~ 10% for Graphviz)
* Parser/VCG:
+ about 3x as fast by swapping out the matchstack while we are in
matching multi-line labels. The speedup depends on how many lines
are in multi-line labels compared to the rest of the graph.
* Graph:
+ fix rename_node() to work with plain node names
* Graph::Easy and Graph::Easy::Group:
+ add: root_node(), type()
* Base:
+ add:
+ catch_messages(), catch_errors(), catch_warnings(), errors(), warnings()
* Layout:
+ add a stub for force-directed layouts (doesn't work yet)
+ fix bug #29039: hang in path-straighten code (Thanx mperilstein!)
(also fixes the hang reported in bug #27759)
* as_html:
+ fix undef warning in Graph/Easy.pm line 1038
2007-08-12 v0.57 Tels 2673 tests
* bin/graph-easy:
+ don't die on non-fatal parser errors (good for unknown dot attributes)
+ warn if both --as=txt and --as_foo or more than one --as_foo are given
+ add --stats option: output various statistics about the input graph
* Graph:
+ add rename_group()
+ rename_node() turns anon nodes into normal nodes (with a name)
* Graph/Group:
+ add a groups_within() method that returns recursively the contained
groups up to the specified level (-1 - infinite, 0 => level 0 etc.)
* Group:
+ fix add_group() when called with a scalar as group name
* Parser:
+ parse nested groups: "( Outer ( Inner [ A ] ) [ B ] )"
* Parser/VCG:
+ support for multi-line labels (Thanx Ohad Ben-Cohen for the testcase)
+ work around faulty inputs with unescaped double quotes in labels
(gconv, I am looking at you!) (Thanx Ohad Ben-Cohen for the testcase)
+ speed up parsing of large graphs by ca. 50% by simplifying regexps
+ add support for \fi065 (ISO-8859-1 characters)
+ support subgraphs (aka nested graphs)
* Parser/Graphviz:
+ speed up parsing of large graphs by ca. 45% by direct attribute lookup
* as_vcg:
+ generate classname attribute for edge classes if nec.
* Attributes:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ATTENTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
The attribute "pointstyle" has been redefined as to make it consistent
with "arrowshape" and "arrowstyle". The attribute "pointstyle" is now one
of "closed", or "filled" and the shape can be set with "pointshape" as
"diamond", "cross" etc.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ATTENTION !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* Misc:
+ fix SYNOPSIS (Thanx Donuvi Tanoga!)
2007-07-22 v0.56 Tels 2650 tests
* bin/graph-easy:
+ add --version
* Parser/VCG:
+ support more attributes, remap unknown/unsupported ones to "x-vcg-foo"
* Parser/Graphviz:
+ allow style="setlinewidth(0.1)" (fractions) in attributes
+ translate unknown or unsupported attributes into "x-dot-foo" style
* the following methods in Groups/Edges are only usefull during the layout
phase and are now internal and thus were renamed with an underscore
in front of them:
+ add_cell, del_cell, clear_cells, cells
* POD:
+ fix a few typos and duplicate some documentation into the
various POD files, as well as add some more doc
* Graph::Easy:
+ add add_nodes(), is_simple(), is_directed(), is_undirected(),
edges_within()
* Graph::Easy::Group:
+ fix add_nodes(), edges()
+ add edges_within(), has_as_predecessor(), has_as_successor()
* Graph::Easy::Node:
+ add has_as_predecessor(), has_as_successor()
* Misc:
+ save a bit memory by not setting default values for edges and nodes
* Attributes:
+ support "type" for graphs (directed or undirected)
+ support custom attributes named like "x-foo", "x-bar-baz", "x-f-o-o"
* as_graphviz:
+ use "--" for edges for undirected graphs
+ translate "x-dot-foo" attributes back to "foo", making it round-trip
* as_vcg:
+ translate "x-vcg-foo" attributes back to "foo", making it round-trip
+ first stab at attribute remapping
2007-05-05 v0.55 Tels 2433 tests
* bin/graph-easy:
+ as_png and as=png
+ add support for VCG/GDL
+ do not clobber output file if we cannot read input file
+ make --help work under older Pod::Usage versions
+ make "echo '[A]' | graph-easy" work while "graph-easy" outputs help
+ optimize startup to be about 10% faster if we don't have arguments
* add support for VCG/GDL (Parser/VCG)
* remove a few stray "use utf8;" in files with no high-bit bytes
(Thanx Juerd!)
* add rename_node()
* Attributes:
+ an unset attribute in a subclass will cause the attribute to be
looked up in the base class, and not just use blindly the default
attribute from the base class:
node { align: left; }
[ L ] { class: foo; } # L is be left-aligned and not center!
Due to the way CSS inheritance works and HTML+CSS is emitted, this
bug showed only up in as_ascii()
+ properly support \N, \E, \G, \T, and \H in labels, links and titles
+ support \L links and titles
* as_txt():
+ quote characters like '[' for autosplit nodes, too
+ remove spaces inside autosplit nodes to normalize their text output:
"[ Some || test | B ]" becomes "[ Some || test | B ]"
+ attributes for autosplit nodes were not properly output, especially
if they were something like "color|" or "red|blue"
* as_html():
+ fix undirected edges (unitialized warning and edges sticking too close
to the start node)
+ adjust alignment of the edge arrows by using more relative positioning
+ make the spacing of edges smaller, so they don't inflate node sizes
* as_graphviz():
+ fix fillcolor on nodes with shape plaintext
+ adjust the linewidth style to not be that overly huge
+ handle fill for nodes with subclasses correctly
* Parser:
+ support "\]" in node names like so: "[ char\[\] ]"
+ attributes ending in '|' like "color|;" on autosplit nodes were ignored
+ autosplit nodes with the attributes following on the next line had any
set basename attribute ignored (see t/in/4_bug_basename.txt)
* Parser/Graphviz:
+ a lone "node:port" did not result in "node" to be created
+ set the graph name as the default graph title
+ handle a semicolon after "}" for subgraphs and graphs
+ handle the variant "graph { A--B }"
+ support the "output" attribute (for the Mediawiki integration)
+ adjust for the changed linewidth styles
+ remove the replacement of \E, \N, \T, \H and \G now that Graph::Easy
knows these, too. Allows proper roundtrips of these escapes.
* as_html()/as_svg:
+ setting a colorscheme on the graph and some class color attribute to
the color "1" didn't result in the real color, but in "color: 1;" in
the generated CSS code
* Layouter:
+ fix endless loop in the bend-optimizer due to a swapped X and Y
2007-03-18 v0.54 Tels 2349 tests
* add some examples to bin/graph-easy
* fix borders on rounded/circle/ellipse nodes outside groups
* fix fill on edge class
* Parser/Graphviz:
+ handle multi-line comments inside attributes
* handle an unquoted/unescaped "]" inside (HTML-like) attributes
* handle an multi-line comment followed by space as the last part
* Attributes: add labelpos (top/bottom) for groups
* as_graphviz():
+ reinsert the labels on edges
2007-02-19 v0.53 Tels 2342 tests
* add --timeout=N to graph-easy and set the default to 120 seconds
* handle "\|" inside nodes properly: "[ A \| B | C ]" works now
* add MANIFEST.SKIP to enable "make manifest"
* remove todos/
* add attribute "comment" for graphs, edges, nodes and groups
* add support for hsv() and hsl() colors
* add support for transparency (alpha channel) in colors
* colors are stored as input (but normalized), fixes the problem that
hsv() colors in graphviz were converted to RGB and thus lost precision
* add attribute "arrowshape" for edges, allowing triangle, dot, box, line,
inv, cross, x and diamond shaped arrows
* Base: setting a new subclass did not invalidate the cache
* as_html:
+ use again "position: relative" to shift arrows to the proper place
(needs to be done for for most edge parts, tho)
+ implement a few more missing edge pieces
* parser/Graphviz:
+ groups have slightly different defaults in DOT, so set these: (Thanx
Michael Goldshteyn!)
+ transparent background
+ center aligned label
* as_graphviz:
+ don't generate needless label attributes
+ compound=true is the default, so we can omit it
+ do not needless quote "#" characters
+ handle fractional fontsizes better, and do not output wrongly "11px"
+ output correct "labeljust" for groups (Thanx Michael Goldshteyn!)
+ HSV colors are now preserved (formerly they were converted to RGB)
+ the alpha channel on colors is no preserved if possible
* as_html/as_box_art:
+ use LOGICAL AND and LOGICAL OR for open up/down arrows
+ replace open arrows with nicer looking Unicode chars
+ nodes with shape circle, rounded or ellipse are now rendered correctly
when having a different background color (or when inside a group)
+ don't generate labels for nodes with empty labels (like anon nodes)
+ default fill is white, so set it in CSS for pages with some backdrop
* Graph::Easy objects are now about 4K smaller (min. size was 6.5K on 64bit)
2007-01-28 v0.52 Tels 2305 tests
* format INSTALL in POD and add notes about Windows
* Group::Cell: cache attributes to avoid overly many attribute() calls
* attribute(): do not call class() unless neccessary
* Layouter:
+ cache the boundaries of the cells array for A*, avoid excessive
recalculaion of the used area (make big layouts about 30% faster)
+ fix _optimize_layout() for reversed edges, that finally fixes the
garbled HTML output
* as_html():
+ "vertical-align: center" must be "vertical-align: middle" - argh!
+ better alignment of arrows on some edge/end pieces
+ insert missing style="..." in all edge pieces (fixes missing group
backgrounds on some edge cells)
* remove dead code in Graph::Easy::Node::Empty
2007-01-05 v0.51 Tels 2305 tests
* bin/graph-easy: add --parse option
* Parser:
+ fix bug #24133: empty groups were wrongly put on the group stack,
thus aquiring some of the following nodes (Thanx to Paul Biggar!)
+ allow class selector ".foo { ... }" - set attributes on all objects
(edges/nodes/groups) of subclass "foo"
+ allow lists of class selectors like ".foo, node.bar, group { ... }"
* as_html:
+ fix joint W_N_S (Thanx Florian Lindner!)
* as_graphviz:
+ fix wrong output of group fill colors and style (Thanx Paul Biggar!)
+ workaround the inability of DOT to have attributes for all subclusters
* attributes:
+ setting the attribute "class" on a primary class puts all objects
without a specifically set class attributes into that class, so:
node { class: red; } node.red { color: green; }
colors all nodes without a specific subclass red.
2006-12-17 v0.50 Tels 2273 tests
* added bin/graph-easy and make the build process install it into the system
This adds the ability to simple run "graph-easy" from anywhere
* attributes:
+ textwrap: the default is inherit, to make setting it on a graph work
+ allow "textwrap: N;" to wrap text automatically at N characters
* Base:
+ add error_as_html() - return error message as escaped HTML
* Group:
+ add add_nodes() - add multiple nodes to the group
* Graph:
+ add flip_edges($A,$B); - transpose all edges going from A to B
+ add flow() - return the flow of the graph in degrees
* Node:
+ edges() returns all the edges at that node; fix doc for it
+ rename grow() to _grow() to make clear it is a private method
* Edge:
+ add edge_flow() - return flow of this edge
* modifying an edge via the following methods did not invalidate the layout:
+ flip(), bidirectional(), undirected(), start_at(), end_at()
* add a dummy shape() method for groups and group cells
* as_graphviz():
+ don't output autolabel, rows, columns or group attributes
* as_html():
+ output linebreaks as simple "<br>"
+ support for textwrap: 10;
* as_ascii():
+ write our own text wrap routine to replace the buggy Text::Wrap
+ rewrote the border-collapse algorithm, as well as the logic to determine
if we need to draw a border. This makes nodes next to each other (like
via autosplit, or with origin/offset) work even when their borders are
different (like none/solid, dotted/solid etc). (Thanx Nick Jenkins!)
* Layouter:
+ Rewrite the rank assigning code:
+ for cycles in the graph, the rank assignment code did sort the nodes
alphabetically and put the node with the "lowest" in the first rank.
Now it uses the order in which the nodes were defined, thus this:
[ B ] -> [ C ] --> [ A ] --> [ B ]
starts now the layout with "B", instead of "A", as humans expect it.
+ use a heap instead of ARRAY, so does less work but is more correct
+ correctly assign user ranks and automatic ranks to nodes
+ the layouter keeps track of where it placed the first node of a rank,
and then places nodes with the same user-set rank in the same column/row
+ on nodes with more than one edge leading out, where one of the edges
has a flow, stop the chain tracking there. This prevents the non-flow
edge to be laid out first if its chain is longer than the flow-edge,
and thus prevents the non-flow edge from blocking the flow-edge.
+ self-loops were not tried in the right order, unless the flow at the
node was east (Thanx Stéphane Bortzmeyer!)
+ A*: don't put edge labels on EDGE_CROSS cells as they aren't rendered
there (Thanx Stéphane Bortzmeyer!)
+ sink-nodes (no outgoing edges) get bigger so that there front side
is empty, preventing edges going "around" to the front side of the node
+ paths generated by A* have a tendency to in-ward bends, these are now
removed and replaced by a simple corner, if possible
* Parser:
+ improve robustness for alternate line endings (\x0d\x0a vs \x0a)
+ a space in front of classes (" name { color: red; }") caused an error
(Thanx David R. Throop!)
+ allow escaped ";" in attributes as in "{ label: \;\;; }"
+ accidentily allowed "[a]--test -->[b]" (no space before edge label)
+ properly handle non-string attributes like "[A|B] { shape: node|;}"
* Parser/Graphviz:
+ support "setlinewidth(..)" in style attribute for nodes
+ handle the following color forms correctly:
+ hexadecimal RGB colors with spaces (like "#AA BB CC")
+ HSV() colors ("1.0 1.0 1.0" and "0.0, 0.0, 1.0")
+ colorschemes ("//red" and "/x11/red")
+ first stab at parsing HTML-like labels
+ support for "labeljust" on subgraphs
* set binmode(STDERR,'utf8') when in debug mode
* Group: include a modified add_group() to make nested groups work properly
* add attribute "group" for groups
* make $self->attribute('group') work on nodes and groups
2006-10-29 v0.49 Tels 2182 tests
* fixed Synopsis
* add more modules to t/pod_cov.t and t/pod.t
* speedup loading: remove _u8() kludge, use utf8 in As_ascii.pm
* Node: added get_attribute() as alias for attribute()
* Completely rework the attributes code:
+ attribute() now always returns the default value, and respects
inheritance for values that are "inherit". Instead of a hard-coded
attribute list, we now simple use 'inherit' for default values.
+ 'inherit' is a valid colorscheme and edges, (anon) groups, and (anon)
nodes have "inherit" as default colorscheme
+ add "autosplit" and "autojoin" for edges
+ accept all attributes with a "-" in their name also without the "-"
(fontcolor, textwrap etc. are now valid inputs)
+ make default_attribute() work, even when the object is not in a graph
+ default_attribute() uses the info in $attributes to avoid double data
+ add attributes "root" and "rank" for groups
+ del_attribute() now works for virtual attributes like 'border' or 'size'
+ add: raw_attribute(), raw_attributes(), get_attributes()
* Graph: del_node() didn't deregister a child node from parent
* support \; and \' (f.i. to escape single quotes if you want a label "''")
* Start working towards a recursive layouter:
+ separate layout() into layout() (for graph only) and _layout()
+ call edges_into_groups() before layout
+ Group: store cells in {_cells} to avoid clash with {cells} from layout
+ Group: in _layout() set {debug} for groups from parent graph {debug}
* Parser:
+ make magic detection of Graphviz input much more robust
+ parsing failed silently when there was only one invalid line of input
+ fix parsing of empty groups and/or anonymous groups
+ sort attributes before checking them to make tests more predictable
* Parser/Graphviz:
+ a new scope start followed by a non-node (f.i. attributes) crashed
the parser. See t/in/dot/5_scope_atr.dot for an example.
+ recognize (n|ne|e|se|s|sw|w|nw) as compass directions after nodes/ports
+ recognize numbers as node names (like 0.11, 1.0, 0., 1., etc)
+ the ID in "graph ID { }" is optional
+ properly remap headport/tailport for edges
+ make comment parsing more robust, especially against multiple multiline
comments or multiline comments without spaces around them
+ recognize "setlinewidth(..)" for edge styles
* as_txt():
+ don't insert superflous newline for empty groups
+ properly output anonymous and empty groups
+ output all attribute names w/o the "-", i.e. "fontsize: 80%;"
* as_html():
+ properly quote "<", ">" and "&" in labels
+ values of "inherit" work now, even when just set on a class/subclass
* as_graphviz():
+ output nodes inside groups in sorted order to make tests more predictable
+ add tests for proper colorscheme support
* attribute "autolabel":
+ allow and prefer/doc to use just "N" for specifying the length
+ use "…" (ellipse) instead of just three dots (except in as_ascii)
+ allow up to 99999 characters (was 9999)
+ change doc to reflect that a set label will be shortened, too
2006-09-13 v0.48 Tels 2020 tests
* Parser/Graphviz:
+ handle attribute "URL" (opposed to "url")
+ handle attribute "href" for graph/node/subgraph, too
+ accept "\N" in titles and urls, too
+ accept "\E" for edges, too (\E is replaced by "Bonn->Berlin" f.i.)
+ accept "\G", "\T", "\H" in labels/urls/titles, too
+ parse HTML entities like & in names/labels/titles/urls
+ fix comment parsing, things like "http://example.com" didn't work
* Layout/Repair:
+ fixup the code that inserts edge pieces
+ fixup the code that combines long HOR/VER edges in case the edge goes
bottom-to-top or right-to-left (the code only expected the other dir)
+ repair JOINT_E_N_S followed by an edge on the right/bottom side properly
* Edge:
+ fix add_cell() to add a cell _after_ a given cell, not before
(this fixes those horrible messed up HTML layouts, esp. involving
groups - Thanx to Florian Lindner for testcases and bugging me! :)
* as_html:
+ implemented edge type 1031 (joint south to east/west, starting west)
+ CSS class names like "node-group" must be "node_group" to fully work
(fixes class-attributes on anon nodes etc. not showing up)
+ fix output of group labels on groups parsed from Graphviz
* as_ascii:
+ render anon nodes, too, since they might have class attributes making
them visible (fixed t/in/4_node_edge.txt among others)
* as_graphviz:
+ fix rendering of anon nodes (setlinewidth(0) doesn't work, so use
style=filled and a color that equals the node background)
+ don't output spurious "flow" for nodes
+ the code to supress edge labels on helper edges was broken
2006-09-03 v0.47 Tels 2013 tests
* Edge: add end_at(), the opposite of start_at()
* add node shape 'edge' - render node as a horizontal edge piece
* add node attribute 'rank' - 'auto', 'same' or positive number
* multiple spaces in edge labels were not collapsed together
* class names are case-insentive like in CSS, so we lowercase them on input:
+ as_txt() renders them now unified as lowercase, always
+ "node.SECOND { label: B; } [ A ] { class: Second; }" works now
* as_txt(): edges going to/starting at the first part of an autosplit node
are now correctly output: "[A|B] [ AB.0 ] -> [ T ]" now works.
* as_html(): arrow-style: filled; did not replace all "v" and "^" arrows
* Layouter:
+ handle _trace_path() called with unplaced src node
+ adding group cells makes it nec. to adjust size of multicelled nodes
+ holes torn after splicing-in group cells where not closed when one
of the adjacent edge cells was of type EDGE_CROSS
* Parser:
+ make detection of Graphviz code more robust against commented out text
* Parser/Graphviz:
+ a scope end did not properly pop the group_stack, resulting
in nodes getting in the wrong group. t/in/dot/6_2_cluster.dot now
parses and renders correctly.
+ "The keywords 'node', 'edge', 'graph', 'digraph', 'subgraph', and
'strict' are case-independent." So we accept that them way.
+ handle the case of "strict digraph G { a -> b }" properly
+ edge [ label=foo ] sets these attributes on edges, not nodes
+ handle "style=dotted" for nodes (as well as "dashed")
+ a "node [ style=invis ]" followed by "node [ style=filled ]" did
not set following nodes to a visible shape
+ properly remap:
"arrowhead", "labeljust", "orientation"
+ handle label="\N" for nodes
+ the default arrow style is "filled"
+ attribute values with a "|" inside them got wrongly split
+ attribute values with ']' inside quoted strings like label="[P]" fixed
+ implement parsing records of the form "<p1> A | <p2> B | C">
+ "Bonn":"f1" now creates a node "Bonn", not "Bonn:f1", nor does it fail
+ all boolean attributes are now recognized when appearing without a value
+ handle string concatenation ("foo" + "" + "bar")
+ handle line continuation (a '\' as last character on line)
2006-08-13 v0.46 Tels 1943 tests
* Output:
+ add as_debug() and "output: debug"
* Layouter:
+ fix layout with loops where the root node is part of the loop
(see t/in/6_split_join_loop.txt for an example)
+ fix warning about uninitialized in Chain.pm line 423
* Parser:
+ '\[', '\{', '\>' etc inside an edge label work now:
[ A ] -- \[ A \ ] \<\> --> [ B ]
+ use _unquote() in more places instead of duplicated code
+ allow rgb(10%,0,0.5) for colors, e.g. fractions and mixes
+ allow \" in attributes ala 'label: "\"hello\"";'
+ a comment inside attributes caused the parsing to fail:
{
color: 3; # this didn't work
}
* Parser/Graphviz handles the following:
+ "root" on a graph
+ "graph G { init -- _run }" (graph vs digraph, \w+ as node)
+ funky node names: node_0, Köln, "node" etc
+ "subgraph G { .. }"
+ scopes as in "{ node [ color=red ] Bonn -> Berlin }"
+ node list as in "{ a b c } -> u; i -> { j k l }"
+ digraph/subgraph attributes: "subgraph G { style=filled; }"
+ node attribute 'label' no longer crashes the parser
+ attributes without a value ("center truecolor")
+ attributes w/ or w/o ";" at end, w/ or w/o "quotes"
+ "subgraph test { } abc -- test" shouldn't add a spurious node "test"
+ per default, the color scheme is x11 and the graph flows south
+ "a1 -> a2\na2 -> a3" (no ";" at end of line and no spaces in between)
+ undirected edges
+ /* * style * / comments almost everywhere
* Parser/Graphviz maps/handles/ignores now the following attributes:
+ nodes: shape, peripheries, z
+ graph: ratio, labelloc
+ edge: f, group, style
+ all: style, fontsize, color ("0.99 0.8 0.24", #ff00ff00 etc)
* as_graphviz():
+ output "rank=0" for root node
+ fix output of headport/tailport for start/end attribute
+ fix the creation of "invisible" joints to joining/splitting edges:
+ created helper nodes no longer conflict with existing node names
+ works for joints as well as splits
+ suppress arrow heads leading to joint
+ works in both east and west direction (aka with flipped edges)
+ start/end: left; (aka relative starting/end side) results in correct
tail/headport attribute, too
* as_ascii():
+ fix rendering of graph labels at bottom
+ graph labels wider than the graph make output bigger and work now
* Attributes:
+ support for different color schemes
+ add X11 and ColorBrewer color definitions
+ add attribute 'colorscheme' for all classes
+ colors are now stored internally as they were written in the input
* License: include apache-style license for Brewer color schemes
* Misc: fatal errors produce a stack backtrace only under debug
* Node: further fixes flow(): properly cache the return value, reduce C&P
2006-07-23 v0.45 Tels 1811 tests
* we dont need inc/Module/AutoInstall.pm (this dist has no dependencies)
* require at least Perl 5.8.1 for proper Unicode support
* add a Build.PL file
* fix bug with shared edges and joints (Thanx Florian Lindner!)
* fix reparing of edge joints that are next to a node inside a group
* add attribute 'root' for graphs
* Layouter: if given root node, start there
* fix "no_index" in Makefile.PL to not include spurious "directory"'s
* Node: fix flow()
* as_ascii: fix corners with start/end pieces (add spacing, to make
consistent with all other start/end pieces)
* as_boxart: fix rendering of corner pieces (especially for joints)
* as_html: render invisible edges truly invisible
* adding a node with the name '0' and retrieving it via node('0') works now
* Parser/Graphviz:
+ 'Bonn' is a valid node name, too ([A-Z][a-z]+)
+ handle /* style comments */
2006-04-17 v0.44 Tels 1801 tests
* new/changed attribute:
+ add 'group' for nodes
+ only allow /[a-z][a-z0-9_]+/i for classnames as documented
* Base: warn() uses Carp::carp instead of plain warn()
* we no longer need Heap: we have our own el-cheapo Heap class. And it is
faster, too, todos/big.txt takes 3.6s vs. 4.2s with v0.43 and Heap::Binary
* Layouter fixes:
+ a short vertical edge starting from a multicell node was rendered as
horizontal instead
+ an edge sharing an end point with another was generated incorrectly if
(one of) the other edge(s) was running alongside the starting node (e.g.
where we could immidiately create a joint and be done)
+ likewise for edges splitting up, if a shared edge runs alongside a node,
then a joint will be created there immidiately
+ fix bidirectional edges with a joint as start piece
+ Don't warn on edges with no cells (on joints, under debug) about being
unable to find path
+ improve placement for nodes where their edges share an end point
+ improve placement of nodes for shared edges with labels
* cleaned up the POD a bit and added a few remarks and notes
* as_ascii:
+ deal with invisible edges at cross sections
* as_html:
+ implement joint types with start or end points
* fix the repair code that handles edges inside groups:
+ repairs more cases
+ is faster by reversing the checks and using grep
+ cut down on copy&paste code
* Edge/Cell: fix arrow_count() for undirected and bidirectional edges
* Easy.pm:
+ fix bug in class_styles() ignoring base class name for multiple
classes, affected SVG output
* Parser/Graphviz:
+ relax parsing of node names (G, GROOVY etc are valid w/o quotes)
+ allow "graph [ ... ];" (semicolon after attribute section)
+ remap attributes: graph: rankdir; edge: minlen, dir
2006-03-19 v0.43 Tels 1755 tests
* add attributes:
+ text-wrap: 'auto': auto wrap label, 'none' is the default
+ id: unique identifier for each object (usefull for animation later on)
+ font: comma-separated list of font family names/generic names
+ format: 'none' (no special processing, default) or 'pod' (enables inline
text formatting ala B<bold>, I<italic> etc)
* Node.pm: avoid autovivify of ->{edge} in background() and use ->{group}
* Edge/Cell.pm: set {group} to edge's group to make things easier
* Layout/Path.pm: add some pods for the internal routines
* add more .pm files to t/pod_cov.t and t/pod.t
* it wasn't possible to set an edge label via a class or subclass:
edge { label: yes; }
edge.no { label: no; }
[ A ] --> [ B ] --> { class: no; } [ C ]
* as_html:
+ table cells inherit some attributes like "color" from the table, this
caused all labels to be the same color as the graph if you set a color
there:
graph { color: red; } ( Cities: [ Bonn ] -- train --> [ Berlin ] )
Likewise for fill, align, font, font-size etc. These are all fixed and
tests make sure that this doesn't happen again.
+ fix CSS
+ "vertical-align: center;" has to be "vertical-align: middle;"
+ don't output bogus "flow" attributes
+ don't output spurious edge class "ha"
+ merge classes "ve" and "el" into "el"
+ draw arrows on short hor edges closer to the line
+ graph and edge labels need to use _label_as_html() to properly
quote "<",">" and "&" as well as have support for \n,\r,\c and \l
+ fill and background color for graphs were swapped
+ do not combine table cells if the returned cell code contains two
successive cells
+ fix EDGE_S_E + EDGE_START_S
* as_graphviz:
+ add support for edge styles "double" and "double-dash" by emitting
"color:color" for the edge
* Edge.pm:
+ add flip() - swap from/to for this edge
+ remove dead code in flow() and fix POD for it
* Layouter:
+ added a post-layout optimizer
+ compact edges by combining VER or HOR edge cells into one cell
(fixes overly long edge labels stretching the layout)
+ add a method to grow multiple column/row sizes to accomodate
a nec. multi-column cell (node/edge), this creates more compact
layouts with multi-cell objects in them.
+ repairing edges after splicing in groups did not account for joints,
the joint and the next piece might not belong to the same edge.
Thanx to Florian Lindner for a testcase.
+ Edge.pm: port() did falsely return ("east","0") for "east" instead of
(undef,undef), causing edges with "start: east" to get wrongly split up
* Parser:
+ refactor code to allow easier subclassing
+ require and use Parser::Graphviz on detection of graphviz code
+ allow quoted attributes that contain ";" like: 'label: "bar;baz";'
* Attributes:
+ clarify rules when to quote, escape and encode
+ only decode %xx for xx between 0x20 and 0x7e (to stop exploits)
* add Graph::Easy::Parser::Graphviz - parse graphviz text and convert it
2006-02-21 v0.42 Tels 1674 tests
* add the missing testfiles to MANIFEST
* add a few examples to the doc
* remove the static classes "l" (a) and "i" (img) - these can be styled
by CSS selectors, so there is no need for them.
* as_html:
+ use unicode chars for filled/closed arrow heads
+ fix garbled class names on undirected edges (caused by removing "v")
+ fix output of default left-aligned group labels and add test for that
+ output "<br \>" instead of "\n <br \>", because due to
"whitespace: nowrap;" this did insert spurious spaces before each line
break, throwing center-aligned labels off-center.
* as_graphviz:
+ output correct minlen
* Parser:
+ Reverse the removing of trailing/leading "|" in autosplit nodes,
introduced in v0.34.
[|G|] is " ", "G", " ", and not just "G". The unconditional removal
of leading/trailing empty parts meant you could never have an empty
trailing part, ever. Fixes also the regression from todos/hash.txt
no longer working. Adjust doc to reflect this change.
+ add more tests for trailing/leading empty parts.
* Layout.pm:
+ typo: {_chain} vs. {chain} (Thanx Jim Cromie)
+ don't use alarm when under the debugger (Thanx Jim Cromie)
2006-02-05 v0.41 Tels 1670 tests
* use Module::Install and bundle it in inc/
* add "point-style: invisible" for very small, invisible nodes - nodes with
"shape: invisible;" will still have a minimum size.
* add support for '\l', '\r' and '\c' as line breaks to align individual
label lines left, right or center
* as_ascii:
+ support proper alignment on edge labels
* as_graphviz():
+ fix invisible nodes to not show their label
+ add support for nodes with "shape: point;"
* t/graphviz.t: reduce the number of unnec. calls to as_graphviz()
* as_html():
+ use white-space: nowrap; (not "pre")
+ add support for \l, \r, \c and don't include text-align twice
* Node:
+ remove the unused and undocumented "noquote" param from as_html()
* Graph:
+ add: add_edge_once(): add an edge from A to B only once
(Thanx to Florian Lindner for the suggestion!)
2006-01-29 v0.40 Tels 1652 tests
* add attribute:
+ "invisible" as edge style
+ "minlen" - for edges (minimum distance in cells)
+ "align" - alignment for graph, group, edge and node labels
* General:
+ fix Makefile.PL to work with newer YAML
+ avoid duplicate code when dealing with labels and dimensions
+ empty attribute-parts on autosplit nodes work now:
[ A|B ] { class: |legend; }
will put B into class 'legend' and leave the class of A alone
[ A|B ] { class: legend|; }
will put A into class 'legend' and leave the class of B alone
[ A|B ] { class: legend; }
will put A *and* B into class 'legend'
+ _class_styles(): use correct indent instead of hard-coded ' '
* Edge:
* start_port()/end_port(): + remove spaces to normalize result
+ return list in list context
* Node:
+ add nodes_sharing_end(), is_anon()
+ remove place() from public API (is now _do_place())
+ allow spaces in set_attribute('size', '9 , 8')
* Node::Cell:
+ add a group() method to make things like $cell->group() easier
* Group:
+ is also a Graph::Easy, to inherit from it (for nesting)
+ find right-most cell for label if "align: right"
+ rename find_label_cell() to _find_label_cell() (is internal use only)
* Graph:
+ add use_class(), and use it instead of hard-coded class names
+ due to bad caching, one couldn't set the node size as class-attribute
+ weaken() is costly and O(N), so avoid it whenever possible.
Graph creation and destroy are now O(1) again. Creating a graph with
N nodes and N-1 edges takes (bench/stress.pl):
N 0.39 0.39 | 0.40 0.40
Create Destroy | Create Destroy
----------------------------|------------------------
4000 0.35 0.23 | 0.31 0.12
8000 0.77 0.68 | 0.61 0.21
16000 1.91 2.26 | 1.19 0.48
32000 9.32 8.02 | 2.32 0.78
* Parser:
+ add use_class() to use user-provided classes for generated objects
+ referencing an (empty) part of an autosplit node before the autosplit
node itself would create wrongly a stray node
+ simplify group code ($graph->add_group() does everything nec. already)
+ store labels for autosplit nodes not in the label attribute, but
seperately. This fixes the problem that you couldn't put a node
(resulting from an autosplit) into a class and set a label on the
class - the node would always show the part name as label. In addition
that fixes the long-standing bug that as_txt() would output stray labels
for autosplit nodes.
+ parts in an autosplit node are relative to their preceding part, not
to the first part. This enables setting columns/rows/size on parts
and the other parts will flow/adjust properly.
+ set the basename property on the first part in an autosplit node,
enabling proper as_txt() output of it.
* Layouter:
+ implement the same spacing rules between nodes for end points as
0.39 did for start points: edges joining up to a node work now
+ only use 3 cells space when there are more than one node sharing
the same port (was "more than zero")
+ fix a problem when placing nodes without an edge object resulting in
a crash
+ repair edges outside of groups, as well as edges that end at a corner
+ multi-celled nodes in spliced layouts (e.g. with group fillers)
did not preserve their filler-cells correctly
* as_txt():
+ clean up nodes after output so that a following as_graphviz() does work
* as_graphviz():
+ fix links involving groups: lhead/ltail were swapped
+ generate shorter invisible node names ("A,south,0" vs "A,south,0,0")
+ do not create invisible joint-nodes when there is only one edge sharing
the start/end port
+ make "shape: rounded" work (needs "style=rounded,...")
+ support label alignments on groups
* as_ascii():
+ round corners for shape: rounded (using ' ', instead
of using unicode characters by accident)
+ support for aligned labels (left|right|center)
* as_boxart(): round corners for bold/wide/broad etc using spaces
* as_html():
+ make space below edges smaller, to create more compact layout
+ a color on a group was ignored, resulting always in black group labels
+ finally align the vertical arrows with the edge lines. In Opera 8.5
under Linux the "v" now gets cut off, but this seems a browser bug.
Sorry, some of the Opera users!
+ support label alignments (center|left|right)
+ when a class attribute specified the font-size, don't include it at
at the td (node|edge|caption etc) again
+ edge { arrow-style: none; } did not remove the arrows from edges
+ group cells need ' ' for IE to show the border - I hate IE bugs :-(
* error() is now fatal by calling _croak() - no longer do errors in
attributes go undetected and cause havoc later on. You can use
$object->no_fatal_errors() (on any object) to supress this.
2006-01-08 v0.39 Tels 1603 tests
* Graph: fix merge_nodes() to delete node B from group if part of one
* fix Group:
+ del_edge(): delete edge on id, not non-existant name
+ del_node() & del_member(): drop all edges mentioning the node
+ optimize edges() and nodes() in scalar context
* Graph: improve handling of "|" in attributes (especially labels)
* Graph: del_node() and del_edge() also remove these from their group
* Edge:
+ add start_at(), start_port(), end_port()
+ fix POD start
* Node: add nodes_sharing_start(), shared_edges(), has_predecessors()
* add source_nodes() and predecessorless_nodes() (Thanx to Florian Lindner
for the suggestion!)
* as_html(): add "white-space: pre" to the CSS to prevent wrapping of
labels with spaces in them
* as_graphviz():
+ implement edge joints (shared start/end port) via invisible joints
+ handle attributes like labels with embedded newlines
+ output edges from/to groups (subgraphs/clusters)
* Layouter:
+ allow sharing of end ports (making edges join up on the way
to the target node)
+ min distance between node is 3, not 2, when there are edges
that share a start point (to make room for the joints)
+ Layouter: place nodes with a shared start point in the same column/row