From 0f1d97eced204aebfeba594a25bd2b29b496be1a Mon Sep 17 00:00:00 2001 From: Ian Storm Taylor Date: Mon, 16 Dec 2019 15:59:02 -0500 Subject: [PATCH] add `match` option to `Editor.levels` --- .../src/interfaces/editor/queries/element.ts | 6 +-- .../src/interfaces/editor/queries/location.ts | 37 +++++++++++++------ packages/slate/test/queries/levels/match.js | 31 ++++++++++++++++ packages/slate/test/queries/levels/reverse.js | 32 ++++++++++++++++ packages/slate/test/queries/levels/success.js | 27 ++++++++++++++ .../slate/test/queries/levels/voids-false.js | 26 +++++++++++++ .../slate/test/queries/levels/voids-true.js | 32 ++++++++++++++++ 7 files changed, 176 insertions(+), 15 deletions(-) create mode 100644 packages/slate/test/queries/levels/match.js create mode 100644 packages/slate/test/queries/levels/reverse.js create mode 100644 packages/slate/test/queries/levels/success.js create mode 100644 packages/slate/test/queries/levels/voids-false.js create mode 100644 packages/slate/test/queries/levels/voids-true.js diff --git a/packages/slate/src/interfaces/editor/queries/element.ts b/packages/slate/src/interfaces/editor/queries/element.ts index 6d9eaac45..527828a4f 100644 --- a/packages/slate/src/interfaces/editor/queries/element.ts +++ b/packages/slate/src/interfaces/editor/queries/element.ts @@ -6,9 +6,7 @@ export const ElementQueries = { */ hasBlocks(editor: Editor, element: Element): boolean { - return element.children.some( - n => Element.isElement(n) && !editor.isInline(n) - ) + return element.children.some(n => Editor.isBlock(editor, n)) }, /** @@ -17,7 +15,7 @@ export const ElementQueries = { hasInlines(editor: Editor, element: Element): boolean { return element.children.some( - n => Text.isText(n) || (Element.isElement(n) && editor.isInline(n)) + n => Text.isText(n) || Editor.isInline(editor, n) ) }, diff --git a/packages/slate/src/interfaces/editor/queries/location.ts b/packages/slate/src/interfaces/editor/queries/location.ts index 72b1f95b3..42e725ab2 100644 --- a/packages/slate/src/interfaces/editor/queries/location.ts +++ b/packages/slate/src/interfaces/editor/queries/location.ts @@ -29,12 +29,12 @@ export const LocationQueries = { voids?: boolean } = {} ): NodeEntry | undefined { - const { voids = false, mode = 'lowest', at = editor.selection } = options - let { match } = options - - if (!match) { - match = () => true - } + const { + voids = false, + mode = 'lowest', + at = editor.selection, + match, + } = options if (!at) { return @@ -43,8 +43,13 @@ export const LocationQueries = { const path = Editor.path(editor, at) const reverse = mode === 'lowest' - for (const [n, p] of Editor.levels(editor, { at: path, voids, reverse })) { - if (!Text.isText(n) && !Path.equals(path, p) && match(n)) { + for (const [n, p] of Editor.levels(editor, { + at: path, + voids, + match, + reverse, + })) { + if (!Text.isText(n) && !Path.equals(path, p)) { return [n, p] } } @@ -218,24 +223,34 @@ export const LocationQueries = { * Iterate through all of the levels at a location. */ - *levels( + *levels( editor: Editor, options: { at?: Location + match?: NodeMatch reverse?: boolean voids?: boolean } = {} - ): Iterable { + ): Iterable> { const { at = editor.selection, reverse = false, voids = false } = options + let { match } = options + + if (match == null) { + match = () => true + } if (!at) { return } - const levels: NodeEntry[] = [] + const levels: NodeEntry[] = [] const path = Editor.path(editor, at) for (const [n, p] of Node.levels(editor, path)) { + if (!match(n)) { + continue + } + levels.push([n, p]) if (!voids && Editor.isVoid(editor, n)) { diff --git a/packages/slate/test/queries/levels/match.js b/packages/slate/test/queries/levels/match.js new file mode 100644 index 000000000..353815a3a --- /dev/null +++ b/packages/slate/test/queries/levels/match.js @@ -0,0 +1,31 @@ +/** @jsx jsx */ + +import { Editor } from 'slate' +import { jsx } from 'slate-hyperscript' + +export const input = ( + + + + + +) + +export const run = editor => { + return Array.from( + Editor.levels(editor, { + at: [0, 0], + match: n => n.a, + }) + ) +} + +export const output = [ + [ + + + , + [0], + ], + [, [0, 0]], +] diff --git a/packages/slate/test/queries/levels/reverse.js b/packages/slate/test/queries/levels/reverse.js new file mode 100644 index 000000000..7ad183fe2 --- /dev/null +++ b/packages/slate/test/queries/levels/reverse.js @@ -0,0 +1,32 @@ +/** @jsx jsx */ + +import { Editor } from 'slate' +import { jsx } from 'slate-hyperscript' + +export const input = ( + + + + + +) + +export const run = editor => { + return Array.from( + Editor.levels(editor, { + at: [0, 0], + reverse: true, + }) + ) +} + +export const output = [ + [, [0, 0]], + [ + + + , + [0], + ], + [input, []], +] diff --git a/packages/slate/test/queries/levels/success.js b/packages/slate/test/queries/levels/success.js new file mode 100644 index 000000000..24e667154 --- /dev/null +++ b/packages/slate/test/queries/levels/success.js @@ -0,0 +1,27 @@ +/** @jsx jsx */ + +import { Editor } from 'slate' +import { jsx } from 'slate-hyperscript' + +export const input = ( + + + + + +) + +export const run = editor => { + return Array.from(Editor.levels(editor, { at: [0, 0] })) +} + +export const output = [ + [input, []], + [ + + + , + [0], + ], + [, [0, 0]], +] diff --git a/packages/slate/test/queries/levels/voids-false.js b/packages/slate/test/queries/levels/voids-false.js new file mode 100644 index 000000000..54737ada5 --- /dev/null +++ b/packages/slate/test/queries/levels/voids-false.js @@ -0,0 +1,26 @@ +/** @jsx jsx */ + +import { Editor } from 'slate' +import { jsx } from 'slate-hyperscript' + +export const input = ( + + + + + +) + +export const run = editor => { + return Array.from(Editor.levels(editor, { at: [0, 0] })) +} + +export const output = [ + [input, []], + [ + + + , + [0], + ], +] diff --git a/packages/slate/test/queries/levels/voids-true.js b/packages/slate/test/queries/levels/voids-true.js new file mode 100644 index 000000000..0d74380fc --- /dev/null +++ b/packages/slate/test/queries/levels/voids-true.js @@ -0,0 +1,32 @@ +/** @jsx jsx */ + +import { Editor } from 'slate' +import { jsx } from 'slate-hyperscript' + +export const input = ( + + + + + +) + +export const run = editor => { + return Array.from( + Editor.levels(editor, { + at: [0, 0], + voids: true, + }) + ) +} + +export const output = [ + [input, []], + [ + + + , + [0], + ], + [, [0, 0]], +]