Skip to main content

easyofd_core/doc/
pages.rs

1//! 页树。
2//!
3//! 对应 Java: org.ofdrw.core.basicStructure.pageTree.Pages
4//! 图 12 页树结构
5
6/// 页树。
7///
8/// 包含一个或多个页面叶节点,页顺序根据页树前序遍历确定。
9///
10/// 对应 Java: org.ofdrw.core.basicStructure.pageTree.Pages
11#[derive(Debug, Clone, Default, PartialEq)]
12pub struct Pages {
13    /// 页面列表(ID, BaseLoc)。
14    pub pages: Vec<PageEntry>,
15}
16
17/// 页面条目。
18#[derive(Debug, Clone, PartialEq)]
19pub struct PageEntry {
20    /// 页面 ID。
21    pub id: u32,
22    /// 页面文件路径。
23    pub base_loc: String,
24}
25
26impl PageEntry {
27    /// 创建页面条目。
28    #[must_use]
29    pub fn new(id: u32, base_loc: impl Into<String>) -> Self {
30        Self {
31            id,
32            base_loc: base_loc.into(),
33        }
34    }
35}
36
37impl Pages {
38    /// 创建空页树。
39    #[must_use]
40    pub fn new() -> Self {
41        Self::default()
42    }
43
44    /// 添加页面。
45    pub fn add_page(&mut self, entry: PageEntry) {
46        self.pages.push(entry);
47    }
48
49    /// 获取页面数量。
50    #[must_use]
51    pub fn len(&self) -> usize {
52        self.pages.len()
53    }
54
55    /// 是否为空。
56    #[must_use]
57    pub fn is_empty(&self) -> bool {
58        self.pages.is_empty()
59    }
60
61    /// 获取指定索引的页面。
62    #[must_use]
63    pub fn get(&self, index: usize) -> Option<&PageEntry> {
64        self.pages.get(index)
65    }
66}
67
68#[cfg(test)]
69mod tests {
70    use super::*;
71
72    #[test]
73    fn pages_new() {
74        let p = Pages::new();
75        assert!(p.is_empty());
76        assert_eq!(p.len(), 0);
77    }
78
79    #[test]
80    fn pages_add_page() {
81        let mut p = Pages::new();
82        p.add_page(PageEntry::new(1, "Pages/Page_0.xml"));
83        p.add_page(PageEntry::new(2, "Pages/Page_1.xml"));
84        assert_eq!(p.len(), 2);
85        assert!(!p.is_empty());
86    }
87
88    #[test]
89    fn pages_get() {
90        let mut p = Pages::new();
91        p.add_page(PageEntry::new(1, "Pages/Page_0.xml"));
92        let entry = p.get(0).unwrap();
93        assert_eq!(entry.id, 1);
94        assert_eq!(entry.base_loc, "Pages/Page_0.xml");
95        assert!(p.get(1).is_none());
96    }
97
98    #[test]
99    fn page_entry_new() {
100        let pe = PageEntry::new(5, "Pages/Page_4.xml");
101        assert_eq!(pe.id, 5);
102        assert_eq!(pe.base_loc, "Pages/Page_4.xml");
103    }
104
105    #[test]
106    fn pages_clone_debug() {
107        let p = Pages::new();
108        let p2 = p.clone();
109        assert!(p2.is_empty());
110        assert!(format!("{p:?}").contains("Pages"));
111    }
112}