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
|
Graph-Easy
==========
See Graph::Easy under LIMITATIONS for some hot topics. In addition:
Important short-term TODO:
* sort_sub is no longer used in Heap, but the Layouter uses it (find out why)
* add for edges:
+ weight,
+ taillabel, taillink, tailtitle, headlabel, headlink, headtitle
(or should these be startlabel, endlabel etc.?)
+ a method to set the direction to bidirectional/undirected
* graphviz parsing roundtrip:
+ anon nodes lose their " " label
+ border-width is wrongly dropped
+ t/in/dot/9_edge_styles.dot is wrong
+ nodes with HTML-like labels lose their outer shape (the label itself
can have a border on the TABLE, as well as the node outside
as well as the individual TD elements)
* Combining table cells goes wrong if there is a "hole" in a row
of cells. We need to gather them with their coordinates and only
combine cells that are next to each other.
* setting "size" as class attribute doesn't work
* setting "offset: -2,0;" causes problems for multi-row nodes because
the offset is taken into effect before growing the node
* [ a ] { label: a; } - remove the superflous label upon parsing
* VCG/GDL
+ debug, finish the attribute remapping and add more test cases
+ implement support for \fn \fb \fI \fu \fB (bold underline etc.)
+ implement support for \f03 (colors)
+ implement support for \f- (hor line)
+ implement full color-remapping support (in both directions)
+ support subgraphs
+ support regions
+ support "nearedges:no"
+ generally handle all attribute names without "_", too
+ add support for "anchor"
+ GDL has portsharing only as attributes for the top graph, while
in Graph::Easy this attribute can be set for each edge
* layouter:
+ head/tail label/title and link are currently ignored
+ implement autosplit and autojoin for edges
+ don't build chains across groups
+ route multiple edges to/from a node in the proper order (shortest first)
+ edges without a specific start/end port should not block ports that
are reserved for edges with a start/end port number
+ placing a node with an origin/offset inside another node results in
endless loops as this condition is not checked and the placement
of the grandparent node will thus always fail
+ last-resort placing of node should first try to place it more near
to where the edge(s) are connected
+ allow end/start without specifying a side: "[ A ]--> { end: 0; } [ B ]"
+ t/in/5_joint.txt - the rendering order is C,A,B, so that the edge
from A to Z comes before B to Z. And since the layouter "knows" it
should not block the last port on B, it makes a bend. In this case, tho,
it could just go along B, because the edges join each other anyway.
+ handle the special case where a node relative to another belongs to
a different group than the parent/child
Recursive layouter:
+ an empty group should consist of one cell (with the label and border)
+ lay out all groups first, then interlink them together
* as_graphviz():
+ links to/from empty groups fail
+ attributes should be always checked against the default attribute and
output if necessary, to make setting attributes in classes work -
currently doing edge { color: blue; } will be ignored
+ finish HTML-like labels (esp. with borders)
These things seem to be actually not possible in Graphviz:
+ border-styles: wave, dot-dot-dash and dot-dash
+ edge-styles: wave, dot-dot-dash and dot-dash
+ text-styles: underline, overline, strike-through, italic and bold
* Parser/Graphviz:
+ see also the section CAVEATS in Graph::Easy::Parser::Graphviz
+ style=filled should result in color => fillcolor, not color => fontcolor
+ parse input in Latin1 charset
+ parse "A|{ B|C }" (record shape with hor/ver nesting)
+ nodes with shape record, but an edge going from the aggregate node have
the edges rendered in dot starting/ending *somewhere* on the node with the
record shape. We always (re-)connect these edges to the first part of the
autosplit node. Maybe we should balance them to use parts with as little
edges as possible. (The entire feature is quite bogus, since it is not
clear from the resulting image where the edge really starts/ends, at the
aggregate node or at the specific part where the arrow/line ends up
pointing to/from...:-/
+ attributes unknown to dot, but valid under Graph::Easy (like "labelpos")
cause an error instead of a warning
+ autosplit nodes (record) lose their attributes, these need to
be carried over from the temp. node.
+ parse nested tables
* as_ascii:
+ better support for different shapes (circle, box, polygon etc)
+ implement pod-formatted labels (*bold*, /italic/,
_underline_, -l-i-n-e-t-h-r-o-u-g-h-, ~overline~, "code")
+ rendering of "(group)" is empty (need a recursive layouter for that,
since the current layouter doesn't add any group cells if a group doesn't
have any node or edge at all)
* as_html:
+ fill on edges
+ v-- and --^ edges (mis-aligned arrows)
(complete edge-arrow alignment in HTML)
+ shift arrows on hor edge end/starts (non-short) left/right, too
+ output of node-clusters is slightly wrong
+ there is no space between two nodes placed next (with filler
cell) to each other. Make filler cells output a ?
+ bidir. self-loops are rendered with only one arrow: [A] <--> [A]
+ define missing HTML edge pieces: CROSS sections with end/start points
+ define JOINTs with start/end pieces (6 for each joints, making 24 types)
+ implement HTML nodes as triangles, house, etc. using slanted edges
* fix nesting with pod-formatted labels
* edges between groups (ala "( 1 [A ]) -> ( 2 [B] )") or between a node
and a group are missing in HTML, ASCII, BOXART and SVG.
* It would be good if we could remove Node::Empty (it blocks a cell
just to draw the right/bottom border pieces)
(we might put these "invisible" nodes into a different "cells" field,
which will be rendered, but not queried for path finding etc)
Output:
* selfloop edges should counter the general flow:
Until done
+------------+
v |
+-------+ +----------------+ +-----+
| Start | --> | Main | --> | End |
+-------+ +----------------+ +-----+
versus (loop still going left):
Until done
+------------+
v |
+-----+ +----------------+ +-------+
| End | <-- | Main | <-- | Start |
+-----+ +----------------+ +-------+
* support two different arrow shapes on bidirectional edges
* as_txt():
+ output of node clusters and node chains is not optimal
+ links between groups are missing
* as_ascii() and others: grow cells around point-shaped nodes to intrude:
...........................
: : | : : :
: : | : : :
: : v : : :
...........................
: : : : :
:-----> : * : <---- : :
: : : : :
...........................
(at least the edge pieces could omit their left/right spacer in ASCII)
* as_boxart has some incorrect corner pieces:
echo "[A|B|C||D]" | perl examples/as_boxart
┌───┐───┐───┐
│ A │ B │ C │
└───┘───┘───┘
│ D │
└───┘
echo "[A| |C||D| |E]" |perl examples/as_boxart
┌───┐ ┌───┐
│ A │ │ C │
└───┘ └───┘
│ │ │ │
│ D │ │ E │
└───┘ └───┘
Layout:
* allow user to specify max graph width (in cells) to avoid overly wide graphs
* auto-grow nodes to be multicelled depending on the dimensions of their label
("main page" gets 2x1, while "a \nb \nc \nd \ne \n" gets 1x2 cells)
This currently causes problems and wierd layouts.
* Use the seed to generate randomized layouts
Rendering/Layout:
* allow "align: center, middle|top|bottom" for vertical alignment of labels.
* add padding attributes (especially usefull for HTML/SVG output)
* add "shape" for groups:
+ rect
+ compact (the default, what it is now)
+ none (no background, no border, no label)
* add attribute "opacity" to set alpha channel on entire objects more easily
* add attribute "shrink" (yes, no) to nodes to make them as compact as poss.
General:
* allow multiple subclasses ala CSS:
node.red { color: red; }
node.green { color: green; }
[ Red ] { class: red green; } -> [ Green ] { class: green red; }
* Implement more class selectors:
+ #id (object with ID id)
* implement pseudo-class "step" for animations (see POD)
* add some possibility to have different fonts, sizes and colors inside one
label ala (when labelstyle=pod):
FG<red|red text> BG<red|red background> FS<2em|big text>
Optimizing:
* put framebuffer related routines into own package (Graph::Easy::As_ascii)
to avoid the dilemma that we need them from both Node and Graph.
Likewise, some routines used by objects (e.g. graph, node etc) should
be in a super-package and inherited)
* improve the after-layout optimizer
* less memory: store border and edge styles as ints instead of "solid" etc
|