@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.
@@ -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 import_core8 = require("@tiptap/core");
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
- // src/extensions/rich-text-preset.ts
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, "&lt;").replace(/>/g, "&gt;");
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 StarterKit = resolveExt(_StarterKit, "StarterKit");
586
- var Color = resolveExt(_Color, "Color");
587
- var Highlight = resolveExt(_Highlight, "Highlight");
588
- var Link = resolveExt(_Link, "Link");
589
- var TaskList = resolveExt(_TaskList, "TaskList");
590
- var TaskItem = resolveExt(_TaskItem, "TaskItem");
591
- var TextAlign = resolveExt(_TextAlign, "TextAlign");
592
- var TextStyle = resolveExt(_TextStyle, "TextStyle");
593
- var Typography = resolveExt(_Typography, "Typography");
594
- var Underline = resolveExt(_Underline, "Underline");
595
- var Placeholder = resolveExt(_Placeholder, "Placeholder");
596
- var CharacterCount = resolveExt(_CharacterCount, "CharacterCount");
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 extensions = [
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
- Link.extend({
1647
+ Link2.extend({
634
1648
  addInputRules() {
635
1649
  return [
636
- (0, import_core8.markInputRule)({
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
- TaskList,
656
- TaskItem.extend({
1669
+ TaskList2,
1670
+ TaskItem2.extend({
657
1671
  addInputRules() {
658
1672
  return [
659
- (0, import_core8.wrappingInputRule)({
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
- extensions.push(
1692
+ extensions2.push(
679
1693
  CharacterCount.configure({
680
1694
  limit: characterLimit
681
1695
  })
682
1696
  );
683
1697
  }
684
1698
  if (enableSmilies) {
685
- extensions.push(SmilieReplacer);
1699
+ extensions2.push(SmilieReplacer);
686
1700
  }
687
1701
  if (enableColorHighlighter) {
688
- extensions.push(ColorHighlighter);
1702
+ extensions2.push(ColorHighlighter);
689
1703
  }
690
1704
  if (options.mention) {
691
1705
  const mentionConfig = typeof options.mention === "object" ? options.mention : {};
692
- extensions.push(
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
- return extensions;
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,