@zipify/wysiwyg 2.4.5 → 2.4.7-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/wysiwyg.mjs CHANGED
@@ -27,7 +27,7 @@ var __privateMethod = (obj, member, method) => {
27
27
  return method;
28
28
  };
29
29
  var _domParser, _parser, _NodeFilter, NodeFilter_get, _Node, Node_get, _removeComments, removeComments_fn, _normalizeRootTags, normalizeRootTags_fn, _createNodeIterator, createNodeIterator_fn, _iterateNodes, iterateNodes_fn, _runIterator, runIterator_fn, _removeEmptyNodes, removeEmptyNodes_fn, _normalizeListItems, normalizeListItems_fn, _isBlockNode, isBlockNode_fn, _isRootNode, isRootNode_fn, _assignElementProperties, assignElementProperties_fn, _removeStyleProperties, removeStyleProperties_fn, _normalizeBreakLines, normalizeBreakLines_fn, _normalizeBlockTextDecoration, normalizeBlockTextDecoration_fn, _moveTextDecorationToChildren, moveTextDecorationToChildren_fn, _parseTextDecoration, parseTextDecoration_fn, _normalizeBlockBackgroundColor, normalizeBlockBackgroundColor_fn, _moveBackgroundColorToChildren, moveBackgroundColorToChildren_fn, _wrapTextNode, wrapTextNode_fn, _iterateNodes2, iterateNodes_fn2, _iterateChildNodes, iterateChildNodes_fn, _bubbleMarks, bubbleMarks_fn, _canBubbleMark, canBubbleMark_fn, _includesMark, includesMark_fn, _includesMarkType, includesMarkType_fn, _removeMark, removeMark_fn, _addMark, addMark_fn, _findMarkIndexByType, findMarkIndexByType_fn, _buildHtml, buildHtml_fn, _buildJson, buildJson_fn, _textBlock, textBlock_fn, _normalizeTextBlockArgs, normalizeTextBlockArgs_fn, _buildDecorations, buildDecorations_fn, _getWeights, getWeights_fn;
30
- import { computed, ref, watch, inject, onUnmounted, nextTick, provide, onMounted, toRef, unref, reactive } from "vue";
30
+ import { computed, ref, watch, inject, onUnmounted, nextTick, provide, onMounted, toRef, reactive, unref } from "vue";
31
31
  import { ColorModel, ZipifyColorPicker } from "@zipify/colorpicker";
32
32
  function OrderedMap(content) {
33
33
  this.content = content;
@@ -15774,7 +15774,7 @@ class NodeFactory {
15774
15774
  return { type, attrs };
15775
15775
  }
15776
15776
  static populateAllDevices(value) {
15777
- return { mobile: value, tablet: value, desktop: value };
15777
+ return { mobile: null, tablet: value, desktop: value };
15778
15778
  }
15779
15779
  }
15780
15780
  _textBlock = new WeakSet();
@@ -22057,27 +22057,33 @@ function usePickerApi({ pickerRef, colorRef, onChange, onClosed, onBeforeOpened
22057
22057
  function toggle() {
22058
22058
  isOpened.value ? close2() : open();
22059
22059
  }
22060
+ function triggerChange(color) {
22061
+ if (isOpened.value)
22062
+ onChange(color);
22063
+ }
22060
22064
  function cancel() {
22061
22065
  var _a;
22062
22066
  const color = initialColor != null ? initialColor : colorRef.value;
22063
- onChange(color);
22067
+ triggerChange(color);
22064
22068
  (_a = pickerRef.value) == null ? void 0 : _a.close(color);
22065
22069
  }
22066
22070
  const editingColor = computed({
22067
22071
  get: () => colorRef.value,
22068
- set: (color) => colorRef.value !== color && onChange(color)
22072
+ set: (color) => colorRef.value !== color && triggerChange(color)
22069
22073
  });
22070
- return {
22074
+ return reactive({
22071
22075
  isOpened,
22072
22076
  editingColor,
22073
22077
  open,
22074
22078
  close: close2,
22075
22079
  toggle,
22076
22080
  cancel
22077
- };
22081
+ });
22078
22082
  }
22079
22083
  function usePickerHotkeys({ isOpenedRef, onCancel, onApply }) {
22080
22084
  function useHotkey(event, handler) {
22085
+ if (event.target.closest("input"))
22086
+ return;
22081
22087
  event.stopImmediatePropagation();
22082
22088
  event.preventDefault();
22083
22089
  handler();
@@ -22107,17 +22113,17 @@ var render$p = function __render__20() {
22107
22113
  name: "out-click",
22108
22114
  rawName: "v-out-click",
22109
22115
  value: {
22110
- onOutClick: _vm.close,
22111
- isDisabled: !_vm.isOpened
22116
+ onOutClick: _vm.api.close,
22117
+ isDisabled: !_vm.api.isOpened
22112
22118
  },
22113
- expression: "{ onOutClick: close, isDisabled: !isOpened }"
22119
+ expression: "{ onOutClick: api.close, isDisabled: !api.isOpened }"
22114
22120
  }],
22115
22121
  ref: "pickerRef",
22116
22122
  attrs: {
22117
22123
  "placement": "bottom-end",
22118
22124
  "placement-strategy": "fixed",
22119
22125
  "favorite-colors": _vm.favoriteColors,
22120
- "window": _vm.window
22126
+ "window": _vm.contextWindow
22121
22127
  },
22122
22128
  on: {
22123
22129
  "changeFavoriteColors": _vm.updateFavoriteColors
@@ -22126,20 +22132,20 @@ var render$p = function __render__20() {
22126
22132
  key: "activator",
22127
22133
  fn: function fn2() {
22128
22134
  return [_vm._t("activator", null, {
22129
- "isOpened": _vm.isOpened,
22130
- "open": _vm.open,
22131
- "close": _vm.close,
22132
- "toggle": _vm.toggle
22135
+ "isOpened": _vm.api.isOpened,
22136
+ "open": _vm.api.open,
22137
+ "close": _vm.api.close,
22138
+ "toggle": _vm.api.toggle
22133
22139
  })];
22134
22140
  },
22135
22141
  proxy: true
22136
22142
  }], null, true),
22137
22143
  model: {
22138
- value: _vm.editingColor,
22144
+ value: _vm.api.editingColor,
22139
22145
  callback: function callback($$v) {
22140
- _vm.editingColor = $$v;
22146
+ _vm.$set(_vm.api, "editingColor", $$v);
22141
22147
  },
22142
- expression: "editingColor"
22148
+ expression: "api.editingColor"
22143
22149
  }
22144
22150
  });
22145
22151
  };
@@ -22164,8 +22170,6 @@ const __vue2_script$p = {
22164
22170
  const pickerRef = ref(null);
22165
22171
  const api = usePickerApi({
22166
22172
  onChange: (color) => {
22167
- if (!unref(api.isOpened))
22168
- return false;
22169
22173
  emit("change", color);
22170
22174
  editor.chain().focus().restoreSelection().run();
22171
22175
  },
@@ -22174,28 +22178,19 @@ const __vue2_script$p = {
22174
22178
  colorRef: toRef(props, "value"),
22175
22179
  pickerRef
22176
22180
  });
22181
+ const isOpenedRef = toRef(api, "isOpened");
22177
22182
  usePickerHotkeys({
22178
- isOpenedRef: api.isOpened,
22179
- onCancel: () => api.cancel(),
22180
- onApply: () => api.close()
22181
- });
22182
- useDeselectionLock({
22183
- hostRef: pickerRef,
22184
- isActiveRef: api.isOpened
22183
+ isOpenedRef,
22184
+ onCancel: api.cancel,
22185
+ onApply: api.close
22185
22186
  });
22186
- function updateFavoriteColors(colors) {
22187
- favoriteColors.triggerUpdate(colors);
22188
- }
22187
+ const updateFavoriteColors = (colors) => favoriteColors.triggerUpdate(colors);
22189
22188
  return {
22190
22189
  pickerRef,
22191
- isOpened: api.isOpened,
22192
- editingColor: api.editingColor,
22193
- open: api.open,
22194
- close: api.close,
22195
- toggle: api.toggle,
22190
+ api,
22196
22191
  favoriteColors: favoriteColors.listRef,
22197
22192
  updateFavoriteColors,
22198
- window: ContextWindow.window
22193
+ contextWindow: ContextWindow.window
22199
22194
  };
22200
22195
  }
22201
22196
  };
@@ -24877,1287 +24872,159 @@ const FontWeight = Mark.create({
24877
24872
  return renderMark({ font_weight: attrs.value });
24878
24873
  }
24879
24874
  });
