@pixerate/editor 0.4.4 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/index.cjs +1056 -25
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.d.cts +10 -1
- package/dist/extensions/index.d.ts +10 -1
- package/dist/extensions/index.js +1058 -25
- package/dist/extensions/index.js.map +1 -1
- package/dist/index.cjs +1128 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.js +1124 -30
- package/dist/index.js.map +1 -1
- package/dist/serializers/index.cjs +34 -0
- package/dist/serializers/index.cjs.map +1 -1
- package/dist/serializers/index.d.cts +12 -1
- package/dist/serializers/index.d.ts +12 -1
- package/dist/serializers/index.js +22 -0
- package/dist/serializers/index.js.map +1 -1
- package/dist/spreadsheet/index.cjs +18 -0
- package/dist/spreadsheet/index.cjs.map +1 -1
- package/dist/spreadsheet/index.d.cts +1 -0
- package/dist/spreadsheet/index.d.ts +1 -0
- package/dist/spreadsheet/index.js +18 -0
- package/dist/spreadsheet/index.js.map +1 -1
- package/package.json +7 -2
package/dist/extensions/index.js
CHANGED
|
@@ -302,8 +302,8 @@ var TemplateSuggestions = Extension2.create({
|
|
|
302
302
|
});
|
|
303
303
|
|
|
304
304
|
// src/extensions/loading-node.ts
|
|
305
|
-
import { Node, mergeAttributes } from "@tiptap/core";
|
|
306
|
-
var LoadingNode =
|
|
305
|
+
import { Node as Node2, mergeAttributes } from "@tiptap/core";
|
|
306
|
+
var LoadingNode = Node2.create({
|
|
307
307
|
name: "loadingNode",
|
|
308
308
|
group: "inline",
|
|
309
309
|
inline: true,
|
|
@@ -475,7 +475,10 @@ var FontSize = Extension5.create({
|
|
|
475
475
|
});
|
|
476
476
|
|
|
477
477
|
// src/extensions/rich-text-preset.ts
|
|
478
|
-
import {
|
|
478
|
+
import {
|
|
479
|
+
wrappingInputRule,
|
|
480
|
+
markInputRule
|
|
481
|
+
} from "@tiptap/core";
|
|
479
482
|
import * as _StarterKit from "@tiptap/starter-kit";
|
|
480
483
|
import * as _Color from "@tiptap/extension-color";
|
|
481
484
|
import * as _Highlight from "@tiptap/extension-highlight";
|
|
@@ -536,20 +539,1033 @@ function createMentionExtension(options = {}) {
|
|
|
536
539
|
});
|
|
537
540
|
}
|
|
538
541
|
|
|
539
|
-
//
|
|
542
|
+
// ../../node_modules/.pnpm/tiptap-markdown@0.8.10_@tiptap+core@2.27.3_@tiptap+pm@2.27.3_/node_modules/tiptap-markdown/dist/tiptap-markdown.es.js
|
|
543
|
+
import { Extension as Extension6, Mark as Mark2, getHTMLFromFragment, Node as Node$1, extensions } from "@tiptap/core";
|
|
544
|
+
import { MarkdownSerializerState as MarkdownSerializerState$1, defaultMarkdownSerializer } from "prosemirror-markdown";
|
|
545
|
+
import markdownit from "markdown-it";
|
|
546
|
+
import { Fragment, DOMParser } from "@tiptap/pm/model";
|
|
547
|
+
import taskListPlugin from "markdown-it-task-lists";
|
|
548
|
+
import { Plugin as Plugin4, PluginKey } from "@tiptap/pm/state";
|
|
549
|
+
var __defProp = Object.defineProperty;
|
|
550
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
551
|
+
var __publicField = (obj, key, value) => {
|
|
552
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
553
|
+
return value;
|
|
554
|
+
};
|
|
555
|
+
var MarkdownTightLists = Extension6.create({
|
|
556
|
+
name: "markdownTightLists",
|
|
557
|
+
addOptions: () => ({
|
|
558
|
+
tight: true,
|
|
559
|
+
tightClass: "tight",
|
|
560
|
+
listTypes: ["bulletList", "orderedList"]
|
|
561
|
+
}),
|
|
562
|
+
addGlobalAttributes() {
|
|
563
|
+
return [{
|
|
564
|
+
types: this.options.listTypes,
|
|
565
|
+
attributes: {
|
|
566
|
+
tight: {
|
|
567
|
+
default: this.options.tight,
|
|
568
|
+
parseHTML: (element) => element.getAttribute("data-tight") === "true" || !element.querySelector("p"),
|
|
569
|
+
renderHTML: (attributes) => ({
|
|
570
|
+
class: attributes.tight ? this.options.tightClass : null,
|
|
571
|
+
"data-tight": attributes.tight ? "true" : null
|
|
572
|
+
})
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}];
|
|
576
|
+
},
|
|
577
|
+
addCommands() {
|
|
578
|
+
var _this = this;
|
|
579
|
+
return {
|
|
580
|
+
toggleTight: function() {
|
|
581
|
+
let tight = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;
|
|
582
|
+
return (_ref) => {
|
|
583
|
+
let {
|
|
584
|
+
editor,
|
|
585
|
+
commands
|
|
586
|
+
} = _ref;
|
|
587
|
+
function toggleTight(name) {
|
|
588
|
+
if (!editor.isActive(name)) {
|
|
589
|
+
return false;
|
|
590
|
+
}
|
|
591
|
+
const attrs = editor.getAttributes(name);
|
|
592
|
+
return commands.updateAttributes(name, {
|
|
593
|
+
tight: tight !== null && tight !== void 0 ? tight : !(attrs !== null && attrs !== void 0 && attrs.tight)
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
return _this.options.listTypes.some((name) => toggleTight(name));
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
};
|
|
600
|
+
}
|
|
601
|
+
});
|
|
602
|
+
var md = markdownit();
|
|
603
|
+
function scanDelims(text, pos) {
|
|
604
|
+
md.inline.State.prototype.scanDelims.call({
|
|
605
|
+
src: text,
|
|
606
|
+
posMax: text.length
|
|
607
|
+
});
|
|
608
|
+
const state = new md.inline.State(text, null, null, []);
|
|
609
|
+
return state.scanDelims(pos, true);
|
|
610
|
+
}
|
|
611
|
+
function shiftDelim(text, delim, start, offset) {
|
|
612
|
+
let res = text.substring(0, start) + text.substring(start + delim.length);
|
|
613
|
+
res = res.substring(0, start + offset) + delim + res.substring(start + offset);
|
|
614
|
+
return res;
|
|
615
|
+
}
|
|
616
|
+
function trimStart(text, delim, from, to) {
|
|
617
|
+
let pos = from, res = text;
|
|
618
|
+
while (pos < to) {
|
|
619
|
+
if (scanDelims(res, pos).can_open) {
|
|
620
|
+
break;
|
|
621
|
+
}
|
|
622
|
+
res = shiftDelim(res, delim, pos, 1);
|
|
623
|
+
pos++;
|
|
624
|
+
}
|
|
625
|
+
return {
|
|
626
|
+
text: res,
|
|
627
|
+
from: pos,
|
|
628
|
+
to
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
function trimEnd(text, delim, from, to) {
|
|
632
|
+
let pos = to, res = text;
|
|
633
|
+
while (pos > from) {
|
|
634
|
+
if (scanDelims(res, pos).can_close) {
|
|
635
|
+
break;
|
|
636
|
+
}
|
|
637
|
+
res = shiftDelim(res, delim, pos, -1);
|
|
638
|
+
pos--;
|
|
639
|
+
}
|
|
640
|
+
return {
|
|
641
|
+
text: res,
|
|
642
|
+
from,
|
|
643
|
+
to: pos
|
|
644
|
+
};
|
|
645
|
+
}
|
|
646
|
+
function trimInline(text, delim, from, to) {
|
|
647
|
+
let state = {
|
|
648
|
+
text,
|
|
649
|
+
from,
|
|
650
|
+
to
|
|
651
|
+
};
|
|
652
|
+
state = trimStart(state.text, delim, state.from, state.to);
|
|
653
|
+
state = trimEnd(state.text, delim, state.from, state.to);
|
|
654
|
+
if (state.to - state.from < delim.length + 1) {
|
|
655
|
+
state.text = state.text.substring(0, state.from) + state.text.substring(state.to + delim.length);
|
|
656
|
+
}
|
|
657
|
+
return state.text;
|
|
658
|
+
}
|
|
659
|
+
var MarkdownSerializerState = class extends MarkdownSerializerState$1 {
|
|
660
|
+
constructor(nodes, marks, options) {
|
|
661
|
+
super(nodes, marks, options !== null && options !== void 0 ? options : {});
|
|
662
|
+
__publicField(this, "inTable", false);
|
|
663
|
+
this.inlines = [];
|
|
664
|
+
}
|
|
665
|
+
render(node, parent, index) {
|
|
666
|
+
super.render(node, parent, index);
|
|
667
|
+
const top = this.inlines[this.inlines.length - 1];
|
|
668
|
+
if (top !== null && top !== void 0 && top.start && top !== null && top !== void 0 && top.end) {
|
|
669
|
+
const {
|
|
670
|
+
delimiter,
|
|
671
|
+
start,
|
|
672
|
+
end
|
|
673
|
+
} = this.normalizeInline(top);
|
|
674
|
+
this.out = trimInline(this.out, delimiter, start, end);
|
|
675
|
+
this.inlines.pop();
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
markString(mark, open, parent, index) {
|
|
679
|
+
const info = this.marks[mark.type.name];
|
|
680
|
+
if (info.expelEnclosingWhitespace) {
|
|
681
|
+
if (open) {
|
|
682
|
+
this.inlines.push({
|
|
683
|
+
start: this.out.length,
|
|
684
|
+
delimiter: info.open
|
|
685
|
+
});
|
|
686
|
+
} else {
|
|
687
|
+
const top = this.inlines.pop();
|
|
688
|
+
this.inlines.push({
|
|
689
|
+
...top,
|
|
690
|
+
end: this.out.length
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
return super.markString(mark, open, parent, index);
|
|
695
|
+
}
|
|
696
|
+
normalizeInline(inline) {
|
|
697
|
+
let {
|
|
698
|
+
start,
|
|
699
|
+
end
|
|
700
|
+
} = inline;
|
|
701
|
+
while (this.out.charAt(start).match(/\s/)) {
|
|
702
|
+
start++;
|
|
703
|
+
}
|
|
704
|
+
return {
|
|
705
|
+
...inline,
|
|
706
|
+
start
|
|
707
|
+
};
|
|
708
|
+
}
|
|
709
|
+
};
|
|
710
|
+
var HTMLMark = Mark2.create({
|
|
711
|
+
name: "markdownHTMLMark",
|
|
712
|
+
/**
|
|
713
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
714
|
+
*/
|
|
715
|
+
addStorage() {
|
|
716
|
+
return {
|
|
717
|
+
markdown: {
|
|
718
|
+
serialize: {
|
|
719
|
+
open(state, mark) {
|
|
720
|
+
var _getMarkTags$, _getMarkTags;
|
|
721
|
+
if (!this.editor.storage.markdown.options.html) {
|
|
722
|
+
console.warn(`Tiptap Markdown: "${mark.type.name}" mark is only available in html mode`);
|
|
723
|
+
return "";
|
|
724
|
+
}
|
|
725
|
+
return (_getMarkTags$ = (_getMarkTags = getMarkTags(mark)) === null || _getMarkTags === void 0 ? void 0 : _getMarkTags[0]) !== null && _getMarkTags$ !== void 0 ? _getMarkTags$ : "";
|
|
726
|
+
},
|
|
727
|
+
close(state, mark) {
|
|
728
|
+
var _getMarkTags$2, _getMarkTags2;
|
|
729
|
+
if (!this.editor.storage.markdown.options.html) {
|
|
730
|
+
return "";
|
|
731
|
+
}
|
|
732
|
+
return (_getMarkTags$2 = (_getMarkTags2 = getMarkTags(mark)) === null || _getMarkTags2 === void 0 ? void 0 : _getMarkTags2[1]) !== null && _getMarkTags$2 !== void 0 ? _getMarkTags$2 : "";
|
|
733
|
+
}
|
|
734
|
+
},
|
|
735
|
+
parse: {
|
|
736
|
+
// handled by markdown-it
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
};
|
|
740
|
+
}
|
|
741
|
+
});
|
|
742
|
+
function getMarkTags(mark) {
|
|
743
|
+
const schema = mark.type.schema;
|
|
744
|
+
const node = schema.text(" ", [mark]);
|
|
745
|
+
const html = getHTMLFromFragment(Fragment.from(node), schema);
|
|
746
|
+
const match = html.match(/^(<.*?>) (<\/.*?>)$/);
|
|
747
|
+
return match ? [match[1], match[2]] : null;
|
|
748
|
+
}
|
|
749
|
+
function elementFromString(value) {
|
|
750
|
+
const wrappedValue = `<body>${value}</body>`;
|
|
751
|
+
return new window.DOMParser().parseFromString(wrappedValue, "text/html").body;
|
|
752
|
+
}
|
|
753
|
+
function escapeHTML(value) {
|
|
754
|
+
return value === null || value === void 0 ? void 0 : value.replace(/</g, "<").replace(/>/g, ">");
|
|
755
|
+
}
|
|
756
|
+
function extractElement(node) {
|
|
757
|
+
const parent = node.parentElement;
|
|
758
|
+
const prepend = parent.cloneNode();
|
|
759
|
+
while (parent.firstChild && parent.firstChild !== node) {
|
|
760
|
+
prepend.appendChild(parent.firstChild);
|
|
761
|
+
}
|
|
762
|
+
if (prepend.childNodes.length > 0) {
|
|
763
|
+
parent.parentElement.insertBefore(prepend, parent);
|
|
764
|
+
}
|
|
765
|
+
parent.parentElement.insertBefore(node, parent);
|
|
766
|
+
if (parent.childNodes.length === 0) {
|
|
767
|
+
parent.remove();
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
function unwrapElement(node) {
|
|
771
|
+
const parent = node.parentNode;
|
|
772
|
+
while (node.firstChild)
|
|
773
|
+
parent.insertBefore(node.firstChild, node);
|
|
774
|
+
parent.removeChild(node);
|
|
775
|
+
}
|
|
776
|
+
var HTMLNode = Node$1.create({
|
|
777
|
+
name: "markdownHTMLNode",
|
|
778
|
+
addStorage() {
|
|
779
|
+
return {
|
|
780
|
+
markdown: {
|
|
781
|
+
serialize(state, node, parent) {
|
|
782
|
+
if (this.editor.storage.markdown.options.html) {
|
|
783
|
+
state.write(serializeHTML(node, parent));
|
|
784
|
+
} else {
|
|
785
|
+
console.warn(`Tiptap Markdown: "${node.type.name}" node is only available in html mode`);
|
|
786
|
+
state.write(`[${node.type.name}]`);
|
|
787
|
+
}
|
|
788
|
+
if (node.isBlock) {
|
|
789
|
+
state.closeBlock(node);
|
|
790
|
+
}
|
|
791
|
+
},
|
|
792
|
+
parse: {
|
|
793
|
+
// handled by markdown-it
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
};
|
|
797
|
+
}
|
|
798
|
+
});
|
|
799
|
+
function serializeHTML(node, parent) {
|
|
800
|
+
const schema = node.type.schema;
|
|
801
|
+
const html = getHTMLFromFragment(Fragment.from(node), schema);
|
|
802
|
+
if (node.isBlock && (parent instanceof Fragment || parent.type.name === schema.topNodeType.name)) {
|
|
803
|
+
return formatBlock(html);
|
|
804
|
+
}
|
|
805
|
+
return html;
|
|
806
|
+
}
|
|
807
|
+
function formatBlock(html) {
|
|
808
|
+
const dom = elementFromString(html);
|
|
809
|
+
const element = dom.firstElementChild;
|
|
810
|
+
element.innerHTML = element.innerHTML.trim() ? `
|
|
811
|
+
${element.innerHTML}
|
|
812
|
+
` : `
|
|
813
|
+
`;
|
|
814
|
+
return element.outerHTML;
|
|
815
|
+
}
|
|
816
|
+
var Blockquote = Node$1.create({
|
|
817
|
+
name: "blockquote"
|
|
818
|
+
});
|
|
819
|
+
var Blockquote$1 = Blockquote.extend({
|
|
820
|
+
/**
|
|
821
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
822
|
+
*/
|
|
823
|
+
addStorage() {
|
|
824
|
+
return {
|
|
825
|
+
markdown: {
|
|
826
|
+
serialize: defaultMarkdownSerializer.nodes.blockquote,
|
|
827
|
+
parse: {
|
|
828
|
+
// handled by markdown-it
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
});
|
|
834
|
+
var BulletList = Node$1.create({
|
|
835
|
+
name: "bulletList"
|
|
836
|
+
});
|
|
837
|
+
var BulletList$1 = BulletList.extend({
|
|
838
|
+
/**
|
|
839
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
840
|
+
*/
|
|
841
|
+
addStorage() {
|
|
842
|
+
return {
|
|
843
|
+
markdown: {
|
|
844
|
+
serialize(state, node) {
|
|
845
|
+
return state.renderList(node, " ", () => (this.editor.storage.markdown.options.bulletListMarker || "-") + " ");
|
|
846
|
+
},
|
|
847
|
+
parse: {
|
|
848
|
+
// handled by markdown-it
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
};
|
|
852
|
+
}
|
|
853
|
+
});
|
|
854
|
+
var CodeBlock = Node$1.create({
|
|
855
|
+
name: "codeBlock"
|
|
856
|
+
});
|
|
857
|
+
var CodeBlock$1 = CodeBlock.extend({
|
|
858
|
+
/**
|
|
859
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
860
|
+
*/
|
|
861
|
+
addStorage() {
|
|
862
|
+
return {
|
|
863
|
+
markdown: {
|
|
864
|
+
serialize(state, node) {
|
|
865
|
+
state.write("```" + (node.attrs.language || "") + "\n");
|
|
866
|
+
state.text(node.textContent, false);
|
|
867
|
+
state.ensureNewLine();
|
|
868
|
+
state.write("```");
|
|
869
|
+
state.closeBlock(node);
|
|
870
|
+
},
|
|
871
|
+
parse: {
|
|
872
|
+
setup(markdownit2) {
|
|
873
|
+
var _this$options$languag;
|
|
874
|
+
markdownit2.set({
|
|
875
|
+
langPrefix: (_this$options$languag = this.options.languageClassPrefix) !== null && _this$options$languag !== void 0 ? _this$options$languag : "language-"
|
|
876
|
+
});
|
|
877
|
+
},
|
|
878
|
+
updateDOM(element) {
|
|
879
|
+
element.innerHTML = element.innerHTML.replace(/\n<\/code><\/pre>/g, "</code></pre>");
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
};
|
|
884
|
+
}
|
|
885
|
+
});
|
|
886
|
+
var HardBreak = Node$1.create({
|
|
887
|
+
name: "hardBreak"
|
|
888
|
+
});
|
|
889
|
+
var HardBreak$1 = HardBreak.extend({
|
|
890
|
+
/**
|
|
891
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
892
|
+
*/
|
|
893
|
+
addStorage() {
|
|
894
|
+
return {
|
|
895
|
+
markdown: {
|
|
896
|
+
serialize(state, node, parent, index) {
|
|
897
|
+
for (let i = index + 1; i < parent.childCount; i++)
|
|
898
|
+
if (parent.child(i).type != node.type) {
|
|
899
|
+
state.write(state.inTable ? HTMLNode.storage.markdown.serialize.call(this, state, node, parent) : "\\\n");
|
|
900
|
+
return;
|
|
901
|
+
}
|
|
902
|
+
},
|
|
903
|
+
parse: {
|
|
904
|
+
// handled by markdown-it
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
};
|
|
908
|
+
}
|
|
909
|
+
});
|
|
910
|
+
var Heading = Node$1.create({
|
|
911
|
+
name: "heading"
|
|
912
|
+
});
|
|
913
|
+
var Heading$1 = Heading.extend({
|
|
914
|
+
/**
|
|
915
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
916
|
+
*/
|
|
917
|
+
addStorage() {
|
|
918
|
+
return {
|
|
919
|
+
markdown: {
|
|
920
|
+
serialize: defaultMarkdownSerializer.nodes.heading,
|
|
921
|
+
parse: {
|
|
922
|
+
// handled by markdown-it
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
};
|
|
926
|
+
}
|
|
927
|
+
});
|
|
928
|
+
var HorizontalRule = Node$1.create({
|
|
929
|
+
name: "horizontalRule"
|
|
930
|
+
});
|
|
931
|
+
var HorizontalRule$1 = HorizontalRule.extend({
|
|
932
|
+
/**
|
|
933
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
934
|
+
*/
|
|
935
|
+
addStorage() {
|
|
936
|
+
return {
|
|
937
|
+
markdown: {
|
|
938
|
+
serialize: defaultMarkdownSerializer.nodes.horizontal_rule,
|
|
939
|
+
parse: {
|
|
940
|
+
// handled by markdown-it
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
};
|
|
944
|
+
}
|
|
945
|
+
});
|
|
946
|
+
var Image = Node$1.create({
|
|
947
|
+
name: "image"
|
|
948
|
+
});
|
|
949
|
+
var Image$1 = Image.extend({
|
|
950
|
+
/**
|
|
951
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
952
|
+
*/
|
|
953
|
+
addStorage() {
|
|
954
|
+
return {
|
|
955
|
+
markdown: {
|
|
956
|
+
serialize: defaultMarkdownSerializer.nodes.image,
|
|
957
|
+
parse: {
|
|
958
|
+
// handled by markdown-it
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
};
|
|
962
|
+
}
|
|
963
|
+
});
|
|
964
|
+
var ListItem = Node$1.create({
|
|
965
|
+
name: "listItem"
|
|
966
|
+
});
|
|
967
|
+
var ListItem$1 = ListItem.extend({
|
|
968
|
+
/**
|
|
969
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
970
|
+
*/
|
|
971
|
+
addStorage() {
|
|
972
|
+
return {
|
|
973
|
+
markdown: {
|
|
974
|
+
serialize: defaultMarkdownSerializer.nodes.list_item,
|
|
975
|
+
parse: {
|
|
976
|
+
// handled by markdown-it
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
};
|
|
980
|
+
}
|
|
981
|
+
});
|
|
982
|
+
var OrderedList = Node$1.create({
|
|
983
|
+
name: "orderedList"
|
|
984
|
+
});
|
|
985
|
+
function findIndexOfAdjacentNode(node, parent, index) {
|
|
986
|
+
let i = 0;
|
|
987
|
+
for (; index - i > 0; i++) {
|
|
988
|
+
if (parent.child(index - i - 1).type.name !== node.type.name) {
|
|
989
|
+
break;
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
return i;
|
|
993
|
+
}
|
|
994
|
+
var OrderedList$1 = OrderedList.extend({
|
|
995
|
+
/**
|
|
996
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
997
|
+
*/
|
|
998
|
+
addStorage() {
|
|
999
|
+
return {
|
|
1000
|
+
markdown: {
|
|
1001
|
+
serialize(state, node, parent, index) {
|
|
1002
|
+
const start = node.attrs.start || 1;
|
|
1003
|
+
const maxW = String(start + node.childCount - 1).length;
|
|
1004
|
+
const space = state.repeat(" ", maxW + 2);
|
|
1005
|
+
const adjacentIndex = findIndexOfAdjacentNode(node, parent, index);
|
|
1006
|
+
const separator = adjacentIndex % 2 ? ") " : ". ";
|
|
1007
|
+
state.renderList(node, space, (i) => {
|
|
1008
|
+
const nStr = String(start + i);
|
|
1009
|
+
return state.repeat(" ", maxW - nStr.length) + nStr + separator;
|
|
1010
|
+
});
|
|
1011
|
+
},
|
|
1012
|
+
parse: {
|
|
1013
|
+
// handled by markdown-it
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
};
|
|
1017
|
+
}
|
|
1018
|
+
});
|
|
1019
|
+
var Paragraph = Node$1.create({
|
|
1020
|
+
name: "paragraph"
|
|
1021
|
+
});
|
|
1022
|
+
var Paragraph$1 = Paragraph.extend({
|
|
1023
|
+
/**
|
|
1024
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1025
|
+
*/
|
|
1026
|
+
addStorage() {
|
|
1027
|
+
return {
|
|
1028
|
+
markdown: {
|
|
1029
|
+
serialize: defaultMarkdownSerializer.nodes.paragraph,
|
|
1030
|
+
parse: {
|
|
1031
|
+
// handled by markdown-it
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
};
|
|
1035
|
+
}
|
|
1036
|
+
});
|
|
1037
|
+
function childNodes(node) {
|
|
1038
|
+
var _node$content$content, _node$content;
|
|
1039
|
+
return (_node$content$content = node === null || node === void 0 || (_node$content = node.content) === null || _node$content === void 0 ? void 0 : _node$content.content) !== null && _node$content$content !== void 0 ? _node$content$content : [];
|
|
1040
|
+
}
|
|
1041
|
+
var Table = Node$1.create({
|
|
1042
|
+
name: "table"
|
|
1043
|
+
});
|
|
1044
|
+
var Table$1 = Table.extend({
|
|
1045
|
+
/**
|
|
1046
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1047
|
+
*/
|
|
1048
|
+
addStorage() {
|
|
1049
|
+
return {
|
|
1050
|
+
markdown: {
|
|
1051
|
+
serialize(state, node, parent) {
|
|
1052
|
+
if (!isMarkdownSerializable(node)) {
|
|
1053
|
+
HTMLNode.storage.markdown.serialize.call(this, state, node, parent);
|
|
1054
|
+
return;
|
|
1055
|
+
}
|
|
1056
|
+
state.inTable = true;
|
|
1057
|
+
node.forEach((row, p, i) => {
|
|
1058
|
+
state.write("| ");
|
|
1059
|
+
row.forEach((col, p2, j) => {
|
|
1060
|
+
if (j) {
|
|
1061
|
+
state.write(" | ");
|
|
1062
|
+
}
|
|
1063
|
+
const cellContent = col.firstChild;
|
|
1064
|
+
if (cellContent.textContent.trim()) {
|
|
1065
|
+
state.renderInline(cellContent);
|
|
1066
|
+
}
|
|
1067
|
+
});
|
|
1068
|
+
state.write(" |");
|
|
1069
|
+
state.ensureNewLine();
|
|
1070
|
+
if (!i) {
|
|
1071
|
+
const delimiterRow = Array.from({
|
|
1072
|
+
length: row.childCount
|
|
1073
|
+
}).map(() => "---").join(" | ");
|
|
1074
|
+
state.write(`| ${delimiterRow} |`);
|
|
1075
|
+
state.ensureNewLine();
|
|
1076
|
+
}
|
|
1077
|
+
});
|
|
1078
|
+
state.closeBlock(node);
|
|
1079
|
+
state.inTable = false;
|
|
1080
|
+
},
|
|
1081
|
+
parse: {
|
|
1082
|
+
// handled by markdown-it
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
};
|
|
1086
|
+
}
|
|
1087
|
+
});
|
|
1088
|
+
function hasSpan(node) {
|
|
1089
|
+
return node.attrs.colspan > 1 || node.attrs.rowspan > 1;
|
|
1090
|
+
}
|
|
1091
|
+
function isMarkdownSerializable(node) {
|
|
1092
|
+
const rows = childNodes(node);
|
|
1093
|
+
const firstRow = rows[0];
|
|
1094
|
+
const bodyRows = rows.slice(1);
|
|
1095
|
+
if (childNodes(firstRow).some((cell) => cell.type.name !== "tableHeader" || hasSpan(cell) || cell.childCount > 1)) {
|
|
1096
|
+
return false;
|
|
1097
|
+
}
|
|
1098
|
+
if (bodyRows.some((row) => childNodes(row).some((cell) => cell.type.name === "tableHeader" || hasSpan(cell) || cell.childCount > 1))) {
|
|
1099
|
+
return false;
|
|
1100
|
+
}
|
|
1101
|
+
return true;
|
|
1102
|
+
}
|
|
1103
|
+
var TaskItem = Node$1.create({
|
|
1104
|
+
name: "taskItem"
|
|
1105
|
+
});
|
|
1106
|
+
var TaskItem$1 = TaskItem.extend({
|
|
1107
|
+
/**
|
|
1108
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1109
|
+
*/
|
|
1110
|
+
addStorage() {
|
|
1111
|
+
return {
|
|
1112
|
+
markdown: {
|
|
1113
|
+
serialize(state, node) {
|
|
1114
|
+
const check = node.attrs.checked ? "[x]" : "[ ]";
|
|
1115
|
+
state.write(`${check} `);
|
|
1116
|
+
state.renderContent(node);
|
|
1117
|
+
},
|
|
1118
|
+
parse: {
|
|
1119
|
+
updateDOM(element) {
|
|
1120
|
+
[...element.querySelectorAll(".task-list-item")].forEach((item) => {
|
|
1121
|
+
const input = item.querySelector("input");
|
|
1122
|
+
item.setAttribute("data-type", "taskItem");
|
|
1123
|
+
if (input) {
|
|
1124
|
+
item.setAttribute("data-checked", input.checked);
|
|
1125
|
+
input.remove();
|
|
1126
|
+
}
|
|
1127
|
+
});
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
};
|
|
1132
|
+
}
|
|
1133
|
+
});
|
|
1134
|
+
var TaskList = Node$1.create({
|
|
1135
|
+
name: "taskList"
|
|
1136
|
+
});
|
|
1137
|
+
var TaskList$1 = TaskList.extend({
|
|
1138
|
+
/**
|
|
1139
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1140
|
+
*/
|
|
1141
|
+
addStorage() {
|
|
1142
|
+
return {
|
|
1143
|
+
markdown: {
|
|
1144
|
+
serialize: BulletList$1.storage.markdown.serialize,
|
|
1145
|
+
parse: {
|
|
1146
|
+
setup(markdownit2) {
|
|
1147
|
+
markdownit2.use(taskListPlugin);
|
|
1148
|
+
},
|
|
1149
|
+
updateDOM(element) {
|
|
1150
|
+
[...element.querySelectorAll(".contains-task-list")].forEach((list) => {
|
|
1151
|
+
list.setAttribute("data-type", "taskList");
|
|
1152
|
+
});
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
};
|
|
1157
|
+
}
|
|
1158
|
+
});
|
|
1159
|
+
var Text = Node$1.create({
|
|
1160
|
+
name: "text"
|
|
1161
|
+
});
|
|
1162
|
+
var Text$1 = Text.extend({
|
|
1163
|
+
/**
|
|
1164
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1165
|
+
*/
|
|
1166
|
+
addStorage() {
|
|
1167
|
+
return {
|
|
1168
|
+
markdown: {
|
|
1169
|
+
serialize(state, node) {
|
|
1170
|
+
state.text(escapeHTML(node.text));
|
|
1171
|
+
},
|
|
1172
|
+
parse: {
|
|
1173
|
+
// handled by markdown-it
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
};
|
|
1177
|
+
}
|
|
1178
|
+
});
|
|
1179
|
+
var Bold = Mark2.create({
|
|
1180
|
+
name: "bold"
|
|
1181
|
+
});
|
|
1182
|
+
var Bold$1 = Bold.extend({
|
|
1183
|
+
/**
|
|
1184
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1185
|
+
*/
|
|
1186
|
+
addStorage() {
|
|
1187
|
+
return {
|
|
1188
|
+
markdown: {
|
|
1189
|
+
serialize: defaultMarkdownSerializer.marks.strong,
|
|
1190
|
+
parse: {
|
|
1191
|
+
// handled by markdown-it
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
};
|
|
1195
|
+
}
|
|
1196
|
+
});
|
|
1197
|
+
var Code = Mark2.create({
|
|
1198
|
+
name: "code"
|
|
1199
|
+
});
|
|
1200
|
+
var Code$1 = Code.extend({
|
|
1201
|
+
/**
|
|
1202
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1203
|
+
*/
|
|
1204
|
+
addStorage() {
|
|
1205
|
+
return {
|
|
1206
|
+
markdown: {
|
|
1207
|
+
serialize: defaultMarkdownSerializer.marks.code,
|
|
1208
|
+
parse: {
|
|
1209
|
+
// handled by markdown-it
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
};
|
|
1213
|
+
}
|
|
1214
|
+
});
|
|
1215
|
+
var Italic = Mark2.create({
|
|
1216
|
+
name: "italic"
|
|
1217
|
+
});
|
|
1218
|
+
var Italic$1 = Italic.extend({
|
|
1219
|
+
/**
|
|
1220
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1221
|
+
*/
|
|
1222
|
+
addStorage() {
|
|
1223
|
+
return {
|
|
1224
|
+
markdown: {
|
|
1225
|
+
serialize: defaultMarkdownSerializer.marks.em,
|
|
1226
|
+
parse: {
|
|
1227
|
+
// handled by markdown-it
|
|
1228
|
+
}
|
|
1229
|
+
}
|
|
1230
|
+
};
|
|
1231
|
+
}
|
|
1232
|
+
});
|
|
1233
|
+
var Link = Mark2.create({
|
|
1234
|
+
name: "link"
|
|
1235
|
+
});
|
|
1236
|
+
var Link$1 = Link.extend({
|
|
1237
|
+
/**
|
|
1238
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1239
|
+
*/
|
|
1240
|
+
addStorage() {
|
|
1241
|
+
return {
|
|
1242
|
+
markdown: {
|
|
1243
|
+
serialize: defaultMarkdownSerializer.marks.link,
|
|
1244
|
+
parse: {
|
|
1245
|
+
// handled by markdown-it
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
};
|
|
1249
|
+
}
|
|
1250
|
+
});
|
|
1251
|
+
var Strike = Mark2.create({
|
|
1252
|
+
name: "strike"
|
|
1253
|
+
});
|
|
1254
|
+
var Strike$1 = Strike.extend({
|
|
1255
|
+
/**
|
|
1256
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1257
|
+
*/
|
|
1258
|
+
addStorage() {
|
|
1259
|
+
return {
|
|
1260
|
+
markdown: {
|
|
1261
|
+
serialize: {
|
|
1262
|
+
open: "~~",
|
|
1263
|
+
close: "~~",
|
|
1264
|
+
expelEnclosingWhitespace: true
|
|
1265
|
+
},
|
|
1266
|
+
parse: {
|
|
1267
|
+
// handled by markdown-it
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
};
|
|
1271
|
+
}
|
|
1272
|
+
});
|
|
1273
|
+
var markdownExtensions = [Blockquote$1, BulletList$1, CodeBlock$1, HardBreak$1, Heading$1, HorizontalRule$1, HTMLNode, Image$1, ListItem$1, OrderedList$1, Paragraph$1, Table$1, TaskItem$1, TaskList$1, Text$1, Bold$1, Code$1, HTMLMark, Italic$1, Link$1, Strike$1];
|
|
1274
|
+
function getMarkdownSpec(extension) {
|
|
1275
|
+
var _extension$storage, _markdownExtensions$f;
|
|
1276
|
+
const markdownSpec = (_extension$storage = extension.storage) === null || _extension$storage === void 0 ? void 0 : _extension$storage.markdown;
|
|
1277
|
+
const defaultMarkdownSpec = (_markdownExtensions$f = markdownExtensions.find((e) => e.name === extension.name)) === null || _markdownExtensions$f === void 0 ? void 0 : _markdownExtensions$f.storage.markdown;
|
|
1278
|
+
if (markdownSpec || defaultMarkdownSpec) {
|
|
1279
|
+
return {
|
|
1280
|
+
...defaultMarkdownSpec,
|
|
1281
|
+
...markdownSpec
|
|
1282
|
+
};
|
|
1283
|
+
}
|
|
1284
|
+
return null;
|
|
1285
|
+
}
|
|
1286
|
+
var MarkdownSerializer = class {
|
|
1287
|
+
constructor(editor) {
|
|
1288
|
+
__publicField(this, "editor", null);
|
|
1289
|
+
this.editor = editor;
|
|
1290
|
+
}
|
|
1291
|
+
serialize(content) {
|
|
1292
|
+
const state = new MarkdownSerializerState(this.nodes, this.marks, {
|
|
1293
|
+
hardBreakNodeName: HardBreak$1.name
|
|
1294
|
+
});
|
|
1295
|
+
state.renderContent(content);
|
|
1296
|
+
return state.out;
|
|
1297
|
+
}
|
|
1298
|
+
get nodes() {
|
|
1299
|
+
var _this$editor$extensio;
|
|
1300
|
+
return {
|
|
1301
|
+
...Object.fromEntries(Object.keys(this.editor.schema.nodes).map((name) => [name, this.serializeNode(HTMLNode)])),
|
|
1302
|
+
...Object.fromEntries((_this$editor$extensio = this.editor.extensionManager.extensions.filter((extension) => extension.type === "node" && this.serializeNode(extension)).map((extension) => [extension.name, this.serializeNode(extension)])) !== null && _this$editor$extensio !== void 0 ? _this$editor$extensio : [])
|
|
1303
|
+
};
|
|
1304
|
+
}
|
|
1305
|
+
get marks() {
|
|
1306
|
+
var _this$editor$extensio2;
|
|
1307
|
+
return {
|
|
1308
|
+
...Object.fromEntries(Object.keys(this.editor.schema.marks).map((name) => [name, this.serializeMark(HTMLMark)])),
|
|
1309
|
+
...Object.fromEntries((_this$editor$extensio2 = this.editor.extensionManager.extensions.filter((extension) => extension.type === "mark" && this.serializeMark(extension)).map((extension) => [extension.name, this.serializeMark(extension)])) !== null && _this$editor$extensio2 !== void 0 ? _this$editor$extensio2 : [])
|
|
1310
|
+
};
|
|
1311
|
+
}
|
|
1312
|
+
serializeNode(node) {
|
|
1313
|
+
var _getMarkdownSpec;
|
|
1314
|
+
return (_getMarkdownSpec = getMarkdownSpec(node)) === null || _getMarkdownSpec === void 0 || (_getMarkdownSpec = _getMarkdownSpec.serialize) === null || _getMarkdownSpec === void 0 ? void 0 : _getMarkdownSpec.bind({
|
|
1315
|
+
editor: this.editor,
|
|
1316
|
+
options: node.options
|
|
1317
|
+
});
|
|
1318
|
+
}
|
|
1319
|
+
serializeMark(mark) {
|
|
1320
|
+
var _getMarkdownSpec2;
|
|
1321
|
+
const serialize = (_getMarkdownSpec2 = getMarkdownSpec(mark)) === null || _getMarkdownSpec2 === void 0 ? void 0 : _getMarkdownSpec2.serialize;
|
|
1322
|
+
return serialize ? {
|
|
1323
|
+
...serialize,
|
|
1324
|
+
open: typeof serialize.open === "function" ? serialize.open.bind({
|
|
1325
|
+
editor: this.editor,
|
|
1326
|
+
options: mark.options
|
|
1327
|
+
}) : serialize.open,
|
|
1328
|
+
close: typeof serialize.close === "function" ? serialize.close.bind({
|
|
1329
|
+
editor: this.editor,
|
|
1330
|
+
options: mark.options
|
|
1331
|
+
}) : serialize.close
|
|
1332
|
+
} : null;
|
|
1333
|
+
}
|
|
1334
|
+
};
|
|
1335
|
+
var MarkdownParser = class {
|
|
1336
|
+
constructor(editor, _ref) {
|
|
1337
|
+
__publicField(this, "editor", null);
|
|
1338
|
+
__publicField(this, "md", null);
|
|
1339
|
+
let {
|
|
1340
|
+
html,
|
|
1341
|
+
linkify,
|
|
1342
|
+
breaks
|
|
1343
|
+
} = _ref;
|
|
1344
|
+
this.editor = editor;
|
|
1345
|
+
this.md = this.withPatchedRenderer(markdownit({
|
|
1346
|
+
html,
|
|
1347
|
+
linkify,
|
|
1348
|
+
breaks
|
|
1349
|
+
}));
|
|
1350
|
+
}
|
|
1351
|
+
parse(content) {
|
|
1352
|
+
let {
|
|
1353
|
+
inline
|
|
1354
|
+
} = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
1355
|
+
if (typeof content === "string") {
|
|
1356
|
+
this.editor.extensionManager.extensions.forEach((extension) => {
|
|
1357
|
+
var _getMarkdownSpec;
|
|
1358
|
+
return (_getMarkdownSpec = getMarkdownSpec(extension)) === null || _getMarkdownSpec === void 0 || (_getMarkdownSpec = _getMarkdownSpec.parse) === null || _getMarkdownSpec === void 0 || (_getMarkdownSpec = _getMarkdownSpec.setup) === null || _getMarkdownSpec === void 0 ? void 0 : _getMarkdownSpec.call({
|
|
1359
|
+
editor: this.editor,
|
|
1360
|
+
options: extension.options
|
|
1361
|
+
}, this.md);
|
|
1362
|
+
});
|
|
1363
|
+
const renderedHTML = this.md.render(content);
|
|
1364
|
+
const element = elementFromString(renderedHTML);
|
|
1365
|
+
this.editor.extensionManager.extensions.forEach((extension) => {
|
|
1366
|
+
var _getMarkdownSpec2;
|
|
1367
|
+
return (_getMarkdownSpec2 = getMarkdownSpec(extension)) === null || _getMarkdownSpec2 === void 0 || (_getMarkdownSpec2 = _getMarkdownSpec2.parse) === null || _getMarkdownSpec2 === void 0 || (_getMarkdownSpec2 = _getMarkdownSpec2.updateDOM) === null || _getMarkdownSpec2 === void 0 ? void 0 : _getMarkdownSpec2.call({
|
|
1368
|
+
editor: this.editor,
|
|
1369
|
+
options: extension.options
|
|
1370
|
+
}, element);
|
|
1371
|
+
});
|
|
1372
|
+
this.normalizeDOM(element, {
|
|
1373
|
+
inline,
|
|
1374
|
+
content
|
|
1375
|
+
});
|
|
1376
|
+
return element.innerHTML;
|
|
1377
|
+
}
|
|
1378
|
+
return content;
|
|
1379
|
+
}
|
|
1380
|
+
normalizeDOM(node, _ref2) {
|
|
1381
|
+
let {
|
|
1382
|
+
inline,
|
|
1383
|
+
content
|
|
1384
|
+
} = _ref2;
|
|
1385
|
+
this.normalizeBlocks(node);
|
|
1386
|
+
node.querySelectorAll("*").forEach((el) => {
|
|
1387
|
+
var _el$nextSibling;
|
|
1388
|
+
if (((_el$nextSibling = el.nextSibling) === null || _el$nextSibling === void 0 ? void 0 : _el$nextSibling.nodeType) === Node.TEXT_NODE && !el.closest("pre")) {
|
|
1389
|
+
el.nextSibling.textContent = el.nextSibling.textContent.replace(/^\n/, "");
|
|
1390
|
+
}
|
|
1391
|
+
});
|
|
1392
|
+
if (inline) {
|
|
1393
|
+
this.normalizeInline(node, content);
|
|
1394
|
+
}
|
|
1395
|
+
return node;
|
|
1396
|
+
}
|
|
1397
|
+
normalizeBlocks(node) {
|
|
1398
|
+
const blocks = Object.values(this.editor.schema.nodes).filter((node2) => node2.isBlock);
|
|
1399
|
+
const selector = blocks.map((block) => {
|
|
1400
|
+
var _block$spec$parseDOM;
|
|
1401
|
+
return (_block$spec$parseDOM = block.spec.parseDOM) === null || _block$spec$parseDOM === void 0 ? void 0 : _block$spec$parseDOM.map((spec) => spec.tag);
|
|
1402
|
+
}).flat().filter(Boolean).join(",");
|
|
1403
|
+
if (!selector) {
|
|
1404
|
+
return;
|
|
1405
|
+
}
|
|
1406
|
+
[...node.querySelectorAll(selector)].forEach((el) => {
|
|
1407
|
+
if (el.parentElement.matches("p")) {
|
|
1408
|
+
extractElement(el);
|
|
1409
|
+
}
|
|
1410
|
+
});
|
|
1411
|
+
}
|
|
1412
|
+
normalizeInline(node, content) {
|
|
1413
|
+
var _node$firstElementChi;
|
|
1414
|
+
if ((_node$firstElementChi = node.firstElementChild) !== null && _node$firstElementChi !== void 0 && _node$firstElementChi.matches("p")) {
|
|
1415
|
+
var _content$match$, _content$match, _content$match$2, _content$match2;
|
|
1416
|
+
const firstParagraph = node.firstElementChild;
|
|
1417
|
+
const {
|
|
1418
|
+
nextElementSibling
|
|
1419
|
+
} = firstParagraph;
|
|
1420
|
+
const startSpaces = (_content$match$ = (_content$match = content.match(/^\s+/)) === null || _content$match === void 0 ? void 0 : _content$match[0]) !== null && _content$match$ !== void 0 ? _content$match$ : "";
|
|
1421
|
+
const endSpaces = !nextElementSibling ? (_content$match$2 = (_content$match2 = content.match(/\s+$/)) === null || _content$match2 === void 0 ? void 0 : _content$match2[0]) !== null && _content$match$2 !== void 0 ? _content$match$2 : "" : "";
|
|
1422
|
+
if (content.match(/^\n\n/)) {
|
|
1423
|
+
firstParagraph.innerHTML = `${firstParagraph.innerHTML}${endSpaces}`;
|
|
1424
|
+
return;
|
|
1425
|
+
}
|
|
1426
|
+
unwrapElement(firstParagraph);
|
|
1427
|
+
node.innerHTML = `${startSpaces}${node.innerHTML}${endSpaces}`;
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
/**
|
|
1431
|
+
* @param {markdownit} md
|
|
1432
|
+
*/
|
|
1433
|
+
withPatchedRenderer(md2) {
|
|
1434
|
+
const withoutNewLine = (renderer) => function() {
|
|
1435
|
+
const rendered = renderer(...arguments);
|
|
1436
|
+
if (rendered === "\n") {
|
|
1437
|
+
return rendered;
|
|
1438
|
+
}
|
|
1439
|
+
if (rendered[rendered.length - 1] === "\n") {
|
|
1440
|
+
return rendered.slice(0, -1);
|
|
1441
|
+
}
|
|
1442
|
+
return rendered;
|
|
1443
|
+
};
|
|
1444
|
+
md2.renderer.rules.hardbreak = withoutNewLine(md2.renderer.rules.hardbreak);
|
|
1445
|
+
md2.renderer.rules.softbreak = withoutNewLine(md2.renderer.rules.softbreak);
|
|
1446
|
+
md2.renderer.rules.fence = withoutNewLine(md2.renderer.rules.fence);
|
|
1447
|
+
md2.renderer.rules.code_block = withoutNewLine(md2.renderer.rules.code_block);
|
|
1448
|
+
md2.renderer.renderToken = withoutNewLine(md2.renderer.renderToken.bind(md2.renderer));
|
|
1449
|
+
return md2;
|
|
1450
|
+
}
|
|
1451
|
+
};
|
|
1452
|
+
var MarkdownClipboard = Extension6.create({
|
|
1453
|
+
name: "markdownClipboard",
|
|
1454
|
+
addOptions() {
|
|
1455
|
+
return {
|
|
1456
|
+
transformPastedText: false,
|
|
1457
|
+
transformCopiedText: false
|
|
1458
|
+
};
|
|
1459
|
+
},
|
|
1460
|
+
addProseMirrorPlugins() {
|
|
1461
|
+
return [new Plugin4({
|
|
1462
|
+
key: new PluginKey("markdownClipboard"),
|
|
1463
|
+
props: {
|
|
1464
|
+
clipboardTextParser: (text, context, plainText) => {
|
|
1465
|
+
if (plainText || !this.options.transformPastedText) {
|
|
1466
|
+
return null;
|
|
1467
|
+
}
|
|
1468
|
+
const parsed = this.editor.storage.markdown.parser.parse(text, {
|
|
1469
|
+
inline: true
|
|
1470
|
+
});
|
|
1471
|
+
return DOMParser.fromSchema(this.editor.schema).parseSlice(elementFromString(parsed), {
|
|
1472
|
+
preserveWhitespace: true,
|
|
1473
|
+
context
|
|
1474
|
+
});
|
|
1475
|
+
},
|
|
1476
|
+
/**
|
|
1477
|
+
* @param {import('prosemirror-model').Slice} slice
|
|
1478
|
+
*/
|
|
1479
|
+
clipboardTextSerializer: (slice) => {
|
|
1480
|
+
if (!this.options.transformCopiedText) {
|
|
1481
|
+
return null;
|
|
1482
|
+
}
|
|
1483
|
+
return this.editor.storage.markdown.serializer.serialize(slice.content);
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
})];
|
|
1487
|
+
}
|
|
1488
|
+
});
|
|
1489
|
+
var Markdown = Extension6.create({
|
|
1490
|
+
name: "markdown",
|
|
1491
|
+
priority: 50,
|
|
1492
|
+
addOptions() {
|
|
1493
|
+
return {
|
|
1494
|
+
html: true,
|
|
1495
|
+
tightLists: true,
|
|
1496
|
+
tightListClass: "tight",
|
|
1497
|
+
bulletListMarker: "-",
|
|
1498
|
+
linkify: false,
|
|
1499
|
+
breaks: false,
|
|
1500
|
+
transformPastedText: false,
|
|
1501
|
+
transformCopiedText: false
|
|
1502
|
+
};
|
|
1503
|
+
},
|
|
1504
|
+
addCommands() {
|
|
1505
|
+
const commands = extensions.Commands.config.addCommands();
|
|
1506
|
+
return {
|
|
1507
|
+
setContent: (content, emitUpdate, parseOptions) => (props) => {
|
|
1508
|
+
return commands.setContent(props.editor.storage.markdown.parser.parse(content), emitUpdate, parseOptions)(props);
|
|
1509
|
+
},
|
|
1510
|
+
insertContentAt: (range, content, options) => (props) => {
|
|
1511
|
+
return commands.insertContentAt(range, props.editor.storage.markdown.parser.parse(content, {
|
|
1512
|
+
inline: true
|
|
1513
|
+
}), options)(props);
|
|
1514
|
+
}
|
|
1515
|
+
};
|
|
1516
|
+
},
|
|
1517
|
+
onBeforeCreate() {
|
|
1518
|
+
this.editor.storage.markdown = {
|
|
1519
|
+
options: {
|
|
1520
|
+
...this.options
|
|
1521
|
+
},
|
|
1522
|
+
parser: new MarkdownParser(this.editor, this.options),
|
|
1523
|
+
serializer: new MarkdownSerializer(this.editor),
|
|
1524
|
+
getMarkdown: () => {
|
|
1525
|
+
return this.editor.storage.markdown.serializer.serialize(this.editor.state.doc);
|
|
1526
|
+
}
|
|
1527
|
+
};
|
|
1528
|
+
this.editor.options.initialContent = this.editor.options.content;
|
|
1529
|
+
this.editor.options.content = this.editor.storage.markdown.parser.parse(this.editor.options.content);
|
|
1530
|
+
},
|
|
1531
|
+
onCreate() {
|
|
1532
|
+
this.editor.options.content = this.editor.options.initialContent;
|
|
1533
|
+
delete this.editor.options.initialContent;
|
|
1534
|
+
},
|
|
1535
|
+
addStorage() {
|
|
1536
|
+
return {
|
|
1537
|
+
/// storage will be defined in onBeforeCreate() to prevent initial object overriding
|
|
1538
|
+
};
|
|
1539
|
+
},
|
|
1540
|
+
addExtensions() {
|
|
1541
|
+
return [MarkdownTightLists.configure({
|
|
1542
|
+
tight: this.options.tightLists,
|
|
1543
|
+
tightClass: this.options.tightListClass
|
|
1544
|
+
}), MarkdownClipboard.configure({
|
|
1545
|
+
transformPastedText: this.options.transformPastedText,
|
|
1546
|
+
transformCopiedText: this.options.transformCopiedText
|
|
1547
|
+
})];
|
|
1548
|
+
}
|
|
1549
|
+
});
|
|
1550
|
+
|
|
1551
|
+
// src/extensions/markdown.ts
|
|
540
1552
|
var resolveExt = (mod, name) => mod?.[name] || mod?.default?.[name] || mod?.default?.default || mod?.default || mod;
|
|
541
|
-
var
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
var
|
|
545
|
-
var
|
|
546
|
-
var
|
|
547
|
-
var
|
|
548
|
-
var
|
|
549
|
-
var
|
|
550
|
-
var
|
|
551
|
-
var
|
|
552
|
-
var
|
|
1553
|
+
var Markdown2 = resolveExt(Markdown, "Markdown");
|
|
1554
|
+
|
|
1555
|
+
// src/extensions/rich-text-preset.ts
|
|
1556
|
+
var resolveExt2 = (mod, name) => mod?.[name] || mod?.default?.[name] || mod?.default?.default || mod?.default || mod;
|
|
1557
|
+
var StarterKit = resolveExt2(_StarterKit, "StarterKit");
|
|
1558
|
+
var Color = resolveExt2(_Color, "Color");
|
|
1559
|
+
var Highlight = resolveExt2(_Highlight, "Highlight");
|
|
1560
|
+
var Link2 = resolveExt2(_Link, "Link");
|
|
1561
|
+
var TaskList2 = resolveExt2(_TaskList, "TaskList");
|
|
1562
|
+
var TaskItem2 = resolveExt2(_TaskItem, "TaskItem");
|
|
1563
|
+
var TextAlign = resolveExt2(_TextAlign, "TextAlign");
|
|
1564
|
+
var TextStyle = resolveExt2(_TextStyle, "TextStyle");
|
|
1565
|
+
var Typography = resolveExt2(_Typography, "Typography");
|
|
1566
|
+
var Underline = resolveExt2(_Underline, "Underline");
|
|
1567
|
+
var Placeholder = resolveExt2(_Placeholder, "Placeholder");
|
|
1568
|
+
var CharacterCount = resolveExt2(_CharacterCount, "CharacterCount");
|
|
553
1569
|
function createRichTextPreset(options = {}) {
|
|
554
1570
|
const {
|
|
555
1571
|
placeholder = "Start typing...",
|
|
@@ -559,7 +1575,7 @@ function createRichTextPreset(options = {}) {
|
|
|
559
1575
|
enableColorHighlighter = true,
|
|
560
1576
|
headingLevels = [1, 2, 3, 4]
|
|
561
1577
|
} = options;
|
|
562
|
-
const
|
|
1578
|
+
const extensions2 = [
|
|
563
1579
|
StarterKit.configure({
|
|
564
1580
|
orderedList: {
|
|
565
1581
|
HTMLAttributes: {
|
|
@@ -586,7 +1602,7 @@ function createRichTextPreset(options = {}) {
|
|
|
586
1602
|
TextAlign.configure({
|
|
587
1603
|
types: ["heading", "paragraph"]
|
|
588
1604
|
}),
|
|
589
|
-
|
|
1605
|
+
Link2.extend({
|
|
590
1606
|
addInputRules() {
|
|
591
1607
|
return [
|
|
592
1608
|
markInputRule({
|
|
@@ -608,8 +1624,8 @@ function createRichTextPreset(options = {}) {
|
|
|
608
1624
|
class: "text-blue-500 underline underline-offset-2"
|
|
609
1625
|
}
|
|
610
1626
|
}),
|
|
611
|
-
|
|
612
|
-
|
|
1627
|
+
TaskList2,
|
|
1628
|
+
TaskItem2.extend({
|
|
613
1629
|
addInputRules() {
|
|
614
1630
|
return [
|
|
615
1631
|
wrappingInputRule({
|
|
@@ -631,21 +1647,21 @@ function createRichTextPreset(options = {}) {
|
|
|
631
1647
|
})
|
|
632
1648
|
];
|
|
633
1649
|
if (characterLimit) {
|
|
634
|
-
|
|
1650
|
+
extensions2.push(
|
|
635
1651
|
CharacterCount.configure({
|
|
636
1652
|
limit: characterLimit
|
|
637
1653
|
})
|
|
638
1654
|
);
|
|
639
1655
|
}
|
|
640
1656
|
if (enableSmilies) {
|
|
641
|
-
|
|
1657
|
+
extensions2.push(SmilieReplacer);
|
|
642
1658
|
}
|
|
643
1659
|
if (enableColorHighlighter) {
|
|
644
|
-
|
|
1660
|
+
extensions2.push(ColorHighlighter);
|
|
645
1661
|
}
|
|
646
1662
|
if (options.mention) {
|
|
647
1663
|
const mentionConfig = typeof options.mention === "object" ? options.mention : {};
|
|
648
|
-
|
|
1664
|
+
extensions2.push(
|
|
649
1665
|
Mention.configure({
|
|
650
1666
|
HTMLAttributes: {
|
|
651
1667
|
class: "pixerate-mention-node",
|
|
@@ -655,13 +1671,30 @@ function createRichTextPreset(options = {}) {
|
|
|
655
1671
|
})
|
|
656
1672
|
);
|
|
657
1673
|
}
|
|
658
|
-
|
|
1674
|
+
if (options.markdown) {
|
|
1675
|
+
const markdownConfig = typeof options.markdown === "object" ? options.markdown : {};
|
|
1676
|
+
extensions2.push(
|
|
1677
|
+
Markdown2.configure({
|
|
1678
|
+
html: true,
|
|
1679
|
+
tightLists: true,
|
|
1680
|
+
tightListClass: "tight",
|
|
1681
|
+
bulletListMarker: "-",
|
|
1682
|
+
linkify: true,
|
|
1683
|
+
breaks: true,
|
|
1684
|
+
transformPastedText: true,
|
|
1685
|
+
transformCopiedText: true,
|
|
1686
|
+
...markdownConfig
|
|
1687
|
+
})
|
|
1688
|
+
);
|
|
1689
|
+
}
|
|
1690
|
+
return extensions2;
|
|
659
1691
|
}
|
|
660
1692
|
export {
|
|
661
1693
|
ColorHighlighter,
|
|
662
1694
|
FontSize,
|
|
663
1695
|
GradientText,
|
|
664
1696
|
LoadingNode,
|
|
1697
|
+
Markdown2 as Markdown,
|
|
665
1698
|
Mention,
|
|
666
1699
|
SlashCommands,
|
|
667
1700
|
SmilieReplacer,
|