数据模型层
整体思路其实和 Prosemirror
类似,不过思维导图不同于富文本文档,目前没有 Mark
的概念,所以 model
只会转换 Yjs
的 Xml
到对应的 Node
Schema系统
和 Prosemirror
一样,我们也需要一个 Schema
来定义我们的节点类型,作为一个类似 Map
的存在,在对数据进行便利的时候可以更方便的获取对应 node
的初始化函数
Node系统
其实从数据结构上来说,Yjs
的任何一个 Xml
其实就是一个 Node
(其实Text
也算是Node
的一种)转换到js
实际上就是一个个的基础的Object
但是这个对象如果要直接拿给Leaferjs
js使用的话,还是需要进行一些基础的处理,例如一些attrs
属性的存在,部分属性的默认值补全等
所以整个 Node
也就是模型层面被单独抽象了出来
当然Node
还会额外根据当前Node
对应的Yjs
的节点基础信息提供一些基本的数据给外部
例如
- depth 当前Node对应节点的深度
- nodeSize 当前Node对应的节点大小
- children 子
Node
- attributes 定义的这个节点有用的
attrs
属性如果该属性有缺失,会自动根据默认值进行生成并修改回对应的state
NodeSpec定义
一些Node
的基础定义,表示这个Node
在Leaferui
以及数据层面的关联关系
主要是content
和group
属性
当然
这个 Node
上的 attrs
和 toCanvas
渲染的 leaferjs
的 元素是这里进行定义的
schema
里的node
主要就是nodeSpec
NodeType定义
提供了一个简单的胶水层,沟通了Schema
和NodeSpec
之间的联系 类似于一个工厂函数,可以通过Yjs
的Xml
自动推理出是哪个Node
然后创建出对应的node
对象出来
本身生成的nodeType
实例倒是很简单,只有一个name
以及spec
(NodeSpec)
链接
核心处理流程
目前待开发
[ ]
setAttr/setAttrs
方法,将attr
的变更同步回yjs
上[ ]
update
方法,如果有任何属性发生了改变,通知对应的view
进行更新