30 个版本 (18 个破坏性更新)
0.18.0 | 2019 年 8 月 28 日 |
---|---|
0.17.0 | 2019 年 6 月 12 日 |
0.16.1 | 2019 年 3 月 15 日 |
0.15.0 | 2018 年 12 月 13 日 |
0.2.0 | 2016 年 11 月 4 日 |
#14 in #svg-parser
984 每月下载量
用于 8 个crate (4 直接)
175KB
4K SLoC
svgdom
svgdom 是一个 SVG Full 1.1 处理库,它允许您解析、操作、生成和写入 SVG 内容。
弃用
该库试图创建一个通用的 SVG DOM,可以被各种应用程序使用。但最终发现使用 roxmltree + svgtypes 提取所需数据更容易、更快。
svgdom 有两个主要问题:
-
您不能使用基于 Vec 的树创建一个很好的 API,也不能拥有一个安全的基于 Rc-tree 的 API。
当前实现使用所谓的 Rc-tree,它提供了一个很好的 API,但所有检查都是在运行时完成的,因此您很容易遇到 panic。创建不可变节点也很困难/冗长。本质上,您需要两种类型的节点:一种是不可变的,一种是可变的“引用”。基于 Vec 的树不会有这样的问题,但您不能使用它来实现最简单的操作,例如将一个节点的属性复制到另一个节点,因为您需要对这个操作有一个可变和不可变的引用。Rust 禁止这样做。因此,您需要某种形式的代际索引等。这种解决方案本身也很复杂。性能也成问题,因为在中部插入/删除 Vec 中的对象很昂贵。
-
SVG 解析本身也很复杂。有几种实现它的方法。
svgdom
创建一个自定义的 Rc-tree,其中所有属性都作为拥有数据存储。这需要大量的分配(通常是不必要的)。解析/预处理算法本身可以在 docs/preprocessor.md 中找到。问题是您无法调整它。在许多情况下,它产生您不需要或不期望的结果。最初,svgdom
由 svgcleaner 和 resvg 使用,这两个项目都不再使用它。
目的
svgdom旨在简化通用的SVG处理和操作。遗憾的是,SVG是一个非常复杂的格式(PDF规范有826页),具有许多功能,实现所有这些功能将导致一个庞大的库。
这就是为什么svgdom只支持SVG的静态子集。不支持脚本、外部资源以及复杂的CSS样式。解析器将尽可能多的数据转换为简单的doc->elements->attributes结构。
例如,元素的fill
参数可以设置:作为元素属性,作为style
属性的一部分,在CSS2中的style
元素内部,作为ENTITY
,使用JS代码,以及可能还有其他许多方法。
更不用说,fill
属性支持4种不同的数据类型。
使用svgdom
,你可以直接使用node.has_attribute(AttributeId::Fill)
,无需担心这个属性在原始文件中的定义位置。
对于变换、路径和其他SVG类型也是如此。
这种方法的缺点是,你无法保存原始格式和一些数据。
有关详细信息,请参阅预处理器文档。
优势
- 元素链接(IRI,FuncIRI)不仅仅是一个文本,而是指向另一个节点的实际链接。
- 在任何时候,你都可以检查哪些元素链接到特定的元素。有关详细信息,请参阅
Node
文档。 - 支持许多SVG特定的数据类型,如路径、变换、IRI、样式等。归功于svgtypes。
- 完全支持文本节点:XML转义,
xml:space
。 - 对SVG输出的精细控制。
限制
- 只解析SVG元素和属性。
- 属性值、带有CSS的CDATA、DOCTYPE、文本数据和空白将不会被保留。
- 仅支持UTF-8。
- 仅解析最常用的属性,其他存储为字符串。
- 不支持压缩SVG (.svgz)。您应自行解压缩。
- CSS支持最少。
- 仅支持SVG 1.1完整版(不支持2.0草案、基本、Tiny子集)。
svgdom与SVG规范之间的差异
- 库在数据解析、写入时遵循SVG规范,但在树结构上不遵循。
- 一切都是
Node
。没有分开的ElementNode
、TextNode
等。你仍然拥有所有数据,但不是在特定的struct's中。你可以通过Node::node_type()
检查节点类型。
依赖
Rust >= 1.32
许可证
许可方式为以下之一
- Apache License,版本2.0(LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则任何提交给作品以供包含在内的贡献(根据Apache-2.0许可证定义),均应按照上述方式双许可,不附加任何额外条款或条件。
依赖项
~715KB
~16K SLoC