@lexical/code 0.2.0 → 0.2.3

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
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow strict
8
+ */
9
+
10
+ import type {
11
+ EditorConfig,
12
+ LexicalNode,
13
+ NodeKey,
14
+ ParagraphNode,
15
+ RangeSelection,
16
+ EditorThemeClasses,
17
+ LexicalEditor,
18
+ } from 'lexical';
19
+
20
+ import {ElementNode, TextNode} from 'lexical';
21
+
22
+ declare class CodeNode extends ElementNode {
23
+ static getType(): string;
24
+ static clone(node: CodeNode): CodeNode;
25
+ constructor(key?: NodeKey);
26
+ createDOM<EditorContext>(config: EditorConfig<EditorContext>): HTMLElement;
27
+ updateDOM(prevNode: CodeNode, dom: HTMLElement): boolean;
28
+ insertNewAfter(
29
+ selection: RangeSelection,
30
+ ): null | ParagraphNode | CodeHighlightNode;
31
+ canInsertTab(): true;
32
+ collapseAtStart(): true;
33
+ setLanguage(language: string): void;
34
+ getLanguage(): string | void;
35
+ }
36
+ declare function $createCodeNode(): CodeNode;
37
+ declare function $isCodeNode(node: null | undefined | LexicalNode): boolean;
38
+
39
+ declare function getFirstCodeHighlightNodeOfLine(
40
+ anchor: LexicalNode,
41
+ ): null | undefined | CodeHighlightNode;
42
+
43
+ declare function getLastCodeHighlightNodeOfLine(
44
+ anchor: LexicalNode,
45
+ ): null | undefined | CodeHighlightNode;
46
+
47
+ declare function getDefaultCodeLanguage(): string;
48
+ declare function getCodeLanguages(): Array<string>;
49
+
50
+ declare class CodeHighlightNode extends TextNode {
51
+ __highlightType: null | undefined | string;
52
+ constructor(text: string, highlightType?: string, key?: NodeKey);
53
+ static getType(): string;
54
+ static clone(node: CodeHighlightNode): CodeHighlightNode;
55
+ createDOM<EditorContext>(config: EditorConfig<EditorContext>): HTMLElement;
56
+ updateDOM<EditorContext>(
57
+ // $FlowFixMe
58
+ prevNode: CodeHighlightNode,
59
+ dom: HTMLElement,
60
+ config: EditorConfig<EditorContext>,
61
+ ): boolean;
62
+ setFormat(format: number): this;
63
+ }
64
+ declare function getHighlightThemeClass(
65
+ theme: EditorThemeClasses,
66
+ highlightType: null | undefined | string,
67
+ ): null | undefined | string;
68
+ declare function $createCodeHighlightNode(
69
+ text: string,
70
+ highlightType?: string,
71
+ ): CodeHighlightNode;
72
+ declare function $isCodeHighlightNode(node: ?LexicalNode): boolean;
73
+
74
+ declare function registerCodeHighlighting(editor: LexicalEditor): () => void;
@@ -376,7 +376,7 @@ function textNodeTransform(node, editor) {
376
376
  const parentNode = node.getParent();
377
377
 
378
378
  if ($isCodeNode(parentNode)) {
379
- codeNodeTransform(parentNode);
379
+ codeNodeTransform(parentNode, editor);
380
380
  } else if ($isCodeHighlightNode(node)) {
381
381
  // When code block converted into paragraph or other element
382
382
  // code highlight nodes converted back to normal text
@@ -411,31 +411,55 @@ function updateCodeGutter(node, editor) {
411
411
  }
412
412
 
413
413
  codeElement.setAttribute('data-gutter', gutter);
414
- }
414
+ } // Using `skipTransforms` to prevent extra transforms since reformatting the code
415
+ // will not affect code block content itself.
416
+ //
417
+ // Using extra flag (`isHighlighting`) since both CodeNode and CodeHighlightNode
418
+ // trasnforms might be called at the same time (e.g. new CodeHighlight node inserted) and
419
+ // in both cases we'll rerun whole reformatting over CodeNode, which is redundant.
420
+ // Especially when pasting code into CodeBlock.
421
+
422
+
423
+ let isHighlighting = false;
415
424
 
