Skip to main content

easydoc_writer/
paragraph.rs

1//! 段落构建器。
2//!
3//! 对应 Java: `com.alibaba.excel.write.metadata.Row` 中的单元格文本内容
4
5use easydoc_core::{HorizontalAlignment, ParagraphStyle};
6
7use crate::run::Run;
8
9/// 由文本片段组成的段落。
10///
11/// 对应 Java: `com.alibaba.excel.write.metadata.Row` 中的单元格文本内容
12#[derive(Clone)]
13pub struct Paragraph {
14    runs: Vec<Run>,
15    style: Option<ParagraphStyle>,
16}
17
18impl Paragraph {
19    /// 创建空段落。
20    #[must_use]
21    pub fn new() -> Self {
22        Self {
23            runs: Vec::new(),
24            style: None,
25        }
26    }
27
28    /// 向段落添加纯文本。
29    #[must_use]
30    pub fn add_text(mut self, text: impl Into<String>) -> Self {
31        self.runs.push(Run::text(text));
32        self
33    }
34
35    /// 向段落添加预配置的 [`Run`]。
36    #[must_use]
37    pub fn add_run(mut self, run: Run) -> Self {
38        self.runs.push(run);
39        self
40    }
41
42    /// 设置段落对齐方式。
43    #[must_use]
44    pub fn alignment(mut self, alignment: HorizontalAlignment) -> Self {
45        self.style.get_or_insert_default().alignment = Some(alignment);
46        self
47    }
48
49    pub(crate) fn into_runs(self) -> Vec<Run> {
50        self.runs
51    }
52
53    pub(crate) fn paragraph_style(&self) -> Option<&ParagraphStyle> {
54        self.style.as_ref()
55    }
56}
57
58impl Default for Paragraph {
59    fn default() -> Self {
60        Self::new()
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67
68    #[test]
69    fn paragraph_new_is_empty() {
70        let p = Paragraph::new();
71        assert!(p.runs.is_empty());
72        assert!(p.style.is_none());
73    }
74
75    #[test]
76    fn paragraph_add_text() {
77        let p = Paragraph::new().add_text("hello");
78        assert_eq!(p.runs.len(), 1);
79        assert_eq!(p.runs[0].run_text(), "hello");
80    }
81
82    #[test]
83    fn paragraph_add_run() {
84        let run = Run::new("bold").bold();
85        let p = Paragraph::new().add_run(run);
86        assert_eq!(p.runs.len(), 1);
87        assert!(p.runs[0].font_config().unwrap().bold);
88    }
89
90    #[test]
91    fn paragraph_alignment() {
92        let p = Paragraph::new().alignment(HorizontalAlignment::Center);
93        assert!(p.paragraph_style().is_some());
94        assert_eq!(
95            p.paragraph_style().unwrap().alignment,
96            Some(HorizontalAlignment::Center)
97        );
98    }
99}