@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.
- package/CodeHighlightNode.d.ts +1 -0
- package/CodeHighlighter.d.ts +2 -0
- package/CodeNode.d.ts +2 -1
- package/LexicalCode.dev.js +11 -6
- package/LexicalCode.js.flow +4 -2
- package/LexicalCode.prod.js +7 -6
- package/package.json +3 -3
package/CodeHighlightNode.d.ts
CHANGED
|
@@ -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;
|
package/CodeHighlighter.d.ts
CHANGED
|
@@ -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;
|
package/LexicalCode.dev.js
CHANGED
|
@@ -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[
|
|
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(
|
|
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() ||
|
|
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 {
|
package/LexicalCode.js.flow
CHANGED
|
@@ -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
|
|
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
|
|
package/LexicalCode.prod.js
CHANGED
|
@@ -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
|
|
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.
|
|
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(
|
|
22
|
-
nodesForReplacement:g,to:h};return w!==t||r.length?(a.splice(w,t-w,r),!0):!1})},{onUpdate:()=>{T.delete(d)},skipTransforms:!0}))}
|
|
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.
|
|
11
|
+
"version": "0.7.0",
|
|
12
12
|
"main": "LexicalCode.js",
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"lexical": "0.
|
|
14
|
+
"lexical": "0.7.0"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@lexical/utils": "0.
|
|
17
|
+
"@lexical/utils": "0.7.0",
|
|
18
18
|
"prismjs": "^1.27.0"
|
|
19
19
|
},
|
|
20
20
|
"repository": {
|