416
425
  function codeNodeTransform(node, editor) {
417
- // When new code block inserted it might not have language selected
426
+ if (isHighlighting) {
427
+ return;
428
+ }
429
+
430
+ isHighlighting = true; // When new code block inserted it might not have language selected
431
+
418
432
  if (node.getLanguage() === undefined) {
419
433
  node.setLanguage(DEFAULT_CODE_LANGUAGE);
420
- }
434
+ } // Using nested update call to pass `skipTransforms` since we don't want
435
+ // each individual codehighlight node to be transformed again as it's already
436
+ // in its final state
421
437
 
422
- updateAndRetainSelection(node, () => {
423
- const code = node.getTextContent();
424
- const tokens = Prism.tokenize(code, Prism.languages[node.getLanguage() || ''] || Prism.languages[DEFAULT_CODE_LANGUAGE]);
425
- const highlightNodes = getHighlightNodes(tokens);
426
- const diffRange = getDiffRange(node.getChildren(), highlightNodes);
427
- const {
428
- from,
429
- to,
430
- nodesForReplacement
431
- } = diffRange;
432
-
433
- if (from !== to || nodesForReplacement.length) {
434
- node.splice(from, to - from, nodesForReplacement);
435
- return true;
436
- }
437
438
 
438
- return false;
439
+ editor.update(() => {
440
+ updateAndRetainSelection(node, () => {
441
+ const code = node.getTextContent();
442
+ const tokens = Prism.tokenize(code, Prism.languages[node.getLanguage() || ''] || Prism.languages[DEFAULT_CODE_LANGUAGE]);
443
+ const highlightNodes = getHighlightNodes(tokens);
444
+ const diffRange = getDiffRange(node.getChildren(), highlightNodes);
445
+ const {
446
+ from,
447
+ to,
448
+ nodesForReplacement
449
+ } = diffRange;
450
+
451
+ if (from !== to || nodesForReplacement.length) {
452
+ node.splice(from, to - from, nodesForReplacement);
453
+ return true;
454
+ }
455
+
456
+ return false;
457
+ });
458
+ }, {
459
+ onUpdate: () => {
460
+ isHighlighting = false;
461
+ },
462
+ skipTransforms: true
439
463
  });
440
464
  }
441
465
 
@@ -644,7 +668,7 @@ function handleShiftLines(type, event) {
644
668
  // We only care about the alt+arrow keys
645
669
  const selection = lexical.$getSelection();
646
670
 
647
- if (!event.altKey || !lexical.$isRangeSelection(selection)) {
671
+ if (!lexical.$isRangeSelection(selection)) {
648
672
  return false;
649
673
  } // I'm not quite sure why, but it seems like calling anchor.getNode() collapses the selection here
650
674
  // So first, get the anchor and the focus, then get their nodes
@@ -657,12 +681,41 @@ function handleShiftLines(type, event) {
657
681
  const anchorOffset = anchor.offset;
658
682
  const focusOffset = focus.offset;
659
683
  const anchorNode = anchor.getNode();
660
- const focusNode = focus.getNode(); // Ensure the selection is within the codeblock
684
+ const focusNode = focus.getNode();
685
+ const arrowIsUp = type === lexical.KEY_ARROW_UP_COMMAND; // Ensure the selection is within the codeblock
661
686
 
662
687
  if (!$isCodeHighlightNode(anchorNode) || !$isCodeHighlightNode(focusNode)) {
663
688
  return false;
664
689
  }
665
690
 
691
+ if (!event.altKey) {
692
+ // Handle moving selection out of the code block, given there are no
693
+ // sibling thats can natively take the selection.
694
+ if (selection.isCollapsed()) {
695
+ const codeNode = anchorNode.getParentOrThrow();
696
+
697
+ if (arrowIsUp && anchorOffset === 0 && anchorNode.getPreviousSibling() === null) {
698
+ const codeNodeSibling = codeNode.getPreviousSibling();
699
+
700
+ if (codeNodeSibling === null) {
701
+ codeNode.selectPrevious();
702
+ event.preventDefault();
703
+ return true;
704
+ }
705
+ } else if (!arrowIsUp && anchorOffset === anchorNode.getTextContentSize() && anchorNode.getNextSibling() === null) {
706
+ const codeNodeSibling = codeNode.getNextSibling();
707
+
708
+ if (codeNodeSibling === null) {
709
+ codeNode.selectNext();
710
+ event.preventDefault();
711
+ return true;
712
+ }
713
+ }
714
+ }
715
+
716
+ return false;
717
+ }
718
+
666
719
  const start = getFirstCodeHighlightNodeOfLine(anchorNode);
667
720
  const end = getLastCodeHighlightNodeOfLine(focusNode);
668
721
 
@@ -686,7 +739,6 @@ function handleShiftLines(type, event) {
686
739
  event.preventDefault();
687
740
  event.stopPropagation(); // required to stop cursor movement under Firefox
688
741
 
689
- const arrowIsUp = type === lexical.KEY_ARROW_UP_COMMAND;
690
742
  const linebreak = arrowIsUp ? start.getPreviousSibling() : end.getNextSibling();
691
743
 
692
744
  if (!lexical.$isLineBreakNode(linebreak)) {
@@ -737,7 +789,7 @@ function registerCodeHighlighting(editor) {
737
789
  }
738
790
  }
739
791
  });
740
- }), editor.registerNodeTransform(CodeNode, node => codeNodeTransform(node)), editor.registerNodeTransform(lexical.TextNode, node => textNodeTransform(node)), editor.registerNodeTransform(CodeHighlightNode, node => textNodeTransform(node)), editor.registerCommand(lexical.INDENT_CONTENT_COMMAND, payload => handleMultilineIndent(lexical.INDENT_CONTENT_COMMAND), 1), editor.registerCommand(lexical.OUTDENT_CONTENT_COMMAND, payload => handleMultilineIndent(lexical.OUTDENT_CONTENT_COMMAND), 1), editor.registerCommand(lexical.KEY_ARROW_UP_COMMAND, payload => handleShiftLines(lexical.KEY_ARROW_UP_COMMAND, payload), 1), editor.registerCommand(lexical.KEY_ARROW_DOWN_COMMAND, payload => handleShiftLines(lexical.KEY_ARROW_DOWN_COMMAND, payload), 1));
792
+ }), 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));
741
793
  }
