@pixerate/editor 0.4.5 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/index.cjs +1056 -25
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.d.cts +10 -1
- package/dist/extensions/index.d.ts +10 -1
- package/dist/extensions/index.js +1058 -25
- package/dist/extensions/index.js.map +1 -1
- package/dist/index.cjs +1110 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -2
- package/dist/index.d.ts +9 -2
- package/dist/index.js +1106 -30
- package/dist/index.js.map +1 -1
- package/dist/serializers/index.cjs +34 -0
- package/dist/serializers/index.cjs.map +1 -1
- package/dist/serializers/index.d.cts +12 -1
- package/dist/serializers/index.d.ts +12 -1
- package/dist/serializers/index.js +22 -0
- package/dist/serializers/index.js.map +1 -1
- package/package.json +7 -2
package/dist/index.js
CHANGED
|
@@ -636,8 +636,8 @@ var TemplateSuggestions = Extension2.create({
|
|
|
636
636
|
});
|
|
637
637
|
|
|
638
638
|
// src/extensions/loading-node.ts
|
|
639
|
-
import { Node, mergeAttributes } from "@tiptap/core";
|
|
640
|
-
var LoadingNode =
|
|
639
|
+
import { Node as Node2, mergeAttributes } from "@tiptap/core";
|
|
640
|
+
var LoadingNode = Node2.create({
|
|
641
641
|
name: "loadingNode",
|
|
642
642
|
group: "inline",
|
|
643
643
|
inline: true,
|
|
@@ -809,7 +809,10 @@ var FontSize = Extension5.create({
|
|
|
809
809
|
});
|
|
810
810
|
|
|
811
811
|
// src/extensions/rich-text-preset.ts
|
|
812
|
-
import {
|
|
812
|
+
import {
|
|
813
|
+
wrappingInputRule,
|
|
814
|
+
markInputRule
|
|
815
|
+
} from "@tiptap/core";
|
|
813
816
|
import * as _StarterKit from "@tiptap/starter-kit";
|
|
814
817
|
import * as _Color from "@tiptap/extension-color";
|
|
815
818
|
import * as _Highlight from "@tiptap/extension-highlight";
|
|
@@ -870,20 +873,1033 @@ function createMentionExtension(options = {}) {
|
|
|
870
873
|
});
|
|
871
874
|
}
|
|
872
875
|
|
|
873
|
-
//
|
|
876
|
+
// ../../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
|
|
877
|
+
import { Extension as Extension6, Mark as Mark2, getHTMLFromFragment, Node as Node$1, extensions } from "@tiptap/core";
|
|
878
|
+
import { MarkdownSerializerState as MarkdownSerializerState$1, defaultMarkdownSerializer } from "prosemirror-markdown";
|
|
879
|
+
import markdownit from "markdown-it";
|
|
880
|
+
import { Fragment, DOMParser } from "@tiptap/pm/model";
|
|
881
|
+
import taskListPlugin from "markdown-it-task-lists";
|
|
882
|
+
import { Plugin as Plugin4, PluginKey } from "@tiptap/pm/state";
|
|
883
|
+
var __defProp = Object.defineProperty;
|
|
884
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
885
|
+
var __publicField = (obj, key, value) => {
|
|
886
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
887
|
+
return value;
|
|
888
|
+
};
|
|
889
|
+
var MarkdownTightLists = Extension6.create({
|
|
890
|
+
name: "markdownTightLists",
|
|
891
|
+
addOptions: () => ({
|
|
892
|
+
tight: true,
|
|
893
|
+
tightClass: "tight",
|
|
894
|
+
listTypes: ["bulletList", "orderedList"]
|
|
895
|
+
}),
|
|
896
|
+
addGlobalAttributes() {
|
|
897
|
+
return [{
|
|
898
|
+
types: this.options.listTypes,
|
|
899
|
+
attributes: {
|
|
900
|
+
tight: {
|
|
901
|
+
default: this.options.tight,
|
|
902
|
+
parseHTML: (element) => element.getAttribute("data-tight") === "true" || !element.querySelector("p"),
|
|
903
|
+
renderHTML: (attributes) => ({
|
|
904
|
+
class: attributes.tight ? this.options.tightClass : null,
|
|
905
|
+
"data-tight": attributes.tight ? "true" : null
|
|
906
|
+
})
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
}];
|
|
910
|
+
},
|
|
911
|
+
addCommands() {
|
|
912
|
+
var _this = this;
|
|
913
|
+
return {
|
|
914
|
+
toggleTight: function() {
|
|
915
|
+
let tight = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : null;
|
|
916
|
+
return (_ref) => {
|
|
917
|
+
let {
|
|
918
|
+
editor,
|
|
919
|
+
commands
|
|
920
|
+
} = _ref;
|
|
921
|
+
function toggleTight(name) {
|
|
922
|
+
if (!editor.isActive(name)) {
|
|
923
|
+
return false;
|
|
924
|
+
}
|
|
925
|
+
const attrs = editor.getAttributes(name);
|
|
926
|
+
return commands.updateAttributes(name, {
|
|
927
|
+
tight: tight !== null && tight !== void 0 ? tight : !(attrs !== null && attrs !== void 0 && attrs.tight)
|
|
928
|
+
});
|
|
929
|
+
}
|
|
930
|
+
return _this.options.listTypes.some((name) => toggleTight(name));
|
|
931
|
+
};
|
|
932
|
+
}
|
|
933
|
+
};
|
|
934
|
+
}
|
|
935
|
+
});
|
|
936
|
+
var md = markdownit();
|
|
937
|
+
function scanDelims(text, pos) {
|
|
938
|
+
md.inline.State.prototype.scanDelims.call({
|
|
939
|
+
src: text,
|
|
940
|
+
posMax: text.length
|
|
941
|
+
});
|
|
942
|
+
const state = new md.inline.State(text, null, null, []);
|
|
943
|
+
return state.scanDelims(pos, true);
|
|
944
|
+
}
|
|
945
|
+
function shiftDelim(text, delim, start, offset) {
|
|
946
|
+
let res = text.substring(0, start) + text.substring(start + delim.length);
|
|
947
|
+
res = res.substring(0, start + offset) + delim + res.substring(start + offset);
|
|
948
|
+
return res;
|
|
949
|
+
}
|
|
950
|
+
function trimStart(text, delim, from, to) {
|
|
951
|
+
let pos = from, res = text;
|
|
952
|
+
while (pos < to) {
|
|
953
|
+
if (scanDelims(res, pos).can_open) {
|
|
954
|
+
break;
|
|
955
|
+
}
|
|
956
|
+
res = shiftDelim(res, delim, pos, 1);
|
|
957
|
+
pos++;
|
|
958
|
+
}
|
|
959
|
+
return {
|
|
960
|
+
text: res,
|
|
961
|
+
from: pos,
|
|
962
|
+
to
|
|
963
|
+
};
|
|
964
|
+
}
|
|
965
|
+
function trimEnd(text, delim, from, to) {
|
|
966
|
+
let pos = to, res = text;
|
|
967
|
+
while (pos > from) {
|
|
968
|
+
if (scanDelims(res, pos).can_close) {
|
|
969
|
+
break;
|
|
970
|
+
}
|
|
971
|
+
res = shiftDelim(res, delim, pos, -1);
|
|
972
|
+
pos--;
|
|
973
|
+
}
|
|
974
|
+
return {
|
|
975
|
+
text: res,
|
|
976
|
+
from,
|
|
977
|
+
to: pos
|
|
978
|
+
};
|
|
979
|
+
}
|
|
980
|
+
function trimInline(text, delim, from, to) {
|
|
981
|
+
let state = {
|
|
982
|
+
text,
|
|
983
|
+
from,
|
|
984
|
+
to
|
|
985
|
+
};
|
|
986
|
+
state = trimStart(state.text, delim, state.from, state.to);
|
|
987
|
+
state = trimEnd(state.text, delim, state.from, state.to);
|
|
988
|
+
if (state.to - state.from < delim.length + 1) {
|
|
989
|
+
state.text = state.text.substring(0, state.from) + state.text.substring(state.to + delim.length);
|
|
990
|
+
}
|
|
991
|
+
return state.text;
|
|
992
|
+
}
|
|
993
|
+
var MarkdownSerializerState = class extends MarkdownSerializerState$1 {
|
|
994
|
+
constructor(nodes, marks, options) {
|
|
995
|
+
super(nodes, marks, options !== null && options !== void 0 ? options : {});
|
|
996
|
+
__publicField(this, "inTable", false);
|
|
997
|
+
this.inlines = [];
|
|
998
|
+
}
|
|
999
|
+
render(node, parent, index) {
|
|
1000
|
+
super.render(node, parent, index);
|
|
1001
|
+
const top = this.inlines[this.inlines.length - 1];
|
|
1002
|
+
if (top !== null && top !== void 0 && top.start && top !== null && top !== void 0 && top.end) {
|
|
1003
|
+
const {
|
|
1004
|
+
delimiter,
|
|
1005
|
+
start,
|
|
1006
|
+
end
|
|
1007
|
+
} = this.normalizeInline(top);
|
|
1008
|
+
this.out = trimInline(this.out, delimiter, start, end);
|
|
1009
|
+
this.inlines.pop();
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
markString(mark, open, parent, index) {
|
|
1013
|
+
const info = this.marks[mark.type.name];
|
|
1014
|
+
if (info.expelEnclosingWhitespace) {
|
|
1015
|
+
if (open) {
|
|
1016
|
+
this.inlines.push({
|
|
1017
|
+
start: this.out.length,
|
|
1018
|
+
delimiter: info.open
|
|
1019
|
+
});
|
|
1020
|
+
} else {
|
|
1021
|
+
const top = this.inlines.pop();
|
|
1022
|
+
this.inlines.push({
|
|
1023
|
+
...top,
|
|
1024
|
+
end: this.out.length
|
|
1025
|
+
});
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
return super.markString(mark, open, parent, index);
|
|
1029
|
+
}
|
|
1030
|
+
normalizeInline(inline) {
|
|
1031
|
+
let {
|
|
1032
|
+
start,
|
|
1033
|
+
end
|
|
1034
|
+
} = inline;
|
|
1035
|
+
while (this.out.charAt(start).match(/\s/)) {
|
|
1036
|
+
start++;
|
|
1037
|
+
}
|
|
1038
|
+
return {
|
|
1039
|
+
...inline,
|
|
1040
|
+
start
|
|
1041
|
+
};
|
|
1042
|
+
}
|
|
1043
|
+
};
|
|
1044
|
+
var HTMLMark = Mark2.create({
|
|
1045
|
+
name: "markdownHTMLMark",
|
|
1046
|
+
/**
|
|
1047
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1048
|
+
*/
|
|
1049
|
+
addStorage() {
|
|
1050
|
+
return {
|
|
1051
|
+
markdown: {
|
|
1052
|
+
serialize: {
|
|
1053
|
+
open(state, mark) {
|
|
1054
|
+
var _getMarkTags$, _getMarkTags;
|
|
1055
|
+
if (!this.editor.storage.markdown.options.html) {
|
|
1056
|
+
console.warn(`Tiptap Markdown: "${mark.type.name}" mark is only available in html mode`);
|
|
1057
|
+
return "";
|
|
1058
|
+
}
|
|
1059
|
+
return (_getMarkTags$ = (_getMarkTags = getMarkTags(mark)) === null || _getMarkTags === void 0 ? void 0 : _getMarkTags[0]) !== null && _getMarkTags$ !== void 0 ? _getMarkTags$ : "";
|
|
1060
|
+
},
|
|
1061
|
+
close(state, mark) {
|
|
1062
|
+
var _getMarkTags$2, _getMarkTags2;
|
|
1063
|
+
if (!this.editor.storage.markdown.options.html) {
|
|
1064
|
+
return "";
|
|
1065
|
+
}
|
|
1066
|
+
return (_getMarkTags$2 = (_getMarkTags2 = getMarkTags(mark)) === null || _getMarkTags2 === void 0 ? void 0 : _getMarkTags2[1]) !== null && _getMarkTags$2 !== void 0 ? _getMarkTags$2 : "";
|
|
1067
|
+
}
|
|
1068
|
+
},
|
|
1069
|
+
parse: {
|
|
1070
|
+
// handled by markdown-it
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
};
|
|
1074
|
+
}
|
|
1075
|
+
});
|
|
1076
|
+
function getMarkTags(mark) {
|
|
1077
|
+
const schema = mark.type.schema;
|
|
1078
|
+
const node = schema.text(" ", [mark]);
|
|
1079
|
+
const html = getHTMLFromFragment(Fragment.from(node), schema);
|
|
1080
|
+
const match = html.match(/^(<.*?>) (<\/.*?>)$/);
|
|
1081
|
+
return match ? [match[1], match[2]] : null;
|
|
1082
|
+
}
|
|
1083
|
+
function elementFromString(value) {
|
|
1084
|
+
const wrappedValue = `<body>${value}</body>`;
|
|
1085
|
+
return new window.DOMParser().parseFromString(wrappedValue, "text/html").body;
|
|
1086
|
+
}
|
|
1087
|
+
function escapeHTML(value) {
|
|
1088
|
+
return value === null || value === void 0 ? void 0 : value.replace(/</g, "<").replace(/>/g, ">");
|
|
1089
|
+
}
|
|
1090
|
+
function extractElement(node) {
|
|
1091
|
+
const parent = node.parentElement;
|
|
1092
|
+
const prepend = parent.cloneNode();
|
|
1093
|
+
while (parent.firstChild && parent.firstChild !== node) {
|
|
1094
|
+
prepend.appendChild(parent.firstChild);
|
|
1095
|
+
}
|
|
1096
|
+
if (prepend.childNodes.length > 0) {
|
|
1097
|
+
parent.parentElement.insertBefore(prepend, parent);
|
|
1098
|
+
}
|
|
1099
|
+
parent.parentElement.insertBefore(node, parent);
|
|
1100
|
+
if (parent.childNodes.length === 0) {
|
|
1101
|
+
parent.remove();
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
function unwrapElement(node) {
|
|
1105
|
+
const parent = node.parentNode;
|
|
1106
|
+
while (node.firstChild)
|
|
1107
|
+
parent.insertBefore(node.firstChild, node);
|
|
1108
|
+
parent.removeChild(node);
|
|
1109
|
+
}
|
|
1110
|
+
var HTMLNode = Node$1.create({
|
|
1111
|
+
name: "markdownHTMLNode",
|
|
1112
|
+
addStorage() {
|
|
1113
|
+
return {
|
|
1114
|
+
markdown: {
|
|
1115
|
+
serialize(state, node, parent) {
|
|
1116
|
+
if (this.editor.storage.markdown.options.html) {
|
|
1117
|
+
state.write(serializeHTML(node, parent));
|
|
1118
|
+
} else {
|
|
1119
|
+
console.warn(`Tiptap Markdown: "${node.type.name}" node is only available in html mode`);
|
|
1120
|
+
state.write(`[${node.type.name}]`);
|
|
1121
|
+
}
|
|
1122
|
+
if (node.isBlock) {
|
|
1123
|
+
state.closeBlock(node);
|
|
1124
|
+
}
|
|
1125
|
+
},
|
|
1126
|
+
parse: {
|
|
1127
|
+
// handled by markdown-it
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
};
|
|
1131
|
+
}
|
|
1132
|
+
});
|
|
1133
|
+
function serializeHTML(node, parent) {
|
|
1134
|
+
const schema = node.type.schema;
|
|
1135
|
+
const html = getHTMLFromFragment(Fragment.from(node), schema);
|
|
1136
|
+
if (node.isBlock && (parent instanceof Fragment || parent.type.name === schema.topNodeType.name)) {
|
|
1137
|
+
return formatBlock(html);
|
|
1138
|
+
}
|
|
1139
|
+
return html;
|
|
1140
|
+
}
|
|
1141
|
+
function formatBlock(html) {
|
|
1142
|
+
const dom = elementFromString(html);
|
|
1143
|
+
const element = dom.firstElementChild;
|
|
1144
|
+
element.innerHTML = element.innerHTML.trim() ? `
|
|
1145
|
+
${element.innerHTML}
|
|
1146
|
+
` : `
|
|
1147
|
+
`;
|
|
1148
|
+
return element.outerHTML;
|
|
1149
|
+
}
|
|
1150
|
+
var Blockquote = Node$1.create({
|
|
1151
|
+
name: "blockquote"
|
|
1152
|
+
});
|
|
1153
|
+
var Blockquote$1 = Blockquote.extend({
|
|
1154
|
+
/**
|
|
1155
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1156
|
+
*/
|
|
1157
|
+
addStorage() {
|
|
1158
|
+
return {
|
|
1159
|
+
markdown: {
|
|
1160
|
+
serialize: defaultMarkdownSerializer.nodes.blockquote,
|
|
1161
|
+
parse: {
|
|
1162
|
+
// handled by markdown-it
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
};
|
|
1166
|
+
}
|
|
1167
|
+
});
|
|
1168
|
+
var BulletList = Node$1.create({
|
|
1169
|
+
name: "bulletList"
|
|
1170
|
+
});
|
|
1171
|
+
var BulletList$1 = BulletList.extend({
|
|
1172
|
+
/**
|
|
1173
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1174
|
+
*/
|
|
1175
|
+
addStorage() {
|
|
1176
|
+
return {
|
|
1177
|
+
markdown: {
|
|
1178
|
+
serialize(state, node) {
|
|
1179
|
+
return state.renderList(node, " ", () => (this.editor.storage.markdown.options.bulletListMarker || "-") + " ");
|
|
1180
|
+
},
|
|
1181
|
+
parse: {
|
|
1182
|
+
// handled by markdown-it
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
};
|
|
1186
|
+
}
|
|
1187
|
+
});
|
|
1188
|
+
var CodeBlock = Node$1.create({
|
|
1189
|
+
name: "codeBlock"
|
|
1190
|
+
});
|
|
1191
|
+
var CodeBlock$1 = CodeBlock.extend({
|
|
1192
|
+
/**
|
|
1193
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1194
|
+
*/
|
|
1195
|
+
addStorage() {
|
|
1196
|
+
return {
|
|
1197
|
+
markdown: {
|
|
1198
|
+
serialize(state, node) {
|
|
1199
|
+
state.write("```" + (node.attrs.language || "") + "\n");
|
|
1200
|
+
state.text(node.textContent, false);
|
|
1201
|
+
state.ensureNewLine();
|
|
1202
|
+
state.write("```");
|
|
1203
|
+
state.closeBlock(node);
|
|
1204
|
+
},
|
|
1205
|
+
parse: {
|
|
1206
|
+
setup(markdownit2) {
|
|
1207
|
+
var _this$options$languag;
|
|
1208
|
+
markdownit2.set({
|
|
1209
|
+
langPrefix: (_this$options$languag = this.options.languageClassPrefix) !== null && _this$options$languag !== void 0 ? _this$options$languag : "language-"
|
|
1210
|
+
});
|
|
1211
|
+
},
|
|
1212
|
+
updateDOM(element) {
|
|
1213
|
+
element.innerHTML = element.innerHTML.replace(/\n<\/code><\/pre>/g, "</code></pre>");
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
};
|
|
1218
|
+
}
|
|
1219
|
+
});
|
|
1220
|
+
var HardBreak = Node$1.create({
|
|
1221
|
+
name: "hardBreak"
|
|
1222
|
+
});
|
|
1223
|
+
var HardBreak$1 = HardBreak.extend({
|
|
1224
|
+
/**
|
|
1225
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1226
|
+
*/
|
|
1227
|
+
addStorage() {
|
|
1228
|
+
return {
|
|
1229
|
+
markdown: {
|
|
1230
|
+
serialize(state, node, parent, index) {
|
|
1231
|
+
for (let i = index + 1; i < parent.childCount; i++)
|
|
1232
|
+
if (parent.child(i).type != node.type) {
|
|
1233
|
+
state.write(state.inTable ? HTMLNode.storage.markdown.serialize.call(this, state, node, parent) : "\\\n");
|
|
1234
|
+
return;
|
|
1235
|
+
}
|
|
1236
|
+
},
|
|
1237
|
+
parse: {
|
|
1238
|
+
// handled by markdown-it
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
};
|
|
1242
|
+
}
|
|
1243
|
+
});
|
|
1244
|
+
var Heading = Node$1.create({
|
|
1245
|
+
name: "heading"
|
|
1246
|
+
});
|
|
1247
|
+
var Heading$1 = Heading.extend({
|
|
1248
|
+
/**
|
|
1249
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1250
|
+
*/
|
|
1251
|
+
addStorage() {
|
|
1252
|
+
return {
|
|
1253
|
+
markdown: {
|
|
1254
|
+
serialize: defaultMarkdownSerializer.nodes.heading,
|
|
1255
|
+
parse: {
|
|
1256
|
+
// handled by markdown-it
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
};
|
|
1260
|
+
}
|
|
1261
|
+
});
|
|
1262
|
+
var HorizontalRule = Node$1.create({
|
|
1263
|
+
name: "horizontalRule"
|
|
1264
|
+
});
|
|
1265
|
+
var HorizontalRule$1 = HorizontalRule.extend({
|
|
1266
|
+
/**
|
|
1267
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1268
|
+
*/
|
|
1269
|
+
addStorage() {
|
|
1270
|
+
return {
|
|
1271
|
+
markdown: {
|
|
1272
|
+
serialize: defaultMarkdownSerializer.nodes.horizontal_rule,
|
|
1273
|
+
parse: {
|
|
1274
|
+
// handled by markdown-it
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
};
|
|
1278
|
+
}
|
|
1279
|
+
});
|
|
1280
|
+
var Image = Node$1.create({
|
|
1281
|
+
name: "image"
|
|
1282
|
+
});
|
|
1283
|
+
var Image$1 = Image.extend({
|
|
1284
|
+
/**
|
|
1285
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1286
|
+
*/
|
|
1287
|
+
addStorage() {
|
|
1288
|
+
return {
|
|
1289
|
+
markdown: {
|
|
1290
|
+
serialize: defaultMarkdownSerializer.nodes.image,
|
|
1291
|
+
parse: {
|
|
1292
|
+
// handled by markdown-it
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
};
|
|
1296
|
+
}
|
|
1297
|
+
});
|
|
1298
|
+
var ListItem = Node$1.create({
|
|
1299
|
+
name: "listItem"
|
|
1300
|
+
});
|
|
1301
|
+
var ListItem$1 = ListItem.extend({
|
|
1302
|
+
/**
|
|
1303
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1304
|
+
*/
|
|
1305
|
+
addStorage() {
|
|
1306
|
+
return {
|
|
1307
|
+
markdown: {
|
|
1308
|
+
serialize: defaultMarkdownSerializer.nodes.list_item,
|
|
1309
|
+
parse: {
|
|
1310
|
+
// handled by markdown-it
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
};
|
|
1314
|
+
}
|
|
1315
|
+
});
|
|
1316
|
+
var OrderedList = Node$1.create({
|
|
1317
|
+
name: "orderedList"
|
|
1318
|
+
});
|
|
1319
|
+
function findIndexOfAdjacentNode(node, parent, index) {
|
|
1320
|
+
let i = 0;
|
|
1321
|
+
for (; index - i > 0; i++) {
|
|
1322
|
+
if (parent.child(index - i - 1).type.name !== node.type.name) {
|
|
1323
|
+
break;
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
return i;
|
|
1327
|
+
}
|
|
1328
|
+
var OrderedList$1 = OrderedList.extend({
|
|
1329
|
+
/**
|
|
1330
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1331
|
+
*/
|
|
1332
|
+
addStorage() {
|
|
1333
|
+
return {
|
|
1334
|
+
markdown: {
|
|
1335
|
+
serialize(state, node, parent, index) {
|
|
1336
|
+
const start = node.attrs.start || 1;
|
|
1337
|
+
const maxW = String(start + node.childCount - 1).length;
|
|
1338
|
+
const space = state.repeat(" ", maxW + 2);
|
|
1339
|
+
const adjacentIndex = findIndexOfAdjacentNode(node, parent, index);
|
|
1340
|
+
const separator = adjacentIndex % 2 ? ") " : ". ";
|
|
1341
|
+
state.renderList(node, space, (i) => {
|
|
1342
|
+
const nStr = String(start + i);
|
|
1343
|
+
return state.repeat(" ", maxW - nStr.length) + nStr + separator;
|
|
1344
|
+
});
|
|
1345
|
+
},
|
|
1346
|
+
parse: {
|
|
1347
|
+
// handled by markdown-it
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
};
|
|
1351
|
+
}
|
|
1352
|
+
});
|
|
1353
|
+
var Paragraph = Node$1.create({
|
|
1354
|
+
name: "paragraph"
|
|
1355
|
+
});
|
|
1356
|
+
var Paragraph$1 = Paragraph.extend({
|
|
1357
|
+
/**
|
|
1358
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1359
|
+
*/
|
|
1360
|
+
addStorage() {
|
|
1361
|
+
return {
|
|
1362
|
+
markdown: {
|
|
1363
|
+
serialize: defaultMarkdownSerializer.nodes.paragraph,
|
|
1364
|
+
parse: {
|
|
1365
|
+
// handled by markdown-it
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1368
|
+
};
|
|
1369
|
+
}
|
|
1370
|
+
});
|
|
1371
|
+
function childNodes(node) {
|
|
1372
|
+
var _node$content$content, _node$content;
|
|
1373
|
+
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 : [];
|
|
1374
|
+
}
|
|
1375
|
+
var Table = Node$1.create({
|
|
1376
|
+
name: "table"
|
|
1377
|
+
});
|
|
1378
|
+
var Table$1 = Table.extend({
|
|
1379
|
+
/**
|
|
1380
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1381
|
+
*/
|
|
1382
|
+
addStorage() {
|
|
1383
|
+
return {
|
|
1384
|
+
markdown: {
|
|
1385
|
+
serialize(state, node, parent) {
|
|
1386
|
+
if (!isMarkdownSerializable(node)) {
|
|
1387
|
+
HTMLNode.storage.markdown.serialize.call(this, state, node, parent);
|
|
1388
|
+
return;
|
|
1389
|
+
}
|
|
1390
|
+
state.inTable = true;
|
|
1391
|
+
node.forEach((row, p, i) => {
|
|
1392
|
+
state.write("| ");
|
|
1393
|
+
row.forEach((col, p2, j) => {
|
|
1394
|
+
if (j) {
|
|
1395
|
+
state.write(" | ");
|
|
1396
|
+
}
|
|
1397
|
+
const cellContent = col.firstChild;
|
|
1398
|
+
if (cellContent.textContent.trim()) {
|
|
1399
|
+
state.renderInline(cellContent);
|
|
1400
|
+
}
|
|
1401
|
+
});
|
|
1402
|
+
state.write(" |");
|
|
1403
|
+
state.ensureNewLine();
|
|
1404
|
+
if (!i) {
|
|
1405
|
+
const delimiterRow = Array.from({
|
|
1406
|
+
length: row.childCount
|
|
1407
|
+
}).map(() => "---").join(" | ");
|
|
1408
|
+
state.write(`| ${delimiterRow} |`);
|
|
1409
|
+
state.ensureNewLine();
|
|
1410
|
+
}
|
|
1411
|
+
});
|
|
1412
|
+
state.closeBlock(node);
|
|
1413
|
+
state.inTable = false;
|
|
1414
|
+
},
|
|
1415
|
+
parse: {
|
|
1416
|
+
// handled by markdown-it
|
|
1417
|
+
}
|
|
1418
|
+
}
|
|
1419
|
+
};
|
|
1420
|
+
}
|
|
1421
|
+
});
|
|
1422
|
+
function hasSpan(node) {
|
|
1423
|
+
return node.attrs.colspan > 1 || node.attrs.rowspan > 1;
|
|
1424
|
+
}
|
|
1425
|
+
function isMarkdownSerializable(node) {
|
|
1426
|
+
const rows = childNodes(node);
|
|
1427
|
+
const firstRow = rows[0];
|
|
1428
|
+
const bodyRows = rows.slice(1);
|
|
1429
|
+
if (childNodes(firstRow).some((cell) => cell.type.name !== "tableHeader" || hasSpan(cell) || cell.childCount > 1)) {
|
|
1430
|
+
return false;
|
|
1431
|
+
}
|
|
1432
|
+
if (bodyRows.some((row) => childNodes(row).some((cell) => cell.type.name === "tableHeader" || hasSpan(cell) || cell.childCount > 1))) {
|
|
1433
|
+
return false;
|
|
1434
|
+
}
|
|
1435
|
+
return true;
|
|
1436
|
+
}
|
|
1437
|
+
var TaskItem = Node$1.create({
|
|
1438
|
+
name: "taskItem"
|
|
1439
|
+
});
|
|
1440
|
+
var TaskItem$1 = TaskItem.extend({
|
|
1441
|
+
/**
|
|
1442
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1443
|
+
*/
|
|
1444
|
+
addStorage() {
|
|
1445
|
+
return {
|
|
1446
|
+
markdown: {
|
|
1447
|
+
serialize(state, node) {
|
|
1448
|
+
const check = node.attrs.checked ? "[x]" : "[ ]";
|
|
1449
|
+
state.write(`${check} `);
|
|
1450
|
+
state.renderContent(node);
|
|
1451
|
+
},
|
|
1452
|
+
parse: {
|
|
1453
|
+
updateDOM(element) {
|
|
1454
|
+
[...element.querySelectorAll(".task-list-item")].forEach((item) => {
|
|
1455
|
+
const input = item.querySelector("input");
|
|
1456
|
+
item.setAttribute("data-type", "taskItem");
|
|
1457
|
+
if (input) {
|
|
1458
|
+
item.setAttribute("data-checked", input.checked);
|
|
1459
|
+
input.remove();
|
|
1460
|
+
}
|
|
1461
|
+
});
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
}
|
|
1465
|
+
};
|
|
1466
|
+
}
|
|
1467
|
+
});
|
|
1468
|
+
var TaskList = Node$1.create({
|
|
1469
|
+
name: "taskList"
|
|
1470
|
+
});
|
|
1471
|
+
var TaskList$1 = TaskList.extend({
|
|
1472
|
+
/**
|
|
1473
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1474
|
+
*/
|
|
1475
|
+
addStorage() {
|
|
1476
|
+
return {
|
|
1477
|
+
markdown: {
|
|
1478
|
+
serialize: BulletList$1.storage.markdown.serialize,
|
|
1479
|
+
parse: {
|
|
1480
|
+
setup(markdownit2) {
|
|
1481
|
+
markdownit2.use(taskListPlugin);
|
|
1482
|
+
},
|
|
1483
|
+
updateDOM(element) {
|
|
1484
|
+
[...element.querySelectorAll(".contains-task-list")].forEach((list) => {
|
|
1485
|
+
list.setAttribute("data-type", "taskList");
|
|
1486
|
+
});
|
|
1487
|
+
}
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1490
|
+
};
|
|
1491
|
+
}
|
|
1492
|
+
});
|
|
1493
|
+
var Text = Node$1.create({
|
|
1494
|
+
name: "text"
|
|
1495
|
+
});
|
|
1496
|
+
var Text$1 = Text.extend({
|
|
1497
|
+
/**
|
|
1498
|
+
* @return {{markdown: MarkdownNodeSpec}}
|
|
1499
|
+
*/
|
|
1500
|
+
addStorage() {
|
|
1501
|
+
return {
|
|
1502
|
+
markdown: {
|
|
1503
|
+
serialize(state, node) {
|
|
1504
|
+
state.text(escapeHTML(node.text));
|
|
1505
|
+
},
|
|
1506
|
+
parse: {
|
|
1507
|
+
// handled by markdown-it
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
};
|
|
1511
|
+
}
|
|
1512
|
+
});
|
|
1513
|
+
var Bold = Mark2.create({
|
|
1514
|
+
name: "bold"
|
|
1515
|
+
});
|
|
1516
|
+
var Bold$1 = Bold.extend({
|
|
1517
|
+
/**
|
|
1518
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1519
|
+
*/
|
|
1520
|
+
addStorage() {
|
|
1521
|
+
return {
|
|
1522
|
+
markdown: {
|
|
1523
|
+
serialize: defaultMarkdownSerializer.marks.strong,
|
|
1524
|
+
parse: {
|
|
1525
|
+
// handled by markdown-it
|
|
1526
|
+
}
|
|
1527
|
+
}
|
|
1528
|
+
};
|
|
1529
|
+
}
|
|
1530
|
+
});
|
|
1531
|
+
var Code = Mark2.create({
|
|
1532
|
+
name: "code"
|
|
1533
|
+
});
|
|
1534
|
+
var Code$1 = Code.extend({
|
|
1535
|
+
/**
|
|
1536
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1537
|
+
*/
|
|
1538
|
+
addStorage() {
|
|
1539
|
+
return {
|
|
1540
|
+
markdown: {
|
|
1541
|
+
serialize: defaultMarkdownSerializer.marks.code,
|
|
1542
|
+
parse: {
|
|
1543
|
+
// handled by markdown-it
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
};
|
|
1547
|
+
}
|
|
1548
|
+
});
|
|
1549
|
+
var Italic = Mark2.create({
|
|
1550
|
+
name: "italic"
|
|
1551
|
+
});
|
|
1552
|
+
var Italic$1 = Italic.extend({
|
|
1553
|
+
/**
|
|
1554
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1555
|
+
*/
|
|
1556
|
+
addStorage() {
|
|
1557
|
+
return {
|
|
1558
|
+
markdown: {
|
|
1559
|
+
serialize: defaultMarkdownSerializer.marks.em,
|
|
1560
|
+
parse: {
|
|
1561
|
+
// handled by markdown-it
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
};
|
|
1565
|
+
}
|
|
1566
|
+
});
|
|
1567
|
+
var Link = Mark2.create({
|
|
1568
|
+
name: "link"
|
|
1569
|
+
});
|
|
1570
|
+
var Link$1 = Link.extend({
|
|
1571
|
+
/**
|
|
1572
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1573
|
+
*/
|
|
1574
|
+
addStorage() {
|
|
1575
|
+
return {
|
|
1576
|
+
markdown: {
|
|
1577
|
+
serialize: defaultMarkdownSerializer.marks.link,
|
|
1578
|
+
parse: {
|
|
1579
|
+
// handled by markdown-it
|
|
1580
|
+
}
|
|
1581
|
+
}
|
|
1582
|
+
};
|
|
1583
|
+
}
|
|
1584
|
+
});
|
|
1585
|
+
var Strike = Mark2.create({
|
|
1586
|
+
name: "strike"
|
|
1587
|
+
});
|
|
1588
|
+
var Strike$1 = Strike.extend({
|
|
1589
|
+
/**
|
|
1590
|
+
* @return {{markdown: MarkdownMarkSpec}}
|
|
1591
|
+
*/
|
|
1592
|
+
addStorage() {
|
|
1593
|
+
return {
|
|
1594
|
+
markdown: {
|
|
1595
|
+
serialize: {
|
|
1596
|
+
open: "~~",
|
|
1597
|
+
close: "~~",
|
|
1598
|
+
expelEnclosingWhitespace: true
|
|
1599
|
+
},
|
|
1600
|
+
parse: {
|
|
1601
|
+
// handled by markdown-it
|
|
1602
|
+
}
|
|
1603
|
+
}
|
|
1604
|
+
};
|
|
1605
|
+
}
|
|
1606
|
+
});
|
|
1607
|
+
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];
|
|
1608
|
+
function getMarkdownSpec(extension) {
|
|
1609
|
+
var _extension$storage, _markdownExtensions$f;
|
|
1610
|
+
const markdownSpec = (_extension$storage = extension.storage) === null || _extension$storage === void 0 ? void 0 : _extension$storage.markdown;
|
|
1611
|
+
const defaultMarkdownSpec = (_markdownExtensions$f = markdownExtensions.find((e) => e.name === extension.name)) === null || _markdownExtensions$f === void 0 ? void 0 : _markdownExtensions$f.storage.markdown;
|
|
1612
|
+
if (markdownSpec || defaultMarkdownSpec) {
|
|
1613
|
+
return {
|
|
1614
|
+
...defaultMarkdownSpec,
|
|
1615
|
+
...markdownSpec
|
|
1616
|
+
};
|
|
1617
|
+
}
|
|
1618
|
+
return null;
|
|
1619
|
+
}
|
|
1620
|
+
var MarkdownSerializer = class {
|
|
1621
|
+
constructor(editor) {
|
|
1622
|
+
__publicField(this, "editor", null);
|
|
1623
|
+
this.editor = editor;
|
|
1624
|
+
}
|
|
1625
|
+
serialize(content) {
|
|
1626
|
+
const state = new MarkdownSerializerState(this.nodes, this.marks, {
|
|
1627
|
+
hardBreakNodeName: HardBreak$1.name
|
|
1628
|
+
});
|
|
1629
|
+
state.renderContent(content);
|
|
1630
|
+
return state.out;
|
|
1631
|
+
}
|
|
1632
|
+
get nodes() {
|
|
1633
|
+
var _this$editor$extensio;
|
|
1634
|
+
return {
|
|
1635
|
+
...Object.fromEntries(Object.keys(this.editor.schema.nodes).map((name) => [name, this.serializeNode(HTMLNode)])),
|
|
1636
|
+
...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 : [])
|
|
1637
|
+
};
|
|
1638
|
+
}
|
|
1639
|
+
get marks() {
|
|
1640
|
+
var _this$editor$extensio2;
|
|
1641
|
+
return {
|
|
1642
|
+
...Object.fromEntries(Object.keys(this.editor.schema.marks).map((name) => [name, this.serializeMark(HTMLMark)])),
|
|
1643
|
+
...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 : [])
|
|
1644
|
+
};
|
|
1645
|
+
}
|
|
1646
|
+
serializeNode(node) {
|
|
1647
|
+
var _getMarkdownSpec;
|
|
1648
|
+
return (_getMarkdownSpec = getMarkdownSpec(node)) === null || _getMarkdownSpec === void 0 || (_getMarkdownSpec = _getMarkdownSpec.serialize) === null || _getMarkdownSpec === void 0 ? void 0 : _getMarkdownSpec.bind({
|
|
1649
|
+
editor: this.editor,
|
|
1650
|
+
options: node.options
|
|
1651
|
+
});
|
|
1652
|
+
}
|
|
1653
|
+
serializeMark(mark) {
|
|
1654
|
+
var _getMarkdownSpec2;
|
|
1655
|
+
const serialize = (_getMarkdownSpec2 = getMarkdownSpec(mark)) === null || _getMarkdownSpec2 === void 0 ? void 0 : _getMarkdownSpec2.serialize;
|
|
1656
|
+
return serialize ? {
|
|
1657
|
+
...serialize,
|
|
1658
|
+
open: typeof serialize.open === "function" ? serialize.open.bind({
|
|
1659
|
+
editor: this.editor,
|
|
1660
|
+
options: mark.options
|
|
1661
|
+
}) : serialize.open,
|
|
1662
|
+
close: typeof serialize.close === "function" ? serialize.close.bind({
|
|
1663
|
+
editor: this.editor,
|
|
1664
|
+
options: mark.options
|
|
1665
|
+
}) : serialize.close
|
|
1666
|
+
} : null;
|
|
1667
|
+
}
|
|
1668
|
+
};
|
|
1669
|
+
var MarkdownParser = class {
|
|
1670
|
+
constructor(editor, _ref) {
|
|
1671
|
+
__publicField(this, "editor", null);
|
|
1672
|
+
__publicField(this, "md", null);
|
|
1673
|
+
let {
|
|
1674
|
+
html,
|
|
1675
|
+
linkify,
|
|
1676
|
+
breaks
|
|
1677
|
+
} = _ref;
|
|
1678
|
+
this.editor = editor;
|
|
1679
|
+
this.md = this.withPatchedRenderer(markdownit({
|
|
1680
|
+
html,
|
|
1681
|
+
linkify,
|
|
1682
|
+
breaks
|
|
1683
|
+
}));
|
|
1684
|
+
}
|
|
1685
|
+
parse(content) {
|
|
1686
|
+
let {
|
|
1687
|
+
inline
|
|
1688
|
+
} = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
1689
|
+
if (typeof content === "string") {
|
|
1690
|
+
this.editor.extensionManager.extensions.forEach((extension) => {
|
|
1691
|
+
var _getMarkdownSpec;
|
|
1692
|
+
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({
|
|
1693
|
+
editor: this.editor,
|
|
1694
|
+
options: extension.options
|
|
1695
|
+
}, this.md);
|
|
1696
|
+
});
|
|
1697
|
+
const renderedHTML = this.md.render(content);
|
|
1698
|
+
const element = elementFromString(renderedHTML);
|
|
1699
|
+
this.editor.extensionManager.extensions.forEach((extension) => {
|
|
1700
|
+
var _getMarkdownSpec2;
|
|
1701
|
+
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({
|
|
1702
|
+
editor: this.editor,
|
|
1703
|
+
options: extension.options
|
|
1704
|
+
}, element);
|
|
1705
|
+
});
|
|
1706
|
+
this.normalizeDOM(element, {
|
|
1707
|
+
inline,
|
|
1708
|
+
content
|
|
1709
|
+
});
|
|
1710
|
+
return element.innerHTML;
|
|
1711
|
+
}
|
|
1712
|
+
return content;
|
|
1713
|
+
}
|
|
1714
|
+
normalizeDOM(node, _ref2) {
|
|
1715
|
+
let {
|
|
1716
|
+
inline,
|
|
1717
|
+
content
|
|
1718
|
+
} = _ref2;
|
|
1719
|
+
this.normalizeBlocks(node);
|
|
1720
|
+
node.querySelectorAll("*").forEach((el) => {
|
|
1721
|
+
var _el$nextSibling;
|
|
1722
|
+
if (((_el$nextSibling = el.nextSibling) === null || _el$nextSibling === void 0 ? void 0 : _el$nextSibling.nodeType) === Node.TEXT_NODE && !el.closest("pre")) {
|
|
1723
|
+
el.nextSibling.textContent = el.nextSibling.textContent.replace(/^\n/, "");
|
|
1724
|
+
}
|
|
1725
|
+
});
|
|
1726
|
+
if (inline) {
|
|
1727
|
+
this.normalizeInline(node, content);
|
|
1728
|
+
}
|
|
1729
|
+
return node;
|
|
1730
|
+
}
|
|
1731
|
+
normalizeBlocks(node) {
|
|
1732
|
+
const blocks = Object.values(this.editor.schema.nodes).filter((node2) => node2.isBlock);
|
|
1733
|
+
const selector = blocks.map((block) => {
|
|
1734
|
+
var _block$spec$parseDOM;
|
|
1735
|
+
return (_block$spec$parseDOM = block.spec.parseDOM) === null || _block$spec$parseDOM === void 0 ? void 0 : _block$spec$parseDOM.map((spec) => spec.tag);
|
|
1736
|
+
}).flat().filter(Boolean).join(",");
|
|
1737
|
+
if (!selector) {
|
|
1738
|
+
return;
|
|
1739
|
+
}
|
|
1740
|
+
[...node.querySelectorAll(selector)].forEach((el) => {
|
|
1741
|
+
if (el.parentElement.matches("p")) {
|
|
1742
|
+
extractElement(el);
|
|
1743
|
+
}
|
|
1744
|
+
});
|
|
1745
|
+
}
|
|
1746
|
+
normalizeInline(node, content) {
|
|
1747
|
+
var _node$firstElementChi;
|
|
1748
|
+
if ((_node$firstElementChi = node.firstElementChild) !== null && _node$firstElementChi !== void 0 && _node$firstElementChi.matches("p")) {
|
|
1749
|
+
var _content$match$, _content$match, _content$match$2, _content$match2;
|
|
1750
|
+
const firstParagraph = node.firstElementChild;
|
|
1751
|
+
const {
|
|
1752
|
+
nextElementSibling
|
|
1753
|
+
} = firstParagraph;
|
|
1754
|
+
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$ : "";
|
|
1755
|
+
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 : "" : "";
|
|
1756
|
+
if (content.match(/^\n\n/)) {
|
|
1757
|
+
firstParagraph.innerHTML = `${firstParagraph.innerHTML}${endSpaces}`;
|
|
1758
|
+
return;
|
|
1759
|
+
}
|
|
1760
|
+
unwrapElement(firstParagraph);
|
|
1761
|
+
node.innerHTML = `${startSpaces}${node.innerHTML}${endSpaces}`;
|
|
1762
|
+
}
|
|
1763
|
+
}
|
|
1764
|
+
/**
|
|
1765
|
+
* @param {markdownit} md
|
|
1766
|
+
*/
|
|
1767
|
+
withPatchedRenderer(md22) {
|
|
1768
|
+
const withoutNewLine = (renderer) => function() {
|
|
1769
|
+
const rendered = renderer(...arguments);
|
|
1770
|
+
if (rendered === "\n") {
|
|
1771
|
+
return rendered;
|
|
1772
|
+
}
|
|
1773
|
+
if (rendered[rendered.length - 1] === "\n") {
|
|
1774
|
+
return rendered.slice(0, -1);
|
|
1775
|
+
}
|
|
1776
|
+
return rendered;
|
|
1777
|
+
};
|
|
1778
|
+
md22.renderer.rules.hardbreak = withoutNewLine(md22.renderer.rules.hardbreak);
|
|
1779
|
+
md22.renderer.rules.softbreak = withoutNewLine(md22.renderer.rules.softbreak);
|
|
1780
|
+
md22.renderer.rules.fence = withoutNewLine(md22.renderer.rules.fence);
|
|
1781
|
+
md22.renderer.rules.code_block = withoutNewLine(md22.renderer.rules.code_block);
|
|
1782
|
+
md22.renderer.renderToken = withoutNewLine(md22.renderer.renderToken.bind(md22.renderer));
|
|
1783
|
+
return md22;
|
|
1784
|
+
}
|
|
1785
|
+
};
|
|
1786
|
+
var MarkdownClipboard = Extension6.create({
|
|
1787
|
+
name: "markdownClipboard",
|
|
1788
|
+
addOptions() {
|
|
1789
|
+
return {
|
|
1790
|
+
transformPastedText: false,
|
|
1791
|
+
transformCopiedText: false
|
|
1792
|
+
};
|
|
1793
|
+
},
|
|
1794
|
+
addProseMirrorPlugins() {
|
|
1795
|
+
return [new Plugin4({
|
|
1796
|
+
key: new PluginKey("markdownClipboard"),
|
|
1797
|
+
props: {
|
|
1798
|
+
clipboardTextParser: (text, context, plainText) => {
|
|
1799
|
+
if (plainText || !this.options.transformPastedText) {
|
|
1800
|
+
return null;
|
|
1801
|
+
}
|
|
1802
|
+
const parsed = this.editor.storage.markdown.parser.parse(text, {
|
|
1803
|
+
inline: true
|
|
1804
|
+
});
|
|
1805
|
+
return DOMParser.fromSchema(this.editor.schema).parseSlice(elementFromString(parsed), {
|
|
1806
|
+
preserveWhitespace: true,
|
|
1807
|
+
context
|
|
1808
|
+
});
|
|
1809
|
+
},
|
|
1810
|
+
/**
|
|
1811
|
+
* @param {import('prosemirror-model').Slice} slice
|
|
1812
|
+
*/
|
|
1813
|
+
clipboardTextSerializer: (slice) => {
|
|
1814
|
+
if (!this.options.transformCopiedText) {
|
|
1815
|
+
return null;
|
|
1816
|
+
}
|
|
1817
|
+
return this.editor.storage.markdown.serializer.serialize(slice.content);
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
})];
|
|
1821
|
+
}
|
|
1822
|
+
});
|
|
1823
|
+
var Markdown = Extension6.create({
|
|
1824
|
+
name: "markdown",
|
|
1825
|
+
priority: 50,
|
|
1826
|
+
addOptions() {
|
|
1827
|
+
return {
|
|
1828
|
+
html: true,
|
|
1829
|
+
tightLists: true,
|
|
1830
|
+
tightListClass: "tight",
|
|
1831
|
+
bulletListMarker: "-",
|
|
1832
|
+
linkify: false,
|
|
1833
|
+
breaks: false,
|
|
1834
|
+
transformPastedText: false,
|
|
1835
|
+
transformCopiedText: false
|
|
1836
|
+
};
|
|
1837
|
+
},
|
|
1838
|
+
addCommands() {
|
|
1839
|
+
const commands = extensions.Commands.config.addCommands();
|
|
1840
|
+
return {
|
|
1841
|
+
setContent: (content, emitUpdate, parseOptions) => (props) => {
|
|
1842
|
+
return commands.setContent(props.editor.storage.markdown.parser.parse(content), emitUpdate, parseOptions)(props);
|
|
1843
|
+
},
|
|
1844
|
+
insertContentAt: (range, content, options) => (props) => {
|
|
1845
|
+
return commands.insertContentAt(range, props.editor.storage.markdown.parser.parse(content, {
|
|
1846
|
+
inline: true
|
|
1847
|
+
}), options)(props);
|
|
1848
|
+
}
|
|
1849
|
+
};
|
|
1850
|
+
},
|
|
1851
|
+
onBeforeCreate() {
|
|
1852
|
+
this.editor.storage.markdown = {
|
|
1853
|
+
options: {
|
|
1854
|
+
...this.options
|
|
1855
|
+
},
|
|
1856
|
+
parser: new MarkdownParser(this.editor, this.options),
|
|
1857
|
+
serializer: new MarkdownSerializer(this.editor),
|
|
1858
|
+
getMarkdown: () => {
|
|
1859
|
+
return this.editor.storage.markdown.serializer.serialize(this.editor.state.doc);
|
|
1860
|
+
}
|
|
1861
|
+
};
|
|
1862
|
+
this.editor.options.initialContent = this.editor.options.content;
|
|
1863
|
+
this.editor.options.content = this.editor.storage.markdown.parser.parse(this.editor.options.content);
|
|
1864
|
+
},
|
|
1865
|
+
onCreate() {
|
|
1866
|
+
this.editor.options.content = this.editor.options.initialContent;
|
|
1867
|
+
delete this.editor.options.initialContent;
|
|
1868
|
+
},
|
|
1869
|
+
addStorage() {
|
|
1870
|
+
return {
|
|
1871
|
+
/// storage will be defined in onBeforeCreate() to prevent initial object overriding
|
|
1872
|
+
};
|
|
1873
|
+
},
|
|
1874
|
+
addExtensions() {
|
|
1875
|
+
return [MarkdownTightLists.configure({
|
|
1876
|
+
tight: this.options.tightLists,
|
|
1877
|
+
tightClass: this.options.tightListClass
|
|
1878
|
+
}), MarkdownClipboard.configure({
|
|
1879
|
+
transformPastedText: this.options.transformPastedText,
|
|
1880
|
+
transformCopiedText: this.options.transformCopiedText
|
|
1881
|
+
})];
|
|
1882
|
+
}
|
|
1883
|
+
});
|
|
1884
|
+
|
|
1885
|
+
// src/extensions/markdown.ts
|
|
874
1886
|
var resolveExt = (mod, name) => mod?.[name] || mod?.default?.[name] || mod?.default?.default || mod?.default || mod;
|
|
875
|
-
var
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
var
|
|
879
|
-
var
|
|
880
|
-
var
|
|
881
|
-
var
|
|
882
|
-
var
|
|
883
|
-
var
|
|
884
|
-
var
|
|
885
|
-
var
|
|
886
|
-
var
|
|
1887
|
+
var Markdown2 = resolveExt(Markdown, "Markdown");
|
|
1888
|
+
|
|
1889
|
+
// src/extensions/rich-text-preset.ts
|
|
1890
|
+
var resolveExt2 = (mod, name) => mod?.[name] || mod?.default?.[name] || mod?.default?.default || mod?.default || mod;
|
|
1891
|
+
var StarterKit = resolveExt2(_StarterKit, "StarterKit");
|
|
1892
|
+
var Color = resolveExt2(_Color, "Color");
|
|
1893
|
+
var Highlight = resolveExt2(_Highlight, "Highlight");
|
|
1894
|
+
var Link2 = resolveExt2(_Link, "Link");
|
|
1895
|
+
var TaskList2 = resolveExt2(_TaskList, "TaskList");
|
|
1896
|
+
var TaskItem2 = resolveExt2(_TaskItem, "TaskItem");
|
|
1897
|
+
var TextAlign = resolveExt2(_TextAlign, "TextAlign");
|
|
1898
|
+
var TextStyle = resolveExt2(_TextStyle, "TextStyle");
|
|
1899
|
+
var Typography = resolveExt2(_Typography, "Typography");
|
|
1900
|
+
var Underline = resolveExt2(_Underline, "Underline");
|
|
1901
|
+
var Placeholder = resolveExt2(_Placeholder, "Placeholder");
|
|
1902
|
+
var CharacterCount = resolveExt2(_CharacterCount, "CharacterCount");
|
|
887
1903
|
function createRichTextPreset(options = {}) {
|
|
888
1904
|
const {
|
|
889
1905
|
placeholder = "Start typing...",
|
|
@@ -893,7 +1909,7 @@ function createRichTextPreset(options = {}) {
|
|
|
893
1909
|
enableColorHighlighter = true,
|
|
894
1910
|
headingLevels = [1, 2, 3, 4]
|
|
895
1911
|
} = options;
|
|
896
|
-
const
|
|
1912
|
+
const extensions2 = [
|
|
897
1913
|
StarterKit.configure({
|
|
898
1914
|
orderedList: {
|
|
899
1915
|
HTMLAttributes: {
|
|
@@ -920,7 +1936,7 @@ function createRichTextPreset(options = {}) {
|
|
|
920
1936
|
TextAlign.configure({
|
|
921
1937
|
types: ["heading", "paragraph"]
|
|
922
1938
|
}),
|
|
923
|
-
|
|
1939
|
+
Link2.extend({
|
|
924
1940
|
addInputRules() {
|
|
925
1941
|
return [
|
|
926
1942
|
markInputRule({
|
|
@@ -942,8 +1958,8 @@ function createRichTextPreset(options = {}) {
|
|
|
942
1958
|
class: "text-blue-500 underline underline-offset-2"
|
|
943
1959
|
}
|
|
944
1960
|
}),
|
|
945
|
-
|
|
946
|
-
|
|
1961
|
+
TaskList2,
|
|
1962
|
+
TaskItem2.extend({
|
|
947
1963
|
addInputRules() {
|
|
948
1964
|
return [
|
|
949
1965
|
wrappingInputRule({
|
|
@@ -965,21 +1981,21 @@ function createRichTextPreset(options = {}) {
|
|
|
965
1981
|
})
|
|
966
1982
|
];
|
|
967
1983
|
if (characterLimit) {
|
|
968
|
-
|
|
1984
|
+
extensions2.push(
|
|
969
1985
|
CharacterCount.configure({
|
|
970
1986
|
limit: characterLimit
|
|
971
1987
|
})
|
|
972
1988
|
);
|
|
973
1989
|
}
|
|
974
1990
|
if (enableSmilies) {
|
|
975
|
-
|
|
1991
|
+
extensions2.push(SmilieReplacer);
|
|
976
1992
|
}
|
|
977
1993
|
if (enableColorHighlighter) {
|
|
978
|
-
|
|
1994
|
+
extensions2.push(ColorHighlighter);
|
|
979
1995
|
}
|
|
980
1996
|
if (options.mention) {
|
|
981
1997
|
const mentionConfig = typeof options.mention === "object" ? options.mention : {};
|
|
982
|
-
|
|
1998
|
+
extensions2.push(
|
|
983
1999
|
Mention.configure({
|
|
984
2000
|
HTMLAttributes: {
|
|
985
2001
|
class: "pixerate-mention-node",
|
|
@@ -989,7 +2005,23 @@ function createRichTextPreset(options = {}) {
|
|
|
989
2005
|
})
|
|
990
2006
|
);
|
|
991
2007
|
}
|
|
992
|
-
|
|
2008
|
+
if (options.markdown) {
|
|
2009
|
+
const markdownConfig = typeof options.markdown === "object" ? options.markdown : {};
|
|
2010
|
+
extensions2.push(
|
|
2011
|
+
Markdown2.configure({
|
|
2012
|
+
html: true,
|
|
2013
|
+
tightLists: true,
|
|
2014
|
+
tightListClass: "tight",
|
|
2015
|
+
bulletListMarker: "-",
|
|
2016
|
+
linkify: true,
|
|
2017
|
+
breaks: true,
|
|
2018
|
+
transformPastedText: true,
|
|
2019
|
+
transformCopiedText: true,
|
|
2020
|
+
...markdownConfig
|
|
2021
|
+
})
|
|
2022
|
+
);
|
|
2023
|
+
}
|
|
2024
|
+
return extensions2;
|
|
993
2025
|
}
|
|
994
2026
|
|
|
995
2027
|
// src/serializers/plain-text.ts
|
|
@@ -1120,13 +2152,35 @@ function extractMentionsFromDoc(docOrEditor) {
|
|
|
1120
2152
|
return mentions;
|
|
1121
2153
|
}
|
|
1122
2154
|
|
|
2155
|
+
// src/serializers/markdown.ts
|
|
2156
|
+
import MarkdownIt from "markdown-it";
|
|
2157
|
+
import taskLists from "markdown-it-task-lists";
|
|
2158
|
+
var md2 = new MarkdownIt({
|
|
2159
|
+
html: true,
|
|
2160
|
+
linkify: true,
|
|
2161
|
+
breaks: true
|
|
2162
|
+
}).use(taskLists);
|
|
2163
|
+
function markdownToTipTapHtml(markdown) {
|
|
2164
|
+
if (!markdown) return "<p></p>";
|
|
2165
|
+
return md2.render(markdown);
|
|
2166
|
+
}
|
|
2167
|
+
function getEditorMarkdown(editor) {
|
|
2168
|
+
if (!editor) return "";
|
|
2169
|
+
if (typeof editor.storage?.markdown?.getMarkdown === "function") {
|
|
2170
|
+
return editor.storage.markdown.getMarkdown();
|
|
2171
|
+
}
|
|
2172
|
+
return getEditorText(editor);
|
|
2173
|
+
}
|
|
2174
|
+
|
|
1123
2175
|
// src/controller.ts
|
|
1124
2176
|
import { Editor } from "@tiptap/core";
|
|
1125
|
-
import { Slice, Fragment, Node as ProsemirrorNode } from "@tiptap/pm/model";
|
|
2177
|
+
import { Slice, Fragment as Fragment2, Node as ProsemirrorNode } from "@tiptap/pm/model";
|
|
1126
2178
|
var EditorController = class {
|
|
1127
2179
|
editor;
|
|
1128
2180
|
plainTextMode;
|
|
2181
|
+
markdownMode;
|
|
1129
2182
|
onPlainTextChange;
|
|
2183
|
+
onMarkdownChange;
|
|
1130
2184
|
onTokensChange;
|
|
1131
2185
|
onSelectionChange;
|
|
1132
2186
|
constructor(options = {}) {
|
|
@@ -1134,21 +2188,25 @@ var EditorController = class {
|
|
|
1134
2188
|
element,
|
|
1135
2189
|
content,
|
|
1136
2190
|
plainTextMode = false,
|
|
1137
|
-
|
|
2191
|
+
markdownMode = false,
|
|
2192
|
+
extensions: extensions2 = [],
|
|
1138
2193
|
onPlainTextChange,
|
|
2194
|
+
onMarkdownChange,
|
|
1139
2195
|
onTokensChange,
|
|
1140
2196
|
onSelectionChange,
|
|
1141
2197
|
...editorOptions
|
|
1142
2198
|
} = options;
|
|
1143
2199
|
this.plainTextMode = plainTextMode;
|
|
2200
|
+
this.markdownMode = markdownMode;
|
|
1144
2201
|
this.onPlainTextChange = onPlainTextChange;
|
|
2202
|
+
this.onMarkdownChange = onMarkdownChange;
|
|
1145
2203
|
this.onTokensChange = onTokensChange;
|
|
1146
2204
|
this.onSelectionChange = onSelectionChange;
|
|
1147
|
-
const initialContent = plainTextMode && typeof content === "string" ? plainTextToTipTapHtml(content) : content;
|
|
2205
|
+
const initialContent = plainTextMode && typeof content === "string" ? plainTextToTipTapHtml(content) : markdownMode && typeof content === "string" ? markdownToTipTapHtml(content) : content;
|
|
1148
2206
|
this.editor = new Editor({
|
|
1149
2207
|
element: element || void 0,
|
|
1150
2208
|
content: initialContent,
|
|
1151
|
-
extensions,
|
|
2209
|
+
extensions: extensions2,
|
|
1152
2210
|
...editorOptions,
|
|
1153
2211
|
onUpdate: (props) => {
|
|
1154
2212
|
editorOptions.onUpdate?.(props);
|
|
@@ -1183,7 +2241,7 @@ var EditorController = class {
|
|
|
1183
2241
|
} catch {
|
|
1184
2242
|
}
|
|
1185
2243
|
});
|
|
1186
|
-
return Slice.maxOpen(
|
|
2244
|
+
return Slice.maxOpen(Fragment2.fromArray(nodes));
|
|
1187
2245
|
}
|
|
1188
2246
|
}
|
|
1189
2247
|
});
|
|
@@ -1197,6 +2255,10 @@ var EditorController = class {
|
|
|
1197
2255
|
this.onTokensChange(tokens);
|
|
1198
2256
|
}
|
|
1199
2257
|
}
|
|
2258
|
+
if (this.markdownMode || this.onMarkdownChange) {
|
|
2259
|
+
const markdown = this.getMarkdown();
|
|
2260
|
+
this.onMarkdownChange?.(markdown);
|
|
2261
|
+
}
|
|
1200
2262
|
}
|
|
1201
2263
|
handleSelectionUpdate() {
|
|
1202
2264
|
if (this.onSelectionChange) {
|
|
@@ -1211,6 +2273,17 @@ var EditorController = class {
|
|
|
1211
2273
|
const html = plainTextToTipTapHtml(text);
|
|
1212
2274
|
this.editor.commands.setContent(html, emitUpdate);
|
|
1213
2275
|
}
|
|
2276
|
+
getMarkdown() {
|
|
2277
|
+
return getEditorMarkdown(this.editor);
|
|
2278
|
+
}
|
|
2279
|
+
setMarkdown(markdown, emitUpdate = true) {
|
|
2280
|
+
if (this.editor.storage?.markdown?.parser) {
|
|
2281
|
+
this.editor.commands.setContent(markdown, emitUpdate);
|
|
2282
|
+
} else {
|
|
2283
|
+
const html = markdownToTipTapHtml(markdown);
|
|
2284
|
+
this.editor.commands.setContent(html, emitUpdate);
|
|
2285
|
+
}
|
|
2286
|
+
}
|
|
1214
2287
|
insertText(text) {
|
|
1215
2288
|
this.editor.commands.insertContent(text);
|
|
1216
2289
|
}
|
|
@@ -2513,6 +3586,7 @@ export {
|
|
|
2513
3586
|
GradientText,
|
|
2514
3587
|
INSTRUCTION_REGEX,
|
|
2515
3588
|
LoadingNode,
|
|
3589
|
+
Markdown2 as Markdown,
|
|
2516
3590
|
Mention,
|
|
2517
3591
|
SlashCommands,
|
|
2518
3592
|
SmilieReplacer,
|
|
@@ -2531,6 +3605,7 @@ export {
|
|
|
2531
3605
|
extractTemplateNames,
|
|
2532
3606
|
extractVariableNames,
|
|
2533
3607
|
findHexColors,
|
|
3608
|
+
getEditorMarkdown,
|
|
2534
3609
|
getEditorText,
|
|
2535
3610
|
getLatestVersion,
|
|
2536
3611
|
htmlToPlainText,
|
|
@@ -2538,6 +3613,7 @@ export {
|
|
|
2538
3613
|
instructionRegex,
|
|
2539
3614
|
mapRawOffsetToResolved,
|
|
2540
3615
|
mapResolvedOffsetToRaw,
|
|
3616
|
+
markdownToTipTapHtml,
|
|
2541
3617
|
parseCellReference,
|
|
2542
3618
|
parseFormula,
|
|
2543
3619
|
parseRange,
|