@pixerate/editor 0.4.5 → 0.5.1

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.
@@ -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 = Node.create({
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 { wrappingInputRule, markInputRule } from "@tiptap/core";
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
- // src/extensions/rich-text-preset.ts
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, "&lt;").replace(/>/g, "&gt;");
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 StarterKit = resolveExt(_StarterKit, "StarterKit");
542
- var Color = resolveExt(_Color, "Color");
543
- var Highlight = resolveExt(_Highlight, "Highlight");
544
- var Link = resolveExt(_Link, "Link");
545
- var TaskList = resolveExt(_TaskList, "TaskList");
546
- var TaskItem = resolveExt(_TaskItem, "TaskItem");
547
- var TextAlign = resolveExt(_TextAlign, "TextAlign");
548
- var TextStyle = resolveExt(_TextStyle, "TextStyle");
549
- var Typography = resolveExt(_Typography, "Typography");
550
- var Underline = resolveExt(_Underline, "Underline");
551
- var Placeholder = resolveExt(_Placeholder, "Placeholder");
552
- var CharacterCount = resolveExt(_CharacterCount, "CharacterCount");
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 extensions = [
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
- Link.extend({
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
- TaskList,
612
- TaskItem.extend({
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
- extensions.push(
1650
+ extensions2.push(
635
1651
  CharacterCount.configure({
636
1652
  limit: characterLimit
637
1653
  })
638
1654
  );
639
1655
  }
640
1656
  if (enableSmilies) {
641
- extensions.push(SmilieReplacer);
1657
+ extensions2.push(SmilieReplacer);
642
1658
  }
643
1659
  if (enableColorHighlighter) {
644
- extensions.push(ColorHighlighter);
1660
+ extensions2.push(ColorHighlighter);
645
1661
  }
646
1662
  if (options.mention) {
647
1663
  const mentionConfig = typeof options.mention === "object" ? options.mention : {};
648
- extensions.push(
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
- return extensions;
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,