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