@pixerate/editor 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -40,6 +40,7 @@ __export(src_exports, {
40
40
  GradientText: () => GradientText,
41
41
  INSTRUCTION_REGEX: () => INSTRUCTION_REGEX,
42
42
  LoadingNode: () => LoadingNode,
43
+ Markdown: () => Markdown2,
43
44
  Mention: () => Mention,
44
45
  SlashCommands: () => SlashCommands,
45
46
  SmilieReplacer: () => SmilieReplacer,
@@ -58,6 +59,7 @@ __export(src_exports, {
58
59
  extractTemplateNames: () => extractTemplateNames,
59
60
  extractVariableNames: () => extractVariableNames,
60
61
  findHexColors: () => findHexColors,
62
+ getEditorMarkdown: () => getEditorMarkdown,
61
63
  getEditorText: () => getEditorText,
62
64
  getLatestVersion: () => getLatestVersion,
63
65
  htmlToPlainText: () => htmlToPlainText,
@@ -65,6 +67,7 @@ __export(src_exports, {
65
67
  instructionRegex: () => instructionRegex,
66
68
  mapRawOffsetToResolved: () => mapRawOffsetToResolved,
67
69
  mapResolvedOffsetToRaw: () => mapResolvedOffsetToRaw,
70
+ markdownToTipTapHtml: () => markdownToTipTapHtml,
68
71
  parseCellReference: () => parseCellReference,
69
72
  parseFormula: () => parseFormula,
70
73
  parseRange: () => parseRange,
@@ -890,7 +893,7 @@ var FontSize = import_core7.Extension.create({
890
893
  });
891
894
 
892
895
  // src/extensions/rich-text-preset.ts
893
- var import_core8 = require("@tiptap/core");
896
+ var import_core9 = require("@tiptap/core");
894
897
  var _StarterKit = __toESM(require("@tiptap/starter-kit"), 1);
895
898
  var _Color = __toESM(require("@tiptap/extension-color"), 1);
896
899
  var _Highlight = __toESM(require("@tiptap/extension-highlight"), 1);
@@ -949,20 +952,1033 @@ function createMentionExtension(options = {}) {
949
952
  });
950
953
  }
951
954
 
952
- // src/extensions/rich-text-preset.ts
955
+ // ../../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
956
+ var import_core8 = require("@tiptap/core");
957
+ var import_prosemirror_markdown = require("prosemirror-markdown");
958
+ var import_markdown_it = __toESM(require("markdown-it"), 1);
959
+ var import_model = require("@tiptap/pm/model");
960
+ var import_markdown_it_task_lists = __toESM(require("markdown-it-task-lists"), 1);
961
+ var import_state4 = require("@tiptap/pm/state");
962
+ var __defProp2 = Object.defineProperty;
963
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
964
+ var __publicField = (obj, key, value) => {
965
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
966
+ return value;
967
+ };
968
+ var MarkdownTightLists = import_core8.Extension.create({
969
+ name: "markdownTightLists",
970
+ addOptions: () => ({
971
+ tight: true,
972
+ tightClass: "tight",
973
+ listTypes: ["bulletList", "orderedList"]
974
+ }),
975
+ addGlobalAttributes() {
976
+ return [{
977
+ types: this.options.listTypes,
978
+ attributes: {
979
+ tight: {
980
+ default: this.options.tight,
981
+ parseHTML: (element) => element.getAttribute("data-tight") === "true" || !element.querySelector("p"),
982
+ renderHTML: (attributes) => ({
983
+ class: attributes.tight ? this.options.tightClass : null,
984
+ "data-tight": attributes.tight ? "true" : null
985
+ })
986
+ }
987
+ }
988
+ }];
989
+ },
990
+ addCommands() {
991
+ var _this = this;
992
+ return {
993
+ toggleTight: function() {
994
+ let tight = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;
995
+ return (_ref) => {
996
+ let {
997
+ editor,
998
+ commands
999
+ } = _ref;
1000
+ function toggleTight(name) {
1001
+ if (!editor.isActive(name)) {
1002
+ return false;
1003
+ }
1004
+ const attrs = editor.getAttributes(name);
1005
+ return commands.updateAttributes(name, {
1006
+ tight: tight !== null && tight !== void 0 ? tight : !(attrs !== null && attrs !== void 0 && attrs.tight)
1007
+ });
1008
+ }
1009
+ return _this.options.listTypes.some((name) => toggleTight(name));
1010
+ };
1011
+ }
1012
+ };
1013
+ }
1014
+ });
1015
+ var md = (0, import_markdown_it.default)();
1016
+ function scanDelims(text, pos) {
1017
+ md.inline.State.prototype.scanDelims.call({
1018
+ src: text,
1019
+ posMax: text.length
1020
+ });
1021
+ const state = new md.inline.State(text, null, null, []);
1022
+ return state.scanDelims(pos, true);
1023
+ }
1024
+ function shiftDelim(text, delim, start, offset) {
1025
+ let res = text.substring(0, start) + text.substring(start + delim.length);
1026
+ res = res.substring(0, start + offset) + delim + res.substring(start + offset);
1027
+ return res;
1028
+ }
1029
+ function trimStart(text, delim, from, to) {
1030
+ let pos = from, res = text;
1031
+ while (pos < to) {
1032
+ if (scanDelims(res, pos).can_open) {
1033
+ break;
1034
+ }
1035
+ res = shiftDelim(res, delim, pos, 1);
1036
+ pos++;
1037
+ }
1038
+ return {
1039
+ text: res,
1040
+ from: pos,
1041
+ to
1042
+ };
1043
+ }
1044
+ function trimEnd(text, delim, from, to) {
1045
+ let pos = to, res = text;
1046
+ while (pos > from) {
1047
+ if (scanDelims(res, pos).can_close) {
1048
+ break;
1049
+ }
1050
+ res = shiftDelim(res, delim, pos, -1);
1051
+ pos--;
1052
+ }
1053
+ return {
1054
+ text: res,
1055
+ from,
1056
+ to: pos
1057
+ };
1058
+ }
1059
+ function trimInline(text, delim, from, to) {
1060
+ let state = {
1061
+ text,
1062
+ from,
1063
+ to
1064
+ };
1065
+ state = trimStart(state.text, delim, state.from, state.to);
1066
+ state = trimEnd(state.text, delim, state.from, state.to);
1067
+ if (state.to - state.from < delim.length + 1) {
1068
+ state.text = state.text.substring(0, state.from) + state.text.substring(state.to + delim.length);
1069
+ }
1070
+ return state.text;
1071
+ }
1072
+ var MarkdownSerializerState = class extends import_prosemirror_markdown.MarkdownSerializerState {
1073
+ constructor(nodes, marks, options) {
1074
+ super(nodes, marks, options !== null && options !== void 0 ? options : {});
1075
+ __publicField(this, "inTable", false);
1076
+ this.inlines = [];
1077
+ }
1078
+ render(node, parent, index) {
1079
+ super.render(node, parent, index);
1080
+ const top = this.inlines[this.inlines.length - 1];
1081
+ if (top !== null && top !== void 0 && top.start && top !== null && top !== void 0 && top.end) {
1082
+ const {
1083
+ delimiter,
1084
+ start,
1085
+ end
1086
+ } = this.normalizeInline(top);
1087
+ this.out = trimInline(this.out, delimiter, start, end);
1088
+ this.inlines.pop();
1089
+ }
1090
+ }
1091
+ markString(mark, open, parent, index) {
1092
+ const info = this.marks[mark.type.name];
1093
+ if (info.expelEnclosingWhitespace) {
1094
+ if (open) {
1095
+ this.inlines.push({
1096
+ start: this.out.length,
1097
+ delimiter: info.open
1098
+ });
1099
+ } else {
1100
+ const top = this.inlines.pop();
1101
+ this.inlines.push({
1102
+ ...top,
1103
+ end: this.out.length
1104
+ });
1105
+ }
1106
+ }
1107
+ return super.markString(mark, open, parent, index);
1108
+ }
1109
+ normalizeInline(inline) {
1110
+ let {
1111
+ start,
1112
+ end
1113
+ } = inline;
1114
+ while (this.out.charAt(start).match(/\s/)) {
1115
+ start++;
1116
+ }
1117
+ return {
1118
+ ...inline,
1119
+ start
1120
+ };
1121
+ }
1122
+ };
1123
+ var HTMLMark = import_core8.Mark.create({
1124
+ name: "markdownHTMLMark",
1125
+ /**
1126
+ * @return {{markdown: MarkdownMarkSpec}}
1127
+ */
1128
+ addStorage() {
1129
+ return {
1130
+ markdown: {
1131
+ serialize: {
1132
+ open(state, mark) {
1133
+ var _getMarkTags$, _getMarkTags;
1134
+ if (!this.editor.storage.markdown.options.html) {
1135
+ console.warn(`Tiptap Markdown: "${mark.type.name}" mark is only available in html mode`);
1136
+ return "";
1137
+ }
1138
+ return (_getMarkTags$ = (_getMarkTags = getMarkTags(mark)) === null || _getMarkTags === void 0 ? void 0 : _getMarkTags[0]) !== null && _getMarkTags$ !== void 0 ? _getMarkTags$ : "";
1139
+ },
1140
+ close(state, mark) {
1141
+ var _getMarkTags$2, _getMarkTags2;
1142
+ if (!this.editor.storage.markdown.options.html) {
1143
+ return "";
1144
+ }
1145
+ return (_getMarkTags$2 = (_getMarkTags2 = getMarkTags(mark)) === null || _getMarkTags2 === void 0 ? void 0 : _getMarkTags2[1]) !== null && _getMarkTags$2 !== void 0 ? _getMarkTags$2 : "";
1146
+ }
1147
+ },
1148
+ parse: {
1149
+ // handled by markdown-it
1150
+ }
1151
+ }
1152
+ };
1153
+ }
1154
+ });
1155
+ function getMarkTags(mark) {
1156
+ const schema = mark.type.schema;
1157
+ const node = schema.text(" ", [mark]);
1158
+ const html = (0, import_core8.getHTMLFromFragment)(import_model.Fragment.from(node), schema);
1159
+ const match = html.match(/^(<.*?>) (<\/.*?>)$/);
1160
+ return match ? [match[1], match[2]] : null;
1161
+ }
1162
+ function elementFromString(value) {
1163
+ const wrappedValue = `<body>${value}</body>`;
1164
+ return new window.DOMParser().parseFromString(wrappedValue, "text/html").body;
1165
+ }
1166
+ function escapeHTML(value) {
1167
+ return value === null || value === void 0 ? void 0 : value.replace(/</g, "&lt;").replace(/>/g, "&gt;");
1168
+ }
1169
+ function extractElement(node) {
1170
+ const parent = node.parentElement;
1171
+ const prepend = parent.cloneNode();
1172
+ while (parent.firstChild && parent.firstChild !== node) {
1173
+ prepend.appendChild(parent.firstChild);
1174
+ }
1175
+ if (prepend.childNodes.length > 0) {
1176
+ parent.parentElement.insertBefore(prepend, parent);
1177
+ }
1178
+ parent.parentElement.insertBefore(node, parent);
1179
+ if (parent.childNodes.length === 0) {
1180
+ parent.remove();
1181
+ }
1182
+ }
1183
+ function unwrapElement(node) {
1184
+ const parent = node.parentNode;
1185
+ while (node.firstChild)
1186
+ parent.insertBefore(node.firstChild, node);
1187
+ parent.removeChild(node);
1188
+ }
1189
+ var HTMLNode = import_core8.Node.create({
1190
+ name: "markdownHTMLNode",
1191
+ addStorage() {
1192
+ return {
1193
+ markdown: {
1194
+ serialize(state, node, parent) {
1195
+ if (this.editor.storage.markdown.options.html) {
1196
+ state.write(serializeHTML(node, parent));
1197
+ } else {
1198
+ console.warn(`Tiptap Markdown: "${node.type.name}" node is only available in html mode`);
1199
+ state.write(`[${node.type.name}]`);
1200
+ }
1201
+ if (node.isBlock) {
1202
+ state.closeBlock(node);
1203
+ }
1204
+ },
1205
+ parse: {
1206
+ // handled by markdown-it
1207
+ }
1208
+ }
1209
+ };
1210
+ }
1211
+ });
1212
+ function serializeHTML(node, parent) {
1213
+ const schema = node.type.schema;
1214
+ const html = (0, import_core8.getHTMLFromFragment)(import_model.Fragment.from(node), schema);
1215
+ if (node.isBlock && (parent instanceof import_model.Fragment || parent.type.name === schema.topNodeType.name)) {
1216
+ return formatBlock(html);
1217
+ }
1218
+ return html;
1219
+ }
1220
+ function formatBlock(html) {
1221
+ const dom = elementFromString(html);
1222
+ const element = dom.firstElementChild;
1223
+ element.innerHTML = element.innerHTML.trim() ? `
1224
+ ${element.innerHTML}
1225
+ ` : `
1226
+ `;
1227
+ return element.outerHTML;
1228
+ }
1229
+ var Blockquote = import_core8.Node.create({
1230
+ name: "blockquote"
1231
+ });
1232
+ var Blockquote$1 = Blockquote.extend({
1233
+ /**
1234
+ * @return {{markdown: MarkdownNodeSpec}}
1235
+ */
1236
+ addStorage() {
1237
+ return {
1238
+ markdown: {
1239
+ serialize: import_prosemirror_markdown.defaultMarkdownSerializer.nodes.blockquote,
1240
+ parse: {
1241
+ // handled by markdown-it
1242
+ }
1243
+ }
1244
+ };
1245
+ }
1246
+ });
1247
+ var BulletList = import_core8.Node.create({
1248
+ name: "bulletList"
1249
+ });
1250
+ var BulletList$1 = BulletList.extend({
1251
+ /**
1252
+ * @return {{markdown: MarkdownNodeSpec}}
1253
+ */
1254
+ addStorage() {
1255
+ return {
1256
+ markdown: {
1257
+ serialize(state, node) {
1258
+ return state.renderList(node, " ", () => (this.editor.storage.markdown.options.bulletListMarker || "-") + " ");
1259
+ },
1260
+ parse: {
1261
+ // handled by markdown-it
1262
+ }
1263
+ }
1264
+ };
1265
+ }
1266
+ });
1267
+ var CodeBlock = import_core8.Node.create({
1268
+ name: "codeBlock"
1269
+ });
1270
+ var CodeBlock$1 = CodeBlock.extend({
1271
+ /**
1272
+ * @return {{markdown: MarkdownNodeSpec}}
1273
+ */
1274
+ addStorage() {
1275
+ return {
1276
+ markdown: {
1277
+ serialize(state, node) {
1278
+ state.write("```" + (node.attrs.language || "") + "\n");
1279
+ state.text(node.textContent, false);
1280
+ state.ensureNewLine();
1281
+ state.write("```");
1282
+ state.closeBlock(node);
1283
+ },
1284
+ parse: {
1285
+ setup(markdownit2) {
1286
+ var _this$options$languag;
1287
+ markdownit2.set({
1288
+ langPrefix: (_this$options$languag = this.options.languageClassPrefix) !== null && _this$options$languag !== void 0 ? _this$options$languag : "language-"
1289
+ });
1290
+ },
1291
+ updateDOM(element) {
1292
+ element.innerHTML = element.innerHTML.replace(/\n<\/code><\/pre>/g, "</code></pre>");
1293
+ }
1294
+ }
1295
+ }
1296
+ };
1297
+ }
1298
+ });
1299
+ var HardBreak = import_core8.Node.create({
1300
+ name: "hardBreak"
1301
+ });
1302
+ var HardBreak$1 = HardBreak.extend({
1303
+ /**
1304
+ * @return {{markdown: MarkdownNodeSpec}}
1305
+ */
1306
+ addStorage() {
1307
+ return {
1308
+ markdown: {
1309
+ serialize(state, node, parent, index) {
1310
+ for (let i = index + 1; i < parent.childCount; i++)
1311
+ if (parent.child(i).type != node.type) {
1312
+ state.write(state.inTable ? HTMLNode.storage.markdown.serialize.call(this, state, node, parent) : "\\\n");
1313
+ return;
1314
+ }
1315
+ },
1316
+ parse: {
1317
+ // handled by markdown-it
1318
+ }
1319
+ }
1320
+ };
1321
+ }
1322
+ });
1323
+ var Heading = import_core8.Node.create({
1324
+ name: "heading"
1325
+ });
1326
+ var Heading$1 = Heading.extend({
1327
+ /**
1328
+ * @return {{markdown: MarkdownNodeSpec}}
1329
+ */
1330
+ addStorage() {
1331
+ return {
1332
+ markdown: {
1333
+ serialize: import_prosemirror_markdown.defaultMarkdownSerializer.nodes.heading,
1334
+ parse: {
1335
+ // handled by markdown-it
1336
+ }
1337
+ }
1338
+ };
1339
+ }
1340
+ });
1341
+ var HorizontalRule = import_core8.Node.create({
1342
+ name: "horizontalRule"
1343
+ });
1344
+ var HorizontalRule$1 = HorizontalRule.extend({
1345
+ /**
1346
+ * @return {{markdown: MarkdownNodeSpec}}
1347
+ */
1348
+ addStorage() {
1349
+ return {
1350
+ markdown: {
1351
+ serialize: import_prosemirror_markdown.defaultMarkdownSerializer.nodes.horizontal_rule,
1352
+ parse: {
1353
+ // handled by markdown-it
1354
+ }
1355
+ }
1356
+ };
1357
+ }
1358
+ });
1359
+ var Image = import_core8.Node.create({
1360
+ name: "image"
1361
+ });
1362
+ var Image$1 = Image.extend({
1363
+ /**
1364
+ * @return {{markdown: MarkdownNodeSpec}}
1365
+ */
1366
+ addStorage() {
1367
+ return {
1368
+ markdown: {
1369
+ serialize: import_prosemirror_markdown.defaultMarkdownSerializer.nodes.image,
1370
+ parse: {
1371
+ // handled by markdown-it
1372
+ }
1373
+ }
1374
+ };
1375
+ }
1376
+ });
1377
+ var ListItem = import_core8.Node.create({
1378
+ name: "listItem"
1379
+ });
1380
+ var ListItem$1 = ListItem.extend({
1381
+ /**
1382
+ * @return {{markdown: MarkdownNodeSpec}}
1383
+ */
1384
+ addStorage() {
1385
+ return {
1386
+ markdown: {
1387
+ serialize: import_prosemirror_markdown.defaultMarkdownSerializer.nodes.list_item,
1388
+ parse: {
1389
+ // handled by markdown-it
1390
+ }
1391
+ }
1392
+ };
1393
+ }
1394
+ });
1395
+ var OrderedList = import_core8.Node.create({
1396
+ name: "orderedList"
1397
+ });
1398
+ function findIndexOfAdjacentNode(node, parent, index) {
1399
+ let i = 0;
1400
+ for (; index - i > 0; i++) {
1401
+ if (parent.child(index - i - 1).type.name !== node.type.name) {
1402
+ break;
1403
+ }
1404
+ }
1405
+ return i;
1406
+ }
1407
+ var OrderedList$1 = OrderedList.extend({
1408
+ /**
1409
+ * @return {{markdown: MarkdownNodeSpec}}
1410
+ */
1411
+ addStorage() {
1412
+ return {
1413
+ markdown: {
1414
+ serialize(state, node, parent, index) {
1415
+ const start = node.attrs.start || 1;
1416
+ const maxW = String(start + node.childCount - 1).length;
1417
+ const space = state.repeat(" ", maxW + 2);
1418
+ const adjacentIndex = findIndexOfAdjacentNode(node, parent, index);
1419
+ const separator = adjacentIndex % 2 ? ") " : ". ";
1420
+ state.renderList(node, space, (i) => {
1421
+ const nStr = String(start + i);
1422
+ return state.repeat(" ", maxW - nStr.length) + nStr + separator;
1423
+ });
1424
+ },
1425
+ parse: {
1426
+ // handled by markdown-it
1427
+ }
1428
+ }
1429
+ };
1430
+ }
1431
+ });
1432
+ var Paragraph = import_core8.Node.create({
1433
+ name: "paragraph"
1434
+ });
1435
+ var Paragraph$1 = Paragraph.extend({
1436
+ /**
1437
+ * @return {{markdown: MarkdownNodeSpec}}
1438
+ */
1439
+ addStorage() {
1440
+ return {
1441
+ markdown: {
1442
+ serialize: import_prosemirror_markdown.defaultMarkdownSerializer.nodes.paragraph,
1443
+ parse: {
1444
+ // handled by markdown-it
1445
+ }
1446
+ }
1447
+ };
1448
+ }
1449
+ });
1450
+ function childNodes(node) {
1451
+ var _node$content$content, _node$content;
1452
+ 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 : [];
1453
+ }
1454
+ var Table = import_core8.Node.create({
1455
+ name: "table"
1456
+ });
1457
+ var Table$1 = Table.extend({
1458
+ /**
1459
+ * @return {{markdown: MarkdownNodeSpec}}
1460
+ */
1461
+ addStorage() {
1462
+ return {
1463
+ markdown: {
1464
+ serialize(state, node, parent) {
1465
+ if (!isMarkdownSerializable(node)) {
1466
+ HTMLNode.storage.markdown.serialize.call(this, state, node, parent);
1467
+ return;
1468
+ }
1469
+ state.inTable = true;
1470
+ node.forEach((row, p, i) => {
1471
+ state.write("| ");
1472
+ row.forEach((col, p2, j) => {
1473
+ if (j) {
1474
+ state.write(" | ");
1475
+ }
1476
+ const cellContent = col.firstChild;
1477
+ if (cellContent.textContent.trim()) {
1478
+ state.renderInline(cellContent);
1479
+ }
1480
+ });
1481
+ state.write(" |");
1482
+ state.ensureNewLine();
1483
+ if (!i) {
1484
+ const delimiterRow = Array.from({
1485
+ length: row.childCount
1486
+ }).map(() => "---").join(" | ");
1487
+ state.write(`| ${delimiterRow} |`);
1488
+ state.ensureNewLine();
1489
+ }
1490
+ });
1491
+ state.closeBlock(node);
1492
+ state.inTable = false;
1493
+ },
1494
+ parse: {
1495
+ // handled by markdown-it
1496
+ }
1497
+ }
1498
+ };
1499
+ }
1500
+ });
1501
+ function hasSpan(node) {
1502
+ return node.attrs.colspan > 1 || node.attrs.rowspan > 1;
1503
+ }
1504
+ function isMarkdownSerializable(node) {
1505
+ const rows = childNodes(node);
1506
+ const firstRow = rows[0];
1507
+ const bodyRows = rows.slice(1);
1508
+ if (childNodes(firstRow).some((cell) => cell.type.name !== "tableHeader" || hasSpan(cell) || cell.childCount > 1)) {
1509
+ return false;
1510
+ }
1511
+ if (bodyRows.some((row) => childNodes(row).some((cell) => cell.type.name === "tableHeader" || hasSpan(cell) || cell.childCount > 1))) {
1512
+ return false;
1513
+ }
1514
+ return true;
1515
+ }
1516
+ var TaskItem = import_core8.Node.create({
1517
+ name: "taskItem"
1518
+ });
1519
+ var TaskItem$1 = TaskItem.extend({
1520
+ /**
1521
+ * @return {{markdown: MarkdownNodeSpec}}
1522
+ */
1523
+ addStorage() {
1524
+ return {
1525
+ markdown: {
1526
+ serialize(state, node) {
1527
+ const check = node.attrs.checked ? "[x]" : "[ ]";
1528
+ state.write(`${check} `);
1529
+ state.renderContent(node);
1530
+ },
1531
+ parse: {
1532
+ updateDOM(element) {
1533
+ [...element.querySelectorAll(".task-list-item")].forEach((item) => {
1534
+ const input = item.querySelector("input");
1535
+ item.setAttribute("data-type", "taskItem");
1536
+ if (input) {
1537
+ item.setAttribute("data-checked", input.checked);
1538
+ input.remove();
1539
+ }
1540
+ });
1541
+ }
1542
+ }
1543
+ }
1544
+ };
1545
+ }
1546
+ });
1547
+ var TaskList = import_core8.Node.create({
1548
+ name: "taskList"
1549
+ });
1550
+ var TaskList$1 = TaskList.extend({
1551
+ /**
1552
+ * @return {{markdown: MarkdownNodeSpec}}
1553
+ */
1554
+ addStorage() {
1555
+ return {
1556
+ markdown: {
1557
+ serialize: BulletList$1.storage.markdown.serialize,
1558
+ parse: {
1559
+ setup(markdownit2) {
1560
+ markdownit2.use(import_markdown_it_task_lists.default);
1561
+ },
1562
+ updateDOM(element) {
1563
+ [...element.querySelectorAll(".contains-task-list")].forEach((list) => {
1564
+ list.setAttribute("data-type", "taskList");
1565
+ });
1566
+ }
1567
+ }
1568
+ }
1569
+ };
1570
+ }
1571
+ });
1572
+ var Text = import_core8.Node.create({
1573
+ name: "text"
1574
+ });
1575
+ var Text$1 = Text.extend({
1576
+ /**
1577
+ * @return {{markdown: MarkdownNodeSpec}}
1578
+ */
1579
+ addStorage() {
1580
+ return {
1581
+ markdown: {
1582
+ serialize(state, node) {
1583
+ state.text(escapeHTML(node.text));
1584
+ },
1585
+ parse: {
1586
+ // handled by markdown-it
1587
+ }
1588
+ }
1589
+ };
1590
+ }
1591
+ });
1592
+ var Bold = import_core8.Mark.create({
1593
+ name: "bold"
1594
+ });
1595
+ var Bold$1 = Bold.extend({
1596
+ /**
1597
+ * @return {{markdown: MarkdownMarkSpec}}
1598
+ */
1599
+ addStorage() {
1600
+ return {
1601
+ markdown: {
1602
+ serialize: import_prosemirror_markdown.defaultMarkdownSerializer.marks.strong,
1603
+ parse: {
1604
+ // handled by markdown-it
1605
+ }
1606
+ }
1607
+ };
1608
+ }
1609
+ });
1610
+ var Code = import_core8.Mark.create({
1611
+ name: "code"
1612
+ });
1613
+ var Code$1 = Code.extend({
1614
+ /**
1615
+ * @return {{markdown: MarkdownMarkSpec}}
1616
+ */
1617
+ addStorage() {
1618
+ return {
1619
+ markdown: {
1620
+ serialize: import_prosemirror_markdown.defaultMarkdownSerializer.marks.code,
1621
+ parse: {
1622
+ // handled by markdown-it
1623
+ }
1624
+ }
1625
+ };
1626
+ }
1627
+ });
1628
+ var Italic = import_core8.Mark.create({
1629
+ name: "italic"
1630
+ });
1631
+ var Italic$1 = Italic.extend({
1632
+ /**
1633
+ * @return {{markdown: MarkdownMarkSpec}}
1634
+ */
1635
+ addStorage() {
1636
+ return {
1637
+ markdown: {
1638
+ serialize: import_prosemirror_markdown.defaultMarkdownSerializer.marks.em,
1639
+ parse: {
1640
+ // handled by markdown-it
1641
+ }
1642
+ }
1643
+ };
1644
+ }
1645
+ });
1646
+ var Link = import_core8.Mark.create({
1647
+ name: "link"
1648
+ });
1649
+ var Link$1 = Link.extend({
1650
+ /**
1651
+ * @return {{markdown: MarkdownMarkSpec}}
1652
+ */
1653
+ addStorage() {
1654
+ return {
1655
+ markdown: {
1656
+ serialize: import_prosemirror_markdown.defaultMarkdownSerializer.marks.link,
1657
+ parse: {
1658
+ // handled by markdown-it
1659
+ }
1660
+ }
1661
+ };
1662
+ }
1663
+ });
1664
+ var Strike = import_core8.Mark.create({
1665
+ name: "strike"
1666
+ });
1667
+ var Strike$1 = Strike.extend({
1668
+ /**
1669
+ * @return {{markdown: MarkdownMarkSpec}}
1670
+ */
1671
+ addStorage() {
1672
+ return {
1673
+ markdown: {
1674
+ serialize: {
1675
+ open: "~~",
1676
+ close: "~~",
1677
+ expelEnclosingWhitespace: true
1678
+ },
1679
+ parse: {
1680
+ // handled by markdown-it
1681
+ }
1682
+ }
1683
+ };
1684
+ }
1685
+ });
1686
+ 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];
1687
+ function getMarkdownSpec(extension) {
1688
+ var _extension$storage, _markdownExtensions$f;
1689
+ const markdownSpec = (_extension$storage = extension.storage) === null || _extension$storage === void 0 ? void 0 : _extension$storage.markdown;
1690
+ const defaultMarkdownSpec = (_markdownExtensions$f = markdownExtensions.find((e) => e.name === extension.name)) === null || _markdownExtensions$f === void 0 ? void 0 : _markdownExtensions$f.storage.markdown;
1691
+ if (markdownSpec || defaultMarkdownSpec) {
1692
+ return {
1693
+ ...defaultMarkdownSpec,
1694
+ ...markdownSpec
1695
+ };
1696
+ }
1697
+ return null;
1698
+ }
1699
+ var MarkdownSerializer = class {
1700
+ constructor(editor) {
1701
+ __publicField(this, "editor", null);
1702
+ this.editor = editor;
1703
+ }
1704
+ serialize(content) {
1705
+ const state = new MarkdownSerializerState(this.nodes, this.marks, {
1706
+ hardBreakNodeName: HardBreak$1.name
1707
+ });
1708
+ state.renderContent(content);
1709
+ return state.out;
1710
+ }
1711
+ get nodes() {
1712
+ var _this$editor$extensio;
1713
+ return {
1714
+ ...Object.fromEntries(Object.keys(this.editor.schema.nodes).map((name) => [name, this.serializeNode(HTMLNode)])),
1715
+ ...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 : [])
1716
+ };
1717
+ }
1718
+ get marks() {
1719
+ var _this$editor$extensio2;
1720
+ return {
1721
+ ...Object.fromEntries(Object.keys(this.editor.schema.marks).map((name) => [name, this.serializeMark(HTMLMark)])),
1722
+ ...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 : [])
1723
+ };
1724
+ }
1725
+ serializeNode(node) {
1726
+ var _getMarkdownSpec;
1727
+ return (_getMarkdownSpec = getMarkdownSpec(node)) === null || _getMarkdownSpec === void 0 || (_getMarkdownSpec = _getMarkdownSpec.serialize) === null || _getMarkdownSpec === void 0 ? void 0 : _getMarkdownSpec.bind({
1728
+ editor: this.editor,
1729
+ options: node.options
1730
+ });
1731
+ }
1732
+ serializeMark(mark) {
1733
+ var _getMarkdownSpec2;
1734
+ const serialize = (_getMarkdownSpec2 = getMarkdownSpec(mark)) === null || _getMarkdownSpec2 === void 0 ? void 0 : _getMarkdownSpec2.serialize;
1735
+ return serialize ? {
1736
+ ...serialize,
1737
+ open: typeof serialize.open === "function" ? serialize.open.bind({
1738
+ editor: this.editor,
1739
+ options: mark.options
1740
+ }) : serialize.open,
1741
+ close: typeof serialize.close === "function" ? serialize.close.bind({
1742
+ editor: this.editor,
1743
+ options: mark.options
1744
+ }) : serialize.close
1745
+ } : null;
1746
+ }
1747
+ };
1748
+ var MarkdownParser = class {
1749
+ constructor(editor, _ref) {
1750
+ __publicField(this, "editor", null);
1751
+ __publicField(this, "md", null);
1752
+ let {
1753
+ html,
1754
+ linkify,
1755
+ breaks
1756
+ } = _ref;
1757
+ this.editor = editor;
1758
+ this.md = this.withPatchedRenderer((0, import_markdown_it.default)({
1759
+ html,
1760
+ linkify,
1761
+ breaks
1762
+ }));
1763
+ }
1764
+ parse(content) {
1765
+ let {
1766
+ inline
1767
+ } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
1768
+ if (typeof content === "string") {
1769
+ this.editor.extensionManager.extensions.forEach((extension) => {
1770
+ var _getMarkdownSpec;
1771
+ 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({
1772
+ editor: this.editor,
1773
+ options: extension.options
1774
+ }, this.md);
1775
+ });
1776
+ const renderedHTML = this.md.render(content);
1777
+ const element = elementFromString(renderedHTML);
1778
+ this.editor.extensionManager.extensions.forEach((extension) => {
1779
+ var _getMarkdownSpec2;
1780
+ 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({
1781
+ editor: this.editor,
1782
+ options: extension.options
1783
+ }, element);
1784
+ });
1785
+ this.normalizeDOM(element, {
1786
+ inline,
1787
+ content
1788
+ });
1789
+ return element.innerHTML;
1790
+ }
1791
+ return content;
1792
+ }
1793
+ normalizeDOM(node, _ref2) {
1794
+ let {
1795
+ inline,
1796
+ content
1797
+ } = _ref2;
1798
+ this.normalizeBlocks(node);
1799
+ node.querySelectorAll("*").forEach((el) => {
1800
+ var _el$nextSibling;
1801
+ if (((_el$nextSibling = el.nextSibling) === null || _el$nextSibling === void 0 ? void 0 : _el$nextSibling.nodeType) === Node.TEXT_NODE && !el.closest("pre")) {
1802
+ el.nextSibling.textContent = el.nextSibling.textContent.replace(/^\n/, "");
1803
+ }
1804
+ });
1805
+ if (inline) {
1806
+ this.normalizeInline(node, content);
1807
+ }
1808
+ return node;
1809
+ }
1810
+ normalizeBlocks(node) {
1811
+ const blocks = Object.values(this.editor.schema.nodes).filter((node2) => node2.isBlock);
1812
+ const selector = blocks.map((block) => {
1813
+ var _block$spec$parseDOM;
1814
+ return (_block$spec$parseDOM = block.spec.parseDOM) === null || _block$spec$parseDOM === void 0 ? void 0 : _block$spec$parseDOM.map((spec) => spec.tag);
1815
+ }).flat().filter(Boolean).join(",");
1816
+ if (!selector) {
1817
+ return;
1818
+ }
1819
+ [...node.querySelectorAll(selector)].forEach((el) => {
1820
+ if (el.parentElement.matches("p")) {
1821
+ extractElement(el);
1822
+ }
1823
+ });
1824
+ }
1825
+ normalizeInline(node, content) {
1826
+ var _node$firstElementChi;
1827
+ if ((_node$firstElementChi = node.firstElementChild) !== null && _node$firstElementChi !== void 0 && _node$firstElementChi.matches("p")) {
1828
+ var _content$match$, _content$match, _content$match$2, _content$match2;
1829
+ const firstParagraph = node.firstElementChild;
1830
+ const {
1831
+ nextElementSibling
1832
+ } = firstParagraph;
1833
+ 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$ : "";
1834
+ 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 : "" : "";
1835
+ if (content.match(/^\n\n/)) {
1836
+ firstParagraph.innerHTML = `${firstParagraph.innerHTML}${endSpaces}`;
1837
+ return;
1838
+ }
1839
+ unwrapElement(firstParagraph);
1840
+ node.innerHTML = `${startSpaces}${node.innerHTML}${endSpaces}`;
1841
+ }
1842
+ }
1843
+ /**
1844
+ * @param {markdownit} md
1845
+ */
1846
+ withPatchedRenderer(md22) {
1847
+ const withoutNewLine = (renderer) => function() {
1848
+ const rendered = renderer(...arguments);
1849
+ if (rendered === "\n") {
1850
+ return rendered;
1851
+ }
1852
+ if (rendered[rendered.length - 1] === "\n") {
1853
+ return rendered.slice(0, -1);
1854
+ }
1855
+ return rendered;
1856
+ };
1857
+ md22.renderer.rules.hardbreak = withoutNewLine(md22.renderer.rules.hardbreak);
1858
+ md22.renderer.rules.softbreak = withoutNewLine(md22.renderer.rules.softbreak);
1859
+ md22.renderer.rules.fence = withoutNewLine(md22.renderer.rules.fence);
1860
+ md22.renderer.rules.code_block = withoutNewLine(md22.renderer.rules.code_block);
1861
+ md22.renderer.renderToken = withoutNewLine(md22.renderer.renderToken.bind(md22.renderer));
1862
+ return md22;
1863
+ }
1864
+ };
1865
+ var MarkdownClipboard = import_core8.Extension.create({
1866
+ name: "markdownClipboard",
1867
+ addOptions() {
1868
+ return {
1869
+ transformPastedText: false,
1870
+ transformCopiedText: false
1871
+ };
1872
+ },
1873
+ addProseMirrorPlugins() {
1874
+ return [new import_state4.Plugin({
1875
+ key: new import_state4.PluginKey("markdownClipboard"),
1876
+ props: {
1877
+ clipboardTextParser: (text, context, plainText) => {
1878
+ if (plainText || !this.options.transformPastedText) {
1879
+ return null;
1880
+ }
1881
+ const parsed = this.editor.storage.markdown.parser.parse(text, {
1882
+ inline: true
1883
+ });
1884
+ return import_model.DOMParser.fromSchema(this.editor.schema).parseSlice(elementFromString(parsed), {
1885
+ preserveWhitespace: true,
1886
+ context
1887
+ });
1888
+ },
1889
+ /**
1890
+ * @param {import('prosemirror-model').Slice} slice
1891
+ */
1892
+ clipboardTextSerializer: (slice) => {
1893
+ if (!this.options.transformCopiedText) {
1894
+ return null;
1895
+ }
1896
+ return this.editor.storage.markdown.serializer.serialize(slice.content);
1897
+ }
1898
+ }
1899
+ })];
1900
+ }
1901
+ });
1902
+ var Markdown = import_core8.Extension.create({
1903
+ name: "markdown",
1904
+ priority: 50,
1905
+ addOptions() {
1906
+ return {
1907
+ html: true,
1908
+ tightLists: true,
1909
+ tightListClass: "tight",
1910
+ bulletListMarker: "-",
1911
+ linkify: false,
1912
+ breaks: false,
1913
+ transformPastedText: false,
1914
+ transformCopiedText: false
1915
+ };
1916
+ },
1917
+ addCommands() {
1918
+ const commands = import_core8.extensions.Commands.config.addCommands();
1919
+ return {
1920
+ setContent: (content, emitUpdate, parseOptions) => (props) => {
1921
+ return commands.setContent(props.editor.storage.markdown.parser.parse(content), emitUpdate, parseOptions)(props);
1922
+ },
1923
+ insertContentAt: (range, content, options) => (props) => {
1924
+ return commands.insertContentAt(range, props.editor.storage.markdown.parser.parse(content, {
1925
+ inline: true
1926
+ }), options)(props);
1927
+ }
1928
+ };
1929
+ },
1930
+ onBeforeCreate() {
1931
+ this.editor.storage.markdown = {
1932
+ options: {
1933
+ ...this.options
1934
+ },
1935
+ parser: new MarkdownParser(this.editor, this.options),
1936
+ serializer: new MarkdownSerializer(this.editor),
1937
+ getMarkdown: () => {
1938
+ return this.editor.storage.markdown.serializer.serialize(this.editor.state.doc);
1939
+ }
1940
+ };
1941
+ this.editor.options.initialContent = this.editor.options.content;
1942
+ this.editor.options.content = this.editor.storage.markdown.parser.parse(this.editor.options.content);
1943
+ },
1944
+ onCreate() {
1945
+ this.editor.options.content = this.editor.options.initialContent;
1946
+ delete this.editor.options.initialContent;
1947
+ },
1948
+ addStorage() {
1949
+ return {
1950
+ /// storage will be defined in onBeforeCreate() to prevent initial object overriding
1951
+ };
1952
+ },
1953
+ addExtensions() {
1954
+ return [MarkdownTightLists.configure({
1955
+ tight: this.options.tightLists,
1956
+ tightClass: this.options.tightListClass
1957
+ }), MarkdownClipboard.configure({
1958
+ transformPastedText: this.options.transformPastedText,
1959
+ transformCopiedText: this.options.transformCopiedText
1960
+ })];
1961
+ }
1962
+ });
1963
+
1964
+ // src/extensions/markdown.ts
953
1965
  var resolveExt = (mod, name) => mod?.[name] || mod?.default?.[name] || mod?.default?.default || mod?.default || mod;
954
- var StarterKit = resolveExt(_StarterKit, "StarterKit");
955
- var Color = resolveExt(_Color, "Color");
956
- var Highlight = resolveExt(_Highlight, "Highlight");
957
- var Link = resolveExt(_Link, "Link");
958
- var TaskList = resolveExt(_TaskList, "TaskList");
959
- var TaskItem = resolveExt(_TaskItem, "TaskItem");
960
- var TextAlign = resolveExt(_TextAlign, "TextAlign");
961
- var TextStyle = resolveExt(_TextStyle, "TextStyle");
962
- var Typography = resolveExt(_Typography, "Typography");
963
- var Underline = resolveExt(_Underline, "Underline");
964
- var Placeholder = resolveExt(_Placeholder, "Placeholder");
965
- var CharacterCount = resolveExt(_CharacterCount, "CharacterCount");
1966
+ var Markdown2 = resolveExt(Markdown, "Markdown");
1967
+
1968
+ // src/extensions/rich-text-preset.ts
1969
+ var resolveExt2 = (mod, name) => mod?.[name] || mod?.default?.[name] || mod?.default?.default || mod?.default || mod;
1970
+ var StarterKit = resolveExt2(_StarterKit, "StarterKit");
1971
+ var Color = resolveExt2(_Color, "Color");
1972
+ var Highlight = resolveExt2(_Highlight, "Highlight");
1973
+ var Link2 = resolveExt2(_Link, "Link");
1974
+ var TaskList2 = resolveExt2(_TaskList, "TaskList");
1975
+ var TaskItem2 = resolveExt2(_TaskItem, "TaskItem");
1976
+ var TextAlign = resolveExt2(_TextAlign, "TextAlign");
1977
+ var TextStyle = resolveExt2(_TextStyle, "TextStyle");
1978
+ var Typography = resolveExt2(_Typography, "Typography");
1979
+ var Underline = resolveExt2(_Underline, "Underline");
1980
+ var Placeholder = resolveExt2(_Placeholder, "Placeholder");
1981
+ var CharacterCount = resolveExt2(_CharacterCount, "CharacterCount");
966
1982
  function createRichTextPreset(options = {}) {
967
1983
  const {
968
1984
  placeholder = "Start typing...",
@@ -972,7 +1988,7 @@ function createRichTextPreset(options = {}) {
972
1988
  enableColorHighlighter = true,
973
1989
  headingLevels = [1, 2, 3, 4]
974
1990
  } = options;
975
- const extensions = [
1991
+ const extensions2 = [
976
1992
  StarterKit.configure({
977
1993
  orderedList: {
978
1994
  HTMLAttributes: {
@@ -999,10 +2015,10 @@ function createRichTextPreset(options = {}) {
999
2015
  TextAlign.configure({
1000
2016
  types: ["heading", "paragraph"]
1001
2017
  }),
1002
- Link.extend({
2018
+ Link2.extend({
1003
2019
  addInputRules() {
1004
2020
  return [
1005
- (0, import_core8.markInputRule)({
2021
+ (0, import_core9.markInputRule)({
1006
2022
  find: /(?:^|\s)\[([^\]]+)\]\(([^)]+)\)$/,
1007
2023
  type: this.type,
1008
2024
  getAttributes: (match) => ({
@@ -1021,11 +2037,11 @@ function createRichTextPreset(options = {}) {
1021
2037
  class: "text-blue-500 underline underline-offset-2"
1022
2038
  }
1023
2039
  }),
1024
- TaskList,
1025
- TaskItem.extend({
2040
+ TaskList2,
2041
+ TaskItem2.extend({
1026
2042
  addInputRules() {
1027
2043
  return [
1028
- (0, import_core8.wrappingInputRule)({
2044
+ (0, import_core9.wrappingInputRule)({
1029
2045
  find: /^\s*(\[([ |x])?\])\s$/i,
1030
2046
  type: this.type,
1031
2047
  getAttributes: (match) => ({
@@ -1044,21 +2060,21 @@ function createRichTextPreset(options = {}) {
1044
2060
  })
1045
2061
  ];
1046
2062
  if (characterLimit) {
1047
- extensions.push(
2063
+ extensions2.push(
1048
2064
  CharacterCount.configure({
1049
2065
  limit: characterLimit
1050
2066
  })
1051
2067
  );
1052
2068
  }
1053
2069
  if (enableSmilies) {
1054
- extensions.push(SmilieReplacer);
2070
+ extensions2.push(SmilieReplacer);
1055
2071
  }
1056
2072
  if (enableColorHighlighter) {
1057
- extensions.push(ColorHighlighter);
2073
+ extensions2.push(ColorHighlighter);
1058
2074
  }
1059
2075
  if (options.mention) {
1060
2076
  const mentionConfig = typeof options.mention === "object" ? options.mention : {};
1061
- extensions.push(
2077
+ extensions2.push(
1062
2078
  Mention.configure({
1063
2079
  HTMLAttributes: {
1064
2080
  class: "pixerate-mention-node",
@@ -1068,7 +2084,23 @@ function createRichTextPreset(options = {}) {
1068
2084
  })
1069
2085
  );
1070
2086
  }
1071
- return extensions;
2087
+ if (options.markdown) {
2088
+ const markdownConfig = typeof options.markdown === "object" ? options.markdown : {};
2089
+ extensions2.push(
2090
+ Markdown2.configure({
2091
+ html: true,
2092
+ tightLists: true,
2093
+ tightListClass: "tight",
2094
+ bulletListMarker: "-",
2095
+ linkify: true,
2096
+ breaks: true,
2097
+ transformPastedText: true,
2098
+ transformCopiedText: true,
2099
+ ...markdownConfig
2100
+ })
2101
+ );
2102
+ }
2103
+ return extensions2;
1072
2104
  }
1073
2105
 
1074
2106
  // src/serializers/plain-text.ts
@@ -1199,13 +2231,35 @@ function extractMentionsFromDoc(docOrEditor) {
1199
2231
  return mentions;
1200
2232
  }
1201
2233
 
2234
+ // src/serializers/markdown.ts
2235
+ var import_markdown_it2 = __toESM(require("markdown-it"), 1);
2236
+ var import_markdown_it_task_lists2 = __toESM(require("markdown-it-task-lists"), 1);
2237
+ var md2 = new import_markdown_it2.default({
2238
+ html: true,
2239
+ linkify: true,
2240
+ breaks: true
2241
+ }).use(import_markdown_it_task_lists2.default);
2242
+ function markdownToTipTapHtml(markdown) {
2243
+ if (!markdown) return "<p></p>";
2244
+ return md2.render(markdown);
2245
+ }
2246
+ function getEditorMarkdown(editor) {
2247
+ if (!editor) return "";
2248
+ if (typeof editor.storage?.markdown?.getMarkdown === "function") {
2249
+ return editor.storage.markdown.getMarkdown();
2250
+ }
2251
+ return getEditorText(editor);
2252
+ }
2253
+
1202
2254
  // src/controller.ts
1203
- var import_core9 = require("@tiptap/core");
1204
- var import_model = require("@tiptap/pm/model");
2255
+ var import_core10 = require("@tiptap/core");
2256
+ var import_model2 = require("@tiptap/pm/model");
1205
2257
  var EditorController = class {
1206
2258
  editor;
1207
2259
  plainTextMode;
2260
+ markdownMode;
1208
2261
  onPlainTextChange;
2262
+ onMarkdownChange;
1209
2263
  onTokensChange;
1210
2264
  onSelectionChange;
1211
2265
  constructor(options = {}) {
@@ -1213,21 +2267,25 @@ var EditorController = class {
1213
2267
  element,
1214
2268
  content,
1215
2269
  plainTextMode = false,
1216
- extensions = [],
2270
+ markdownMode = false,
2271
+ extensions: extensions2 = [],
1217
2272
  onPlainTextChange,
2273
+ onMarkdownChange,
1218
2274
  onTokensChange,
1219
2275
  onSelectionChange,
1220
2276
  ...editorOptions
1221
2277
  } = options;
1222
2278
  this.plainTextMode = plainTextMode;
2279
+ this.markdownMode = markdownMode;
1223
2280
  this.onPlainTextChange = onPlainTextChange;
2281
+ this.onMarkdownChange = onMarkdownChange;
1224
2282
  this.onTokensChange = onTokensChange;
1225
2283
  this.onSelectionChange = onSelectionChange;
1226
- const initialContent = plainTextMode && typeof content === "string" ? plainTextToTipTapHtml(content) : content;
1227
- this.editor = new import_core9.Editor({
2284
+ const initialContent = plainTextMode && typeof content === "string" ? plainTextToTipTapHtml(content) : markdownMode && typeof content === "string" ? markdownToTipTapHtml(content) : content;
2285
+ this.editor = new import_core10.Editor({
1228
2286
  element: element || void 0,
1229
2287
  content: initialContent,
1230
- extensions,
2288
+ extensions: extensions2,
1231
2289
  ...editorOptions,
1232
2290
  onUpdate: (props) => {
1233
2291
  editorOptions.onUpdate?.(props);
@@ -1248,7 +2306,7 @@ var EditorController = class {
1248
2306
  ...this.editor.options.editorProps,
1249
2307
  clipboardTextParser: (text, context, _plain, view) => {
1250
2308
  const schema = context?.doc?.type?.schema || context?.schema || view?.state?.schema || this.editor.schema;
1251
- if (!schema) return import_model.Slice.empty;
2309
+ if (!schema) return import_model2.Slice.empty;
1252
2310
  const blocks = text.replace(/\r\n?/g, "\n").split("\n");
1253
2311
  const nodes = [];
1254
2312
  blocks.forEach((line) => {
@@ -1257,12 +2315,12 @@ var EditorController = class {
1257
2315
  nodeJson.content = [{ type: "text", text: line }];
1258
2316
  }
1259
2317
  try {
1260
- const node = import_model.Node.fromJSON(schema, nodeJson);
2318
+ const node = import_model2.Node.fromJSON(schema, nodeJson);
1261
2319
  nodes.push(node);
1262
2320
  } catch {
1263
2321
  }
1264
2322
  });
1265
- return import_model.Slice.maxOpen(import_model.Fragment.fromArray(nodes));
2323
+ return import_model2.Slice.maxOpen(import_model2.Fragment.fromArray(nodes));
1266
2324
  }
1267
2325
  }
1268
2326
  });
@@ -1276,6 +2334,10 @@ var EditorController = class {
1276
2334
  this.onTokensChange(tokens);
1277
2335
  }
1278
2336
  }
2337
+ if (this.markdownMode || this.onMarkdownChange) {
2338
+ const markdown = this.getMarkdown();
2339
+ this.onMarkdownChange?.(markdown);
2340
+ }
1279
2341
  }
1280
2342
  handleSelectionUpdate() {
1281
2343
  if (this.onSelectionChange) {
@@ -1290,6 +2352,17 @@ var EditorController = class {
1290
2352
  const html = plainTextToTipTapHtml(text);
1291
2353
  this.editor.commands.setContent(html, emitUpdate);
1292
2354
  }
2355
+ getMarkdown() {
2356
+ return getEditorMarkdown(this.editor);
2357
+ }
2358
+ setMarkdown(markdown, emitUpdate = true) {
2359
+ if (this.editor.storage?.markdown?.parser) {
2360
+ this.editor.commands.setContent(markdown, emitUpdate);
2361
+ } else {
2362
+ const html = markdownToTipTapHtml(markdown);
2363
+ this.editor.commands.setContent(html, emitUpdate);
2364
+ }
2365
+ }
1293
2366
  insertText(text) {
1294
2367
  this.editor.commands.insertContent(text);
1295
2368
  }
@@ -2501,6 +3574,24 @@ var SpreadsheetController = class {
2501
3574
  this.notifyChange();
2502
3575
  }
2503
3576
  }
3577
+ autoFitColumnWidth(colId, customWidth) {
3578
+ if (customWidth !== void 0) {
3579
+ this.setColumnWidth(colId, customWidth);
3580
+ return;
3581
+ }
3582
+ const col = this.document.columns.find((c) => c.id === colId);
3583
+ if (!col) return;
3584
+ let maxLen = (col.title || "").length + (col.key ? col.key.length + 3 : 0);
3585
+ for (const row of this.document.rows) {
3586
+ const cell = this.getCell(row.id, col.id);
3587
+ const valStr = cell.value != null ? String(cell.value) : "";
3588
+ if (valStr.length > maxLen) {
3589
+ maxLen = valStr.length;
3590
+ }
3591
+ }
3592
+ const estimatedWidth = Math.min(600, Math.max(50, Math.ceil(maxLen * 8.5 + 32)));
3593
+ this.setColumnWidth(colId, estimatedWidth);
3594
+ }
2504
3595
  // --- Clipboard TSV/CSV ---
2505
3596
  exportToTsv() {
2506
3597
  return this.document.rows.map(
@@ -2575,6 +3666,7 @@ var SpreadsheetController = class {
2575
3666
  GradientText,
2576
3667
  INSTRUCTION_REGEX,
2577
3668
  LoadingNode,
3669
+ Markdown,
2578
3670
  Mention,
2579
3671
  SlashCommands,
2580
3672
  SmilieReplacer,
@@ -2593,6 +3685,7 @@ var SpreadsheetController = class {
2593
3685
  extractTemplateNames,
2594
3686
  extractVariableNames,
2595
3687
  findHexColors,
3688
+ getEditorMarkdown,
2596
3689
  getEditorText,
2597
3690
  getLatestVersion,
2598
3691
  htmlToPlainText,
@@ -2600,6 +3693,7 @@ var SpreadsheetController = class {
2600
3693
  instructionRegex,
2601
3694
  mapRawOffsetToResolved,
2602
3695
  mapResolvedOffsetToRaw,
3696
+ markdownToTipTapHtml,
2603
3697
  parseCellReference,
2604
3698
  parseFormula,
2605
3699
  parseRange,