diff --git a/package.json b/package.json index 56624a57..fa53cd9d 100644 --- a/package.json +++ b/package.json @@ -176,11 +176,11 @@ "remark-stringify": "^3.0.1", "sanitize-filename": "^1.6.1", "semaphore": "^1.0.5", - "slate": "^0.26.0", - "slate-edit-list": "^0.8.0", - "slate-edit-table": "^0.11.0", - "slate-plain-serializer": "^0.1.10", - "slate-react": "^0.3.0", + "slate": "^0.27.0", + "slate-edit-list": "^0.9.0", + "slate-edit-table": "^0.12.0", + "slate-plain-serializer": "^0.2.0", + "slate-react": "^0.4.0", "slate-soft-break": "^0.4.0", "slug": "^0.9.1", "toml-j0.4": "^1.1.1", diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/keys.js b/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/keys.js index aa500dc1..c0d72aaf 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/keys.js +++ b/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/keys.js @@ -44,12 +44,12 @@ function onKeyDown(e, data, change) { /** * If "Enter" is pressed while a single void block is selected, a new * paragraph should be added above or below it, and the current selection - * should be collapsed to the start of the new paragraph. + * (range) should be collapsed to the start of the new paragraph. * * If the selected block is the first block in the document, create the * new block above it. If not, create the new block below it. */ - const { document: doc, selection, anchorBlock, focusBlock } = change.state; + const { document: doc, range, anchorBlock, focusBlock } = change.state; const singleBlockSelected = anchorBlock === focusBlock; if (!singleBlockSelected || !focusBlock.isVoid) return; diff --git a/src/components/Widgets/Markdown/serializers/remarkSlate.js b/src/components/Widgets/Markdown/serializers/remarkSlate.js index 210bc13c..4e0c2ddf 100644 --- a/src/components/Widgets/Markdown/serializers/remarkSlate.js +++ b/src/components/Widgets/Markdown/serializers/remarkSlate.js @@ -94,8 +94,8 @@ function createInline(type, props = {}, nodes) { */ function createText(value, data) { const node = { kind: 'text', data }; - const ranges = isArray(value) ? value : [{ text: value }]; - return { ...node, ranges }; + const leaves = isArray(value) ? value : [{ text: value }]; + return { ...node, leaves }; } function processMarkNode(node, parentMarks = []) { @@ -110,8 +110,8 @@ function processMarkNode(node, parentMarks = []) { switch (childNode.type) { /** * If a text node is a direct child of the current node, it should be - * set aside as a range, and all marks that have been collected in the - * `marks` array should apply to that specific range. + * set aside as a leaf, and all marks that have been collected in the + * `marks` array should apply to that specific leaf. */ case 'html': case 'text': @@ -129,8 +129,8 @@ function processMarkNode(node, parentMarks = []) { /** * Process nested style nodes. The recursive results should be pushed into - * the ranges array. This way, every MDAST nested text structure becomes a - * flat array of ranges that can serve as the value of a single Slate Raw + * the leaves array. This way, every MDAST nested text structure becomes a + * flat array of leaves that can serve as the value of a single Slate Raw * text node. */ case 'strong': @@ -155,8 +155,8 @@ function convertMarkNode(node) { const convertedSlateNodes = slateNodes.reduce((acc, node) => { const lastConvertedNode = last(acc); - if (node.text && lastConvertedNode && lastConvertedNode.ranges) { - lastConvertedNode.ranges.push(node); + if (node.text && lastConvertedNode && lastConvertedNode.leaves) { + lastConvertedNode.leaves.push(node); } else if (node.text) { acc.push(createText([node])); @@ -232,16 +232,16 @@ function convertNode(node, nodes) { * Inline Code * * Inline code nodes from an MDAST are represented in our Slate schema as - * text nodes with a "code" mark. We manually create the "range" containing + * text nodes with a "code" mark. We manually create the "leaf" containing * the inline code value and a "code" mark, and place it in an array for use * as a Slate text node's children array. */ case 'inlineCode': { - const range = { + const leaf = { text: node.value, marks: [{ type: 'code' }], }; - return createText([ range ]); + return createText([ leaf ]); } /** diff --git a/src/components/Widgets/Markdown/serializers/slateRemark.js b/src/components/Widgets/Markdown/serializers/slateRemark.js index fc59af73..a4e6c0de 100644 --- a/src/components/Widgets/Markdown/serializers/slateRemark.js +++ b/src/components/Widgets/Markdown/serializers/slateRemark.js @@ -85,7 +85,7 @@ function transform(node) { /** - * Includes inline nodes as ranges in adjacent text nodes where appropriate, so + * Includes inline nodes as leaves in adjacent text nodes where appropriate, so * that mark node combining logic can apply to both text and inline nodes. This * is necessary because Slate doesn't allow inline nodes to have marks while * inline nodes in MDAST may be nested within mark nodes. Treating them as if @@ -94,23 +94,23 @@ function transform(node) { function combineTextAndInline(nodes) { return nodes.reduce((acc, node, idx, nodes) => { const prevNode = last(acc); - const prevNodeRanges = get(prevNode, 'ranges'); + const prevNodeLeaves = get(prevNode, 'leaves'); const data = node.data || {}; /** - * If the previous node has ranges and the current node has marks in data + * If the previous node has leaves and the current node has marks in data * (only happens when we place them on inline nodes here in the parser), or - * the current node also has ranges (because the previous node was - * originally an inline node that we've already squashed into a range) + * the current node also has leaves (because the previous node was + * originally an inline node that we've already squashed into a leaf) * combine the current node into the previous. */ - if (!isEmpty(prevNodeRanges) && !isEmpty(data.marks)) { - prevNodeRanges.push({ node, marks: data.marks }); + if (!isEmpty(prevNodeLeaves) && !isEmpty(data.marks)) { + prevNodeLeaves.push({ node, marks: data.marks }); return acc; } - if (!isEmpty(prevNodeRanges) && !isEmpty(node.ranges)) { - prevNode.ranges = prevNodeRanges.concat(node.ranges); + if (!isEmpty(prevNodeLeaves) && !isEmpty(node.leaves)) { + prevNode.leaves = prevNodeLeaves.concat(node.leaves); return acc; } @@ -125,10 +125,10 @@ function combineTextAndInline(nodes) { } /** - * Convert remaining inline nodes to standalone text nodes with ranges. + * Convert remaining inline nodes to standalone text nodes with leaves. */ if (node.kind === 'inline') { - acc.push({ kind: 'text', ranges: [{ node, marks: data.marks }] }); + acc.push({ kind: 'text', leaves: [{ node, marks: data.marks }] }); return acc; } @@ -177,23 +177,23 @@ function wrapTextWithMarks(textNode, markTypes) { * Slate text nodes without marks often simply have a "text" property with * the value. In this case the conversion to MDAST is simple. If a Slate * text node does not have a "text" property, it will instead have a - * "ranges" property containing an array of objects, each with an array of + * "leaves" property containing an array of objects, each with an array of * marks, such as "bold" or "italic", along with a "text" property. * * MDAST instead expresses such marks in a nested structure, with individual * nodes for each mark type nested until the deepest mark node, which will * contain the text node. * - * To convert a Slate text node's marks to MDAST, we treat each "range" as a + * To convert a Slate text node's marks to MDAST, we treat each "leaf" as a * separate text node, convert the text node itself to an MDAST text node, * and then recursively wrap the text node for each mark, collecting the results - * of each range in a single array of child nodes. + * of each leaf in a single array of child nodes. * * For example, this Slate text node: * * { * kind: 'text', - * ranges: [ + * leaves: [ * { * text: 'test', * marks: ['bold', 'italic'] @@ -228,13 +228,13 @@ function wrapTextWithMarks(textNode, markTypes) { */ function convertTextNode(node) { /** - * If the Slate text node has a "ranges" property, translate the Slate AST to + * If the Slate text node has a "leaves" property, translate the Slate AST to * a nested MDAST structure. Otherwise, just return an equivalent MDAST text * node. */ - if (node.ranges) { - const processedRanges = node.ranges.map(processRanges); - const condensedNodes = processedRanges.reduce(condenseNodesReducer, { nodes: [] }); + if (node.leaves) { + const processedLeaves = node.leaves.map(processLeaves); + const condensedNodes = processedLeaves.reduce(condenseNodesReducer, { nodes: [] }); return condensedNodes.nodes; } @@ -247,17 +247,17 @@ function convertTextNode(node) { /** - * Process Slate node ranges in preparation for MDAST transformation. + * Process Slate node leaves in preparation for MDAST transformation. */ -function processRanges(range) { +function processLeaves(leaves) { /** * Get an array of the mark types, converted to their MDAST equivalent * types. */ - const { marks = [], text } = range; + const { marks = [], text } = leaf; const markTypes = marks.map(mark => markMap[mark.type]); - if (typeof range.text === 'string') { + if (typeof leaf.text === 'string') { /** * Code marks must be removed from the marks array, and the presence of a * code mark changes the text node type that should be used. @@ -266,14 +266,14 @@ function processRanges(range) { return { text, marks: filteredMarkTypes, textNodeType }; } - return { node: range.node, marks: markTypes }; + return { node: leaf.node, marks: markTypes }; } /** * Slate's AST doesn't group adjacent text nodes with the same marks - a * change in marks from letter to letter, even if some are in common, results - * in a separate range. For example, given "**a_b_**", transformation to and + * in a separate leaf. For example, given "**a_b_**", transformation to and * from Slate's AST will result in "**a****_b_**". * * MDAST treats styling entities as distinct nodes that contain children, so a @@ -436,7 +436,7 @@ function convertNode(node, children, shortcodePlugins) { */ case 'code': { const value = flatMap(node.nodes, child => { - return flatMap(child.ranges, 'text'); + return flatMap(child.leaves, 'text'); }).join(''); const { lang, ...data } = get(node, 'data', {}); return u(typeMap[node.type], { lang, data }, value); diff --git a/yarn.lock b/yarn.lock index e6ced25a..89fa8656 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8521,49 +8521,39 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" -slate-base64-serializer@^0.1.13: +slate-base64-serializer@^0.1.14: version "0.1.22" resolved "https://registry.yarnpkg.com/slate-base64-serializer/-/slate-base64-serializer-0.1.22.tgz#548e589178c75653004168004aad152f1976dd35" dependencies: isomorphic-base64 "^1.0.2" -slate-dev-logger@^0.1.11: - version "0.1.11" - resolved "https://registry.yarnpkg.com/slate-dev-logger/-/slate-dev-logger-0.1.11.tgz#740fd2e23b1dda1f4629419fc914eea91272b6f0" - -slate-dev-logger@^0.1.14: +slate-dev-logger@^0.1.15, slate-dev-logger@^0.1.20, slate-dev-logger@^0.1.23: version "0.1.33" resolved "https://registry.yarnpkg.com/slate-dev-logger/-/slate-dev-logger-0.1.33.tgz#b4a4272255c2d598e5f26db5d85c58435357755f" -slate-edit-list@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/slate-edit-list/-/slate-edit-list-0.8.0.tgz#3f8904fc9cb308d3c614efa5586953a6de6a4608" +slate-edit-list@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/slate-edit-list/-/slate-edit-list-0.9.0.tgz#18fdeb8e6f4068da88a05aa0cb499a191d8343e6" -slate-edit-table@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/slate-edit-table/-/slate-edit-table-0.11.0.tgz#4ab175a02146ec1c45a4a2826eaa66b5db0d2266" +slate-edit-table@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/slate-edit-table/-/slate-edit-table-0.12.0.tgz#9163e67b8025c3c09d6037eb76cb5e652b65dd47" -slate-plain-serializer@^0.1.10: - version "0.1.11" - resolved "https://registry.yarnpkg.com/slate-plain-serializer/-/slate-plain-serializer-0.1.11.tgz#0b70cd870a935b294d6418785084be33ae23b96e" +slate-plain-serializer@^0.2.0: + version "0.2.8" + resolved "https://registry.yarnpkg.com/slate-plain-serializer/-/slate-plain-serializer-0.2.8.tgz#9bff5fafa09ab2ad47d961820f09d7d2abcb20a9" dependencies: - slate-dev-logger "^0.1.11" + slate-dev-logger "^0.1.23" -slate-plain-serializer@^0.1.14: - version "0.1.14" - resolved "https://registry.yarnpkg.com/slate-plain-serializer/-/slate-plain-serializer-0.1.14.tgz#19f6cd9a47d2e7db93d928a8adae10ceb779e743" +slate-prop-types@^0.2.0: + version "0.2.8" + resolved "https://registry.yarnpkg.com/slate-prop-types/-/slate-prop-types-0.2.8.tgz#2d0e1df0a372c635068c6f74a52b567b996f51c2" dependencies: - slate-dev-logger "^0.1.14" + slate-dev-logger "^0.1.23" -slate-prop-types@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/slate-prop-types/-/slate-prop-types-0.1.13.tgz#2045d73b12a2fe7205bd6e8792ff1c5b06420fef" - dependencies: - slate-dev-logger "^0.1.14" - -slate-react@^0.3.0: - version "0.3.4" - resolved "https://registry.yarnpkg.com/slate-react/-/slate-react-0.3.4.tgz#45b34e1909cd86651b718d0d3bb1e35654259e89" +slate-react@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/slate-react/-/slate-react-0.4.0.tgz#e15c9034df5ea58fcb8a0c49c1cd159702296e0c" dependencies: debug "^2.3.2" get-window "^1.1.1" @@ -8574,18 +8564,18 @@ slate-react@^0.3.0: react-immutable-proptypes "^2.1.0" react-portal "^3.1.0" selection-is-backward "^1.0.0" - slate-base64-serializer "^0.1.13" - slate-dev-logger "^0.1.14" - slate-plain-serializer "^0.1.14" - slate-prop-types "^0.1.13" + slate-base64-serializer "^0.1.14" + slate-dev-logger "^0.1.15" + slate-plain-serializer "^0.2.0" + slate-prop-types "^0.2.0" slate-soft-break@^0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/slate-soft-break/-/slate-soft-break-0.4.3.tgz#e3a9279a9b92ca173915467f5fbd359f739a7e96" -slate@^0.26.0: - version "0.26.1" - resolved "https://registry.yarnpkg.com/slate/-/slate-0.26.1.tgz#3f71712b2f5eb30934caebd199d93acc0b11a458" +slate@^0.27.0: + version "0.27.5" + resolved "https://registry.yarnpkg.com/slate/-/slate-0.27.5.tgz#ab9d9f35e03f1910c59016ad66ee685255b5a645" dependencies: debug "^2.3.2" direction "^0.1.5" @@ -8594,7 +8584,7 @@ slate@^0.26.0: is-empty "^1.0.0" is-plain-object "^2.0.4" lodash "^4.17.4" - slate-dev-logger "^0.1.14" + slate-dev-logger "^0.1.20" type-of "^2.0.1" slice-ansi@0.0.4: