@lexical/markdown 0.3.6 → 0.3.9
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/LexicalMarkdown.dev.js +33 -21
- package/LexicalMarkdown.prod.js +18 -19
- package/{v2/MarkdownExport.d.ts → MarkdownExport.d.ts} +0 -0
- package/{v2/MarkdownImport.d.ts → MarkdownImport.d.ts} +0 -0
- package/{v2/MarkdownShortcuts.d.ts → MarkdownShortcuts.d.ts} +0 -0
- package/{v2/MarkdownTransformers.d.ts → MarkdownTransformers.d.ts} +0 -0
- package/index.d.ts +3 -3
- package/package.json +8 -8
- package/utils.d.ts +13 -56
- package/autoFormatUtils.d.ts +0 -12
- package/convertFromPlainTextUtils.d.ts +0 -10
- package/v2/utils.d.ts +0 -15
package/LexicalMarkdown.dev.js
CHANGED
|
@@ -20,6 +20,7 @@ var link = require('@lexical/link');
|
|
|
20
20
|
* LICENSE file in the root directory of this source tree.
|
|
21
21
|
*
|
|
22
22
|
*/
|
|
23
|
+
|
|
23
24
|
function indexBy(list, callback) {
|
|
24
25
|
const index = {};
|
|
25
26
|
|
|
@@ -38,9 +39,9 @@ function indexBy(list, callback) {
|
|
|
38
39
|
function transformersByType(transformers) {
|
|
39
40
|
const byType = indexBy(transformers, t => t.type);
|
|
40
41
|
return {
|
|
41
|
-
element: byType.element,
|
|
42
|
-
textFormat: byType['text-format'],
|
|
43
|
-
textMatch: byType['text-match']
|
|
42
|
+
element: byType.element || [],
|
|
43
|
+
textFormat: byType['text-format'] || [],
|
|
44
|
+
textMatch: byType['text-match'] || []
|
|
44
45
|
};
|
|
45
46
|
}
|
|
46
47
|
const PUNCTUATION_OR_SPACE = /[!-/:-@[-`{-~\s]/;
|
|
@@ -90,23 +91,21 @@ function exportChildren(node, textTransformersIndex, textMatchTransformers) {
|
|
|
90
91
|
const children = node.getChildren();
|
|
91
92
|
|
|
92
93
|
mainLoop: for (const child of children) {
|
|
94
|
+
for (const transformer of textMatchTransformers) {
|
|
95
|
+
const result = transformer.export(child, parentNode => exportChildren(parentNode, textTransformersIndex, textMatchTransformers), (textNode, textContent) => exportTextFormat(textNode, textContent, textTransformersIndex));
|
|
96
|
+
|
|
97
|
+
if (result != null) {
|
|
98
|
+
output.push(result);
|
|
99
|
+
continue mainLoop;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
93
103
|
if (lexical.$isLineBreakNode(child)) {
|
|
94
104
|
output.push('\n');
|
|
95
105
|
} else if (lexical.$isTextNode(child)) {
|
|
96
106
|
output.push(exportTextFormat(child, child.getTextContent(), textTransformersIndex));
|
|
97
|
-
} else {
|
|
98
|
-
|
|
99
|
-
const result = transformer.export(child, parentNode => exportChildren(parentNode, textTransformersIndex, textMatchTransformers), (textNode, textContent) => exportTextFormat(textNode, textContent, textTransformersIndex));
|
|
100
|
-
|
|
101
|
-
if (result != null) {
|
|
102
|
-
output.push(result);
|
|
103
|
-
continue mainLoop;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (lexical.$isElementNode(child)) {
|
|
108
|
-
output.push(exportChildren(child, textTransformersIndex, textMatchTransformers));
|
|
109
|
-
}
|
|
107
|
+
} else if (lexical.$isElementNode(child)) {
|
|
108
|
+
output.push(exportChildren(child, textTransformersIndex, textMatchTransformers));
|
|
110
109
|
}
|
|
111
110
|
}
|
|
112
111
|
|
|
@@ -232,7 +231,7 @@ function createMarkdownImport(transformers) {
|
|
|
232
231
|
const children = root.getChildren();
|
|
233
232
|
|
|
234
233
|
for (const child of children) {
|
|
235
|
-
if (
|
|
234
|
+
if (isEmptyParagraph(child)) {
|
|
236
235
|
child.remove();
|
|
237
236
|
}
|
|
238
237
|
}
|
|
@@ -241,6 +240,15 @@ function createMarkdownImport(transformers) {
|
|
|
241
240
|
};
|
|
242
241
|
}
|
|
243
242
|
|
|
243
|
+
function isEmptyParagraph(node) {
|
|
244
|
+
if (!lexical.$isParagraphNode(node)) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const firstChild = node.getFirstChild();
|
|
249
|
+
return firstChild == null || node.getChildrenSize() === 1 && lexical.$isTextNode(firstChild) && MARKDOWN_EMPTY_LINE_REG_EXP.test(firstChild.getTextContent());
|
|
250
|
+
}
|
|
251
|
+
|
|
244
252
|
function importBlocks(lineText, rootNode, elementTransformers, textFormatTransformersIndex, textMatchTransformers) {
|
|
245
253
|
const lineTextTrimmed = lineText.trim();
|
|
246
254
|
const textNode = lexical.$createTextNode(lineTextTrimmed);
|
|
@@ -330,7 +338,7 @@ function importTextFormatTransformers(textNode, textFormatTransformersIndex, tex
|
|
|
330
338
|
return;
|
|
331
339
|
}
|
|
332
340
|
|
|
333
|
-
let currentNode, remainderNode; // If matching full content there's no need to run splitText and can reuse existing textNode
|
|
341
|
+
let currentNode, remainderNode, leadingNode; // If matching full content there's no need to run splitText and can reuse existing textNode
|
|
334
342
|
// to update its content and apply format. E.g. for **_Hello_** string after applying bold
|
|
335
343
|
// format (**) it will reuse the same text node to apply italic (_)
|
|
336
344
|
|
|
@@ -343,7 +351,7 @@ function importTextFormatTransformers(textNode, textFormatTransformersIndex, tex
|
|
|
343
351
|
if (startIndex === 0) {
|
|
344
352
|
[currentNode, remainderNode] = textNode.splitText(endIndex);
|
|
345
353
|
} else {
|
|
346
|
-
[, currentNode, remainderNode] = textNode.splitText(startIndex, endIndex);
|
|
354
|
+
[leadingNode, currentNode, remainderNode] = textNode.splitText(startIndex, endIndex);
|
|
347
355
|
}
|
|
348
356
|
}
|
|
349
357
|
|
|
@@ -361,9 +369,13 @@ function importTextFormatTransformers(textNode, textFormatTransformersIndex, tex
|
|
|
361
369
|
|
|
362
370
|
if (!currentNode.hasFormat('code')) {
|
|
363
371
|
importTextFormatTransformers(currentNode, textFormatTransformersIndex, textMatchTransformers);
|
|
364
|
-
} // Run over remaining text if any
|
|
372
|
+
} // Run over leading/remaining text if any
|
|
365
373
|
|
|
366
374
|
|
|
375
|
+
if (leadingNode) {
|
|
376
|
+
importTextFormatTransformers(leadingNode, textFormatTransformersIndex, textMatchTransformers);
|
|
377
|
+
}
|
|
378
|
+
|
|
367
379
|
if (remainderNode) {
|
|
368
380
|
importTextFormatTransformers(remainderNode, textFormatTransformersIndex, textMatchTransformers);
|
|
369
381
|
}
|
|
@@ -542,7 +554,7 @@ function runTextMatchTransformers(anchorNode, anchorOffset, transformersByTrigge
|
|
|
542
554
|
[, replaceNode] = anchorNode.splitText(startIndex, endIndex);
|
|
543
555
|
}
|
|
544
556
|
|
|
545
|
-
replaceNode.selectNext();
|
|
557
|
+
replaceNode.selectNext(0, 0);
|
|
546
558
|
transformer.replace(replaceNode, match);
|
|
547
559
|
return true;
|
|
548
560
|
}
|
package/LexicalMarkdown.prod.js
CHANGED
|
@@ -4,26 +4,25 @@
|
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
|
-
'use strict';var
|
|
8
|
-
function ba(a){let b=I(a),c=b.textFormat.filter(d=>1===d.format.length);return()=>{let d=[];var e=
|
|
9
|
-
function K(a,b,c){let d=[];a=a.getChildren();a:for(let e of a)
|
|
10
|
-
function
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
function
|
|
16
|
-
function ha(a,b){var c=a.match(b.openTagsRegExp);if(null==c)return null;for(let f of c){var d=f.replace(/^\s/,"");c=b.fullMatchRegExpByTag[d];if(null!=c&&(c=a.match(c),d=b.transformersByTag[d],null!=c&&null!=d)){if(!1!==d.intraword)return c;var {index:e=0}=c;d=a[e-1];e=a[e+c[0].length];if(!(d&&!J.test(d)||e&&!J.test(e)))return c}}return null}
|
|
7
|
+
'use strict';var h=require("lexical"),y=require("@lexical/code"),E=require("@lexical/list"),F=require("@lexical/rich-text"),aa=require("@lexical/utils"),G=require("@lexical/link");function H(a,b){let c={};for(let d of a)a=b(d),c[a]?c[a].push(d):c[a]=[d];return c}function I(a){a=H(a,b=>b.type);return{element:a.element||[],textFormat:a["text-format"]||[],textMatch:a["text-match"]||[]}}let J=/[!-/:-@[-`{-~\s]/;
|
|
8
|
+
function ba(a){let b=I(a),c=b.textFormat.filter(d=>1===d.format.length);return()=>{let d=[];var e=h.$getRoot().getChildren();for(let f of e)e=ca(f,b.element,c,b.textMatch),null!=e&&d.push(e);return d.join("\n\n")}}function ca(a,b,c,d){for(let e of b)if(b=e.export(a,f=>K(f,c,d)),null!=b)return b;return h.$isElementNode(a)?K(a,c,d):null}
|
|
9
|
+
function K(a,b,c){let d=[];a=a.getChildren();a:for(let e of a){for(let f of c)if(a=f.export(e,k=>K(k,b,c),(k,p)=>L(k,p,b)),null!=a){d.push(a);continue a}h.$isLineBreakNode(e)?d.push("\n"):h.$isTextNode(e)?d.push(L(e,e.getTextContent(),b)):h.$isElementNode(e)&&d.push(K(e,b,c))}return d.join("")}function L(a,b,c){let d=b.trim(),e=d,f=new Set;for(let p of c){c=p.format[0];let r=p.tag;if(M(a,c)&&!f.has(c)){f.add(c);var k=N(a,!0);M(k,c)||(e=r+e);k=N(a,!1);M(k,c)||(e+=r)}}return b.replace(d,e)}
|
|
10
|
+
function N(a,b){let c=b?a.getPreviousSibling():a.getNextSibling();c||(a=a.getParentOrThrow(),a.isInline()&&(c=b?a.getPreviousSibling():a.getNextSibling()));for(;c;){if(h.$isElementNode(c)){if(!c.isInline())break;a=b?c.getLastDescendant():c.getFirstDescendant();if(h.$isTextNode(a))return a;c=b?c.getPreviousSibling():c.getNextSibling()}if(h.$isTextNode(c))return c;if(!h.$isElementNode(c))break}return null}function M(a,b){return h.$isTextNode(a)&&a.hasFormat(b)}let da=/^\s{0,3}$/,O=/^```(\w{1,10})?\s?$/;
|
|
11
|
+
function ea(a){let b=I(a),c=fa(b.textFormat);return d=>{var e=d.split("\n"),f=e.length;d=h.$getRoot();d.clear();for(let g=0;g<f;g++){var k=e[g];a:{var p=e,r=g;var n=d;var t=p[r].match(O);if(t)for(var q=r,l=p.length;++q<l;)if(p[q].match(O)){t=y.$createCodeNode(t[1]);p=h.$createTextNode(p.slice(r+1,q).join("\n"));t.append(p);n.append(t);n=[t,q];break a}n=[null,r]}let [m,v]=n;if(null!=m)g=v;else{n=k;l=d;var w=b.element;q=c;p=b.textMatch;r=n.trim();t=h.$createTextNode(r);k=h.$createParagraphNode();k.append(t);
|
|
12
|
+
l.append(k);for(let {regExp:x,replace:u}of w)if(l=n.match(x)){t.setTextContent(n.slice(l[0].length));u(k,[t],l,!0);break}P(t,q,p);k.isAttached()&&0<r.length&&(n=k.getPreviousSibling(),h.$isParagraphNode(n)||F.$isQuoteNode(n)||E.$isListNode(n))&&(q=n,E.$isListNode(n)&&(n=n.getLastDescendant(),q=null==n?null:aa.$findMatchingParent(n,E.$isListItemNode)),null!=q&&0<q.getTextContentSize()&&(q.splice(q.getChildrenSize(),0,[h.$createLineBreakNode(),...k.getChildren()]),k.remove()))}}e=d.getChildren();for(let g of e)e=
|
|
13
|
+
g,h.$isParagraphNode(e)?(f=e.getFirstChild(),e=null==f||1===e.getChildrenSize()&&h.$isTextNode(f)&&da.test(f.getTextContent())):e=!1,e&&g.remove();d.selectEnd()}}
|
|
14
|
+
function P(a,b,c){let d=a.getTextContent(),e=ha(d,b);if(e){if(e[0]===d)var f=a;else{var k=e.index||0,p=k+e[0].length;0===k?[f,r]=a.splitText(p):[n,f,r]=a.splitText(k,p)}f.setTextContent(e[2]);if(k=b.transformersByTag[e[1]])for(let t of k.format)f.hasFormat(t)||f.toggleFormat(t);f.hasFormat("code")||P(f,b,c);n&&P(n,b,c);r&&P(r,b,c)}else a:for(b=a;b;){for(k of c)if(f=b.getTextContent().match(k.importRegExp)){var r=f.index||0;var n=r+f[0].length;0===r?[p,b]=b.splitText(n):[,p,b]=b.splitText(r,n);k.replace(p,
|
|
15
|
+
f);continue a}break}}function ha(a,b){var c=a.match(b.openTagsRegExp);if(null==c)return null;for(let f of c){var d=f.replace(/^\s/,"");c=b.fullMatchRegExpByTag[d];if(null!=c&&(c=a.match(c),d=b.transformersByTag[d],null!=c&&null!=d)){if(!1!==d.intraword)return c;var {index:e=0}=c;d=a[e-1];e=a[e+c[0].length];if(!(d&&!J.test(d)||e&&!J.test(e)))return c}}return null}
|
|
17
16
|
function fa(a){let b={},c={},d=[];for(let e of a){({tag:a}=e);b[a]=e;let f=a.replace(/(\*|\^)/g,"\\$1");d.push(f);c[a]=new RegExp(`(${f})(?![${f}\\s])(.*?[^${f}\\s])${f}(?!${f})`)}return{fullMatchRegExpByTag:c,openTagsRegExp:new RegExp("("+d.join("|")+")","g"),transformersByTag:b}}function Q(a,b,c){let d=c.length;for(;b>=d;b--){let e=b-d;if(R(a,e,c,0,d)&&" "!==a[e+d])return e}return-1}function R(a,b,c,d,e){for(let f=0;f<e;f++)if(a[b+f]!==c[d+f])return!1;return!0}
|
|
18
17
|
let S=a=>(b,c,d)=>{d=a(d);d.append(...c);b.replace(d);d.select(0,0)},T=a=>(b,c,d)=>{var e=b.getPreviousSibling();const f=E.$createListItemNode("check"===a?"x"===d[3]:void 0);E.$isListNode(e)&&e.getListType()===a?(e.append(f),b.remove()):(e=E.$createListNode(a,"number"===a?Number(d[2]):void 0),e.append(f),b.replace(e));f.append(...c);f.select(0,0);(b=Math.floor(d[1].length/4))&&f.setIndent(b)},U=(a,b,c)=>{const d=[];var e=a.getChildren();let f=0;for(const p of e)if(E.$isListItemNode(p)){if(1===p.getChildrenSize()&&
|
|
19
|
-
(e=p.getFirstChild(),E.$isListNode(e))){d.push(U(e,b,c+1));continue}e=" ".repeat(4*c);var
|
|
20
|
-
b=[];for(const c of a)b.push("> "+c);return b.join("\n")},regExp:/^>\s/,replace:(a,b,c,d)=>{if(d&&(c=a.getPreviousSibling(),F.$isQuoteNode(c))){c.splice(c.getChildrenSize(),0,[
|
|
18
|
+
(e=p.getFirstChild(),E.$isListNode(e))){d.push(U(e,b,c+1));continue}e=" ".repeat(4*c);var k=a.getListType();k="number"===k?`${a.getStart()+f}. `:"check"===k?`- [${p.getChecked()?"x":" "}] `:"- ";d.push(e+k+b(p));f++}return d.join("\n")},V={export:(a,b)=>{if(!F.$isHeadingNode(a))return null;const c=Number(a.getTag().slice(1));return"#".repeat(c)+" "+b(a)},regExp:/^(#{1,6})\s/,replace:S(a=>F.$createHeadingNode("h"+a[1].length)),type:"element"},W={export:(a,b)=>{if(!F.$isQuoteNode(a))return null;a=b(a).split("\n");
|
|
19
|
+
b=[];for(const c of a)b.push("> "+c);return b.join("\n")},regExp:/^>\s/,replace:(a,b,c,d)=>{if(d&&(c=a.getPreviousSibling(),F.$isQuoteNode(c))){c.splice(c.getChildrenSize(),0,[h.$createLineBreakNode(),...b]);c.select(0,0);a.remove();return}c=F.$createQuoteNode();c.append(...b);a.replace(c);c.select(0,0)},type:"element"},X={export:a=>{if(!y.$isCodeNode(a))return null;const b=a.getTextContent();return"```"+(a.getLanguage()||"")+(b?"\n"+b:"")+"\n```"},regExp:/^```(\w{1,10})?\s/,replace:S(a=>y.$createCodeNode(a?
|
|
21
20
|
a[1]:void 0)),type:"element"},Y={export:(a,b)=>E.$isListNode(a)?U(a,b,0):null,regExp:/^(\s*)[-*+]\s/,replace:T("bullet"),type:"element"},ia={export:(a,b)=>E.$isListNode(a)?U(a,b,0):null,regExp:/^(\s*)(?:-\s)?\s?(\[(\s|x)?\])\s/i,replace:T("check"),type:"element"},ja={export:(a,b)=>E.$isListNode(a)?U(a,b,0):null,regExp:/^(\s*)(\d{1,})\.\s/,replace:T("number"),type:"element"},ka={format:["code"],tag:"`",type:"text-format"},la={format:["bold","italic"],tag:"***",type:"text-format"},ma={format:["bold",
|
|
22
|
-
"italic"],intraword:!1,tag:"___",type:"text-format"},na={format:["bold"],tag:"**",type:"text-format"},pa={format:["bold"],intraword:!1,tag:"__",type:"text-format"},qa={format:["strikethrough"],tag:"~~",type:"text-format"},ra={format:["italic"],tag:"*",type:"text-format"},sa={format:["italic"],intraword:!1,tag:"_",type:"text-format"},ta={export:(a,b,c)=>{if(!G.$isLinkNode(a))return null;b=`[${a.getTextContent()}](${a.getURL()})`;const d=a.getFirstChild();return 1===a.getChildrenSize()&&
|
|
23
|
-
c(d,b):b},importRegExp:/(?:\[([^[]+)\])(?:\(([^(]+)\))/,regExp:/(?:\[([^[]+)\])(?:\(([^(]+)\))$/,replace:(a,b)=>{const [,c,d]=b;b=G.$createLinkNode(d);const e=
|
|
21
|
+
"italic"],intraword:!1,tag:"___",type:"text-format"},na={format:["bold"],tag:"**",type:"text-format"},pa={format:["bold"],intraword:!1,tag:"__",type:"text-format"},qa={format:["strikethrough"],tag:"~~",type:"text-format"},ra={format:["italic"],tag:"*",type:"text-format"},sa={format:["italic"],intraword:!1,tag:"_",type:"text-format"},ta={export:(a,b,c)=>{if(!G.$isLinkNode(a))return null;b=`[${a.getTextContent()}](${a.getURL()})`;const d=a.getFirstChild();return 1===a.getChildrenSize()&&h.$isTextNode(d)?
|
|
22
|
+
c(d,b):b},importRegExp:/(?:\[([^[]+)\])(?:\(([^(]+)\))/,regExp:/(?:\[([^[]+)\])(?:\(([^(]+)\))$/,replace:(a,b)=>{const [,c,d]=b;b=G.$createLinkNode(d);const e=h.$createTextNode(c);e.setFormat(a.getFormat());b.append(e);a.replace(b)},trigger:")",type:"text-match"},ua=[V,W,X,Y,ja],va=[ka,la,ma,na,pa,ra,sa,qa],wa=[ta],Z=[...ua,...va,...wa];exports.$convertFromMarkdownString=function(a,b=Z){return ea(b)(a)};exports.$convertToMarkdownString=function(a=Z){return ba(a)()};exports.BOLD_ITALIC_STAR=la;
|
|
24
23
|
exports.BOLD_ITALIC_UNDERSCORE=ma;exports.BOLD_STAR=na;exports.BOLD_UNDERSCORE=pa;exports.CHECK_LIST=ia;exports.CODE=X;exports.ELEMENT_TRANSFORMERS=ua;exports.HEADING=V;exports.INLINE_CODE=ka;exports.ITALIC_STAR=ra;exports.ITALIC_UNDERSCORE=sa;exports.LINK=ta;exports.ORDERED_LIST=ja;exports.QUOTE=W;exports.STRIKETHROUGH=qa;exports.TEXT_FORMAT_TRANSFORMERS=va;exports.TEXT_MATCH_TRANSFORMERS=wa;exports.TRANSFORMERS=Z;exports.UNORDERED_LIST=Y;
|
|
25
|
-
exports.registerMarkdownShortcuts=function(a,b=Z){let c=I(b),d=H(c.textFormat,({tag:f})=>f[f.length-1]),e=H(c.textMatch,({trigger:f})=>f);return a.registerUpdateListener(({tags:f,dirtyLeaves:
|
|
26
|
-
{if(!q.hasFormat("code")){var
|
|
27
|
-
null!==
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
exports.registerMarkdownShortcuts=function(a,b=Z){let c=I(b),d=H(c.textFormat,({tag:f})=>f[f.length-1]),e=H(c.textMatch,({trigger:f})=>f);return a.registerUpdateListener(({tags:f,dirtyLeaves:k,editorState:p,prevEditorState:r})=>{if(!f.has("historic")){var n=p.read(h.$getSelection);f=r.read(h.$getSelection);if(h.$isRangeSelection(f)&&h.$isRangeSelection(n)&&n.isCollapsed()){r=n.anchor.key;var t=n.anchor.offset,q=p._nodeMap.get(r);h.$isTextNode(q)&&k.has(r)&&(1===t||t===f.anchor.offset+1)&&a.update(()=>
|
|
25
|
+
{if(!q.hasFormat("code")){var l=q.getParent();if(null!==l&&!y.$isCodeNode(l)){var w=n.anchor.offset;b:{var g=c.element,m=l.getParent();if(h.$isRootNode(m)&&l.getFirstChild()===q&&(m=q.getTextContent()," "===m[w-1]))for(let {regExp:B,replace:C}of g)if((g=m.match(B))&&g[0].length===w){m=q.getNextSiblings();let [D,oa]=q.splitText(w);D.remove();m=oa?[oa,...m]:m;C(l,m,g,!1);l=!0;break b}l=!1}if(!l){b:{g=q.getTextContent();l=e[g[w-1]];if(null!=l){w<g.length&&(g=g.slice(0,w));for(x of l)if(l=g.match(x.regExp),
|
|
26
|
+
null!==l){g=l.index||0;m=g+l[0].length;var v=void 0;0===g?[v]=q.splitText(m):[,v]=q.splitText(g,m);v.selectNext(0,0);x.replace(v,l);var x=!0;break b}}x=!1}if(!x)b:{m=q.getTextContent();--w;var u=m[w];if(x=d[u])for(let B of x){var {tag:A}=B;x=A.length;let C=w-x+1;if(!(1<x&&!R(m,C,A,0,x)||" "===m[C-1])&&(v=m[w+1],!1!==B.intraword||!v||J.test(v))){l=v=q;g=Q(m,C,A);for(var z=l;0>g&&(z=z.getPreviousSibling())&&!h.$isLineBreakNode(z);)h.$isTextNode(z)&&(g=z.getTextContent(),l=z,g=Q(g,g.length,A));if(!(0>
|
|
27
|
+
g||l===v&&g+x===C||(A=l.getTextContent(),0<g&&A[g-1]===u||(z=A[g-1],!1===B.intraword&&z&&!J.test(z))))){m=v.getTextContent();m=m.slice(0,C)+m.slice(w+1);v.setTextContent(m);m=l===v?m:A;l.setTextContent(m.slice(0,g)+m.slice(g+x));m=h.$getSelection();u=h.$createRangeSelection();h.$setSelection(u);w=w-x*(l===v?2:1)+1;u.anchor.set(l.__key,g,"text");u.focus.set(v.__key,w,"text");for(let D of B.format)u.hasFormat(D)||u.formatText(D);u.anchor.set(u.focus.key,u.focus.offset,u.focus.type);for(let D of B.format)u.hasFormat(D)&&
|
|
28
|
+
u.toggleFormat(D);h.$isRangeSelection(m)&&(u.format=m.format);break b}}}}}}}})}}})}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/index.d.ts
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
|
-
import type { ElementTransformer, TextFormatTransformer, TextMatchTransformer, Transformer } from './
|
|
9
|
-
import { registerMarkdownShortcuts } from './
|
|
10
|
-
import { BOLD_ITALIC_STAR, BOLD_ITALIC_UNDERSCORE, BOLD_STAR, BOLD_UNDERSCORE, CHECK_LIST, CODE, HEADING, INLINE_CODE, ITALIC_STAR, ITALIC_UNDERSCORE, LINK, ORDERED_LIST, QUOTE, STRIKETHROUGH, UNORDERED_LIST } from './
|
|
8
|
+
import type { ElementTransformer, TextFormatTransformer, TextMatchTransformer, Transformer } from './MarkdownTransformers';
|
|
9
|
+
import { registerMarkdownShortcuts } from './MarkdownShortcuts';
|
|
10
|
+
import { BOLD_ITALIC_STAR, BOLD_ITALIC_UNDERSCORE, BOLD_STAR, BOLD_UNDERSCORE, CHECK_LIST, CODE, HEADING, INLINE_CODE, ITALIC_STAR, ITALIC_UNDERSCORE, LINK, ORDERED_LIST, QUOTE, STRIKETHROUGH, UNORDERED_LIST } from './MarkdownTransformers';
|
|
11
11
|
declare const ELEMENT_TRANSFORMERS: Array<ElementTransformer>;
|
|
12
12
|
declare const TEXT_FORMAT_TRANSFORMERS: Array<TextFormatTransformer>;
|
|
13
13
|
declare const TEXT_MATCH_TRANSFORMERS: Array<TextMatchTransformer>;
|
package/package.json
CHANGED
|
@@ -8,18 +8,18 @@
|
|
|
8
8
|
"markdown"
|
|
9
9
|
],
|
|
10
10
|
"license": "MIT",
|
|
11
|
-
"version": "0.3.
|
|
11
|
+
"version": "0.3.9",
|
|
12
12
|
"main": "LexicalMarkdown.js",
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"lexical": "0.3.
|
|
14
|
+
"lexical": "0.3.9"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@lexical/utils": "0.3.
|
|
18
|
-
"@lexical/code": "0.3.
|
|
19
|
-
"@lexical/text": "0.3.
|
|
20
|
-
"@lexical/rich-text": "0.3.
|
|
21
|
-
"@lexical/list": "0.3.
|
|
22
|
-
"@lexical/link": "0.3.
|
|
17
|
+
"@lexical/utils": "0.3.9",
|
|
18
|
+
"@lexical/code": "0.3.9",
|
|
19
|
+
"@lexical/text": "0.3.9",
|
|
20
|
+
"@lexical/rich-text": "0.3.9",
|
|
21
|
+
"@lexical/list": "0.3.9",
|
|
22
|
+
"@lexical/link": "0.3.9"
|
|
23
23
|
},
|
|
24
24
|
"repository": {
|
|
25
25
|
"type": "git",
|
package/utils.d.ts
CHANGED
|
@@ -5,32 +5,11 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
|
-
import type {
|
|
9
|
-
import type {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
isCodeBlock: boolean;
|
|
14
|
-
isParentAListItemNode: boolean;
|
|
15
|
-
isSelectionCollapsed: boolean;
|
|
16
|
-
isSimpleText: boolean;
|
|
17
|
-
nodeKey: NodeKey;
|
|
18
|
-
textContent: string;
|
|
19
|
-
}>;
|
|
20
|
-
export declare type MarkdownFormatKind = 'noTransformation' | 'paragraphH1' | 'paragraphH2' | 'paragraphH3' | 'paragraphH4' | 'paragraphH5' | 'paragraphH6' | 'paragraphBlockQuote' | 'paragraphUnorderedList' | 'paragraphOrderedList' | 'paragraphCodeBlock' | 'horizontalRule' | 'bold' | 'code' | 'italic' | 'underline' | 'strikethrough' | 'italic_bold' | 'strikethrough_italic' | 'strikethrough_bold' | 'strikethrough_italic_bold' | 'link';
|
|
21
|
-
export declare type ScanningContext = {
|
|
22
|
-
currentElementNode: null | ElementNode;
|
|
23
|
-
editor: LexicalEditor;
|
|
24
|
-
isAutoFormatting: boolean;
|
|
25
|
-
isWithinCodeBlock: boolean;
|
|
26
|
-
joinedText: string | null | undefined;
|
|
27
|
-
markdownCriteria: MarkdownCriteria;
|
|
28
|
-
patternMatchResults: PatternMatchResults;
|
|
29
|
-
textNodeWithOffset: TextNodeWithOffset | null | undefined;
|
|
30
|
-
triggerState: AutoFormatTriggerState | null | undefined;
|
|
31
|
-
};
|
|
32
|
-
export declare type MarkdownCriteria = Readonly<{
|
|
33
|
-
export?: (node: LexicalNode, traverseChildren: (node: ElementNode) => string) => string | null;
|
|
8
|
+
import type { ElementTransformer, TextFormatTransformer, TextMatchTransformer, Transformer } from '@lexical/markdown';
|
|
9
|
+
import type { ElementNode, LexicalNode, TextFormatType } from 'lexical';
|
|
10
|
+
declare type MarkdownFormatKind = 'noTransformation' | 'paragraphH1' | 'paragraphH2' | 'paragraphH3' | 'paragraphH4' | 'paragraphH5' | 'paragraphH6' | 'paragraphBlockQuote' | 'paragraphUnorderedList' | 'paragraphOrderedList' | 'paragraphCodeBlock' | 'horizontalRule' | 'bold' | 'code' | 'italic' | 'underline' | 'strikethrough' | 'italic_bold' | 'strikethrough_italic' | 'strikethrough_bold' | 'strikethrough_italic_bold' | 'link';
|
|
11
|
+
declare type MarkdownCriteria = Readonly<{
|
|
12
|
+
export?: (node: LexicalNode, traverseChildren: (elementNode: ElementNode) => string) => string | null;
|
|
34
13
|
exportFormat?: TextFormatType;
|
|
35
14
|
exportTag?: string;
|
|
36
15
|
exportTagClose?: string;
|
|
@@ -39,36 +18,14 @@ export declare type MarkdownCriteria = Readonly<{
|
|
|
39
18
|
regExForAutoFormatting: RegExp;
|
|
40
19
|
requiresParagraphStart: boolean | null | undefined;
|
|
41
20
|
}>;
|
|
42
|
-
declare type
|
|
43
|
-
offsetInParent: number;
|
|
44
|
-
text: string;
|
|
45
|
-
};
|
|
46
|
-
export declare type PatternMatchResults = {
|
|
47
|
-
regExCaptureGroups: Array<CaptureGroupDetail>;
|
|
48
|
-
};
|
|
49
|
-
export declare type MarkdownCriteriaWithPatternMatchResults = {
|
|
50
|
-
markdownCriteria: null | MarkdownCriteria;
|
|
51
|
-
patternMatchResults: null | PatternMatchResults;
|
|
52
|
-
};
|
|
53
|
-
export declare type MarkdownCriteriaArray = Array<MarkdownCriteria>;
|
|
54
|
-
export declare type AutoFormatTriggerKind = 'space_trigger' | 'codeBlock_trigger';
|
|
55
|
-
export declare type AutoFormatTrigger = {
|
|
56
|
-
triggerKind: AutoFormatTriggerKind;
|
|
57
|
-
triggerString: string;
|
|
58
|
-
};
|
|
59
|
-
export declare const triggers: Array<AutoFormatTrigger>;
|
|
60
|
-
export declare const allMarkdownCriteria: MarkdownCriteriaArray;
|
|
61
|
-
export declare function getAllTriggers(): Array<AutoFormatTrigger>;
|
|
21
|
+
declare type MarkdownCriteriaArray = Array<MarkdownCriteria>;
|
|
62
22
|
export declare function getAllMarkdownCriteriaForParagraphs(): MarkdownCriteriaArray;
|
|
63
23
|
export declare function getAllMarkdownCriteriaForTextNodes(): MarkdownCriteriaArray;
|
|
64
|
-
export declare function
|
|
65
|
-
export declare function
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
export declare
|
|
71
|
-
export declare function getTextNodeWithOffsetOrThrow(scanningContext: ScanningContext): TextNodeWithOffset;
|
|
72
|
-
export declare function transformTextNodeForMarkdownCriteria<T>(scanningContext: ScanningContext, elementNode: ElementNode, createHorizontalRuleNode: null | (() => DecoratorNode<T>)): void;
|
|
73
|
-
export declare function getParentElementNodeOrThrow(scanningContext: ScanningContext): ElementNode;
|
|
24
|
+
export declare function indexBy<T>(list: Array<T>, callback: (arg0: T) => string): Readonly<Record<string, Array<T>>>;
|
|
25
|
+
export declare function transformersByType(transformers: Array<Transformer>): Readonly<{
|
|
26
|
+
element: Array<ElementTransformer>;
|
|
27
|
+
textFormat: Array<TextFormatTransformer>;
|
|
28
|
+
textMatch: Array<TextMatchTransformer>;
|
|
29
|
+
}>;
|
|
30
|
+
export declare const PUNCTUATION_OR_SPACE: RegExp;
|
|
74
31
|
export {};
|
package/autoFormatUtils.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
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
|
-
*/
|
|
8
|
-
import type { AutoFormatTriggerState, ScanningContext } from './utils';
|
|
9
|
-
import type { DecoratorNode, EditorState, LexicalEditor } from 'lexical';
|
|
10
|
-
export declare function updateAutoFormatting<T>(editor: LexicalEditor, scanningContext: ScanningContext, createHorizontalRuleNode: () => DecoratorNode<T>): void;
|
|
11
|
-
export declare function getTriggerState(editorState: EditorState): null | AutoFormatTriggerState;
|
|
12
|
-
export declare function findScanningContext(editor: LexicalEditor, currentTriggerState: null | AutoFormatTriggerState, priorTriggerState: null | AutoFormatTriggerState): null | ScanningContext;
|
|
@@ -1,10 +0,0 @@
|
|
|
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
|
-
*/
|
|
8
|
-
import type { DecoratorNode, LexicalEditor, RootNode } from 'lexical';
|
|
9
|
-
export declare function convertStringToLexical(text: string, editor: LexicalEditor): null | RootNode;
|
|
10
|
-
export declare function convertMarkdownForElementNodes<T>(editor: LexicalEditor, createHorizontalRuleNode: null | (() => DecoratorNode<T>)): void;
|
package/v2/utils.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
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
|
-
*/
|
|
8
|
-
import type { ElementTransformer, TextFormatTransformer, TextMatchTransformer, Transformer } from '@lexical/markdown';
|
|
9
|
-
export declare function indexBy<T>(list: Array<T>, callback: (arg0: T) => string): Readonly<Record<string, Array<T>>>;
|
|
10
|
-
export declare function transformersByType(transformers: Array<Transformer>): Readonly<{
|
|
11
|
-
element: Array<ElementTransformer>;
|
|
12
|
-
textFormat: Array<TextFormatTransformer>;
|
|
13
|
-
textMatch: Array<TextMatchTransformer>;
|
|
14
|
-
}>;
|
|
15
|
-
export declare const PUNCTUATION_OR_SPACE: RegExp;
|