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) => {