mirror of
https://github.com/ianstormtaylor/slate.git
synced 2025-08-12 10:14:02 +02:00
Perf get blocks (#678)
* improve perf of getBlocks and getInlines * add getBlocksByType, getInlinesByType, fix getMarksByType
This commit is contained in:
10
benchmark/fixtures/models/get-blocks/index.js
Normal file
10
benchmark/fixtures/models/get-blocks/index.js
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
import { __clear } from '../../../../lib/utils/memoize'
|
||||
|
||||
export default function (state) {
|
||||
state.document.getBlocks()
|
||||
}
|
||||
|
||||
export function after() {
|
||||
__clear()
|
||||
}
|
683
benchmark/fixtures/models/get-blocks/input.yaml
Normal file
683
benchmark/fixtures/models/get-blocks/input.yaml
Normal file
@@ -0,0 +1,683 @@
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
key: _cursor_
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
10
benchmark/fixtures/models/get-inlines/index.js
Normal file
10
benchmark/fixtures/models/get-inlines/index.js
Normal file
@@ -0,0 +1,10 @@
|
||||
|
||||
import { __clear } from '../../../../lib/utils/memoize'
|
||||
|
||||
export default function (state) {
|
||||
state.document.getInlines()
|
||||
}
|
||||
|
||||
export function after() {
|
||||
__clear()
|
||||
}
|
683
benchmark/fixtures/models/get-inlines/input.yaml
Normal file
683
benchmark/fixtures/models/get-inlines/input.yaml
Normal file
@@ -0,0 +1,683 @@
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
key: _cursor_
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'This is editable '
|
||||
- text: 'rich'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ' text, '
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'much'
|
||||
marks:
|
||||
- type: italic
|
||||
- text: ' better than a '
|
||||
- text: '<textarea>'
|
||||
marks:
|
||||
- type: code
|
||||
- text: '!'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
ranges:
|
||||
- text: 'Since it''s rich text, you can do things like turn a selection of text '
|
||||
- text: 'bold'
|
||||
marks:
|
||||
- type: bold
|
||||
- text: ', or add a semantically rendered block quote in the middle of the page,
|
||||
like this:'
|
||||
- kind: block
|
||||
type: block-quote
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'A wise quote.'
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
text: 'Try it out for yourself!'
|
@@ -208,22 +208,22 @@ const Node = {
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the closest block nodes for each text node in the node.
|
||||
* Get the leaf block descendants of the node.
|
||||
*
|
||||
* @return {List<Node>}
|
||||
*/
|
||||
|
||||
getBlocks() {
|
||||
return this
|
||||
.getTexts()
|
||||
.map(text => this.getClosestBlock(text.key))
|
||||
// Eliminate duplicates by converting to a `Set` first.
|
||||
.toOrderedSet()
|
||||
.toList()
|
||||
return this.nodes.reduce((blocks, node) => {
|
||||
if (node.kind != 'block') return blocks
|
||||
return node.isLeafBlock()
|
||||
? blocks.push(node)
|
||||
: blocks.concat(node.getBlocks())
|
||||
}, new List())
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the closest block nodes for each text node in a `range`.
|
||||
* Get the leaf block descendants in a `range`.
|
||||
*
|
||||
* @param {Selection} range
|
||||
* @return {List<Node>}
|
||||
@@ -238,6 +238,21 @@ const Node = {
|
||||
.toList()
|
||||
},
|
||||
|
||||
/**
|
||||
* Get all of the leaf blocks that match a `type`.
|
||||
*
|
||||
* @param {String} type
|
||||
* @return {List<Node>}
|
||||
*/
|
||||
|
||||
getBlocksByType(type) {
|
||||
return this.nodes.reduce((blocks, node) => {
|
||||
if (node.kind != 'block') return blocks
|
||||
if (node.isLeafBlock() && node.type == type) return blocks.push(node)
|
||||
return blocks.concat(node.getBlocksByType(type))
|
||||
}, new List())
|
||||
},
|
||||
|
||||
/**
|
||||
* Get all of the characters for every text node.
|
||||
*
|
||||
@@ -620,12 +635,12 @@ const Node = {
|
||||
*/
|
||||
|
||||
getInlines() {
|
||||
return this
|
||||
.getTexts()
|
||||
.map(text => this.getClosestInline(text.key))
|
||||
.filter(exists => exists)
|
||||
.toOrderedSet()
|
||||
.toList()
|
||||
return this.nodes.reduce((inlines, node) => {
|
||||
if (node.kind == 'text') return inlines
|
||||
return node.isLeafInline()
|
||||
? inlines.push(node)
|
||||
: inlines.concat(node.getInlines())
|
||||
}, new List())
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -644,6 +659,21 @@ const Node = {
|
||||
.toList()
|
||||
},
|
||||
|
||||
/**
|
||||
* Get all of the leaf inline nodes that match a `type`.
|
||||
*
|
||||
* @param {String} type
|
||||
* @return {List<Node>}
|
||||
*/
|
||||
|
||||
getInlinesByType(type) {
|
||||
return this.nodes.reduce((inlines, node) => {
|
||||
if (node.kind == 'text') return inlines
|
||||
if (node.isLeafInline() && node.type == type) return inlines.push(node)
|
||||
return inlines.concat(node.getInlinesByType(type))
|
||||
}, new List())
|
||||
},
|
||||
|
||||
/**
|
||||
* Return a set of all keys in the node.
|
||||
*
|
||||
@@ -732,8 +762,8 @@ const Node = {
|
||||
getMarksByType(type) {
|
||||
return this.nodes.reduce((marks, node) => {
|
||||
return node.kind == 'text'
|
||||
? node.getMarks().filter(m => m.type == type)
|
||||
: node.getMarksByType(type)
|
||||
? marks.union(node.getMarks().filter(m => m.type == type))
|
||||
: marks.union(node.getMarksByType(type))
|
||||
}, new OrderedSet())
|
||||
},
|
||||
|
||||
@@ -1109,6 +1139,32 @@ const Node = {
|
||||
return this.merge({ nodes })
|
||||
},
|
||||
|
||||
/**
|
||||
* Check whether the node is a leaf block.
|
||||
*
|
||||
* @return {Boolean}
|
||||
*/
|
||||
|
||||
isLeafBlock() {
|
||||
return (
|
||||
this.kind == 'block' &&
|
||||
this.nodes.every(n => n.kind != 'block')
|
||||
)
|
||||
},
|
||||
|
||||
/**
|
||||
* Check whether the node is a leaf inline.
|
||||
*
|
||||
* @return {Boolean}
|
||||
*/
|
||||
|
||||
isLeafInline() {
|
||||
return (
|
||||
this.kind == 'inline' &&
|
||||
this.nodes.every(n => n.kind != 'inline')
|
||||
)
|
||||
},
|
||||
|
||||
/**
|
||||
* Join a children node `first` with another children node `second`.
|
||||
* `first` and `second` will be concatenated in that order.
|
||||
@@ -1565,6 +1621,7 @@ memoize(Node, [
|
||||
'getAncestors',
|
||||
'getBlocks',
|
||||
'getBlocksAtRange',
|
||||
'getBlocksByType',
|
||||
'getCharacters',
|
||||
'getCharactersAtRange',
|
||||
'getChild',
|
||||
@@ -1589,10 +1646,12 @@ memoize(Node, [
|
||||
'getFurthestOnlyChildAncestor',
|
||||
'getInlines',
|
||||
'getInlinesAtRange',
|
||||
'getInlinesByType',
|
||||
'getKeys',
|
||||
'getLastText',
|
||||
'getMarks',
|
||||
'getMarksAtRange',
|
||||
'getMarksByType',
|
||||
'getNextBlock',
|
||||
'getNextSibling',
|
||||
'getNextText',
|
||||
@@ -1614,6 +1673,8 @@ memoize(Node, [
|
||||
'hasNode',
|
||||
'hasVoidParent',
|
||||
'isInlineSplitAtRange',
|
||||
'isLeafBlock',
|
||||
'isLeafInline',
|
||||
'validate',
|
||||
])
|
||||
|
||||
|
Reference in New Issue
Block a user