@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.
- package/dist/extensions/index.cjs +1056 -25
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.d.cts +10 -1
- package/dist/extensions/index.d.ts +10 -1
- package/dist/extensions/index.js +1058 -25
- package/dist/extensions/index.js.map +1 -1
- package/dist/index.cjs +1110 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.js +1106 -30
- package/dist/index.js.map +1 -1
- package/dist/serializers/index.cjs +34 -0
- package/dist/serializers/index.cjs.map +1 -1
- package/dist/serializers/index.d.cts +12 -1
- package/dist/serializers/index.d.ts +12 -1
- package/dist/serializers/index.js +22 -0
- package/dist/serializers/index.js.map +1 -1
- package/package.json +7 -2
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
|
|
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
|
-
//
|
|
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, "<").replace(/>/g, ">");
|
|
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
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
var
|
|
958
|
-
var
|
|
959
|
-
var
|
|
960
|
-
var
|
|
961
|
-
var
|
|
962
|
-
var
|
|
963
|
-
var
|
|
964
|
-
var
|
|
965
|
-
var
|
|
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
|
|
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
|
-
|
|
2018
|
+
Link2.extend({
|
|
1003
2019
|
addInputRules() {
|
|
1004
2020
|
return [
|
|
1005
|
-
(0,
|
|
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
|
-
|
|
1025
|
-
|
|
2040
|
+
TaskList2,
|
|
2041
|
+
TaskItem2.extend({
|
|
1026
2042
|
addInputRules() {
|
|
1027
2043
|
return [
|
|
1028
|
-
(0,
|
|
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
|
-
|
|
2063
|
+
extensions2.push(
|
|
1048
2064
|
CharacterCount.configure({
|
|
1049
2065
|
limit: characterLimit
|
|
1050
2066
|
})
|
|
1051
2067
|
);
|
|
1052
2068
|
}
|
|
1053
2069
|
if (enableSmilies) {
|
|
1054
|
-
|
|
2070
|
+
extensions2.push(SmilieReplacer);
|
|
1055
2071
|
}
|
|
1056
2072
|
if (enableColorHighlighter) {
|
|
1057
|
-
|
|
2073
|
+
extensions2.push(ColorHighlighter);
|
|
1058
2074
|
}
|
|
1059
2075
|
if (options.mention) {
|
|
1060
2076
|
const mentionConfig = typeof options.mention === "object" ? options.mention : {};
|
|
1061
|
-
|
|
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
|
-
|
|
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
|
|
1204
|
-
var
|
|
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
|
-
|
|
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
|
|
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
|
|
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 =
|
|
2318
|
+
const node = import_model2.Node.fromJSON(schema, nodeJson);
|
|
1261
2319
|
nodes.push(node);
|
|
1262
2320
|
} catch {
|
|
1263
2321
|
}
|
|
1264
2322
|
});
|
|
1265
|
-
return
|
|
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
|
}
|
|
@@ -2593,6 +3666,7 @@ var SpreadsheetController = class {
|
|
|
2593
3666
|
GradientText,
|
|
2594
3667
|
INSTRUCTION_REGEX,
|
|
2595
3668
|
LoadingNode,
|
|
3669
|
+
Markdown,
|
|
2596
3670
|
Mention,
|
|
2597
3671
|
SlashCommands,
|
|
2598
3672
|
SmilieReplacer,
|
|
@@ -2611,6 +3685,7 @@ var SpreadsheetController = class {
|
|
|
2611
3685
|
extractTemplateNames,
|
|
2612
3686
|
extractVariableNames,
|
|
2613
3687
|
findHexColors,
|
|
3688
|
+
getEditorMarkdown,
|
|
2614
3689
|
getEditorText,
|
|
2615
3690
|
getLatestVersion,
|
|
2616
3691
|
htmlToPlainText,
|
|
@@ -2618,6 +3693,7 @@ var SpreadsheetController = class {
|
|
|
2618
3693
|
instructionRegex,
|
|
2619
3694
|
mapRawOffsetToResolved,
|
|
2620
3695
|
mapResolvedOffsetToRaw,
|
|
3696
|
+
markdownToTipTapHtml,
|
|
2621
3697
|
parseCellReference,
|
|
2622
3698
|
parseFormula,
|
|
2623
3699
|
parseRange,
|