1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-20 06:01:24 +02:00

marks on double click selection using firefox fix (#5580)

* fixed: marks on double click selection using firefox

* adding changeset

* minor -> patch

* removing useless platform check

* yarn fix

* Add test

---------

Co-authored-by: Joe Anderson <joe@mousetrapped.co.uk>
This commit is contained in:
Théo Daron
2023-12-13 01:44:44 +01:00
committed by GitHub
parent bf5a4abbe9
commit a374895b32
3 changed files with 55 additions and 2 deletions

View File

@@ -0,0 +1,5 @@
---
'slate': patch
---
Fix firefox double-click marks issue

View File

@@ -4,6 +4,7 @@ import { Range } from '../interfaces/range'
import { Path } from '../interfaces/path' import { Path } from '../interfaces/path'
import { Text } from '../interfaces/text' import { Text } from '../interfaces/text'
import { Element } from '../interfaces/element' import { Element } from '../interfaces/element'
import { Point } from '../interfaces'
export const marks: EditorInterface['marks'] = (editor, options = {}) => { export const marks: EditorInterface['marks'] = (editor, options = {}) => {
const { marks, selection } = editor const { marks, selection } = editor
@@ -11,13 +12,32 @@ export const marks: EditorInterface['marks'] = (editor, options = {}) => {
if (!selection) { if (!selection) {
return null return null
} }
let { anchor, focus } = selection
if (marks) { if (marks) {
return marks return marks
} }
if (Range.isExpanded(selection)) { if (Range.isExpanded(selection)) {
const [match] = Editor.nodes(editor, { match: Text.isText }) /**
* COMPAT: Make sure hanging ranges (caused by double clicking in Firefox)
* do not adversely affect the returned marks.
*/
const isEnd = Editor.isEnd(editor, anchor, anchor.path)
if (isEnd) {
const after = Editor.after(editor, anchor as Point)
if (after) {
anchor = after
}
}
const [match] = Editor.nodes(editor, {
match: Text.isText,
at: {
anchor,
focus,
},
})
if (match) { if (match) {
const [node] = match as NodeEntry<Text> const [node] = match as NodeEntry<Text>
@@ -28,8 +48,8 @@ export const marks: EditorInterface['marks'] = (editor, options = {}) => {
} }
} }
const { anchor } = selection
const { path } = anchor const { path } = anchor
let [node] = Editor.leaf(editor, path) let [node] = Editor.leaf(editor, path)
if (anchor.offset === 0) { if (anchor.offset === 0) {

View File

@@ -0,0 +1,28 @@
/** @jsx jsx */
import { Editor } from 'slate'
import { jsx } from '../../..'
/**
* This test verifies that when double clicking a marked word in Firefox,
* Editor.marks for the resulting selection includes the marked word. Double
* clicking a marked word in Firefox results in a selection that starts at the
* end of the previous text node and ends at the end of the marked text node.
*/
export const input = (
<editor>
<block>
plain <anchor />
<text bold>
bold
<focus />
</text>
<text> plain</text>
</block>
<block>block two</block>
</editor>
)
export const test = editor => {
return Editor.marks(editor)
}
export const output = { bold: true }