document_data.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. use std::{collections::HashMap, vec};
  2. use collab_document::blocks::{Block, DocumentData, DocumentMeta};
  3. use nanoid::nanoid;
  4. use crate::{
  5. document_block_keys::{PAGE, PARAGRAPH_BLOCK_TYPE},
  6. entities::{BlockPB, ChildrenPB, DocumentDataPB, MetaPB},
  7. };
  8. impl From<DocumentData> for DocumentDataPB {
  9. fn from(data: DocumentData) -> Self {
  10. let blocks = data
  11. .blocks
  12. .into_iter()
  13. .map(|(id, block)| (id, block.into()))
  14. .collect();
  15. let children_map = data
  16. .meta
  17. .children_map
  18. .into_iter()
  19. .map(|(id, children)| (id, children.into()))
  20. .collect();
  21. let page_id = data.page_id;
  22. Self {
  23. page_id,
  24. blocks,
  25. meta: MetaPB { children_map },
  26. }
  27. }
  28. }
  29. impl From<DocumentDataPB> for DocumentData {
  30. fn from(data: DocumentDataPB) -> Self {
  31. let blocks = data
  32. .blocks
  33. .into_iter()
  34. .map(|(id, block)| (id, block.into()))
  35. .collect();
  36. let children_map = data
  37. .meta
  38. .children_map
  39. .into_iter()
  40. .map(|(id, children)| (id, children.children))
  41. .collect();
  42. let page_id = data.page_id;
  43. DocumentData {
  44. page_id,
  45. blocks,
  46. meta: DocumentMeta { children_map },
  47. }
  48. }
  49. }
  50. /// The default document data.
  51. /// The default document data is a document with a page block and a text block.
  52. pub fn default_document_data() -> DocumentData {
  53. let page_type = PAGE.to_string();
  54. let text_type = PARAGRAPH_BLOCK_TYPE.to_string();
  55. let mut blocks: HashMap<String, Block> = HashMap::new();
  56. let mut meta: HashMap<String, Vec<String>> = HashMap::new();
  57. // page block
  58. let page_id = nanoid!(10);
  59. let children_id = nanoid!(10);
  60. let root = Block {
  61. id: page_id.clone(),
  62. ty: page_type,
  63. parent: "".to_string(),
  64. children: children_id.clone(),
  65. external_id: None,
  66. external_type: None,
  67. data: HashMap::new(),
  68. };
  69. blocks.insert(page_id.clone(), root);
  70. // text block
  71. let text_block_id = nanoid!(10);
  72. let text_block_children_id = nanoid!(10);
  73. let text_block = Block {
  74. id: text_block_id.clone(),
  75. ty: text_type,
  76. parent: page_id.clone(),
  77. children: text_block_children_id.clone(),
  78. external_id: None,
  79. external_type: None,
  80. data: HashMap::new(),
  81. };
  82. blocks.insert(text_block_id.clone(), text_block);
  83. // meta
  84. meta.insert(children_id, vec![text_block_id]);
  85. meta.insert(text_block_children_id, vec![]);
  86. DocumentData {
  87. page_id,
  88. blocks,
  89. meta: DocumentMeta { children_map: meta },
  90. }
  91. }
  92. impl From<Block> for BlockPB {
  93. fn from(block: Block) -> Self {
  94. Self {
  95. id: block.id,
  96. ty: block.ty,
  97. data: serde_json::to_string(&block.data).unwrap_or_default(),
  98. parent_id: block.parent,
  99. children_id: block.children,
  100. }
  101. }
  102. }
  103. impl From<Vec<String>> for ChildrenPB {
  104. fn from(children: Vec<String>) -> Self {
  105. Self { children }
  106. }
  107. }