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

Download history 178/week @ 2024-04-26 174/week @ 2024-05-03 157/week @ 2024-05-10 211/week @ 2024-05-17 238/week @ 2024-05-24 146/week @ 2024-05-31 558/week @ 2024-06-07 236/week @ 2024-06-14 242/week @ 2024-06-21 171/week @ 2024-06-28 225/week @ 2024-07-05 201/week @ 2024-07-12 185/week @ 2024-07-19 295/week @ 2024-07-26 295/week @ 2024-08-02 182/week @ 2024-08-09

984 每月下载量
用于 8 个crate (4 直接)

MIT/Apache

175KB
4K SLoC

svgdom

Build Status Crates.io Documentation

svgdom 是一个 SVG Full 1.1 处理库,它允许您解析、操作、生成和写入 SVG 内容。

弃用

该库试图创建一个通用的 SVG DOM,可以被各种应用程序使用。但最终发现使用 roxmltree + svgtypes 提取所需数据更容易、更快。

svgdom 有两个主要问题:

  1. 您不能使用基于 Vec 的树创建一个很好的 API,也不能拥有一个安全的基于 Rc-tree 的 API。

    当前实现使用所谓的 Rc-tree,它提供了一个很好的 API,但所有检查都是在运行时完成的,因此您很容易遇到 panic。创建不可变节点也很困难/冗长。本质上,您需要两种类型的节点:一种是不可变的,一种是可变的“引用”。基于 Vec 的树不会有这样的问题,但您不能使用它来实现最简单的操作,例如将一个节点的属性复制到另一个节点,因为您需要对这个操作有一个可变和不可变的引用。Rust 禁止这样做。因此,您需要某种形式的代际索引等。这种解决方案本身也很复杂。性能也成问题,因为在中部插入/删除 Vec 中的对象很昂贵。

  2. SVG 解析本身也很复杂。有几种实现它的方法。

    svgdom 创建一个自定义的 Rc-tree,其中所有属性都作为拥有数据存储。这需要大量的分配(通常是不必要的)。解析/预处理算法本身可以在 docs/preprocessor.md 中找到。问题是您无法调整它。在许多情况下,它产生您不需要或不期望的结果。最初,svgdomsvgcleanerresvg 使用,这两个项目都不再使用它。

目的

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。没有分开的ElementNodeTextNode等。你仍然拥有所有数据,但不是在特定的struct's中。你可以通过Node::node_type()检查节点类型。

依赖

Rust >= 1.32

许可证

许可方式为以下之一

任选其一。

贡献

除非您明确声明,否则任何提交给作品以供包含在内的贡献(根据Apache-2.0许可证定义),均应按照上述方式双许可,不附加任何额外条款或条件。

依赖项

~715KB
~16K SLoC