#graph #dot #graphviz #parser #dotfile #reading-file

dot-parser

该库提供DOT/Graphviz图描述语言的解析器,以及用于转换这些图的实用函数。

7个版本

0.3.0 2024年7月8日
0.2.1 2024年5月28日
0.1.3 2022年9月8日
0.1.0 2021年11月17日

解析器实现 中排名 234

Download history 5/week @ 2024-05-19 308/week @ 2024-05-26 30/week @ 2024-06-02 42/week @ 2024-06-09 9/week @ 2024-06-16 3/week @ 2024-06-23 34/week @ 2024-06-30 126/week @ 2024-07-07 14/week @ 2024-07-14 92/week @ 2024-07-28

每月下载量 261
3 crate 中使用

GPL-2.0-or-later

83KB
2K SLoC

dot-parser

此crate提供dot文件(也称为Graphviz)的解析器,实现紧密遵循Graphviz给出的正式语法。此外,我们提供转换函数(即列表的等价物 flat_map),以操作图,以及图的规范表示,它将子图展平,并用简单的边语句替换具有多个右侧的边语句。

用法

Cargo.toml

dot-parser = "*"

在你的Rust源文件中(根据你的需求进行修改)

use dot_parser::*;

然后,可以使用 dot_parser::ast::Graphfrom_file 方法解析文件。如果打开和读取文件存在问题,或者文件内容不是有效的Graphviz图,则解析文件可能会失败。

fn main() {
	let res = ast::Graph::from_file("/path/to/graph.dot");
	match res {
		Ok(graph) =>
			println!("{:#?}", graph),
		Err(e) => 
			println!("{}", e),
	}
}

处理 dot_parser::ast::Graph 不太方便,因为其表示紧密遵循Graphviz语法。例如,我们必须考虑子图或属性列表的列表等。相反,使用 dot_parser::canonical::Graph 更容易。

fn main() {
    let res = ast::Graph::from_file("/path/to/graph.dot").unwrap();
    let canonical = canonical::Graph::from(res);
    println!("{:#?}", canonical);
}

功能

输出dot图

使用 display 功能,规范图可以显示(遵循Graphviz语法),只要属性的类型实现了 Display

fn main() {
	let res = ast::Graph::from_file("/path/to/graph.dot").unwrap();
    let canonical = canonical::Graph::from(res).filter_map::<_, String>(&|_| None);
    println!("{}", canonical);
}

Petgraph 兼容性

使用 petgraph 功能,可以将规范图转换为Petgraph的图

fn main() {
	let res = ast::Graph::from_file("/path/to/graph.dot").unwrap();
    let canonical = canonical::Graph::from(res);
    let petgraph: petgraph::graph::Graph<_, _> = canonical.into();
    println!("{:#?}", canonical);
}

编译时导入

可以使用 dot_parser_macros crate 在编译时导入图。宏 from_dot_file! 允许从文件静态导入图,而 from_dot_string! 允许您直接在Rust源文件中写入图。

use dot_parser_macros::*;
use dot_parser::ast::Graph;

fn main() {
    let graph = from_dot_file!("/tmp/graph.dot");
    println!("{:#?}", graph);
}

限制

  • 官方上,任何XML字符串都可以用作ID,任何HTML字符串都可以用作标签。目前这还没有正确实现。
  • 官方上,以'#'开头的行被认为是预处理器的输出,会被忽略。目前还没有实现。

致谢

这个crate是由Martin Vassor编写的,他是牛津大学移动阅读小组的成员,曾就职于伦敦帝国理工学院

本工作的初始开发(直到v0.1.3)得到了EPSRC资助,资助编号为EP/T006544/1EP/K011715/1EP/K034413/1EP/L00058X/1EP/N027833/1EP/N028201/1EP/T014709/1EP/V000462/1以及NCSS/EPSRC VeTSS。

依赖项

~2.1–3.5MB
~63K SLoC