特性

Graph::Easy 支持非常多的特性,下面是一些大致介绍。

Unicode

Graph::Easy 对Unicode输入和输出有着完整的支持:

[ العربية ] -- link --> [ 日本語 ] --> [ 中文 ] -- كوردي --> [ English ]

上面的例子包含了日文,中文,库尔德语,和一些其他的字符;下面是使用Graph::Easy输出的HTML格式的输出(这个不是图片,放大以下可以看到文字也会改变大小:-):

PS: 这里就不引入这一段HTML了..又是CSS又是原始HTML,markdown支持不好。

如果你看到了小方块或者问号,那么你需要安装一些系统缺失的字体,或者使用完整支持Unicode的浏览器(Opera, Firefox),以下是对以上HTML的一张截图,展示了在一个Unicode浏览器里面它的样子:

相同文本的节点

由于每一个节点都是唯一的,因此不可能让两个节点具有相同的名字;但是有时候需要在布局里面给两个节点展示相同的描述,可以使用label属性复写节点上的文本描述:

[ Bonn ] { label: Berlin; } -> [ Berlin ]

经渲染之后图像如下:

+--------+     +--------+
| Berlin | --> | Berlin |
+--------+     +--------+

匿名以及不可见节点,边

Graph::Easy支持匿名节点,正常不可见节点(有一个最小的大小)以及真正的不可见节点(大小尽可能小),也支持不可见的边:

[ ] { title: Anonymous Node; }
  -> [ $sys$Node ] { shape: invisible; title: You don't see me! }
  -> [ Buna ]
  -> [ Borna ] { shape: point; point-style: invisible; }
  -> [ Bremen ]
  -> { style: invisible; } [ Bonn ]
  -> [ $sys$Node ]

效果如下:


          +------------------------------------------+
          v                                          |
                  +------+          +--------+     +------+
    -->       --> | Buna | -->  --> | Bremen |     | Bonn |
                  +------+          +--------+     +------+

多个边

许多图形包也支持多个边;一个多边图就是允许从一个节点有多个边出发到达同一个另外的节点。

[ Rostock ] -> [ Wismut ]
[ Rostock ] -> [ Wismut ]
 +---------------+
  |               v
+---------+     +--------+
| Rostock | --> | Wismut |
+---------+     +--------+

自循环

对于状态机以及流程图来说,自循环非常有用;自循环指的就是一个边从一个节点出发然后回到这个节点本身。

[ Chemnitz ] -> [ Chemnitz ]
  +------+
  v      |
+----------+
| Chemnitz |
+----------+

边的一部分作为其他边的终点

有时候你想把一个边指向另外一个边上面的文字描述;但是传统的边只能连接节点,Graph::Easy的节点有一个特性shape,这种类型的节点会和边无缝连接在一起,让人觉得你好像是真正指向了一个边:

[ car ] { shape: edge; }

[ Bonn ] -- train --> [ Berlin ] -- [ car ] --> [ Ulm ]

[ rented ] --> [ car ]
+------+  train   +--------+      car           +-----+
| Bonn | -------> | Berlin | -----------------> | Ulm |
+------+          +--------+                    +-----+
                                   ^
                                   |
                                   |
                                 +--------+
                                 | rented |
                                 +--------+

无向边和双向边

无向边和双向边也经常被使用:

[ Hamm ] <--> [ Leverkusen ]
[ Wismut ] -- [ Plauen ]
+--------+      +------------+
|  Hamm  | <--> | Leverkusen |
+--------+      +------------+
+--------+      +------------+
| Wismut | ---- |   Plauen   |
+--------+      +------------+

分组(群或者子图)

子图(在Graph::Easy里面叫做组)允许你把一些节点放在一起:

( Capitals: [ Bonn ], [ Berlin ] )
+ - - - - - - +
' Capitals:   '
'             '
' +---------+ '
' | Berlin  | '
' +---------+ '
' +---------+ '
' |  Bonn   | '
' +---------+ '
'             '
+ - - - - - - +

使用嵌套的组也是可能的(没有实现,无法使用);可以有从一个分组到一个节点的边,反之亦然;一个组到另外一个组的边也支持。

查阅Hintings获取更详细的信息和例子。

Joints(边分散和聚合)

可以把边分散或者聚合:

 [ Potsdam ], [ Mannheim ] 
   --> { end: back,0; }
 [ Weimar ]
   --> { start: front,0; } [ Finsterwalde ], [ Aachen ]

+----------+ +--------+ +--------------+ | Mannheim | ------+-> | Weimar | -+-----> | Finsterwalde | +----------+ | +--------+ | +--------------+ | | | | | | +----------+ | | +--------------+ | Potsdam | ------+ +-----> | Aachen | +----------+ +--------------+

更多的内容可以参考Joints