NoteDeep

handlePastedText

handlePastedText?: (text: string, html?: string, editorState: EditorState) => DraftHandleValue
Handle text and html(for rich text) that has been pasted directly into the editor. Returning true will prevent the default paste behavior.

问题一:DraftHandleValue是什么东西 ?





src/component/base/DraftEditor.react.js

这是源码中editor组件。
可以看到引用了
const DraftEditorEditHandler = require('DraftEditorEditHandler');
handlerMap.edit = DraftEditorEditHandler;

在constructor中有
this._onPaste = this._buildHandler('onPaste');

_buildHandler(eventName: string): Function { return (e) => { if (!this.props.readOnly) { const method = this._handler && this._handler[eventName]; method && method(this, e); } }; }


componentDidMount(): void { this.setMode('edit');

_setMode(mode: DraftEditorModes): void { this._handler = handlerMap[mode]; }


editor也就是一个div,上面绑定了一个onPaste事件
onPaste={this._onPaste}


src/component/handlers/edit/DraftEditorEditHandler.js


所以,onPaste实际上交给了editOnPaste函数去处理,而且参数分别是 Editor 和 e(粘贴事件)
'use strict'; const onPaste = require('editOnPaste'); const DraftEditorEditHandler = { onPaste, }; module.exports = DraftEditorEditHandler;


src/component/handlers/edit/editOnPaste.js

这里是真正处理粘贴的逻辑
暂时只考虑是富文本的情况。

有一个internalClipboard的概念,也就是在自己的编辑器内部 复制或者剪切,都会把内容先设置到内部的editor._clipboard里面去。

const internalClipboard = editor.getClipboard();

editor.editorKey 会随机生成,不传的话。
每一个block上的data-editor属性其实就是editorKey

粘贴时,我们要判断是否是来自内部的。
1、如果粘贴时的html内容,带有editorKey,说明肯定是来自内部的。
只有粘贴一整行或以上时才会出现这种情况
2、如果粘贴内容没有editorKey,有两种可能,一是来自内部但是不到一整行,二是来自外部。
则需要和内部的internalClipboard中的text内容比较。如果相同,我们还是认为来自内部。

如果来自内部,我们就直接把之前setClipboard设置进去的internalClipboard粘贴出来即可,这样可以完美地保留之前的样式。

如果来自外部,而且是html,那么就会走DraftPasteProcessor.processHTML处理。
最终还是使用了 src/model/encoding/convertFromHTMLToContentBlocks.js


如果是纯字符串,就走DraftPasteProcessor.processText处理。


看到这里,我发现。draftJs复制粘贴外部的内容,本质上是通过这个convertFromHTMLToContentBlocks,把外部的html转化成blocks。所以,我需要调试这段代码,看下究竟是如何转化的(从html到blocks)

convertFromHTMLToContentBlocks

要调试这个,必须要先弄清。nextjs 中跑 npm run dev时,运行的node server.js的原理是什么,做了哪些工作。是如何把draftjs模块引入进去的。








评论列表

    handlePastedText
    src/component/base/DraftEditor.react.js
    src/component/handlers/edit/DraftEditorEditHandler.js
    src/component/handlers/edit/editOnPaste.js
    convertFromHTMLToContentBlocks