24880
- const Text$1 = Node.create({
24881
- name: "text",
24882
- group: "inline"
24883
- });
24884
- var GOOD_LEAF_SIZE = 200;
24885
- var RopeSequence = function RopeSequence2() {
24886
- };
24887
- RopeSequence.prototype.append = function append(other) {
24888
- if (!other.length) {
24889
- return this;
24890
- }
24891
- other = RopeSequence.from(other);
24892
- return !this.length && other || other.length < GOOD_LEAF_SIZE && this.leafAppend(other) || this.length < GOOD_LEAF_SIZE && other.leafPrepend(this) || this.appendInner(other);
24893
- };
24894
- RopeSequence.prototype.prepend = function prepend(other) {
24895
- if (!other.length) {
24896
- return this;
24897
- }
24898
- return RopeSequence.from(other).append(this);
24899
- };
24900
- RopeSequence.prototype.appendInner = function appendInner(other) {
24901
- return new Append(this, other);
24902
- };
24903
- RopeSequence.prototype.slice = function slice(from2, to) {
24904
- if (from2 === void 0)
24905
- from2 = 0;
24906
- if (to === void 0)
24907
- to = this.length;
24908
- if (from2 >= to) {
24909
- return RopeSequence.empty;
24910
- }
24911
- return this.sliceInner(Math.max(0, from2), Math.min(this.length, to));
24912
- };
24913
- RopeSequence.prototype.get = function get2(i) {
24914
- if (i < 0 || i >= this.length) {
24915
- return void 0;
24875
+ const FontSize = Mark.create({
24876
+ name: TextSettings.FONT_SIZE,
24877
+ group: MarkGroups.SETTINGS,
24878
+ addOptions: () => ({
24879
+ minSize: 1,
24880
+ maxSize: 100
24881
+ }),
24882
+ addAttributes() {
24883
+ return {
24884
+ mobile: { default: null },
24885
+ tablet: { default: null },
24886
+ desktop: { default: null }
24887
+ };
24888
+ },
24889
+ addCommands() {
24890
+ return {
24891
+ getFontSize: createCommand(({ commands: commands2 }) => {
24892
+ return commands2.getDeviceSettingMark(this.name, commands2.getDefaultFontSize());
24893
+ }),
24894
+ getDefaultFontSize: createCommand(({ commands: commands2 }) => {
24895
+ const device = commands2.getDevice();
24896
+ const preset = commands2.getPreset();
24897
+ return computed(() => unref(preset)[unref(device)].font_size.replace("px", ""));
24898
+ }),
24899
+ applyFontSize: createCommand(({ commands: commands2 }, value) => {
24900
+ commands2.applyMark(this.name, { desktop: value, tablet: value, mobile: null });
24901
+ }),
24902
+ increaseFontSize: createCommand(({ commands: commands2 }) => {
24903
+ const size2 = Number(unref(commands2.getFontSize()));
24904
+ const nextSize = Math.min(size2 + 1, this.options.maxSize);
24905
+ commands2.applyFontSize(String(nextSize));
24906
+ }),
24907
+ decreaseFontSize: createCommand(({ commands: commands2 }) => {
24908
+ const size2 = Number(unref(commands2.getFontSize()));
24909
+ const nextSize = Math.max(size2 - 1, this.options.minSize);
24910
+ commands2.applyFontSize(String(nextSize));
24911
+ })
24912
+ };
24913
+ },
24914
+ addKeyboardShortcuts: () => ({
24915
+ "Mod-Shift-=": createKeyboardShortcut("increaseFontSize"),
24916
+ "Mod-Shift--": createKeyboardShortcut("decreaseFontSize")
24917
+ }),
24918
+ parseHTML() {
24919
+ const parseSize = (value) => {
24920
+ if (!value)
24921
+ return null;
24922
+ const wrapperEl = unref(this.options.wrapperRef);
24923
+ const converted = convertFontSize(value, wrapperEl);
24924
+ return String(converted);
24925
+ };
24926
+ return [
24927
+ {
24928
+ tag: '[style*="--zw-font-size"]',
24929
+ getAttrs: ({ style: style2 }) => ({
24930
+ mobile: parseSize(style2.getPropertyValue("--zw-font-size-mobile")),
24931
+ tablet: parseSize(style2.getPropertyValue("--zw-font-size-tablet")),
24932
+ desktop: parseSize(style2.getPropertyValue("--zw-font-size-desktop"))
24933
+ })
24934
+ },
24935
+ {
24936
+ style: "font-size",
24937
+ getAttrs: (input) => {
24938
+ const value = parseSize(input);
24939
+ return { desktop: value, tablet: value, mobile: null };
24940
+ }
24941
+ }
24942
+ ];
24943
+ },
24944
+ renderHTML({ HTMLAttributes: attrs }) {
24945
+ const addUnits = (value) => value ? `${value}px` : null;
24946
+ return renderMark({
24947
+ font_size_mobile: addUnits(attrs.mobile),
24948
+ font_size_tablet: addUnits(attrs.tablet),
24949
+ font_size_desktop: addUnits(attrs.desktop)
24950
+ });
24916
24951
  }
24917
- return this.getInner(i);
24918
- };
24919
- RopeSequence.prototype.forEach = function forEach3(f, from2, to) {
24920
- if (from2 === void 0)
24921
- from2 = 0;
24922
- if (to === void 0)
24923
- to = this.length;
24924
- if (from2 <= to) {
24925
- this.forEachInner(f, from2, to, 0);
24926
- } else {
24927
- this.forEachInvertedInner(f, from2, to, 0);
24952
+ });
24953
+ const FontColor = Mark.create({
24954
+ name: TextSettings.FONT_COLOR,
24955
+ group: MarkGroups.SETTINGS,
24956
+ addAttributes: () => ({
24957
+ value: { required: true }
24958
+ }),
24959
+ addCommands() {
24960
+ return {
24961
+ getFontColor: createCommand(({ commands: commands2 }) => {
24962
+ return commands2.getCommonSettingMark(this.name, commands2.getDefaultFontColor());
24963
+ }),
24964
+ getDefaultFontColor: createCommand(({ commands: commands2 }) => {
24965
+ const preset = commands2.getPreset();
24966
+ return computed(() => unref(preset).common.color);
24967
+ }),
24968
+ applyFontColor: createCommand(({ commands: commands2 }, value) => {
24969
+ commands2.applyMark(this.name, { value });
24970
+ })
24971
+ };
24972
+ },
24973
+ parseHTML() {
24974
+ const getAttrs = (value) => ({ value: convertColor(value) });
24975
+ return [
24976
+ {
24977
+ style: "--zw-font-color",
24978
+ getAttrs
24979
+ },
24980
+ {
24981
+ style: "color",
24982
+ getAttrs
24983
+ }
24984
+ ];
24985
+ },
24986
+ renderHTML({ HTMLAttributes: attrs }) {
24987
+ return renderMark({ font_color: attrs.value });
24928
24988
  }
24929
- };
24930
- RopeSequence.prototype.map = function map(f, from2, to) {
24931
- if (from2 === void 0)
24932
- from2 = 0;
24933
- if (to === void 0)
24934
- to = this.length;
24935
- var result = [];
24936
- this.forEach(function(elt, i) {
24937
- return result.push(f(elt, i));
24938
- }, from2, to);
24939
- return result;
24940
- };
24941
- RopeSequence.from = function from(values2) {
24942
- if (values2 instanceof RopeSequence) {
24943
- return values2;
24989
+ });
24990
+ const BackgroundColor = Mark.create({
24991
+ name: TextSettings.BACKGROUND_COLOR,
24992
+ addAttributes: () => ({
24993
+ value: { required: true }
24994
+ }),
24995
+ addCommands() {
24996
+ return {
24997
+ getBackgroundColor: createCommand(({ commands: commands2 }) => {
24998
+ return commands2.getCommonSettingMark(this.name, "rgba(255, 255, 255, 0%)");
24999
+ }),
25000
+ applyBackgroundColor: createCommand(({ commands: commands2 }, value) => {
25001
+ commands2.applyMark(this.name, { value });
25002
+ })
25003
+ };
25004
+ },
25005
+ parseHTML() {
25006
+ const getAttrs = (value) => ({ value: convertColor(value) });
25007
+ return [
25008
+ {
25009
+ style: "--zw-background-color",
25010
+ getAttrs
25011
+ },
25012
+ {
25013
+ style: "background-color",
25014
+ getAttrs
25015
+ }
25016
+ ];
25017
+ },
25018
+ renderHTML({ HTMLAttributes: attrs }) {
25019
+ return renderMark({ background_color: attrs.value });
24944
25020
  }
24945
- return values2 && values2.length ? new Leaf(values2) : RopeSequence.empty;
24946
- };
24947
- var Leaf = /* @__PURE__ */ function(RopeSequence3) {
24948
- function Leaf2(values2) {
24949
- RopeSequence3.call(this);
24950
- this.values = values2;
24951
- }
24952
- if (RopeSequence3)
24953
- Leaf2.__proto__ = RopeSequence3;
24954
- Leaf2.prototype = Object.create(RopeSequence3 && RopeSequence3.prototype);
24955
- Leaf2.prototype.constructor = Leaf2;
24956
- var prototypeAccessors = { length: { configurable: true }, depth: { configurable: true } };
24957
- Leaf2.prototype.flatten = function flatten() {
24958
- return this.values;
24959
- };
24960
- Leaf2.prototype.sliceInner = function sliceInner(from2, to) {
24961
- if (from2 == 0 && to == this.length) {
24962
- return this;
24963
- }
24964
- return new Leaf2(this.values.slice(from2, to));
24965
- };
24966
- Leaf2.prototype.getInner = function getInner(i) {
24967
- return this.values[i];
24968
- };
24969
- Leaf2.prototype.forEachInner = function forEachInner(f, from2, to, start2) {
24970
- for (var i = from2; i < to; i++) {
24971
- if (f(this.values[i], start2 + i) === false) {
24972
- return false;
24973
- }
24974
- }
24975
- };
24976
- Leaf2.prototype.forEachInvertedInner = function forEachInvertedInner(f, from2, to, start2) {
24977
- for (var i = from2 - 1; i >= to; i--) {
24978
- if (f(this.values[i], start2 + i) === false) {
24979
- return false;
24980
- }
24981
- }
24982
- };
24983
- Leaf2.prototype.leafAppend = function leafAppend(other) {
24984
- if (this.length + other.length <= GOOD_LEAF_SIZE) {
24985
- return new Leaf2(this.values.concat(other.flatten()));
24986
- }
24987
- };
24988
- Leaf2.prototype.leafPrepend = function leafPrepend(other) {
24989
- if (this.length + other.length <= GOOD_LEAF_SIZE) {
24990
- return new Leaf2(other.flatten().concat(this.values));
24991
- }
24992
- };
24993
- prototypeAccessors.length.get = function() {
24994
- return this.values.length;
24995
- };
24996
- prototypeAccessors.depth.get = function() {
24997
- return 0;
24998
- };
24999
- Object.defineProperties(Leaf2.prototype, prototypeAccessors);
25000
- return Leaf2;
25001
- }(RopeSequence);
25002
- RopeSequence.empty = new Leaf([]);
25003
- var Append = /* @__PURE__ */ function(RopeSequence3) {
25004
- function Append2(left2, right2) {
25005
- RopeSequence3.call(this);
25006
- this.left = left2;
25007
- this.right = right2;
25008
- this.length = left2.length + right2.length;
25009
- this.depth = Math.max(left2.depth, right2.depth) + 1;
25010
- }
25011
- if (RopeSequence3)
25012
- Append2.__proto__ = RopeSequence3;
25013
- Append2.prototype = Object.create(RopeSequence3 && RopeSequence3.prototype);
25014
- Append2.prototype.constructor = Append2;
25015
- Append2.prototype.flatten = function flatten() {
25016
- return this.left.flatten().concat(this.right.flatten());
25017
- };
25018
- Append2.prototype.getInner = function getInner(i) {
25019
- return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length);
25020
- };
25021
- Append2.prototype.forEachInner = function forEachInner(f, from2, to, start2) {
25022
- var leftLen = this.left.length;
25023
- if (from2 < leftLen && this.left.forEachInner(f, from2, Math.min(to, leftLen), start2) === false) {
25024
- return false;
25025
- }
25026
- if (to > leftLen && this.right.forEachInner(f, Math.max(from2 - leftLen, 0), Math.min(this.length, to) - leftLen, start2 + leftLen) === false) {
25027
- return false;
25028
- }
25029
- };
25030
- Append2.prototype.forEachInvertedInner = function forEachInvertedInner(f, from2, to, start2) {
25031
- var leftLen = this.left.length;
25032
- if (from2 > leftLen && this.right.forEachInvertedInner(f, from2 - leftLen, Math.max(to, leftLen) - leftLen, start2 + leftLen) === false) {
25033
- return false;
25034
- }
25035
- if (to < leftLen && this.left.forEachInvertedInner(f, Math.min(from2, leftLen), to, start2) === false) {
25036
- return false;
25037
- }
25038
- };
25039
- Append2.prototype.sliceInner = function sliceInner(from2, to) {
25040
- if (from2 == 0 && to == this.length) {
25041
- return this;
25042
- }
25043
- var leftLen = this.left.length;
25044
- if (to <= leftLen) {
25045
- return this.left.slice(from2, to);
25046
- }
25047
- if (from2 >= leftLen) {
25048
- return this.right.slice(from2 - leftLen, to - leftLen);
25049
- }
25050
- return this.left.slice(from2, leftLen).append(this.right.slice(0, to - leftLen));
25051
- };
25052
- Append2.prototype.leafAppend = function leafAppend(other) {
25053
- var inner = this.right.leafAppend(other);
25054
- if (inner) {
25055
- return new Append2(this.left, inner);
25056
- }
25057
- };
25058
- Append2.prototype.leafPrepend = function leafPrepend(other) {
25059
- var inner = this.left.leafPrepend(other);
25060
- if (inner) {
25061
- return new Append2(inner, this.right);
25062
- }
25063
- };
25064
- Append2.prototype.appendInner = function appendInner2(other) {
25065
- if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1) {
25066
- return new Append2(this.left, new Append2(this.right, other));
25067
- }
25068
- return new Append2(this, other);
25069
- };
25070
- return Append2;
25071
- }(RopeSequence);
25072
- var ropeSequence = RopeSequence;
25073
- const max_empty_items = 500;
25074
- class Branch {
25075
- constructor(items, eventCount) {
25076
- this.items = items;
25077
- this.eventCount = eventCount;
25078
- }
25079
- popEvent(state, preserveItems) {
25080
- if (this.eventCount == 0)
25081
- return null;
25082
- let end2 = this.items.length;
25083
- for (; ; end2--) {
25084
- let next2 = this.items.get(end2 - 1);
25085
- if (next2.selection) {
25086
- --end2;
25087
- break;
25088
- }
25089
- }
25090
- let remap, mapFrom;
25091
- if (preserveItems) {
25092
- remap = this.remapping(end2, this.items.length);
25093
- mapFrom = remap.maps.length;
25094
- }
25095
- let transform = state.tr;
25096
- let selection, remaining;
25097
- let addAfter = [], addBefore = [];
25098
- this.items.forEach((item, i) => {
25099
- if (!item.step) {
25100
- if (!remap) {
25101
- remap = this.remapping(end2, i + 1);
25102
- mapFrom = remap.maps.length;
25103
- }
25104
- mapFrom--;
25105
- addBefore.push(item);
25106
- return;
25107
- }
25108
- if (remap) {
25109
- addBefore.push(new Item(item.map));
25110
- let step = item.step.map(remap.slice(mapFrom)), map2;
25111
- if (step && transform.maybeStep(step).doc) {
25112
- map2 = transform.mapping.maps[transform.mapping.maps.length - 1];
25113
- addAfter.push(new Item(map2, void 0, void 0, addAfter.length + addBefore.length));
25114
- }
25115
- mapFrom--;
25116
- if (map2)
25117
- remap.appendMap(map2, mapFrom);
25118
- } else {
25119
- transform.maybeStep(item.step);
25120
- }
25121
- if (item.selection) {
25122
- selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;
25123
- remaining = new Branch(this.items.slice(0, end2).append(addBefore.reverse().concat(addAfter)), this.eventCount - 1);
25124
- return false;
25125
- }
25126
- }, this.items.length, 0);
25127
- return { remaining, transform, selection };
25128
- }
25129
- addTransform(transform, selection, histOptions, preserveItems) {
25130
- let newItems = [], eventCount = this.eventCount;
25131
- let oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;
25132
- for (let i = 0; i < transform.steps.length; i++) {
25133
- let step = transform.steps[i].invert(transform.docs[i]);
25134
- let item = new Item(transform.mapping.maps[i], step, selection), merged;
25135
- if (merged = lastItem && lastItem.merge(item)) {
25136
- item = merged;
25137
- if (i)
25138
- newItems.pop();
25139
- else
25140
- oldItems = oldItems.slice(0, oldItems.length - 1);
25141
- }
25142
- newItems.push(item);
25143
- if (selection) {
25144
- eventCount++;
25145
- selection = void 0;
25146
- }
25147
- if (!preserveItems)
25148
- lastItem = item;
25149
- }
25150
- let overflow = eventCount - histOptions.depth;
25151
- if (overflow > DEPTH_OVERFLOW) {
25152
- oldItems = cutOffEvents(oldItems, overflow);
25153
- eventCount -= overflow;
25154
- }
25155
- return new Branch(oldItems.append(newItems), eventCount);
25156
- }
25157
- remapping(from2, to) {
25158
- let maps = new Mapping();
25159
- this.items.forEach((item, i) => {
25160
- let mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from2 ? maps.maps.length - item.mirrorOffset : void 0;
25161
- maps.appendMap(item.map, mirrorPos);
25162
- }, from2, to);
25163
- return maps;
25164
- }
25165
- addMaps(array) {
25166
- if (this.eventCount == 0)
25167
- return this;
25168
- return new Branch(this.items.append(array.map((map2) => new Item(map2))), this.eventCount);
25169
- }
25170
- rebased(rebasedTransform, rebasedCount) {
25171
- if (!this.eventCount)
25172
- return this;
25173
- let rebasedItems = [], start2 = Math.max(0, this.items.length - rebasedCount);
25174
- let mapping = rebasedTransform.mapping;
25175
- let newUntil = rebasedTransform.steps.length;
25176
- let eventCount = this.eventCount;
25177
- this.items.forEach((item) => {
25178
- if (item.selection)
25179
- eventCount--;
25180
- }, start2);
25181
- let iRebased = rebasedCount;
25182
- this.items.forEach((item) => {
25183
- let pos = mapping.getMirror(--iRebased);
25184
- if (pos == null)
25185
- return;
25186
- newUntil = Math.min(newUntil, pos);
25187
- let map2 = mapping.maps[pos];
25188
- if (item.step) {
25189
- let step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);
25190
- let selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));
25191
- if (selection)
25192
- eventCount++;
25193
- rebasedItems.push(new Item(map2, step, selection));
25194
- } else {
25195
- rebasedItems.push(new Item(map2));
25196
- }
25197
- }, start2);
25198
- let newMaps = [];
25199
- for (let i = rebasedCount; i < newUntil; i++)
25200
- newMaps.push(new Item(mapping.maps[i]));
25201
- let items = this.items.slice(0, start2).append(newMaps).append(rebasedItems);
25202
- let branch = new Branch(items, eventCount);
25203
- if (branch.emptyItemCount() > max_empty_items)
25204
- branch = branch.compress(this.items.length - rebasedItems.length);
25205
- return branch;
25206
- }
25207
- emptyItemCount() {
25208
- let count = 0;
25209
- this.items.forEach((item) => {
25210
- if (!item.step)
25211
- count++;
25212
- });
25213
- return count;
25214
- }
25215
- compress(upto = this.items.length) {
25216
- let remap = this.remapping(0, upto), mapFrom = remap.maps.length;
25217
- let items = [], events2 = 0;
25218
- this.items.forEach((item, i) => {
25219
- if (i >= upto) {
25220
- items.push(item);
25221
- if (item.selection)
25222
- events2++;
25223
- } else if (item.step) {
25224
- let step = item.step.map(remap.slice(mapFrom)), map2 = step && step.getMap();
25225
- mapFrom--;
25226
- if (map2)
25227
- remap.appendMap(map2, mapFrom);
25228
- if (step) {
25229
- let selection = item.selection && item.selection.map(remap.slice(mapFrom));
25230
- if (selection)
25231
- events2++;
25232
- let newItem = new Item(map2.invert(), step, selection), merged, last = items.length - 1;
25233
- if (merged = items.length && items[last].merge(newItem))
25234
- items[last] = merged;
25235
- else
25236
- items.push(newItem);
25237
- }
25238
- } else if (item.map) {
25239
- mapFrom--;
25240
- }
25241
- }, this.items.length, 0);
25242
- return new Branch(ropeSequence.from(items.reverse()), events2);
25243
- }
25244
- }
25245
- Branch.empty = new Branch(ropeSequence.empty, 0);
25246
- function cutOffEvents(items, n) {
25247
- let cutPoint;
25248
- items.forEach((item, i) => {
25249
- if (item.selection && n-- == 0) {
25250
- cutPoint = i;
25251
- return false;
25252
- }
25253
- });
25254
- return items.slice(cutPoint);
25255
- }
25256
- class Item {
25257
- constructor(map2, step, selection, mirrorOffset) {
25258
- this.map = map2;
25259
- this.step = step;
25260
- this.selection = selection;
25261
- this.mirrorOffset = mirrorOffset;
25262
- }
25263
- merge(other) {
25264
- if (this.step && other.step && !other.selection) {
25265
- let step = other.step.merge(this.step);
25266
- if (step)
25267
- return new Item(step.getMap().invert(), step, this.selection);
25268
- }
25269
- }
25270
- }
25271
- class HistoryState {
25272
- constructor(done, undone, prevRanges, prevTime) {
25273
- this.done = done;
25274
- this.undone = undone;
25275
- this.prevRanges = prevRanges;
25276
- this.prevTime = prevTime;
25277
- }
25278
- }
25279
- const DEPTH_OVERFLOW = 20;
25280
- function applyTransaction(history2, state, tr, options) {
25281
- let historyTr = tr.getMeta(historyKey), rebased;
25282
- if (historyTr)
25283
- return historyTr.historyState;
25284
- if (tr.getMeta(closeHistoryKey))
25285
- history2 = new HistoryState(history2.done, history2.undone, null, 0);
25286
- let appended = tr.getMeta("appendedTransaction");
25287
- if (tr.steps.length == 0) {
25288
- return history2;
25289
- } else if (appended && appended.getMeta(historyKey)) {
25290
- if (appended.getMeta(historyKey).redo)
25291
- return new HistoryState(history2.done.addTransform(tr, void 0, options, mustPreserveItems(state)), history2.undone, rangesFor(tr.mapping.maps[tr.steps.length - 1]), history2.prevTime);
25292
- else
25293
- return new HistoryState(history2.done, history2.undone.addTransform(tr, void 0, options, mustPreserveItems(state)), null, history2.prevTime);
25294
- } else if (tr.getMeta("addToHistory") !== false && !(appended && appended.getMeta("addToHistory") === false)) {
25295
- let newGroup = history2.prevTime == 0 || !appended && (history2.prevTime < (tr.time || 0) - options.newGroupDelay || !isAdjacentTo(tr, history2.prevRanges));
25296
- let prevRanges = appended ? mapRanges(history2.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps[tr.steps.length - 1]);
25297
- return new HistoryState(history2.done.addTransform(tr, newGroup ? state.selection.getBookmark() : void 0, options, mustPreserveItems(state)), Branch.empty, prevRanges, tr.time);
25298
- } else if (rebased = tr.getMeta("rebased")) {
25299
- return new HistoryState(history2.done.rebased(tr, rebased), history2.undone.rebased(tr, rebased), mapRanges(history2.prevRanges, tr.mapping), history2.prevTime);
25300
- } else {
25301
- return new HistoryState(history2.done.addMaps(tr.mapping.maps), history2.undone.addMaps(tr.mapping.maps), mapRanges(history2.prevRanges, tr.mapping), history2.prevTime);
25302
- }
25303
- }
25304
- function isAdjacentTo(transform, prevRanges) {
25305
- if (!prevRanges)
25306
- return false;
25307
- if (!transform.docChanged)
25308
- return true;
25309
- let adjacent = false;
25310
- transform.mapping.maps[0].forEach((start2, end2) => {
25311
- for (let i = 0; i < prevRanges.length; i += 2)
25312
- if (start2 <= prevRanges[i + 1] && end2 >= prevRanges[i])
25313
- adjacent = true;
25314
- });
25315
- return adjacent;
25316
- }
25317
- function rangesFor(map2) {
25318
- let result = [];
25319
- map2.forEach((_from, _to, from2, to) => result.push(from2, to));
25320
- return result;
25321
- }
25322
- function mapRanges(ranges, mapping) {
25323
- if (!ranges)
25324
- return null;
25325
- let result = [];
25326
- for (let i = 0; i < ranges.length; i += 2) {
25327
- let from2 = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);
25328
- if (from2 <= to)
25329
- result.push(from2, to);
25330
- }
25331
- return result;
25332
- }
25333
- function histTransaction(history2, state, dispatch, redo2) {
25334
- let preserveItems = mustPreserveItems(state);
25335
- let histOptions = historyKey.get(state).spec.config;
25336
- let pop = (redo2 ? history2.undone : history2.done).popEvent(state, preserveItems);
25337
- if (!pop)
25338
- return;
25339
- let selection = pop.selection.resolve(pop.transform.doc);
25340
- let added = (redo2 ? history2.done : history2.undone).addTransform(pop.transform, state.selection.getBookmark(), histOptions, preserveItems);
25341
- let newHist = new HistoryState(redo2 ? added : pop.remaining, redo2 ? pop.remaining : added, null, 0);
25342
- dispatch(pop.transform.setSelection(selection).setMeta(historyKey, { redo: redo2, historyState: newHist }).scrollIntoView());
25343
- }
25344
- let cachedPreserveItems = false, cachedPreserveItemsPlugins = null;
25345
- function mustPreserveItems(state) {
25346
- let plugins = state.plugins;
25347
- if (cachedPreserveItemsPlugins != plugins) {
25348
- cachedPreserveItems = false;
25349
- cachedPreserveItemsPlugins = plugins;
25350
- for (let i = 0; i < plugins.length; i++)
25351
- if (plugins[i].spec.historyPreserveItems) {
25352
- cachedPreserveItems = true;
25353
- break;
25354
- }
25355
- }
25356
- return cachedPreserveItems;
25357
- }
25358
- const historyKey = new PluginKey("history");
25359
- const closeHistoryKey = new PluginKey("closeHistory");
25360
- function history(config = {}) {
25361
- config = {
25362
- depth: config.depth || 100,
25363
- newGroupDelay: config.newGroupDelay || 500
25364
- };
25365
- return new Plugin({
25366
- key: historyKey,
25367
- state: {
25368
- init() {
25369
- return new HistoryState(Branch.empty, Branch.empty, null, 0);
25370
- },
25371
- apply(tr, hist, state) {
25372
- return applyTransaction(hist, state, tr, config);
25373
- }
25374
- },
25375
- config,
25376
- props: {
25377
- handleDOMEvents: {
25378
- beforeinput(view, e) {
25379
- let inputType = e.inputType;
25380
- let command2 = inputType == "historyUndo" ? undo : inputType == "historyRedo" ? redo : null;
25381
- if (!command2)
25382
- return false;
25383
- e.preventDefault();
25384
- return command2(view.state, view.dispatch);
25385
- }
25386
- }
25387
- }
25388
- });
25389
- }
25390
- const undo = (state, dispatch) => {
25391
- let hist = historyKey.getState(state);
25392
- if (!hist || hist.done.eventCount == 0)
25393
- return false;
25394
- if (dispatch)
25395
- histTransaction(hist, state, dispatch, false);
25396
- return true;
25397
- };
25398
- const redo = (state, dispatch) => {
25399
- let hist = historyKey.getState(state);
25400
- if (!hist || hist.undone.eventCount == 0)
25401
- return false;
25402
- if (dispatch)
25403
- histTransaction(hist, state, dispatch, true);
25404
- return true;
25405
- };
25406
- const History = Extension.create({
25407
- name: "history",
25408
- addOptions() {
25409
- return {
25410
- depth: 100,
25411
- newGroupDelay: 500
25412
- };
25413
- },
25414
- addCommands() {
25415
- return {
25416
- undo: () => ({ state, dispatch }) => {
25417
- return undo(state, dispatch);
25418
- },
25419
- redo: () => ({ state, dispatch }) => {
25420
- return redo(state, dispatch);
25421
- }
25422
- };
25423
- },
25424
- addProseMirrorPlugins() {
25425
- return [
25426
- history(this.options)
25427
- ];
25428
- },
25429
- addKeyboardShortcuts() {
25430
- return {
25431
- "Mod-z": () => this.editor.commands.undo(),
25432
- "Mod-y": () => this.editor.commands.redo(),
25433
- "Shift-Mod-z": () => this.editor.commands.redo(),
25434
- "Mod-\u044F": () => this.editor.commands.undo(),
25435
- "Shift-Mod-\u044F": () => this.editor.commands.redo()
25436
- };
25437
- }
25438
- });
25439
- class RemoveNodeMarkStep extends Step {
25440
- static fromJSON(schema, json) {
25441
- if (typeof json.pos != "number") {
25442
- throw new RangeError("Invalid input for RemoveNodeMarkStep.fromJSON");
25443
- }
25444
- return new RemoveNodeMarkStep(json.pos, schema.markFromJSON(json.mark));
25445
- }
25446
- constructor(pos, mark) {
25447
- super();
25448
- this.pos = pos;
25449
- this.mark = mark;
25450
- }
25451
- apply(doc2) {
25452
- const node = doc2.nodeAt(this.pos);
25453
- if (!node)
25454
- return StepResult.fail("No node at mark step's position");
25455
- const updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks));
25456
- const slice2 = new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1);
25457
- return StepResult.fromReplace(doc2, this.pos, this.pos + 1, slice2);
25458
- }
25459
- invert(doc2) {
25460
- const node = doc2.nodeAt(this.pos);
25461
- if (!node || !this.mark.isInSet(node.marks))
25462
- return this;
25463
- return new AddNodeMarkStep(this.pos, this.mark);
25464
- }
25465
- map(mapping) {
25466
- const pos = mapping.mapResult(this.pos, 1);
25467
- return pos.deletedAfter ? null : new RemoveNodeMarkStep(pos.pos, this.mark);
25468
- }
25469
- toJSON() {
25470
- return { stepType: "removeNodeMark", pos: this.pos, mark: this.mark.toJSON() };
25471
- }
25472
- }
25473
- Step.jsonID("removeNodeMark", RemoveNodeMarkStep);
25474
- class AddNodeMarkStep extends Step {
25475
- static fromJSON(schema, json) {
25476
- if (typeof json.pos != "number") {
25477
- throw new RangeError("Invalid input for AddNodeMarkStep.fromJSON");
25478
- }
25479
- return new AddNodeMarkStep(json.pos, schema.markFromJSON(json.mark));
25480
- }
25481
- constructor(pos, mark) {
25482
- super();
25483
- this.pos = pos;
25484
- this.mark = mark;
25485
- }
25486
- apply(doc2) {
25487
- const node = doc2.nodeAt(this.pos);
25488
- if (!node)
25489
- return StepResult.fail("No node at mark step's position");
25490
- const updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks));
25491
- const slice2 = new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1);
25492
- return StepResult.fromReplace(doc2, this.pos, this.pos + 1, slice2);
25493
- }
25494
- invert(doc2) {
25495
- const node = doc2.nodeAt(this.pos);
25496
- if (node) {
25497
- const newSet = this.mark.addToSet(node.marks);
25498
- if (newSet.length === node.marks.length) {
25499
- for (const mark of node.marks) {
25500
- if (!mark.isInSet(newSet)) {
25501
- return new AddNodeMarkStep(this.pos, mark);
25502
- }
25503
- }
25504
- return new AddNodeMarkStep(this.pos, this.mark);
25505
- }
25506
- }
25507
- return new RemoveNodeMarkStep(this.pos, this.mark);
25508
- }
25509
- map(mapping) {
25510
- const pos = mapping.mapResult(this.pos, 1);
25511
- return pos.deletedAfter ? null : new AddNodeMarkStep(pos.pos, this.mark);
25512
- }
25513
- toJSON() {
25514
- return { stepType: "addNodeMark", pos: this.pos, mark: this.mark.toJSON() };
25515
- }
25516
- }
25517
- Step.jsonID("addNodeMark", AddNodeMarkStep);
25518
- class AttrStep extends Step {
25519
- static fromJSON(schema, json) {
25520
- if (typeof json.pos != "number" || typeof json.attr != "string") {
25521
- throw new RangeError("Invalid input for AttrStep.fromJSON");
25522
- }
25523
- return new AttrStep(json.pos, json.attr, json.value);
25524
- }
25525
- constructor(pos, attr, value) {
25526
- super();
25527
- this.pos = pos;
25528
- this.attr = attr;
25529
- this.value = value;
25530
- }
25531
- apply(doc2) {
25532
- const node = doc2.nodeAt(this.pos);
25533
- if (!node)
25534
- return StepResult.fail("No node at attribute step's position");
25535
- const attrs = /* @__PURE__ */ Object.create(null);
25536
- for (let name in node.attrs)
25537
- attrs[name] = node.attrs[name];
25538
- attrs[this.attr] = this.value;
25539
- const updated = node.type.create(attrs, null, node.marks);
25540
- const slice2 = new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1);
25541
- return StepResult.fromReplace(doc2, this.pos, this.pos + 1, slice2);
25542
- }
25543
- getMap() {
25544
- return StepMap.empty;
25545
- }
25546
- invert(doc2) {
25547
- return new AttrStep(this.pos, this.attr, doc2.nodeAt(this.pos).attrs[this.attr]);
25548
- }
25549
- map(mapping) {
25550
- let pos = mapping.mapResult(this.pos, 1);
25551
- return pos.deletedAfter ? null : new AttrStep(pos.pos, this.attr, this.value);
25552
- }
25553
- toJSON() {
25554
- return { stepType: "attr", pos: this.pos, attr: this.attr, value: this.value };
25555
- }
25556
- }
25557
- Step.jsonID("attr", AttrStep);
25558
- const NodeProcessor = Extension.create({
25559
- name: "node_processor",
25560
- addCommands() {
25561
- return {
25562
- setBlockAttributes: createCommand(({ commands: commands2, state }, name, attrs, defaults2 = {}) => {
25563
- var _a;
25564
- const current = (_a = unref(commands2.getBlockAttributes(name))) != null ? _a : {};
25565
- const { doc: doc2, tr } = state;
25566
- const { from: from2, to } = tr.selection;
25567
- doc2.nodesBetween(from2, to, (node, position) => {
25568
- if (!NodeTypes.blocks.includes(node.type.name))
25569
- return;
25570
- tr.step(new AttrStep(position, name, { ...defaults2, ...current, ...attrs }));
25571
- });
25572
- }),
25573
- getBlockAttributes: createCommand(({ editor }, name, defaults2) => computed(() => {
25574
- var _a;
25575
- let attrs = Object.assign({}, defaults2 || {});
25576
- for (const type of NodeTypes.blocks) {
25577
- Object.assign(attrs, ((_a = editor.getAttributes(type)) == null ? void 0 : _a[name]) || {});
25578
- }
25579
- return Object.keys(attrs).length ? attrs : null;
25580
- })),
25581
- removeBlockAttributes: createCommand(({ commands: commands2 }, names) => {
25582
- for (const type of NodeTypes.blocks) {
25583
- commands2.resetAttributes(type, names);
25584
- }
25585
- }),
25586
- applyMark: createCommand(({ state, commands: commands2 }, name, value, customizer = {}) => {
25587
- const { tr, doc: doc2, schema } = state;
25588
- const { $from, $to } = tr.selection;
25589
- const markType = getMarkType(name, schema);
25590
- const markGroup = markType.spec.group || "";
25591
- if (!markGroup.includes(MarkGroups.SETTINGS)) {
25592
- return commands2.setMark(name, value);
25593
- }
25594
- if ($from.pos === $to.pos)
25595
- return;
25596
- const onAppliedToParent = (context) => {
25597
- if (!customizer.onAppliedToParent || customizer.onAppliedToParent(context) === false) {
25598
- const { tr: tr2, node, position, mark } = context;
25599
- commands2._removeNodeMark({ tr: tr2, node, position, mark: mark.type });
25600
- }
25601
- };
25602
- doc2.nodesBetween($from.pos, $to.pos, (node, position) => {
25603
- if (node.type.name === NodeTypes.LIST)
25604
- return;
25605
- const initialMark = findMarkByType(node.marks, name);
25606
- const applyingMark = markType.create({ ...(initialMark == null ? void 0 : initialMark.attrs) || {}, ...value });
25607
- const textPosition = resolveTextPosition($from, $to, node, position);
25608
- if (isMarkAppliedToParent(tr.doc, position, applyingMark, customizer.isAppliedToParent)) {
25609
- return onAppliedToParent({ tr, node, position, mark: applyingMark });
25610
- }
25611
- if (node.isText) {
25612
- tr.addMark(textPosition.from, textPosition.to, applyingMark);
25613
- return;
25614
- }
25615
- if (isNodeFullySelected(tr.doc, tr.selection, node, position)) {
25616
- tr.step(new AddNodeMarkStep(position, applyingMark));
25617
- }
25618
- });
25619
- }),
25620
- getMarks: createCommand(({ editor }, name) => {
25621
- const stateRef = toRef(editor, "state");
25622
- return computed(() => {
25623
- const { selection, doc: doc2 } = unref(stateRef);
25624
- const { from: from2, to } = unref(selection);
25625
- const marks = [];
25626
- doc2.nodesBetween(from2, to, (node) => {
25627
- for (const mark of node.marks) {
25628
- if (mark.type.name === name)
25629
- marks.unshift(mark.attrs);
25630
- }
25631
- });
25632
- return marks;
25633
- });
25634
- }),
25635
- getMark: createCommand(({ commands: commands2 }, name) => {
25636
- const marksRef = commands2.getMarks(name);
25637
- return computed(() => {
25638
- var _a;
25639
- return (_a = unref(marksRef)[0]) != null ? _a : null;
25640
- });
25641
- }),
25642
- hasMark: createCommand(({ commands: commands2 }, name) => {
25643
- const mark = commands2.getMark(name);
25644
- return computed(() => !!unref(mark));
25645
- }),
25646
- getCommonSettingMark: createCommand(({ commands: commands2 }, name, defaultRef) => {
25647
- const selectionRef = commands2.getMark(name);
25648
- return computed(() => {
25649
- var _a, _b;
25650
- return (_b = (_a = unref(selectionRef)) == null ? void 0 : _a.value) != null ? _b : unref(defaultRef);
25651
- });
25652
- }),
25653
- getDeviceSettingMark: createCommand(({ commands: commands2 }, name, defaultRef) => {
25654
- const selectionRef = commands2.getMarks(name);
25655
- const deviceRef = commands2.getDevice();
25656
- return computed(() => {
25657
- for (const attrs of unref(selectionRef)) {
25658
- const value = attrs[unref(deviceRef)];
25659
- if (value)
25660
- return value;
25661
- }
25662
- return unref(defaultRef);
25663
- });
25664
- }),
25665
- removeAllMarks: createCommand(({ state, commands: commands2 }) => {
25666
- const { tr, doc: doc2 } = state;
25667
- const { from: from2, to } = tr.selection;
25668
- doc2.nodesBetween(from2, to, (node, position) => {
25669
- for (const mark of node.marks) {
25670
- commands2._removeNodeMark({ tr, node, position, mark });
25671
- }
25672
- });
25673
- }),
25674
- removeMarks: createCommand(({ state, commands: commands2 }, marks) => {
25675
- const { tr, doc: doc2 } = state;
25676
- const { from: from2, to } = tr.selection;
25677
- doc2.nodesBetween(from2, to, (node, position) => {
25678
- const removingMarks = node.marks.filter((mark) => marks.includes(mark.type.name));
25679
- for (const mark of removingMarks) {
25680
- commands2._removeNodeMark({ tr, node, position, mark });
25681
- }
25682
- });
25683
- }),
25684
- _removeNodeMark: createCommand((context, { tr, node, position, mark }) => {
25685
- return node.isText ? tr.removeMark(position, position + node.nodeSize, mark) : tr.step(new RemoveNodeMarkStep(position, mark));
25686
- })
25687
- };
25688
- }
25689
- });
25690
- const TextProcessor = Extension.create({
25691
- name: "text_processor",
25692
- addCommands() {
25693
- return {
25694
- getSelectedText: createCommand(({ state }) => {
25695
- const { from: from2, to } = state.selection;
25696
- return state.doc.textBetween(from2, to, " ");
25697
- }),
25698
- transformText: createCommand(({ state }, transform) => {
25699
- const { $from, $to } = state.tr.selection;
25700
- if ($from.pos === $to.pos)
25701
- return;
25702
- state.doc.nodesBetween($from.pos, $to.pos, (node, position) => {
25703
- if (!node.isText)
25704
- return;
25705
- const textPosition = resolveTextPosition($from, $to, node, position);
25706
- const substringFrom = Math.max(0, $from.pos - position);
25707
- const substringTo = Math.max(0, $to.pos - position);
25708
- const updatedText = transform({
25709
- text: node.textContent.substring(substringFrom, substringTo)
25710
- });
25711
- const updatedNode = state.schema.text(updatedText, node.marks);
25712
- state.tr.replaceWith(textPosition.from, textPosition.to, updatedNode);
25713
- });
25714
- })
25715
- };
25716
- }
25717
- });
25718
- const SelectionProcessor = Extension.create({
25719
- name: "selection_processor",
25720
- addStorage: () => ({
25721
- selection: null
25722
- }),
25723
- addCommands() {
25724
- return {
25725
- storeSelection: createCommand(({ state }) => {
25726
- this.storage.selection = state.selection;
25727
- }),
25728
- restoreSelection: createCommand(({ commands: commands2 }) => {
25729
- this.storage.selection && commands2.setTextSelection(this.storage.selection);
25730
- }),
25731
- expandSelection: createCommand(({ tr, commands: commands2 }, predicate) => {
25732
- let from2 = tr.selection.from;
25733
- let to = tr.selection.to;
25734
- tr.doc.nodesBetween(from2, to, (node, position, parent) => {
25735
- if (predicate({ node, parent })) {
25736
- const offset2 = node.isText ? 0 : resolvePositionOffset(tr.doc, position);
25737
- from2 = Math.min(from2, position + offset2);
25738
- to = Math.max(to, position + node.nodeSize - offset2);
25739
- }
25740
- });
25741
- commands2.setTextSelection({ from: from2, to });
25742
- }),
25743
- expandSelectionToBlock: createCommand(({ commands: commands2 }) => {
25744
- commands2.expandSelection(({ parent }) => parent.type.name === NodeTypes.DOCUMENT);
25745
- })
25746
- };
25747
- }
25748
- });
25749
- const Document$1 = Node.create({
25750
- name: "doc",
25751
- topNode: true,
25752
- content: "block+"
25753
- });
25754
- const Document = Document$1.extend({
25755
- marks: MarkGroups.SETTINGS
25756
- });
25757
- const Paragraph$1 = Node.create({
25758
- name: "paragraph",
25759
- priority: 1e3,
25760
- addOptions() {
25761
- return {
25762
- HTMLAttributes: {}
25763
- };
25764
- },
25765
- group: "block",
25766
- content: "inline*",
25767
- parseHTML() {
25768
- return [
25769
- { tag: "p" }
25770
- ];
25771
- },
25772
- renderHTML({ HTMLAttributes }) {
25773
- return ["p", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];
25774
- },
25775
- addCommands() {
25776
- return {
25777
- setParagraph: () => ({ commands: commands2 }) => {
25778
- return commands2.setNode(this.name);
25779
- }
25780
- };
25781
- },
25782
- addKeyboardShortcuts() {
25783
- return {
25784
- "Mod-Alt-0": () => this.editor.commands.setParagraph()
25785
- };
25786
- }
25787
- });
25788
- const Paragraph = Paragraph$1.extend({
25789
- marks: MarkGroups.ALL,
25790
- addOptions: () => ({
25791
- HTMLAttributes: { class: "zw-style" }
25792
- })
25793
- });
25794
- const Heading$1 = Node.create({
25795
- name: "heading",
25796
- addOptions() {
25797
- return {
25798
- levels: [1, 2, 3, 4, 5, 6],
25799
- HTMLAttributes: {}
25800
- };
25801
- },
25802
- content: "inline*",
25803
- group: "block",
25804
- defining: true,
25805
- addAttributes() {
25806
- return {
25807
- level: {
25808
- default: 1,
25809
- rendered: false
25810
- }
25811
- };
25812
- },
25813
- parseHTML() {
25814
- return this.options.levels.map((level) => ({
25815
- tag: `h${level}`,
25816
- attrs: { level }
25817
- }));
25818
- },
25819
- renderHTML({ node, HTMLAttributes }) {
25820
- const hasLevel = this.options.levels.includes(node.attrs.level);
25821
- const level = hasLevel ? node.attrs.level : this.options.levels[0];
25822
- return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];
25823
- },
25824
- addCommands() {
25825
- return {
25826
- setHeading: (attributes) => ({ commands: commands2 }) => {
25827
- if (!this.options.levels.includes(attributes.level)) {
25828
- return false;
25829
- }
25830
- return commands2.setNode(this.name, attributes);
25831
- },
25832
- toggleHeading: (attributes) => ({ commands: commands2 }) => {
25833
- if (!this.options.levels.includes(attributes.level)) {
25834
- return false;
25835
- }
25836
- return commands2.toggleNode(this.name, "paragraph", attributes);
25837
- }
25838
- };
25839
- },
25840
- addKeyboardShortcuts() {
25841
- return this.options.levels.reduce((items, level) => ({
25842
- ...items,
25843
- ...{
25844
- [`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level })
25845
- }
25846
- }), {});
25847
- },
25848
- addInputRules() {
25849
- return this.options.levels.map((level) => {
25850
- return textblockTypeInputRule({
25851
- find: new RegExp(`^(#{1,${level}})\\s$`),
25852
- type: this.type,
25853
- getAttributes: {
25854
- level
25855
- }
25856
- });
25857
- });
25858
- }
25859
- });
25860
- const Heading = Heading$1.extend({
25861
- marks: MarkGroups.ALL,
25862
- addOptions: () => ({
25863
- levels: [1, 2, 3, 4],
25864
- HTMLAttributes: { class: "zw-style" }
25865
- })
25866
- });
25867
- class ProseMirrorPlugin {
25868
- static create(editor, options) {
25869
- const plugin = new this(editor, options || {});
25870
- return new Plugin({
25871
- key: new PluginKey(this.name),
25872
- props: plugin.buildProps()
25873
- });
25874
- }
25875
- constructor(editor, options) {
25876
- this.options = options;
25877
- this.editor = editor;
25878
- }
25879
- buildProps() {
25880
- return {};
25881
- }
25882
- }
25883
- class PastePlugin extends ProseMirrorPlugin {
25884
- buildProps() {
25885
- return {
25886
- transformPastedHTML: this._transformPastedHTML.bind(this),
25887
- handlePaste: this._handlePaste.bind(this)
25888
- };
25889
- }
25890
- _transformPastedHTML(html2) {
25891
- if (html2.includes("data-pm-slice") && html2.includes("zw-style")) {
25892
- return html2;
25893
- }
25894
- const normalizer = ContentNormalizer.build(html2);
25895
- normalizer.normalizeHTML();
25896
- this._removeDeprecatedStyles(normalizer);
25897
- return normalizer.normalizedHTML;
25898
- }
25899
- _removeDeprecatedStyles(normalizer) {
25900
- const elements = normalizer.dom.querySelectorAll('[style*="margin"]');
25901
- for (const element of Array.from(elements)) {
25902
- element.style.removeProperty("margin");
25903
- element.style.removeProperty("margin-top");
25904
- element.style.removeProperty("margin-right");
25905
- element.style.removeProperty("margin-bottom");
25906
- element.style.removeProperty("margin-left");
25907
- }
25908
- }
25909
- _handlePaste(view, _, slice2) {
25910
- const transaction = this._insertPastedContent(view, slice2).scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste");
25911
- view.dispatch(transaction);
25912
- return true;
25913
- }
25914
- _insertPastedContent({ state, input }, slice2) {
25915
- if (!this._isFullBlockSelected(state)) {
25916
- return state.tr.replaceSelection(slice2);
25917
- }
25918
- return state.tr.replaceSelectionWith(slice2.content, input.shiftKey);
25919
- }
25920
- _isFullBlockSelected(state) {
25921
- const blocksSelection = this._expandSelectionToBlocks(state);
25922
- const isFromMatch = this._isMatchPosition(blocksSelection.from, state.selection.from);
25923
- const isToMatch = this._isMatchPosition(blocksSelection.to, state.selection.to);
25924
- return isFromMatch && isToMatch;
25925
- }
25926
- _expandSelectionToBlocks({ selection, doc: doc2 }) {
25927
- let from2 = selection.from;
25928
- let to = selection.to;
25929
- doc2.nodesBetween(from2, to, (node, position, parent) => {
25930
- if (parent.type.name !== NodeTypes.DOCUMENT)
25931
- return;
25932
- from2 = Math.min(from2, position + 1);
25933
- to = Math.max(to, position + node.nodeSize - 1);
25934
- });
25935
- return { from: from2, to };
25936
- }
25937
- _isMatchPosition(position1, position2) {
25938
- return Math.abs(position1 - position2) < 5;
25939
- }
25940
- }
25941
- class PlaceholderPlugin extends ProseMirrorPlugin {
25942
- constructor() {
25943
- super(...arguments);
25944
- __privateAdd(this, _buildDecorations);
25945
- }
25946
- buildProps() {
25947
- return { decorations: __privateMethod(this, _buildDecorations, buildDecorations_fn).bind(this) };
25948
- }
25949
- }
25950
- _buildDecorations = new WeakSet();
25951
- buildDecorations_fn = function({ doc: doc2 }) {
25952
- const decorations = [];
25953
- if (!this.editor.isEditable)
25954
- return null;
25955
- if (doc2.childCount > 1)
25956
- return;
25957
- doc2.descendants((node, pos) => {
25958
- if (!node.childCount) {
25959
- const decoration = Decoration.node(pos, pos + node.nodeSize, {
25960
- class: "zw-wysiwyg__placeholder",
25961
- "data-placeholder": "Type your text here..."
25962
- });
25963
- decorations.push(decoration);
25964
- }
25965
- return false;
25966
- });
25967
- return DecorationSet.create(doc2, decorations);
25968
- };
25969
- const ProseMirrorPlugins = Extension.create({
25970
- name: "prose_mirror_plugins",
25971
- addProseMirrorPlugins() {
25972
- return [
25973
- PastePlugin.create(this.editor),
25974
- PlaceholderPlugin.create(this.editor)
25975
- ];
25976
- }
25977
- });
25978
- const buildCoreExtensions = () => [
25979
- Document,
25980
- Paragraph,
25981
- Heading,
25982
- Text$1,
25983
- History,
25984
- NodeProcessor,
25985
- TextProcessor,
25986
- SelectionProcessor,
25987
- ProseMirrorPlugins
25988
- ];
25989
- const FontSize = Mark.create({
25990
- name: TextSettings.FONT_SIZE,
25991
- group: MarkGroups.SETTINGS,
25992
- addOptions: () => ({
25993
- minSize: 1,
25994
- maxSize: 100
25995
- }),
25996
- addAttributes() {
25997
- return {
25998
- mobile: { default: null },
25999
- tablet: { default: null },
26000
- desktop: { default: null }
26001
- };
26002
- },
26003
- addCommands() {
26004
- return {
26005
- getFontSize: createCommand(({ commands: commands2 }) => {
26006
- return commands2.getDeviceSettingMark(this.name, commands2.getDefaultFontSize());
26007
- }),
26008
- getDefaultFontSize: createCommand(({ commands: commands2 }) => {
26009
- const device = commands2.getDevice();
26010
- const preset = commands2.getPreset();
26011
- return computed(() => unref(preset)[unref(device)].font_size.replace("px", ""));
26012
- }),
26013
- applyFontSize: createCommand(({ commands: commands2 }, value) => {
26014
- const device = unref(commands2.getDevice());
26015
- commands2.applyMark(this.name, { [device]: value }, {
26016
- isAppliedToParent: (parentMark, mark) => {
26017
- if (parentMark.type.name !== mark.type.name)
26018
- return false;
26019
- return parentMark.attrs[device] === mark.attrs[device];
26020
- },
26021
- onAppliedToParent: ({ tr, node, position, mark }) => {
26022
- const attrs = { ...mark.attrs, [device]: null };
26023
- const canRemove = !Object.values(attrs).some((value2) => !!value2);
26024
- if (canRemove)
26025
- return false;
26026
- const updated = mark.type.create(attrs);
26027
- if (node.isText) {
26028
- tr.addMark(position, position + node.nodeSize, updated);
26029
- return;
26030
- }
26031
- tr.step(new AddNodeMarkStep(position, updated));
26032
- }
26033
- });
26034
- }),
26035
- increaseFontSize: createCommand(({ commands: commands2 }) => {
26036
- const size2 = Number(unref(commands2.getFontSize()));
26037
- const nextSize = Math.min(size2 + 1, this.options.maxSize);
26038
- commands2.applyFontSize(String(nextSize));
26039
- }),
26040
- decreaseFontSize: createCommand(({ commands: commands2 }) => {
26041
- const size2 = Number(unref(commands2.getFontSize()));
26042
- const nextSize = Math.max(size2 - 1, this.options.minSize);
26043
- commands2.applyFontSize(String(nextSize));
26044
- })
26045
- };
26046
- },
26047
- addKeyboardShortcuts: () => ({
26048
- "Mod-Shift-=": createKeyboardShortcut("increaseFontSize"),
26049
- "Mod-Shift--": createKeyboardShortcut("decreaseFontSize")
26050
- }),
26051
- parseHTML() {
26052
- const parseSize = (value) => {
26053
- if (!value)
26054
- return null;
26055
- const wrapperEl = unref(this.options.wrapperRef);
26056
- const converted = convertFontSize(value, wrapperEl);
26057
- return String(converted);
26058
- };
26059
- return [
26060
- {
26061
- tag: '[style*="--zw-font-size"]',
26062
- getAttrs: ({ style: style2 }) => ({
26063
- mobile: parseSize(style2.getPropertyValue("--zw-font-size-mobile")),
26064
- tablet: parseSize(style2.getPropertyValue("--zw-font-size-tablet")),
26065
- desktop: parseSize(style2.getPropertyValue("--zw-font-size-desktop"))
26066
- })
26067
- },
26068
- {
26069
- style: "font-size",
26070
- getAttrs: (input) => {
26071
- const value = parseSize(input);
26072
- return { desktop: value, tablet: value, mobile: null };
26073
- }
26074
- }
26075
- ];
26076
- },
26077
- renderHTML({ HTMLAttributes: attrs }) {
26078
- const addUnits = (value) => value ? `${value}px` : null;
26079
- return renderMark({
26080
- font_size_mobile: addUnits(attrs.mobile),
26081
- font_size_tablet: addUnits(attrs.tablet),
26082
- font_size_desktop: addUnits(attrs.desktop)
26083
- });
26084
- }
26085
- });
26086
- const FontColor = Mark.create({
26087
- name: TextSettings.FONT_COLOR,
26088
- group: MarkGroups.SETTINGS,
26089
- addAttributes: () => ({
26090
- value: { required: true }
26091
- }),
26092
- addCommands() {
26093
- return {
26094
- getFontColor: createCommand(({ commands: commands2 }) => {
26095
- return commands2.getCommonSettingMark(this.name, commands2.getDefaultFontColor());
26096
- }),
26097
- getDefaultFontColor: createCommand(({ commands: commands2 }) => {
26098
- const preset = commands2.getPreset();
26099
- return computed(() => unref(preset).common.color);
26100
- }),
26101
- applyFontColor: createCommand(({ commands: commands2 }, value) => {
26102
- commands2.applyMark(this.name, { value });
26103
- })
26104
- };
26105
- },
26106
- parseHTML() {
26107
- const getAttrs = (value) => ({ value: convertColor(value) });
26108
- return [
26109
- {
26110
- style: "--zw-font-color",
26111
- getAttrs
26112
- },
26113
- {
26114
- style: "color",
26115
- getAttrs
26116
- }
26117
- ];
26118
- },
26119
- renderHTML({ HTMLAttributes: attrs }) {
26120
- return renderMark({ font_color: attrs.value });
26121
- }
26122
- });
26123
- const BackgroundColor = Mark.create({
26124
- name: TextSettings.BACKGROUND_COLOR,
26125
- addAttributes: () => ({
26126
- value: { required: true }
26127
- }),
26128
- addCommands() {
26129
- return {
26130
- getBackgroundColor: createCommand(({ commands: commands2 }) => {
26131
- return commands2.getCommonSettingMark(this.name, "rgba(255, 255, 255, 0%)");
26132
- }),
26133
- applyBackgroundColor: createCommand(({ commands: commands2 }, value) => {
26134
- commands2.applyMark(this.name, { value });
26135
- })
26136
- };
26137
- },
26138
- parseHTML() {
26139
- const getAttrs = (value) => ({ value: convertColor(value) });
26140
- return [
26141
- {
26142
- style: "--zw-background-color",
26143
- getAttrs
26144
- },
26145
- {
26146
- style: "background-color",
26147
- getAttrs
26148
- }
26149
- ];
26150
- },
26151
- renderHTML({ HTMLAttributes: attrs }) {
26152
- return renderMark({ background_color: attrs.value });
26153
- }
26154
- });
26155
- const DeviceManager = Extension.create({
26156
- name: "device_manager",
26157
- addCommands() {
26158
- return {
26159
- getDevice: createCommand(() => toRef(this.options, "device"))
26160
- };
25021
+ });
25022
+ const DeviceManager = Extension.create({
25023
+ name: "device_manager",
25024
+ addCommands() {
25025
+ return {
25026
+ getDevice: createCommand(() => toRef(this.options, "device"))
25027
+ };
26161
25028
  }
26162
25029
  });
26163
25030
  const FontStyle = Mark.create({
@@ -26420,8 +25287,7 @@ const Alignment = Extension.create({
26420
25287
  !isCurrentValue ? commands2.applyAlignment(value) : commands2.removeAlignment();
26421
25288
  }),
26422
25289
  applyAlignment: createCommand(({ commands: commands2 }, value) => {
26423
- const device = unref(commands2.getDevice());
26424
- commands2.setBlockAttributes(this.name, { [device]: value }, DEFAULTS$1);
25290
+ commands2.setBlockAttributes(this.name, { desktop: value, tablet: value, mobile: value });
26425
25291
  }),
26426
25292
  removeAlignment: createCommand(({ commands: commands2 }) => commands2.removeBlockAttributes(this.name)),
26427
25293
  getAlignment: createCommand(({ commands: commands2 }) => {
@@ -26473,7 +25339,7 @@ const LineHeight = Extension.create({
26473
25339
  return null;
26474
25340
  const wrapperEl = unref(this.options.wrapperRef);
26475
25341
  const converted = convertLineHeight(value, element, wrapperEl);
26476
- return converted ? { desktop: converted, tablet: converted, mobile: null } : null;
25342
+ return { desktop: converted, tablet: converted, mobile: null };
26477
25343
  },
26478
25344
  renderHTML(attrs) {
26479
25345
  if (!attrs.line_height)
@@ -26506,12 +25372,130 @@ const LineHeight = Extension.create({
26506
25372
  return computed(() => unref(preset)[unref(device)].line_height);
26507
25373
  }),
26508
25374
  applyLineHeight: createCommand(({ commands: commands2 }, value) => {
26509
- const device = unref(commands2.getDevice());
26510
- commands2.setBlockAttributes(this.name, { [device]: value }, DEFAULTS);
25375
+ commands2.setBlockAttributes(this.name, { desktop: value, tablet: value, mobile: null }, DEFAULTS);
26511
25376
  })
26512
25377
  };
26513
25378
  }
26514
- });
25379
+ });
25380
+ class RemoveNodeMarkStep extends Step {
25381
+ static fromJSON(schema, json) {
25382
+ if (typeof json.pos != "number") {
25383
+ throw new RangeError("Invalid input for RemoveNodeMarkStep.fromJSON");
25384
+ }
25385
+ return new RemoveNodeMarkStep(json.pos, schema.markFromJSON(json.mark));
25386
+ }
25387
+ constructor(pos, mark) {
25388
+ super();
25389
+ this.pos = pos;
25390
+ this.mark = mark;
25391
+ }
25392
+ apply(doc2) {
25393
+ const node = doc2.nodeAt(this.pos);
25394
+ if (!node)
25395
+ return StepResult.fail("No node at mark step's position");
25396
+ const updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks));
25397
+ const slice2 = new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1);
25398
+ return StepResult.fromReplace(doc2, this.pos, this.pos + 1, slice2);
25399
+ }
25400
+ invert(doc2) {
25401
+ const node = doc2.nodeAt(this.pos);
25402
+ if (!node || !this.mark.isInSet(node.marks))
25403
+ return this;
25404
+ return new AddNodeMarkStep(this.pos, this.mark);
25405
+ }
25406
+ map(mapping) {
25407
+ const pos = mapping.mapResult(this.pos, 1);
25408
+ return pos.deletedAfter ? null : new RemoveNodeMarkStep(pos.pos, this.mark);
25409
+ }
25410
+ toJSON() {
25411
+ return { stepType: "removeNodeMark", pos: this.pos, mark: this.mark.toJSON() };
25412
+ }
25413
+ }
25414
+ Step.jsonID("removeNodeMark", RemoveNodeMarkStep);
25415
+ class AddNodeMarkStep extends Step {
25416
+ static fromJSON(schema, json) {
25417
+ if (typeof json.pos != "number") {
25418
+ throw new RangeError("Invalid input for AddNodeMarkStep.fromJSON");
25419
+ }
25420
+ return new AddNodeMarkStep(json.pos, schema.markFromJSON(json.mark));
25421
+ }
25422
+ constructor(pos, mark) {
25423
+ super();
25424
+ this.pos = pos;
25425
+ this.mark = mark;
25426
+ }
25427
+ apply(doc2) {
25428
+ const node = doc2.nodeAt(this.pos);
25429
+ if (!node)
25430
+ return StepResult.fail("No node at mark step's position");
25431
+ const updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks));
25432
+ const slice2 = new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1);
25433
+ return StepResult.fromReplace(doc2, this.pos, this.pos + 1, slice2);
25434
+ }
25435
+ invert(doc2) {
25436
+ const node = doc2.nodeAt(this.pos);
25437
+ if (node) {
25438
+ const newSet = this.mark.addToSet(node.marks);
25439
+ if (newSet.length === node.marks.length) {
25440
+ for (const mark of node.marks) {
25441
+ if (!mark.isInSet(newSet)) {
25442
+ return new AddNodeMarkStep(this.pos, mark);
25443
+ }
25444
+ }
25445
+ return new AddNodeMarkStep(this.pos, this.mark);
25446
+ }
25447
+ }
25448
+ return new RemoveNodeMarkStep(this.pos, this.mark);
25449
+ }
25450
+ map(mapping) {
25451
+ const pos = mapping.mapResult(this.pos, 1);
25452
+ return pos.deletedAfter ? null : new AddNodeMarkStep(pos.pos, this.mark);
25453
+ }
25454
+ toJSON() {
25455
+ return { stepType: "addNodeMark", pos: this.pos, mark: this.mark.toJSON() };
25456
+ }
25457
+ }
25458
+ Step.jsonID("addNodeMark", AddNodeMarkStep);
25459
+ class AttrStep extends Step {
25460
+ static fromJSON(schema, json) {
25461
+ if (typeof json.pos != "number" || typeof json.attr != "string") {
25462
+ throw new RangeError("Invalid input for AttrStep.fromJSON");
25463
+ }
25464
+ return new AttrStep(json.pos, json.attr, json.value);
25465
+ }
25466
+ constructor(pos, attr, value) {
25467
+ super();
25468
+ this.pos = pos;
25469
+ this.attr = attr;
25470
+ this.value = value;
25471
+ }
25472
+ apply(doc2) {
25473
+ const node = doc2.nodeAt(this.pos);
25474
+ if (!node)
25475
+ return StepResult.fail("No node at attribute step's position");
25476
+ const attrs = /* @__PURE__ */ Object.create(null);
25477
+ for (let name in node.attrs)
25478
+ attrs[name] = node.attrs[name];
25479
+ attrs[this.attr] = this.value;
25480
+ const updated = node.type.create(attrs, null, node.marks);
25481
+ const slice2 = new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1);
25482
+ return StepResult.fromReplace(doc2, this.pos, this.pos + 1, slice2);
25483
+ }
25484
+ getMap() {
25485
+ return StepMap.empty;
25486
+ }
25487
+ invert(doc2) {
25488
+ return new AttrStep(this.pos, this.attr, doc2.nodeAt(this.pos).attrs[this.attr]);
25489
+ }
25490
+ map(mapping) {
25491
+ let pos = mapping.mapResult(this.pos, 1);
25492
+ return pos.deletedAfter ? null : new AttrStep(pos.pos, this.attr, this.value);
25493
+ }
25494
+ toJSON() {
25495
+ return { stepType: "attr", pos: this.pos, attr: this.attr, value: this.value };
25496
+ }
25497
+ }
25498
+ Step.jsonID("attr", AttrStep);
26515
25499
  const ListItem$1 = Node.create({
26516
25500
  name: "listItem",
26517
25501
  addOptions() {
@@ -26922,881 +25906,1871 @@ function init$2() {
26922
25906
  state.j = {
26923
25907
  "-": S_DOMAIN_HYPHEN
26924
25908
  };
26925
- state.jr = [].concat(DOMAIN_REGEX_TRANSITIONS);
26926
- return state;
26927
- };
26928
- var makeNearDomainState = function makeNearDomainState2(token) {
26929
- var state = makeDomainState();
26930
- state.t = token;
26931
- return state;
26932
- };
26933
- makeBatchT(S_START, [["'", makeAcceptingState(APOSTROPHE)], ["{", makeAcceptingState(OPENBRACE)], ["[", makeAcceptingState(OPENBRACKET)], ["<", makeAcceptingState(OPENANGLEBRACKET)], ["(", makeAcceptingState(OPENPAREN)], ["}", makeAcceptingState(CLOSEBRACE)], ["]", makeAcceptingState(CLOSEBRACKET)], [">", makeAcceptingState(CLOSEANGLEBRACKET)], [")", makeAcceptingState(CLOSEPAREN)], ["&", makeAcceptingState(AMPERSAND)], ["*", makeAcceptingState(ASTERISK)], ["@", makeAcceptingState(AT)], ["`", makeAcceptingState(BACKTICK)], ["^", makeAcceptingState(CARET)], [":", makeAcceptingState(COLON)], [",", makeAcceptingState(COMMA)], ["$", makeAcceptingState(DOLLAR)], [".", makeAcceptingState(DOT)], ["=", makeAcceptingState(EQUALS)], ["!", makeAcceptingState(EXCLAMATION)], ["-", makeAcceptingState(HYPHEN)], ["%", makeAcceptingState(PERCENT)], ["|", makeAcceptingState(PIPE)], ["+", makeAcceptingState(PLUS)], ["#", makeAcceptingState(POUND)], ["?", makeAcceptingState(QUERY)], ['"', makeAcceptingState(QUOTE)], ["/", makeAcceptingState(SLASH)], [";", makeAcceptingState(SEMI)], ["~", makeAcceptingState(TILDE)], ["_", makeAcceptingState(UNDERSCORE)], ["\\", makeAcceptingState(BACKSLASH)]]);
26934
- makeT(S_START, "\n", makeAcceptingState(NL));
26935
- makeRegexT(S_START, SPACE, S_WS);
26936
- makeT(S_WS, "\n", makeState());
26937
- makeRegexT(S_WS, SPACE, S_WS);
26938
- for (var i = 0; i < tlds.length; i++) {
26939
- makeChainT(S_START, tlds[i], makeNearDomainState(TLD), makeDomainState);
25909
+ state.jr = [].concat(DOMAIN_REGEX_TRANSITIONS);
25910
+ return state;
25911
+ };
25912
+ var makeNearDomainState = function makeNearDomainState2(token) {
25913
+ var state = makeDomainState();
25914
+ state.t = token;
25915
+ return state;
25916
+ };
25917
+ makeBatchT(S_START, [["'", makeAcceptingState(APOSTROPHE)], ["{", makeAcceptingState(OPENBRACE)], ["[", makeAcceptingState(OPENBRACKET)], ["<", makeAcceptingState(OPENANGLEBRACKET)], ["(", makeAcceptingState(OPENPAREN)], ["}", makeAcceptingState(CLOSEBRACE)], ["]", makeAcceptingState(CLOSEBRACKET)], [">", makeAcceptingState(CLOSEANGLEBRACKET)], [")", makeAcceptingState(CLOSEPAREN)], ["&", makeAcceptingState(AMPERSAND)], ["*", makeAcceptingState(ASTERISK)], ["@", makeAcceptingState(AT)], ["`", makeAcceptingState(BACKTICK)], ["^", makeAcceptingState(CARET)], [":", makeAcceptingState(COLON)], [",", makeAcceptingState(COMMA)], ["$", makeAcceptingState(DOLLAR)], [".", makeAcceptingState(DOT)], ["=", makeAcceptingState(EQUALS)], ["!", makeAcceptingState(EXCLAMATION)], ["-", makeAcceptingState(HYPHEN)], ["%", makeAcceptingState(PERCENT)], ["|", makeAcceptingState(PIPE)], ["+", makeAcceptingState(PLUS)], ["#", makeAcceptingState(POUND)], ["?", makeAcceptingState(QUERY)], ['"', makeAcceptingState(QUOTE)], ["/", makeAcceptingState(SLASH)], [";", makeAcceptingState(SEMI)], ["~", makeAcceptingState(TILDE)], ["_", makeAcceptingState(UNDERSCORE)], ["\\", makeAcceptingState(BACKSLASH)]]);
25918
+ makeT(S_START, "\n", makeAcceptingState(NL));
25919
+ makeRegexT(S_START, SPACE, S_WS);
25920
+ makeT(S_WS, "\n", makeState());
25921
+ makeRegexT(S_WS, SPACE, S_WS);
25922
+ for (var i = 0; i < tlds.length; i++) {
25923
+ makeChainT(S_START, tlds[i], makeNearDomainState(TLD), makeDomainState);
25924
+ }
25925
+ var S_PROTOCOL_FILE = makeDomainState();
25926
+ var S_PROTOCOL_FTP = makeDomainState();
25927
+ var S_PROTOCOL_HTTP = makeDomainState();
25928
+ var S_MAILTO = makeDomainState();
25929
+ makeChainT(S_START, "file", S_PROTOCOL_FILE, makeDomainState);
25930
+ makeChainT(S_START, "ftp", S_PROTOCOL_FTP, makeDomainState);
25931
+ makeChainT(S_START, "http", S_PROTOCOL_HTTP, makeDomainState);
25932
+ makeChainT(S_START, "mailto", S_MAILTO, makeDomainState);
25933
+ var S_PROTOCOL_SECURE = makeDomainState();
25934
+ var S_FULL_PROTOCOL = makeAcceptingState(PROTOCOL);
25935
+ var S_FULL_MAILTO = makeAcceptingState(MAILTO);
25936
+ makeT(S_PROTOCOL_FTP, "s", S_PROTOCOL_SECURE);
25937
+ makeT(S_PROTOCOL_FTP, ":", S_FULL_PROTOCOL);
25938
+ makeT(S_PROTOCOL_HTTP, "s", S_PROTOCOL_SECURE);
25939
+ makeT(S_PROTOCOL_HTTP, ":", S_FULL_PROTOCOL);
25940
+ makeT(S_PROTOCOL_FILE, ":", S_FULL_PROTOCOL);
25941
+ makeT(S_PROTOCOL_SECURE, ":", S_FULL_PROTOCOL);
25942
+ makeT(S_MAILTO, ":", S_FULL_MAILTO);
25943
+ var S_CUSTOM_PROTOCOL = makeDomainState();
25944
+ for (var _i = 0; _i < customProtocols.length; _i++) {
25945
+ makeChainT(S_START, customProtocols[_i], S_CUSTOM_PROTOCOL, makeDomainState);
25946
+ }
25947
+ makeT(S_CUSTOM_PROTOCOL, ":", S_FULL_PROTOCOL);
25948
+ makeChainT(S_START, "localhost", makeNearDomainState(LOCALHOST), makeDomainState);
25949
+ makeRegexT(S_START, DIGIT, S_NUM);
25950
+ makeRegexT(S_START, LETTER, S_DOMAIN);
25951
+ makeRegexT(S_START, EMOJI, S_DOMAIN);
25952
+ makeRegexT(S_START, EMOJI_VARIATION, S_DOMAIN);
25953
+ makeRegexT(S_NUM, DIGIT, S_NUM);
25954
+ makeRegexT(S_NUM, LETTER, S_DOMAIN);
25955
+ makeRegexT(S_NUM, EMOJI, S_DOMAIN);
25956
+ makeRegexT(S_NUM, EMOJI_VARIATION, S_DOMAIN);
25957
+ makeT(S_NUM, "-", S_DOMAIN_HYPHEN);
25958
+ makeT(S_DOMAIN, "-", S_DOMAIN_HYPHEN);
25959
+ makeT(S_DOMAIN_HYPHEN, "-", S_DOMAIN_HYPHEN);
25960
+ makeRegexT(S_DOMAIN, DIGIT, S_DOMAIN);
25961
+ makeRegexT(S_DOMAIN, LETTER, S_DOMAIN);
25962
+ makeRegexT(S_DOMAIN, EMOJI, S_DOMAIN);
25963
+ makeRegexT(S_DOMAIN, EMOJI_VARIATION, S_DOMAIN);
25964
+ makeRegexT(S_DOMAIN_HYPHEN, DIGIT, S_DOMAIN);
25965
+ makeRegexT(S_DOMAIN_HYPHEN, LETTER, S_DOMAIN);
25966
+ makeRegexT(S_DOMAIN_HYPHEN, EMOJI, S_DOMAIN);
25967
+ makeRegexT(S_DOMAIN_HYPHEN, EMOJI_VARIATION, S_DOMAIN);
25968
+ S_START.jd = makeAcceptingState(SYM);
25969
+ return S_START;
25970
+ }
25971
+ function run$1(start2, str) {
25972
+ var iterable = stringToArray(str.replace(/[A-Z]/g, function(c) {
25973
+ return c.toLowerCase();
25974
+ }));
25975
+ var charCount = iterable.length;
25976
+ var tokens = [];
25977
+ var cursor = 0;
25978
+ var charCursor = 0;
25979
+ while (charCursor < charCount) {
25980
+ var state = start2;
25981
+ var nextState = null;
25982
+ var tokenLength = 0;
25983
+ var latestAccepting = null;
25984
+ var sinceAccepts = -1;
25985
+ var charsSinceAccepts = -1;
25986
+ while (charCursor < charCount && (nextState = takeT(state, iterable[charCursor]))) {
25987
+ state = nextState;
25988
+ if (state.accepts()) {
25989
+ sinceAccepts = 0;
25990
+ charsSinceAccepts = 0;
25991
+ latestAccepting = state;
25992
+ } else if (sinceAccepts >= 0) {
25993
+ sinceAccepts += iterable[charCursor].length;
25994
+ charsSinceAccepts++;
25995
+ }
25996
+ tokenLength += iterable[charCursor].length;
25997
+ cursor += iterable[charCursor].length;
25998
+ charCursor++;
25999
+ }
26000
+ cursor -= sinceAccepts;
26001
+ charCursor -= charsSinceAccepts;
26002
+ tokenLength -= sinceAccepts;
26003
+ tokens.push({
26004
+ t: latestAccepting.t,
26005
+ v: str.substr(cursor - tokenLength, tokenLength),
26006
+ s: cursor - tokenLength,
26007
+ e: cursor
26008
+ });
26009
+ }
26010
+ return tokens;
26011
+ }
26012
+ function stringToArray(str) {
26013
+ var result = [];
26014
+ var len = str.length;
26015
+ var index = 0;
26016
+ while (index < len) {
26017
+ var first2 = str.charCodeAt(index);
26018
+ var second = void 0;
26019
+ var char = first2 < 55296 || first2 > 56319 || index + 1 === len || (second = str.charCodeAt(index + 1)) < 56320 || second > 57343 ? str[index] : str.slice(index, index + 2);
26020
+ result.push(char);
26021
+ index += char.length;
26022
+ }
26023
+ return result;
26024
+ }
26025
+ function _typeof(obj) {
26026
+ "@babel/helpers - typeof";
26027
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
26028
+ _typeof = function(obj2) {
26029
+ return typeof obj2;
26030
+ };
26031
+ } else {
26032
+ _typeof = function(obj2) {
26033
+ return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
26034
+ };
26035
+ }
26036
+ return _typeof(obj);
26037
+ }
26038
+ var defaults = {
26039
+ defaultProtocol: "http",
26040
+ events: null,
26041
+ format: noop,
26042
+ formatHref: noop,
26043
+ nl2br: false,
26044
+ tagName: "a",
26045
+ target: null,
26046
+ rel: null,
26047
+ validate: true,
26048
+ truncate: 0,
26049
+ className: null,
26050
+ attributes: null,
26051
+ ignoreTags: []
26052
+ };
26053
+ function Options(opts) {
26054
+ opts = opts || {};
26055
+ this.defaultProtocol = "defaultProtocol" in opts ? opts.defaultProtocol : defaults.defaultProtocol;
26056
+ this.events = "events" in opts ? opts.events : defaults.events;
26057
+ this.format = "format" in opts ? opts.format : defaults.format;
26058
+ this.formatHref = "formatHref" in opts ? opts.formatHref : defaults.formatHref;
26059
+ this.nl2br = "nl2br" in opts ? opts.nl2br : defaults.nl2br;
26060
+ this.tagName = "tagName" in opts ? opts.tagName : defaults.tagName;
26061
+ this.target = "target" in opts ? opts.target : defaults.target;
26062
+ this.rel = "rel" in opts ? opts.rel : defaults.rel;
26063
+ this.validate = "validate" in opts ? opts.validate : defaults.validate;
26064
+ this.truncate = "truncate" in opts ? opts.truncate : defaults.truncate;
26065
+ this.className = "className" in opts ? opts.className : defaults.className;
26066
+ this.attributes = opts.attributes || defaults.attributes;
26067
+ this.ignoreTags = [];
26068
+ var ignoredTags = "ignoreTags" in opts ? opts.ignoreTags : defaults.ignoreTags;
26069
+ for (var i = 0; i < ignoredTags.length; i++) {
26070
+ this.ignoreTags.push(ignoredTags[i].toUpperCase());
26071
+ }
26072
+ }
26073
+ Options.prototype = {
26074
+ resolve: function resolve(token) {
26075
+ var href = token.toHref(this.defaultProtocol);
26076
+ return {
26077
+ formatted: this.get("format", token.toString(), token),
26078
+ formattedHref: this.get("formatHref", href, token),
26079
+ tagName: this.get("tagName", href, token),
26080
+ className: this.get("className", href, token),
26081
+ target: this.get("target", href, token),
26082
+ rel: this.get("rel", href, token),
26083
+ events: this.getObject("events", href, token),
26084
+ attributes: this.getObject("attributes", href, token),
26085
+ truncate: this.get("truncate", href, token)
26086
+ };
26087
+ },
26088
+ check: function check2(token) {
26089
+ return this.get("validate", token.toString(), token);
26090
+ },
26091
+ get: function get2(key, operator, token) {
26092
+ var option = this[key];
26093
+ if (!option) {
26094
+ return option;
26095
+ }
26096
+ var optionValue;
26097
+ switch (_typeof(option)) {
26098
+ case "function":
26099
+ return option(operator, token.t);
26100
+ case "object":
26101
+ optionValue = token.t in option ? option[token.t] : defaults[key];
26102
+ return typeof optionValue === "function" ? optionValue(operator, token.t) : optionValue;
26103
+ }
26104
+ return option;
26105
+ },
26106
+ getObject: function getObject(key, operator, token) {
26107
+ var option = this[key];
26108
+ return typeof option === "function" ? option(operator, token.t) : option;
26109
+ }
26110
+ };
26111
+ function noop(val) {
26112
+ return val;
26113
+ }
26114
+ function inherits(parent, child) {
26115
+ var props = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
26116
+ var extended = Object.create(parent.prototype);
26117
+ for (var p in props) {
26118
+ extended[p] = props[p];
26119
+ }
26120
+ extended.constructor = child;
26121
+ child.prototype = extended;
26122
+ return child;
26123
+ }
26124
+ function MultiToken() {
26125
+ }
26126
+ MultiToken.prototype = {
26127
+ t: "token",
26128
+ isLink: false,
26129
+ toString: function toString4() {
26130
+ return this.v;
26131
+ },
26132
+ toHref: function toHref() {
26133
+ return this.toString();
26134
+ },
26135
+ startIndex: function startIndex() {
26136
+ return this.tk[0].s;
26137
+ },
26138
+ endIndex: function endIndex() {
26139
+ return this.tk[this.tk.length - 1].e;
26140
+ },
26141
+ toObject: function toObject2() {
26142
+ var protocol = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : defaults.defaultProtocol;
26143
+ return {
26144
+ type: this.t,
26145
+ value: this.v,
26146
+ isLink: this.isLink,
26147
+ href: this.toHref(protocol),
26148
+ start: this.startIndex(),
26149
+ end: this.endIndex()
26150
+ };
26940
26151
  }
26941
- var S_PROTOCOL_FILE = makeDomainState();
26942
- var S_PROTOCOL_FTP = makeDomainState();
26943
- var S_PROTOCOL_HTTP = makeDomainState();
26944
- var S_MAILTO = makeDomainState();
26945
- makeChainT(S_START, "file", S_PROTOCOL_FILE, makeDomainState);
26946
- makeChainT(S_START, "ftp", S_PROTOCOL_FTP, makeDomainState);
26947
- makeChainT(S_START, "http", S_PROTOCOL_HTTP, makeDomainState);
26948
- makeChainT(S_START, "mailto", S_MAILTO, makeDomainState);
26949
- var S_PROTOCOL_SECURE = makeDomainState();
26950
- var S_FULL_PROTOCOL = makeAcceptingState(PROTOCOL);
26951
- var S_FULL_MAILTO = makeAcceptingState(MAILTO);
26952
- makeT(S_PROTOCOL_FTP, "s", S_PROTOCOL_SECURE);
26953
- makeT(S_PROTOCOL_FTP, ":", S_FULL_PROTOCOL);
26954
- makeT(S_PROTOCOL_HTTP, "s", S_PROTOCOL_SECURE);
26955
- makeT(S_PROTOCOL_HTTP, ":", S_FULL_PROTOCOL);
26956
- makeT(S_PROTOCOL_FILE, ":", S_FULL_PROTOCOL);
26957
- makeT(S_PROTOCOL_SECURE, ":", S_FULL_PROTOCOL);
26958
- makeT(S_MAILTO, ":", S_FULL_MAILTO);
26959
- var S_CUSTOM_PROTOCOL = makeDomainState();
26960
- for (var _i = 0; _i < customProtocols.length; _i++) {
26961
- makeChainT(S_START, customProtocols[_i], S_CUSTOM_PROTOCOL, makeDomainState);
26152
+ };
26153
+ function createTokenClass(type, props) {
26154
+ function Token(value, tokens) {
26155
+ this.t = type;
26156
+ this.v = value;
26157
+ this.tk = tokens;
26962
26158
  }
26963
- makeT(S_CUSTOM_PROTOCOL, ":", S_FULL_PROTOCOL);
26964
- makeChainT(S_START, "localhost", makeNearDomainState(LOCALHOST), makeDomainState);
26965
- makeRegexT(S_START, DIGIT, S_NUM);
26966
- makeRegexT(S_START, LETTER, S_DOMAIN);
26967
- makeRegexT(S_START, EMOJI, S_DOMAIN);
26968
- makeRegexT(S_START, EMOJI_VARIATION, S_DOMAIN);
26969
- makeRegexT(S_NUM, DIGIT, S_NUM);
26970
- makeRegexT(S_NUM, LETTER, S_DOMAIN);
26971
- makeRegexT(S_NUM, EMOJI, S_DOMAIN);
26972
- makeRegexT(S_NUM, EMOJI_VARIATION, S_DOMAIN);
26973
- makeT(S_NUM, "-", S_DOMAIN_HYPHEN);
26974
- makeT(S_DOMAIN, "-", S_DOMAIN_HYPHEN);
26975
- makeT(S_DOMAIN_HYPHEN, "-", S_DOMAIN_HYPHEN);
26976
- makeRegexT(S_DOMAIN, DIGIT, S_DOMAIN);
26977
- makeRegexT(S_DOMAIN, LETTER, S_DOMAIN);
26978
- makeRegexT(S_DOMAIN, EMOJI, S_DOMAIN);
26979
- makeRegexT(S_DOMAIN, EMOJI_VARIATION, S_DOMAIN);
26980
- makeRegexT(S_DOMAIN_HYPHEN, DIGIT, S_DOMAIN);
26981
- makeRegexT(S_DOMAIN_HYPHEN, LETTER, S_DOMAIN);
26982
- makeRegexT(S_DOMAIN_HYPHEN, EMOJI, S_DOMAIN);
26983
- makeRegexT(S_DOMAIN_HYPHEN, EMOJI_VARIATION, S_DOMAIN);
26984
- S_START.jd = makeAcceptingState(SYM);
26159
+ inherits(MultiToken, Token, props);
26160
+ return Token;
26161
+ }
26162
+ var MailtoEmail = createTokenClass("email", {
26163
+ isLink: true
26164
+ });
26165
+ var Email = createTokenClass("email", {
26166
+ isLink: true,
26167
+ toHref: function toHref2() {
26168
+ return "mailto:" + this.toString();
26169
+ }
26170
+ });
26171
+ var Text$1 = createTokenClass("text");
26172
+ var Nl = createTokenClass("nl");
26173
+ var Url = createTokenClass("url", {
26174
+ isLink: true,
26175
+ toHref: function toHref3() {
26176
+ var protocol = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : defaults.defaultProtocol;
26177
+ var tokens = this.tk;
26178
+ var hasProtocol2 = false;
26179
+ var hasSlashSlash = false;
26180
+ var result = [];
26181
+ var i = 0;
26182
+ while (tokens[i].t === PROTOCOL) {
26183
+ hasProtocol2 = true;
26184
+ result.push(tokens[i].v);
26185
+ i++;
26186
+ }
26187
+ while (tokens[i].t === SLASH) {
26188
+ hasSlashSlash = true;
26189
+ result.push(tokens[i].v);
26190
+ i++;
26191
+ }
26192
+ for (; i < tokens.length; i++) {
26193
+ result.push(tokens[i].v);
26194
+ }
26195
+ result = result.join("");
26196
+ if (!(hasProtocol2 || hasSlashSlash)) {
26197
+ result = "".concat(protocol, "://").concat(result);
26198
+ }
26199
+ return result;
26200
+ },
26201
+ hasProtocol: function hasProtocol() {
26202
+ return this.tk[0].t === PROTOCOL;
26203
+ }
26204
+ });
26205
+ var multi = /* @__PURE__ */ Object.freeze({
26206
+ __proto__: null,
26207
+ MultiToken,
26208
+ Base: MultiToken,
26209
+ createTokenClass,
26210
+ MailtoEmail,
26211
+ Email,
26212
+ Text: Text$1,
26213
+ Nl,
26214
+ Url
26215
+ });
26216
+ function init$1() {
26217
+ var S_START = makeState();
26218
+ var S_PROTOCOL = makeState();
26219
+ var S_MAILTO = makeState();
26220
+ var S_PROTOCOL_SLASH = makeState();
26221
+ var S_PROTOCOL_SLASH_SLASH = makeState();
26222
+ var S_DOMAIN = makeState();
26223
+ var S_DOMAIN_DOT = makeState();
26224
+ var S_TLD = makeAcceptingState(Url);
26225
+ var S_TLD_COLON = makeState();
26226
+ var S_TLD_PORT = makeAcceptingState(Url);
26227
+ var S_URL = makeAcceptingState(Url);
26228
+ var S_URL_NON_ACCEPTING = makeState();
26229
+ var S_URL_OPENBRACE = makeState();
26230
+ var S_URL_OPENBRACKET = makeState();
26231
+ var S_URL_OPENANGLEBRACKET = makeState();
26232
+ var S_URL_OPENPAREN = makeState();
26233
+ var S_URL_OPENBRACE_Q = makeAcceptingState(Url);
26234
+ var S_URL_OPENBRACKET_Q = makeAcceptingState(Url);
26235
+ var S_URL_OPENANGLEBRACKET_Q = makeAcceptingState(Url);
26236
+ var S_URL_OPENPAREN_Q = makeAcceptingState(Url);
26237
+ var S_URL_OPENBRACE_SYMS = makeState();
26238
+ var S_URL_OPENBRACKET_SYMS = makeState();
26239
+ var S_URL_OPENANGLEBRACKET_SYMS = makeState();
26240
+ var S_URL_OPENPAREN_SYMS = makeState();
26241
+ var S_EMAIL_DOMAIN = makeState();
26242
+ var S_EMAIL_DOMAIN_DOT = makeState();
26243
+ var S_EMAIL = makeAcceptingState(Email);
26244
+ var S_EMAIL_COLON = makeState();
26245
+ var S_EMAIL_PORT = makeAcceptingState(Email);
26246
+ var S_MAILTO_EMAIL = makeAcceptingState(MailtoEmail);
26247
+ var S_MAILTO_EMAIL_NON_ACCEPTING = makeState();
26248
+ var S_LOCALPART = makeState();
26249
+ var S_LOCALPART_AT = makeState();
26250
+ var S_LOCALPART_DOT = makeState();
26251
+ var S_NL = makeAcceptingState(Nl);
26252
+ makeT(S_START, NL, S_NL);
26253
+ makeT(S_START, PROTOCOL, S_PROTOCOL);
26254
+ makeT(S_START, MAILTO, S_MAILTO);
26255
+ makeT(S_PROTOCOL, SLASH, S_PROTOCOL_SLASH);
26256
+ makeT(S_PROTOCOL_SLASH, SLASH, S_PROTOCOL_SLASH_SLASH);
26257
+ makeT(S_START, TLD, S_DOMAIN);
26258
+ makeT(S_START, DOMAIN, S_DOMAIN);
26259
+ makeT(S_START, LOCALHOST, S_TLD);
26260
+ makeT(S_START, NUM, S_DOMAIN);
26261
+ makeT(S_PROTOCOL_SLASH_SLASH, TLD, S_URL);
26262
+ makeT(S_PROTOCOL_SLASH_SLASH, DOMAIN, S_URL);
26263
+ makeT(S_PROTOCOL_SLASH_SLASH, NUM, S_URL);
26264
+ makeT(S_PROTOCOL_SLASH_SLASH, LOCALHOST, S_URL);
26265
+ makeT(S_DOMAIN, DOT, S_DOMAIN_DOT);
26266
+ makeT(S_EMAIL_DOMAIN, DOT, S_EMAIL_DOMAIN_DOT);
26267
+ makeT(S_DOMAIN_DOT, TLD, S_TLD);
26268
+ makeT(S_DOMAIN_DOT, DOMAIN, S_DOMAIN);
26269
+ makeT(S_DOMAIN_DOT, NUM, S_DOMAIN);
26270
+ makeT(S_DOMAIN_DOT, LOCALHOST, S_DOMAIN);
26271
+ makeT(S_EMAIL_DOMAIN_DOT, TLD, S_EMAIL);
26272
+ makeT(S_EMAIL_DOMAIN_DOT, DOMAIN, S_EMAIL_DOMAIN);
26273
+ makeT(S_EMAIL_DOMAIN_DOT, NUM, S_EMAIL_DOMAIN);
26274
+ makeT(S_EMAIL_DOMAIN_DOT, LOCALHOST, S_EMAIL_DOMAIN);
26275
+ makeT(S_TLD, DOT, S_DOMAIN_DOT);
26276
+ makeT(S_EMAIL, DOT, S_EMAIL_DOMAIN_DOT);
26277
+ makeT(S_TLD, COLON, S_TLD_COLON);
26278
+ makeT(S_TLD, SLASH, S_URL);
26279
+ makeT(S_TLD_COLON, NUM, S_TLD_PORT);
26280
+ makeT(S_TLD_PORT, SLASH, S_URL);
26281
+ makeT(S_EMAIL, COLON, S_EMAIL_COLON);
26282
+ makeT(S_EMAIL_COLON, NUM, S_EMAIL_PORT);
26283
+ var qsAccepting = [AMPERSAND, ASTERISK, AT, BACKSLASH, BACKTICK, CARET, DOLLAR, DOMAIN, EQUALS, HYPHEN, LOCALHOST, NUM, PERCENT, PIPE, PLUS, POUND, PROTOCOL, SLASH, SYM, TILDE, TLD, UNDERSCORE];
26284
+ var qsNonAccepting = [APOSTROPHE, CLOSEANGLEBRACKET, CLOSEBRACE, CLOSEBRACKET, CLOSEPAREN, COLON, COMMA, DOT, EXCLAMATION, OPENANGLEBRACKET, OPENBRACE, OPENBRACKET, OPENPAREN, QUERY, QUOTE, SEMI];
26285
+ makeT(S_URL, OPENBRACE, S_URL_OPENBRACE);
26286
+ makeT(S_URL, OPENBRACKET, S_URL_OPENBRACKET);
26287
+ makeT(S_URL, OPENANGLEBRACKET, S_URL_OPENANGLEBRACKET);
26288
+ makeT(S_URL, OPENPAREN, S_URL_OPENPAREN);
26289
+ makeT(S_URL_NON_ACCEPTING, OPENBRACE, S_URL_OPENBRACE);
26290
+ makeT(S_URL_NON_ACCEPTING, OPENBRACKET, S_URL_OPENBRACKET);
26291
+ makeT(S_URL_NON_ACCEPTING, OPENANGLEBRACKET, S_URL_OPENANGLEBRACKET);
26292
+ makeT(S_URL_NON_ACCEPTING, OPENPAREN, S_URL_OPENPAREN);
26293
+ makeT(S_URL_OPENBRACE, CLOSEBRACE, S_URL);
26294
+ makeT(S_URL_OPENBRACKET, CLOSEBRACKET, S_URL);
26295
+ makeT(S_URL_OPENANGLEBRACKET, CLOSEANGLEBRACKET, S_URL);
26296
+ makeT(S_URL_OPENPAREN, CLOSEPAREN, S_URL);
26297
+ makeT(S_URL_OPENBRACE_Q, CLOSEBRACE, S_URL);
26298
+ makeT(S_URL_OPENBRACKET_Q, CLOSEBRACKET, S_URL);
26299
+ makeT(S_URL_OPENANGLEBRACKET_Q, CLOSEANGLEBRACKET, S_URL);
26300
+ makeT(S_URL_OPENPAREN_Q, CLOSEPAREN, S_URL);
26301
+ makeT(S_URL_OPENBRACE_SYMS, CLOSEBRACE, S_URL);
26302
+ makeT(S_URL_OPENBRACKET_SYMS, CLOSEBRACKET, S_URL);
26303
+ makeT(S_URL_OPENANGLEBRACKET_SYMS, CLOSEANGLEBRACKET, S_URL);
26304
+ makeT(S_URL_OPENPAREN_SYMS, CLOSEPAREN, S_URL);
26305
+ makeMultiT(S_URL_OPENBRACE, qsAccepting, S_URL_OPENBRACE_Q);
26306
+ makeMultiT(S_URL_OPENBRACKET, qsAccepting, S_URL_OPENBRACKET_Q);
26307
+ makeMultiT(S_URL_OPENANGLEBRACKET, qsAccepting, S_URL_OPENANGLEBRACKET_Q);
26308
+ makeMultiT(S_URL_OPENPAREN, qsAccepting, S_URL_OPENPAREN_Q);
26309
+ makeMultiT(S_URL_OPENBRACE, qsNonAccepting, S_URL_OPENBRACE_SYMS);
26310
+ makeMultiT(S_URL_OPENBRACKET, qsNonAccepting, S_URL_OPENBRACKET_SYMS);
26311
+ makeMultiT(S_URL_OPENANGLEBRACKET, qsNonAccepting, S_URL_OPENANGLEBRACKET_SYMS);
26312
+ makeMultiT(S_URL_OPENPAREN, qsNonAccepting, S_URL_OPENPAREN_SYMS);
26313
+ makeMultiT(S_URL_OPENBRACE_Q, qsAccepting, S_URL_OPENBRACE_Q);
26314
+ makeMultiT(S_URL_OPENBRACKET_Q, qsAccepting, S_URL_OPENBRACKET_Q);
26315
+ makeMultiT(S_URL_OPENANGLEBRACKET_Q, qsAccepting, S_URL_OPENANGLEBRACKET_Q);
26316
+ makeMultiT(S_URL_OPENPAREN_Q, qsAccepting, S_URL_OPENPAREN_Q);
26317
+ makeMultiT(S_URL_OPENBRACE_Q, qsNonAccepting, S_URL_OPENBRACE_Q);
26318
+ makeMultiT(S_URL_OPENBRACKET_Q, qsNonAccepting, S_URL_OPENBRACKET_Q);
26319
+ makeMultiT(S_URL_OPENANGLEBRACKET_Q, qsNonAccepting, S_URL_OPENANGLEBRACKET_Q);
26320
+ makeMultiT(S_URL_OPENPAREN_Q, qsNonAccepting, S_URL_OPENPAREN_Q);
26321
+ makeMultiT(S_URL_OPENBRACE_SYMS, qsAccepting, S_URL_OPENBRACE_Q);
26322
+ makeMultiT(S_URL_OPENBRACKET_SYMS, qsAccepting, S_URL_OPENBRACKET_Q);
26323
+ makeMultiT(S_URL_OPENANGLEBRACKET_SYMS, qsAccepting, S_URL_OPENANGLEBRACKET_Q);
26324
+ makeMultiT(S_URL_OPENPAREN_SYMS, qsAccepting, S_URL_OPENPAREN_Q);
26325
+ makeMultiT(S_URL_OPENBRACE_SYMS, qsNonAccepting, S_URL_OPENBRACE_SYMS);
26326
+ makeMultiT(S_URL_OPENBRACKET_SYMS, qsNonAccepting, S_URL_OPENBRACKET_SYMS);
26327
+ makeMultiT(S_URL_OPENANGLEBRACKET_SYMS, qsNonAccepting, S_URL_OPENANGLEBRACKET_SYMS);
26328
+ makeMultiT(S_URL_OPENPAREN_SYMS, qsNonAccepting, S_URL_OPENPAREN_SYMS);
26329
+ makeMultiT(S_URL, qsAccepting, S_URL);
26330
+ makeMultiT(S_URL_NON_ACCEPTING, qsAccepting, S_URL);
26331
+ makeMultiT(S_URL, qsNonAccepting, S_URL_NON_ACCEPTING);
26332
+ makeMultiT(S_URL_NON_ACCEPTING, qsNonAccepting, S_URL_NON_ACCEPTING);
26333
+ makeT(S_MAILTO, TLD, S_MAILTO_EMAIL);
26334
+ makeT(S_MAILTO, DOMAIN, S_MAILTO_EMAIL);
26335
+ makeT(S_MAILTO, NUM, S_MAILTO_EMAIL);
26336
+ makeT(S_MAILTO, LOCALHOST, S_MAILTO_EMAIL);
26337
+ makeMultiT(S_MAILTO_EMAIL, qsAccepting, S_MAILTO_EMAIL);
26338
+ makeMultiT(S_MAILTO_EMAIL, qsNonAccepting, S_MAILTO_EMAIL_NON_ACCEPTING);
26339
+ makeMultiT(S_MAILTO_EMAIL_NON_ACCEPTING, qsAccepting, S_MAILTO_EMAIL);
26340
+ makeMultiT(S_MAILTO_EMAIL_NON_ACCEPTING, qsNonAccepting, S_MAILTO_EMAIL_NON_ACCEPTING);
26341
+ var localpartAccepting = [AMPERSAND, APOSTROPHE, ASTERISK, BACKSLASH, BACKTICK, CARET, CLOSEBRACE, DOLLAR, DOMAIN, EQUALS, HYPHEN, NUM, OPENBRACE, PERCENT, PIPE, PLUS, POUND, QUERY, SLASH, SYM, TILDE, TLD, UNDERSCORE];
26342
+ makeMultiT(S_DOMAIN, localpartAccepting, S_LOCALPART);
26343
+ makeT(S_DOMAIN, AT, S_LOCALPART_AT);
26344
+ makeMultiT(S_TLD, localpartAccepting, S_LOCALPART);
26345
+ makeT(S_TLD, AT, S_LOCALPART_AT);
26346
+ makeMultiT(S_DOMAIN_DOT, localpartAccepting, S_LOCALPART);
26347
+ makeMultiT(S_LOCALPART, localpartAccepting, S_LOCALPART);
26348
+ makeT(S_LOCALPART, AT, S_LOCALPART_AT);
26349
+ makeT(S_LOCALPART, DOT, S_LOCALPART_DOT);
26350
+ makeMultiT(S_LOCALPART_DOT, localpartAccepting, S_LOCALPART);
26351
+ makeT(S_LOCALPART_AT, TLD, S_EMAIL_DOMAIN);
26352
+ makeT(S_LOCALPART_AT, DOMAIN, S_EMAIL_DOMAIN);
26353
+ makeT(S_LOCALPART_AT, NUM, S_EMAIL_DOMAIN);
26354
+ makeT(S_LOCALPART_AT, LOCALHOST, S_EMAIL);
26985
26355
  return S_START;
26986
26356
  }
26987
- function run$1(start2, str) {
26988
- var iterable = stringToArray(str.replace(/[A-Z]/g, function(c) {
26989
- return c.toLowerCase();
26990
- }));
26991
- var charCount = iterable.length;
26992
- var tokens = [];
26357
+ function run(start2, input, tokens) {
26358
+ var len = tokens.length;
26993
26359
  var cursor = 0;
26994
- var charCursor = 0;
26995
- while (charCursor < charCount) {
26360
+ var multis = [];
26361
+ var textTokens = [];
26362
+ while (cursor < len) {
26996
26363
  var state = start2;
26364
+ var secondState = null;
26997
26365
  var nextState = null;
26998
- var tokenLength = 0;
26366
+ var multiLength = 0;
26999
26367
  var latestAccepting = null;
27000
26368
  var sinceAccepts = -1;
27001
- var charsSinceAccepts = -1;
27002
- while (charCursor < charCount && (nextState = takeT(state, iterable[charCursor]))) {
26369
+ while (cursor < len && !(secondState = takeT(state, tokens[cursor].t))) {
26370
+ textTokens.push(tokens[cursor++]);
26371
+ }
26372
+ while (cursor < len && (nextState = secondState || takeT(state, tokens[cursor].t))) {
26373
+ secondState = null;
27003
26374
  state = nextState;
27004
26375
  if (state.accepts()) {
27005
26376
  sinceAccepts = 0;
27006
- charsSinceAccepts = 0;
27007
26377
  latestAccepting = state;
27008
26378
  } else if (sinceAccepts >= 0) {
27009
- sinceAccepts += iterable[charCursor].length;
27010
- charsSinceAccepts++;
26379
+ sinceAccepts++;
26380
+ }
26381
+ cursor++;
26382
+ multiLength++;
26383
+ }
26384
+ if (sinceAccepts < 0) {
26385
+ for (var i = cursor - multiLength; i < cursor; i++) {
26386
+ textTokens.push(tokens[i]);
26387
+ }
26388
+ } else {
26389
+ if (textTokens.length > 0) {
26390
+ multis.push(parserCreateMultiToken(Text$1, input, textTokens));
26391
+ textTokens = [];
26392
+ }
26393
+ cursor -= sinceAccepts;
26394
+ multiLength -= sinceAccepts;
26395
+ var Multi = latestAccepting.t;
26396
+ var subtokens = tokens.slice(cursor - multiLength, cursor);
26397
+ multis.push(parserCreateMultiToken(Multi, input, subtokens));
26398
+ }
26399
+ }
26400
+ if (textTokens.length > 0) {
26401
+ multis.push(parserCreateMultiToken(Text$1, input, textTokens));
26402
+ }
26403
+ return multis;
26404
+ }
26405
+ function parserCreateMultiToken(Multi, input, tokens) {
26406
+ var startIdx = tokens[0].s;
26407
+ var endIdx = tokens[tokens.length - 1].e;
26408
+ var value = input.substr(startIdx, endIdx - startIdx);
26409
+ return new Multi(value, tokens);
26410
+ }
26411
+ var warn = typeof console !== "undefined" && console && console.warn || function() {
26412
+ };
26413
+ var INIT = {
26414
+ scanner: null,
26415
+ parser: null,
26416
+ pluginQueue: [],
26417
+ customProtocols: [],
26418
+ initialized: false
26419
+ };
26420
+ function registerCustomProtocol(protocol) {
26421
+ if (INIT.initialized) {
26422
+ warn('linkifyjs: already initialized - will not register custom protocol "'.concat(protocol, '" until you manually call linkify.init(). To avoid this warning, please register all custom protocols before invoking linkify the first time.'));
26423
+ }
26424
+ if (!/^[a-z-]+$/.test(protocol)) {
26425
+ throw Error("linkifyjs: protocols containing characters other than a-z or - (hyphen) are not supported");
26426
+ }
26427
+ INIT.customProtocols.push(protocol);
26428
+ }
26429
+ function init() {
26430
+ INIT.scanner = {
26431
+ start: init$2(INIT.customProtocols),
26432
+ tokens: text
26433
+ };
26434
+ INIT.parser = {
26435
+ start: init$1(),
26436
+ tokens: multi
26437
+ };
26438
+ var utils = {
26439
+ createTokenClass
26440
+ };
26441
+ for (var i = 0; i < INIT.pluginQueue.length; i++) {
26442
+ INIT.pluginQueue[i][1]({
26443
+ scanner: INIT.scanner,
26444
+ parser: INIT.parser,
26445
+ utils
26446
+ });
26447
+ }
26448
+ INIT.initialized = true;
26449
+ }
26450
+ function tokenize(str) {
26451
+ if (!INIT.initialized) {
26452
+ init();
26453
+ }
26454
+ return run(INIT.parser.start, str, run$1(INIT.scanner.start, str));
26455
+ }
26456
+ function find(str) {
26457
+ var type = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
26458
+ var tokens = tokenize(str);
26459
+ var filtered = [];
26460
+ for (var i = 0; i < tokens.length; i++) {
26461
+ var token = tokens[i];
26462
+ if (token.isLink && (!type || token.t === type)) {
26463
+ filtered.push(token.toObject());
26464
+ }
26465
+ }
26466
+ return filtered;
26467
+ }
26468
+ function test(str) {
26469
+ var type = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
26470
+ var tokens = tokenize(str);
26471
+ return tokens.length === 1 && tokens[0].isLink && (!type || tokens[0].t === type);
26472
+ }
26473
+ function autolink(options) {
26474
+ return new Plugin({
26475
+ key: new PluginKey("autolink"),
26476
+ appendTransaction: (transactions, oldState, newState) => {
26477
+ const docChanges = transactions.some((transaction) => transaction.docChanged) && !oldState.doc.eq(newState.doc);
26478
+ const preventAutolink = transactions.some((transaction) => transaction.getMeta("preventAutolink"));
26479
+ if (!docChanges || preventAutolink) {
26480
+ return;
26481
+ }
26482
+ const { tr } = newState;
26483
+ const transform = combineTransactionSteps(oldState.doc, [...transactions]);
26484
+ const { mapping } = transform;
26485
+ const changes = getChangedRanges(transform);
26486
+ changes.forEach(({ oldRange, newRange }) => {
26487
+ getMarksBetween(oldRange.from, oldRange.to, oldState.doc).filter((item) => item.mark.type === options.type).forEach((oldMark) => {
26488
+ const newFrom = mapping.map(oldMark.from);
26489
+ const newTo = mapping.map(oldMark.to);
26490
+ const newMarks = getMarksBetween(newFrom, newTo, newState.doc).filter((item) => item.mark.type === options.type);
26491
+ if (!newMarks.length) {
26492
+ return;
26493
+ }
26494
+ const newMark = newMarks[0];
26495
+ const oldLinkText = oldState.doc.textBetween(oldMark.from, oldMark.to, void 0, " ");
26496
+ const newLinkText = newState.doc.textBetween(newMark.from, newMark.to, void 0, " ");
26497
+ const wasLink = test(oldLinkText);
26498
+ const isLink = test(newLinkText);
26499
+ if (wasLink && !isLink) {
26500
+ tr.removeMark(newMark.from, newMark.to, options.type);
26501
+ }
26502
+ });
26503
+ findChildrenInRange(newState.doc, newRange, (node) => node.isTextblock).forEach((textBlock) => {
26504
+ const text2 = newState.doc.textBetween(textBlock.pos, textBlock.pos + textBlock.node.nodeSize, void 0, " ");
26505
+ find(text2).filter((link) => link.isLink).filter((link) => {
26506
+ if (options.validate) {
26507
+ return options.validate(link.value);
26508
+ }
26509
+ return true;
26510
+ }).map((link) => ({
26511
+ ...link,
26512
+ from: textBlock.pos + link.start + 1,
26513
+ to: textBlock.pos + link.end + 1
26514
+ })).filter((link) => {
26515
+ const fromIsInRange = newRange.from >= link.from && newRange.from <= link.to;
26516
+ const toIsInRange = newRange.to >= link.from && newRange.to <= link.to;
26517
+ return fromIsInRange || toIsInRange;
26518
+ }).forEach((link) => {
26519
+ tr.addMark(link.from, link.to, options.type.create({
26520
+ href: link.href
26521
+ }));
26522
+ });
26523
+ });
26524
+ });
26525
+ if (!tr.steps.length) {
26526
+ return;
26527
+ }
26528
+ return tr;
26529
+ }
26530
+ });
26531
+ }
26532
+ function clickHandler(options) {
26533
+ return new Plugin({
26534
+ key: new PluginKey("handleClickLink"),
26535
+ props: {
26536
+ handleClick: (view, pos, event) => {
26537
+ var _a;
26538
+ const attrs = getAttributes(view.state, options.type.name);
26539
+ const link = (_a = event.target) === null || _a === void 0 ? void 0 : _a.closest("a");
26540
+ if (link && attrs.href) {
26541
+ window.open(attrs.href, attrs.target);
26542
+ return true;
26543
+ }
26544
+ return false;
26545
+ }
26546
+ }
26547
+ });
26548
+ }
26549
+ function pasteHandler(options) {
26550
+ return new Plugin({
26551
+ key: new PluginKey("handlePasteLink"),
26552
+ props: {
26553
+ handlePaste: (view, event, slice2) => {
26554
+ const { state } = view;
26555
+ const { selection } = state;
26556
+ const { empty: empty2 } = selection;
26557
+ if (empty2) {
26558
+ return false;
26559
+ }
26560
+ let textContent = "";
26561
+ slice2.content.forEach((node) => {
26562
+ textContent += node.textContent;
26563
+ });
26564
+ const link = find(textContent).find((item) => item.isLink && item.value === textContent);
26565
+ if (!textContent || !link) {
26566
+ return false;
26567
+ }
26568
+ options.editor.commands.setMark(options.type, {
26569
+ href: link.href
26570
+ });
26571
+ return true;
26572
+ }
26573
+ }
26574
+ });
26575
+ }
26576
+ const Link$1 = Mark.create({
26577
+ name: "link",
26578
+ priority: 1e3,
26579
+ keepOnSplit: false,
26580
+ onCreate() {
26581
+ this.options.protocols.forEach(registerCustomProtocol);
26582
+ },
26583
+ inclusive() {
26584
+ return this.options.autolink;
26585
+ },
26586
+ addOptions() {
26587
+ return {
26588
+ openOnClick: true,
26589
+ linkOnPaste: true,
26590
+ autolink: true,
26591
+ protocols: [],
26592
+ HTMLAttributes: {
26593
+ target: "_blank",
26594
+ rel: "noopener noreferrer nofollow",
26595
+ class: null
26596
+ },
26597
+ validate: void 0
26598
+ };
26599
+ },
26600
+ addAttributes() {
26601
+ return {
26602
+ href: {
26603
+ default: null
26604
+ },
26605
+ target: {
26606
+ default: this.options.HTMLAttributes.target
26607
+ },
26608
+ class: {
26609
+ default: this.options.HTMLAttributes.class
27011
26610
  }
27012
- tokenLength += iterable[charCursor].length;
27013
- cursor += iterable[charCursor].length;
27014
- charCursor++;
26611
+ };
26612
+ },
26613
+ parseHTML() {
26614
+ return [
26615
+ { tag: 'a[href]:not([href *= "javascript:" i])' }
26616
+ ];
26617
+ },
26618
+ renderHTML({ HTMLAttributes }) {
26619
+ return [
26620
+ "a",
26621
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),
26622
+ 0
26623
+ ];
26624
+ },
26625
+ addCommands() {
26626
+ return {
26627
+ setLink: (attributes) => ({ chain }) => {
26628
+ return chain().setMark(this.name, attributes).setMeta("preventAutolink", true).run();
26629
+ },
26630
+ toggleLink: (attributes) => ({ chain }) => {
26631
+ return chain().toggleMark(this.name, attributes, { extendEmptyMarkRange: true }).setMeta("preventAutolink", true).run();
26632
+ },
26633
+ unsetLink: () => ({ chain }) => {
26634
+ return chain().unsetMark(this.name, { extendEmptyMarkRange: true }).setMeta("preventAutolink", true).run();
26635
+ }
26636
+ };
26637
+ },
26638
+ addPasteRules() {
26639
+ return [
26640
+ markPasteRule({
26641
+ find: (text2) => find(text2).filter((link) => {
26642
+ if (this.options.validate) {
26643
+ return this.options.validate(link.value);
26644
+ }
26645
+ return true;
26646
+ }).filter((link) => link.isLink).map((link) => ({
26647
+ text: link.value,
26648
+ index: link.start,
26649
+ data: link
26650
+ })),
26651
+ type: this.type,
26652
+ getAttributes: (match2) => {
26653
+ var _a;
26654
+ return {
26655
+ href: (_a = match2.data) === null || _a === void 0 ? void 0 : _a.href
26656
+ };
26657
+ }
26658
+ })
26659
+ ];
26660
+ },
26661
+ addProseMirrorPlugins() {
26662
+ const plugins = [];
26663
+ if (this.options.autolink) {
26664
+ plugins.push(autolink({
26665
+ type: this.type,
26666
+ validate: this.options.validate
26667
+ }));
27015
26668
  }
27016
- cursor -= sinceAccepts;
27017
- charCursor -= charsSinceAccepts;
27018
- tokenLength -= sinceAccepts;
27019
- tokens.push({
27020
- t: latestAccepting.t,
27021
- v: str.substr(cursor - tokenLength, tokenLength),
27022
- s: cursor - tokenLength,
27023
- e: cursor
27024
- });
27025
- }
27026
- return tokens;
27027
- }
27028
- function stringToArray(str) {
27029
- var result = [];
27030
- var len = str.length;
27031
- var index = 0;
27032
- while (index < len) {
27033
- var first2 = str.charCodeAt(index);
27034
- var second = void 0;
27035
- var char = first2 < 55296 || first2 > 56319 || index + 1 === len || (second = str.charCodeAt(index + 1)) < 56320 || second > 57343 ? str[index] : str.slice(index, index + 2);
27036
- result.push(char);
27037
- index += char.length;
26669
+ if (this.options.openOnClick) {
26670
+ plugins.push(clickHandler({
26671
+ type: this.type
26672
+ }));
26673
+ }
26674
+ if (this.options.linkOnPaste) {
26675
+ plugins.push(pasteHandler({
26676
+ editor: this.editor,
26677
+ type: this.type
26678
+ }));
26679
+ }
26680
+ return plugins;
27038
26681
  }
27039
- return result;
27040
- }
27041
- function _typeof(obj) {
27042
- "@babel/helpers - typeof";
27043
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
27044
- _typeof = function(obj2) {
27045
- return typeof obj2;
26682
+ });
26683
+ const Link = Link$1.extend({
26684
+ name: TextSettings.LINK,
26685
+ addOptions() {
26686
+ var _a;
26687
+ return {
26688
+ ...(_a = this.parent) == null ? void 0 : _a.call(this),
26689
+ openOnClick: false
27046
26690
  };
27047
- } else {
27048
- _typeof = function(obj2) {
27049
- return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
26691
+ },
26692
+ addAttributes() {
26693
+ return {
26694
+ href: {
26695
+ default: null,
26696
+ parseHTML: (element) => {
26697
+ const href = element.getAttribute("href");
26698
+ if (!href.startsWith("#"))
26699
+ return href;
26700
+ return parseFloat(element.getAttribute("href").replace("#", ""));
26701
+ }
26702
+ },
26703
+ target: {
26704
+ default: LinkTargets.SELF,
26705
+ parseHTML: (element) => element.getAttribute("target") || LinkTargets.SELF
26706
+ },
26707
+ destination: {
26708
+ default: LinkDestinations.URL,
26709
+ parseHTML: (element) => {
26710
+ const href = element.getAttribute("href");
26711
+ if (!href.startsWith("#"))
26712
+ return LinkDestinations.URL;
26713
+ const id2 = href.replace("#", "");
26714
+ const blocks = unref(this.options.pageBlocks);
26715
+ const block = blocks.find((block2) => block2.id === parseInt(id2));
26716
+ return block ? LinkDestinations.BLOCK : LinkDestinations.URL;
26717
+ }
26718
+ }
27050
26719
  };
26720
+ },
26721
+ addCommands() {
26722
+ var _a;
26723
+ return {
26724
+ ...(_a = this.parent) == null ? void 0 : _a.call(this),
26725
+ applyLink: createCommand(({ commands: commands2, chain }, attributes) => {
26726
+ if (!commands2.getSelectedText()) {
26727
+ return commands2.insertContent(NodeFactory.text(attributes.text, [
26728
+ NodeFactory.mark(TextSettings.LINK, attributes)
26729
+ ]));
26730
+ }
26731
+ return chain().applyMark(this.name, attributes).expandSelectionToLink().command(({ tr }) => {
26732
+ tr.insertText(attributes.text, tr.selection.from, tr.selection.to);
26733
+ return true;
26734
+ }).run();
26735
+ }),
26736
+ expandSelectionToLink: createCommand(({ commands: commands2 }) => {
26737
+ commands2.expandSelection(({ node }) => this.type.isInSet(node.marks));
26738
+ }),
26739
+ isLink: createCommand(({ commands: commands2 }) => commands2.hasMark(this.name)),
26740
+ getLinkPreset: createCommand(() => computed(() => this.options.preset))
26741
+ };
26742
+ },
26743
+ renderHTML({ HTMLAttributes: attrs }) {
26744
+ const href = attrs.destination === LinkDestinations.BLOCK ? `#${attrs.href}` : attrs.href;
26745
+ const presetClass = unref(this.options.basePresetClass) + unref(this.options.preset).id;
26746
+ const classes = `${presetClass} zw-style`;
26747
+ const linkAttrs = { href, target: attrs.target, class: classes };
26748
+ return ["a", linkAttrs, 0];
27051
26749
  }
27052
- return _typeof(obj);
27053
- }
27054
- var defaults = {
27055
- defaultProtocol: "http",
27056
- events: null,
27057
- format: noop,
27058
- formatHref: noop,
27059
- nl2br: false,
27060
- tagName: "a",
27061
- target: null,
27062
- rel: null,
27063
- validate: true,
27064
- truncate: 0,
27065
- className: null,
27066
- attributes: null,
27067
- ignoreTags: []
27068
- };
27069
- function Options(opts) {
27070
- opts = opts || {};
27071
- this.defaultProtocol = "defaultProtocol" in opts ? opts.defaultProtocol : defaults.defaultProtocol;
27072
- this.events = "events" in opts ? opts.events : defaults.events;
27073
- this.format = "format" in opts ? opts.format : defaults.format;
27074
- this.formatHref = "formatHref" in opts ? opts.formatHref : defaults.formatHref;
27075
- this.nl2br = "nl2br" in opts ? opts.nl2br : defaults.nl2br;
27076
- this.tagName = "tagName" in opts ? opts.tagName : defaults.tagName;
27077
- this.target = "target" in opts ? opts.target : defaults.target;
27078
- this.rel = "rel" in opts ? opts.rel : defaults.rel;
27079
- this.validate = "validate" in opts ? opts.validate : defaults.validate;
27080
- this.truncate = "truncate" in opts ? opts.truncate : defaults.truncate;
27081
- this.className = "className" in opts ? opts.className : defaults.className;
27082
- this.attributes = opts.attributes || defaults.attributes;
27083
- this.ignoreTags = [];
27084
- var ignoredTags = "ignoreTags" in opts ? opts.ignoreTags : defaults.ignoreTags;
27085
- for (var i = 0; i < ignoredTags.length; i++) {
27086
- this.ignoreTags.push(ignoredTags[i].toUpperCase());
27087
- }
27088
- }
27089
- Options.prototype = {
27090
- resolve: function resolve(token) {
27091
- var href = token.toHref(this.defaultProtocol);
26750
+ });
26751
+ const Superscript = Mark.create({
26752
+ name: TextSettings.SUPERSCRIPT,
26753
+ addCommands() {
27092
26754
  return {
27093
- formatted: this.get("format", token.toString(), token),
27094
- formattedHref: this.get("formatHref", href, token),
27095
- tagName: this.get("tagName", href, token),
27096
- className: this.get("className", href, token),
27097
- target: this.get("target", href, token),
27098
- rel: this.get("rel", href, token),
27099
- events: this.getObject("events", href, token),
27100
- attributes: this.getObject("attributes", href, token),
27101
- truncate: this.get("truncate", href, token)
26755
+ applySuperscript: createCommand(({ commands: commands2 }) => {
26756
+ commands2.setMark(this.name);
26757
+ }),
26758
+ removeSuperscript: createCommand(({ commands: commands2 }) => {
26759
+ commands2.unsetMark(this.name);
26760
+ }),
26761
+ toggleSuperscript: createCommand(({ commands: commands2 }) => {
26762
+ const isActive2 = unref(commands2.isSuperscript());
26763
+ isActive2 ? commands2.removeSuperscript() : commands2.applySuperscript();
26764
+ }),
26765
+ isSuperscript: createCommand(({ commands: commands2 }) => {
26766
+ const selectionRef = commands2.getMark(this.name);
26767
+ return computed(() => !!unref(selectionRef));
26768
+ })
27102
26769
  };
27103
26770
  },
27104
- check: function check2(token) {
27105
- return this.get("validate", token.toString(), token);
27106
- },
27107
- get: function get3(key, operator, token) {
27108
- var option = this[key];
27109
- if (!option) {
27110
- return option;
27111
- }
27112
- var optionValue;
27113
- switch (_typeof(option)) {
27114
- case "function":
27115
- return option(operator, token.t);
27116
- case "object":
27117
- optionValue = token.t in option ? option[token.t] : defaults[key];
27118
- return typeof optionValue === "function" ? optionValue(operator, token.t) : optionValue;
27119
- }
27120
- return option;
26771
+ parseHTML() {
26772
+ return [
26773
+ { tag: "sup" },
26774
+ {
26775
+ style: "vertical-align",
26776
+ getAttrs: (value) => value !== "super" ? false : null
26777
+ }
26778
+ ];
27121
26779
  },
27122
- getObject: function getObject(key, operator, token) {
27123
- var option = this[key];
27124
- return typeof option === "function" ? option(operator, token.t) : option;
26780
+ renderHTML() {
26781
+ return ["sup", { class: "zw-superscript" }, 0];
27125
26782
  }
26783
+ });
26784
+ const Text = Node.create({
26785
+ name: "text",
26786
+ group: "inline"
26787
+ });
26788
+ var GOOD_LEAF_SIZE = 200;
26789
+ var RopeSequence = function RopeSequence2() {
27126
26790
  };
27127
- function noop(val) {
27128
- return val;
27129
- }
27130
- function inherits(parent, child) {
27131
- var props = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
27132
- var extended = Object.create(parent.prototype);
27133
- for (var p in props) {
27134
- extended[p] = props[p];
26791
+ RopeSequence.prototype.append = function append(other) {
26792
+ if (!other.length) {
26793
+ return this;
27135
26794
  }
27136
- extended.constructor = child;
27137
- child.prototype = extended;
27138
- return child;
27139
- }
27140
- function MultiToken() {
27141
- }
27142
- MultiToken.prototype = {
27143
- t: "token",
27144
- isLink: false,
27145
- toString: function toString4() {
27146
- return this.v;
27147
- },
27148
- toHref: function toHref() {
27149
- return this.toString();
27150
- },
27151
- startIndex: function startIndex() {
27152
- return this.tk[0].s;
27153
- },
27154
- endIndex: function endIndex() {
27155
- return this.tk[this.tk.length - 1].e;
27156
- },
27157
- toObject: function toObject2() {
27158
- var protocol = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : defaults.defaultProtocol;
27159
- return {
27160
- type: this.t,
27161
- value: this.v,
27162
- isLink: this.isLink,
27163
- href: this.toHref(protocol),
27164
- start: this.startIndex(),
27165
- end: this.endIndex()
27166
- };
26795
+ other = RopeSequence.from(other);
26796
+ return !this.length && other || other.length < GOOD_LEAF_SIZE && this.leafAppend(other) || this.length < GOOD_LEAF_SIZE && other.leafPrepend(this) || this.appendInner(other);
26797
+ };
26798
+ RopeSequence.prototype.prepend = function prepend(other) {
26799
+ if (!other.length) {
26800
+ return this;
27167
26801
  }
26802
+ return RopeSequence.from(other).append(this);
27168
26803
  };
27169
- function createTokenClass(type, props) {
27170
- function Token(value, tokens) {
27171
- this.t = type;
27172
- this.v = value;
27173
- this.tk = tokens;
26804
+ RopeSequence.prototype.appendInner = function appendInner(other) {
26805
+ return new Append(this, other);
26806
+ };
26807
+ RopeSequence.prototype.slice = function slice(from2, to) {
26808
+ if (from2 === void 0)
26809
+ from2 = 0;
26810
+ if (to === void 0)
26811
+ to = this.length;
26812
+ if (from2 >= to) {
26813
+ return RopeSequence.empty;
27174
26814
  }
27175
- inherits(MultiToken, Token, props);
27176
- return Token;
27177
- }
27178
- var MailtoEmail = createTokenClass("email", {
27179
- isLink: true
27180
- });
27181
- var Email = createTokenClass("email", {
27182
- isLink: true,
27183
- toHref: function toHref2() {
27184
- return "mailto:" + this.toString();
26815
+ return this.sliceInner(Math.max(0, from2), Math.min(this.length, to));
26816
+ };
26817
+ RopeSequence.prototype.get = function get3(i) {
26818
+ if (i < 0 || i >= this.length) {
26819
+ return void 0;
27185
26820
  }
27186
- });
27187
- var Text = createTokenClass("text");
27188
- var Nl = createTokenClass("nl");
27189
- var Url = createTokenClass("url", {
27190
- isLink: true,
27191
- toHref: function toHref3() {
27192
- var protocol = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : defaults.defaultProtocol;
27193
- var tokens = this.tk;
27194
- var hasProtocol2 = false;
27195
- var hasSlashSlash = false;
27196
- var result = [];
27197
- var i = 0;
27198
- while (tokens[i].t === PROTOCOL) {
27199
- hasProtocol2 = true;
27200
- result.push(tokens[i].v);
27201
- i++;
26821
+ return this.getInner(i);
26822
+ };
26823
+ RopeSequence.prototype.forEach = function forEach3(f, from2, to) {
26824
+ if (from2 === void 0)
26825
+ from2 = 0;
26826
+ if (to === void 0)
26827
+ to = this.length;
26828
+ if (from2 <= to) {
26829
+ this.forEachInner(f, from2, to, 0);
26830
+ } else {
26831
+ this.forEachInvertedInner(f, from2, to, 0);
26832
+ }
26833
+ };
26834
+ RopeSequence.prototype.map = function map(f, from2, to) {
26835
+ if (from2 === void 0)
26836
+ from2 = 0;
26837
+ if (to === void 0)
26838
+ to = this.length;
26839
+ var result = [];
26840
+ this.forEach(function(elt, i) {
26841
+ return result.push(f(elt, i));
26842
+ }, from2, to);
26843
+ return result;
26844
+ };
26845
+ RopeSequence.from = function from(values2) {
26846
+ if (values2 instanceof RopeSequence) {
26847
+ return values2;
26848
+ }
26849
+ return values2 && values2.length ? new Leaf(values2) : RopeSequence.empty;
26850
+ };
26851
+ var Leaf = /* @__PURE__ */ function(RopeSequence3) {
26852
+ function Leaf2(values2) {
26853
+ RopeSequence3.call(this);
26854
+ this.values = values2;
26855
+ }
26856
+ if (RopeSequence3)
26857
+ Leaf2.__proto__ = RopeSequence3;
26858
+ Leaf2.prototype = Object.create(RopeSequence3 && RopeSequence3.prototype);
26859
+ Leaf2.prototype.constructor = Leaf2;
26860
+ var prototypeAccessors = { length: { configurable: true }, depth: { configurable: true } };
26861
+ Leaf2.prototype.flatten = function flatten() {
26862
+ return this.values;
26863
+ };
26864
+ Leaf2.prototype.sliceInner = function sliceInner(from2, to) {
26865
+ if (from2 == 0 && to == this.length) {
26866
+ return this;
26867
+ }
26868
+ return new Leaf2(this.values.slice(from2, to));
26869
+ };
26870
+ Leaf2.prototype.getInner = function getInner(i) {
26871
+ return this.values[i];
26872
+ };
26873
+ Leaf2.prototype.forEachInner = function forEachInner(f, from2, to, start2) {
26874
+ for (var i = from2; i < to; i++) {
26875
+ if (f(this.values[i], start2 + i) === false) {
26876
+ return false;
26877
+ }
26878
+ }
26879
+ };
26880
+ Leaf2.prototype.forEachInvertedInner = function forEachInvertedInner(f, from2, to, start2) {
26881
+ for (var i = from2 - 1; i >= to; i--) {
26882
+ if (f(this.values[i], start2 + i) === false) {
26883
+ return false;
26884
+ }
26885
+ }
26886
+ };
26887
+ Leaf2.prototype.leafAppend = function leafAppend(other) {
26888
+ if (this.length + other.length <= GOOD_LEAF_SIZE) {
26889
+ return new Leaf2(this.values.concat(other.flatten()));
26890
+ }
26891
+ };
26892
+ Leaf2.prototype.leafPrepend = function leafPrepend(other) {
26893
+ if (this.length + other.length <= GOOD_LEAF_SIZE) {
26894
+ return new Leaf2(other.flatten().concat(this.values));
26895
+ }
26896
+ };
26897
+ prototypeAccessors.length.get = function() {
26898
+ return this.values.length;
26899
+ };
26900
+ prototypeAccessors.depth.get = function() {
26901
+ return 0;
26902
+ };
26903
+ Object.defineProperties(Leaf2.prototype, prototypeAccessors);
26904
+ return Leaf2;
26905
+ }(RopeSequence);
26906
+ RopeSequence.empty = new Leaf([]);
26907
+ var Append = /* @__PURE__ */ function(RopeSequence3) {
26908
+ function Append2(left2, right2) {
26909
+ RopeSequence3.call(this);
26910
+ this.left = left2;
26911
+ this.right = right2;
26912
+ this.length = left2.length + right2.length;
26913
+ this.depth = Math.max(left2.depth, right2.depth) + 1;
26914
+ }
26915
+ if (RopeSequence3)
26916
+ Append2.__proto__ = RopeSequence3;
26917
+ Append2.prototype = Object.create(RopeSequence3 && RopeSequence3.prototype);
26918
+ Append2.prototype.constructor = Append2;
26919
+ Append2.prototype.flatten = function flatten() {
26920
+ return this.left.flatten().concat(this.right.flatten());
26921
+ };
26922
+ Append2.prototype.getInner = function getInner(i) {
26923
+ return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length);
26924
+ };
26925
+ Append2.prototype.forEachInner = function forEachInner(f, from2, to, start2) {
26926
+ var leftLen = this.left.length;
26927
+ if (from2 < leftLen && this.left.forEachInner(f, from2, Math.min(to, leftLen), start2) === false) {
26928
+ return false;
26929
+ }
26930
+ if (to > leftLen && this.right.forEachInner(f, Math.max(from2 - leftLen, 0), Math.min(this.length, to) - leftLen, start2 + leftLen) === false) {
26931
+ return false;
26932
+ }
26933
+ };
26934
+ Append2.prototype.forEachInvertedInner = function forEachInvertedInner(f, from2, to, start2) {
26935
+ var leftLen = this.left.length;
26936
+ if (from2 > leftLen && this.right.forEachInvertedInner(f, from2 - leftLen, Math.max(to, leftLen) - leftLen, start2 + leftLen) === false) {
26937
+ return false;
26938
+ }
26939
+ if (to < leftLen && this.left.forEachInvertedInner(f, Math.min(from2, leftLen), to, start2) === false) {
26940
+ return false;
26941
+ }
26942
+ };
26943
+ Append2.prototype.sliceInner = function sliceInner(from2, to) {
26944
+ if (from2 == 0 && to == this.length) {
26945
+ return this;
27202
26946
  }
27203
- while (tokens[i].t === SLASH) {
27204
- hasSlashSlash = true;
27205
- result.push(tokens[i].v);
27206
- i++;
26947
+ var leftLen = this.left.length;
26948
+ if (to <= leftLen) {
26949
+ return this.left.slice(from2, to);
27207
26950
  }
27208
- for (; i < tokens.length; i++) {
27209
- result.push(tokens[i].v);
26951
+ if (from2 >= leftLen) {
26952
+ return this.right.slice(from2 - leftLen, to - leftLen);
27210
26953
  }
27211
- result = result.join("");
27212
- if (!(hasProtocol2 || hasSlashSlash)) {
27213
- result = "".concat(protocol, "://").concat(result);
26954
+ return this.left.slice(from2, leftLen).append(this.right.slice(0, to - leftLen));
26955
+ };
26956
+ Append2.prototype.leafAppend = function leafAppend(other) {
26957
+ var inner = this.right.leafAppend(other);
26958
+ if (inner) {
26959
+ return new Append2(this.left, inner);
27214
26960
  }
27215
- return result;
27216
- },
27217
- hasProtocol: function hasProtocol() {
27218
- return this.tk[0].t === PROTOCOL;
26961
+ };
26962
+ Append2.prototype.leafPrepend = function leafPrepend(other) {
26963
+ var inner = this.left.leafPrepend(other);
26964
+ if (inner) {
26965
+ return new Append2(inner, this.right);
26966
+ }
26967
+ };
26968
+ Append2.prototype.appendInner = function appendInner2(other) {
26969
+ if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1) {
26970
+ return new Append2(this.left, new Append2(this.right, other));
26971
+ }
26972
+ return new Append2(this, other);
26973
+ };
26974
+ return Append2;
26975
+ }(RopeSequence);
26976
+ var ropeSequence = RopeSequence;
26977
+ const max_empty_items = 500;
26978
+ class Branch {
26979
+ constructor(items, eventCount) {
26980
+ this.items = items;
26981
+ this.eventCount = eventCount;
27219
26982
  }
27220
- });
27221
- var multi = /* @__PURE__ */ Object.freeze({
27222
- __proto__: null,
27223
- MultiToken,
27224
- Base: MultiToken,
27225
- createTokenClass,
27226
- MailtoEmail,
27227
- Email,
27228
- Text,
27229
- Nl,
27230
- Url
27231
- });
27232
- function init$1() {
27233
- var S_START = makeState();
27234
- var S_PROTOCOL = makeState();
27235
- var S_MAILTO = makeState();
27236
- var S_PROTOCOL_SLASH = makeState();
27237
- var S_PROTOCOL_SLASH_SLASH = makeState();
27238
- var S_DOMAIN = makeState();
27239
- var S_DOMAIN_DOT = makeState();
27240
- var S_TLD = makeAcceptingState(Url);
27241
- var S_TLD_COLON = makeState();
27242
- var S_TLD_PORT = makeAcceptingState(Url);
27243
- var S_URL = makeAcceptingState(Url);
27244
- var S_URL_NON_ACCEPTING = makeState();
27245
- var S_URL_OPENBRACE = makeState();
27246
- var S_URL_OPENBRACKET = makeState();
27247
- var S_URL_OPENANGLEBRACKET = makeState();
27248
- var S_URL_OPENPAREN = makeState();
27249
- var S_URL_OPENBRACE_Q = makeAcceptingState(Url);
27250
- var S_URL_OPENBRACKET_Q = makeAcceptingState(Url);
27251
- var S_URL_OPENANGLEBRACKET_Q = makeAcceptingState(Url);
27252
- var S_URL_OPENPAREN_Q = makeAcceptingState(Url);
27253
- var S_URL_OPENBRACE_SYMS = makeState();
27254
- var S_URL_OPENBRACKET_SYMS = makeState();
27255
- var S_URL_OPENANGLEBRACKET_SYMS = makeState();
27256
- var S_URL_OPENPAREN_SYMS = makeState();
27257
- var S_EMAIL_DOMAIN = makeState();
27258
- var S_EMAIL_DOMAIN_DOT = makeState();
27259
- var S_EMAIL = makeAcceptingState(Email);
27260
- var S_EMAIL_COLON = makeState();
27261
- var S_EMAIL_PORT = makeAcceptingState(Email);
27262
- var S_MAILTO_EMAIL = makeAcceptingState(MailtoEmail);
27263
- var S_MAILTO_EMAIL_NON_ACCEPTING = makeState();
27264
- var S_LOCALPART = makeState();
27265
- var S_LOCALPART_AT = makeState();
27266
- var S_LOCALPART_DOT = makeState();
27267
- var S_NL = makeAcceptingState(Nl);
27268
- makeT(S_START, NL, S_NL);
27269
- makeT(S_START, PROTOCOL, S_PROTOCOL);
27270
- makeT(S_START, MAILTO, S_MAILTO);
27271
- makeT(S_PROTOCOL, SLASH, S_PROTOCOL_SLASH);
27272
- makeT(S_PROTOCOL_SLASH, SLASH, S_PROTOCOL_SLASH_SLASH);
27273
- makeT(S_START, TLD, S_DOMAIN);
27274
- makeT(S_START, DOMAIN, S_DOMAIN);
27275
- makeT(S_START, LOCALHOST, S_TLD);
27276
- makeT(S_START, NUM, S_DOMAIN);
27277
- makeT(S_PROTOCOL_SLASH_SLASH, TLD, S_URL);
27278
- makeT(S_PROTOCOL_SLASH_SLASH, DOMAIN, S_URL);
27279
- makeT(S_PROTOCOL_SLASH_SLASH, NUM, S_URL);
27280
- makeT(S_PROTOCOL_SLASH_SLASH, LOCALHOST, S_URL);
27281
- makeT(S_DOMAIN, DOT, S_DOMAIN_DOT);
27282
- makeT(S_EMAIL_DOMAIN, DOT, S_EMAIL_DOMAIN_DOT);
27283
- makeT(S_DOMAIN_DOT, TLD, S_TLD);
27284
- makeT(S_DOMAIN_DOT, DOMAIN, S_DOMAIN);
27285
- makeT(S_DOMAIN_DOT, NUM, S_DOMAIN);
27286
- makeT(S_DOMAIN_DOT, LOCALHOST, S_DOMAIN);
27287
- makeT(S_EMAIL_DOMAIN_DOT, TLD, S_EMAIL);
27288
- makeT(S_EMAIL_DOMAIN_DOT, DOMAIN, S_EMAIL_DOMAIN);
27289
- makeT(S_EMAIL_DOMAIN_DOT, NUM, S_EMAIL_DOMAIN);
27290
- makeT(S_EMAIL_DOMAIN_DOT, LOCALHOST, S_EMAIL_DOMAIN);
27291
- makeT(S_TLD, DOT, S_DOMAIN_DOT);
27292
- makeT(S_EMAIL, DOT, S_EMAIL_DOMAIN_DOT);
27293
- makeT(S_TLD, COLON, S_TLD_COLON);
27294
- makeT(S_TLD, SLASH, S_URL);
27295
- makeT(S_TLD_COLON, NUM, S_TLD_PORT);
27296
- makeT(S_TLD_PORT, SLASH, S_URL);
27297
- makeT(S_EMAIL, COLON, S_EMAIL_COLON);
27298
- makeT(S_EMAIL_COLON, NUM, S_EMAIL_PORT);
27299
- var qsAccepting = [AMPERSAND, ASTERISK, AT, BACKSLASH, BACKTICK, CARET, DOLLAR, DOMAIN, EQUALS, HYPHEN, LOCALHOST, NUM, PERCENT, PIPE, PLUS, POUND, PROTOCOL, SLASH, SYM, TILDE, TLD, UNDERSCORE];
27300
- var qsNonAccepting = [APOSTROPHE, CLOSEANGLEBRACKET, CLOSEBRACE, CLOSEBRACKET, CLOSEPAREN, COLON, COMMA, DOT, EXCLAMATION, OPENANGLEBRACKET, OPENBRACE, OPENBRACKET, OPENPAREN, QUERY, QUOTE, SEMI];
27301
- makeT(S_URL, OPENBRACE, S_URL_OPENBRACE);
27302
- makeT(S_URL, OPENBRACKET, S_URL_OPENBRACKET);
27303
- makeT(S_URL, OPENANGLEBRACKET, S_URL_OPENANGLEBRACKET);
27304
- makeT(S_URL, OPENPAREN, S_URL_OPENPAREN);
27305
- makeT(S_URL_NON_ACCEPTING, OPENBRACE, S_URL_OPENBRACE);
27306
- makeT(S_URL_NON_ACCEPTING, OPENBRACKET, S_URL_OPENBRACKET);
27307
- makeT(S_URL_NON_ACCEPTING, OPENANGLEBRACKET, S_URL_OPENANGLEBRACKET);
27308
- makeT(S_URL_NON_ACCEPTING, OPENPAREN, S_URL_OPENPAREN);
27309
- makeT(S_URL_OPENBRACE, CLOSEBRACE, S_URL);
27310
- makeT(S_URL_OPENBRACKET, CLOSEBRACKET, S_URL);
27311
- makeT(S_URL_OPENANGLEBRACKET, CLOSEANGLEBRACKET, S_URL);
27312
- makeT(S_URL_OPENPAREN, CLOSEPAREN, S_URL);
27313
- makeT(S_URL_OPENBRACE_Q, CLOSEBRACE, S_URL);
27314
- makeT(S_URL_OPENBRACKET_Q, CLOSEBRACKET, S_URL);
27315
- makeT(S_URL_OPENANGLEBRACKET_Q, CLOSEANGLEBRACKET, S_URL);
27316
- makeT(S_URL_OPENPAREN_Q, CLOSEPAREN, S_URL);
27317
- makeT(S_URL_OPENBRACE_SYMS, CLOSEBRACE, S_URL);
27318
- makeT(S_URL_OPENBRACKET_SYMS, CLOSEBRACKET, S_URL);
27319
- makeT(S_URL_OPENANGLEBRACKET_SYMS, CLOSEANGLEBRACKET, S_URL);
27320
- makeT(S_URL_OPENPAREN_SYMS, CLOSEPAREN, S_URL);
27321
- makeMultiT(S_URL_OPENBRACE, qsAccepting, S_URL_OPENBRACE_Q);
27322
- makeMultiT(S_URL_OPENBRACKET, qsAccepting, S_URL_OPENBRACKET_Q);
27323
- makeMultiT(S_URL_OPENANGLEBRACKET, qsAccepting, S_URL_OPENANGLEBRACKET_Q);
27324
- makeMultiT(S_URL_OPENPAREN, qsAccepting, S_URL_OPENPAREN_Q);
27325
- makeMultiT(S_URL_OPENBRACE, qsNonAccepting, S_URL_OPENBRACE_SYMS);
27326
- makeMultiT(S_URL_OPENBRACKET, qsNonAccepting, S_URL_OPENBRACKET_SYMS);
27327
- makeMultiT(S_URL_OPENANGLEBRACKET, qsNonAccepting, S_URL_OPENANGLEBRACKET_SYMS);
27328
- makeMultiT(S_URL_OPENPAREN, qsNonAccepting, S_URL_OPENPAREN_SYMS);
27329
- makeMultiT(S_URL_OPENBRACE_Q, qsAccepting, S_URL_OPENBRACE_Q);
27330
- makeMultiT(S_URL_OPENBRACKET_Q, qsAccepting, S_URL_OPENBRACKET_Q);
27331
- makeMultiT(S_URL_OPENANGLEBRACKET_Q, qsAccepting, S_URL_OPENANGLEBRACKET_Q);
27332
- makeMultiT(S_URL_OPENPAREN_Q, qsAccepting, S_URL_OPENPAREN_Q);
27333
- makeMultiT(S_URL_OPENBRACE_Q, qsNonAccepting, S_URL_OPENBRACE_Q);
27334
- makeMultiT(S_URL_OPENBRACKET_Q, qsNonAccepting, S_URL_OPENBRACKET_Q);
27335
- makeMultiT(S_URL_OPENANGLEBRACKET_Q, qsNonAccepting, S_URL_OPENANGLEBRACKET_Q);
27336
- makeMultiT(S_URL_OPENPAREN_Q, qsNonAccepting, S_URL_OPENPAREN_Q);
27337
- makeMultiT(S_URL_OPENBRACE_SYMS, qsAccepting, S_URL_OPENBRACE_Q);
27338
- makeMultiT(S_URL_OPENBRACKET_SYMS, qsAccepting, S_URL_OPENBRACKET_Q);
27339
- makeMultiT(S_URL_OPENANGLEBRACKET_SYMS, qsAccepting, S_URL_OPENANGLEBRACKET_Q);
27340
- makeMultiT(S_URL_OPENPAREN_SYMS, qsAccepting, S_URL_OPENPAREN_Q);
27341
- makeMultiT(S_URL_OPENBRACE_SYMS, qsNonAccepting, S_URL_OPENBRACE_SYMS);
27342
- makeMultiT(S_URL_OPENBRACKET_SYMS, qsNonAccepting, S_URL_OPENBRACKET_SYMS);
27343
- makeMultiT(S_URL_OPENANGLEBRACKET_SYMS, qsNonAccepting, S_URL_OPENANGLEBRACKET_SYMS);
27344
- makeMultiT(S_URL_OPENPAREN_SYMS, qsNonAccepting, S_URL_OPENPAREN_SYMS);
27345
- makeMultiT(S_URL, qsAccepting, S_URL);
27346
- makeMultiT(S_URL_NON_ACCEPTING, qsAccepting, S_URL);
27347
- makeMultiT(S_URL, qsNonAccepting, S_URL_NON_ACCEPTING);
27348
- makeMultiT(S_URL_NON_ACCEPTING, qsNonAccepting, S_URL_NON_ACCEPTING);
27349
- makeT(S_MAILTO, TLD, S_MAILTO_EMAIL);
27350
- makeT(S_MAILTO, DOMAIN, S_MAILTO_EMAIL);
27351
- makeT(S_MAILTO, NUM, S_MAILTO_EMAIL);
27352
- makeT(S_MAILTO, LOCALHOST, S_MAILTO_EMAIL);
27353
- makeMultiT(S_MAILTO_EMAIL, qsAccepting, S_MAILTO_EMAIL);
27354
- makeMultiT(S_MAILTO_EMAIL, qsNonAccepting, S_MAILTO_EMAIL_NON_ACCEPTING);
27355
- makeMultiT(S_MAILTO_EMAIL_NON_ACCEPTING, qsAccepting, S_MAILTO_EMAIL);
27356
- makeMultiT(S_MAILTO_EMAIL_NON_ACCEPTING, qsNonAccepting, S_MAILTO_EMAIL_NON_ACCEPTING);
27357
- var localpartAccepting = [AMPERSAND, APOSTROPHE, ASTERISK, BACKSLASH, BACKTICK, CARET, CLOSEBRACE, DOLLAR, DOMAIN, EQUALS, HYPHEN, NUM, OPENBRACE, PERCENT, PIPE, PLUS, POUND, QUERY, SLASH, SYM, TILDE, TLD, UNDERSCORE];
27358
- makeMultiT(S_DOMAIN, localpartAccepting, S_LOCALPART);
27359
- makeT(S_DOMAIN, AT, S_LOCALPART_AT);
27360
- makeMultiT(S_TLD, localpartAccepting, S_LOCALPART);
27361
- makeT(S_TLD, AT, S_LOCALPART_AT);
27362
- makeMultiT(S_DOMAIN_DOT, localpartAccepting, S_LOCALPART);
27363
- makeMultiT(S_LOCALPART, localpartAccepting, S_LOCALPART);
27364
- makeT(S_LOCALPART, AT, S_LOCALPART_AT);
27365
- makeT(S_LOCALPART, DOT, S_LOCALPART_DOT);
27366
- makeMultiT(S_LOCALPART_DOT, localpartAccepting, S_LOCALPART);
27367
- makeT(S_LOCALPART_AT, TLD, S_EMAIL_DOMAIN);
27368
- makeT(S_LOCALPART_AT, DOMAIN, S_EMAIL_DOMAIN);
27369
- makeT(S_LOCALPART_AT, NUM, S_EMAIL_DOMAIN);
27370
- makeT(S_LOCALPART_AT, LOCALHOST, S_EMAIL);
27371
- return S_START;
27372
- }
27373
- function run(start2, input, tokens) {
27374
- var len = tokens.length;
27375
- var cursor = 0;
27376
- var multis = [];
27377
- var textTokens = [];
27378
- while (cursor < len) {
27379
- var state = start2;
27380
- var secondState = null;
27381
- var nextState = null;
27382
- var multiLength = 0;
27383
- var latestAccepting = null;
27384
- var sinceAccepts = -1;
27385
- while (cursor < len && !(secondState = takeT(state, tokens[cursor].t))) {
27386
- textTokens.push(tokens[cursor++]);
26983
+ popEvent(state, preserveItems) {
26984
+ if (this.eventCount == 0)
26985
+ return null;
26986
+ let end2 = this.items.length;
26987
+ for (; ; end2--) {
26988
+ let next2 = this.items.get(end2 - 1);
26989
+ if (next2.selection) {
26990
+ --end2;
26991
+ break;
26992
+ }
27387
26993
  }
27388
- while (cursor < len && (nextState = secondState || takeT(state, tokens[cursor].t))) {
27389
- secondState = null;
27390
- state = nextState;
27391
- if (state.accepts()) {
27392
- sinceAccepts = 0;
27393
- latestAccepting = state;
27394
- } else if (sinceAccepts >= 0) {
27395
- sinceAccepts++;
26994
+ let remap, mapFrom;
26995
+ if (preserveItems) {
26996
+ remap = this.remapping(end2, this.items.length);
26997
+ mapFrom = remap.maps.length;
26998
+ }
26999
+ let transform = state.tr;
27000
+ let selection, remaining;
27001
+ let addAfter = [], addBefore = [];
27002
+ this.items.forEach((item, i) => {
27003
+ if (!item.step) {
27004
+ if (!remap) {
27005
+ remap = this.remapping(end2, i + 1);
27006
+ mapFrom = remap.maps.length;
27007
+ }
27008
+ mapFrom--;
27009
+ addBefore.push(item);
27010
+ return;
27011
+ }
27012
+ if (remap) {
27013
+ addBefore.push(new Item(item.map));
27014
+ let step = item.step.map(remap.slice(mapFrom)), map2;
27015
+ if (step && transform.maybeStep(step).doc) {
27016
+ map2 = transform.mapping.maps[transform.mapping.maps.length - 1];
27017
+ addAfter.push(new Item(map2, void 0, void 0, addAfter.length + addBefore.length));
27018
+ }
27019
+ mapFrom--;
27020
+ if (map2)
27021
+ remap.appendMap(map2, mapFrom);
27022
+ } else {
27023
+ transform.maybeStep(item.step);
27396
27024
  }
27397
- cursor++;
27398
- multiLength++;
27399
- }
27400
- if (sinceAccepts < 0) {
27401
- for (var i = cursor - multiLength; i < cursor; i++) {
27402
- textTokens.push(tokens[i]);
27025
+ if (item.selection) {
27026
+ selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;
27027
+ remaining = new Branch(this.items.slice(0, end2).append(addBefore.reverse().concat(addAfter)), this.eventCount - 1);
27028
+ return false;
27403
27029
  }
27404
- } else {
27405
- if (textTokens.length > 0) {
27406
- multis.push(parserCreateMultiToken(Text, input, textTokens));
27407
- textTokens = [];
27030
+ }, this.items.length, 0);
27031
+ return { remaining, transform, selection };
27032
+ }
27033
+ addTransform(transform, selection, histOptions, preserveItems) {
27034
+ let newItems = [], eventCount = this.eventCount;
27035
+ let oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;
27036
+ for (let i = 0; i < transform.steps.length; i++) {
27037
+ let step = transform.steps[i].invert(transform.docs[i]);
27038
+ let item = new Item(transform.mapping.maps[i], step, selection), merged;
27039
+ if (merged = lastItem && lastItem.merge(item)) {
27040
+ item = merged;
27041
+ if (i)
27042
+ newItems.pop();
27043
+ else
27044
+ oldItems = oldItems.slice(0, oldItems.length - 1);
27408
27045
  }
27409
- cursor -= sinceAccepts;
27410
- multiLength -= sinceAccepts;
27411
- var Multi = latestAccepting.t;
27412
- var subtokens = tokens.slice(cursor - multiLength, cursor);
27413
- multis.push(parserCreateMultiToken(Multi, input, subtokens));
27046
+ newItems.push(item);
27047
+ if (selection) {
27048
+ eventCount++;
27049
+ selection = void 0;
27050
+ }
27051
+ if (!preserveItems)
27052
+ lastItem = item;
27053
+ }
27054
+ let overflow = eventCount - histOptions.depth;
27055
+ if (overflow > DEPTH_OVERFLOW) {
27056
+ oldItems = cutOffEvents(oldItems, overflow);
27057
+ eventCount -= overflow;
27414
27058
  }
27059
+ return new Branch(oldItems.append(newItems), eventCount);
27415
27060
  }
27416
- if (textTokens.length > 0) {
27417
- multis.push(parserCreateMultiToken(Text, input, textTokens));
27061
+ remapping(from2, to) {
27062
+ let maps = new Mapping();
27063
+ this.items.forEach((item, i) => {
27064
+ let mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from2 ? maps.maps.length - item.mirrorOffset : void 0;
27065
+ maps.appendMap(item.map, mirrorPos);
27066
+ }, from2, to);
27067
+ return maps;
27068
+ }
27069
+ addMaps(array) {
27070
+ if (this.eventCount == 0)
27071
+ return this;
27072
+ return new Branch(this.items.append(array.map((map2) => new Item(map2))), this.eventCount);
27073
+ }
27074
+ rebased(rebasedTransform, rebasedCount) {
27075
+ if (!this.eventCount)
27076
+ return this;
27077
+ let rebasedItems = [], start2 = Math.max(0, this.items.length - rebasedCount);
27078
+ let mapping = rebasedTransform.mapping;
27079
+ let newUntil = rebasedTransform.steps.length;
27080
+ let eventCount = this.eventCount;
27081
+ this.items.forEach((item) => {
27082
+ if (item.selection)
27083
+ eventCount--;
27084
+ }, start2);
27085
+ let iRebased = rebasedCount;
27086
+ this.items.forEach((item) => {
27087
+ let pos = mapping.getMirror(--iRebased);
27088
+ if (pos == null)
27089
+ return;
27090
+ newUntil = Math.min(newUntil, pos);
27091
+ let map2 = mapping.maps[pos];
27092
+ if (item.step) {
27093
+ let step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);
27094
+ let selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));
27095
+ if (selection)
27096
+ eventCount++;
27097
+ rebasedItems.push(new Item(map2, step, selection));
27098
+ } else {
27099
+ rebasedItems.push(new Item(map2));
27100
+ }
27101
+ }, start2);
27102
+ let newMaps = [];
27103
+ for (let i = rebasedCount; i < newUntil; i++)
27104
+ newMaps.push(new Item(mapping.maps[i]));
27105
+ let items = this.items.slice(0, start2).append(newMaps).append(rebasedItems);
27106
+ let branch = new Branch(items, eventCount);
27107
+ if (branch.emptyItemCount() > max_empty_items)
27108
+ branch = branch.compress(this.items.length - rebasedItems.length);
27109
+ return branch;
27110
+ }
27111
+ emptyItemCount() {
27112
+ let count = 0;
27113
+ this.items.forEach((item) => {
27114
+ if (!item.step)
27115
+ count++;
27116
+ });
27117
+ return count;
27118
+ }
27119
+ compress(upto = this.items.length) {
27120
+ let remap = this.remapping(0, upto), mapFrom = remap.maps.length;
27121
+ let items = [], events2 = 0;
27122
+ this.items.forEach((item, i) => {
27123
+ if (i >= upto) {
27124
+ items.push(item);
27125
+ if (item.selection)
27126
+ events2++;
27127
+ } else if (item.step) {
27128
+ let step = item.step.map(remap.slice(mapFrom)), map2 = step && step.getMap();
27129
+ mapFrom--;
27130
+ if (map2)
27131
+ remap.appendMap(map2, mapFrom);
27132
+ if (step) {
27133
+ let selection = item.selection && item.selection.map(remap.slice(mapFrom));
27134
+ if (selection)
27135
+ events2++;
27136
+ let newItem = new Item(map2.invert(), step, selection), merged, last = items.length - 1;
27137
+ if (merged = items.length && items[last].merge(newItem))
27138
+ items[last] = merged;
27139
+ else
27140
+ items.push(newItem);
27141
+ }
27142
+ } else if (item.map) {
27143
+ mapFrom--;
27144
+ }
27145
+ }, this.items.length, 0);
27146
+ return new Branch(ropeSequence.from(items.reverse()), events2);
27418
27147
  }
27419
- return multis;
27420
27148
  }
27421
- function parserCreateMultiToken(Multi, input, tokens) {
27422
- var startIdx = tokens[0].s;
27423
- var endIdx = tokens[tokens.length - 1].e;
27424
- var value = input.substr(startIdx, endIdx - startIdx);
27425
- return new Multi(value, tokens);
27149
+ Branch.empty = new Branch(ropeSequence.empty, 0);
27150
+ function cutOffEvents(items, n) {
27151
+ let cutPoint;
27152
+ items.forEach((item, i) => {
27153
+ if (item.selection && n-- == 0) {
27154
+ cutPoint = i;
27155
+ return false;
27156
+ }
27157
+ });
27158
+ return items.slice(cutPoint);
27426
27159
  }
27427
- var warn = typeof console !== "undefined" && console && console.warn || function() {
27428
- };
27429
- var INIT = {
27430
- scanner: null,
27431
- parser: null,
27432
- pluginQueue: [],
27433
- customProtocols: [],
27434
- initialized: false
27435
- };
27436
- function registerCustomProtocol(protocol) {
27437
- if (INIT.initialized) {
27438
- warn('linkifyjs: already initialized - will not register custom protocol "'.concat(protocol, '" until you manually call linkify.init(). To avoid this warning, please register all custom protocols before invoking linkify the first time.'));
27160
+ class Item {
27161
+ constructor(map2, step, selection, mirrorOffset) {
27162
+ this.map = map2;
27163
+ this.step = step;
27164
+ this.selection = selection;
27165
+ this.mirrorOffset = mirrorOffset;
27439
27166
  }
27440
- if (!/^[a-z-]+$/.test(protocol)) {
27441
- throw Error("linkifyjs: protocols containing characters other than a-z or - (hyphen) are not supported");
27167
+ merge(other) {
27168
+ if (this.step && other.step && !other.selection) {
27169
+ let step = other.step.merge(this.step);
27170
+ if (step)
27171
+ return new Item(step.getMap().invert(), step, this.selection);
27172
+ }
27442
27173
  }
27443
- INIT.customProtocols.push(protocol);
27444
27174
  }
27445
- function init() {
27446
- INIT.scanner = {
27447
- start: init$2(INIT.customProtocols),
27448
- tokens: text
27449
- };
27450
- INIT.parser = {
27451
- start: init$1(),
27452
- tokens: multi
27453
- };
27454
- var utils = {
27455
- createTokenClass
27456
- };
27457
- for (var i = 0; i < INIT.pluginQueue.length; i++) {
27458
- INIT.pluginQueue[i][1]({
27459
- scanner: INIT.scanner,
27460
- parser: INIT.parser,
27461
- utils
27462
- });
27175
+ class HistoryState {
27176
+ constructor(done, undone, prevRanges, prevTime) {
27177
+ this.done = done;
27178
+ this.undone = undone;
27179
+ this.prevRanges = prevRanges;
27180
+ this.prevTime = prevTime;
27463
27181
  }
27464
- INIT.initialized = true;
27465
27182
  }
27466
- function tokenize(str) {
27467
- if (!INIT.initialized) {
27468
- init();
27183
+ const DEPTH_OVERFLOW = 20;
27184
+ function applyTransaction(history2, state, tr, options) {
27185
+ let historyTr = tr.getMeta(historyKey), rebased;
27186
+ if (historyTr)
27187
+ return historyTr.historyState;
27188
+ if (tr.getMeta(closeHistoryKey))
27189
+ history2 = new HistoryState(history2.done, history2.undone, null, 0);
27190
+ let appended = tr.getMeta("appendedTransaction");
27191
+ if (tr.steps.length == 0) {
27192
+ return history2;
27193
+ } else if (appended && appended.getMeta(historyKey)) {
27194
+ if (appended.getMeta(historyKey).redo)
27195
+ return new HistoryState(history2.done.addTransform(tr, void 0, options, mustPreserveItems(state)), history2.undone, rangesFor(tr.mapping.maps[tr.steps.length - 1]), history2.prevTime);
27196
+ else
27197
+ return new HistoryState(history2.done, history2.undone.addTransform(tr, void 0, options, mustPreserveItems(state)), null, history2.prevTime);
27198
+ } else if (tr.getMeta("addToHistory") !== false && !(appended && appended.getMeta("addToHistory") === false)) {
27199
+ let newGroup = history2.prevTime == 0 || !appended && (history2.prevTime < (tr.time || 0) - options.newGroupDelay || !isAdjacentTo(tr, history2.prevRanges));
27200
+ let prevRanges = appended ? mapRanges(history2.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps[tr.steps.length - 1]);
27201
+ return new HistoryState(history2.done.addTransform(tr, newGroup ? state.selection.getBookmark() : void 0, options, mustPreserveItems(state)), Branch.empty, prevRanges, tr.time);
27202
+ } else if (rebased = tr.getMeta("rebased")) {
27203
+ return new HistoryState(history2.done.rebased(tr, rebased), history2.undone.rebased(tr, rebased), mapRanges(history2.prevRanges, tr.mapping), history2.prevTime);
27204
+ } else {
27205
+ return new HistoryState(history2.done.addMaps(tr.mapping.maps), history2.undone.addMaps(tr.mapping.maps), mapRanges(history2.prevRanges, tr.mapping), history2.prevTime);
27206
+ }
27207
+ }
27208
+ function isAdjacentTo(transform, prevRanges) {
27209
+ if (!prevRanges)
27210
+ return false;
27211
+ if (!transform.docChanged)
27212
+ return true;
27213
+ let adjacent = false;
27214
+ transform.mapping.maps[0].forEach((start2, end2) => {
27215
+ for (let i = 0; i < prevRanges.length; i += 2)
27216
+ if (start2 <= prevRanges[i + 1] && end2 >= prevRanges[i])
27217
+ adjacent = true;
27218
+ });
27219
+ return adjacent;
27220
+ }
27221
+ function rangesFor(map2) {
27222
+ let result = [];
27223
+ map2.forEach((_from, _to, from2, to) => result.push(from2, to));
27224
+ return result;
27225
+ }
27226
+ function mapRanges(ranges, mapping) {
27227
+ if (!ranges)
27228
+ return null;
27229
+ let result = [];
27230
+ for (let i = 0; i < ranges.length; i += 2) {
27231
+ let from2 = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);
27232
+ if (from2 <= to)
27233
+ result.push(from2, to);
27469
27234
  }
27470
- return run(INIT.parser.start, str, run$1(INIT.scanner.start, str));
27235
+ return result;
27471
27236
  }
27472
- function find(str) {
27473
- var type = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
27474
- var tokens = tokenize(str);
27475
- var filtered = [];
27476
- for (var i = 0; i < tokens.length; i++) {
27477
- var token = tokens[i];
27478
- if (token.isLink && (!type || token.t === type)) {
27479
- filtered.push(token.toObject());
27480
- }
27481
- }
27482
- return filtered;
27237
+ function histTransaction(history2, state, dispatch, redo2) {
27238
+ let preserveItems = mustPreserveItems(state);
27239
+ let histOptions = historyKey.get(state).spec.config;
27240
+ let pop = (redo2 ? history2.undone : history2.done).popEvent(state, preserveItems);
27241
+ if (!pop)
27242
+ return;
27243
+ let selection = pop.selection.resolve(pop.transform.doc);
27244
+ let added = (redo2 ? history2.done : history2.undone).addTransform(pop.transform, state.selection.getBookmark(), histOptions, preserveItems);
27245
+ let newHist = new HistoryState(redo2 ? added : pop.remaining, redo2 ? pop.remaining : added, null, 0);
27246
+ dispatch(pop.transform.setSelection(selection).setMeta(historyKey, { redo: redo2, historyState: newHist }).scrollIntoView());
27483
27247
  }
27484
- function test(str) {
27485
- var type = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
27486
- var tokens = tokenize(str);
27487
- return tokens.length === 1 && tokens[0].isLink && (!type || tokens[0].t === type);
27248
+ let cachedPreserveItems = false, cachedPreserveItemsPlugins = null;
27249
+ function mustPreserveItems(state) {
27250
+ let plugins = state.plugins;
27251
+ if (cachedPreserveItemsPlugins != plugins) {
27252
+ cachedPreserveItems = false;
27253
+ cachedPreserveItemsPlugins = plugins;
27254
+ for (let i = 0; i < plugins.length; i++)
27255
+ if (plugins[i].spec.historyPreserveItems) {
27256
+ cachedPreserveItems = true;
27257
+ break;
27258
+ }
27259
+ }
27260
+ return cachedPreserveItems;
27488
27261
  }
27489
- function autolink(options) {
27262
+ const historyKey = new PluginKey("history");
27263
+ const closeHistoryKey = new PluginKey("closeHistory");
27264
+ function history(config = {}) {
27265
+ config = {
27266
+ depth: config.depth || 100,
27267
+ newGroupDelay: config.newGroupDelay || 500
27268
+ };
27490
27269
  return new Plugin({
27491
- key: new PluginKey("autolink"),
27492
- appendTransaction: (transactions, oldState, newState) => {
27493
- const docChanges = transactions.some((transaction) => transaction.docChanged) && !oldState.doc.eq(newState.doc);
27494
- const preventAutolink = transactions.some((transaction) => transaction.getMeta("preventAutolink"));
27495
- if (!docChanges || preventAutolink) {
27496
- return;
27270
+ key: historyKey,
27271
+ state: {
27272
+ init() {
27273
+ return new HistoryState(Branch.empty, Branch.empty, null, 0);
27274
+ },
27275
+ apply(tr, hist, state) {
27276
+ return applyTransaction(hist, state, tr, config);
27497
27277
  }
27498
- const { tr } = newState;
27499
- const transform = combineTransactionSteps(oldState.doc, [...transactions]);
27500
- const { mapping } = transform;
27501
- const changes = getChangedRanges(transform);
27502
- changes.forEach(({ oldRange, newRange }) => {
27503
- getMarksBetween(oldRange.from, oldRange.to, oldState.doc).filter((item) => item.mark.type === options.type).forEach((oldMark) => {
27504
- const newFrom = mapping.map(oldMark.from);
27505
- const newTo = mapping.map(oldMark.to);
27506
- const newMarks = getMarksBetween(newFrom, newTo, newState.doc).filter((item) => item.mark.type === options.type);
27507
- if (!newMarks.length) {
27278
+ },
27279
+ config,
27280
+ props: {
27281
+ handleDOMEvents: {
27282
+ beforeinput(view, e) {
27283
+ let inputType = e.inputType;
27284
+ let command2 = inputType == "historyUndo" ? undo : inputType == "historyRedo" ? redo : null;
27285
+ if (!command2)
27286
+ return false;
27287
+ e.preventDefault();
27288
+ return command2(view.state, view.dispatch);
27289
+ }
27290
+ }
27291
+ }
27292
+ });
27293
+ }
27294
+ const undo = (state, dispatch) => {
27295
+ let hist = historyKey.getState(state);
27296
+ if (!hist || hist.done.eventCount == 0)
27297
+ return false;
27298
+ if (dispatch)
27299
+ histTransaction(hist, state, dispatch, false);
27300
+ return true;
27301
+ };
27302
+ const redo = (state, dispatch) => {
27303
+ let hist = historyKey.getState(state);
27304
+ if (!hist || hist.undone.eventCount == 0)
27305
+ return false;
27306
+ if (dispatch)
27307
+ histTransaction(hist, state, dispatch, true);
27308
+ return true;
27309
+ };
27310
+ const History = Extension.create({
27311
+ name: "history",
27312
+ addOptions() {
27313
+ return {
27314
+ depth: 100,
27315
+ newGroupDelay: 500
27316
+ };
27317
+ },
27318
+ addCommands() {
27319
+ return {
27320
+ undo: () => ({ state, dispatch }) => {
27321
+ return undo(state, dispatch);
27322
+ },
27323
+ redo: () => ({ state, dispatch }) => {
27324
+ return redo(state, dispatch);
27325
+ }
27326
+ };
27327
+ },
27328
+ addProseMirrorPlugins() {
27329
+ return [
27330
+ history(this.options)
27331
+ ];
27332
+ },
27333
+ addKeyboardShortcuts() {
27334
+ return {
27335
+ "Mod-z": () => this.editor.commands.undo(),
27336
+ "Mod-y": () => this.editor.commands.redo(),
27337
+ "Shift-Mod-z": () => this.editor.commands.redo(),
27338
+ "Mod-\u044F": () => this.editor.commands.undo(),
27339
+ "Shift-Mod-\u044F": () => this.editor.commands.redo()
27340
+ };
27341
+ }
27342
+ });
27343
+ const NodeProcessor = Extension.create({
27344
+ name: "node_processor",
27345
+ addCommands() {
27346
+ return {
27347
+ setBlockAttributes: createCommand(({ commands: commands2, state }, name, attrs, defaults2 = {}) => {
27348
+ var _a;
27349
+ const current = (_a = unref(commands2.getBlockAttributes(name))) != null ? _a : {};
27350
+ const { doc: doc2, tr } = state;
27351
+ const { from: from2, to } = tr.selection;
27352
+ doc2.nodesBetween(from2, to, (node, position) => {
27353
+ if (!NodeTypes.blocks.includes(node.type.name))
27508
27354
  return;
27355
+ tr.step(new AttrStep(position, name, { ...defaults2, ...current, ...attrs }));
27356
+ });
27357
+ }),
27358
+ getBlockAttributes: createCommand(({ editor }, name, defaults2) => computed(() => {
27359
+ var _a;
27360
+ let attrs = Object.assign({}, defaults2 || {});
27361
+ for (const type of NodeTypes.blocks) {
27362
+ Object.assign(attrs, ((_a = editor.getAttributes(type)) == null ? void 0 : _a[name]) || {});
27363
+ }
27364
+ return Object.keys(attrs).length ? attrs : null;
27365
+ })),
27366
+ removeBlockAttributes: createCommand(({ commands: commands2 }, names) => {
27367
+ for (const type of NodeTypes.blocks) {
27368
+ commands2.resetAttributes(type, names);
27369
+ }
27370
+ }),
27371
+ applyMark: createCommand(({ state, commands: commands2 }, name, value, customizer = {}) => {
27372
+ const { tr, doc: doc2, schema } = state;
27373
+ const { $from, $to } = tr.selection;
27374
+ const markType = getMarkType(name, schema);
27375
+ const markGroup = markType.spec.group || "";
27376
+ if (!markGroup.includes(MarkGroups.SETTINGS)) {
27377
+ return commands2.setMark(name, value);
27378
+ }
27379
+ if ($from.pos === $to.pos)
27380
+ return;
27381
+ const onAppliedToParent = (context) => {
27382
+ if (!customizer.onAppliedToParent || customizer.onAppliedToParent(context) === false) {
27383
+ const { tr: tr2, node, position, mark } = context;
27384
+ commands2._removeNodeMark({ tr: tr2, node, position, mark: mark.type });
27509
27385
  }
27510
- const newMark = newMarks[0];
27511
- const oldLinkText = oldState.doc.textBetween(oldMark.from, oldMark.to, void 0, " ");
27512
- const newLinkText = newState.doc.textBetween(newMark.from, newMark.to, void 0, " ");
27513
- const wasLink = test(oldLinkText);
27514
- const isLink = test(newLinkText);
27515
- if (wasLink && !isLink) {
27516
- tr.removeMark(newMark.from, newMark.to, options.type);
27386
+ };
27387
+ doc2.nodesBetween($from.pos, $to.pos, (node, position) => {
27388
+ if (node.type.name === NodeTypes.LIST)
27389
+ return;
27390
+ const initialMark = findMarkByType(node.marks, name);
27391
+ const applyingMark = markType.create({ ...(initialMark == null ? void 0 : initialMark.attrs) || {}, ...value });
27392
+ const textPosition = resolveTextPosition($from, $to, node, position);
27393
+ if (isMarkAppliedToParent(tr.doc, position, applyingMark, customizer.isAppliedToParent)) {
27394
+ return onAppliedToParent({ tr, node, position, mark: applyingMark });
27395
+ }
27396
+ if (node.isText) {
27397
+ tr.addMark(textPosition.from, textPosition.to, applyingMark);
27398
+ return;
27399
+ }
27400
+ if (isNodeFullySelected(tr.doc, tr.selection, node, position)) {
27401
+ tr.step(new AddNodeMarkStep(position, applyingMark));
27402
+ }
27403
+ });
27404
+ }),
27405
+ getMarks: createCommand(({ editor }, name) => {
27406
+ const stateRef = toRef(editor, "state");
27407
+ return computed(() => {
27408
+ const { selection, doc: doc2 } = unref(stateRef);
27409
+ const { from: from2, to } = unref(selection);
27410
+ const marks = [];
27411
+ doc2.nodesBetween(from2, to, (node) => {
27412
+ for (const mark of node.marks) {
27413
+ if (mark.type.name === name)
27414
+ marks.unshift(mark.attrs);
27415
+ }
27416
+ });
27417
+ return marks;
27418
+ });
27419
+ }),
27420
+ getMark: createCommand(({ commands: commands2 }, name) => {
27421
+ const marksRef = commands2.getMarks(name);
27422
+ return computed(() => {
27423
+ var _a;
27424
+ return (_a = unref(marksRef)[0]) != null ? _a : null;
27425
+ });
27426
+ }),
27427
+ hasMark: createCommand(({ commands: commands2 }, name) => {
27428
+ const mark = commands2.getMark(name);
27429
+ return computed(() => !!unref(mark));
27430
+ }),
27431
+ getCommonSettingMark: createCommand(({ commands: commands2 }, name, defaultRef) => {
27432
+ const selectionRef = commands2.getMark(name);
27433
+ return computed(() => {
27434
+ var _a, _b;
27435
+ return (_b = (_a = unref(selectionRef)) == null ? void 0 : _a.value) != null ? _b : unref(defaultRef);
27436
+ });
27437
+ }),
27438
+ getDeviceSettingMark: createCommand(({ commands: commands2 }, name, defaultRef) => {
27439
+ const selectionRef = commands2.getMarks(name);
27440
+ const deviceRef = commands2.getDevice();
27441
+ return computed(() => {
27442
+ for (const attrs of unref(selectionRef)) {
27443
+ const value = attrs[unref(deviceRef)];
27444
+ if (value)
27445
+ return value;
27446
+ }
27447
+ return unref(defaultRef);
27448
+ });
27449
+ }),
27450
+ removeAllMarks: createCommand(({ state, commands: commands2 }) => {
27451
+ const { tr, doc: doc2 } = state;
27452
+ const { from: from2, to } = tr.selection;
27453
+ doc2.nodesBetween(from2, to, (node, position) => {
27454
+ for (const mark of node.marks) {
27455
+ commands2._removeNodeMark({ tr, node, position, mark });
27517
27456
  }
27518
27457
  });
27519
- findChildrenInRange(newState.doc, newRange, (node) => node.isTextblock).forEach((textBlock) => {
27520
- const text2 = newState.doc.textBetween(textBlock.pos, textBlock.pos + textBlock.node.nodeSize, void 0, " ");
27521
- find(text2).filter((link) => link.isLink).filter((link) => {
27522
- if (options.validate) {
27523
- return options.validate(link.value);
27524
- }
27525
- return true;
27526
- }).map((link) => ({
27527
- ...link,
27528
- from: textBlock.pos + link.start + 1,
27529
- to: textBlock.pos + link.end + 1
27530
- })).filter((link) => {
27531
- const fromIsInRange = newRange.from >= link.from && newRange.from <= link.to;
27532
- const toIsInRange = newRange.to >= link.from && newRange.to <= link.to;
27533
- return fromIsInRange || toIsInRange;
27534
- }).forEach((link) => {
27535
- tr.addMark(link.from, link.to, options.type.create({
27536
- href: link.href
27537
- }));
27538
- });
27458
+ }),
27459
+ removeMarks: createCommand(({ state, commands: commands2 }, marks) => {
27460
+ const { tr, doc: doc2 } = state;
27461
+ const { from: from2, to } = tr.selection;
27462
+ doc2.nodesBetween(from2, to, (node, position) => {
27463
+ const removingMarks = node.marks.filter((mark) => marks.includes(mark.type.name));
27464
+ for (const mark of removingMarks) {
27465
+ commands2._removeNodeMark({ tr, node, position, mark });
27466
+ }
27539
27467
  });
27540
- });
27541
- if (!tr.steps.length) {
27542
- return;
27543
- }
27544
- return tr;
27545
- }
27546
- });
27547
- }
27548
- function clickHandler(options) {
27549
- return new Plugin({
27550
- key: new PluginKey("handleClickLink"),
27551
- props: {
27552
- handleClick: (view, pos, event) => {
27553
- var _a;
27554
- const attrs = getAttributes(view.state, options.type.name);
27555
- const link = (_a = event.target) === null || _a === void 0 ? void 0 : _a.closest("a");
27556
- if (link && attrs.href) {
27557
- window.open(attrs.href, attrs.target);
27558
- return true;
27559
- }
27560
- return false;
27561
- }
27562
- }
27563
- });
27564
- }
27565
- function pasteHandler(options) {
27566
- return new Plugin({
27567
- key: new PluginKey("handlePasteLink"),
27568
- props: {
27569
- handlePaste: (view, event, slice2) => {
27570
- const { state } = view;
27571
- const { selection } = state;
27572
- const { empty: empty2 } = selection;
27573
- if (empty2) {
27574
- return false;
27575
- }
27576
- let textContent = "";
27577
- slice2.content.forEach((node) => {
27578
- textContent += node.textContent;
27468
+ }),
27469
+ _removeNodeMark: createCommand((context, { tr, node, position, mark }) => {
27470
+ return node.isText ? tr.removeMark(position, position + node.nodeSize, mark) : tr.step(new RemoveNodeMarkStep(position, mark));
27471
+ })
27472
+ };
27473
+ }
27474
+ });
27475
+ const TextProcessor = Extension.create({
27476
+ name: "text_processor",
27477
+ addCommands() {
27478
+ return {
27479
+ getSelectedText: createCommand(({ state }) => {
27480
+ const { from: from2, to } = state.selection;
27481
+ return state.doc.textBetween(from2, to, " ");
27482
+ }),
27483
+ transformText: createCommand(({ state }, transform) => {
27484
+ const { $from, $to } = state.tr.selection;
27485
+ if ($from.pos === $to.pos)
27486
+ return;
27487
+ state.doc.nodesBetween($from.pos, $to.pos, (node, position) => {
27488
+ if (!node.isText)
27489
+ return;
27490
+ const textPosition = resolveTextPosition($from, $to, node, position);
27491
+ const substringFrom = Math.max(0, $from.pos - position);
27492
+ const substringTo = Math.max(0, $to.pos - position);
27493
+ const updatedText = transform({
27494
+ text: node.textContent.substring(substringFrom, substringTo)
27495
+ });
27496
+ const updatedNode = state.schema.text(updatedText, node.marks);
27497
+ state.tr.replaceWith(textPosition.from, textPosition.to, updatedNode);
27579
27498
  });
27580
- const link = find(textContent).find((item) => item.isLink && item.value === textContent);
27581
- if (!textContent || !link) {
27582
- return false;
27583
- }
27584
- options.editor.commands.setMark(options.type, {
27585
- href: link.href
27499
+ })
27500
+ };
27501
+ }
27502
+ });
27503
+ const SelectionProcessor = Extension.create({
27504
+ name: "selection_processor",
27505
+ addStorage: () => ({
27506
+ selection: null
27507
+ }),
27508
+ addCommands() {
27509
+ return {
27510
+ storeSelection: createCommand(({ state }) => {
27511
+ this.storage.selection = state.selection;
27512
+ }),
27513
+ restoreSelection: createCommand(({ commands: commands2 }) => {
27514
+ this.storage.selection && commands2.setTextSelection(this.storage.selection);
27515
+ }),
27516
+ expandSelection: createCommand(({ tr, commands: commands2 }, predicate) => {
27517
+ let from2 = tr.selection.from;
27518
+ let to = tr.selection.to;
27519
+ tr.doc.nodesBetween(from2, to, (node, position, parent) => {
27520
+ if (predicate({ node, parent })) {
27521
+ const offset2 = node.isText ? 0 : resolvePositionOffset(tr.doc, position);
27522
+ from2 = Math.min(from2, position + offset2);
27523
+ to = Math.max(to, position + node.nodeSize - offset2);
27524
+ }
27586
27525
  });
27587
- return true;
27588
- }
27589
- }
27590
- });
27591
- }
27592
- const Link$1 = Mark.create({
27593
- name: "link",
27526
+ commands2.setTextSelection({ from: from2, to });
27527
+ }),
27528
+ expandSelectionToBlock: createCommand(({ commands: commands2 }) => {
27529
+ commands2.expandSelection(({ parent }) => parent.type.name === NodeTypes.DOCUMENT);
27530
+ })
27531
+ };
27532
+ }
27533
+ });
27534
+ const Document$1 = Node.create({
27535
+ name: "doc",
27536
+ topNode: true,
27537
+ content: "block+"
27538
+ });
27539
+ const Document = Document$1.extend({
27540
+ marks: MarkGroups.SETTINGS
27541
+ });
27542
+ const Paragraph$1 = Node.create({
27543
+ name: "paragraph",
27594
27544
  priority: 1e3,
27595
- keepOnSplit: false,
27596
- onCreate() {
27597
- this.options.protocols.forEach(registerCustomProtocol);
27598
- },
27599
- inclusive() {
27600
- return this.options.autolink;
27601
- },
27602
27545
  addOptions() {
27603
27546
  return {
27604
- openOnClick: true,
27605
- linkOnPaste: true,
27606
- autolink: true,
27607
- protocols: [],
27608
- HTMLAttributes: {
27609
- target: "_blank",
27610
- rel: "noopener noreferrer nofollow",
27611
- class: null
27612
- },
27613
- validate: void 0
27614
- };
27615
- },
27616
- addAttributes() {
27617
- return {
27618
- href: {
27619
- default: null
27620
- },
27621
- target: {
27622
- default: this.options.HTMLAttributes.target
27623
- },
27624
- class: {
27625
- default: this.options.HTMLAttributes.class
27626
- }
27547
+ HTMLAttributes: {}
27627
27548
  };
27628
27549
  },
27550
+ group: "block",
27551
+ content: "inline*",
27629
27552
  parseHTML() {
27630
27553
  return [
27631
- { tag: 'a[href]:not([href *= "javascript:" i])' }
27554
+ { tag: "p" }
27632
27555
  ];
27633
27556
  },
27634
27557
  renderHTML({ HTMLAttributes }) {
27635
- return [
27636
- "a",
27637
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),
27638
- 0
27639
- ];
27558
+ return ["p", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];
27640
27559
  },
27641
27560
  addCommands() {
27642
27561
  return {
27643
- setLink: (attributes) => ({ chain }) => {
27644
- return chain().setMark(this.name, attributes).setMeta("preventAutolink", true).run();
27645
- },
27646
- toggleLink: (attributes) => ({ chain }) => {
27647
- return chain().toggleMark(this.name, attributes, { extendEmptyMarkRange: true }).setMeta("preventAutolink", true).run();
27648
- },
27649
- unsetLink: () => ({ chain }) => {
27650
- return chain().unsetMark(this.name, { extendEmptyMarkRange: true }).setMeta("preventAutolink", true).run();
27562
+ setParagraph: () => ({ commands: commands2 }) => {
27563
+ return commands2.setNode(this.name);
27651
27564
  }
27652
27565
  };
27653
27566
  },
27654
- addPasteRules() {
27655
- return [
27656
- markPasteRule({
27657
- find: (text2) => find(text2).filter((link) => {
27658
- if (this.options.validate) {
27659
- return this.options.validate(link.value);
27660
- }
27661
- return true;
27662
- }).filter((link) => link.isLink).map((link) => ({
27663
- text: link.value,
27664
- index: link.start,
27665
- data: link
27666
- })),
27667
- type: this.type,
27668
- getAttributes: (match2) => {
27669
- var _a;
27670
- return {
27671
- href: (_a = match2.data) === null || _a === void 0 ? void 0 : _a.href
27672
- };
27673
- }
27674
- })
27675
- ];
27676
- },
27677
- addProseMirrorPlugins() {
27678
- const plugins = [];
27679
- if (this.options.autolink) {
27680
- plugins.push(autolink({
27681
- type: this.type,
27682
- validate: this.options.validate
27683
- }));
27684
- }
27685
- if (this.options.openOnClick) {
27686
- plugins.push(clickHandler({
27687
- type: this.type
27688
- }));
27689
- }
27690
- if (this.options.linkOnPaste) {
27691
- plugins.push(pasteHandler({
27692
- editor: this.editor,
27693
- type: this.type
27694
- }));
27695
- }
27696
- return plugins;
27567
+ addKeyboardShortcuts() {
27568
+ return {
27569
+ "Mod-Alt-0": () => this.editor.commands.setParagraph()
27570
+ };
27697
27571
  }
27698
27572
  });
27699
- const Link = Link$1.extend({
27700
- name: TextSettings.LINK,
27573
+ const Paragraph = Paragraph$1.extend({
27574
+ marks: MarkGroups.ALL,
27575
+ addOptions: () => ({
27576
+ HTMLAttributes: { class: "zw-style" }
27577
+ })
27578
+ });
27579
+ const Heading$1 = Node.create({
27580
+ name: "heading",
27701
27581
  addOptions() {
27702
- var _a;
27703
27582
  return {
27704
- ...(_a = this.parent) == null ? void 0 : _a.call(this),
27705
- openOnClick: false
27583
+ levels: [1, 2, 3, 4, 5, 6],
27584
+ HTMLAttributes: {}
27706
27585
  };
27707
27586
  },
27587
+ content: "inline*",
27588
+ group: "block",
27589
+ defining: true,
27708
27590
  addAttributes() {
27709
27591
  return {
27710
- href: {
27711
- default: null,
27712
- parseHTML: (element) => {
27713
- const href = element.getAttribute("href");
27714
- if (!href.startsWith("#"))
27715
- return href;
27716
- return parseFloat(element.getAttribute("href").replace("#", ""));
27717
- }
27718
- },
27719
- target: {
27720
- default: LinkTargets.SELF,
27721
- parseHTML: (element) => element.getAttribute("target") || LinkTargets.SELF
27722
- },
27723
- destination: {
27724
- default: LinkDestinations.URL,
27725
- parseHTML: (element) => {
27726
- const href = element.getAttribute("href");
27727
- if (!href.startsWith("#"))
27728
- return LinkDestinations.URL;
27729
- const id2 = href.replace("#", "");
27730
- const blocks = unref(this.options.pageBlocks);
27731
- const block = blocks.find((block2) => block2.id === parseInt(id2));
27732
- return block ? LinkDestinations.BLOCK : LinkDestinations.URL;
27733
- }
27592
+ level: {
27593
+ default: 1,
27594
+ rendered: false
27734
27595
  }
27735
27596
  };
27736
27597
  },
27598
+ parseHTML() {
27599
+ return this.options.levels.map((level) => ({
27600
+ tag: `h${level}`,
27601
+ attrs: { level }
27602
+ }));
27603
+ },
27604
+ renderHTML({ node, HTMLAttributes }) {
27605
+ const hasLevel = this.options.levels.includes(node.attrs.level);
27606
+ const level = hasLevel ? node.attrs.level : this.options.levels[0];
27607
+ return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];
27608
+ },
27737
27609
  addCommands() {
27738
- var _a;
27739
27610
  return {
27740
- ...(_a = this.parent) == null ? void 0 : _a.call(this),
27741
- applyLink: createCommand(({ commands: commands2, chain }, attributes) => {
27742
- if (!commands2.getSelectedText()) {
27743
- return commands2.insertContent(NodeFactory.text(attributes.text, [
27744
- NodeFactory.mark(TextSettings.LINK, attributes)
27745
- ]));
27611
+ setHeading: (attributes) => ({ commands: commands2 }) => {
27612
+ if (!this.options.levels.includes(attributes.level)) {
27613
+ return false;
27746
27614
  }
27747
- return chain().applyMark(this.name, attributes).expandSelectionToLink().command(({ tr }) => {
27748
- tr.insertText(attributes.text, tr.selection.from, tr.selection.to);
27749
- return true;
27750
- }).run();
27751
- }),
27752
- expandSelectionToLink: createCommand(({ commands: commands2 }) => {
27753
- commands2.expandSelection(({ node }) => this.type.isInSet(node.marks));
27754
- }),
27755
- isLink: createCommand(({ commands: commands2 }) => commands2.hasMark(this.name)),
27756
- getLinkPreset: createCommand(() => computed(() => this.options.preset))
27615
+ return commands2.setNode(this.name, attributes);
27616
+ },
27617
+ toggleHeading: (attributes) => ({ commands: commands2 }) => {
27618
+ if (!this.options.levels.includes(attributes.level)) {
27619
+ return false;
27620
+ }
27621
+ return commands2.toggleNode(this.name, "paragraph", attributes);
27622
+ }
27757
27623
  };
27758
27624
  },
27759
- renderHTML({ HTMLAttributes: attrs }) {
27760
- const href = attrs.destination === LinkDestinations.BLOCK ? `#${attrs.href}` : attrs.href;
27761
- const presetClass = unref(this.options.basePresetClass) + unref(this.options.preset).id;
27762
- const classes = `${presetClass} zw-style`;
27763
- const linkAttrs = { href, target: attrs.target, class: classes };
27764
- return ["a", linkAttrs, 0];
27625
+ addKeyboardShortcuts() {
27626
+ return this.options.levels.reduce((items, level) => ({
27627
+ ...items,
27628
+ ...{
27629
+ [`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level })
27630
+ }
27631
+ }), {});
27632
+ },
27633
+ addInputRules() {
27634
+ return this.options.levels.map((level) => {
27635
+ return textblockTypeInputRule({
27636
+ find: new RegExp(`^(#{1,${level}})\\s$`),
27637
+ type: this.type,
27638
+ getAttributes: {
27639
+ level
27640
+ }
27641
+ });
27642
+ });
27765
27643
  }
27766
27644
  });
27767
- const Superscript = Mark.create({
27768
- name: TextSettings.SUPERSCRIPT,
27769
- addCommands() {
27645
+ const Heading = Heading$1.extend({
27646
+ marks: MarkGroups.ALL,
27647
+ addOptions: () => ({
27648
+ levels: [1, 2, 3, 4],
27649
+ HTMLAttributes: { class: "zw-style" }
27650
+ })
27651
+ });
27652
+ class ProseMirrorPlugin {
27653
+ static create(editor, options) {
27654
+ const plugin = new this(editor, options || {});
27655
+ return new Plugin({
27656
+ key: new PluginKey(this.name),
27657
+ props: plugin.buildProps()
27658
+ });
27659
+ }
27660
+ constructor(editor, options) {
27661
+ this.options = options;
27662
+ this.editor = editor;
27663
+ }
27664
+ buildProps() {
27665
+ return {};
27666
+ }
27667
+ }
27668
+ class PastePlugin extends ProseMirrorPlugin {
27669
+ buildProps() {
27770
27670
  return {
27771
- applySuperscript: createCommand(({ commands: commands2 }) => {
27772
- commands2.setMark(this.name);
27773
- }),
27774
- removeSuperscript: createCommand(({ commands: commands2 }) => {
27775
- commands2.unsetMark(this.name);
27776
- }),
27777
- toggleSuperscript: createCommand(({ commands: commands2 }) => {
27778
- const isActive2 = unref(commands2.isSuperscript());
27779
- isActive2 ? commands2.removeSuperscript() : commands2.applySuperscript();
27780
- }),
27781
- isSuperscript: createCommand(({ commands: commands2 }) => {
27782
- const selectionRef = commands2.getMark(this.name);
27783
- return computed(() => !!unref(selectionRef));
27784
- })
27671
+ transformPastedHTML: this._transformPastedHTML.bind(this),
27672
+ handlePaste: this._handlePaste.bind(this)
27785
27673
  };
27786
- },
27787
- parseHTML() {
27674
+ }
27675
+ _transformPastedHTML(html2) {
27676
+ if (html2.includes("data-pm-slice") && html2.includes("zw-style")) {
27677
+ return html2;
27678
+ }
27679
+ const normalizer = ContentNormalizer.build(html2);
27680
+ normalizer.normalizeHTML();
27681
+ this._removeDeprecatedStyles(normalizer);
27682
+ return normalizer.normalizedHTML;
27683
+ }
27684
+ _removeDeprecatedStyles(normalizer) {
27685
+ const elements = normalizer.dom.querySelectorAll('[style*="margin"]');
27686
+ for (const element of Array.from(elements)) {
27687
+ element.style.removeProperty("margin");
27688
+ element.style.removeProperty("margin-top");
27689
+ element.style.removeProperty("margin-right");
27690
+ element.style.removeProperty("margin-bottom");
27691
+ element.style.removeProperty("margin-left");
27692
+ }
27693
+ }
27694
+ _handlePaste(view, _, slice2) {
27695
+ const transaction = this._insertPastedContent(view, slice2).scrollIntoView().setMeta("paste", true).setMeta("uiEvent", "paste");
27696
+ view.dispatch(transaction);
27697
+ return true;
27698
+ }
27699
+ _insertPastedContent({ state, input }, slice2) {
27700
+ if (!this._isFullBlockSelected(state)) {
27701
+ return state.tr.replaceSelection(slice2);
27702
+ }
27703
+ return state.tr.replaceSelectionWith(slice2.content, input.shiftKey);
27704
+ }
27705
+ _isFullBlockSelected(state) {
27706
+ const blocksSelection = this._expandSelectionToBlocks(state);
27707
+ const isFromMatch = this._isMatchPosition(blocksSelection.from, state.selection.from);
27708
+ const isToMatch = this._isMatchPosition(blocksSelection.to, state.selection.to);
27709
+ return isFromMatch && isToMatch;
27710
+ }
27711
+ _expandSelectionToBlocks({ selection, doc: doc2 }) {
27712
+ let from2 = selection.from;
27713
+ let to = selection.to;
27714
+ doc2.nodesBetween(from2, to, (node, position, parent) => {
27715
+ if (parent.type.name !== NodeTypes.DOCUMENT)
27716
+ return;
27717
+ from2 = Math.min(from2, position + 1);
27718
+ to = Math.max(to, position + node.nodeSize - 1);
27719
+ });
27720
+ return { from: from2, to };
27721
+ }
27722
+ _isMatchPosition(position1, position2) {
27723
+ return Math.abs(position1 - position2) < 5;
27724
+ }
27725
+ }
27726
+ class PlaceholderPlugin extends ProseMirrorPlugin {
27727
+ constructor() {
27728
+ super(...arguments);
27729
+ __privateAdd(this, _buildDecorations);
27730
+ }
27731
+ buildProps() {
27732
+ return { decorations: __privateMethod(this, _buildDecorations, buildDecorations_fn).bind(this) };
27733
+ }
27734
+ }
27735
+ _buildDecorations = new WeakSet();
27736
+ buildDecorations_fn = function({ doc: doc2 }) {
27737
+ const decorations = [];
27738
+ if (!this.editor.isEditable)
27739
+ return null;
27740
+ if (doc2.childCount > 1)
27741
+ return;
27742
+ doc2.descendants((node, pos) => {
27743
+ if (!node.childCount) {
27744
+ const decoration = Decoration.node(pos, pos + node.nodeSize, {
27745
+ class: "zw-wysiwyg__placeholder",
27746
+ "data-placeholder": "Type your text here..."
27747
+ });
27748
+ decorations.push(decoration);
27749
+ }
27750
+ return false;
27751
+ });
27752
+ return DecorationSet.create(doc2, decorations);
27753
+ };
27754
+ const ProseMirrorPlugins = Extension.create({
27755
+ name: "prose_mirror_plugins",
27756
+ addProseMirrorPlugins() {
27788
27757
  return [
27789
- { tag: "sup" },
27790
- {
27791
- style: "vertical-align",
27792
- getAttrs: (value) => value !== "super" ? false : null
27793
- }
27758
+ PastePlugin.create(this.editor),
27759
+ PlaceholderPlugin.create(this.editor)
27794
27760
  ];
27795
- },
27796
- renderHTML() {
27797
- return ["sup", { class: "zw-superscript" }, 0];
27798
27761
  }
27799
27762
  });
27763
+ const buildCoreExtensions = () => [
27764
+ Document,
27765
+ Paragraph,
27766
+ Heading,
27767
+ Text,
27768
+ History,
27769
+ NodeProcessor,
27770
+ TextProcessor,
27771
+ SelectionProcessor,
27772
+ ProseMirrorPlugins
27773
+ ];
27800
27774
  const Margin = Extension.create({
27801
27775
  name: TextSettings.MARGIN,
27802
27776
  addGlobalAttributes: () => [