@lexical/code 0.2.7 → 0.3.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.d.ts CHANGED
@@ -14,9 +14,12 @@ import type {
14
14
  RangeSelection,
15
15
  EditorThemeClasses,
16
16
  LexicalEditor,
17
+ SerializedElementNode,
18
+ SerializedTextNode,
17
19
  } from 'lexical';
18
20
 
19
21
  import {ElementNode, TextNode} from 'lexical';
22
+ import {Spread} from 'libdefs/globals';
20
23
 
21
24
  declare class CodeNode extends ElementNode {
22
25
  static getType(): string;
@@ -31,6 +34,8 @@ declare class CodeNode extends ElementNode {
31
34
  collapseAtStart(): true;
32
35
  setLanguage(language: string): void;
33
36
  getLanguage(): string | void;
37
+ importJSON(serializedNode: SerializedCodeNode): CodeNode;
38
+ exportJSON(): SerializedElementNode;
34
39
  }
35
40
  declare function $createCodeNode(language?: string): CodeNode;
36
41
  declare function $isCodeNode(
@@ -74,3 +79,21 @@ declare function $isCodeHighlightNode(
74
79
  ): node is CodeHighlightNode;
75
80
 
76
81
  declare function registerCodeHighlighting(editor: LexicalEditor): () => void;
82
+
83
+ type SerializedCodeNode = Spread<
84
+ {
85
+ language: string | null | undefined;
86
+ type: 'code';
87
+ version: 1;
88
+ },
89
+ SerializedElementNode
90
+ >;
91
+
92
+ type SerializedCodeHighlightNode = Spread<
93
+ {
94
+ highlightType: string | null | undefined;
95
+ type: 'code-highlight';
96
+ version: 1;
97
+ },
98
+ SerializedTextNode
99
+ >;
@@ -53,6 +53,11 @@ class CodeHighlightNode extends lexical.TextNode {
53
53
  return new CodeHighlightNode(node.__text, node.__highlightType || undefined, node.__key);
54
54
  }
55
55
 
56
+ getHighlightType() {
57
+ const self = this.getLatest();
58
+ return self.__highlightType;
59
+ }
60
+
56
61
  createDOM(config) {
57
62
  const element = super.createDOM(config);
58
63
  const className = getHighlightThemeClass(config.theme, this.__highlightType);
@@ -60,8 +65,7 @@ class CodeHighlightNode extends lexical.TextNode {
60
65
  return element;
61
66
  }
62
67
 
63
- updateDOM( // $FlowFixMe
64
- prevNode, dom, config) {
68
+ updateDOM(prevNode, dom, config) {
65
69
  const update = super.updateDOM(prevNode, dom, config);
66
70
  const prevClassName = getHighlightThemeClass(config.theme, prevNode.__highlightType);
67
71
  const nextClassName = getHighlightThemeClass(config.theme, this.__highlightType);
@@ -77,6 +81,22 @@ class CodeHighlightNode extends lexical.TextNode {
77
81
  }
78
82
 
79
83
  return update;
84
+ }
85
+
86
+ static importJSON(serializedNode) {
87
+ const node = $createCodeHighlightNode(serializedNode.highlightType);
88
+ node.setFormat(serializedNode.format);
89
+ node.setDetail(serializedNode.detail);
90
+ node.setMode(serializedNode.mode);
91
+ node.setStyle(serializedNode.style);
92
+ return node;
93
+ }
94
+
95
+ exportJSON() {
96
+ return { ...super.exportJSON(),
97
+ highlightType: this.getHighlightType(),
98
+ type: 'code-highlight'
99
+ };
80
100
  } // Prevent formatting (bold, underline, etc)
81
101
 
82
102
 
@@ -200,6 +220,21 @@ class CodeNode extends lexical.ElementNode {
200
220
  return null;
201
221
  }
202
222
  };
223
+ }
224
+
225
+ static importJSON(serializedNode) {
226
+ const node = $createCodeNode(serializedNode.language);
227
+ node.setFormat(serializedNode.format);
228
+ node.setIndent(serializedNode.indent);
229
+ node.setDirection(serializedNode.direction);
230
+ return node;
231
+ }
232
+
233
+ exportJSON() {
234
+ return { ...super.exportJSON(),
235
+ language: this.getLanguage(),
236
+ type: 'code'
237
+ };
203
238
  } // Mutation
204
239
 
205
240
 
@@ -319,6 +354,142 @@ function getLastCodeHighlightNodeOfLine(anchor) {
319
354
  return currentNode;
320
355
  }
321
356
 
357
+ function isSpaceOrTabChar(char) {
358
+ return char === ' ' || char === '\t';
359
+ }
360
+
361
+ function findFirstNotSpaceOrTabCharAtText(text, isForward) {
362
+ const length = text.length;
363
+ let offset = -1;
364
+
365
+ if (isForward) {
366
+ for (let i = 0; i < length; i++) {
367
+ const char = text[i];
368
+
369
+ if (!isSpaceOrTabChar(char)) {
370
+ offset = i;
371
+ break;
372
+ }
373
+ }
374
+ } else {
375
+ for (let i = length - 1; i > -1; i--) {
376
+ const char = text[i];
377
+
378
+ if (!isSpaceOrTabChar(char)) {
379
+ offset = i;
380
+ break;
381
+ }
382
+ }
383
+ }
384
+
385
+ return offset;
386
+ }
387
+
388
+ function getStartOfCodeInLine(anchor) {
389
+ let currentNode = null;
390
+ let currentNodeOffset = -1;
391
+ const previousSiblings = anchor.getPreviousSiblings();
392
+ previousSiblings.push(anchor);
393
+
394
+ while (previousSiblings.length > 0) {
395
+ const node = previousSiblings.pop();
396
+
397
+ if ($isCodeHighlightNode(node)) {
398
+ const text = node.getTextContent();
399
+ const offset = findFirstNotSpaceOrTabCharAtText(text, true);
400
+
401
+ if (offset !== -1) {
402
+ currentNode = node;
403
+ currentNodeOffset = offset;
404
+ }
405
+ }
406
+
407
+ if (lexical.$isLineBreakNode(node)) {
408
+ break;
409
+ }
410
+ }
411
+
412
+ if (currentNode === null) {
413
+ const nextSiblings = anchor.getNextSiblings();
414
+
415
+ while (nextSiblings.length > 0) {
416
+ const node = nextSiblings.shift();
417
+
418
+ if ($isCodeHighlightNode(node)) {
419
+ const text = node.getTextContent();
420
+ const offset = findFirstNotSpaceOrTabCharAtText(text, true);
421
+
422
+ if (offset !== -1) {
423
+ currentNode = node;
424
+ currentNodeOffset = offset;
425
+ break;
426
+ }
427
+ }
428
+
429
+ if (lexical.$isLineBreakNode(node)) {
430
+ break;
431
+ }
432
+ }
433
+ }
434
+
435
+ return {
436
+ node: currentNode,
437
+ offset: currentNodeOffset
438
+ };
439
+ }
440
+ function getEndOfCodeInLine(anchor) {
441
+ let currentNode = null;
442
+ let currentNodeOffset = -1;
443
+ const nextSiblings = anchor.getNextSiblings();
444
+ nextSiblings.unshift(anchor);
445
+
446
+ while (nextSiblings.length > 0) {
447
+ const node = nextSiblings.shift();
448
+
449
+ if ($isCodeHighlightNode(node)) {
450
+ const text = node.getTextContent();
451
+ const offset = findFirstNotSpaceOrTabCharAtText(text, false);
452
+
453
+ if (offset !== -1) {
454
+ currentNode = node;
455
+ currentNodeOffset = offset + 1;
456
+ }
457
+ }
458
+
459
+ if (lexical.$isLineBreakNode(node)) {
460
+ break;
461
+ }
462
+ }
463
+
464
+ if (currentNode === null) {
465
+ const previousSiblings = anchor.getPreviousSiblings();
466
+
467
+ while (previousSiblings.length > 0) {
468
+ const node = previousSiblings.pop();
469
+
470
+ if ($isCodeHighlightNode(node)) {
471
+ const text = node.getTextContent();
472
+ const offset = findFirstNotSpaceOrTabCharAtText(text, false);
473
+
474
+ if (offset !== -1) {
475
+ currentNode = node;
476
+ currentNodeOffset = offset + 1;
477
+ break;
478
+ }
479
+ }
480
+
481
+ if (lexical.$isLineBreakNode(node)) {
482
+ break;
483
+ }
484
+ }
485
+ }
486
+
487
+ return {
488
+ node: currentNode,
489
+ offset: currentNodeOffset
490
+ };
491
+ }
492
+
322
493
  function convertPreElement(domNode) {
323
494
  return {
324
495
  node: $createCodeNode()
@@ -784,6 +955,48 @@ function handleShiftLines(type, event) {
784
955
  return true;
785
956
  }
786
957
 
958
+ function handleMoveTo(type, event) {
959
+ const selection = lexical.$getSelection();
960
+
961
+ if (!lexical.$isRangeSelection(selection)) {
962
+ return false;
963
+ }
964
+
965
+ const {
966
+ anchor,
967
+ focus
968
+ } = selection;
969
+ const anchorNode = anchor.getNode();
970
+ const focusNode = focus.getNode();
971
+ const isMoveToStart = type === lexical.MOVE_TO_START;
972
+
973
+ if (!$isCodeHighlightNode(anchorNode) || !$isCodeHighlightNode(focusNode)) {
974
+ return false;
975
+ }
976
+
977
+ let node;
978
+ let offset;
979
+
980
+ if (isMoveToStart) {
981
+ ({
982
+ node,
983
+ offset
984
+ } = getStartOfCodeInLine(focusNode));
985
+ } else {
986
+ ({
987
+ node,
988
+ offset
989
+ } = getEndOfCodeInLine(focusNode));
990
+ }
991
+
992
+ if (node !== null && offset !== -1) {
993
+ selection.setTextNodeRange(node, offset, node, offset);
994
+ }
995
+
996
+ event.preventDefault();
997
+ event.stopPropagation();
998
+ }
999
+
787
1000
  function registerCodeHighlighting(editor) {
788
1001
  if (!editor.hasNodes([CodeNode, CodeHighlightNode])) {
789
1002
  throw new Error('CodeHighlightPlugin: CodeNode or CodeHighlightNode not registered on editor');
@@ -801,7 +1014,7 @@ function registerCodeHighlighting(editor) {
801
1014
  }
802
1015
  }
803
1016
  });
804
- }), editor.registerNodeTransform(CodeNode, node => codeNodeTransform(node, editor)), editor.registerNodeTransform(lexical.TextNode, node => textNodeTransform(node, editor)), editor.registerNodeTransform(CodeHighlightNode, node => textNodeTransform(node, editor)), editor.registerCommand(lexical.INDENT_CONTENT_COMMAND, payload => handleMultilineIndent(lexical.INDENT_CONTENT_COMMAND), lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(lexical.OUTDENT_CONTENT_COMMAND, payload => handleMultilineIndent(lexical.OUTDENT_CONTENT_COMMAND), lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(lexical.KEY_ARROW_UP_COMMAND, payload => handleShiftLines(lexical.KEY_ARROW_UP_COMMAND, payload), lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(lexical.KEY_ARROW_DOWN_COMMAND, payload => handleShiftLines(lexical.KEY_ARROW_DOWN_COMMAND, payload), lexical.COMMAND_PRIORITY_LOW));
1017
+ }), editor.registerNodeTransform(CodeNode, node => codeNodeTransform(node, editor)), editor.registerNodeTransform(lexical.TextNode, node => textNodeTransform(node, editor)), editor.registerNodeTransform(CodeHighlightNode, node => textNodeTransform(node, editor)), editor.registerCommand(lexical.INDENT_CONTENT_COMMAND, payload => handleMultilineIndent(lexical.INDENT_CONTENT_COMMAND), lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(lexical.OUTDENT_CONTENT_COMMAND, payload => handleMultilineIndent(lexical.OUTDENT_CONTENT_COMMAND), lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(lexical.KEY_ARROW_UP_COMMAND, payload => handleShiftLines(lexical.KEY_ARROW_UP_COMMAND, payload), lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(lexical.KEY_ARROW_DOWN_COMMAND, payload => handleShiftLines(lexical.KEY_ARROW_DOWN_COMMAND, payload), lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(lexical.MOVE_TO_END, payload => handleMoveTo(lexical.MOVE_TO_END, payload), lexical.COMMAND_PRIORITY_LOW), editor.registerCommand(lexical.MOVE_TO_START, payload => handleMoveTo(lexical.MOVE_TO_START, payload), lexical.COMMAND_PRIORITY_LOW));
805
1018
  }
806
1019
 
807
1020
  exports.$createCodeHighlightNode = $createCodeHighlightNode;
@@ -812,6 +1025,8 @@ exports.CodeHighlightNode = CodeHighlightNode;
812
1025
  exports.CodeNode = CodeNode;
813
1026
  exports.getCodeLanguages = getCodeLanguages;
814
1027
  exports.getDefaultCodeLanguage = getDefaultCodeLanguage;
1028
+ exports.getEndOfCodeInLine = getEndOfCodeInLine;
815
1029
  exports.getFirstCodeHighlightNodeOfLine = getFirstCodeHighlightNodeOfLine;
816
1030
  exports.getLastCodeHighlightNodeOfLine = getLastCodeHighlightNodeOfLine;
1031
+ exports.getStartOfCodeInLine = getStartOfCodeInLine;
817
1032
  exports.registerCodeHighlighting = registerCodeHighlighting;
@@ -53,6 +53,7 @@ declare export class CodeHighlightNode extends TextNode {
53
53
  __highlightType: ?string;
54
54
  constructor(text: string, highlightType?: string, key?: NodeKey): void;
55
55
  static getType(): string;
56
+ // $FlowFixMe
56
57
  static clone(node: CodeHighlightNode): CodeHighlightNode;
57
58
  createDOM(config: EditorConfig): HTMLElement;
58
59
  updateDOM(
@@ -4,25 +4,28 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- 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 n=require("@lexical/utils"),r=require("lexical");const t=a=>null!=a&&e.languages.hasOwnProperty(a)?a:void 0;
9
- class u extends r.TextNode{constructor(a,c,b){super(a,b);this.__highlightType=c}static getType(){return"code-highlight"}static clone(a){return new u(a.__text,a.__highlightType||void 0,a.__key)}createDOM(a){const c=super.createDOM(a);a=v(a.theme,this.__highlightType);n.addClassNamesToElement(c,a);return c}updateDOM(a,c,b){const d=super.updateDOM(a,c,b);a=v(b.theme,a.__highlightType);b=v(b.theme,this.__highlightType);a!==b&&(a&&n.removeClassNamesFromElement(c,a),b&&n.addClassNamesToElement(c,b));return d}setFormat(){return this}}
10
- function v(a,c){return c&&a&&a.codeHighlight&&a.codeHighlight[c]}function y(a,c){return new u(a,c)}function z(a){return a instanceof u}
11
- class B extends r.ElementNode{static getType(){return"code"}static clone(a){return new B(a.__language,a.__key)}constructor(a,c){super(c);this.__language=t(a)}createDOM(a){const c=document.createElement("code");n.addClassNamesToElement(c,a.theme.code);c.setAttribute("spellcheck","false");(a=this.getLanguage())&&c.setAttribute("data-highlight-language",a);return c}updateDOM(a,c){const b=this.__language;a=a.__language;b?b!==a&&c.setAttribute("data-highlight-language",b):a&&c.removeAttribute("data-highlight-language");
12
- return!1}static importDOM(){return{div:()=>({conversion:C,priority:1}),pre:()=>({conversion:D,priority:0}),table:a=>E(a)?{conversion:F,priority:4}:null,td:a=>{const c=a.closest("table");return a.classList.contains("js-file-line")?{conversion:G,priority:4}:c&&E(c)?{conversion:H,priority:4}:null},tr:a=>(a=a.closest("table"))&&E(a)?{conversion:H,priority:4}:null}}insertNewAfter(a){var c=this.getChildren(),b=c.length;if(2<=b&&"\n"===c[b-1].getTextContent()&&"\n"===c[b-2].getTextContent()&&a.isCollapsed()&&
13
- a.anchor.key===this.__key&&a.anchor.offset===b)return c[b-1].remove(),c[b-2].remove(),a=r.$createParagraphNode(),this.insertAfter(a),a;c=a.anchor.getNode();var d=I(c);if(null!=d){b=0;for(d=d.getTextContent();b<d.length&&/[\t ]/.test(d[b]);)b+=1;if(0<b)return b=d.substring(0,b),b=y(b),c.insertAfter(b),a.insertNodes([r.$createLineBreakNode()]),b.select(),b}return null}canInsertTab(){const a=r.$getSelection();return r.$isRangeSelection(a)&&a.isCollapsed()?!0:!1}canIndent(){return!1}collapseAtStart(){const a=
14
- r.$createParagraphNode();this.getChildren().forEach(c=>a.append(c));this.replace(a);return!0}setLanguage(a){this.getWritable().__language=t(a)}getLanguage(){return this.getLatest().__language}}function J(a){return new B(a)}function K(a){return a instanceof B}function I(a){let c=null;const b=a.getPreviousSiblings();for(b.push(a);0<b.length&&(a=b.pop(),z(a)&&(c=a),!r.$isLineBreakNode(a)););return c}
15
- function L(a){let c=null;const b=a.getNextSiblings();for(b.unshift(a);0<b.length&&(a=b.shift(),z(a)&&(c=a),!r.$isLineBreakNode(a)););return c}function D(){return{node:J()}}function C(a){return{after:c=>{const b=a.parentNode;null!=b&&a!==b.lastChild&&c.push(r.$createLineBreakNode());return c},node:null!==a.style.fontFamily.match("monospace")?J():null}}function F(){return{node:J()}}function H(){return{node:null}}
16
- function G(a){return{after:c=>{a.parentNode&&a.parentNode.nextSibling&&c.push(r.$createLineBreakNode());return c},node:null}}function E(a){return a.classList.contains("js-file-line-container")}function M(a,c){const b=a.getParent();K(b)?N(b,c):z(a)&&a.replace(r.$createTextNode(a.__text))}let O=!1;
17
- function N(a,c){O||(O=!0,void 0===a.getLanguage()&&a.setLanguage("javascript"),c.update(()=>{P(a,()=>{var b=a.getTextContent();b=e.tokenize(b,e.languages[a.getLanguage()||""]||e.languages.javascript);b=R(b);var d=a.getChildren();let f=0;for(;f<d.length&&S(d[f],b[f]);)f++;var h=d.length;const m=b.length,g=Math.min(h,m)-f;let k=0;for(;k<g;)if(k++,!S(d[h-k],b[m-k])){k--;break}d=f;h-=k;b=b.slice(f,m-k);const {from:l,to:p,nodesForReplacement:w}={from:d,nodesForReplacement:b,to:h};return l!==p||w.length?
18
- (a.splice(l,p-l,w),!0):!1})},{onUpdate:()=>{O=!1},skipTransforms:!0}))}function R(a){const c=[];a.forEach(b=>{if("string"===typeof b){b=b.split("\n");for(var d=0;d<b.length;d++){const f=b[d];f.length&&c.push(y(f));d<b.length-1&&c.push(r.$createLineBreakNode())}}else({content:d}=b),"string"===typeof d?c.push(y(d,b.type)):Array.isArray(d)&&1===d.length&&"string"===typeof d[0]?c.push(y(d[0],b.type)):Array.isArray(d)&&c.push(...R(d))});return c}
19
- function P(a,c){var b=r.$getSelection();if(r.$isRangeSelection(b)&&b.anchor){b=b.anchor;var d=b.offset,f="element"===b.type&&r.$isLineBreakNode(a.getChildAtIndex(b.offset-1)),h=0;if(!f){const m=b.getNode();h=d+m.getPreviousSiblings().reduce((g,k)=>g+(r.$isLineBreakNode(k)?0:k.getTextContentSize()),0)}c()&&(f?b.getNode().select(d,d):a.getChildren().some(m=>{if(r.$isTextNode(m)){const g=m.getTextContentSize();if(g>=h)return m.select(h,h),!0;h-=g}return!1}))}}
20
- function S(a,c){return z(a)&&z(c)?a.__text===c.__text&&a.__highlightType===c.__highlightType:r.$isLineBreakNode(a)&&r.$isLineBreakNode(c)?!0:!1}function T(a){var c=r.$getSelection();if(!r.$isRangeSelection(c)||c.isCollapsed())return!1;c=c.getNodes();for(var b=0;b<c.length;b++){var d=c[b];if(!z(d)&&!r.$isLineBreakNode(d))return!1}b=I(c[0]);null!=b&&U(b,a);for(b=1;b<c.length;b++)d=c[b],r.$isLineBreakNode(c[b-1])&&z(d)&&U(d,a);return!0}
21
- function U(a,c){const b=a.getTextContent();c===r.INDENT_CONTENT_COMMAND?0<b.length&&/\s/.test(b[0])?a.setTextContent("\t"+b):(c=y("\t"),a.insertBefore(c)):0===b.indexOf("\t")&&(1===b.length?a.remove():a.setTextContent(b.substring(1)))}
22
- function V(a,c){const b=r.$getSelection();if(!r.$isRangeSelection(b))return!1;const {anchor:d,focus:f}=b,h=d.offset,m=f.offset,g=d.getNode(),k=f.getNode();var l=a===r.KEY_ARROW_UP_COMMAND;if(!z(g)||!z(k))return!1;if(!c.altKey){if(b.isCollapsed())if(a=g.getParentOrThrow(),l&&0===h&&null===g.getPreviousSibling()){if(null===a.getPreviousSibling())return a.selectPrevious(),c.preventDefault(),!0}else if(!l&&h===g.getTextContentSize()&&null===g.getNextSibling()&&null===a.getNextSibling())return a.selectNext(),
23
- c.preventDefault(),!0;return!1}var p=I(g);const w=L(k);if(null==p||null==w)return!1;const A=p.getNodesBetween(w);for(let q=0;q<A.length;q++){const Q=A[q];if(!z(Q)&&!r.$isLineBreakNode(Q))return!1}c.preventDefault();c.stopPropagation();c=l?p.getPreviousSibling():w.getNextSibling();if(!r.$isLineBreakNode(c))return!0;p=l?c.getPreviousSibling():c.getNextSibling();if(null==p)return!0;l=l?I(p):L(p);let x=null!=l?l:p;c.remove();A.forEach(q=>q.remove());a===r.KEY_ARROW_UP_COMMAND?(A.forEach(q=>x.insertBefore(q)),
24
- x.insertBefore(c)):(x.insertAfter(c),x=c,A.forEach(q=>{x.insertAfter(q);x=q}));b.setTextNodeRange(g,h,k,m);return!0}exports.$createCodeHighlightNode=y;exports.$createCodeNode=J;exports.$isCodeHighlightNode=z;exports.$isCodeNode=K;exports.CodeHighlightNode=u;exports.CodeNode=B;exports.getCodeLanguages=()=>Object.keys(e.languages).filter(a=>"function"!==typeof e.languages[a]).sort();exports.getDefaultCodeLanguage=()=>"javascript";exports.getFirstCodeHighlightNodeOfLine=I;
25
- exports.getLastCodeHighlightNodeOfLine=L;
26
- exports.registerCodeHighlighting=function(a){if(!a.hasNodes([B,u]))throw Error("CodeHighlightPlugin: CodeNode or CodeHighlightNode not registered on editor");return n.mergeRegister(a.registerMutationListener(B,c=>{a.update(()=>{for(const [f,h]of c)if("destroyed"!==h){var b=r.$getNodeByKey(f);if(null!==b)a:{var d=b;b=a.getElementByKey(d.getKey());if(null===b)break a;d=d.getChildren();const m=d.length;if(m===b.__cachedChildrenLength)break a;b.__cachedChildrenLength=m;let g="1",k=1;for(let l=0;l<m;l++)r.$isLineBreakNode(d[l])&&
27
- (g+="\n"+ ++k);b.setAttribute("data-gutter",g)}}})}),a.registerNodeTransform(B,c=>N(c,a)),a.registerNodeTransform(r.TextNode,c=>M(c,a)),a.registerNodeTransform(u,c=>M(c,a)),a.registerCommand(r.INDENT_CONTENT_COMMAND,()=>T(r.INDENT_CONTENT_COMMAND),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.OUTDENT_CONTENT_COMMAND,()=>T(r.OUTDENT_CONTENT_COMMAND),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.KEY_ARROW_UP_COMMAND,c=>V(r.KEY_ARROW_UP_COMMAND,c),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.KEY_ARROW_DOWN_COMMAND,
28
- c=>V(r.KEY_ARROW_DOWN_COMMAND,c),r.COMMAND_PRIORITY_LOW))};
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"),r=require("lexical");let t=a=>null!=a&&e.languages.hasOwnProperty(a)?a:void 0;
9
+ class u extends r.TextNode{constructor(a,b,c){super(a,c);this.__highlightType=b}static getType(){return"code-highlight"}static clone(a){return new u(a.__text,a.__highlightType||void 0,a.__key)}getHighlightType(){return this.getLatest().__highlightType}createDOM(a){let b=super.createDOM(a);a=v(a.theme,this.__highlightType);m.addClassNamesToElement(b,a);return b}updateDOM(a,b,c){let d=super.updateDOM(a,b,c);a=v(c.theme,a.__highlightType);c=v(c.theme,this.__highlightType);a!==c&&(a&&m.removeClassNamesFromElement(b,
10
+ a),c&&m.addClassNamesToElement(b,c));return d}static importJSON(a){let b=y(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"}}setFormat(){return this}}function v(a,b){return b&&a&&a.codeHighlight&&a.codeHighlight[b]}function y(a,b){return new u(a,b)}function z(a){return a instanceof u}
11
+ class A extends r.ElementNode{static getType(){return"code"}static clone(a){return new A(a.__language,a.__key)}constructor(a,b){super(b);this.__language=t(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");
12
+ return!1}static importDOM(){return{div:()=>({conversion:C,priority:1}),pre:()=>({conversion:D,priority:0}),table:a=>E(a)?{conversion:F,priority:4}:null,td:a=>{let b=a.closest("table");return a.classList.contains("js-file-line")?{conversion:G,priority:4}:b&&E(b)?{conversion:H,priority:4}:null},tr:a=>(a=a.closest("table"))&&E(a)?{conversion:H,priority:4}:null}}static importJSON(a){let b=I(a.language);b.setFormat(a.format);b.setIndent(a.indent);b.setDirection(a.direction);return b}exportJSON(){return{...super.exportJSON(),
13
+ language:this.getLanguage(),type:"code"}}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=r.$createParagraphNode(),this.insertAfter(a),a;b=a.anchor.getNode();var d=J(b);if(null!=d){c=0;for(d=d.getTextContent();c<d.length&&/[\t ]/.test(d[c]);)c+=1;if(0<c)return c=d.substring(0,c),c=y(c),b.insertAfter(c),a.insertNodes([r.$createLineBreakNode()]),
14
+ c.select(),c}return null}canInsertTab(){let a=r.$getSelection();return r.$isRangeSelection(a)&&a.isCollapsed()?!0:!1}canIndent(){return!1}collapseAtStart(){let a=r.$createParagraphNode();this.getChildren().forEach(b=>a.append(b));this.replace(a);return!0}setLanguage(a){this.getWritable().__language=t(a)}getLanguage(){return this.getLatest().__language}}function I(a){return new A(a)}function K(a){return a instanceof A}
15
+ function J(a){let b=null,c=a.getPreviousSiblings();for(c.push(a);0<c.length&&(a=c.pop(),z(a)&&(b=a),!r.$isLineBreakNode(a)););return b}function L(a){let b=null,c=a.getNextSiblings();for(c.unshift(a);0<c.length&&(a=c.shift(),z(a)&&(b=a),!r.$isLineBreakNode(a)););return b}function M(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}
16
+ function N(a){let b=null,c=-1;var d=a.getPreviousSiblings();for(d.push(a);0<d.length;){var f=d.pop();if(z(f)){var g=f.getTextContent();g=M(g,!0);-1!==g&&(b=f,c=g)}if(r.$isLineBreakNode(f))break}if(null===b)for(a=a.getNextSiblings();0<a.length;){d=a.shift();if(z(d)&&(f=d.getTextContent(),f=M(f,!0),-1!==f)){b=d;c=f;break}if(r.$isLineBreakNode(d))break}return{node:b,offset:c}}
17
+ function O(a){let b=null,c=-1;var d=a.getNextSiblings();for(d.unshift(a);0<d.length;){var f=d.shift();if(z(f)){var g=f.getTextContent();g=M(g,!1);-1!==g&&(b=f,c=g+1)}if(r.$isLineBreakNode(f))break}if(null===b)for(a=a.getPreviousSiblings();0<a.length;){d=a.pop();if(z(d)&&(f=d.getTextContent(),f=M(f,!1),-1!==f)){b=d;c=f+1;break}if(r.$isLineBreakNode(d))break}return{node:b,offset:c}}function D(){return{node:I()}}
18
+ function C(a){return{after:b=>{let c=a.parentNode;null!=c&&a!==c.lastChild&&b.push(r.$createLineBreakNode());return b},node:null!==a.style.fontFamily.match("monospace")?I():null}}function F(){return{node:I()}}function H(){return{node:null}}function G(a){return{after:b=>{a.parentNode&&a.parentNode.nextSibling&&b.push(r.$createLineBreakNode());return b},node:null}}function E(a){return a.classList.contains("js-file-line-container")}
19
+ function P(a,b){let c=a.getParent();K(c)?Q(c,b):z(a)&&a.replace(r.$createTextNode(a.__text))}let R=!1;
20
+ function Q(a,b){R||(R=!0,void 0===a.getLanguage()&&a.setLanguage("javascript"),b.update(()=>{S(a,()=>{var c=a.getTextContent();c=e.tokenize(c,e.languages[a.getLanguage()||""]||e.languages.javascript);c=U(c);var d=a.getChildren();let f=0;for(;f<d.length&&V(d[f],c[f]);)f++;var g=d.length;let l=c.length,h=Math.min(g,l)-f,k=0;for(;k<h;)if(k++,!V(d[g-k],c[l-k])){k--;break}d=f;g-=k;c=c.slice(f,l-k);let {from:n,to:p,nodesForReplacement:w}={from:d,nodesForReplacement:c,to:g};return n!==p||w.length?(a.splice(n,
21
+ p-n,w),!0):!1})},{onUpdate:()=>{R=!1},skipTransforms:!0}))}function U(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(y(f));d<c.length-1&&b.push(r.$createLineBreakNode())}}else({content:d}=c),"string"===typeof d?b.push(y(d,c.type)):Array.isArray(d)&&1===d.length&&"string"===typeof d[0]?b.push(y(d[0],c.type)):Array.isArray(d)&&b.push(...U(d))});return b}
22
+ function S(a,b){var c=r.$getSelection();if(r.$isRangeSelection(c)&&c.anchor){c=c.anchor;var d=c.offset,f="element"===c.type&&r.$isLineBreakNode(a.getChildAtIndex(c.offset-1)),g=0;if(!f){let l=c.getNode();g=d+l.getPreviousSiblings().reduce((h,k)=>h+(r.$isLineBreakNode(k)?0:k.getTextContentSize()),0)}b()&&(f?c.getNode().select(d,d):a.getChildren().some(l=>{if(r.$isTextNode(l)){let h=l.getTextContentSize();if(h>=g)return l.select(g,g),!0;g-=h}return!1}))}}
23
+ function V(a,b){return z(a)&&z(b)?a.__text===b.__text&&a.__highlightType===b.__highlightType:r.$isLineBreakNode(a)&&r.$isLineBreakNode(b)?!0:!1}function W(a){var b=r.$getSelection();if(!r.$isRangeSelection(b)||b.isCollapsed())return!1;b=b.getNodes();for(var c=0;c<b.length;c++){var d=b[c];if(!z(d)&&!r.$isLineBreakNode(d))return!1}c=J(b[0]);null!=c&&X(c,a);for(c=1;c<b.length;c++)d=b[c],r.$isLineBreakNode(b[c-1])&&z(d)&&X(d,a);return!0}
24
+ function X(a,b){let c=a.getTextContent();b===r.INDENT_CONTENT_COMMAND?0<c.length&&/\s/.test(c[0])?a.setTextContent("\t"+c):(b=y("\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=r.$getSelection();if(!r.$isRangeSelection(c))return!1;let {anchor:d,focus:f}=c,g=d.offset,l=f.offset,h=d.getNode(),k=f.getNode();var n=a===r.KEY_ARROW_UP_COMMAND;if(!z(h)||!z(k))return!1;if(!b.altKey){if(c.isCollapsed())if(a=h.getParentOrThrow(),n&&0===g&&null===h.getPreviousSibling()){if(null===a.getPreviousSibling())return a.selectPrevious(),b.preventDefault(),!0}else if(!n&&g===h.getTextContentSize()&&null===h.getNextSibling()&&null===a.getNextSibling())return a.selectNext(),
26
+ b.preventDefault(),!0;return!1}var p=J(h);let w=L(k);if(null==p||null==w)return!1;let B=p.getNodesBetween(w);for(let q=0;q<B.length;q++){let T=B[q];if(!z(T)&&!r.$isLineBreakNode(T))return!1}b.preventDefault();b.stopPropagation();b=n?p.getPreviousSibling():w.getNextSibling();if(!r.$isLineBreakNode(b))return!0;p=n?b.getPreviousSibling():b.getNextSibling();if(null==p)return!0;n=n?J(p):L(p);let x=null!=n?n:p;b.remove();B.forEach(q=>q.remove());a===r.KEY_ARROW_UP_COMMAND?(B.forEach(q=>x.insertBefore(q)),
27
+ x.insertBefore(b)):(x.insertAfter(b),x=b,B.forEach(q=>{x.insertAfter(q);x=q}));c.setTextNodeRange(h,g,k,l);return!0}function Z(a,b){let c=r.$getSelection();if(!r.$isRangeSelection(c))return!1;let {anchor:d,focus:f}=c,g=d.getNode(),l=f.getNode();a=a===r.MOVE_TO_START;if(!z(g)||!z(l))return!1;let h,k;a?{node:h,offset:k}=N(l):{node:h,offset:k}=O(l);null!==h&&-1!==k&&c.setTextNodeRange(h,k,h,k);b.preventDefault();b.stopPropagation()}exports.$createCodeHighlightNode=y;exports.$createCodeNode=I;
28
+ exports.$isCodeHighlightNode=z;exports.$isCodeNode=K;exports.CodeHighlightNode=u;exports.CodeNode=A;exports.getCodeLanguages=()=>Object.keys(e.languages).filter(a=>"function"!==typeof e.languages[a]).sort();exports.getDefaultCodeLanguage=()=>"javascript";exports.getEndOfCodeInLine=O;exports.getFirstCodeHighlightNodeOfLine=J;exports.getLastCodeHighlightNodeOfLine=L;exports.getStartOfCodeInLine=N;
29
+ exports.registerCodeHighlighting=function(a){if(!a.hasNodes([A,u]))throw Error("CodeHighlightPlugin: CodeNode or CodeHighlightNode not registered on editor");return m.mergeRegister(a.registerMutationListener(A,b=>{a.update(()=>{for(let [f,g]of b)if("destroyed"!==g){var c=r.$getNodeByKey(f);if(null!==c)a:{var d=c;c=a.getElementByKey(d.getKey());if(null===c)break a;d=d.getChildren();let l=d.length;if(l===c.__cachedChildrenLength)break a;c.__cachedChildrenLength=l;let h="1",k=1;for(let n=0;n<l;n++)r.$isLineBreakNode(d[n])&&
30
+ (h+="\n"+ ++k);c.setAttribute("data-gutter",h)}}})}),a.registerNodeTransform(A,b=>Q(b,a)),a.registerNodeTransform(r.TextNode,b=>P(b,a)),a.registerNodeTransform(u,b=>P(b,a)),a.registerCommand(r.INDENT_CONTENT_COMMAND,()=>W(r.INDENT_CONTENT_COMMAND),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.OUTDENT_CONTENT_COMMAND,()=>W(r.OUTDENT_CONTENT_COMMAND),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.KEY_ARROW_UP_COMMAND,b=>Y(r.KEY_ARROW_UP_COMMAND,b),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.KEY_ARROW_DOWN_COMMAND,
31
+ b=>Y(r.KEY_ARROW_DOWN_COMMAND,b),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.MOVE_TO_END,b=>Z(r.MOVE_TO_END,b),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.MOVE_TO_START,b=>Z(r.MOVE_TO_START,b),r.COMMAND_PRIORITY_LOW))}
package/package.json CHANGED
@@ -8,13 +8,13 @@
8
8
  "code"
9
9
  ],
10
10
  "license": "MIT",
11
- "version": "0.2.7",
11
+ "version": "0.3.0",
12
12
  "main": "LexicalCode.js",
13
13
  "peerDependencies": {
14
- "lexical": "0.2.7"
14
+ "lexical": "0.3.0"
15
15
  },
16
16
  "dependencies": {
17
- "@lexical/utils": "0.2.7",
17
+ "@lexical/utils": "0.3.0",
18
18
  "prismjs": "^1.27.0"
19
19
  },
20
20
  "repository": {