@lexical/code 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LexicalCode.dev.js +27 -10
- package/LexicalCode.prod.js +24 -24
- package/package.json +3 -3
package/LexicalCode.dev.js
CHANGED
|
@@ -412,13 +412,15 @@ function $isCodeNode(node) {
|
|
|
412
412
|
|
|
413
413
|
function convertPreElement(domNode) {
|
|
414
414
|
return {
|
|
415
|
-
node: $createCodeNode()
|
|
415
|
+
node: $createCodeNode(),
|
|
416
|
+
preformatted: true
|
|
416
417
|
};
|
|
417
418
|
}
|
|
418
419
|
|
|
419
420
|
function convertDivElement(domNode) {
|
|
420
421
|
// domNode is a <div> since we matched it by nodeName
|
|
421
422
|
const div = domNode;
|
|
423
|
+
const isCode = isCodeElement(div);
|
|
422
424
|
return {
|
|
423
425
|
after: childLexicalNodes => {
|
|
424
426
|
const domParent = domNode.parentNode;
|
|
@@ -429,13 +431,15 @@ function convertDivElement(domNode) {
|
|
|
429
431
|
|
|
430
432
|
return childLexicalNodes;
|
|
431
433
|
},
|
|
432
|
-
node:
|
|
434
|
+
node: isCode ? $createCodeNode() : null,
|
|
435
|
+
preformatted: isCode
|
|
433
436
|
};
|
|
434
437
|
}
|
|
435
438
|
|
|
436
439
|
function convertTableElement() {
|
|
437
440
|
return {
|
|
438
|
-
node: $createCodeNode()
|
|
441
|
+
node: $createCodeNode(),
|
|
442
|
+
preformatted: true
|
|
439
443
|
};
|
|
440
444
|
}
|
|
441
445
|
|
|
@@ -678,17 +682,24 @@ function codeNodeTransform(node, editor) {
|
|
|
678
682
|
|
|
679
683
|
if (node.getLanguage() === undefined) {
|
|
680
684
|
node.setLanguage(DEFAULT_CODE_LANGUAGE);
|
|
681
|
-
}
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
const nodeKey = node.getKey(); // Using nested update call to pass `skipTransforms` since we don't want
|
|
682
688
|
// each individual codehighlight node to be transformed again as it's already
|
|
683
689
|
// in its final state
|
|
684
690
|
|
|
685
|
-
|
|
686
691
|
editor.update(() => {
|
|
687
|
-
updateAndRetainSelection(
|
|
688
|
-
const
|
|
689
|
-
|
|
692
|
+
updateAndRetainSelection(nodeKey, () => {
|
|
693
|
+
const currentNode = lexical.$getNodeByKey(nodeKey);
|
|
694
|
+
|
|
695
|
+
if (!$isCodeNode(currentNode) || !currentNode.isAttached()) {
|
|
696
|
+
return false;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
const code = currentNode.getTextContent();
|
|
700
|
+
const tokens = Prism.tokenize(code, Prism.languages[currentNode.getLanguage() || ''] || Prism.languages[DEFAULT_CODE_LANGUAGE]);
|
|
690
701
|
const highlightNodes = getHighlightNodes(tokens);
|
|
691
|
-
const diffRange = getDiffRange(
|
|
702
|
+
const diffRange = getDiffRange(currentNode.getChildren(), highlightNodes);
|
|
692
703
|
const {
|
|
693
704
|
from,
|
|
694
705
|
to,
|
|
@@ -746,7 +757,13 @@ function getHighlightNodes(tokens) {
|
|
|
746
757
|
// position as before.
|
|
747
758
|
|
|
748
759
|
|
|
749
|
-
function updateAndRetainSelection(
|
|
760
|
+
function updateAndRetainSelection(nodeKey, updateFn) {
|
|
761
|
+
const node = lexical.$getNodeByKey(nodeKey);
|
|
762
|
+
|
|
763
|
+
if (!$isCodeNode(node) || !node.isAttached()) {
|
|
764
|
+
return;
|
|
765
|
+
}
|
|
766
|
+
|
|
750
767
|
const selection = lexical.$getSelection(); // If it's not range selection (or null selection) there's no need to change it,
|
|
751
768
|
// but we can still run highlighting logic
|
|
752
769
|
|
package/LexicalCode.prod.js
CHANGED
|
@@ -5,28 +5,28 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
'use strict';var e=require("prismjs");require("prismjs/components/prism-clike");require("prismjs/components/prism-javascript");require("prismjs/components/prism-markup");require("prismjs/components/prism-markdown");require("prismjs/components/prism-c");require("prismjs/components/prism-css");require("prismjs/components/prism-objectivec");require("prismjs/components/prism-sql");require("prismjs/components/prism-python");require("prismjs/components/prism-rust");require("prismjs/components/prism-swift");
|
|
8
|
-
var m=require("@lexical/utils"),
|
|
9
|
-
class
|
|
10
|
-
a),c&&m.addClassNamesToElement(b,c));return d}static importJSON(a){let b=
|
|
11
|
-
function D(a){let b=null,c=a.getPreviousSiblings();for(c.push(a);0<c.length&&(a=c.pop(),C(a)&&(b=a),!
|
|
12
|
-
class G extends
|
|
8
|
+
var m=require("@lexical/utils"),t=require("lexical");let u={c:"C",clike:"C-like",css:"CSS",html:"HTML",js:"JavaScript",markdown:"Markdown",objc:"Objective-C",plain:"Plain Text",py:"Python",rust:"Rust",sql:"SQL",swift:"Swift",xml:"XML"},v={javascript:"js",md:"markdown",plaintext:"plain",python:"py",text:"plain"};function w(a){return v[a]||a}
|
|
9
|
+
class z extends t.TextNode{constructor(a,b,c){super(a,c);this.__highlightType=b}static getType(){return"code-highlight"}static clone(a){return new z(a.__text,a.__highlightType||void 0,a.__key)}getHighlightType(){return this.getLatest().__highlightType}createDOM(a){let b=super.createDOM(a);a=A(a.theme,this.__highlightType);m.addClassNamesToElement(b,a);return b}updateDOM(a,b,c){let d=super.updateDOM(a,b,c);a=A(c.theme,a.__highlightType);c=A(c.theme,this.__highlightType);a!==c&&(a&&m.removeClassNamesFromElement(b,
|
|
10
|
+
a),c&&m.addClassNamesToElement(b,c));return d}static importJSON(a){let b=B(a.text,a.highlightType);b.setFormat(a.format);b.setDetail(a.detail);b.setMode(a.mode);b.setStyle(a.style);return b}exportJSON(){return{...super.exportJSON(),highlightType:this.getHighlightType(),type:"code-highlight",version:1}}setFormat(){return this}}function A(a,b){return b&&a&&a.codeHighlight&&a.codeHighlight[b]}function B(a,b){return new z(a,b)}function C(a){return a instanceof z}
|
|
11
|
+
function D(a){let b=null,c=a.getPreviousSiblings();for(c.push(a);0<c.length&&(a=c.pop(),C(a)&&(b=a),!t.$isLineBreakNode(a)););return b}function E(a){let b=null,c=a.getNextSiblings();for(c.unshift(a);0<c.length&&(a=c.shift(),C(a)&&(b=a),!t.$isLineBreakNode(a)););return b}let F=a=>null!=a&&e.languages.hasOwnProperty(a)?a:void 0;
|
|
12
|
+
class G extends t.ElementNode{static getType(){return"code"}static clone(a){return new G(a.__language,a.__key)}constructor(a,b){super(b);this.__language=F(a)}createDOM(a){let b=document.createElement("code");m.addClassNamesToElement(b,a.theme.code);b.setAttribute("spellcheck","false");(a=this.getLanguage())&&b.setAttribute("data-highlight-language",a);return b}updateDOM(a,b){let c=this.__language;a=a.__language;c?c!==a&&b.setAttribute("data-highlight-language",c):a&&b.removeAttribute("data-highlight-language");
|
|
13
13
|
return!1}static importDOM(){return{code:a=>null!=a.textContent&&/\r?\n/.test(a.textContent)?{conversion:H,priority:1}:null,div:()=>({conversion:I,priority:1}),pre:()=>({conversion:H,priority:0}),table:a=>J(a)?{conversion:aa,priority:4}:null,td:a=>{let b=a.closest("table");return a.classList.contains("js-file-line")?{conversion:ba,priority:4}:b&&J(b)?{conversion:K,priority:4}:null},tr:a=>(a=a.closest("table"))&&J(a)?{conversion:K,priority:4}:null}}static importJSON(a){let b=L(a.language);b.setFormat(a.format);
|
|
14
|
-
b.setIndent(a.indent);b.setDirection(a.direction);return b}exportJSON(){return{...super.exportJSON(),language:this.getLanguage(),type:"code",version:1}}insertNewAfter(a){var b=this.getChildren(),c=b.length;if(2<=c&&"\n"===b[c-1].getTextContent()&&"\n"===b[c-2].getTextContent()&&a.isCollapsed()&&a.anchor.key===this.__key&&a.anchor.offset===c)return b[c-1].remove(),b[c-2].remove(),a=
|
|
15
|
-
d.length&&/[\t ]/.test(d[c]);)c+=1;if(0<c)return c=d.substring(0,c),c=
|
|
16
|
-
function L(a){return new G(a)}function M(a){return a instanceof G}function H(){return{node:L()}}function I(a){return{after:
|
|
17
|
-
function J(a){return a.classList.contains("js-file-line-container")}function N(a,b){var c=a.length;let d=-1;if(b)for(b=0;b<c;b++){let f=a[b];if(" "!==f&&"\t"!==f){d=b;break}}else for(--c;-1<c;c--)if(b=a[c]," "!==b&&"\t"!==b){d=c;break}return d}
|
|
18
|
-
function O(a){let b=null,c=-1;var d=a.getPreviousSiblings();for(d.push(a);0<d.length;){var f=d.pop();if(C(f)){var g=f.getTextContent();g=N(g,!0);-1!==g&&(b=f,c=g)}if(
|
|
19
|
-
function P(a){let b=null,c=-1;var d=a.getNextSiblings();for(d.unshift(a);0<d.length;){var f=d.shift();if(C(f)){var g=f.getTextContent();g=N(g,!1);-1!==g&&(b=f,c=g+1)}if(
|
|
20
|
-
function R(a,b){
|
|
21
|
-
p-
|
|
22
|
-
function ca(a,b){var c=
|
|
23
|
-
function U(a,b){return C(a)&&C(b)?a.__text===b.__text&&a.__highlightType===b.__highlightType:
|
|
24
|
-
function W(a,b){let c=a.getTextContent();b===
|
|
25
|
-
function Y(a,b){let c=
|
|
26
|
-
b.preventDefault(),!0;return!1}var p=D(h);let
|
|
27
|
-
|
|
28
|
-
exports.$createCodeNode=L;exports.$isCodeHighlightNode=C;exports.$isCodeNode=M;exports.CODE_LANGUAGE_FRIENDLY_NAME_MAP=
|
|
29
|
-
exports.getLanguageFriendlyName=function(a){a=
|
|
30
|
-
exports.registerCodeHighlighting=function(a){if(!a.hasNodes([G,
|
|
31
|
-
(h+="\n"+ ++
|
|
32
|
-
b=>Y(
|
|
14
|
+
b.setIndent(a.indent);b.setDirection(a.direction);return b}exportJSON(){return{...super.exportJSON(),language:this.getLanguage(),type:"code",version:1}}insertNewAfter(a){var b=this.getChildren(),c=b.length;if(2<=c&&"\n"===b[c-1].getTextContent()&&"\n"===b[c-2].getTextContent()&&a.isCollapsed()&&a.anchor.key===this.__key&&a.anchor.offset===c)return b[c-1].remove(),b[c-2].remove(),a=t.$createParagraphNode(),this.insertAfter(a),a;b=a.anchor.getNode();var d=D(b);if(null!=d){c=0;for(d=d.getTextContent();c<
|
|
15
|
+
d.length&&/[\t ]/.test(d[c]);)c+=1;if(0<c)return c=d.substring(0,c),c=B(c),b.insertAfter(c),a.insertNodes([t.$createLineBreakNode()]),c.select(),c}return null}canInsertTab(){let a=t.$getSelection();return t.$isRangeSelection(a)&&a.isCollapsed()?!0:!1}canIndent(){return!1}collapseAtStart(){let a=t.$createParagraphNode();this.getChildren().forEach(b=>a.append(b));this.replace(a);return!0}setLanguage(a){this.getWritable().__language=F(a)}getLanguage(){return this.getLatest().__language}}
|
|
16
|
+
function L(a){return new G(a)}function M(a){return a instanceof G}function H(){return{node:L(),preformatted:!0}}function I(a){let b=null!==a.style.fontFamily.match("monospace");return{after:c=>{let d=a.parentNode;null!=d&&a!==d.lastChild&&c.push(t.$createLineBreakNode());return c},node:b?L():null,preformatted:b}}function aa(){return{node:L(),preformatted:!0}}function K(){return{node:null}}
|
|
17
|
+
function ba(a){return{after:b=>{a.parentNode&&a.parentNode.nextSibling&&b.push(t.$createLineBreakNode());return b},node:null}}function J(a){return a.classList.contains("js-file-line-container")}function N(a,b){var c=a.length;let d=-1;if(b)for(b=0;b<c;b++){let f=a[b];if(" "!==f&&"\t"!==f){d=b;break}}else for(--c;-1<c;c--)if(b=a[c]," "!==b&&"\t"!==b){d=c;break}return d}
|
|
18
|
+
function O(a){let b=null,c=-1;var d=a.getPreviousSiblings();for(d.push(a);0<d.length;){var f=d.pop();if(C(f)){var g=f.getTextContent();g=N(g,!0);-1!==g&&(b=f,c=g)}if(t.$isLineBreakNode(f))break}if(null===b)for(a=a.getNextSiblings();0<a.length;){d=a.shift();if(C(d)&&(f=d.getTextContent(),f=N(f,!0),-1!==f)){b=d;c=f;break}if(t.$isLineBreakNode(d))break}return{node:b,offset:c}}
|
|
19
|
+
function P(a){let b=null,c=-1;var d=a.getNextSiblings();for(d.unshift(a);0<d.length;){var f=d.shift();if(C(f)){var g=f.getTextContent();g=N(g,!1);-1!==g&&(b=f,c=g+1)}if(t.$isLineBreakNode(f))break}if(null===b)for(a=a.getPreviousSiblings();0<a.length;){d=a.pop();if(C(d)&&(f=d.getTextContent(),f=N(f,!1),-1!==f)){b=d;c=f+1;break}if(t.$isLineBreakNode(d))break}return{node:b,offset:c}}function Q(a,b){let c=a.getParent();M(c)?R(c,b):C(a)&&a.replace(t.$createTextNode(a.__text))}let S=!1;
|
|
20
|
+
function R(a,b){if(!S){S=!0;void 0===a.getLanguage()&&a.setLanguage("javascript");var c=a.getKey();b.update(()=>{ca(c,()=>{var d=t.$getNodeByKey(c);if(!M(d)||!d.isAttached())return!1;var f=d.getTextContent();f=e.tokenize(f,e.languages[d.getLanguage()||""]||e.languages.javascript);f=T(f);var g=d.getChildren();for(d=0;d<g.length&&U(g[d],f[d]);)d++;var k=g.length;let h=f.length,n=Math.min(k,h)-d,l=0;for(;l<n;)if(l++,!U(g[k-l],f[h-l])){l--;break}g=d;k-=l;f=f.slice(d,h-l);let {from:p,to:x,nodesForReplacement:r}=
|
|
21
|
+
{from:g,nodesForReplacement:f,to:k};return p!==x||r.length?(a.splice(p,x-p,r),!0):!1})},{onUpdate:()=>{S=!1},skipTransforms:!0})}}function T(a){let b=[];a.forEach(c=>{if("string"===typeof c){c=c.split("\n");for(var d=0;d<c.length;d++){let f=c[d];f.length&&b.push(B(f));d<c.length-1&&b.push(t.$createLineBreakNode())}}else({content:d}=c),"string"===typeof d?b.push(B(d,c.type)):Array.isArray(d)&&1===d.length&&"string"===typeof d[0]?b.push(B(d[0],c.type)):Array.isArray(d)&&b.push(...T(d))});return b}
|
|
22
|
+
function ca(a,b){a=t.$getNodeByKey(a);if(M(a)&&a.isAttached()){var c=t.$getSelection();if(t.$isRangeSelection(c)){c=c.anchor;var d=c.offset,f="element"===c.type&&t.$isLineBreakNode(a.getChildAtIndex(c.offset-1)),g=0;if(!f){let k=c.getNode();g=d+k.getPreviousSiblings().reduce((h,n)=>h+(t.$isLineBreakNode(n)?0:n.getTextContentSize()),0)}b()&&(f?c.getNode().select(d,d):a.getChildren().some(k=>{if(t.$isTextNode(k)){let h=k.getTextContentSize();if(h>=g)return k.select(g,g),!0;g-=h}return!1}))}else b()}}
|
|
23
|
+
function U(a,b){return C(a)&&C(b)?a.__text===b.__text&&a.__highlightType===b.__highlightType:t.$isLineBreakNode(a)&&t.$isLineBreakNode(b)?!0:!1}function V(a){var b=t.$getSelection();if(!t.$isRangeSelection(b)||b.isCollapsed())return!1;b=b.getNodes();for(var c=0;c<b.length;c++){var d=b[c];if(!C(d)&&!t.$isLineBreakNode(d))return!1}c=D(b[0]);null!=c&&W(c,a);for(c=1;c<b.length;c++)d=b[c],t.$isLineBreakNode(b[c-1])&&C(d)&&W(d,a);return!0}
|
|
24
|
+
function W(a,b){let c=a.getTextContent();b===t.INDENT_CONTENT_COMMAND?0<c.length&&/\s/.test(c[0])?a.setTextContent("\t"+c):(b=B("\t"),a.insertBefore(b)):0===c.indexOf("\t")&&(1===c.length?a.remove():a.setTextContent(c.substring(1)))}
|
|
25
|
+
function Y(a,b){let c=t.$getSelection();if(!t.$isRangeSelection(c))return!1;let {anchor:d,focus:f}=c,g=d.offset,k=f.offset,h=d.getNode(),n=f.getNode();var l=a===t.KEY_ARROW_UP_COMMAND;if(!C(h)||!C(n))return!1;if(!b.altKey){if(c.isCollapsed())if(a=h.getParentOrThrow(),l&&0===g&&null===h.getPreviousSibling()){if(null===a.getPreviousSibling())return a.selectPrevious(),b.preventDefault(),!0}else if(!l&&g===h.getTextContentSize()&&null===h.getNextSibling()&&null===a.getNextSibling())return a.selectNext(),
|
|
26
|
+
b.preventDefault(),!0;return!1}var p=D(h);let x=E(n);if(null==p||null==x)return!1;let r=p.getNodesBetween(x);for(let q=0;q<r.length;q++){let X=r[q];if(!C(X)&&!t.$isLineBreakNode(X))return!1}b.preventDefault();b.stopPropagation();b=l?p.getPreviousSibling():x.getNextSibling();if(!t.$isLineBreakNode(b))return!0;p=l?b.getPreviousSibling():b.getNextSibling();if(null==p)return!0;l=l?D(p):E(p);let y=null!=l?l:p;b.remove();r.forEach(q=>q.remove());a===t.KEY_ARROW_UP_COMMAND?(r.forEach(q=>y.insertBefore(q)),
|
|
27
|
+
y.insertBefore(b)):(y.insertAfter(b),y=b,r.forEach(q=>{y.insertAfter(q);y=q}));c.setTextNodeRange(h,g,n,k);return!0}function Z(a,b){let c=t.$getSelection();if(!t.$isRangeSelection(c))return!1;let {anchor:d,focus:f}=c,g=d.getNode(),k=f.getNode();a=a===t.MOVE_TO_START;if(!C(g)||!C(k))return!1;let h,n;a?{node:h,offset:n}=O(k):{node:h,offset:n}=P(k);null!==h&&-1!==n&&c.setTextNodeRange(h,n,h,n);b.preventDefault();b.stopPropagation();return!0}exports.$createCodeHighlightNode=B;
|
|
28
|
+
exports.$createCodeNode=L;exports.$isCodeHighlightNode=C;exports.$isCodeNode=M;exports.CODE_LANGUAGE_FRIENDLY_NAME_MAP=u;exports.CODE_LANGUAGE_MAP=v;exports.CodeHighlightNode=z;exports.CodeNode=G;exports.DEFAULT_CODE_LANGUAGE="javascript";exports.getCodeLanguages=()=>Object.keys(e.languages).filter(a=>"function"!==typeof e.languages[a]).sort();exports.getDefaultCodeLanguage=()=>"javascript";exports.getEndOfCodeInLine=P;exports.getFirstCodeHighlightNodeOfLine=D;
|
|
29
|
+
exports.getLanguageFriendlyName=function(a){a=w(a);return u[a]||a};exports.getLastCodeHighlightNodeOfLine=E;exports.getStartOfCodeInLine=O;exports.normalizeCodeLang=w;
|
|
30
|
+
exports.registerCodeHighlighting=function(a){if(!a.hasNodes([G,z]))throw Error("CodeHighlightPlugin: CodeNode or CodeHighlightNode not registered on editor");return m.mergeRegister(a.registerMutationListener(G,b=>{a.update(()=>{for(let [f,g]of b)if("destroyed"!==g){var c=t.$getNodeByKey(f);if(null!==c)a:{var d=c;c=a.getElementByKey(d.getKey());if(null===c)break a;d=d.getChildren();let k=d.length;if(k===c.__cachedChildrenLength)break a;c.__cachedChildrenLength=k;let h="1",n=1;for(let l=0;l<k;l++)t.$isLineBreakNode(d[l])&&
|
|
31
|
+
(h+="\n"+ ++n);c.setAttribute("data-gutter",h)}}})}),a.registerNodeTransform(G,b=>R(b,a)),a.registerNodeTransform(t.TextNode,b=>Q(b,a)),a.registerNodeTransform(z,b=>Q(b,a)),a.registerCommand(t.INDENT_CONTENT_COMMAND,()=>V(t.INDENT_CONTENT_COMMAND),t.COMMAND_PRIORITY_LOW),a.registerCommand(t.OUTDENT_CONTENT_COMMAND,()=>V(t.OUTDENT_CONTENT_COMMAND),t.COMMAND_PRIORITY_LOW),a.registerCommand(t.KEY_ARROW_UP_COMMAND,b=>Y(t.KEY_ARROW_UP_COMMAND,b),t.COMMAND_PRIORITY_LOW),a.registerCommand(t.KEY_ARROW_DOWN_COMMAND,
|
|
32
|
+
b=>Y(t.KEY_ARROW_DOWN_COMMAND,b),t.COMMAND_PRIORITY_LOW),a.registerCommand(t.MOVE_TO_END,b=>Z(t.MOVE_TO_END,b),t.COMMAND_PRIORITY_LOW),a.registerCommand(t.MOVE_TO_START,b=>Z(t.MOVE_TO_START,b),t.COMMAND_PRIORITY_LOW))}
|
package/package.json
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
"code"
|
|
9
9
|
],
|
|
10
10
|
"license": "MIT",
|
|
11
|
-
"version": "0.
|
|
11
|
+
"version": "0.5.0",
|
|
12
12
|
"main": "LexicalCode.js",
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"lexical": "0.
|
|
14
|
+
"lexical": "0.5.0"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@lexical/utils": "0.
|
|
17
|
+
"@lexical/utils": "0.5.0",
|
|
18
18
|
"prismjs": "^1.27.0"
|
|
19
19
|
},
|
|
20
20
|
"repository": {
|