diff --git a/packages/slate/src/interfaces/editor/queries/location.ts b/packages/slate/src/interfaces/editor/queries/location.ts
index c5e6fd354..53ac6398c 100644
--- a/packages/slate/src/interfaces/editor/queries/location.ts
+++ b/packages/slate/src/interfaces/editor/queries/location.ts
@@ -345,7 +345,7 @@ export const LocationQueries = {
const universalMarks: Mark[] = []
const distinctMarks: Mark[] = []
- let universalEntries: MarkEntry[] = []
+ const universalEntries: MarkEntry[] = []
let first = true
for (const entry of Editor.texts(editor, { reverse, at })) {
@@ -353,8 +353,16 @@ export const LocationQueries = {
if (mode === 'universal') {
if (first) {
- universalMarks.push(...node.marks)
- universalEntries = node.marks.map((m, i) => [m, i, node, path])
+ for (let i = 0; i < node.marks.length; i++) {
+ const mark = node.marks[i]
+ const markEntry: MarkEntry = [mark, i, node, path]
+
+ if (match == null || Editor.isMarkMatch(editor, markEntry, match)) {
+ universalMarks.push(mark)
+ universalEntries.push(markEntry)
+ }
+ }
+
first = false
continue
}
@@ -370,6 +378,7 @@ export const LocationQueries = {
if (!Mark.exists(existing, node.marks)) {
universalMarks.splice(i, 1)
+ universalEntries.splice(i, 1)
}
}
} else {
diff --git a/packages/slate/test/queries/marks/mode-universal/block-across-intersection.js b/packages/slate/test/queries/marks/mode-universal/block-across-intersection.js
new file mode 100644
index 000000000..15df81adc
--- /dev/null
+++ b/packages/slate/test/queries/marks/mode-universal/block-across-intersection.js
@@ -0,0 +1,29 @@
+/** @jsx jsx */
+
+import { Editor } from 'slate'
+import { jsx } from '../../..'
+
+export const input = (
+
+
+
+ o
+ ne
+
+
+
+
+
+ t
+ wo
+
+
+
+
+)
+
+export const run = editor => {
+ return Array.from(Editor.marks(editor, { mode: 'universal' }), ([m]) => m)
+}
+
+export const output = [{ key: 'a' }]
diff --git a/packages/slate/test/queries/marks/mode-universal/intersection.js b/packages/slate/test/queries/marks/mode-universal/block-intersection.js
similarity index 100%
rename from packages/slate/test/queries/marks/mode-universal/intersection.js
rename to packages/slate/test/queries/marks/mode-universal/block-intersection.js
diff --git a/packages/slate/test/queries/marks/mode-universal/block-multiple-match.js b/packages/slate/test/queries/marks/mode-universal/block-multiple-match.js
new file mode 100644
index 000000000..bb3ccf63a
--- /dev/null
+++ b/packages/slate/test/queries/marks/mode-universal/block-multiple-match.js
@@ -0,0 +1,26 @@
+/** @jsx jsx */
+
+import { Editor } from 'slate'
+import { jsx } from '../../..'
+
+export const input = (
+
+
+
+
+ o
+ ne
+
+
+
+
+)
+
+export const run = editor => {
+ return Array.from(
+ Editor.marks(editor, { match: { key: 'a' }, mode: 'universal' }),
+ ([m]) => m
+ )
+}
+
+export const output = [{ key: 'a' }]
diff --git a/packages/slate/test/queries/marks/mode-universal/multiple.js b/packages/slate/test/queries/marks/mode-universal/block-multiple.js
similarity index 100%
rename from packages/slate/test/queries/marks/mode-universal/multiple.js
rename to packages/slate/test/queries/marks/mode-universal/block-multiple.js
diff --git a/site/examples/hovering-toolbar.js b/site/examples/hovering-toolbar.js
index ec2201cab..ee5a8fd24 100644
--- a/site/examples/hovering-toolbar.js
+++ b/site/examples/hovering-toolbar.js
@@ -57,8 +57,8 @@ const withMarks = editor => {
}
const isMarkActive = (editor, type) => {
- const [mark] = Editor.marks(editor, { match: { type }, mode: 'universal' })
- return !!mark
+ const [match] = Editor.marks(editor, { match: { type }, mode: 'universal' })
+ return !!match
}
const Mark = ({ attributes, children, mark }) => {
diff --git a/site/examples/rich-text.js b/site/examples/rich-text.js
index 49b09865c..fee5e7792 100644
--- a/site/examples/rich-text.js
+++ b/site/examples/rich-text.js
@@ -100,8 +100,8 @@ const withRichText = editor => {
}
const isMarkActive = (editor, type) => {
- const [mark] = Editor.marks(editor, { match: { type }, mode: 'universal' })
- return !!mark
+ const [match] = Editor.marks(editor, { match: { type }, mode: 'universal' })
+ return !!match
}
const isBlockActive = (editor, type) => {