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: im::Vector<NodeId>, // 使用im::Vector替代Arc<Vec>
41    #[serde(rename = "m")]
42    pub marks: im::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: im::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    pub fn insert_content_at_index(&self, index: usize, node_id: &str) -> Self {
98        let mut new_node = self.clone();
99        new_node.content.insert(index, node_id.into());
100        new_node
101    }
102    pub fn insert_contents(&self, node_ids: &Vec<String>) -> Self {
103        let mut new_node = self.clone();
104        for node_id in node_ids {
105            new_node.content.push_back(node_id.into());
106        }
107        new_node
108    }
109    pub fn insert_content(&self, node_id: &str) -> Self {
110        let mut new_node = self.clone();
111        new_node.content.push_back(node_id.into());
112        new_node
113    }
114
115    pub fn remove_mark_by_name(&self, mark_name: &str) -> Self {
116        let mut new_node = self.clone();
117        new_node.marks = new_node
118            .marks
119            .iter()
120            .filter(|&m| m.r#type != mark_name)
121            .cloned()
122            .collect();
123        new_node
124    }
125    pub fn remove_mark(&self, mark_types: &[String]) -> Self {
126        let mut new_node = self.clone();
127        new_node.marks = new_node
128            .marks
129            .iter()
130            .filter(|&m| !mark_types.contains(&m.r#type))
131            .cloned()
132            .collect();
133        new_node
134    }
135    pub fn add_marks(&self, marks: &Vec<Mark>) -> Self {
136        let mark_types =
137            marks.iter().map(|m| m.r#type.clone()).collect::<Vec<String>>();
138        let mut new_node = self.clone();
139        //如果存在相同类型的mark,则覆盖
140        new_node.marks = new_node
141            .marks
142            .iter()
143            .filter(|m| !mark_types.contains(&m.r#type))
144            .cloned()
145            .collect();
146        new_node.marks.extend(marks.iter().map(|m| m.clone()));
147        new_node
148    }
149}