1

发布于 2022年 01月 21日 14:27

从 word 复制到 quill 会出现字体字号丢失的情况,而复制到 CKEditor 则正常。行距、段间距则都不保留。

<body>
  <input type="text" id="test" />
  <script>
      document.querySelector('#test').addEventListener('paste', (e) => {
        console.log(e)
        console.table(e.clipboardData)
        e.clipboardData.types.forEach(type => {
          console.log(type, '\n', e.clipboardData.getData(type))
        });
      })
    </script>
</body>

观察 paste 事件,e.clipboardData 即 DataTransfer 对象,可通过 getData(format) 方法获取到储存的数据,format MDN 上只列举了text/plain、text/uri-list,实测存在 text/html 等其他类型,查阅 HTML5 标准,该字段支持所任意符合 plain unicode 的 DOMString (string),一般为 MIME 类型。

观察输出发现通过 e.clipboardData.getData(text/html) 可获取到复制内容的 wordXML 文档。

通过 const doc = new DOMParser().parseFromString(wordXML) 可解析得到 XML Document 对象

流程

Quill

首先触发 onPaste,先操作选中元素

随后进入 setTimeout,执行 convert 将返回值添加至 delta,并更新富文本内容

convert 中 执行 prepareMatching ,通过 traverse 生成 待添加的delta

prepreMatching 过滤了一遍 this.matchers

traverse 中递归生成 delta

traverse

delta 的构造函数

递归到底后进入 matcher

执行 matchText

触发 Delta.prototype.insert

得到 delta

CKEditor

进入这里

解析 xml,修改 e

之后就是一些其他的事件处理以及监听 selection 改变

源码

CKEditor

packages\ckeditor5-paste-from-office

Quill

modules\clipboard.js

推荐文章