跳转到内容

文件格式与文档模型

larrygram-vsdx · larrygram-model

Larrygram 的文件处理分为两层。larrygram-vsdx 负责读写文件;larrygram-model 负责在内存中保存绘图。模型对 XML 和 zip 文件一无所知,因此其他格式(例如计划中的 .vsd 导入器)也可以载入同一个模型。

.vsdx、.vssx 或 .vstx 文件是一个 OPC 包:一个 zip 容器,包含 [Content_Types].xml、关系部件和 XML 部件,具体见 Microsoft 公开的 [MS-VSDX] 规范。包层只处理容器。它设有硬性限制,使格式错误或恶意构造的文件无法耗尽内存:

限制 防范
zip 条目数量 部件数量极多的包
单个部件及整个包的解压后大小 过大的输入
单个条目的压缩比 zip 炸弹
XML 嵌套深度,以及每个元素的属性数量 病态 XML
实体 包含
Document 类型(绘图、模具或模板)、文档属性、页面、主控形状、样式表
Page 页面表和形状
Master 来自模具的可复用形状定义
Shape ShapeSheet 节、行和单元格;几何图形;文本;组合的子形状
Stylesheet 形状继承的线条、填充和文本样式
Cell 公式、缓存值和单位,分别存储

每个实体都保留 Visio 自身的标识符(ID、NameU、Name)。来自主控形状和样式表的继承在需要取值时通过查找解析,载入时从不展平,因此保存后的文件仍保留继承关系。

Larrygram 只将格式的一部分映射到模型中。其余内容全部保留:

  1. 未知部件保留在包中,保存时逐字节复制。
  2. 已建模元素的未知属性和子元素存储在对应的模型实体上,并写回文件。
  3. 受支持部件中的未知元素保留在最近的已建模祖先元素上。

往返读写的结果并非逐字节相同(写入器会按自己的方式生成关系部件和属性顺序),但 XML 在语义上等价。项目测试语料库中的每个文件都能通过这项检查。

ShapeSheet 公式 开发中

Section titled “ShapeSheet 公式 ”

每个单元格都将公式以文本形式存储在缓存值旁边。larrygram-shapesheet crate 负责解析、输出和计算公式:它能解析测试语料库中 994 个不同公式中的 976 个,并能将每个已解析的公式原样输出;它包含 42 个函数,可以解析跨形状、主控形状、页面和样式的引用,并支持带循环检测的增量重新计算。它尚未接入编辑、打开或保存功能。

larrygram-render 根据缓存的单元格值构建场景,并将其绘制为 PNG(使用 tiny-skia)或 SVG。文本使用内置的 Carlito 和 Selawik 字体进行排版。

本页译自英文。如有表述不当之处,请告诉我们。