@bikdotai/bik-component-library 0.0.806-beta.10 → 0.0.806-beta.11
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/dist/cjs/editor/extensions/plainClipboard/PlainClipboardExtension.js +1 -1
- package/dist/cjs/editor/extensions/plainClipboard/PlainClipboardExtension.js.map +1 -1
- package/dist/esm/editor/extensions/plainClipboard/PlainClipboardExtension.js +1 -1
- package/dist/esm/editor/extensions/plainClipboard/PlainClipboardExtension.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../node_modules/@tiptap/core/dist/index.js"),t=require("@tiptap/pm/model"),r=require("@tiptap/pm/state");const n=new Set(["bold","italic","strike","underline","code"]),a=new Set(["P","LI","H1","H2","H3","H4","H5","H6","TD","TH","PRE"]);function o(e){const r=[];return e.forEach((e=>{if(e.isText){const t=e.marks.filter((e=>n.has(e.type.name)));r.push(t.length===e.marks.length?e:e.mark(t))}else r.push(e.copy(o(e.content)))})),t.Fragment.from(r)}function i(e){const r=[];let n=!1;return e.forEach((e=>{var t;if("paragraph"===e.type.name&&1===e.childCount&&"hardBreak"===(null===(t=e.firstChild)||void 0===t?void 0:t.type.name))return n||r.push(e.type.create(e.attrs)),void(n=!0);const a="paragraph"===e.type.name&&0===e.childCount;a&&n||(n=a,e.isBlock&&!e.isLeaf?r.push(e.copy(i(e.content))):r.push(e))})),t.Fragment.from(r)}const l=e.Extension.create({name:"plainClipboard",addProseMirrorPlugins:()=>[new r.Plugin({props:{handlePaste(e,r){var n,l,s
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../node_modules/@tiptap/core/dist/index.js"),t=require("@tiptap/pm/model"),r=require("@tiptap/pm/state");const n=new Set(["bold","italic","strike","underline","code"]),a=new Set(["P","LI","H1","H2","H3","H4","H5","H6","TD","TH","PRE"]);function o(e){const r=[];return e.forEach((e=>{if(e.isText){const t=e.marks.filter((e=>n.has(e.type.name)));r.push(t.length===e.marks.length?e:e.mark(t))}else r.push(e.copy(o(e.content)))})),t.Fragment.from(r)}function i(e){const r=[];let n=!1;return e.forEach((e=>{var t;if("paragraph"===e.type.name&&1===e.childCount&&"hardBreak"===(null===(t=e.firstChild)||void 0===t?void 0:t.type.name))return n||r.push(e.type.create(e.attrs)),void(n=!0);const a="paragraph"===e.type.name&&0===e.childCount;a&&n||(n=a,e.isBlock&&!e.isLeaf?r.push(e.copy(i(e.content))):r.push(e))})),t.Fragment.from(r)}const l=e.Extension.create({name:"plainClipboard",addProseMirrorPlugins:()=>[new r.Plugin({props:{handlePaste(e,r){var n,l,c,s;if(null===(l=null===(n=r.clipboardData)||void 0===n?void 0:n.files)||void 0===l?void 0:l.length)return!1;const p=null===(c=r.clipboardData)||void 0===c?void 0:c.getData("text/html"),d=null===(s=r.clipboardData)||void 0===s?void 0:s.getData("text/plain");if(!d)return!1;if(null==p?void 0:p.includes("data-pm-slice"))return!1;const u=e.state.schema;if(p){const r=document.createElement("div");r.innerHTML=p;if(r.querySelector("p,div,h1,h2,h3,h4,h5,h6,ul,ol,li,blockquote,table,pre")){!function(e){const t=Array.from(e.querySelectorAll("br"));for(const r of t){let t=!1,n=r.parentElement;for(;n&&n!==e;){if(a.has(n.tagName)){t=!0;break}n=n.parentElement}t||r.parentElement.replaceChild(document.createElement("p"),r)}}(r);const n=t.DOMParser.fromSchema(u).parseSlice(r),l=i(o(n.content)),c=new t.Slice(l,n.openStart,n.openEnd);return e.dispatch(e.state.tr.replaceSelection(c)),!0}}const m=d.split("\n").map((e=>u.node("paragraph",null,e?[u.text(e)]:[]))),h=new t.Slice(t.Fragment.fromArray(m),1,1);return e.dispatch(e.state.tr.replaceSelection(h)),!0}}})]});exports.PlainClipboardExtension=l;
|
|
2
2
|
//# sourceMappingURL=PlainClipboardExtension.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlainClipboardExtension.js","sources":["../../../../../src/editor/extensions/plainClipboard/PlainClipboardExtension.ts"],"sourcesContent":["import { Extension } from '@tiptap/core';\nimport {\n\tFragment,\n\tNode as PMNode,\n\tDOMParser as ProseMirrorDOMParser,\n\tSlice,\n} from '@tiptap/pm/model';\nimport { Plugin } from '@tiptap/pm/state';\n\nconst BASIC_MARKS = new Set(['bold', 'italic', 'strike', 'underline', 'code']);\n\nconst TEXTBLOCK_TAGS = new Set([\n\t'P',\n\t'LI',\n\t'H1',\n\t'H2',\n\t'H3',\n\t'H4',\n\t'H5',\n\t'H6',\n\t'TD',\n\t'TH',\n\t'PRE',\n]);\n\n/**\n * Strip only \"rich\" marks (link, textStyle, highlight, etc.) while keeping\n * basic formatting marks (bold, italic, strike, underline, code) that\n * messaging channels can represent.\n */\nfunction stripRichMarks(fragment: Fragment): Fragment {\n\tconst nodes: PMNode[] = [];\n\tfragment.forEach((node) => {\n\t\tif (node.isText) {\n\t\t\tconst kept = node.marks.filter((m) => BASIC_MARKS.has(m.type.name));\n\t\t\tnodes.push(kept.length === node.marks.length ? node : node.mark(kept));\n\t\t} else {\n\t\t\tnodes.push(node.copy(stripRichMarks(node.content)));\n\t\t}\n\t});\n\treturn Fragment.from(nodes);\n}\n\n/**\n * Replace `<br>` elements that sit at block level (not inside a textblock\n * like `<p>`, `<li>`, etc.) with empty `<p></p>` elements. Google Docs\n * puts standalone `<br>` tags between paragraphs to represent blank lines.\n * Without this, ProseMirror parses them as top-level hardBreak nodes.\n */\nfunction cleanBlockBrs(container: HTMLElement): void {\n\tconst brs = Array.from(container.querySelectorAll('br'));\n\tfor (const br of brs) {\n\t\tlet insideTextblock = false;\n\t\tlet el = br.parentElement;\n\t\twhile (el && el !== container) {\n\t\t\tif (TEXTBLOCK_TAGS.has(el.tagName)) {\n\t\t\t\tinsideTextblock = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tel = el.parentElement;\n\t\t}\n\t\tif (!insideTextblock) {\n\t\t\tbr.parentElement!.replaceChild(document.createElement('p'), br);\n\t\t}\n\t}\n}\n\n/**\n * 1. Convert paragraphs containing only a hard_break into empty paragraphs.\n * 2. Collapse consecutive empty paragraphs into one.\n */\nfunction normalizeBlanks(fragment: Fragment): Fragment {\n\tconst nodes: PMNode[] = [];\n\tlet prevEmpty = false;\n\tfragment.forEach((node) => {\n\t\tconst isHardBreakOnly =\n\t\t\tnode.type.name === 'paragraph' &&\n\t\t\tnode.childCount === 1 &&\n\t\t\tnode.firstChild?.type.name === 'hardBreak';\n\t\tif (isHardBreakOnly) {\n\t\t\tif (!prevEmpty) nodes.push(node.type.create(node.attrs));\n\t\t\tprevEmpty = true;\n\t\t\treturn;\n\t\t}\n\t\tconst isEmpty = node.type.name === 'paragraph' && node.childCount === 0;\n\t\tif (isEmpty && prevEmpty) return;\n\t\tprevEmpty = isEmpty;\n\t\tif (node.isBlock && !node.isLeaf) {\n\t\t\tnodes.push(node.copy(normalizeBlanks(node.content)));\n\t\t} else {\n\t\t\tnodes.push(node);\n\t\t}\n\t});\n\treturn Fragment.from(nodes);\n}\n\nexport const PlainClipboardExtension = Extension.create({\n\tname: 'plainClipboard',\n\taddProseMirrorPlugins() {\n\t\treturn [\n\t\t\tnew Plugin({\n\t\t\t\tprops: {\n\t\t\t\t\thandlePaste(_view, event) {\n\t\t\t\t\t\tif (event.clipboardData?.files?.length) return false;\n\t\t\t\t\t\tconst html = event.clipboardData?.getData('text/html');\n\t\t\t\t\t\tconst text = event.clipboardData?.getData('text/plain');\n\t\t\t\t\t\tif (!text) return false;\n\n\t\t\t\t\t\tif (html?.includes('data-pm-slice')) return false;\n\n\t\t\t\t\t\tconst schema = _view.state.schema;\n\n\t\t\t\t\t\tif (html) {\n\t\t\t\t\t\t\tconst container = document.createElement('div');\n\t\t\t\t\t\t\tcontainer.innerHTML = html;\n\t\t\t\t\t\t\tcleanBlockBrs(container);\n\t\t\t\t\t\t\tconst parsed =\n\t\t\t\t\t\t\t\tProseMirrorDOMParser.fromSchema(schema).parseSlice(container);\n\t\t\t\t\t\t\tconst cleaned = normalizeBlanks(stripRichMarks(parsed.content));\n\t\t\t\t\t\t\tconst slice = new Slice(\n\t\t\t\t\t\t\t\tcleaned,\n\t\t\t\t\t\t\t\tparsed.openStart,\n\t\t\t\t\t\t\t\tparsed.openEnd,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t_view.dispatch(_view.state.tr.replaceSelection(slice));\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst paragraphs = text\n\t\t\t\t\t\t\t.split('\\n')\n\t\t\t\t\t\t\t.map((line) =>\n\t\t\t\t\t\t\t\tschema.node('paragraph', null, line ? [schema.text(line)] : []),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tconst slice = new Slice(Fragment.fromArray(paragraphs), 1, 1);\n\t\t\t\t\t\t_view.dispatch(_view.state.tr.replaceSelection(slice));\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t];\n\t},\n});\n"],"names":["BASIC_MARKS","Set","TEXTBLOCK_TAGS","stripRichMarks","fragment","nodes","forEach","node","isText","kept","marks","filter","m","has","type","name","push","length","mark","copy","content","Fragment","from","normalizeBlanks","prevEmpty","childCount","_a","firstChild","create","attrs","isEmpty","isBlock","isLeaf","PlainClipboardExtension","Extension","addProseMirrorPlugins","Plugin","props","handlePaste","_view","event","_b","clipboardData","files","html","_c","getData","text","_d","includes","schema","state","container","document","createElement","innerHTML","brs","Array","querySelectorAll","br","insideTextblock","el","parentElement","tagName","replaceChild","cleanBlockBrs","parsed","ProseMirrorDOMParser","fromSchema","parseSlice","cleaned","slice","Slice","openStart","openEnd","dispatch","tr","replaceSelection","paragraphs","split","map","line","fromArray"],"mappings":"kMASA,MAAMA,EAAc,IAAIC,IAAI,CAAC,OAAQ,SAAU,SAAU,YAAa,SAEhEC,EAAiB,IAAID,IAAI,CAC9B,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QAQD,SAASE,EAAeC,GACvB,MAAMC,EAAkB,GASxB,OARAD,EAASE,SAASC,IACjB,GAAIA,EAAKC,OAAQ,CAChB,MAAMC,EAAOF,EAAKG,MAAMC,QAAQC,GAAMZ,EAAYa,IAAID,EAAEE,KAAKC,QAC7DV,EAAMW,KAAKP,EAAKQ,SAAWV,EAAKG,MAAMO,OAASV,EAAOA,EAAKW,KAAKT,GAChE,MACAJ,EAAMW,KAAKT,EAAKY,KAAKhB,EAAeI,EAAKa,UACzC,IAEKC,EAAQA,SAACC,KAAKjB,EACtB,CA8BA,SAASkB,EAAgBnB,GACxB,MAAMC,EAAkB,GACxB,IAAImB,GAAY,EAoBhB,OAnBApB,EAASE,SAASC,UAKjB,GAHoB,cAAnBA,EAAKO,KAAKC,MACU,IAApBR,EAAKkB,YAC0B,eAAhB,QAAfC,EAAAnB,EAAKoB,kBAAU,IAAAD,OAAA,EAAAA,EAAEZ,KAAKC,MAItB,OAFKS,GAAWnB,EAAMW,KAAKT,EAAKO,KAAKc,OAAOrB,EAAKsB,aACjDL,GAAY,GAGb,MAAMM,EAA6B,cAAnBvB,EAAKO,KAAKC,MAA4C,IAApBR,EAAKkB,WACnDK,GAAWN,IACfA,EAAYM,EACRvB,EAAKwB,UAAYxB,EAAKyB,OACzB3B,EAAMW,KAAKT,EAAKY,KAAKI,EAAgBhB,EAAKa,WAE1Cf,EAAMW,KAAKT,GACX,IAEKc,EAAQA,SAACC,KAAKjB,EACtB,OAEa4B,EAA0BC,EAASA,UAACN,OAAO,CACvDb,KAAM,iBACNoB,sBAAqBA,IACb,CACN,IAAIC,EAAAA,OAAO,CACVC,MAAO,CACNC,YAAYC,EAAOC,eAClB,WAAIC,EAAqB,UAArBD,EAAME,qBAAe,IAAAhB,OAAA,EAAAA,EAAAiB,4BAAO1B,OAAQ,OAAO,EAC/C,MAAM2B,EAA0B,QAAnBC,EAAAL,EAAME,qBAAa,IAAAG,OAAA,EAAAA,EAAEC,QAAQ,aACpCC,EAA0B,QAAnBC,EAAAR,EAAME,qBAAa,IAAAM,OAAA,EAAAA,EAAEF,QAAQ,cAC1C,IAAKC,EAAM,OAAO,EAElB,GAAIH,aAAI,EAAJA,EAAMK,SAAS,iBAAkB,OAAO,EAE5C,MAAMC,EAASX,EAAMY,MAAMD,OAE3B,GAAIN,EAAM,CACT,MAAMQ,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAYX,
|
|
1
|
+
{"version":3,"file":"PlainClipboardExtension.js","sources":["../../../../../src/editor/extensions/plainClipboard/PlainClipboardExtension.ts"],"sourcesContent":["import { Extension } from '@tiptap/core';\nimport {\n\tFragment,\n\tNode as PMNode,\n\tDOMParser as ProseMirrorDOMParser,\n\tSlice,\n} from '@tiptap/pm/model';\nimport { Plugin } from '@tiptap/pm/state';\n\nconst BASIC_MARKS = new Set(['bold', 'italic', 'strike', 'underline', 'code']);\n\nconst TEXTBLOCK_TAGS = new Set([\n\t'P',\n\t'LI',\n\t'H1',\n\t'H2',\n\t'H3',\n\t'H4',\n\t'H5',\n\t'H6',\n\t'TD',\n\t'TH',\n\t'PRE',\n]);\n\n/**\n * Strip only \"rich\" marks (link, textStyle, highlight, etc.) while keeping\n * basic formatting marks (bold, italic, strike, underline, code) that\n * messaging channels can represent.\n */\nfunction stripRichMarks(fragment: Fragment): Fragment {\n\tconst nodes: PMNode[] = [];\n\tfragment.forEach((node) => {\n\t\tif (node.isText) {\n\t\t\tconst kept = node.marks.filter((m) => BASIC_MARKS.has(m.type.name));\n\t\t\tnodes.push(kept.length === node.marks.length ? node : node.mark(kept));\n\t\t} else {\n\t\t\tnodes.push(node.copy(stripRichMarks(node.content)));\n\t\t}\n\t});\n\treturn Fragment.from(nodes);\n}\n\n/**\n * Replace `<br>` elements that sit at block level (not inside a textblock\n * like `<p>`, `<li>`, etc.) with empty `<p></p>` elements. Google Docs\n * puts standalone `<br>` tags between paragraphs to represent blank lines.\n * Without this, ProseMirror parses them as top-level hardBreak nodes.\n */\nfunction cleanBlockBrs(container: HTMLElement): void {\n\tconst brs = Array.from(container.querySelectorAll('br'));\n\tfor (const br of brs) {\n\t\tlet insideTextblock = false;\n\t\tlet el = br.parentElement;\n\t\twhile (el && el !== container) {\n\t\t\tif (TEXTBLOCK_TAGS.has(el.tagName)) {\n\t\t\t\tinsideTextblock = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tel = el.parentElement;\n\t\t}\n\t\tif (!insideTextblock) {\n\t\t\tbr.parentElement!.replaceChild(document.createElement('p'), br);\n\t\t}\n\t}\n}\n\n/**\n * 1. Convert paragraphs containing only a hard_break into empty paragraphs.\n * 2. Collapse consecutive empty paragraphs into one.\n */\nfunction normalizeBlanks(fragment: Fragment): Fragment {\n\tconst nodes: PMNode[] = [];\n\tlet prevEmpty = false;\n\tfragment.forEach((node) => {\n\t\tconst isHardBreakOnly =\n\t\t\tnode.type.name === 'paragraph' &&\n\t\t\tnode.childCount === 1 &&\n\t\t\tnode.firstChild?.type.name === 'hardBreak';\n\t\tif (isHardBreakOnly) {\n\t\t\tif (!prevEmpty) nodes.push(node.type.create(node.attrs));\n\t\t\tprevEmpty = true;\n\t\t\treturn;\n\t\t}\n\t\tconst isEmpty = node.type.name === 'paragraph' && node.childCount === 0;\n\t\tif (isEmpty && prevEmpty) return;\n\t\tprevEmpty = isEmpty;\n\t\tif (node.isBlock && !node.isLeaf) {\n\t\t\tnodes.push(node.copy(normalizeBlanks(node.content)));\n\t\t} else {\n\t\t\tnodes.push(node);\n\t\t}\n\t});\n\treturn Fragment.from(nodes);\n}\n\nexport const PlainClipboardExtension = Extension.create({\n\tname: 'plainClipboard',\n\taddProseMirrorPlugins() {\n\t\treturn [\n\t\t\tnew Plugin({\n\t\t\t\tprops: {\n\t\t\t\t\thandlePaste(_view, event) {\n\t\t\t\t\t\tif (event.clipboardData?.files?.length) return false;\n\t\t\t\t\t\tconst html = event.clipboardData?.getData('text/html');\n\t\t\t\t\t\tconst text = event.clipboardData?.getData('text/plain');\n\t\t\t\t\t\tif (!text) return false;\n\n\t\t\t\t\t\tif (html?.includes('data-pm-slice')) return false;\n\n\t\t\t\t\t\tconst schema = _view.state.schema;\n\n\t\t\t\t\t\tif (html) {\n\t\t\t\t\t\t\tconst container = document.createElement('div');\n\t\t\t\t\t\t\tcontainer.innerHTML = html;\n\t\t\t\t\t\t\t// If the HTML has block elements (p, div, li, etc.) it's\n\t\t\t\t\t\t\t// from a rich source — parse the structure. Otherwise it's\n\t\t\t\t\t\t\t// from a plain input/textarea — fall through to the text\n\t\t\t\t\t\t\t// path which handles \\n vs \\n\\n correctly.\n\t\t\t\t\t\t\tconst hasBlocks = container.querySelector(\n\t\t\t\t\t\t\t\t'p,div,h1,h2,h3,h4,h5,h6,ul,ol,li,blockquote,table,pre',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (hasBlocks) {\n\t\t\t\t\t\t\t\tcleanBlockBrs(container);\n\t\t\t\t\t\t\t\tconst parsed =\n\t\t\t\t\t\t\t\t\tProseMirrorDOMParser.fromSchema(schema).parseSlice(container);\n\t\t\t\t\t\t\t\tconst cleaned = normalizeBlanks(stripRichMarks(parsed.content));\n\t\t\t\t\t\t\t\tconst slice = new Slice(\n\t\t\t\t\t\t\t\t\tcleaned,\n\t\t\t\t\t\t\t\t\tparsed.openStart,\n\t\t\t\t\t\t\t\t\tparsed.openEnd,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t_view.dispatch(_view.state.tr.replaceSelection(slice));\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst paragraphs = text\n\t\t\t\t\t\t\t.split('\\n')\n\t\t\t\t\t\t\t.map((line) =>\n\t\t\t\t\t\t\t\tschema.node('paragraph', null, line ? [schema.text(line)] : []),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tconst slice = new Slice(Fragment.fromArray(paragraphs), 1, 1);\n\t\t\t\t\t\t_view.dispatch(_view.state.tr.replaceSelection(slice));\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t];\n\t},\n});\n"],"names":["BASIC_MARKS","Set","TEXTBLOCK_TAGS","stripRichMarks","fragment","nodes","forEach","node","isText","kept","marks","filter","m","has","type","name","push","length","mark","copy","content","Fragment","from","normalizeBlanks","prevEmpty","childCount","_a","firstChild","create","attrs","isEmpty","isBlock","isLeaf","PlainClipboardExtension","Extension","addProseMirrorPlugins","Plugin","props","handlePaste","_view","event","_b","clipboardData","files","html","_c","getData","text","_d","includes","schema","state","container","document","createElement","innerHTML","querySelector","brs","Array","querySelectorAll","br","insideTextblock","el","parentElement","tagName","replaceChild","cleanBlockBrs","parsed","ProseMirrorDOMParser","fromSchema","parseSlice","cleaned","slice","Slice","openStart","openEnd","dispatch","tr","replaceSelection","paragraphs","split","map","line","fromArray"],"mappings":"kMASA,MAAMA,EAAc,IAAIC,IAAI,CAAC,OAAQ,SAAU,SAAU,YAAa,SAEhEC,EAAiB,IAAID,IAAI,CAC9B,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QAQD,SAASE,EAAeC,GACvB,MAAMC,EAAkB,GASxB,OARAD,EAASE,SAASC,IACjB,GAAIA,EAAKC,OAAQ,CAChB,MAAMC,EAAOF,EAAKG,MAAMC,QAAQC,GAAMZ,EAAYa,IAAID,EAAEE,KAAKC,QAC7DV,EAAMW,KAAKP,EAAKQ,SAAWV,EAAKG,MAAMO,OAASV,EAAOA,EAAKW,KAAKT,GAChE,MACAJ,EAAMW,KAAKT,EAAKY,KAAKhB,EAAeI,EAAKa,UACzC,IAEKC,EAAQA,SAACC,KAAKjB,EACtB,CA8BA,SAASkB,EAAgBnB,GACxB,MAAMC,EAAkB,GACxB,IAAImB,GAAY,EAoBhB,OAnBApB,EAASE,SAASC,UAKjB,GAHoB,cAAnBA,EAAKO,KAAKC,MACU,IAApBR,EAAKkB,YAC0B,eAAhB,QAAfC,EAAAnB,EAAKoB,kBAAU,IAAAD,OAAA,EAAAA,EAAEZ,KAAKC,MAItB,OAFKS,GAAWnB,EAAMW,KAAKT,EAAKO,KAAKc,OAAOrB,EAAKsB,aACjDL,GAAY,GAGb,MAAMM,EAA6B,cAAnBvB,EAAKO,KAAKC,MAA4C,IAApBR,EAAKkB,WACnDK,GAAWN,IACfA,EAAYM,EACRvB,EAAKwB,UAAYxB,EAAKyB,OACzB3B,EAAMW,KAAKT,EAAKY,KAAKI,EAAgBhB,EAAKa,WAE1Cf,EAAMW,KAAKT,GACX,IAEKc,EAAQA,SAACC,KAAKjB,EACtB,OAEa4B,EAA0BC,EAASA,UAACN,OAAO,CACvDb,KAAM,iBACNoB,sBAAqBA,IACb,CACN,IAAIC,EAAAA,OAAO,CACVC,MAAO,CACNC,YAAYC,EAAOC,eAClB,WAAIC,EAAqB,UAArBD,EAAME,qBAAe,IAAAhB,OAAA,EAAAA,EAAAiB,4BAAO1B,OAAQ,OAAO,EAC/C,MAAM2B,EAA0B,QAAnBC,EAAAL,EAAME,qBAAa,IAAAG,OAAA,EAAAA,EAAEC,QAAQ,aACpCC,EAA0B,QAAnBC,EAAAR,EAAME,qBAAa,IAAAM,OAAA,EAAAA,EAAEF,QAAQ,cAC1C,IAAKC,EAAM,OAAO,EAElB,GAAIH,aAAI,EAAJA,EAAMK,SAAS,iBAAkB,OAAO,EAE5C,MAAMC,EAASX,EAAMY,MAAMD,OAE3B,GAAIN,EAAM,CACT,MAAMQ,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAYX,EAQtB,GAHkBQ,EAAUI,cAC3B,yDAEc,EAzEtB,SAAuBJ,GACtB,MAAMK,EAAMC,MAAMpC,KAAK8B,EAAUO,iBAAiB,OAClD,IAAK,MAAMC,KAAMH,EAAK,CACrB,IAAII,GAAkB,EAClBC,EAAKF,EAAGG,cACZ,KAAOD,GAAMA,IAAOV,GAAW,CAC9B,GAAIlD,EAAeW,IAAIiD,EAAGE,SAAU,CACnCH,GAAkB,EAClB,KACA,CACDC,EAAKA,EAAGC,aACR,CACIF,GACJD,EAAGG,cAAeE,aAAaZ,SAASC,cAAc,KAAMM,EAE7D,CACF,CA0DQM,CAAcd,GACd,MAAMe,EACLC,EAAAA,UAAqBC,WAAWnB,GAAQoB,WAAWlB,GAC9CmB,EAAUhD,EAAgBpB,EAAegE,EAAO/C,UAChDoD,EAAQ,IAAIC,EAAAA,MACjBF,EACAJ,EAAOO,UACPP,EAAOQ,SAGR,OADApC,EAAMqC,SAASrC,EAAMY,MAAM0B,GAAGC,iBAAiBN,KACxC,CACP,CACD,CAED,MAAMO,EAAahC,EACjBiC,MAAM,MACNC,KAAKC,GACLhC,EAAO3C,KAAK,YAAa,KAAM2E,EAAO,CAAChC,EAAOH,KAAKmC,IAAS,MAExDV,EAAQ,IAAIC,EAAAA,MAAMpD,EAAQA,SAAC8D,UAAUJ,GAAa,EAAG,GAE3D,OADAxC,EAAMqC,SAASrC,EAAMY,MAAM0B,GAAGC,iBAAiBN,KACxC,CACR"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Extension as
|
|
1
|
+
import{Extension as e}from"../../../node_modules/@tiptap/core/dist/index.js";import{DOMParser as t,Slice as r,Fragment as n}from"@tiptap/pm/model";import{Plugin as a}from"@tiptap/pm/state";const o=new Set(["bold","italic","strike","underline","code"]),i=new Set(["P","LI","H1","H2","H3","H4","H5","H6","TD","TH","PRE"]);function l(e){const t=[];return e.forEach((e=>{if(e.isText){const r=e.marks.filter((e=>o.has(e.type.name)));t.push(r.length===e.marks.length?e:e.mark(r))}else t.push(e.copy(l(e.content)))})),n.from(t)}function p(e){const t=[];let r=!1;return e.forEach((e=>{var n;if("paragraph"===e.type.name&&1===e.childCount&&"hardBreak"===(null===(n=e.firstChild)||void 0===n?void 0:n.type.name))return r||t.push(e.type.create(e.attrs)),void(r=!0);const a="paragraph"===e.type.name&&0===e.childCount;a&&r||(r=a,e.isBlock&&!e.isLeaf?t.push(e.copy(p(e.content))):t.push(e))})),n.from(t)}const c=e.create({name:"plainClipboard",addProseMirrorPlugins:()=>[new a({props:{handlePaste(e,a){var o,c,s,d;if(null===(c=null===(o=a.clipboardData)||void 0===o?void 0:o.files)||void 0===c?void 0:c.length)return!1;const m=null===(s=a.clipboardData)||void 0===s?void 0:s.getData("text/html"),u=null===(d=a.clipboardData)||void 0===d?void 0:d.getData("text/plain");if(!u)return!1;if(null==m?void 0:m.includes("data-pm-slice"))return!1;const h=e.state.schema;if(m){const n=document.createElement("div");n.innerHTML=m;if(n.querySelector("p,div,h1,h2,h3,h4,h5,h6,ul,ol,li,blockquote,table,pre")){!function(e){const t=Array.from(e.querySelectorAll("br"));for(const r of t){let t=!1,n=r.parentElement;for(;n&&n!==e;){if(i.has(n.tagName)){t=!0;break}n=n.parentElement}t||r.parentElement.replaceChild(document.createElement("p"),r)}}(n);const a=t.fromSchema(h).parseSlice(n),o=p(l(a.content)),c=new r(o,a.openStart,a.openEnd);return e.dispatch(e.state.tr.replaceSelection(c)),!0}}const f=u.split("\n").map((e=>h.node("paragraph",null,e?[h.text(e)]:[]))),v=new r(n.fromArray(f),1,1);return e.dispatch(e.state.tr.replaceSelection(v)),!0}}})]});export{c as PlainClipboardExtension};
|
|
2
2
|
//# sourceMappingURL=PlainClipboardExtension.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlainClipboardExtension.js","sources":["../../../../../src/editor/extensions/plainClipboard/PlainClipboardExtension.ts"],"sourcesContent":["import { Extension } from '@tiptap/core';\nimport {\n\tFragment,\n\tNode as PMNode,\n\tDOMParser as ProseMirrorDOMParser,\n\tSlice,\n} from '@tiptap/pm/model';\nimport { Plugin } from '@tiptap/pm/state';\n\nconst BASIC_MARKS = new Set(['bold', 'italic', 'strike', 'underline', 'code']);\n\nconst TEXTBLOCK_TAGS = new Set([\n\t'P',\n\t'LI',\n\t'H1',\n\t'H2',\n\t'H3',\n\t'H4',\n\t'H5',\n\t'H6',\n\t'TD',\n\t'TH',\n\t'PRE',\n]);\n\n/**\n * Strip only \"rich\" marks (link, textStyle, highlight, etc.) while keeping\n * basic formatting marks (bold, italic, strike, underline, code) that\n * messaging channels can represent.\n */\nfunction stripRichMarks(fragment: Fragment): Fragment {\n\tconst nodes: PMNode[] = [];\n\tfragment.forEach((node) => {\n\t\tif (node.isText) {\n\t\t\tconst kept = node.marks.filter((m) => BASIC_MARKS.has(m.type.name));\n\t\t\tnodes.push(kept.length === node.marks.length ? node : node.mark(kept));\n\t\t} else {\n\t\t\tnodes.push(node.copy(stripRichMarks(node.content)));\n\t\t}\n\t});\n\treturn Fragment.from(nodes);\n}\n\n/**\n * Replace `<br>` elements that sit at block level (not inside a textblock\n * like `<p>`, `<li>`, etc.) with empty `<p></p>` elements. Google Docs\n * puts standalone `<br>` tags between paragraphs to represent blank lines.\n * Without this, ProseMirror parses them as top-level hardBreak nodes.\n */\nfunction cleanBlockBrs(container: HTMLElement): void {\n\tconst brs = Array.from(container.querySelectorAll('br'));\n\tfor (const br of brs) {\n\t\tlet insideTextblock = false;\n\t\tlet el = br.parentElement;\n\t\twhile (el && el !== container) {\n\t\t\tif (TEXTBLOCK_TAGS.has(el.tagName)) {\n\t\t\t\tinsideTextblock = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tel = el.parentElement;\n\t\t}\n\t\tif (!insideTextblock) {\n\t\t\tbr.parentElement!.replaceChild(document.createElement('p'), br);\n\t\t}\n\t}\n}\n\n/**\n * 1. Convert paragraphs containing only a hard_break into empty paragraphs.\n * 2. Collapse consecutive empty paragraphs into one.\n */\nfunction normalizeBlanks(fragment: Fragment): Fragment {\n\tconst nodes: PMNode[] = [];\n\tlet prevEmpty = false;\n\tfragment.forEach((node) => {\n\t\tconst isHardBreakOnly =\n\t\t\tnode.type.name === 'paragraph' &&\n\t\t\tnode.childCount === 1 &&\n\t\t\tnode.firstChild?.type.name === 'hardBreak';\n\t\tif (isHardBreakOnly) {\n\t\t\tif (!prevEmpty) nodes.push(node.type.create(node.attrs));\n\t\t\tprevEmpty = true;\n\t\t\treturn;\n\t\t}\n\t\tconst isEmpty = node.type.name === 'paragraph' && node.childCount === 0;\n\t\tif (isEmpty && prevEmpty) return;\n\t\tprevEmpty = isEmpty;\n\t\tif (node.isBlock && !node.isLeaf) {\n\t\t\tnodes.push(node.copy(normalizeBlanks(node.content)));\n\t\t} else {\n\t\t\tnodes.push(node);\n\t\t}\n\t});\n\treturn Fragment.from(nodes);\n}\n\nexport const PlainClipboardExtension = Extension.create({\n\tname: 'plainClipboard',\n\taddProseMirrorPlugins() {\n\t\treturn [\n\t\t\tnew Plugin({\n\t\t\t\tprops: {\n\t\t\t\t\thandlePaste(_view, event) {\n\t\t\t\t\t\tif (event.clipboardData?.files?.length) return false;\n\t\t\t\t\t\tconst html = event.clipboardData?.getData('text/html');\n\t\t\t\t\t\tconst text = event.clipboardData?.getData('text/plain');\n\t\t\t\t\t\tif (!text) return false;\n\n\t\t\t\t\t\tif (html?.includes('data-pm-slice')) return false;\n\n\t\t\t\t\t\tconst schema = _view.state.schema;\n\n\t\t\t\t\t\tif (html) {\n\t\t\t\t\t\t\tconst container = document.createElement('div');\n\t\t\t\t\t\t\tcontainer.innerHTML = html;\n\t\t\t\t\t\t\tcleanBlockBrs(container);\n\t\t\t\t\t\t\tconst parsed =\n\t\t\t\t\t\t\t\tProseMirrorDOMParser.fromSchema(schema).parseSlice(container);\n\t\t\t\t\t\t\tconst cleaned = normalizeBlanks(stripRichMarks(parsed.content));\n\t\t\t\t\t\t\tconst slice = new Slice(\n\t\t\t\t\t\t\t\tcleaned,\n\t\t\t\t\t\t\t\tparsed.openStart,\n\t\t\t\t\t\t\t\tparsed.openEnd,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t_view.dispatch(_view.state.tr.replaceSelection(slice));\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst paragraphs = text\n\t\t\t\t\t\t\t.split('\\n')\n\t\t\t\t\t\t\t.map((line) =>\n\t\t\t\t\t\t\t\tschema.node('paragraph', null, line ? [schema.text(line)] : []),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tconst slice = new Slice(Fragment.fromArray(paragraphs), 1, 1);\n\t\t\t\t\t\t_view.dispatch(_view.state.tr.replaceSelection(slice));\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t];\n\t},\n});\n"],"names":["BASIC_MARKS","Set","TEXTBLOCK_TAGS","stripRichMarks","fragment","nodes","forEach","node","isText","kept","marks","filter","m","has","type","name","push","length","mark","copy","content","Fragment","from","normalizeBlanks","prevEmpty","childCount","_a","firstChild","create","attrs","isEmpty","isBlock","isLeaf","PlainClipboardExtension","Extension","addProseMirrorPlugins","Plugin","props","handlePaste","_view","event","_b","clipboardData","files","html","_c","getData","text","_d","includes","schema","state","container","document","createElement","innerHTML","brs","Array","querySelectorAll","br","insideTextblock","el","parentElement","tagName","replaceChild","cleanBlockBrs","parsed","ProseMirrorDOMParser","fromSchema","parseSlice","cleaned","slice","Slice","openStart","openEnd","dispatch","tr","replaceSelection","paragraphs","split","map","line","fromArray"],"mappings":"6LASA,MAAMA,EAAc,IAAIC,IAAI,CAAC,OAAQ,SAAU,SAAU,YAAa,SAEhEC,EAAiB,IAAID,IAAI,CAC9B,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QAQD,SAASE,EAAeC,GACvB,MAAMC,EAAkB,GASxB,OARAD,EAASE,SAASC,IACjB,GAAIA,EAAKC,OAAQ,CAChB,MAAMC,EAAOF,EAAKG,MAAMC,QAAQC,GAAMZ,EAAYa,IAAID,EAAEE,KAAKC,QAC7DV,EAAMW,KAAKP,EAAKQ,SAAWV,EAAKG,MAAMO,OAASV,EAAOA,EAAKW,KAAKT,GAChE,MACAJ,EAAMW,KAAKT,EAAKY,KAAKhB,EAAeI,EAAKa,UACzC,IAEKC,EAASC,KAAKjB,EACtB,CA8BA,SAASkB,EAAgBnB,GACxB,MAAMC,EAAkB,GACxB,IAAImB,GAAY,EAoBhB,OAnBApB,EAASE,SAASC,UAKjB,GAHoB,cAAnBA,EAAKO,KAAKC,MACU,IAApBR,EAAKkB,YAC0B,eAAhB,QAAfC,EAAAnB,EAAKoB,kBAAU,IAAAD,OAAA,EAAAA,EAAEZ,KAAKC,MAItB,OAFKS,GAAWnB,EAAMW,KAAKT,EAAKO,KAAKc,OAAOrB,EAAKsB,aACjDL,GAAY,GAGb,MAAMM,EAA6B,cAAnBvB,EAAKO,KAAKC,MAA4C,IAApBR,EAAKkB,WACnDK,GAAWN,IACfA,EAAYM,EACRvB,EAAKwB,UAAYxB,EAAKyB,OACzB3B,EAAMW,KAAKT,EAAKY,KAAKI,EAAgBhB,EAAKa,WAE1Cf,EAAMW,KAAKT,GACX,IAEKc,EAASC,KAAKjB,EACtB,OAEa4B,EAA0BC,EAAUN,OAAO,CACvDb,KAAM,iBACNoB,sBAAqBA,IACb,CACN,IAAIC,EAAO,CACVC,MAAO,CACNC,YAAYC,EAAOC,eAClB,WAAIC,EAAqB,UAArBD,EAAME,qBAAe,IAAAhB,OAAA,EAAAA,EAAAiB,4BAAO1B,OAAQ,OAAO,EAC/C,MAAM2B,EAA0B,QAAnBC,EAAAL,EAAME,qBAAa,IAAAG,OAAA,EAAAA,EAAEC,QAAQ,aACpCC,EAA0B,QAAnBC,EAAAR,EAAME,qBAAa,IAAAM,OAAA,EAAAA,EAAEF,QAAQ,cAC1C,IAAKC,EAAM,OAAO,EAElB,GAAIH,aAAI,EAAJA,EAAMK,SAAS,iBAAkB,OAAO,EAE5C,MAAMC,EAASX,EAAMY,MAAMD,OAE3B,GAAIN,EAAM,CACT,MAAMQ,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAYX,
|
|
1
|
+
{"version":3,"file":"PlainClipboardExtension.js","sources":["../../../../../src/editor/extensions/plainClipboard/PlainClipboardExtension.ts"],"sourcesContent":["import { Extension } from '@tiptap/core';\nimport {\n\tFragment,\n\tNode as PMNode,\n\tDOMParser as ProseMirrorDOMParser,\n\tSlice,\n} from '@tiptap/pm/model';\nimport { Plugin } from '@tiptap/pm/state';\n\nconst BASIC_MARKS = new Set(['bold', 'italic', 'strike', 'underline', 'code']);\n\nconst TEXTBLOCK_TAGS = new Set([\n\t'P',\n\t'LI',\n\t'H1',\n\t'H2',\n\t'H3',\n\t'H4',\n\t'H5',\n\t'H6',\n\t'TD',\n\t'TH',\n\t'PRE',\n]);\n\n/**\n * Strip only \"rich\" marks (link, textStyle, highlight, etc.) while keeping\n * basic formatting marks (bold, italic, strike, underline, code) that\n * messaging channels can represent.\n */\nfunction stripRichMarks(fragment: Fragment): Fragment {\n\tconst nodes: PMNode[] = [];\n\tfragment.forEach((node) => {\n\t\tif (node.isText) {\n\t\t\tconst kept = node.marks.filter((m) => BASIC_MARKS.has(m.type.name));\n\t\t\tnodes.push(kept.length === node.marks.length ? node : node.mark(kept));\n\t\t} else {\n\t\t\tnodes.push(node.copy(stripRichMarks(node.content)));\n\t\t}\n\t});\n\treturn Fragment.from(nodes);\n}\n\n/**\n * Replace `<br>` elements that sit at block level (not inside a textblock\n * like `<p>`, `<li>`, etc.) with empty `<p></p>` elements. Google Docs\n * puts standalone `<br>` tags between paragraphs to represent blank lines.\n * Without this, ProseMirror parses them as top-level hardBreak nodes.\n */\nfunction cleanBlockBrs(container: HTMLElement): void {\n\tconst brs = Array.from(container.querySelectorAll('br'));\n\tfor (const br of brs) {\n\t\tlet insideTextblock = false;\n\t\tlet el = br.parentElement;\n\t\twhile (el && el !== container) {\n\t\t\tif (TEXTBLOCK_TAGS.has(el.tagName)) {\n\t\t\t\tinsideTextblock = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tel = el.parentElement;\n\t\t}\n\t\tif (!insideTextblock) {\n\t\t\tbr.parentElement!.replaceChild(document.createElement('p'), br);\n\t\t}\n\t}\n}\n\n/**\n * 1. Convert paragraphs containing only a hard_break into empty paragraphs.\n * 2. Collapse consecutive empty paragraphs into one.\n */\nfunction normalizeBlanks(fragment: Fragment): Fragment {\n\tconst nodes: PMNode[] = [];\n\tlet prevEmpty = false;\n\tfragment.forEach((node) => {\n\t\tconst isHardBreakOnly =\n\t\t\tnode.type.name === 'paragraph' &&\n\t\t\tnode.childCount === 1 &&\n\t\t\tnode.firstChild?.type.name === 'hardBreak';\n\t\tif (isHardBreakOnly) {\n\t\t\tif (!prevEmpty) nodes.push(node.type.create(node.attrs));\n\t\t\tprevEmpty = true;\n\t\t\treturn;\n\t\t}\n\t\tconst isEmpty = node.type.name === 'paragraph' && node.childCount === 0;\n\t\tif (isEmpty && prevEmpty) return;\n\t\tprevEmpty = isEmpty;\n\t\tif (node.isBlock && !node.isLeaf) {\n\t\t\tnodes.push(node.copy(normalizeBlanks(node.content)));\n\t\t} else {\n\t\t\tnodes.push(node);\n\t\t}\n\t});\n\treturn Fragment.from(nodes);\n}\n\nexport const PlainClipboardExtension = Extension.create({\n\tname: 'plainClipboard',\n\taddProseMirrorPlugins() {\n\t\treturn [\n\t\t\tnew Plugin({\n\t\t\t\tprops: {\n\t\t\t\t\thandlePaste(_view, event) {\n\t\t\t\t\t\tif (event.clipboardData?.files?.length) return false;\n\t\t\t\t\t\tconst html = event.clipboardData?.getData('text/html');\n\t\t\t\t\t\tconst text = event.clipboardData?.getData('text/plain');\n\t\t\t\t\t\tif (!text) return false;\n\n\t\t\t\t\t\tif (html?.includes('data-pm-slice')) return false;\n\n\t\t\t\t\t\tconst schema = _view.state.schema;\n\n\t\t\t\t\t\tif (html) {\n\t\t\t\t\t\t\tconst container = document.createElement('div');\n\t\t\t\t\t\t\tcontainer.innerHTML = html;\n\t\t\t\t\t\t\t// If the HTML has block elements (p, div, li, etc.) it's\n\t\t\t\t\t\t\t// from a rich source — parse the structure. Otherwise it's\n\t\t\t\t\t\t\t// from a plain input/textarea — fall through to the text\n\t\t\t\t\t\t\t// path which handles \\n vs \\n\\n correctly.\n\t\t\t\t\t\t\tconst hasBlocks = container.querySelector(\n\t\t\t\t\t\t\t\t'p,div,h1,h2,h3,h4,h5,h6,ul,ol,li,blockquote,table,pre',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (hasBlocks) {\n\t\t\t\t\t\t\t\tcleanBlockBrs(container);\n\t\t\t\t\t\t\t\tconst parsed =\n\t\t\t\t\t\t\t\t\tProseMirrorDOMParser.fromSchema(schema).parseSlice(container);\n\t\t\t\t\t\t\t\tconst cleaned = normalizeBlanks(stripRichMarks(parsed.content));\n\t\t\t\t\t\t\t\tconst slice = new Slice(\n\t\t\t\t\t\t\t\t\tcleaned,\n\t\t\t\t\t\t\t\t\tparsed.openStart,\n\t\t\t\t\t\t\t\t\tparsed.openEnd,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t_view.dispatch(_view.state.tr.replaceSelection(slice));\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst paragraphs = text\n\t\t\t\t\t\t\t.split('\\n')\n\t\t\t\t\t\t\t.map((line) =>\n\t\t\t\t\t\t\t\tschema.node('paragraph', null, line ? [schema.text(line)] : []),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\tconst slice = new Slice(Fragment.fromArray(paragraphs), 1, 1);\n\t\t\t\t\t\t_view.dispatch(_view.state.tr.replaceSelection(slice));\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t];\n\t},\n});\n"],"names":["BASIC_MARKS","Set","TEXTBLOCK_TAGS","stripRichMarks","fragment","nodes","forEach","node","isText","kept","marks","filter","m","has","type","name","push","length","mark","copy","content","Fragment","from","normalizeBlanks","prevEmpty","childCount","_a","firstChild","create","attrs","isEmpty","isBlock","isLeaf","PlainClipboardExtension","Extension","addProseMirrorPlugins","Plugin","props","handlePaste","_view","event","_b","clipboardData","files","html","_c","getData","text","_d","includes","schema","state","container","document","createElement","innerHTML","querySelector","brs","Array","querySelectorAll","br","insideTextblock","el","parentElement","tagName","replaceChild","cleanBlockBrs","parsed","ProseMirrorDOMParser","fromSchema","parseSlice","cleaned","slice","Slice","openStart","openEnd","dispatch","tr","replaceSelection","paragraphs","split","map","line","fromArray"],"mappings":"6LASA,MAAMA,EAAc,IAAIC,IAAI,CAAC,OAAQ,SAAU,SAAU,YAAa,SAEhEC,EAAiB,IAAID,IAAI,CAC9B,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QAQD,SAASE,EAAeC,GACvB,MAAMC,EAAkB,GASxB,OARAD,EAASE,SAASC,IACjB,GAAIA,EAAKC,OAAQ,CAChB,MAAMC,EAAOF,EAAKG,MAAMC,QAAQC,GAAMZ,EAAYa,IAAID,EAAEE,KAAKC,QAC7DV,EAAMW,KAAKP,EAAKQ,SAAWV,EAAKG,MAAMO,OAASV,EAAOA,EAAKW,KAAKT,GAChE,MACAJ,EAAMW,KAAKT,EAAKY,KAAKhB,EAAeI,EAAKa,UACzC,IAEKC,EAASC,KAAKjB,EACtB,CA8BA,SAASkB,EAAgBnB,GACxB,MAAMC,EAAkB,GACxB,IAAImB,GAAY,EAoBhB,OAnBApB,EAASE,SAASC,UAKjB,GAHoB,cAAnBA,EAAKO,KAAKC,MACU,IAApBR,EAAKkB,YAC0B,eAAhB,QAAfC,EAAAnB,EAAKoB,kBAAU,IAAAD,OAAA,EAAAA,EAAEZ,KAAKC,MAItB,OAFKS,GAAWnB,EAAMW,KAAKT,EAAKO,KAAKc,OAAOrB,EAAKsB,aACjDL,GAAY,GAGb,MAAMM,EAA6B,cAAnBvB,EAAKO,KAAKC,MAA4C,IAApBR,EAAKkB,WACnDK,GAAWN,IACfA,EAAYM,EACRvB,EAAKwB,UAAYxB,EAAKyB,OACzB3B,EAAMW,KAAKT,EAAKY,KAAKI,EAAgBhB,EAAKa,WAE1Cf,EAAMW,KAAKT,GACX,IAEKc,EAASC,KAAKjB,EACtB,OAEa4B,EAA0BC,EAAUN,OAAO,CACvDb,KAAM,iBACNoB,sBAAqBA,IACb,CACN,IAAIC,EAAO,CACVC,MAAO,CACNC,YAAYC,EAAOC,eAClB,WAAIC,EAAqB,UAArBD,EAAME,qBAAe,IAAAhB,OAAA,EAAAA,EAAAiB,4BAAO1B,OAAQ,OAAO,EAC/C,MAAM2B,EAA0B,QAAnBC,EAAAL,EAAME,qBAAa,IAAAG,OAAA,EAAAA,EAAEC,QAAQ,aACpCC,EAA0B,QAAnBC,EAAAR,EAAME,qBAAa,IAAAM,OAAA,EAAAA,EAAEF,QAAQ,cAC1C,IAAKC,EAAM,OAAO,EAElB,GAAIH,aAAI,EAAJA,EAAMK,SAAS,iBAAkB,OAAO,EAE5C,MAAMC,EAASX,EAAMY,MAAMD,OAE3B,GAAIN,EAAM,CACT,MAAMQ,EAAYC,SAASC,cAAc,OACzCF,EAAUG,UAAYX,EAQtB,GAHkBQ,EAAUI,cAC3B,yDAEc,EAzEtB,SAAuBJ,GACtB,MAAMK,EAAMC,MAAMpC,KAAK8B,EAAUO,iBAAiB,OAClD,IAAK,MAAMC,KAAMH,EAAK,CACrB,IAAII,GAAkB,EAClBC,EAAKF,EAAGG,cACZ,KAAOD,GAAMA,IAAOV,GAAW,CAC9B,GAAIlD,EAAeW,IAAIiD,EAAGE,SAAU,CACnCH,GAAkB,EAClB,KACA,CACDC,EAAKA,EAAGC,aACR,CACIF,GACJD,EAAGG,cAAeE,aAAaZ,SAASC,cAAc,KAAMM,EAE7D,CACF,CA0DQM,CAAcd,GACd,MAAMe,EACLC,EAAqBC,WAAWnB,GAAQoB,WAAWlB,GAC9CmB,EAAUhD,EAAgBpB,EAAegE,EAAO/C,UAChDoD,EAAQ,IAAIC,EACjBF,EACAJ,EAAOO,UACPP,EAAOQ,SAGR,OADApC,EAAMqC,SAASrC,EAAMY,MAAM0B,GAAGC,iBAAiBN,KACxC,CACP,CACD,CAED,MAAMO,EAAahC,EACjBiC,MAAM,MACNC,KAAKC,GACLhC,EAAO3C,KAAK,YAAa,KAAM2E,EAAO,CAAChC,EAAOH,KAAKmC,IAAS,MAExDV,EAAQ,IAAIC,EAAMpD,EAAS8D,UAAUJ,GAAa,EAAG,GAE3D,OADAxC,EAAMqC,SAASrC,EAAMY,MAAM0B,GAAGC,iBAAiBN,KACxC,CACR"}
|