我刚注意到,重复的节点名称(即使标记为唯一)在没有Graphviz投诉的情况下得到处理。例如,在下图中考虑以下简单图形(使用circo):
graph {
a [label="a1"]
a [label="a2"]
b
c
d
e
a -- b;
b -- c;
a -- c;
d -- c;
e -- c;
e -- a;
}
我希望上面的图有两个节点:a1和a2。所以我知道我应该使用唯一的名称来实例化它们(与我上面所做的不同)。但是在一个大图中,我可能没有注意到我错误地实例化了两个名称相同的不同节点。因此,如果我做这样的事情,我想强迫Graphviz抱怨它或以某种方式引起我的注意,可能带有警告或错误信息。
我如何做到这一点?
答案 0 :(得分:1)
所有graphviz
程序都默默地合并具有重复名称的节点,我找不到任何方法让它们在执行此操作时发出警告。因为我们只需要找到自己声明节点的情况,而不是声明边缘时隐式声明的节点(在这种情况下复制是正常的和预期的),我们只需找到所有节点名称和识别重复项。
如果一行中只声明了一个节点,可以使用以下脚本完成:
#!/bin/sh
sed -n 's/^[\t ][\t ]*\([_a-zA-Z][_a-zA-Z0-9]*\) *\(\[.*\)*;*$/\1/ p' | \
sort | uniq -c | awk '$$1>1'
如果我们调用此脚本findDupNodes
,我们可以按如下方式运行它:
$ findDupNodes <duplicates.gv
2 a
该脚本查找自己声明的节点名称或者以[
开头的属性列表,对它们进行排序,计算每个声明的次数(使用uniq -c
)并过滤掉只宣告一次的那些。
可以在一行上声明多个节点(例如a; b; c; d;
)但是这个脚本不处理这种情况,或者(可能)其他一些情况 - 大多数情况可能需要一个完整的xdot
1}}语言解析器。
尽管如此,这个脚本应该找到许多可能会进入手写graphviz
脚本的重复节点名称。