• [FE] RichText 富文本工具Prosemirror


    Docs(官方文档)

    https://prosemirror.net/docs/

    RichText 富文本问题

    1. 可支持多少种格式
    2. 如何输入
    3. 如何渲染
    4. 如何保存历史
    5. 是否支持多人实时更新文本交互

    Basic(基本工具包)

    Prosemirror State
    记录当前富文本的所有状态,仅能通过Transaction更新
    类:

    class EditorState{
          doc:Node, // 文本的主节点
          selection: Selection, // 文本的选择
          storedMarks: Mark[], // 当前状态输入的所有标记,会被应用到下次输入的字符
          schema: Schema, // 当前文档的架构,例如paragraph,doc,text,list-node等等
          plugins: Plugin[], // 当前文本的插件
          apply: (tr)=>{}, // 使用当前的状态执行某个变换生成一个新的状态
          applyTransation: (rootTr)=>{}, // TODO: 暂时未知
          tr: Transaction, //提供定义变换的一个类
          reconfigure: (config:{schema:{},plugins:{}})=>EditorState, // 重新配置架构以及插件
          toJson:(PluginFields:{}|string|number), // 导出Json,TODO: 暂时未知
          fromJson:(config:{schema,plugins},json:Object,pluginFields: Object<Plugin>) -> EditorState // 从json导入创建状态,TODO: 目前具体未知
          static create(config:{ // 创建一个新的状态
                schema:Schema,
                doc:Node,
                selection: Selection,
                storedMarks: Mark[],
                plugins: Plugin[], 
          })->EditorState 
    }
    

    可以通过EditorState创建一个更新用的Transaction

    class Transaction{
          time: Date.now(), // 与此变换想过的时间戳,可能是number格式
          storedMarks: mark[], // 该次变换的保存的标记
          selection: Selection, // 默认为上次EditorState的选择区域,但是可以被setSelection方法进行重载
          setSelection: (selection)->Transaction, // 更新变换的选择区域
          selectionSet: boolean,//当前的选择区域是否通过setSelection进行了更新
          setStoreMarks: (mark[])-> Transaction, // 修改存储的标记
          ensureMarks: (mark[])-> Transaction, // 确保标记,如果已经标记,则不执行操作, TODO: 作用未知
          addStoredMark: (mark)-> Transaction, // 添加一个标记
          removeStoredMark: (mark|markType)-> transaction, // 移除一个标记
          setTime:(time:number)->transaction, // 更新时间戳
          replaceSelection:(slice:Slice)->transaction, //设置当前的选择区域为某个切片
          replaceSelectionWith:(node:Node,inheritMarks:bool)->transaction, // 选择整个节点,同时选择是否继承当前选择节点上的所有标记
          deleteSelection:()->transaction, // 移除选择区域
          insertText:(text:string,from:number,to:number)->transaction, // 插入文本,替换(from,to)区间的文本
          setMeta:(key:string|Plugin|PluginKey,value:{})->transaction, // 存储一个元元素,存储用? TODO: 作用未知
          getMeta:(key:string|Plugin|PluginKey)->value:{}, // 获取一个元元素
          isGeneric: boolean, // 是否具有元元素
          scrollIntoView:()->transaction //滚动到选择区域,相当于获取焦点
    }
    

    选择区域

    class Selection{
          construct:($anchor:ResolvedPos,$head:ResolvedPos,ranges:[Selection Range])->Selection, // 构造函数,TODO: 具体作用
          ranges: [Selection Range], // 选择的区域
          $anchor: ResolvedPos, // 锚点,TODO: 具体作用未知
          $head: ResolvedPos, // 头,TODO: 具体作用未知
          anchor: number, // 瞄点的坐标
          head: number, // 选择的头
          from: number,
    }
    

    Prosemirror View
    渲染View
    Prosemirror Model
    常用的模型
    Prosemirror Transactions
    变化

  • 相关阅读:
    Docker入门之二镜像
    巧用Freemarker的自定义方法
    freemarker空值的多种处理方法
    ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别
    Mingyang.net:自定义FreeMarkerView
    hibernate one-to-many many-to-one 双向注解
    Mingyang.net:Controller必需是public吗?
    Mingyang.net:org.springframework.context.annotation.ConflictingBeanDefinitionException
    Mingyang.net:No identifier specified for entity
    jQuery:find()及children()的区别
  • 原文地址:https://www.cnblogs.com/minskiter/p/13863893.html
Copyright © 2020-2023  润新知