Skip to main content

ofd_core/model/
common.rs

1//! 多处引用的公共结构。
2//!
3//! 动作(`CT_Action`,见第 14 章)、目标位置(`CT_Dest`,见表 54)、
4//! 版本(见第 19 章)等在基础结构中被多个节点引用,这里给出便于解析的
5//! 简化模型。详细语义可在后续章节实现中逐步完善(未建模的子节点在反序列
6//! 化时会被忽略)。
7
8use serde::{Deserialize, Serialize};
9
10use crate::types::{StId, StLoc, StRefId};
11
12/// 动作序列。当存在多个 `Action` 对象时,所有动作依次执行。
13#[derive(Debug, Clone, Default, Deserialize, Serialize)]
14pub struct Actions {
15    /// 动作列表。
16    #[serde(rename = "Action", default)]
17    pub actions: Vec<CtAction>,
18}
19
20/// `CT_Action`:文档/页面/大纲等关联的动作(见第 14 章,此处为基础建模)。
21#[derive(Debug, Clone, Default, Deserialize, Serialize)]
22pub struct CtAction {
23    /// 事件类型,如 `DO`(文档打开)、`PO`(页面打开),见表 52。
24    #[serde(rename = "@Event")]
25    pub event: Option<String>,
26    /// 动作类型。
27    #[serde(rename = "@Type")]
28    pub action_type: Option<String>,
29    /// 目标位置。
30    #[serde(rename = "Dest")]
31    pub dest: Option<CtDest>,
32}
33
34/// `CT_Dest`:文档内的目标位置(见表 54,此处为基础建模)。
35#[derive(Debug, Clone, Default, Deserialize, Serialize)]
36pub struct CtDest {
37    /// 目标类型,如 `XYZ`、`Fit`、`FitH`、`FitV`、`FitR` 等。
38    #[serde(rename = "@Type")]
39    pub dest_type: Option<String>,
40    /// 引用的页面标识。
41    #[serde(rename = "@PageID")]
42    pub page_id: Option<StRefId>,
43    /// 左边界坐标。
44    #[serde(rename = "@Left")]
45    pub left: Option<f64>,
46    /// 上边界坐标。
47    #[serde(rename = "@Top")]
48    pub top: Option<f64>,
49    /// 右边界坐标。
50    #[serde(rename = "@Right")]
51    pub right: Option<f64>,
52    /// 下边界坐标。
53    #[serde(rename = "@Bottom")]
54    pub bottom: Option<f64>,
55    /// 缩放比例。
56    #[serde(rename = "@Zoom")]
57    pub zoom: Option<f64>,
58}
59
60/// 版本集合,定义文件因注释和其他改动产生的版本信息(见第 19 章)。
61#[derive(Debug, Clone, Default, Deserialize, Serialize)]
62pub struct Versions {
63    /// 版本列表。
64    #[serde(rename = "Version", default)]
65    pub versions: Vec<Version>,
66}
67
68/// 单个版本描述节点(见第 19 章,此处为基础建模)。
69#[derive(Debug, Clone, Default, Deserialize, Serialize)]
70pub struct Version {
71    /// 版本标识。
72    #[serde(rename = "@ID")]
73    pub id: Option<StId>,
74    /// 版本序号。
75    #[serde(rename = "@Index")]
76    pub index: Option<i64>,
77    /// 是否为当前版本。
78    #[serde(rename = "@Current")]
79    pub current: Option<bool>,
80    /// 指向版本描述文件。
81    #[serde(rename = "@BaseLoc")]
82    pub base_loc: Option<StLoc>,
83}