pptx_rs/opc/mod.rs
1//! OPC(Open Packaging Convention)容器层。
2//!
3//! `.pptx` 本质上是一个 **zip 包**,其内部由若干个 **Part** 组成,
4//! Part 之间通过 **Relationship**(关系)相互链接。本模块提供与
5//! python-pptx 的 `pptx.opc` 子包对标的最小化 Rust 实现。
6//!
7//! # 模块构成
8//!
9//! - [`OpcPackage`]:包加载/保存入口,对应一个完整的 `.pptx` 文件。
10//! - [`Part`]:单个 part 的抽象(名称 + Content-Type + 字节内容)。
11//! - [`PartName`]:part 的逻辑路径(如 `/ppt/slides/slide1.xml`)。
12//! - [`ContentTypes`]:`[Content_Types].xml` 模型(defaults + overrides)。
13//! - [`Relationships`]:单个 `.rels` 文件模型。
14//! - [`RelType`]:常用关系类型枚举。
15//!
16//! # 在三层架构中的位置
17//!
18//! 本模块是 [`crate`] 三个层级中的 **最底层**(容器层)。它不依赖
19//! `oxml`(OOXML 模型)或 `shape` / `presentation` 等高阶 API。
20//! `oxml::writer` 输出的字节最终通过 `OpcPackage::put_part` 注入本层。
21//!
22//! # 与 OOXML 规范的对应
23//!
24//! - `Part` ↔ OOXML 规范中的"部件"(part);
25//! - `PartName` ↔ "部件名称"(`PartName` 路径,根用 `/`);
26//! - `Relationships` ↔ `*.rels` XML 文件;
27//! - `ContentTypes` ↔ 根目录下的 `[Content_Types].xml`。
28//!
29//! # 与 python-pptx 的对应
30//!
31//! - `pptx.opc.package.OpcPackage` ←→ [`OpcPackage`];
32//! - `pptx.opc.package.Part` ←→ [`Part`];
33//! - `pptx.opc.packuri.PackURI` ←→ [`PartName`];
34//! - `pptx.opc.constants.CONTENT_TYPE` ←→ [`ct`] 模块常量;
35//! - `pptx.opc.parts.*.part_class_selector` 思路未移植,由调用方决定具体 part。
36//!
37//! # 示例
38//!
39//! ```no_run
40//! use pptx_rs::opc::{OpcPackage, Part, PartName};
41//!
42//! let mut pkg = OpcPackage::new();
43//! let xml = b"<?xml version=\"1.0\"?><root/>".to_vec();
44//! let p = Part::new(PartName::from_unchecked("/custom/foo.xml"),
45//! "application/xml", xml);
46//! pkg.put_part(p);
47//! pkg.save("out.pptx").unwrap();
48//! ```
49
50pub mod content_types;
51pub mod package;
52pub mod part;
53pub mod rels;
54
55// 公共 API 重新导出:让 `pptx_rs::opc::OpcPackage` 等可直接使用,
56// 不必记忆模块嵌套路径。
57pub use content_types::{ContentTypes, DefaultExt, Override};
58pub use package::{ct, OpcPackage};
59pub use part::{new_part_name, Part, PartName, PartNameError};
60pub use rels::{RelType, Relationship, Relationships, Target};