742
794
 
743
795
  exports.$createCodeHighlightNode = $createCodeHighlightNode;
@@ -17,7 +17,7 @@ import type {
17
17
  LexicalEditor,
18
18
  } from 'lexical';
19
19
 
20
- import {ElementNode} from 'lexical';
20
+ import {ElementNode, TextNode} from 'lexical';
21
21
 
22
22
  declare export class CodeNode extends ElementNode {
23
23
  static getType(): string;
@@ -46,7 +46,8 @@ declare export function getLastCodeHighlightNodeOfLine(
46
46
  anchor: LexicalNode,
47
47
  ): ?CodeHighlightNode;
48
48
 
49
- import {TextNode} from 'lexical';
49
+ declare export function getDefaultCodeLanguage(): string;
50
+ declare export function getCodeLanguages(): Array<string>;
50
51
 
51
52
  declare export class CodeHighlightNode extends TextNode {
52
53
  __highlightType: ?string;
@@ -74,4 +75,6 @@ declare export function $isCodeHighlightNode(
74
75
  node: ?LexicalNode,
75
76
  ): boolean %checks(node instanceof CodeHighlightNode);
76
77
 
77
- declare export function registerCodeHighlighting(editor: LexicalEditor): () => void;
78
+ declare export function registerCodeHighlighting(
79
+ editor: LexicalEditor,
80
+ ): () => void;
@@ -6,21 +6,23 @@
6
6
  */
7
7
  var e=require("prismjs/components/prism-core");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
8
  var n=require("@lexical/utils"),r=require("lexical");
9
- class t extends r.TextNode{constructor(a,b,c){super(a,c);this.__highlightType=b}static getType(){return"code-highlight"}static clone(a){return new t(a.__text,a.__highlightType||void 0,a.__key)}createDOM(a){const b=super.createDOM(a);a=u(a.theme,this.__highlightType);n.addClassNamesToElement(b,a);return b}updateDOM(a,b,c){const d=super.updateDOM(a,b,c);a=u(c.theme,a.__highlightType);c=u(c.theme,this.__highlightType);a!==c&&(a&&n.removeClassNamesFromElement(b,a),c&&n.addClassNamesToElement(b,c));return d}setFormat(){return this.getWritable()}}
10
- function u(a,b){return b&&a&&a.codeHighlight&&a.codeHighlight[b]}function w(a,b){return new t(a,b)}function x(a){return a instanceof t}
11
- class y extends r.ElementNode{static getType(){return"code"}static clone(a){return new y(a.__language,a.__key)}constructor(a,b){super(b);this.__language=a}createDOM(a){const b=document.createElement("code");n.addClassNamesToElement(b,a.theme.code);b.setAttribute("spellcheck","false");(a=this.getLanguage())&&b.setAttribute("data-highlight-language",a);return b}updateDOM(a,b){const 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:A,priority:1}),pre:()=>({conversion:B,priority:0}),table:a=>C(a)?{conversion:D,priority:4}:null,td:a=>{const b=a.closest("table");return a.classList.contains("js-file-line")?{conversion:E,priority:4}:b&&C(b)?{conversion:F,priority:4}:null},tr:a=>(a=a.closest("table"))&&C(a)?{conversion:F,priority:4}:null}}insertNewAfter(a){var b=this.getChildren(),c=b.length;if(2<=c&&"\n"===b[c-1].getTextContent()&&"\n"===b[c-2].getTextContent()&&a.isCollapsed()&&
13
- 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=G(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=w(c),b.insertAfter(c),a.insertNodes([r.$createLineBreakNode()]),c.select(),c}return null}canInsertTab(){return!0}collapseAtStart(){const a=r.$createParagraphNode();this.getChildren().forEach(b=>a.append(b));this.replace(a);
14
- return!0}setLanguage(a){this.getWritable().__language=a}getLanguage(){return this.getLatest().__language}}function H(a){return new y(a)}function I(a){return a instanceof y}function G(a){let b=null;const c=a.getPreviousSiblings();for(c.push(a);0<c.length&&(a=c.pop(),x(a)&&(b=a),!r.$isLineBreakNode(a)););return b}function J(a){let b=null;const c=a.getNextSiblings();for(c.unshift(a);0<c.length&&(a=c.shift(),x(a)&&(b=a),!r.$isLineBreakNode(a)););return b}function B(){return{node:H()}}
15
- function A(a){return{after:b=>{const c=a.parentNode;null!=c&&a!==c.lastChild&&b.push(r.$createLineBreakNode());return b},node:null!==a.style.fontFamily.match("monospace")?H():null}}function D(){return{node:H()}}function F(){return{node:null}}function E(a){return{after:b=>{a.parentNode&&a.parentNode.nextSibling&&b.push(r.$createLineBreakNode());return b},node:null}}function C(a){return a.classList.contains("js-file-line-container")}
16
- function K(a){const b=a.getParent();I(b)?L(b):x(a)&&a.replace(r.$createTextNode(a.__text))}
17
- function L(a){void 0===a.getLanguage()&&a.setLanguage("javascript");M(a,()=>{var b=a.getTextContent();b=e.tokenize(b,e.languages[a.getLanguage()||""]||e.languages.javascript);b=O(b);var c=a.getChildren();let d=0;for(;d<c.length&&P(c[d],b[d]);)d++;var h=c.length;const k=b.length,l=Math.min(h,k)-d;let f=0;for(;f<l;)if(f++,!P(c[h-f],b[k-f])){f--;break}c=d;h-=f;b=b.slice(d,k-f);const {from:m,to:g,nodesForReplacement:p}={from:c,nodesForReplacement:b,to:h};return m!==g||p.length?(a.splice(m,g-m,p),!0):
18
- !1})}function O(a){const b=[];a.forEach(c=>{if("string"===typeof c){c=c.split("\n");for(var d=0;d<c.length;d++){const h=c[d];h.length&&b.push(w(h));d<c.length-1&&b.push(r.$createLineBreakNode())}}else({content:d}=c),"string"===typeof d?b.push(w(d,c.type)):1===d.length&&"string"===typeof d[0]?b.push(w(d[0],c.type)):b.push(...O(d))});return b}
19
- function M(a,b){var c=r.$getSelection();if(r.$isRangeSelection(c)&&c.anchor){c=c.anchor;var d=c.offset,h="element"===c.type&&r.$isLineBreakNode(a.getChildAtIndex(c.offset-1)),k=0;if(!h){const l=c.getNode();k=d+l.getPreviousSiblings().reduce((f,m)=>f+(r.$isLineBreakNode(m)?0:m.getTextContentSize()),0)}b()&&(h?c.getNode().select(d,d):a.getChildren().some(l=>{if(r.$isTextNode(l)){const f=l.getTextContentSize();if(f>=k)return l.select(k,k),!0;k-=f}return!1}))}}
20
- function P(a,b){return x(a)&&x(b)?a.__text===b.__text&&a.__highlightType===b.__highlightType:r.$isLineBreakNode(a)&&r.$isLineBreakNode(b)?!0:!1}function Q(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(!x(d)&&!r.$isLineBreakNode(d))return!1}c=G(b[0]);null!=c&&R(c,a);for(c=1;c<b.length;c++)d=b[c],r.$isLineBreakNode(b[c-1])&&x(d)&&R(d,a);return!0}
21
- function R(a,b){const c=a.getTextContent();b===r.INDENT_CONTENT_COMMAND?0<c.length&&/\s/.test(c[0])?a.setTextContent("\t"+c):(b=w("\t"),a.insertBefore(b)):0===c.indexOf("\t")&&(1===c.length?a.remove():a.setTextContent(c.substring(1)))}
22
- function S(a,b){const c=r.$getSelection();if(!b.altKey||!r.$isRangeSelection(c))return!1;const {anchor:d,focus:h}=c,k=d.offset,l=h.offset,f=d.getNode(),m=h.getNode();if(!x(f)||!x(m))return!1;var g=G(f),p=J(m);if(null==g||null==p)return!1;const z=g.getNodesBetween(p);for(let q=0;q<z.length;q++){const N=z[q];if(!x(N)&&!r.$isLineBreakNode(N))return!1}b.preventDefault();b.stopPropagation();g=(b=a===r.KEY_ARROW_UP_COMMAND)?g.getPreviousSibling():p.getNextSibling();if(!r.$isLineBreakNode(g))return!0;p=
23
- b?g.getPreviousSibling():g.getNextSibling();if(null==p)return!0;b=b?G(p):J(p);let v=null!=b?b:p;g.remove();z.forEach(q=>q.remove());a===r.KEY_ARROW_UP_COMMAND?(z.forEach(q=>v.insertBefore(q)),v.insertBefore(g)):(v.insertAfter(g),v=g,z.forEach(q=>{v.insertAfter(q);v=q}));c.setTextNodeRange(f,k,m,l);return!0}exports.$createCodeHighlightNode=w;exports.$createCodeNode=H;exports.$isCodeHighlightNode=x;exports.$isCodeNode=I;exports.CodeHighlightNode=t;exports.CodeNode=y;
24
- exports.getCodeLanguages=()=>Object.keys(e.languages).filter(a=>"function"!==typeof e.languages[a]).sort();exports.getDefaultCodeLanguage=()=>"javascript";exports.getFirstCodeHighlightNodeOfLine=G;exports.getLastCodeHighlightNodeOfLine=J;
25
- exports.registerCodeHighlighting=function(a){if(!a.hasNodes([y,t]))throw Error("CodeHighlightPlugin: CodeNode or CodeHighlightNode not registered on editor");return n.mergeRegister(a.registerMutationListener(y,b=>{a.update(()=>{for(const [h,k]of b)if("destroyed"!==k){var c=r.$getNodeByKey(h);if(null!==c)a:{var d=c;c=a.getElementByKey(d.getKey());if(null===c)break a;d=d.getChildren();const l=d.length;if(l===c.__cachedChildrenLength)break a;c.__cachedChildrenLength=l;let f="1",m=1;for(let g=0;g<l;g++)r.$isLineBreakNode(d[g])&&
26
- (f+="\n"+ ++m);c.setAttribute("data-gutter",f)}}})}),a.registerNodeTransform(y,b=>L(b)),a.registerNodeTransform(r.TextNode,b=>K(b)),a.registerNodeTransform(t,b=>K(b)),a.registerCommand(r.INDENT_CONTENT_COMMAND,()=>Q(r.INDENT_CONTENT_COMMAND),1),a.registerCommand(r.OUTDENT_CONTENT_COMMAND,()=>Q(r.OUTDENT_CONTENT_COMMAND),1),a.registerCommand(r.KEY_ARROW_UP_COMMAND,b=>S(r.KEY_ARROW_UP_COMMAND,b),1),a.registerCommand(r.KEY_ARROW_DOWN_COMMAND,b=>S(r.KEY_ARROW_DOWN_COMMAND,b),1))};
9
+ class t extends r.TextNode{constructor(a,c,b){super(a,b);this.__highlightType=c}static getType(){return"code-highlight"}static clone(a){return new t(a.__text,a.__highlightType||void 0,a.__key)}createDOM(a){const c=super.createDOM(a);a=u(a.theme,this.__highlightType);n.addClassNamesToElement(c,a);return c}updateDOM(a,c,b){const d=super.updateDOM(a,c,b);a=u(b.theme,a.__highlightType);b=u(b.theme,this.__highlightType);a!==b&&(a&&n.removeClassNamesFromElement(c,a),b&&n.addClassNamesToElement(c,b));return d}setFormat(){return this.getWritable()}}
10
+ function u(a,c){return c&&a&&a.codeHighlight&&a.codeHighlight[c]}function x(a,c){return new t(a,c)}function y(a){return a instanceof t}
11
+ class z extends r.ElementNode{static getType(){return"code"}static clone(a){return new z(a.__language,a.__key)}constructor(a,c){super(c);this.__language=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:B,priority:1}),pre:()=>({conversion:C,priority:0}),table:a=>D(a)?{conversion:E,priority:4}:null,td:a=>{const c=a.closest("table");return a.classList.contains("js-file-line")?{conversion:F,priority:4}:c&&D(c)?{conversion:G,priority:4}:null},tr:a=>(a=a.closest("table"))&&D(a)?{conversion:G,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=H(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=x(b),c.insertAfter(b),a.insertNodes([r.$createLineBreakNode()]),b.select(),b}return null}canInsertTab(){return!0}collapseAtStart(){const a=r.$createParagraphNode();this.getChildren().forEach(c=>a.append(c));this.replace(a);
14
+ return!0}setLanguage(a){this.getWritable().__language=a}getLanguage(){return this.getLatest().__language}}function I(a){return new z(a)}function J(a){return a instanceof z}function H(a){let c=null;const b=a.getPreviousSiblings();for(b.push(a);0<b.length&&(a=b.pop(),y(a)&&(c=a),!r.$isLineBreakNode(a)););return c}function K(a){let c=null;const b=a.getNextSiblings();for(b.unshift(a);0<b.length&&(a=b.shift(),y(a)&&(c=a),!r.$isLineBreakNode(a)););return c}function C(){return{node:I()}}
15
+ function B(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")?I():null}}function E(){return{node:I()}}function G(){return{node:null}}function F(a){return{after:c=>{a.parentNode&&a.parentNode.nextSibling&&c.push(r.$createLineBreakNode());return c},node:null}}function D(a){return a.classList.contains("js-file-line-container")}
16
+ function L(a,c){const b=a.getParent();J(b)?M(b,c):y(a)&&a.replace(r.$createTextNode(a.__text))}let N=!1;
17
+ function M(a,c){N||(N=!0,void 0===a.getLanguage()&&a.setLanguage("javascript"),c.update(()=>{O(a,()=>{var b=a.getTextContent();b=e.tokenize(b,e.languages[a.getLanguage()||""]||e.languages.javascript);b=Q(b);var d=a.getChildren();let f=0;for(;f<d.length&&R(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++,!R(d[h-k],b[m-k])){k--;break}d=f;h-=k;b=b.slice(f,m-k);const {from:l,to:p,nodesForReplacement:v}={from:d,nodesForReplacement:b,to:h};return l!==p||v.length?
18
+ (a.splice(l,p-l,v),!0):!1})},{onUpdate:()=>{N=!1},skipTransforms:!0}))}function Q(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(x(f));d<b.length-1&&c.push(r.$createLineBreakNode())}}else({content:d}=b),"string"===typeof d?c.push(x(d,b.type)):1===d.length&&"string"===typeof d[0]?c.push(x(d[0],b.type)):c.push(...Q(d))});return c}
19
+ function O(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 R(a,c){return y(a)&&y(c)?a.__text===c.__text&&a.__highlightType===c.__highlightType:r.$isLineBreakNode(a)&&r.$isLineBreakNode(c)?!0:!1}function S(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(!y(d)&&!r.$isLineBreakNode(d))return!1}b=H(c[0]);null!=b&&T(b,a);for(b=1;b<c.length;b++)d=c[b],r.$isLineBreakNode(c[b-1])&&y(d)&&T(d,a);return!0}
21
+ function T(a,c){const b=a.getTextContent();c===r.INDENT_CONTENT_COMMAND?0<b.length&&/\s/.test(b[0])?a.setTextContent("\t"+b):(c=x("\t"),a.insertBefore(c)):0===b.indexOf("\t")&&(1===b.length?a.remove():a.setTextContent(b.substring(1)))}
22
+ function U(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(!y(g)||!y(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=H(g);const v=K(k);if(null==p||null==v)return!1;const A=p.getNodesBetween(v);for(let q=0;q<A.length;q++){const P=A[q];if(!y(P)&&!r.$isLineBreakNode(P))return!1}c.preventDefault();c.stopPropagation();c=l?p.getPreviousSibling():v.getNextSibling();if(!r.$isLineBreakNode(c))return!0;p=l?c.getPreviousSibling():c.getNextSibling();if(null==p)return!0;l=l?H(p):K(p);let w=null!=l?l:p;c.remove();A.forEach(q=>q.remove());a===r.KEY_ARROW_UP_COMMAND?(A.forEach(q=>w.insertBefore(q)),
24
+ w.insertBefore(c)):(w.insertAfter(c),w=c,A.forEach(q=>{w.insertAfter(q);w=q}));b.setTextNodeRange(g,h,k,m);return!0}exports.$createCodeHighlightNode=x;exports.$createCodeNode=I;exports.$isCodeHighlightNode=y;exports.$isCodeNode=J;exports.CodeHighlightNode=t;exports.CodeNode=z;exports.getCodeLanguages=()=>Object.keys(e.languages).filter(a=>"function"!==typeof e.languages[a]).sort();exports.getDefaultCodeLanguage=()=>"javascript";exports.getFirstCodeHighlightNodeOfLine=H;
25
+ exports.getLastCodeHighlightNodeOfLine=K;
26
+ exports.registerCodeHighlighting=function(a){if(!a.hasNodes([z,t]))throw Error("CodeHighlightPlugin: CodeNode or CodeHighlightNode not registered on editor");return n.mergeRegister(a.registerMutationListener(z,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(z,c=>M(c,a)),a.registerNodeTransform(r.TextNode,c=>L(c,a)),a.registerNodeTransform(t,c=>L(c,a)),a.registerCommand(r.INDENT_CONTENT_COMMAND,()=>S(r.INDENT_CONTENT_COMMAND),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.OUTDENT_CONTENT_COMMAND,()=>S(r.OUTDENT_CONTENT_COMMAND),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.KEY_ARROW_UP_COMMAND,c=>U(r.KEY_ARROW_UP_COMMAND,c),r.COMMAND_PRIORITY_LOW),a.registerCommand(r.KEY_ARROW_DOWN_COMMAND,
28
+ c=>U(r.KEY_ARROW_DOWN_COMMAND,c),r.COMMAND_PRIORITY_LOW))};
package/package.json CHANGED
@@ -8,14 +8,14 @@
8
8
  "code"
9
9
  ],
10
10
  "license": "MIT",
11
- "version": "0.2.0",
11
+ "version": "0.2.3",
12
12
  "main": "LexicalCode.js",
13
13
  "peerDependencies": {
14
- "lexical": "0.2.0"
14
+ "lexical": "0.2.3"
15
15
  },
16
16
  "dependencies": {
17
- "@lexical/utils": "0.2.0",
18
- "prismjs": "^1.25.0"
17
+ "@lexical/utils": "0.2.3",
18
+ "prismjs": "^1.27.0"
19
19
  },
20
20
  "repository": {
21
21
  "type": "git",