vue-editify 0.1.27 → 0.1.30
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/core/function.d.ts +265 -0
- package/lib/core/rule.d.ts +32 -0
- package/lib/core/tool.d.ts +50 -1
- package/lib/editify.es.js +140 -66
- package/lib/editify.umd.js +1 -1
- package/lib/hljs/index.d.ts +9 -0
- package/lib/index.d.ts +1 -1
- package/lib/locale/index.d.ts +5 -0
- package/lib/plugins/attachment/index.d.ts +19 -0
- package/lib/style.css +1 -1
- package/package.json +2 -2
- package/src/components/menu/menu.vue +51 -11
- package/src/core/function.ts +265 -42
- package/src/core/rule.ts +49 -7
- package/src/core/tool.ts +51 -9
- package/src/editify/editify.less +2 -1
- package/src/editify/editify.vue +3 -11
- package/src/hljs/index.ts +9 -2
- package/src/index.ts +1 -1
- package/src/locale/index.ts +5 -2
- package/src/plugins/attachment/index.ts +101 -57
- package/vite.config.ts.timestamp-1714200628309-967ea10c27215.mjs +0 -48
package/lib/editify.es.js
CHANGED
@@ -2622,7 +2622,23 @@ const mergeWithParentElement = function(element2) {
|
|
2622
2622
|
};
|
2623
2623
|
const mergeWithSpaceTextElement = function(element2) {
|
2624
2624
|
if (element2.isText()) {
|
2625
|
-
|
2625
|
+
let val = element2.textContent;
|
2626
|
+
let i = 0;
|
2627
|
+
while (i < val.length) {
|
2628
|
+
const chart = val.charAt(i);
|
2629
|
+
if (isSpaceText(chart) && i > 0 && isSpaceText(val.charAt(i - 1))) {
|
2630
|
+
if (this.range && this.range.anchor.element.isEqual(element2) && this.range.anchor.offset >= i + 1) {
|
2631
|
+
this.range.anchor.offset -= 1;
|
2632
|
+
}
|
2633
|
+
if (this.range && this.range.focus.element.isEqual(element2) && this.range.focus.offset >= i + 1) {
|
2634
|
+
this.range.focus.offset -= 1;
|
2635
|
+
}
|
2636
|
+
val = string$1.delete(val, i, 1);
|
2637
|
+
} else {
|
2638
|
+
i++;
|
2639
|
+
}
|
2640
|
+
}
|
2641
|
+
element2.textContent = val;
|
2626
2642
|
}
|
2627
2643
|
};
|
2628
2644
|
const { Mac } = platform.os();
|
@@ -4496,7 +4512,7 @@ class AlexEditor {
|
|
4496
4512
|
event$1.off(this.$el, "beforeinput.alex_editor compositionstart.alex_editor compositionupdate.alex_editor compositionend.alex_editor keydown.alex_editor cut.alex_editor paste.alex_editor copy.alex_editor dragstart.alex_editor drop.alex_editor focus.alex_editor blur.alex_editor");
|
4497
4513
|
}
|
4498
4514
|
}
|
4499
|
-
const version$2 = "1.3.
|
4515
|
+
const version$2 = "1.3.33";
|
4500
4516
|
console.log(`%c alex-editor %c v${version$2} `, "padding: 2px 1px; border-radius: 3px 0 0 3px; color: #fff; background: #606060; font-weight: bold;", "padding: 2px 1px; border-radius: 0 3px 3px 0; color: #fff; background: #42c02e; font-weight: bold;");
|
4501
4517
|
const number = {
|
4502
4518
|
/**
|
@@ -19874,6 +19890,14 @@ const preHandle = function(editor, element2, highlight2, languages2) {
|
|
19874
19890
|
newEl.parent = element2;
|
19875
19891
|
});
|
19876
19892
|
updateRangeInPre(editor, element2, originalTextElements, newElements);
|
19893
|
+
} else {
|
19894
|
+
const breakElement = new AlexElement("closed", "br", null, null, null);
|
19895
|
+
element2.children = [breakElement];
|
19896
|
+
breakElement.parent = element2;
|
19897
|
+
if (editor.range) {
|
19898
|
+
editor.range.anchor.moveToStart(breakElement);
|
19899
|
+
editor.range.focus.moveToStart(breakElement);
|
19900
|
+
}
|
19877
19901
|
}
|
19878
19902
|
}
|
19879
19903
|
}
|
@@ -23379,6 +23403,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
23379
23403
|
props: MenuProps,
|
23380
23404
|
setup(__props, { expose: __expose }) {
|
23381
23405
|
const props = __props;
|
23406
|
+
const $editTrans = inject("$editTrans");
|
23382
23407
|
const editify = inject("editify");
|
23383
23408
|
const isSourceView = inject("isSourceView");
|
23384
23409
|
const isFullScreen = inject("isFullScreen");
|
@@ -23386,7 +23411,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
23386
23411
|
const editor = inject("editor");
|
23387
23412
|
const dataRangeCaches = inject("dataRangeCaches");
|
23388
23413
|
const showBorder = inject("showBorder");
|
23389
|
-
const
|
23414
|
+
const pluginResultList = inject("pluginResultList");
|
23390
23415
|
const undoConfig = ref({
|
23391
23416
|
show: props.config.undo.show,
|
23392
23417
|
leftBorder: props.config.undo.leftBorder,
|
@@ -23659,8 +23684,15 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
23659
23684
|
return editify.props.disabled || !canUseMenu.value;
|
23660
23685
|
});
|
23661
23686
|
const menuNames = computed(() => {
|
23662
|
-
|
23663
|
-
|
23687
|
+
let pluginSequence = {};
|
23688
|
+
pluginResultList.value.forEach((pluginResult) => {
|
23689
|
+
if (pluginResult.menu) {
|
23690
|
+
pluginSequence[pluginResult.name] = pluginResult.menu.sequence;
|
23691
|
+
}
|
23692
|
+
});
|
23693
|
+
pluginSequence = mergeObject(pluginSequence, props.config.sequence);
|
23694
|
+
return Object.keys(pluginSequence).sort((a, b) => {
|
23695
|
+
if (pluginSequence[a] > pluginSequence[b]) {
|
23664
23696
|
return 1;
|
23665
23697
|
}
|
23666
23698
|
return -1;
|
@@ -23688,6 +23720,15 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
23688
23720
|
}
|
23689
23721
|
return showBorder.value;
|
23690
23722
|
});
|
23723
|
+
const menuExtends = computed(() => {
|
23724
|
+
let pluginExtends = {};
|
23725
|
+
pluginResultList.value.forEach((pluginResult) => {
|
23726
|
+
if (pluginResult.menu) {
|
23727
|
+
pluginExtends[pluginResult.name] = pluginResult.menu.extend;
|
23728
|
+
}
|
23729
|
+
});
|
23730
|
+
return mergeObject(pluginExtends, props.config.extends);
|
23731
|
+
});
|
23691
23732
|
const handleOperate = (name, val) => {
|
23692
23733
|
if (disabled.value) {
|
23693
23734
|
return;
|
@@ -23909,11 +23950,24 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
23909
23950
|
const value_isRangeInOrderList = isRangeInList(editor.value, dataRangeCaches.value, true);
|
23910
23951
|
const value_isRangeInUnorderList = isRangeInList(editor.value, dataRangeCaches.value, false);
|
23911
23952
|
const value_isRangeInTask = isRangeInTask(editor.value, dataRangeCaches.value);
|
23953
|
+
const value_hasImageInRange = hasImageInRange(editor.value, dataRangeCaches.value);
|
23954
|
+
const value_hasVideoInRange = hasVideoInRange(editor.value, dataRangeCaches.value);
|
23912
23955
|
const extraDisabled = (name) => {
|
23956
|
+
let pluginDisabled = false;
|
23957
|
+
let length = pluginResultList.value.length;
|
23958
|
+
for (let i = 0; i < length; i++) {
|
23959
|
+
const pluginResult = pluginResultList.value[i];
|
23960
|
+
if (pluginResult.menu && typeof pluginResult.menu.extraDisabled == "function") {
|
23961
|
+
pluginDisabled = pluginResult.menu.extraDisabled(name);
|
23962
|
+
if (pluginDisabled) {
|
23963
|
+
break;
|
23964
|
+
}
|
23965
|
+
}
|
23966
|
+
}
|
23913
23967
|
if (typeof props.config.extraDisabled == "function") {
|
23914
|
-
return props.config.extraDisabled(name) || false;
|
23968
|
+
return props.config.extraDisabled(name) || pluginDisabled || false;
|
23915
23969
|
}
|
23916
|
-
return false;
|
23970
|
+
return pluginDisabled || false;
|
23917
23971
|
};
|
23918
23972
|
undoConfig.value.disabled = !editor.value.history.get(-1) || extraDisabled("undo");
|
23919
23973
|
redoConfig.value.disabled = !editor.value.history.get(1) || extraDisabled("redo");
|
@@ -24019,7 +24073,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
24019
24073
|
videoConfig.value.disabled = value_hasPreInRange || extraDisabled("video");
|
24020
24074
|
tableConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || value_hasQuoteInRange || extraDisabled("table");
|
24021
24075
|
codeBlockConfig.value.active = !!getCurrentParsedomElement(editor.value, dataRangeCaches.value, "pre");
|
24022
|
-
codeBlockConfig.value.disabled = value_hasTableInRange || value_hasQuoteInRange || extraDisabled("codeBlock");
|
24076
|
+
codeBlockConfig.value.disabled = value_hasTableInRange || value_hasQuoteInRange || value_hasImageInRange || value_hasVideoInRange || extraDisabled("codeBlock");
|
24023
24077
|
sourceViewConfig.value.active = isSourceView.value;
|
24024
24078
|
fullScreenConfig.value.active = isFullScreen.value;
|
24025
24079
|
};
|
@@ -24614,8 +24668,8 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
24614
24668
|
() => h(Icon, { value: "full-screen" })
|
24615
24669
|
);
|
24616
24670
|
}
|
24617
|
-
if (common.isObject(
|
24618
|
-
const configuration =
|
24671
|
+
if (common.isObject(menuExtends.value)) {
|
24672
|
+
const configuration = menuExtends.value[itemProps.name];
|
24619
24673
|
if (configuration) {
|
24620
24674
|
return h(
|
24621
24675
|
Button,
|
@@ -24714,7 +24768,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
24714
24768
|
};
|
24715
24769
|
}
|
24716
24770
|
});
|
24717
|
-
const Menu = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-
|
24771
|
+
const Menu = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-fbf50ae5"]]);
|
24718
24772
|
const EditifyProps = {
|
24719
24773
|
//国际化语言类型
|
24720
24774
|
locale: {
|
@@ -25068,7 +25122,6 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25068
25122
|
const props = __props;
|
25069
25123
|
const emits = __emit;
|
25070
25124
|
const $editTrans = trans(props.locale || "zh_CN");
|
25071
|
-
provide("$editTrans", $editTrans);
|
25072
25125
|
const isModelChange = ref(false);
|
25073
25126
|
const isInputChinese = ref(false);
|
25074
25127
|
const rangeUpdateTimer = ref(null);
|
@@ -25137,12 +25190,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25137
25190
|
return pluginResultList2;
|
25138
25191
|
});
|
25139
25192
|
const menuConfig = computed(() => {
|
25140
|
-
|
25141
|
-
pluginResultList.value.forEach((pluginResult) => {
|
25142
|
-
menu = mergeObject(menu, pluginResult.menu || {});
|
25143
|
-
});
|
25144
|
-
menu = mergeObject(menu, props.menu || {});
|
25145
|
-
return mergeObject(getMenuConfig($editTrans, props.locale), menu);
|
25193
|
+
return mergeObject(getMenuConfig($editTrans, props.locale), props.menu || {});
|
25146
25194
|
});
|
25147
25195
|
const internalModify = (val) => {
|
25148
25196
|
isModelChange.value = true;
|
@@ -25732,6 +25780,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25732
25780
|
event.off(window, `resize.editify_${instance.uid}`);
|
25733
25781
|
editor.value.destroy();
|
25734
25782
|
});
|
25783
|
+
provide("$editTrans", $editTrans);
|
25735
25784
|
provide("editify", instance);
|
25736
25785
|
provide("isSourceView", isSourceView);
|
25737
25786
|
provide("isFullScreen", isFullScreen);
|
@@ -25739,6 +25788,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25739
25788
|
provide("editor", editor);
|
25740
25789
|
provide("dataRangeCaches", dataRangeCaches);
|
25741
25790
|
provide("showBorder", showBorder);
|
25791
|
+
provide("pluginResultList", pluginResultList);
|
25742
25792
|
__expose({
|
25743
25793
|
editor,
|
25744
25794
|
isSourceView,
|
@@ -25808,7 +25858,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
25808
25858
|
};
|
25809
25859
|
}
|
25810
25860
|
});
|
25811
|
-
const Editify = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-
|
25861
|
+
const Editify = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-306d3e9a"]]);
|
25812
25862
|
const InsertAttachmentProps = {
|
25813
25863
|
//主题色
|
25814
25864
|
color: {
|
@@ -26053,62 +26103,86 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
26053
26103
|
}
|
26054
26104
|
});
|
26055
26105
|
const InsertAttachment = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f995f4bd"]]);
|
26106
|
+
const isAttachment = (element2) => {
|
26107
|
+
if (element2.isEmpty()) {
|
26108
|
+
return false;
|
26109
|
+
}
|
26110
|
+
return element2.parsedom == "span" && element2.type == "closed" && element2.hasMarks() && element2.marks["data-attachment"];
|
26111
|
+
};
|
26112
|
+
const hasAttachmentInRange = (editor, dataRangeCaches) => {
|
26113
|
+
if (!editor.range) {
|
26114
|
+
return false;
|
26115
|
+
}
|
26116
|
+
if (editor.range.anchor.isEqual(editor.range.focus)) {
|
26117
|
+
return isAttachment(editor.range.anchor.element);
|
26118
|
+
}
|
26119
|
+
return dataRangeCaches.flatList.some((item) => {
|
26120
|
+
return isAttachment(item.element);
|
26121
|
+
});
|
26122
|
+
};
|
26056
26123
|
const attachment = (options) => {
|
26057
26124
|
if (!common.isObject(options)) {
|
26058
26125
|
options = {};
|
26059
26126
|
}
|
26060
26127
|
const plugin = (editifyInstance, color2, editTrans) => {
|
26128
|
+
let isDisabled = false;
|
26129
|
+
if (editifyInstance.exposed.editor.value) {
|
26130
|
+
isDisabled = hasPreInRange(editifyInstance.exposed.editor.value, editifyInstance.exposed.dataRangeCaches.value) || hasLinkInRange(editifyInstance.exposed.editor.value, editifyInstance.exposed.dataRangeCaches.value) || hasQuoteInRange(editifyInstance.exposed.editor.value, editifyInstance.exposed.dataRangeCaches.value);
|
26131
|
+
}
|
26061
26132
|
return {
|
26133
|
+
name: "attachment",
|
26062
26134
|
//附件菜单项配置
|
26063
26135
|
menu: {
|
26064
|
-
sequence:
|
26065
|
-
|
26136
|
+
sequence: options.sequence || 100,
|
26137
|
+
extraDisabled: (name) => {
|
26138
|
+
if (name == "link" || name == "quote" || name == "codeBlock") {
|
26139
|
+
return hasAttachmentInRange(editifyInstance.exposed.editor.value, editifyInstance.exposed.dataRangeCaches.value);
|
26140
|
+
}
|
26141
|
+
return false;
|
26066
26142
|
},
|
26067
|
-
|
26068
|
-
|
26069
|
-
|
26070
|
-
|
26071
|
-
|
26072
|
-
|
26073
|
-
|
26074
|
-
|
26075
|
-
|
26076
|
-
|
26077
|
-
|
26078
|
-
|
26079
|
-
|
26080
|
-
|
26081
|
-
|
26082
|
-
|
26083
|
-
|
26084
|
-
|
26085
|
-
|
26086
|
-
|
26087
|
-
|
26088
|
-
|
26089
|
-
|
26090
|
-
|
26091
|
-
|
26092
|
-
|
26093
|
-
|
26094
|
-
|
26095
|
-
|
26096
|
-
|
26097
|
-
|
26098
|
-
|
26099
|
-
|
26100
|
-
|
26101
|
-
|
26102
|
-
|
26103
|
-
|
26104
|
-
|
26105
|
-
|
26106
|
-
editor.rangeRender();
|
26107
|
-
}
|
26108
|
-
btnInstance.show = false;
|
26143
|
+
extend: {
|
26144
|
+
type: "select",
|
26145
|
+
title: options.title || editTrans("insertAttachment"),
|
26146
|
+
leftBorder: options.leftBorder,
|
26147
|
+
rightBorder: options.rightBorder,
|
26148
|
+
hideScroll: true,
|
26149
|
+
disabled: isDisabled,
|
26150
|
+
default: () => h(Icon, { value: "attachment" }),
|
26151
|
+
layer: (_name, btnInstance) => h(InsertAttachment, {
|
26152
|
+
color: color2,
|
26153
|
+
accept: options.accept,
|
26154
|
+
allowedFileType: options.allowedFileType || [],
|
26155
|
+
multiple: !!options.multiple,
|
26156
|
+
maxSize: options.maxSize,
|
26157
|
+
minSize: options.minSize,
|
26158
|
+
customUpload: options.customUpload,
|
26159
|
+
handleError: options.handleError,
|
26160
|
+
onChange: () => {
|
26161
|
+
btnInstance.$refs.layerRef.setPosition();
|
26162
|
+
},
|
26163
|
+
onInsert: (name, url) => {
|
26164
|
+
if (url) {
|
26165
|
+
const marks = {
|
26166
|
+
"data-attachment": url,
|
26167
|
+
"data-attachment-name": name || editTrans("attachmentDefaultName"),
|
26168
|
+
contenteditable: "false"
|
26169
|
+
};
|
26170
|
+
const attachmentElement = new AlexElement("closed", "span", marks, null, null);
|
26171
|
+
const editor = editifyInstance.exposed.editor.value;
|
26172
|
+
editor.insertElement(attachmentElement);
|
26173
|
+
const beforeText = AlexElement.getSpaceElement();
|
26174
|
+
const afterText = AlexElement.getSpaceElement();
|
26175
|
+
editor.addElementAfter(afterText, attachmentElement);
|
26176
|
+
editor.addElementBefore(beforeText, attachmentElement);
|
26177
|
+
editor.range.anchor.moveToStart(afterText);
|
26178
|
+
editor.range.focus.moveToStart(afterText);
|
26179
|
+
editor.formatElementStack();
|
26180
|
+
editor.domRender();
|
26181
|
+
editor.rangeRender();
|
26109
26182
|
}
|
26110
|
-
|
26111
|
-
|
26183
|
+
btnInstance.show = false;
|
26184
|
+
}
|
26185
|
+
})
|
26112
26186
|
}
|
26113
26187
|
},
|
26114
26188
|
//找到附件元素点击下载
|
@@ -26168,7 +26242,7 @@ const attachment = (options) => {
|
|
26168
26242
|
const install = (app) => {
|
26169
26243
|
app.component(Editify.name, Editify);
|
26170
26244
|
};
|
26171
|
-
const version = "0.1.
|
26245
|
+
const version = "0.1.30";
|
26172
26246
|
console.log(`%c vue-editify %c v${version} `, "padding: 2px 1px; border-radius: 3px 0 0 3px; color: #fff; background: #606060; font-weight: bold;", "padding: 2px 1px; border-radius: 0 3px 3px 0; color: #fff; background: #42c02e; font-weight: bold;");
|
26173
26247
|
export {
|
26174
26248
|
AlexElement,
|