mf_model/
node.rs

1use super::attrs::Attrs;
2use super::mark::Mark;
3use super::types::NodeId;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6/// 基础节点定义,任何数据都可以认为是节点
7///
8/// # 属性
9///
10/// * `id` - 节点唯一标识符
11/// * `type` - 节点类型
12/// * `attrs` - 节点属性,一般用于元数据的存储
13/// * `content` - 子节点列表
14/// * `marks` - 节点标记列表
15///
16/// # 示例
17///
18/// ```
19/// use mf_rs::model::node::Node;
20/// use mf_rs::model::attrs::Attrs;
21///
22/// let node = Node::new(
23///     "node1",
24///     "paragraph".to_string(),
25///     Attrs::default(),
26///     vec![],
27///     vec![],
28/// );
29/// ```
30
31#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
32pub struct Node {
33    #[serde(rename = "i")]
34    pub id: NodeId,
35    #[serde(rename = "t")]
36    pub r#type: String,
37    #[serde(rename = "a")]
38    pub attrs: Attrs,
39    #[serde(rename = "c")]
40    pub content: imbl::Vector<NodeId>, // 使用im::Vector替代Arc<Vec>
41    #[serde(rename = "m")]
42    pub marks: imbl::Vector<Mark>,
43}
44
45impl Node {
46    /// 创建一个新的节点实例
47    ///
48    /// # 参数
49    ///
50    /// * `id` - 节点ID,字符串引用
51    /// * `type` - 节点类型
52    /// * `attrs` - 节点属性
53    /// * `content` - 子节点ID列表
54    /// * `marks` - 节点标记列表
55    ///
56    /// # 返回值
57    ///
58    /// 返回一个新的 `Node` 实例
59    pub fn new(
60        id: &str, // 接受字符串引用
61        r#type: String,
62        attrs: Attrs,
63        content: Vec<NodeId>,
64        marks: Vec<Mark>,
65    ) -> Self {
66        Node {
67            id: id.into(), // 转换为Arc<str>
68            r#type,
69            attrs,
70            content: content.into(),
71            marks: marks.into(),
72        }
73    }
74    /// 获取子节点数量
75    ///
76    /// # 返回值
77    ///
78    /// 返回节点包含的子节点数量
79    pub fn child_count(&self) -> usize {
80        self.content.len()
81    }
82    /// 更新节点属性
83    ///
84    /// # 参数
85    ///
86    /// * `new_values` - 新的属性值
87    ///
88    /// # 返回值
89    pub fn update_attr(
90        &self,
91        new_values: imbl::HashMap<String, Value>,
92    ) -> Self {
93        let mut new_node = self.clone();
94        let new_attrs = self.attrs.update(new_values);
95        new_node.attrs = new_attrs;
96        new_node
97    }
98    /// 在指定位置插入子节点
99    ///
100    /// # 参数
101    ///
102    /// * `index` - 插入位置
103    /// * `node_id` - 子节点ID
104    ///
105    pub fn insert_content_at_index(
106        &self,
107        index: usize,
108        node_id: &str,
109    ) -> Self {
110        let mut new_node = self.clone();
111        new_node.content.insert(index, node_id.into());
112        new_node
113    }
114    /// 在末尾插入多个子节点
115    ///
116    /// # 参数
117    ///
118    /// * `node_ids` - 子节点ID列表
119    ///
120    pub fn insert_contents(
121        &self,
122        node_ids: &Vec<NodeId>,
123    ) -> Self {
124        let mut new_node = self.clone();
125        for node_id in node_ids {
126            new_node.content.push_back(node_id.clone());
127        }
128        new_node
129    }
130    /// 在末尾插入一个子节点
131    ///
132    /// # 参数
133    ///
134    /// * `node_id` - 子节点ID
135    ///
136    pub fn insert_content(
137        &self,
138        node_id: &str,
139    ) -> Self {
140        let mut new_node = self.clone();
141        new_node.content.push_back(node_id.into());
142        new_node
143    }
144
145    /// 移除指定名称的标记
146    ///
147    /// # 参数
148    ///
149    /// * `mark_name` - 标记名称
150    ///
151    pub fn remove_mark_by_name(
152        &self,
153        mark_name: &str,
154    ) -> Self {
155        let mut new_node = self.clone();
156        new_node.marks = new_node
157            .marks
158            .iter()
159            .filter(|&m| m.r#type != mark_name)
160            .cloned()
161            .collect();
162        new_node
163    }
164    /// 移除指定类型的标记
165    ///
166    /// # 参数
167    ///
168    /// * `mark_types` - 标记类型列表
169    ///
170    pub fn remove_mark(
171        &self,
172        mark_types: &[String],
173    ) -> Self {
174        let mut new_node = self.clone();
175        new_node.marks = new_node
176            .marks
177            .iter()
178            .filter(|&m| !mark_types.contains(&m.r#type))
179            .cloned()
180            .collect();
181        new_node
182    }
183    /// 添加多个标记 如果存在相同类型的mark,则覆盖
184    ///
185    /// # 参数
186    ///
187    /// * `marks` - 标记列表
188    ///
189    pub fn add_marks(
190        &self,
191        marks: &Vec<Mark>,
192    ) -> Self {
193        let mark_types =
194            marks.iter().map(|m| m.r#type.clone()).collect::<Vec<String>>();
195        let mut new_node = self.clone();
196        //如果存在相同类型的mark,则覆盖
197        new_node.marks = new_node
198            .marks
199            .iter()
200            .filter(|m| !mark_types.contains(&m.r#type))
201            .cloned()
202            .collect();
203        new_node.marks.extend(marks.iter().map(|m| m.clone()));
204        new_node
205    }
206}