fix: Sogou input method Chinese status input @ will have one more

This commit is contained in:
yanmao 2021-12-24 23:02:20 +08:00
parent fac805f660
commit cde08ab3ea
4 changed files with 34 additions and 5 deletions

View File

@ -26,6 +26,7 @@ class ChangeEvent implements ChangeEventInterface {
private dragoverHelper: DragoverHelper;
private options: ChangeEventOptions;
private keydownRange: RangeInterface | null = null;
private inputAtBeforeText = '';
constructor(engine: EngineInterface, options: ChangeEventOptions = {}) {
this.engine = engine;
@ -103,15 +104,26 @@ class ChangeEvent implements ChangeEventInterface {
this.onContainer('beforeinput', (event: InputEvent) => {
if (this.engine.readonly) return;
// safari 组合输入法会直接插入@字符,这里统一全部拦截输入@字符的时候再去触发@事件
const { change, card, node, block, list } = this.engine;
if (event.data === '@') {
const { startNode } = change.range.get();
// 搜狗这种输入法中文状态下会触发两次第二次的text是单独的@节点
const text = startNode.text();
let isHandleAt = false;
if (startNode.isText()) {
if (this.inputAtBeforeText !== text && text === '@') {
event.preventDefault();
isHandleAt = true;
}
}
// 如果没有要对 @ 字符处理的就不拦截
const result = this.engine.trigger('keydown:at', event);
const result = !isHandleAt
? this.engine.trigger('keydown:at', event)
: true;
if (result === false) {
event.preventDefault();
return;
}
}
const { change, card, node, block, list } = this.engine;
if (!change.rangePathBeforeCommand)
change.cacheRangeBeforeCommand();
const sourceRange = change.range.get();
@ -286,8 +298,21 @@ class ChangeEvent implements ChangeEventInterface {
return callback(e);
}, 10);
});
this.onContainer('keydown', () => {
this.onContainer('keydown', (event: KeyboardEvent) => {
const range = Range.from(this.engine);
if (
range &&
(event.key === '@' ||
(event.shiftKey &&
event.keyCode === 229 &&
event.code === 'Digit2'))
) {
const { startNode } = range;
if (startNode.isText()) {
const text = startNode.text();
this.inputAtBeforeText = text;
}
}
this.keydownRange = range;
});
// 补齐通过键盘选中的情况

View File

@ -899,6 +899,7 @@ class Mark implements MarkModelInterface {
mark,
);
} else {
targetChild = nodeApi.wrap(targetChild, cloneMark);
nodeApi.wrap(targetChild, mark);
}
});

View File

@ -1,8 +1,10 @@
import { isMobile } from '../../utils';
import Default from './default';
class At extends Default {
hotkey = (event: KeyboardEvent) =>
event.key === '@' ||
(event.shiftKey && event.keyCode === 229 && event.code === 'Digit2');
(event.shiftKey && event.keyCode === 229 && event.code === 'Digit2') ||
(isMobile && event.keyCode === 229);
}
export default At;

View File

@ -402,6 +402,7 @@ class Mention<T extends MentionValue = MentionValue> extends Card<T> {
setTimeout(() => {
if (isEngine(this.editor)) {
const range = this.editor.change.range.get();
this.#keyword = this.#container?.eq(0);
range.select(this.#keyword!, true).collapse(false);
const selection = window.getSelection();
selection?.removeAllRanges();