@lexical/markdown 0.2.7 → 0.2.8
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 +22 -0
- package/LexicalMarkdown.js.flow +1 -0
- package/LexicalMarkdown.prod.js +19 -18
- package/package.json +8 -8
package/LexicalMarkdown.dev.js
CHANGED
|
@@ -177,6 +177,10 @@ function getTextSibling(node, backward) {
|
|
|
177
177
|
if (lexical.$isTextNode(sibling)) {
|
|
178
178
|
return sibling;
|
|
179
179
|
}
|
|
180
|
+
|
|
181
|
+
if (!lexical.$isElementNode(sibling)) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
180
184
|
}
|
|
181
185
|
|
|
182
186
|
return null;
|
|
@@ -414,6 +418,7 @@ function createTextFormatTransformersIndex(textTransformers) {
|
|
|
414
418
|
*
|
|
415
419
|
*
|
|
416
420
|
*/
|
|
421
|
+
const PUNCTUATION_OR_SPACE = /[!-/:-@[-`{-~\s]/;
|
|
417
422
|
|
|
418
423
|
function runElementTransformers(parentNode, anchorNode, anchorOffset, elementTransformers) {
|
|
419
424
|
const grandParentNode = parentNode.getParent();
|
|
@@ -519,6 +524,13 @@ function runTextFormatTransformers(editor, anchorNode, anchorOffset, textFormatT
|
|
|
519
524
|
|
|
520
525
|
if (textContent[closeTagStartIndex - 1] === ' ') {
|
|
521
526
|
continue;
|
|
527
|
+
} // Some tags can not be used within words, hence should have newline/space/punctuation after it
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
const afterCloseTagChar = textContent[closeTagEndIndex + 1];
|
|
531
|
+
|
|
532
|
+
if (matcher.intraword === false && afterCloseTagChar && !PUNCTUATION_OR_SPACE.test(afterCloseTagChar)) {
|
|
533
|
+
continue;
|
|
522
534
|
}
|
|
523
535
|
|
|
524
536
|
const closeNode = anchorNode;
|
|
@@ -555,6 +567,13 @@ function runTextFormatTransformers(editor, anchorNode, anchorOffset, textFormatT
|
|
|
555
567
|
|
|
556
568
|
if (openTagStartIndex > 0 && prevOpenNodeText[openTagStartIndex - 1] === closeChar) {
|
|
557
569
|
continue;
|
|
570
|
+
} // Some tags can not be used within words, hence should have newline/space/punctuation before it
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
const beforeOpenTagChar = prevOpenNodeText[openTagStartIndex - 1];
|
|
574
|
+
|
|
575
|
+
if (matcher.intraword === false && beforeOpenTagChar && !PUNCTUATION_OR_SPACE.test(beforeOpenTagChar)) {
|
|
576
|
+
continue;
|
|
558
577
|
} // Clean text from opening and closing tags (starting from closing tag
|
|
559
578
|
// to prevent any offset shifts if we start from opening one)
|
|
560
579
|
|
|
@@ -831,6 +850,7 @@ const BOLD_ITALIC_STAR = {
|
|
|
831
850
|
};
|
|
832
851
|
const BOLD_ITALIC_UNDERSCORE = {
|
|
833
852
|
format: ['bold', 'italic'],
|
|
853
|
+
intraword: false,
|
|
834
854
|
tag: '___',
|
|
835
855
|
type: 'text-format'
|
|
836
856
|
};
|
|
@@ -841,6 +861,7 @@ const BOLD_STAR = {
|
|
|
841
861
|
};
|
|
842
862
|
const BOLD_UNDERSCORE = {
|
|
843
863
|
format: ['bold'],
|
|
864
|
+
intraword: false,
|
|
844
865
|
tag: '__',
|
|
845
866
|
type: 'text-format'
|
|
846
867
|
};
|
|
@@ -856,6 +877,7 @@ const ITALIC_STAR = {
|
|
|
856
877
|
};
|
|
857
878
|
const ITALIC_UNDERSCORE = {
|
|
858
879
|
format: ['italic'],
|
|
880
|
+
intraword: false,
|
|
859
881
|
tag: '_',
|
|
860
882
|
type: 'text-format'
|
|
861
883
|
}; // Order of text transformers matters:
|
package/LexicalMarkdown.js.flow
CHANGED
package/LexicalMarkdown.prod.js
CHANGED
|
@@ -6,21 +6,22 @@
|
|
|
6
6
|
*/
|
|
7
7
|
var n=require("lexical"),y=require("@lexical/code"),D=require("@lexical/link"),E=require("@lexical/list"),F=require("@lexical/rich-text");function G(a,b){const c={};for(const d of a)a=b(d),c[a]?c[a].push(d):c[a]=[d];return c}function H(a){a=G(a,b=>b.type);return{element:a.element,textFormat:a["text-format"],textMatch:a["text-match"]}}
|
|
8
8
|
function aa(a){const b=H(a),c=b.textFormat.filter(d=>1===d.format.length);return()=>{const d=[];var e=n.$getRoot().getChildren();for(const f of e)e=ba(f,b.element,c,b.textMatch),null!=e&&d.push(e);return d.join("\n")}}function ba(a,b,c,d){for(const e of b)if(b=e.export(a,f=>J(f,c,d)),null!=b)return b;return n.$isElementNode(a)?J(a,c,d):null}
|
|
9
|
-
function J(a,b,c){const d=[];a=a.getChildren();a:for(const e of a)if(n.$isLineBreakNode(e))d.push("\n");else if(n.$isTextNode(e))d.push(K(e,e.getTextContent(),b));else{for(const f of c)if(a=f.export(e,
|
|
10
|
-
function M(a,b){let c=b?a.getPreviousSibling():a.getNextSibling();c||(a=a.getParentOrThrow(),a.isInline()&&(c=b?a.getPreviousSibling():a.getNextSibling()));for(;c;){if(n.$isElementNode(c)){if(!c.isInline())break;a=b?c.getLastDescendant():c.getFirstDescendant();if(n.$isTextNode(a))return a;c=b?c.getPreviousSibling():c.getNextSibling()}if(n.$isTextNode(c))return c}return null}function L(a,b){return n.$isTextNode(a)&&a.hasFormat(b)}const N=/^```(\w{1,10})?\s?$/;
|
|
11
|
-
function ca(a){const b=H(a),c=da(b.textFormat);return d=>{d=d.split("\n");const e=d.length,f=n.$getRoot();f.clear();for(let q=0;q<e;q++){var
|
|
12
|
-
for(const {regExp:
|
|
13
|
-
function O(a,b,c){const d=a.getTextContent();a:{var e=d.match(b.openTagsRegExp);if(null!=e)for(f of e)if(e=b.fullMatchRegExpByTag[f.replace(/^\s/,"")],null!=e&&(e=d.match(e),null!=e)){var f=e;break a}f=null}if(f){if(f[0]===d)var
|
|
14
|
-
b.getTextContent().match(h.importRegExp)){var p=
|
|
15
|
-
function
|
|
16
|
-
const
|
|
17
|
-
(e=h.getFirstChild(),E.$isListNode(e))){d.push(
|
|
18
|
-
replace:
|
|
19
|
-
|
|
20
|
-
tag:"_",type:"text-format"},
|
|
21
|
-
|
|
22
|
-
exports.STRIKETHROUGH=
|
|
23
|
-
exports.registerMarkdownShortcuts=function(a,b=Z){const c=H(b),d=G(c.textFormat,({tag:f})=>f[f.length-1]),e=G(c.textMatch,({trigger:f})=>f);return a.registerUpdateListener(({tags:f,dirtyLeaves:
|
|
24
|
-
{if(!t.hasFormat("code")){var m=t.getParent();if(null!==m&&!y.$isCodeNode(m)){var q=u.anchor.offset;b:{var
|
|
25
|
-
null!==m){
|
|
26
|
-
0<
|
|
9
|
+
function J(a,b,c){const d=[];a=a.getChildren();a:for(const e of a)if(n.$isLineBreakNode(e))d.push("\n");else if(n.$isTextNode(e))d.push(K(e,e.getTextContent(),b));else{for(const f of c)if(a=f.export(e,l=>J(l,b,c),(l,h)=>K(l,h,b)),null!=a){d.push(a);continue a}n.$isElementNode(e)&&d.push(J(e,b,c))}return d.join("")}function K(a,b,c){const d=new Set;for(const f of c){c=f.format[0];const l=f.tag;if(L(a,c)&&!d.has(c)){d.add(c);var e=M(a,!0);L(e,c)||(b=l+b);e=M(a,!1);L(e,c)||(b+=l)}}return b}
|
|
10
|
+
function M(a,b){let c=b?a.getPreviousSibling():a.getNextSibling();c||(a=a.getParentOrThrow(),a.isInline()&&(c=b?a.getPreviousSibling():a.getNextSibling()));for(;c;){if(n.$isElementNode(c)){if(!c.isInline())break;a=b?c.getLastDescendant():c.getFirstDescendant();if(n.$isTextNode(a))return a;c=b?c.getPreviousSibling():c.getNextSibling()}if(n.$isTextNode(c))return c;if(!n.$isElementNode(c))break}return null}function L(a,b){return n.$isTextNode(a)&&a.hasFormat(b)}const N=/^```(\w{1,10})?\s?$/;
|
|
11
|
+
function ca(a){const b=H(a),c=da(b.textFormat);return d=>{d=d.split("\n");const e=d.length,f=n.$getRoot();f.clear();for(let q=0;q<e;q++){var l=d[q];a:{var h=d,r=q;var u=f;var p=h[r].match(N);if(p)for(var t=r,m=h.length;++t<m;)if(h[t].match(N)){p=y.$createCodeNode(p[1]);h=n.$createTextNode(h.slice(r+1,t).join("\n"));p.append(h);u.append(p);u=[p,t];break a}u=[null,r]}const [k,g]=u;if(null!=k)q=g;else{p=f;m=b.element;u=c;t=b.textMatch;h=n.$createTextNode(l);r=n.$createParagraphNode();r.append(h);p.append(r);
|
|
12
|
+
for(const {regExp:v,replace:w}of m)if(p=l.match(v)){h.setTextContent(l.slice(p[0].length));w(r,[h],p,!0);break}O(h,u,t)}}f.selectEnd()}}
|
|
13
|
+
function O(a,b,c){const d=a.getTextContent();a:{var e=d.match(b.openTagsRegExp);if(null!=e)for(f of e)if(e=b.fullMatchRegExpByTag[f.replace(/^\s/,"")],null!=e&&(e=d.match(e),null!=e)){var f=e;break a}f=null}if(f){if(f[0]===d)var l=a;else{var h=f.index,r=h+f[0].length;0===h?[l,p]=a.splitText(r):[,l,p]=a.splitText(h,r)}l.setTextContent(f[2]);if(h=b.transformersByTag[f[1]])for(var u of h.format)l.hasFormat(u)||l.toggleFormat(u);l.hasFormat("code")||O(l,b,c);p&&O(p,b,c)}else a:for(b=a;b;){for(h of c)if(l=
|
|
14
|
+
b.getTextContent().match(h.importRegExp)){var p=l.index;u=p+l[0].length;0===p?[r,b]=b.splitText(u):[,r,b]=b.splitText(p,u);h.replace(r,l);continue a}break}}function da(a){const b={},c={},d=[];for(const e of a){({tag:a}=e);b[a]=e;const 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}}const P=/[!-/:-@[-`{-~\s]/;
|
|
15
|
+
function Q(a,b,c){const d=c.length;for(;b>=d;b--){const 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}
|
|
16
|
+
const 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 h of e)if(E.$isListItemNode(h)){if(1===h.getChildrenSize()&&
|
|
17
|
+
(e=h.getFirstChild(),E.$isListNode(e))){d.push(U(e,b,c+1));continue}e=" ".repeat(4*c);var l=a.getListType();l="number"===l?`${a.getStart()+f}. `:"check"===l?`- [${h.getChecked()?"x":" "}] `:"- ";d.push(e+l+b(h));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)=>F.$isQuoteNode(a)?"> "+b(a):null,regExp:/^>\s/,
|
|
18
|
+
replace:S(()=>F.$createQuoteNode()),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?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"},ea={export:(a,b)=>E.$isListNode(a)?U(a,b,0):null,regExp:/^(\s*)(?:-\s)?\s?(\[(\s|x)?\])\s/i,replace:T("check"),type:"element"},
|
|
19
|
+
fa={export:(a,b)=>E.$isListNode(a)?U(a,b,0):null,regExp:/^(\s*)(\d{1,})\.\s/,replace:T("number"),type:"element"},ha={format:["code"],tag:"`",type:"text-format"},ia={format:["bold","italic"],tag:"***",type:"text-format"},ja={format:["bold","italic"],intraword:!1,tag:"___",type:"text-format"},ka={format:["bold"],tag:"**",type:"text-format"},la={format:["bold"],intraword:!1,tag:"__",type:"text-format"},ma={format:["strikethrough"],tag:"~~",type:"text-format"},na={format:["italic"],tag:"*",type:"text-format"},
|
|
20
|
+
oa={format:["italic"],intraword:!1,tag:"_",type:"text-format"},pa={export:(a,b,c)=>{if(!D.$isLinkNode(a))return null;b=`[${a.getTextContent()}](${a.getURL()})`;const d=a.getFirstChild();return 1===a.getChildrenSize()&&n.$isTextNode(d)?c(d,b):b},importRegExp:/(?:\[([^[]+)\])(?:\(([^(]+)\))/,regExp:/(?:\[([^[]+)\])(?:\(([^(]+)\))$/,replace:(a,b)=>{const [,c,d]=b;b=D.$createLinkNode(d);const e=n.$createTextNode(c);e.setFormat(a.getFormat());b.append(e);a.replace(b)},trigger:")",type:"text-match"},qa=
|
|
21
|
+
[V,W,X,Y,fa],ra=[ha,ia,ja,ka,la,na,oa,ma],sa=[pa],Z=[...qa,...ra,...sa];exports.$convertFromMarkdownString=function(a,b=Z){return ca(b)(a)};exports.$convertToMarkdownString=function(a=Z){return aa(a)()};exports.BOLD_ITALIC_STAR=ia;exports.BOLD_ITALIC_UNDERSCORE=ja;exports.BOLD_STAR=ka;exports.BOLD_UNDERSCORE=la;exports.CHECK_LIST=ea;exports.CODE=X;exports.ELEMENT_TRANSFORMERS=qa;exports.HEADING=V;exports.INLINE_CODE=ha;exports.ITALIC_STAR=na;exports.ITALIC_UNDERSCORE=oa;exports.LINK=pa;
|
|
22
|
+
exports.ORDERED_LIST=fa;exports.QUOTE=W;exports.STRIKETHROUGH=ma;exports.TEXT_FORMAT_TRANSFORMERS=ra;exports.TEXT_MATCH_TRANSFORMERS=sa;exports.TRANSFORMERS=Z;exports.UNORDERED_LIST=Y;
|
|
23
|
+
exports.registerMarkdownShortcuts=function(a,b=Z){const c=H(b),d=G(c.textFormat,({tag:f})=>f[f.length-1]),e=G(c.textMatch,({trigger:f})=>f);return a.registerUpdateListener(({tags:f,dirtyLeaves:l,editorState:h,prevEditorState:r})=>{if(!f.has("historic")){var u=h.read(n.$getSelection);f=r.read(n.$getSelection);if(n.$isRangeSelection(f)&&n.$isRangeSelection(u)&&u.isCollapsed()){r=u.anchor.key;var p=u.anchor.offset,t=h._nodeMap.get(r);n.$isTextNode(t)&&l.has(r)&&(1===p||p===f.anchor.offset+1)&&a.update(()=>
|
|
24
|
+
{if(!t.hasFormat("code")){var m=t.getParent();if(null!==m&&!y.$isCodeNode(m)){var q=u.anchor.offset;b:{var k=c.element,g=m.getParent();if(n.$isRootNode(g)&&m.getFirstChild()===t&&(g=t.getTextContent()," "===g[q-1]))for(const {regExp:I,replace:B}of k)if((k=g.match(I))&&k[0].length===q){g=t.getNextSiblings();const [C,z]=t.splitText(q);C.remove();g=z?[z,...g]:g;B(m,g,k,!1);m=!0;break b}m=!1}if(!m){b:{k=t.getTextContent();m=e[k[q-1]];if(null!=m){q<k.length&&(k=k.slice(0,q));for(w of m)if(m=k.match(w.regExp),
|
|
25
|
+
null!==m){k=m.index;g=k+m[0].length;var v=void 0;0===k?[v]=t.splitText(g):[,v]=t.splitText(k,g);v.selectNext();w.replace(v,m);var w=!0;break b}}w=!1}if(!w)b:{g=t.getTextContent();--q;const I=g[q];if(w=d[I])for(const B of w){var {tag:A}=B;w=A.length;const C=q-w+1;if(!(1<w&&!R(g,C,A,0,w)||" "===g[C-1])&&(v=g[q+1],!1!==B.intraword||!v||P.test(v))){m=v=t;k=Q(g,C,A);for(var x=m;0>k&&(x=x.getPreviousSibling())&&!n.$isLineBreakNode(x);)n.$isTextNode(x)&&(k=x.getTextContent(),m=x,k=Q(k,k.length,A));if(!(0>
|
|
26
|
+
k||m===v&&k+w===C||(A=m.getTextContent(),0<k&&A[k-1]===I||(x=A[k-1],!1===B.intraword&&x&&!P.test(x))))){g=v.getTextContent();g=g.slice(0,C)+g.slice(q+1);v.setTextContent(g);g=m===v?g:A;m.setTextContent(g.slice(0,k)+g.slice(k+w));g=n.$createRangeSelection();n.$setSelection(g);q=q-w*(m===v?2:1)+1;g.anchor.set(m.__key,k,"text");g.focus.set(v.__key,q,"text");for(const z of B.format)g.hasFormat(z)||g.formatText(z);g.anchor.set(g.focus.key,g.focus.offset,g.focus.type);for(const z of B.format)g.hasFormat(z)&&
|
|
27
|
+
g.toggleFormat(z);break b}}}}}}}})}}})};
|
package/package.json
CHANGED
|
@@ -8,18 +8,18 @@
|
|
|
8
8
|
"markdown"
|
|
9
9
|
],
|
|
10
10
|
"license": "MIT",
|
|
11
|
-
"version": "0.2.
|
|
11
|
+
"version": "0.2.8",
|
|
12
12
|
"main": "LexicalMarkdown.js",
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"lexical": "0.2.
|
|
14
|
+
"lexical": "0.2.8"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@lexical/utils": "0.2.
|
|
18
|
-
"@lexical/code": "0.2.
|
|
19
|
-
"@lexical/text": "0.2.
|
|
20
|
-
"@lexical/rich-text": "0.2.
|
|
21
|
-
"@lexical/list": "0.2.
|
|
22
|
-
"@lexical/link": "0.2.
|
|
17
|
+
"@lexical/utils": "0.2.8",
|
|
18
|
+
"@lexical/code": "0.2.8",
|
|
19
|
+
"@lexical/text": "0.2.8",
|
|
20
|
+
"@lexical/rich-text": "0.2.8",
|
|
21
|
+
"@lexical/list": "0.2.8",
|
|
22
|
+
"@lexical/link": "0.2.8"
|
|
23
23
|
},
|
|
24
24
|
"repository": {
|
|
25
25
|
"type": "git",
|