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