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}
44unsafe impl Send for Node {}
45unsafe impl Sync for Node {}
46
47impl Node {
48    /// 创建一个新的节点实例
49    ///
50    /// # 参数
51    ///
52    /// * `id` - 节点ID,字符串引用
53    /// * `type` - 节点类型
54    /// * `attrs` - 节点属性
55    /// * `content` - 子节点ID列表
56    /// * `marks` - 节点标记列表
57    ///
58    /// # 返回值
59    ///
60    /// 返回一个新的 `Node` 实例
61    pub fn new(
62        id: &str, // 接受字符串引用
63        r#type: String,
64        attrs: Attrs,
65        content: Vec<NodeId>,
66        marks: Vec<Mark>,
67    ) -> Self {
68        Node {
69            id: id.into(), // 转换为Arc<str>
70            r#type,
71            attrs,
72            content: content.into(),
73            marks: marks.into(),
74        }
75    }
76    /// 获取子节点数量
77    ///
78    /// # 返回值
79    ///
80    /// 返回节点包含的子节点数量
81    pub fn child_count(&self) -> usize {
82        self.content.len()
83    }
84    /// 更新节点属性
85    ///
86    /// # 参数
87    ///
88    /// * `new_values` - 新的属性值
89    ///
90    /// # 返回值
91    pub fn update_attr(&self, new_values: imbl::HashMap<String, Value>) -> Self {
92        let mut new_node = self.clone();
93        let new_attrs = self.attrs.update(new_values);
94        new_node.attrs = new_attrs;
95        new_node
96    }
97    /// 在指定位置插入子节点
98    ///
99    /// # 参数
100    ///
101    /// * `index` - 插入位置
102    /// * `node_id` - 子节点ID
103    ///
104    pub fn insert_content_at_index(&self, index: usize, node_id: &str) -> Self {
105        let mut new_node = self.clone();
106        new_node.content.insert(index, node_id.into());
107        new_node
108    }
109    /// 在末尾插入多个子节点
110    ///
111    /// # 参数
112    ///
113    /// * `node_ids` - 子节点ID列表
114    ///
115    pub fn insert_contents(&self, node_ids: &Vec<String>) -> Self {
116        let mut new_node = self.clone();
117        for node_id in node_ids {
118            new_node.content.push_back(node_id.into());
119        }
120        new_node
121    }
122    /// 在末尾插入一个子节点
123    ///
124    /// # 参数
125    ///
126    /// * `node_id` - 子节点ID
127    ///
128    pub fn insert_content(&self, node_id: &str) -> Self {
129        let mut new_node = self.clone();
130        new_node.content.push_back(node_id.into());
131        new_node
132    }
133
134    /// 移除指定名称的标记
135    ///
136    /// # 参数
137    ///
138    /// * `mark_name` - 标记名称
139    ///
140    pub fn remove_mark_by_name(&self, mark_name: &str) -> Self {
141        let mut new_node = self.clone();
142        new_node.marks = new_node
143            .marks
144            .iter()
145            .filter(|&m| m.r#type != mark_name)
146            .cloned()
147            .collect();
148        new_node
149    }
150    /// 移除指定类型的标记
151    ///
152    /// # 参数
153    ///
154    /// * `mark_types` - 标记类型列表
155    ///
156    pub fn remove_mark(&self, mark_types: &[String]) -> Self {
157        let mut new_node = self.clone();
158        new_node.marks = new_node
159            .marks
160            .iter()
161            .filter(|&m| !mark_types.contains(&m.r#type))
162            .cloned()
163            .collect();
164        new_node
165    }
166    /// 添加多个标记 如果存在相同类型的mark,则覆盖
167    ///
168    /// # 参数
169    ///
170    /// * `marks` - 标记列表
171    ///
172    pub fn add_marks(&self, marks: &Vec<Mark>) -> Self {
173        let mark_types =
174            marks.iter().map(|m| m.r#type.clone()).collect::<Vec<String>>();
175        let mut new_node = self.clone();
176        //如果存在相同类型的mark,则覆盖
177        new_node.marks = new_node
178            .marks
179            .iter()
180            .filter(|m| !mark_types.contains(&m.r#type))
181            .cloned()
182            .collect();
183        new_node.marks.extend(marks.iter().map(|m| m.clone()));
184        new_node
185    }
186}