@lexical/code 0.6.4 → 0.7.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.
@@ -17,6 +17,7 @@ import 'prismjs/components/prism-sql';
17
17
  import 'prismjs/components/prism-python';
18
18
  import 'prismjs/components/prism-rust';
19
19
  import 'prismjs/components/prism-swift';
20
+ import 'prismjs/components/prism-typescript';
20
21
  export declare const DEFAULT_CODE_LANGUAGE = "javascript";
21
22
  declare type SerializedCodeHighlightNode = Spread<{
22
23
  highlightType: string | null | undefined;
@@ -17,6 +17,7 @@ import 'prismjs/components/prism-sql';
17
17
  import 'prismjs/components/prism-python';
18
18
  import 'prismjs/components/prism-rust';
19
19
  import 'prismjs/components/prism-swift';
20
+ import 'prismjs/components/prism-typescript';
20
21
  import { TextNode } from 'lexical';
21
22
  declare type TokenContent = string | Token | (string | Token)[];
22
23
  export interface Token {
@@ -24,6 +25,7 @@ export interface Token {
24
25
  content: TokenContent;
25
26
  }
26
27
  export interface Tokenizer {
28
+ defaultLanguage: string;
27
29
  tokenize(code: string, language?: string): (string | Token)[];
28
30
  }
29
31
  export declare const PrismTokenizer: Tokenizer;
package/CodeNode.d.ts CHANGED
@@ -18,6 +18,7 @@ import 'prismjs/components/prism-sql';
18
18
  import 'prismjs/components/prism-python';
19
19
  import 'prismjs/components/prism-rust';
20
20
  import 'prismjs/components/prism-swift';
21
+ import 'prismjs/components/prism-typescript';
21
22
  import { ElementNode } from 'lexical';
22
23
  export declare type SerializedCodeNode = Spread<{
23
24
  language: string | null | undefined;
@@ -36,7 +37,7 @@ export declare class CodeNode extends ElementNode {
36
37
  static importDOM(): DOMConversionMap | null;
37
38
  static importJSON(serializedNode: SerializedCodeNode): CodeNode;
38
39
  exportJSON(): SerializedCodeNode;
39
- insertNewAfter(selection: RangeSelection): null | ParagraphNode | CodeHighlightNode;
40
+ insertNewAfter(selection: RangeSelection, restoreSelection?: boolean): null | ParagraphNode | CodeHighlightNode;
40
41
  canInsertTab(): boolean;
41
42
  canIndent(): false;
42
43
  collapseAtStart(): true;
@@ -18,6 +18,7 @@ require('prismjs/components/prism-sql');
18
18
  require('prismjs/components/prism-python');
19
19
  require('prismjs/components/prism-rust');
20
20
  require('prismjs/components/prism-swift');
21
+ require('prismjs/components/prism-typescript');
21
22
  var utils = require('@lexical/utils');
22
23
  var lexical = require('lexical');
23
24
 
@@ -42,6 +43,7 @@ const CODE_LANGUAGE_FRIENDLY_NAME_MAP = {
42
43
  rust: 'Rust',
43
44
  sql: 'SQL',
44
45
  swift: 'Swift',
46
+ typescript: 'TypeScript',
45
47
  xml: 'XML'
46
48
  };
47
49
  const CODE_LANGUAGE_MAP = {
@@ -49,7 +51,8 @@ const CODE_LANGUAGE_MAP = {
49
51
  md: 'markdown',
50
52
  plaintext: 'plain',
51
53
  python: 'py',
52
- text: 'plain'
54
+ text: 'plain',
55
+ ts: 'typescript'
53
56
  };
54
57
  function normalizeCodeLang(lang) {
55
58
  return CODE_LANGUAGE_MAP[lang] || lang;
@@ -344,7 +347,7 @@ class CodeNode extends lexical.ElementNode {
344
347
  } // Mutation
345
348
 
346
349
 
347
- insertNewAfter(selection) {
350
+ insertNewAfter(selection, restoreSelection = true) {
348
351
  const children = this.getChildren();
349
352
  const childrenLength = children.length;
350
353
 
@@ -352,7 +355,7 @@ class CodeNode extends lexical.ElementNode {
352
355
  children[childrenLength - 1].remove();
353
356
  children[childrenLength - 2].remove();
354
357
  const newElement = lexical.$createParagraphNode();
355
- this.insertAfter(newElement);
358
+ this.insertAfter(newElement, restoreSelection);
356
359
  return newElement;
357
360
  } // If the selection is within the codeblock, find all leading tabs and
358
361
  // spaces of the current line. Create a new line that has all those
@@ -518,8 +521,10 @@ function isGitHubCodeTable(table) {
518
521
  *
519
522
  */
520
523
  const PrismTokenizer = {
524
+ defaultLanguage: DEFAULT_CODE_LANGUAGE,
525
+
521
526
  tokenize(code, language) {
522
- return Prism.tokenize(code, Prism.languages[language || ''] || Prism.languages[DEFAULT_CODE_LANGUAGE]);
527
+ return Prism.tokenize(code, Prism.languages[language || ''] || Prism.languages[this.defaultLanguage]);
523
528
  }
524
529
 
525
530
  };
@@ -722,7 +727,7 @@ function codeNodeTransform(node, editor, tokenizer) {
722
727
  nodesCurrentlyHighlighting.add(nodeKey); // When new code block inserted it might not have language selected
723
728
 
724
729
  if (node.getLanguage() === undefined) {
725
- node.setLanguage(DEFAULT_CODE_LANGUAGE);
730
+ node.setLanguage(tokenizer.defaultLanguage);
726
731
  } // Using nested update call to pass `skipTransforms` since we don't want
727
732
  // each individual codehighlight node to be transformed again as it's already
728
733
  // in its final state
@@ -737,7 +742,7 @@ function codeNodeTransform(node, editor, tokenizer) {
737
742
  }
738
743
 
739
744
  const code = currentNode.getTextContent();
740
- const tokens = tokenizer.tokenize(code, currentNode.getLanguage() || DEFAULT_CODE_LANGUAGE);
745
+ const tokens = tokenizer.tokenize(code, currentNode.getLanguage() || tokenizer.defaultLanguage);
741
746
  const highlightNodes = getHighlightNodes(tokens);
742
747
  const diffRange = getDiffRange(currentNode.getChildren(), highlightNodes);
743
748
  const {
@@ -22,18 +22,19 @@ import {ElementNode, TextNode} from 'lexical';
22
22
  declare export class CodeNode extends ElementNode {
23
23
  static getType(): string;
24
24
  static clone(node: CodeNode): CodeNode;
25
- constructor(key?: NodeKey): void;
25
+ constructor(language: ?string, key?: NodeKey): void;
26
26
  createDOM(config: EditorConfig): HTMLElement;
27
27
  updateDOM(prevNode: CodeNode, dom: HTMLElement): boolean;
28
28
  insertNewAfter(
29
29
  selection: RangeSelection,
30
+ restoreSelection?: boolean,
30
31
  ): null | ParagraphNode | CodeHighlightNode;
31
32
  canInsertTab(): boolean;
32
33
  collapseAtStart(): true;
33
34
  setLanguage(language: string): void;
34
35
  getLanguage(): string | void;
35
36
  }
36
- declare export function $createCodeNode(language?: string): CodeNode;
37
+ declare export function $createCodeNode(language: ?string): CodeNode;
37
38
  declare export function $isCodeNode(
38
39
  node: ?LexicalNode,
39
40
  ): boolean %checks(node instanceof CodeNode);
@@ -71,6 +72,7 @@ export interface Token {
71
72
  content: TokenContent;
72
73
  }
73
74
  export interface Tokenizer {
75
+ defaultLanguage: string;
74
76
  tokenize(code: string, language?: string): (string | Token)[];
75
77
  }
76
78
 
@@ -5,21 +5,22 @@
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 n=require("@lexical/utils"),u=require("lexical");let v={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"},x={javascript:"js",md:"markdown",plaintext:"plain",python:"py",text:"plain"};function y(a){return x[a]||a}
8
+ require("prismjs/components/prism-typescript");var n=require("@lexical/utils"),u=require("lexical");let v={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",typescript:"TypeScript",xml:"XML"},x={javascript:"js",md:"markdown",plaintext:"plain",python:"py",text:"plain",ts:"typescript"};function y(a){return x[a]||a}
9
9
  class z extends u.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);n.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&&n.removeClassNamesFromElement(b,
10
10
  a),c&&n.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 u.$applyNodeReplacement(new z(a,b))}function C(a){return a instanceof z}
11
11
  function D(a){let b=null,c=a.getPreviousSiblings();for(c.push(a);0<c.length&&(a=c.pop(),C(a)&&(b=a),!u.$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),!u.$isLineBreakNode(a)););return b}let F=a=>null!=a&&e.languages.hasOwnProperty(a)?a:void 0;function G(a,b){for(let c of a.childNodes){if(c instanceof HTMLElement&&c.tagName===b)return!0;G(c,b)}return!1}
12
12
  class H extends u.ElementNode{static getType(){return"code"}static clone(a){return new H(a.__language,a.__key)}constructor(a,b){super(b);this.__language=F(a)}createDOM(a){let 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){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)||G(a,"BR"))?{conversion:I,priority:1}:null,div:()=>({conversion:aa,priority:1}),pre:()=>({conversion:I,priority:0}),table:a=>J(a)?{conversion:ba,priority:4}:null,td:a=>{let b=a.closest("table");return a.classList.contains("js-file-line")?{conversion:ca,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);
14
- b.setFormat(a.format);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=u.$createParagraphNode(),this.insertAfter(a),a;b=a.anchor.getNode();var d=D(b);if(null!=d){c=0;
15
- for(d=d.getTextContent();c<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([u.$createLineBreakNode()]),c.select(),c}return null}canInsertTab(){let a=u.$getSelection();return u.$isRangeSelection(a)&&a.isCollapsed()?!0:!1}canIndent(){return!1}collapseAtStart(){let a=u.$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}}
14
+ b.setFormat(a.format);b.setIndent(a.indent);b.setDirection(a.direction);return b}exportJSON(){return{...super.exportJSON(),language:this.getLanguage(),type:"code",version:1}}insertNewAfter(a,b=!0){var c=this.getChildren(),d=c.length;if(2<=d&&"\n"===c[d-1].getTextContent()&&"\n"===c[d-2].getTextContent()&&a.isCollapsed()&&a.anchor.key===this.__key&&a.anchor.offset===d)return c[d-1].remove(),c[d-2].remove(),a=u.$createParagraphNode(),this.insertAfter(a,b),a;b=a.anchor.getNode();d=D(b);if(null!=d){c=
15
+ 0;for(d=d.getTextContent();c<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([u.$createLineBreakNode()]),c.select(),c}return null}canInsertTab(){let a=u.$getSelection();return u.$isRangeSelection(a)&&a.isCollapsed()?!0:!1}canIndent(){return!1}collapseAtStart(){let a=u.$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
16
  function L(a){return u.$applyNodeReplacement(new H(a))}function M(a){return a instanceof H}function I(){return{node:L(),preformatted:!0}}function aa(a){let b=null!==a.style.fontFamily.match("monospace");return b||da(a)?{after:c=>{let d=a.parentNode;null!=d&&a!==d.lastChild&&c.push(u.$createLineBreakNode());return c},node:b?L():null,preformatted:b}:{node:null}}function ba(){return{node:L(),preformatted:!0}}function K(){return{node:null}}
17
- function ca(a){return{after:b=>{a.parentNode&&a.parentNode.nextSibling&&b.push(u.$createLineBreakNode());return b},node:null}}function da(a){for(a=a.parentElement;null!==a;){if(null!==a.style.fontFamily.match("monospace"))return!0;a=a.parentElement}return!1}function J(a){return a.classList.contains("js-file-line-container")}let N={tokenize(a,b){return e.tokenize(a,e.languages[b||""]||e.languages.javascript)}};
17
+ function ca(a){return{after:b=>{a.parentNode&&a.parentNode.nextSibling&&b.push(u.$createLineBreakNode());return b},node:null}}function da(a){for(a=a.parentElement;null!==a;){if(null!==a.style.fontFamily.match("monospace"))return!0;a=a.parentElement}return!1}function J(a){return a.classList.contains("js-file-line-container")}let N={defaultLanguage:"javascript",tokenize(a,b){return e.tokenize(a,e.languages[b||""]||e.languages[this.defaultLanguage])}};
18
18
  function O(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}
19
19
  function P(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=O(g,!0);-1!==g&&(b=f,c=g)}if(u.$isLineBreakNode(f))break}if(null===b)for(a=a.getNextSiblings();0<a.length;){d=a.shift();if(C(d)&&(f=d.getTextContent(),f=O(f,!0),-1!==f)){b=d;c=f;break}if(u.$isLineBreakNode(d))break}return{node:b,offset:c}}
20
20
  function Q(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=O(g,!1);-1!==g&&(b=f,c=g+1)}if(u.$isLineBreakNode(f))break}if(null===b)for(a=a.getPreviousSiblings();0<a.length;){d=a.pop();if(C(d)&&(f=d.getTextContent(),f=O(f,!1),-1!==f)){b=d;c=f+1;break}if(u.$isLineBreakNode(d))break}return{node:b,offset:c}}function R(a,b,c){let d=a.getParent();M(d)?S(d,b,c):C(a)&&a.replace(u.$createTextNode(a.__text))}let T=new Set;
21
- function S(a,b,c){let d=a.getKey();T.has(d)||(T.add(d),void 0===a.getLanguage()&&a.setLanguage("javascript"),b.update(()=>{ea(d,()=>{var f=u.$getNodeByKey(d);if(!M(f)||!f.isAttached())return!1;var g=f.getTextContent();g=c.tokenize(g,f.getLanguage()||"javascript");g=U(g);var k=f.getChildren();for(f=0;f<k.length&&V(k[f],g[f]);)f++;var h=k.length;let l=g.length,p=Math.min(h,l)-f,m=0;for(;m<p;)if(m++,!V(k[h-m],g[l-m])){m--;break}k=f;h-=m;g=g.slice(f,l-m);let {from:w,to:t,nodesForReplacement:r}={from:k,
22
- nodesForReplacement:g,to:h};return w!==t||r.length?(a.splice(w,t-w,r),!0):!1})},{onUpdate:()=>{T.delete(d)},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(B(f));d<c.length-1&&b.push(u.$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(...U(d))});return b}
21
+ function S(a,b,c){let d=a.getKey();T.has(d)||(T.add(d),void 0===a.getLanguage()&&a.setLanguage(c.defaultLanguage),b.update(()=>{ea(d,()=>{var f=u.$getNodeByKey(d);if(!M(f)||!f.isAttached())return!1;var g=f.getTextContent();g=c.tokenize(g,f.getLanguage()||c.defaultLanguage);g=U(g);var k=f.getChildren();for(f=0;f<k.length&&V(k[f],g[f]);)f++;var h=k.length;let l=g.length,p=Math.min(h,l)-f,m=0;for(;m<p;)if(m++,!V(k[h-m],g[l-m])){m--;break}k=f;h-=m;g=g.slice(f,l-m);let {from:w,to:t,nodesForReplacement:r}=
22
+ {from:k,nodesForReplacement:g,to:h};return w!==t||r.length?(a.splice(w,t-w,r),!0):!1})},{onUpdate:()=>{T.delete(d)},skipTransforms:!0}))}
23
+ 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(B(f));d<c.length-1&&b.push(u.$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(...U(d))});return b}
23
24
  function ea(a,b){a=u.$getNodeByKey(a);if(M(a)&&a.isAttached()){var c=u.$getSelection();if(u.$isRangeSelection(c)){c=c.anchor;var d=c.offset,f="element"===c.type&&u.$isLineBreakNode(a.getChildAtIndex(c.offset-1)),g=0;if(!f){let k=c.getNode();g=d+k.getPreviousSiblings().reduce((h,l)=>h+l.getTextContentSize(),0)}b()&&(f?c.getNode().select(d,d):a.getChildren().some(k=>{let h=u.$isTextNode(k);if(h||u.$isLineBreakNode(k)){let l=k.getTextContentSize();if(h&&l>=g)return k.select(g,g),!0;g-=l}return!1}))}else b()}}
24
25
  function V(a,b){return C(a)&&C(b)?a.__text===b.__text&&a.__highlightType===b.__highlightType:u.$isLineBreakNode(a)&&u.$isLineBreakNode(b)?!0:!1}function W(a){var b=u.$getSelection();if(!u.$isRangeSelection(b)||b.isCollapsed())return!1;b=b.getNodes();for(var c=0;c<b.length;c++){var d=b[c];if(!C(d)&&!u.$isLineBreakNode(d))return!1}c=D(b[0]);null!=c&&X(c,a);for(c=1;c<b.length;c++)d=b[c],u.$isLineBreakNode(b[c-1])&&C(d)&&X(d,a);return!0}
25
26
  function X(a,b){let c=a.getTextContent();b===u.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)))}
package/package.json CHANGED
@@ -8,13 +8,13 @@
8
8
  "code"
9
9
  ],
10
10
  "license": "MIT",
11
- "version": "0.6.4",
11
+ "version": "0.7.0",
12
12
  "main": "LexicalCode.js",
13
13
  "peerDependencies": {
14
- "lexical": "0.6.4"
14
+ "lexical": "0.7.0"
15
15
  },
16
16
  "dependencies": {
17
- "@lexical/utils": "0.6.4",
17
+ "@lexical/utils": "0.7.0",
18
18
  "prismjs": "^1.27.0"
19
19
  },
20
20
  "repository": {