@lexical/code 0.5.1-next.1 → 0.5.1-next.2
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/CodeHighlighter.d.ts +11 -1
- package/LexicalCode.dev.js +47 -14
- package/LexicalCode.js.flow +11 -0
- package/LexicalCode.prod.js +25 -24
- package/index.d.ts +1 -1
- package/package.json +3 -3
package/CodeHighlighter.d.ts
CHANGED
|
@@ -18,6 +18,15 @@ import 'prismjs/components/prism-python';
|
|
|
18
18
|
import 'prismjs/components/prism-rust';
|
|
19
19
|
import 'prismjs/components/prism-swift';
|
|
20
20
|
import { TextNode } from 'lexical';
|
|
21
|
+
declare type TokenContent = string | Token | (string | Token)[];
|
|
22
|
+
export interface Token {
|
|
23
|
+
type: string;
|
|
24
|
+
content: TokenContent;
|
|
25
|
+
}
|
|
26
|
+
export interface Tokenizer {
|
|
27
|
+
tokenize(code: string, language?: string): (string | Token)[];
|
|
28
|
+
}
|
|
29
|
+
export declare const PrismTokenizer: Tokenizer;
|
|
21
30
|
export declare function getStartOfCodeInLine(anchor: LexicalNode): {
|
|
22
31
|
node: TextNode | null;
|
|
23
32
|
offset: number;
|
|
@@ -26,4 +35,5 @@ export declare function getEndOfCodeInLine(anchor: LexicalNode): {
|
|
|
26
35
|
node: TextNode | null;
|
|
27
36
|
offset: number;
|
|
28
37
|
};
|
|
29
|
-
export declare function registerCodeHighlighting(editor: LexicalEditor): () => void;
|
|
38
|
+
export declare function registerCodeHighlighting(editor: LexicalEditor, tokenizer?: Tokenizer): () => void;
|
|
39
|
+
export {};
|
package/LexicalCode.dev.js
CHANGED
|
@@ -433,6 +433,13 @@ function convertDivElement(domNode) {
|
|
|
433
433
|
// domNode is a <div> since we matched it by nodeName
|
|
434
434
|
const div = domNode;
|
|
435
435
|
const isCode = isCodeElement(div);
|
|
436
|
+
|
|
437
|
+
if (!isCode && !isCodeChildElement(div)) {
|
|
438
|
+
return {
|
|
439
|
+
node: null
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
|
|
436
443
|
return {
|
|
437
444
|
after: childLexicalNodes => {
|
|
438
445
|
const domParent = domNode.parentNode;
|
|
@@ -481,6 +488,20 @@ function isCodeElement(div) {
|
|
|
481
488
|
return div.style.fontFamily.match('monospace') !== null;
|
|
482
489
|
}
|
|
483
490
|
|
|
491
|
+
function isCodeChildElement(node) {
|
|
492
|
+
let parent = node.parentElement;
|
|
493
|
+
|
|
494
|
+
while (parent !== null) {
|
|
495
|
+
if (isCodeElement(parent)) {
|
|
496
|
+
return true;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
parent = parent.parentElement;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
return false;
|
|
503
|
+
}
|
|
504
|
+
|
|
484
505
|
function isGitHubCodeCell(cell) {
|
|
485
506
|
return cell.classList.contains('js-file-line');
|
|
486
507
|
}
|
|
@@ -496,6 +517,12 @@ function isGitHubCodeTable(table) {
|
|
|
496
517
|
* LICENSE file in the root directory of this source tree.
|
|
497
518
|
*
|
|
498
519
|
*/
|
|
520
|
+
const PrismTokenizer = {
|
|
521
|
+
tokenize(code, language) {
|
|
522
|
+
return Prism.tokenize(code, Prism.languages[language || ''] || Prism.languages[DEFAULT_CODE_LANGUAGE]);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
};
|
|
499
526
|
|
|
500
527
|
function isSpaceOrTabChar(char) {
|
|
501
528
|
return char === ' ' || char === '\t';
|
|
@@ -633,13 +660,13 @@ function getEndOfCodeInLine(anchor) {
|
|
|
633
660
|
};
|
|
634
661
|
}
|
|
635
662
|
|
|
636
|
-
function textNodeTransform(node, editor) {
|
|
663
|
+
function textNodeTransform(node, editor, tokenizer) {
|
|
637
664
|
// Since CodeNode has flat children structure we only need to check
|
|
638
665
|
// if node's parent is a code node and run highlighting if so
|
|
639
666
|
const parentNode = node.getParent();
|
|
640
667
|
|
|
641
668
|
if ($isCodeNode(parentNode)) {
|
|
642
|
-
codeNodeTransform(parentNode, editor);
|
|
669
|
+
codeNodeTransform(parentNode, editor, tokenizer);
|
|
643
670
|
} else if ($isCodeHighlightNode(node)) {
|
|
644
671
|
// When code block converted into paragraph or other element
|
|
645
672
|
// code highlight nodes converted back to normal text
|
|
@@ -677,29 +704,30 @@ function updateCodeGutter(node, editor) {
|
|
|
677
704
|
} // Using `skipTransforms` to prevent extra transforms since reformatting the code
|
|
678
705
|
// will not affect code block content itself.
|
|
679
706
|
//
|
|
680
|
-
// Using extra
|
|
707
|
+
// Using extra cache (`nodesCurrentlyHighlighting`) since both CodeNode and CodeHighlightNode
|
|
681
708
|
// transforms might be called at the same time (e.g. new CodeHighlight node inserted) and
|
|
682
709
|
// in both cases we'll rerun whole reformatting over CodeNode, which is redundant.
|
|
683
710
|
// Especially when pasting code into CodeBlock.
|
|
684
711
|
|
|
685
712
|
|
|
686
|
-
|
|
713
|
+
const nodesCurrentlyHighlighting = new Set();
|
|
714
|
+
|
|
715
|
+
function codeNodeTransform(node, editor, tokenizer) {
|
|
716
|
+
const nodeKey = node.getKey();
|
|
687
717
|
|
|
688
|
-
|
|
689
|
-
if (isHighlighting) {
|
|
718
|
+
if (nodesCurrentlyHighlighting.has(nodeKey)) {
|
|
690
719
|
return;
|
|
691
720
|
}
|
|
692
721
|
|
|
693
|
-
|
|
722
|
+
nodesCurrentlyHighlighting.add(nodeKey); // When new code block inserted it might not have language selected
|
|
694
723
|
|
|
695
724
|
if (node.getLanguage() === undefined) {
|
|
696
725
|
node.setLanguage(DEFAULT_CODE_LANGUAGE);
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
const nodeKey = node.getKey(); // Using nested update call to pass `skipTransforms` since we don't want
|
|
726
|
+
} // Using nested update call to pass `skipTransforms` since we don't want
|
|
700
727
|
// each individual codehighlight node to be transformed again as it's already
|
|
701
728
|
// in its final state
|
|
702
729
|
|
|
730
|
+
|
|
703
731
|
editor.update(() => {
|
|
704
732
|
updateAndRetainSelection(nodeKey, () => {
|
|
705
733
|
const currentNode = lexical.$getNodeByKey(nodeKey);
|
|
@@ -709,7 +737,7 @@ function codeNodeTransform(node, editor) {
|
|
|
709
737
|
}
|
|
710
738
|
|
|
711
739
|
const code = currentNode.getTextContent();
|
|
712
|
-
const tokens =
|
|
740
|
+
const tokens = tokenizer.tokenize(code, currentNode.getLanguage() || DEFAULT_CODE_LANGUAGE);
|
|
713
741
|
const highlightNodes = getHighlightNodes(tokens);
|
|
714
742
|
const diffRange = getDiffRange(currentNode.getChildren(), highlightNodes);
|
|
715
743
|
const {
|
|
@@ -727,7 +755,7 @@ function codeNodeTransform(node, editor) {
|
|
|
727
755
|
});
|
|
728
756
|
}, {
|
|
729
757
|
onUpdate: () => {
|
|
730
|
-
|
|
758
|
+
nodesCurrentlyHighlighting.delete(nodeKey);
|
|
731
759
|
},
|
|
732
760
|
skipTransforms: true
|
|
733
761
|
});
|
|
@@ -1093,11 +1121,15 @@ function handleMoveTo(type, event) {
|
|
|
1093
1121
|
return true;
|
|
1094
1122
|
}
|
|
1095
1123
|
|
|
1096
|
-
function registerCodeHighlighting(editor) {
|
|
1124
|
+
function registerCodeHighlighting(editor, tokenizer) {
|
|
1097
1125
|
if (!editor.hasNodes([CodeNode, CodeHighlightNode])) {
|
|
1098
1126
|
throw new Error('CodeHighlightPlugin: CodeNode or CodeHighlightNode not registered on editor');
|
|
1099
1127
|
}
|
|
1100
1128
|
|
|
1129
|
+
if (tokenizer == null) {
|
|
1130
|
+
tokenizer = PrismTokenizer;
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1101
1133
|
return utils.mergeRegister(editor.registerMutationListener(CodeNode, mutations => {
|
|
1102
1134
|
editor.update(() => {
|
|
1103
1135
|
for (const [key, type] of mutations) {
|
|
@@ -1110,7 +1142,7 @@ function registerCodeHighlighting(editor) {
|
|
|
1110
1142
|
}
|
|
1111
1143
|
}
|
|
1112
1144
|
});
|
|
1113
|
-
}), 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));
|
|
1145
|
+
}), editor.registerNodeTransform(CodeNode, node => codeNodeTransform(node, editor, tokenizer)), editor.registerNodeTransform(lexical.TextNode, node => textNodeTransform(node, editor, tokenizer)), editor.registerNodeTransform(CodeHighlightNode, node => textNodeTransform(node, editor, tokenizer)), 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));
|
|
1114
1146
|
}
|
|
1115
1147
|
|
|
1116
1148
|
exports.$createCodeHighlightNode = $createCodeHighlightNode;
|
|
@@ -1122,6 +1154,7 @@ exports.CODE_LANGUAGE_MAP = CODE_LANGUAGE_MAP;
|
|
|
1122
1154
|
exports.CodeHighlightNode = CodeHighlightNode;
|
|
1123
1155
|
exports.CodeNode = CodeNode;
|
|
1124
1156
|
exports.DEFAULT_CODE_LANGUAGE = DEFAULT_CODE_LANGUAGE;
|
|
1157
|
+
exports.PrismTokenizer = PrismTokenizer;
|
|
1125
1158
|
exports.getCodeLanguages = getCodeLanguages;
|
|
1126
1159
|
exports.getDefaultCodeLanguage = getDefaultCodeLanguage;
|
|
1127
1160
|
exports.getEndOfCodeInLine = getEndOfCodeInLine;
|
package/LexicalCode.js.flow
CHANGED
|
@@ -64,6 +64,16 @@ declare export class CodeHighlightNode extends TextNode {
|
|
|
64
64
|
): boolean;
|
|
65
65
|
setFormat(format: number): this;
|
|
66
66
|
}
|
|
67
|
+
|
|
68
|
+
type TokenContent = string | Token | (string | Token)[];
|
|
69
|
+
export interface Token {
|
|
70
|
+
type: string;
|
|
71
|
+
content: TokenContent;
|
|
72
|
+
}
|
|
73
|
+
export interface Tokenizer {
|
|
74
|
+
tokenize(code: string, language?: string): (string | Token)[];
|
|
75
|
+
}
|
|
76
|
+
|
|
67
77
|
declare function getHighlightThemeClass(
|
|
68
78
|
theme: EditorThemeClasses,
|
|
69
79
|
highlightType: ?string,
|
|
@@ -78,4 +88,5 @@ declare export function $isCodeHighlightNode(
|
|
|
78
88
|
|
|
79
89
|
declare export function registerCodeHighlighting(
|
|
80
90
|
editor: LexicalEditor,
|
|
91
|
+
tokenizer?: Tokenizer,
|
|
81
92
|
): () => void;
|
package/LexicalCode.prod.js
CHANGED
|
@@ -5,28 +5,29 @@
|
|
|
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
|
|
9
|
-
class z extends
|
|
10
|
-
a),c&&
|
|
11
|
-
function D(a){let b=null,c=a.getPreviousSiblings();for(c.push(a);0<c.length&&(a=c.pop(),C(a)&&(b=a),!
|
|
12
|
-
class H extends
|
|
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}
|
|
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
|
+
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 new z(a,b)}function C(a){return a instanceof z}
|
|
11
|
+
function D(a){let b=null,c=a.getPreviousSiblings();for(c.push(a);0<c.length&&(a=c.pop(),C(a)&&(b=a),!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
|
+
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=
|
|
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([
|
|
16
|
-
function L(a){return 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{after:c=>{let d=a.parentNode;null!=d&&a!==d.lastChild&&c.push(
|
|
17
|
-
function ca(a){return{after:b=>{a.parentNode&&a.parentNode.nextSibling&&b.push(
|
|
18
|
-
function O(a){let
|
|
19
|
-
function P(a){let b=null,c=-1;var d=a.
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
function
|
|
24
|
-
function
|
|
25
|
-
function X(a,b){let c=
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
exports.
|
|
30
|
-
exports.
|
|
31
|
-
|
|
32
|
-
b=>
|
|
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}}
|
|
16
|
+
function L(a){return 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)}};
|
|
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
|
+
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
|
+
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 m=g.length,p=Math.min(h,m)-f,l=0;for(;l<p;)if(l++,!V(k[h-l],g[m-l])){l--;break}k=f;h-=l;g=g.slice(f,m-l);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}
|
|
23
|
+
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,m)=>h+(u.$isLineBreakNode(m)?0:m.getTextContentSize()),0)}b()&&(f?c.getNode().select(d,d):a.getChildren().some(k=>{if(u.$isTextNode(k)){let h=k.getTextContentSize();if(h>=g)return k.select(g,g),!0;g-=h}return!1}))}else b()}}
|
|
24
|
+
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
|
+
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)))}
|
|
26
|
+
function Y(a,b){let c=u.$getSelection();if(!u.$isRangeSelection(c))return!1;let {anchor:d,focus:f}=c,g=d.offset,k=f.offset,h=d.getNode(),m=f.getNode();var p=a===u.KEY_ARROW_UP_COMMAND;if(!C(h)||!C(m))return!1;if(!b.altKey){if(c.isCollapsed())if(a=h.getParentOrThrow(),p&&0===g&&null===h.getPreviousSibling()){if(null===a.getPreviousSibling())return a.selectPrevious(),b.preventDefault(),!0}else if(!p&&g===h.getTextContentSize()&&null===h.getNextSibling()&&null===a.getNextSibling())return a.selectNext(),
|
|
27
|
+
b.preventDefault(),!0;return!1}var l=D(h);let w=E(m);if(null==l||null==w)return!1;let t=l.getNodesBetween(w);for(let q=0;q<t.length;q++){let Z=t[q];if(!C(Z)&&!u.$isLineBreakNode(Z))return!1}b.preventDefault();b.stopPropagation();b=p?l.getPreviousSibling():w.getNextSibling();if(!u.$isLineBreakNode(b))return!0;l=p?b.getPreviousSibling():b.getNextSibling();if(null==l)return!0;p=p?D(l):E(l);let r=null!=p?p:l;b.remove();t.forEach(q=>q.remove());a===u.KEY_ARROW_UP_COMMAND?(t.forEach(q=>r.insertBefore(q)),
|
|
28
|
+
r.insertBefore(b)):(r.insertAfter(b),r=b,t.forEach(q=>{r.insertAfter(q);r=q}));c.setTextNodeRange(h,g,m,k);return!0}function fa(a,b){let c=u.$getSelection();if(!u.$isRangeSelection(c))return!1;let {anchor:d,focus:f}=c,g=d.getNode(),k=f.getNode();a=a===u.MOVE_TO_START;if(!C(g)||!C(k))return!1;let h,m;a?{node:h,offset:m}=P(k):{node:h,offset:m}=Q(k);null!==h&&-1!==m&&c.setTextNodeRange(h,m,h,m);b.preventDefault();b.stopPropagation();return!0}exports.$createCodeHighlightNode=B;
|
|
29
|
+
exports.$createCodeNode=L;exports.$isCodeHighlightNode=C;exports.$isCodeNode=M;exports.CODE_LANGUAGE_FRIENDLY_NAME_MAP=v;exports.CODE_LANGUAGE_MAP=x;exports.CodeHighlightNode=z;exports.CodeNode=H;exports.DEFAULT_CODE_LANGUAGE="javascript";exports.PrismTokenizer=N;exports.getCodeLanguages=()=>Object.keys(e.languages).filter(a=>"function"!==typeof e.languages[a]).sort();exports.getDefaultCodeLanguage=()=>"javascript";exports.getEndOfCodeInLine=Q;exports.getFirstCodeHighlightNodeOfLine=D;
|
|
30
|
+
exports.getLanguageFriendlyName=function(a){a=y(a);return v[a]||a};exports.getLastCodeHighlightNodeOfLine=E;exports.getStartOfCodeInLine=P;exports.normalizeCodeLang=y;
|
|
31
|
+
exports.registerCodeHighlighting=function(a,b){if(!a.hasNodes([H,z]))throw Error("CodeHighlightPlugin: CodeNode or CodeHighlightNode not registered on editor");null==b&&(b=N);return n.mergeRegister(a.registerMutationListener(H,c=>{a.update(()=>{for(let [g,k]of c)if("destroyed"!==k){var d=u.$getNodeByKey(g);if(null!==d)a:{var f=d;d=a.getElementByKey(f.getKey());if(null===d)break a;f=f.getChildren();let h=f.length;if(h===d.__cachedChildrenLength)break a;d.__cachedChildrenLength=h;let m="1",p=1;for(let l=
|
|
32
|
+
0;l<h;l++)u.$isLineBreakNode(f[l])&&(m+="\n"+ ++p);d.setAttribute("data-gutter",m)}}})}),a.registerNodeTransform(H,c=>S(c,a,b)),a.registerNodeTransform(u.TextNode,c=>R(c,a,b)),a.registerNodeTransform(z,c=>R(c,a,b)),a.registerCommand(u.INDENT_CONTENT_COMMAND,()=>W(u.INDENT_CONTENT_COMMAND),u.COMMAND_PRIORITY_LOW),a.registerCommand(u.OUTDENT_CONTENT_COMMAND,()=>W(u.OUTDENT_CONTENT_COMMAND),u.COMMAND_PRIORITY_LOW),a.registerCommand(u.KEY_ARROW_UP_COMMAND,c=>Y(u.KEY_ARROW_UP_COMMAND,c),u.COMMAND_PRIORITY_LOW),
|
|
33
|
+
a.registerCommand(u.KEY_ARROW_DOWN_COMMAND,c=>Y(u.KEY_ARROW_DOWN_COMMAND,c),u.COMMAND_PRIORITY_LOW),a.registerCommand(u.MOVE_TO_END,c=>fa(u.MOVE_TO_END,c),u.COMMAND_PRIORITY_LOW),a.registerCommand(u.MOVE_TO_START,c=>fa(u.MOVE_TO_START,c),u.COMMAND_PRIORITY_LOW))}
|
package/index.d.ts
CHANGED
|
@@ -7,6 +7,6 @@
|
|
|
7
7
|
*
|
|
8
8
|
*
|
|
9
9
|
*/
|
|
10
|
-
export { getEndOfCodeInLine, getStartOfCodeInLine, registerCodeHighlighting, } from './CodeHighlighter';
|
|
10
|
+
export { getEndOfCodeInLine, getStartOfCodeInLine, PrismTokenizer, registerCodeHighlighting, } from './CodeHighlighter';
|
|
11
11
|
export { $createCodeHighlightNode, $isCodeHighlightNode, CODE_LANGUAGE_FRIENDLY_NAME_MAP, CODE_LANGUAGE_MAP, CodeHighlightNode, DEFAULT_CODE_LANGUAGE, getCodeLanguages, getDefaultCodeLanguage, getFirstCodeHighlightNodeOfLine, getLanguageFriendlyName, getLastCodeHighlightNodeOfLine, normalizeCodeLang, } from './CodeHighlightNode';
|
|
12
12
|
export { $createCodeNode, $isCodeNode, CodeNode } from './CodeNode';
|
package/package.json
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
"code"
|
|
9
9
|
],
|
|
10
10
|
"license": "MIT",
|
|
11
|
-
"version": "0.5.1-next.
|
|
11
|
+
"version": "0.5.1-next.2",
|
|
12
12
|
"main": "LexicalCode.js",
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"lexical": "0.5.1-next.
|
|
14
|
+
"lexical": "0.5.1-next.2"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@lexical/utils": "0.5.1-next.
|
|
17
|
+
"@lexical/utils": "0.5.1-next.2",
|
|
18
18
|
"prismjs": "^1.27.0"
|
|
19
19
|
},
|
|
20
20
|
"repository": {
|