@haluo/biz 1.0.0 → 1.0.2
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/haluo-biz.js +160 -3813
- package/dist/haluo-biz.umd.cjs +4742 -4756
- package/dist/squire-raw.b8e23325.js +3636 -0
- package/package.json +1 -1
package/dist/haluo-biz.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveComponent, resolveDirective, openBlock, createElementBlock, createElementVNode, createVNode, withCtx, normalizeStyle, createCommentVNode, normalizeClass, toDisplayString, withDirectives, Fragment, renderList, createBlock, defineComponent, inject, computed, unref, isRef, renderSlot, createTextVNode, provide, toRefs, reactive, watch, onMounted, withKeys, ref, h, render as render$3, vShow } from "vue";
|
|
1
|
+
import { resolveComponent, resolveDirective, openBlock, createElementBlock, createElementVNode, createVNode, withCtx, normalizeStyle, createCommentVNode, normalizeClass, toDisplayString, withDirectives, Fragment, renderList, createBlock, defineComponent, inject, computed, unref, isRef, renderSlot, createTextVNode, provide, getCurrentInstance, toRefs, reactive, watch, onMounted, withKeys, ref, h, render as render$3, vShow } from "vue";
|
|
2
2
|
import util from "@haluo/util";
|
|
3
3
|
import draggable from "vuedraggable";
|
|
4
4
|
const __vite_glob_0_0 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLBAMAAADKYGfZAAAAG1BMVEUAAAAAAABHcExSUlLz8/P////IyMifn5/k5OQx49C2AAAACXRSTlMzZgB/7//CpN1ci7LLAAABHUlEQVR4AY3TgUbAUBjF8e0NmiiAY28QIYCkXqB9GUBIT7AHCHvvss3l73Y4g3vx87ft3m8Yp+C5GZSxecyYMuZzZMqYz5EpYz5Hpoz5HJkS1uceP67N7TeYyF7r59xs9XmxlgNbj/W+6hmMua86c9vfCsbcXdV6xpYHsj53xF4msj7XYmB97oqB9bmlxcC6XIuBdbkWI2Nur3qfyFouqc0K3g05/6XI+f+GnD8F5NyZMmdvCHP2vjFX7vYyt7tZYO7p7f/JYs7NKXMZk2fMZUyeMZcxecZcxuQZcxmTZ8xlTJ4xlzF5xlzG5BlzGZNnzGVMnjGXMXnGXMbkGXMZk2fMZUyeMZcxecZcxuQZcxmTZ8xlTJ4xlzFlbB5+AVncQI3j46OFAAAAAElFTkSuQmCC";
|
|
@@ -229,11 +229,11 @@ const _hoisted_1$a = {
|
|
|
229
229
|
};
|
|
230
230
|
const _hoisted_2$a = { class: "tools-content" };
|
|
231
231
|
const _hoisted_3$8 = ["src"];
|
|
232
|
-
const _hoisted_4$
|
|
233
|
-
const _hoisted_5$
|
|
232
|
+
const _hoisted_4$3 = ["src"];
|
|
233
|
+
const _hoisted_5$3 = ["src"];
|
|
234
234
|
const _hoisted_6$2 = { class: "box" };
|
|
235
|
-
const _hoisted_7$
|
|
236
|
-
const _hoisted_8
|
|
235
|
+
const _hoisted_7$1 = ["src"];
|
|
236
|
+
const _hoisted_8 = {
|
|
237
237
|
key: 0,
|
|
238
238
|
class: "box-mask"
|
|
239
239
|
};
|
|
@@ -331,7 +331,7 @@ function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
331
331
|
height: "40",
|
|
332
332
|
alt: "",
|
|
333
333
|
onClick: _cache[1] || (_cache[1] = ($event) => $options.forward($event))
|
|
334
|
-
}, null, 12, _hoisted_4$
|
|
334
|
+
}, null, 12, _hoisted_4$3)
|
|
335
335
|
]),
|
|
336
336
|
_: 1
|
|
337
337
|
}),
|
|
@@ -352,7 +352,7 @@ function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
352
352
|
height: "40",
|
|
353
353
|
alt: "",
|
|
354
354
|
onClick: _cache[2] || (_cache[2] = (...args) => $options.clearFormat && $options.clearFormat(...args))
|
|
355
|
-
}, null, 8, _hoisted_5$
|
|
355
|
+
}, null, 8, _hoisted_5$3)
|
|
356
356
|
]),
|
|
357
357
|
_: 1
|
|
358
358
|
}),
|
|
@@ -370,8 +370,8 @@ function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
370
370
|
height: "40",
|
|
371
371
|
alt: "",
|
|
372
372
|
onClick: _cache[3] || (_cache[3] = (...args) => $options.copyFormat && $options.copyFormat(...args))
|
|
373
|
-
}, null, 8, _hoisted_7$
|
|
374
|
-
$props.editor.cursorStyle !== "auto" ? (openBlock(), createElementBlock("div", _hoisted_8
|
|
373
|
+
}, null, 8, _hoisted_7$1),
|
|
374
|
+
$props.editor.cursorStyle !== "auto" ? (openBlock(), createElementBlock("div", _hoisted_8)) : createCommentVNode("", true)
|
|
375
375
|
])
|
|
376
376
|
]),
|
|
377
377
|
_: 1
|
|
@@ -876,10 +876,8 @@ const _hoisted_3$6 = {
|
|
|
876
876
|
slot: "footer",
|
|
877
877
|
class: "dialog-footer"
|
|
878
878
|
};
|
|
879
|
-
const _hoisted_4$5 = /* @__PURE__ */ createTextVNode("\u53D6\u6D88");
|
|
880
|
-
const _hoisted_5$4 = /* @__PURE__ */ createTextVNode("\u786E\u8BA4");
|
|
881
879
|
const _sfc_main$6 = /* @__PURE__ */ defineComponent({
|
|
882
|
-
|
|
880
|
+
__name: "index",
|
|
883
881
|
props: {
|
|
884
882
|
visible: { type: Boolean, default: false },
|
|
885
883
|
showBtn: { type: Boolean, default: true },
|
|
@@ -936,7 +934,7 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
|
|
|
936
934
|
onClick: handleClose
|
|
937
935
|
}, {
|
|
938
936
|
default: withCtx(() => [
|
|
939
|
-
|
|
937
|
+
createTextVNode("\u53D6\u6D88")
|
|
940
938
|
]),
|
|
941
939
|
_: 1
|
|
942
940
|
}),
|
|
@@ -947,7 +945,7 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
|
|
|
947
945
|
onClick: confirm
|
|
948
946
|
}, {
|
|
949
947
|
default: withCtx(() => [
|
|
950
|
-
|
|
948
|
+
createTextVNode("\u786E\u8BA4")
|
|
951
949
|
]),
|
|
952
950
|
_: 1
|
|
953
951
|
})
|
|
@@ -1102,23 +1100,21 @@ const _hoisted_1$5 = /* @__PURE__ */ createElementVNode("span", null, [
|
|
|
1102
1100
|
/* @__PURE__ */ createElementVNode("strong", { style: { "margin-left": "20px", "color": "#FF5A25" } }, "\u5E73\u53F0\u4EC5\u652F\u6301\u63D2\u516518\u4E2A\u6708\u5185\u7684\u63A8\u8350\u5185\u5BB9")
|
|
1103
1101
|
], -1);
|
|
1104
1102
|
const _hoisted_2$5 = { class: "insert-article" };
|
|
1105
|
-
const _hoisted_3$5 =
|
|
1106
|
-
const _hoisted_4$
|
|
1107
|
-
const _hoisted_5$3 = { class: "insert-article_input" };
|
|
1108
|
-
const _hoisted_6$1 = {
|
|
1103
|
+
const _hoisted_3$5 = { class: "insert-article_input" };
|
|
1104
|
+
const _hoisted_4$2 = {
|
|
1109
1105
|
key: 0,
|
|
1110
1106
|
class: "nodata"
|
|
1111
1107
|
};
|
|
1112
|
-
const
|
|
1108
|
+
const _hoisted_5$2 = {
|
|
1113
1109
|
key: 1,
|
|
1114
1110
|
"infinite-scroll-immediate-check": "false",
|
|
1115
1111
|
class: "insert-article_list",
|
|
1116
1112
|
"infinite-scroll-disabled": "disable",
|
|
1117
1113
|
"infinite-scroll-distance": "10"
|
|
1118
1114
|
};
|
|
1119
|
-
const
|
|
1115
|
+
const _hoisted_6$1 = { style: { "display": "inline-flex", "flex-direction": "column" } };
|
|
1120
1116
|
const _sfc_main$5 = /* @__PURE__ */ defineComponent({
|
|
1121
|
-
|
|
1117
|
+
__name: "index",
|
|
1122
1118
|
props: {
|
|
1123
1119
|
visible: { type: Boolean, default: false },
|
|
1124
1120
|
getList: null
|
|
@@ -1134,6 +1130,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
|
|
|
1134
1130
|
emits("update:visible", val);
|
|
1135
1131
|
}
|
|
1136
1132
|
});
|
|
1133
|
+
const { proxy } = getCurrentInstance();
|
|
1137
1134
|
const { visible, getList } = toRefs(props);
|
|
1138
1135
|
const data = reactive({
|
|
1139
1136
|
params: {
|
|
@@ -1161,8 +1158,10 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
|
|
|
1161
1158
|
data.article = item;
|
|
1162
1159
|
};
|
|
1163
1160
|
const confirm = () => {
|
|
1164
|
-
if (!data.article)
|
|
1165
|
-
|
|
1161
|
+
if (!data.article) {
|
|
1162
|
+
proxy.$message.error("\u8BF7\u9009\u62E9\u6587\u7AE0");
|
|
1163
|
+
return;
|
|
1164
|
+
}
|
|
1166
1165
|
emits("change", data.article);
|
|
1167
1166
|
};
|
|
1168
1167
|
const getArticleList = async (reset) => {
|
|
@@ -1213,7 +1212,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
|
|
|
1213
1212
|
label: "1"
|
|
1214
1213
|
}, {
|
|
1215
1214
|
default: withCtx(() => [
|
|
1216
|
-
|
|
1215
|
+
createTextVNode("\u4ECE\u6211\u7684\u6587\u7AE0\u4E2D\u9009\u62E9")
|
|
1217
1216
|
]),
|
|
1218
1217
|
_: 1
|
|
1219
1218
|
}, 8, ["modelValue"]),
|
|
@@ -1223,12 +1222,12 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
|
|
|
1223
1222
|
label: "2"
|
|
1224
1223
|
}, {
|
|
1225
1224
|
default: withCtx(() => [
|
|
1226
|
-
|
|
1225
|
+
createTextVNode("\u4ECE\u6240\u6709\u6587\u7AE0\u4E2D\u9009\u62E9")
|
|
1227
1226
|
]),
|
|
1228
1227
|
_: 1
|
|
1229
1228
|
}, 8, ["modelValue"])
|
|
1230
1229
|
]),
|
|
1231
|
-
createElementVNode("div",
|
|
1230
|
+
createElementVNode("div", _hoisted_3$5, [
|
|
1232
1231
|
createVNode(_component_el_input, {
|
|
1233
1232
|
modelValue: data.params.title,
|
|
1234
1233
|
"onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => data.params.title = $event),
|
|
@@ -1245,7 +1244,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
|
|
|
1245
1244
|
_: 1
|
|
1246
1245
|
}, 8, ["modelValue"])
|
|
1247
1246
|
]),
|
|
1248
|
-
data.data.length === 0 && !data.busy ? (openBlock(), createElementBlock("div",
|
|
1247
|
+
data.data.length === 0 && !data.busy ? (openBlock(), createElementBlock("div", _hoisted_4$2, "\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u6587\u7AE0\u54E6\uFF0C\u4F60\u53EF\u4EE5\u8BD5\u8BD5\u641C\u7D22\u5176\u4ED6\u6587\u7AE0\uFF5E")) : withDirectives((openBlock(), createElementBlock("div", _hoisted_5$2, [
|
|
1249
1248
|
(openBlock(true), createElementBlock(Fragment, null, renderList(data.data, (item, index) => {
|
|
1250
1249
|
return openBlock(), createElementBlock("div", {
|
|
1251
1250
|
key: index,
|
|
@@ -1258,7 +1257,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
|
|
|
1258
1257
|
onChange: ($event) => select(item)
|
|
1259
1258
|
}, {
|
|
1260
1259
|
default: withCtx(() => [
|
|
1261
|
-
createElementVNode("div",
|
|
1260
|
+
createElementVNode("div", _hoisted_6$1, [
|
|
1262
1261
|
createElementVNode("span", null, toDisplayString(item.title || "[\u65E0\u6807\u9898]"), 1),
|
|
1263
1262
|
createElementVNode("span", null, toDisplayString(unref(date).format(item.createTime * 1e3, "YYYY-MM-DD")), 1)
|
|
1264
1263
|
])
|
|
@@ -1323,15 +1322,15 @@ const _hoisted_2$4 = {
|
|
|
1323
1322
|
class: "upload-wrap"
|
|
1324
1323
|
};
|
|
1325
1324
|
const _hoisted_3$4 = /* @__PURE__ */ createElementVNode("span", null, "\u672C\u5730\u4E0A\u4F20", -1);
|
|
1326
|
-
const _hoisted_4$
|
|
1327
|
-
const _hoisted_5$
|
|
1325
|
+
const _hoisted_4$1 = /* @__PURE__ */ createElementVNode("span", { class: "remark" }, "\u652F\u6301jpg\u3001jpeg\u3001png\u7B49\u591A\u79CD\u683C\u5F0F\uFF0C\u5355\u5F20\u56FE\u7247\u6700\u5927\u652F\u630120MB", -1);
|
|
1326
|
+
const _hoisted_5$1 = {
|
|
1328
1327
|
key: 1,
|
|
1329
1328
|
class: "img-list"
|
|
1330
1329
|
};
|
|
1331
1330
|
const _hoisted_6 = ["src"];
|
|
1332
1331
|
const _hoisted_7 = { class: "upload-btn" };
|
|
1333
1332
|
const _sfc_main$4 = /* @__PURE__ */ defineComponent({
|
|
1334
|
-
|
|
1333
|
+
__name: "index",
|
|
1335
1334
|
props: {
|
|
1336
1335
|
visible: { type: Boolean, default: false },
|
|
1337
1336
|
imgList: { default: [] }
|
|
@@ -1404,8 +1403,8 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
|
|
|
1404
1403
|
}),
|
|
1405
1404
|
_hoisted_3$4
|
|
1406
1405
|
]),
|
|
1407
|
-
_hoisted_4$
|
|
1408
|
-
])) : (openBlock(), createElementBlock("div", _hoisted_5$
|
|
1406
|
+
_hoisted_4$1
|
|
1407
|
+
])) : (openBlock(), createElementBlock("div", _hoisted_5$1, [
|
|
1409
1408
|
createVNode(unref(draggable), {
|
|
1410
1409
|
modelValue: unref(imgListTemp),
|
|
1411
1410
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(imgListTemp) ? imgListTemp.value = $event : null),
|
|
@@ -1504,8 +1503,7 @@ const _sfc_main$3 = {
|
|
|
1504
1503
|
};
|
|
1505
1504
|
const _hoisted_1$3 = /* @__PURE__ */ createElementVNode("span", null, "\u63D2\u5165\u89C6\u9891", -1);
|
|
1506
1505
|
const _hoisted_2$3 = { class: "insert-video" };
|
|
1507
|
-
const _hoisted_3$3 = /* @__PURE__ */
|
|
1508
|
-
const _hoisted_4$2 = /* @__PURE__ */ createElementVNode("span", { class: "remark" }, "\u4E3A\u4E86\u83B7\u5F97\u66F4\u9AD8\u7684\u63A8\u8350\u91CF\u548C\u70B9\u51FB\u91CF\uFF0C\u5EFA\u8BAE\u4E0A\u4F20720p\uFF081280*720\uFF09\u6216\u66F4\u9AD8\u5206\u8FA8\u7387\u7684\u89C6\u9891\uFF0C\u89C6\u9891\u683C\u5F0F\u4E3A.mp4\u6216.mov\uFF0C\u5927\u5C0F\u4E0D\u8D85\u8FC71G", -1);
|
|
1506
|
+
const _hoisted_3$3 = /* @__PURE__ */ createElementVNode("span", { class: "remark" }, "\u4E3A\u4E86\u83B7\u5F97\u66F4\u9AD8\u7684\u63A8\u8350\u91CF\u548C\u70B9\u51FB\u91CF\uFF0C\u5EFA\u8BAE\u4E0A\u4F20720p\uFF081280*720\uFF09\u6216\u66F4\u9AD8\u5206\u8FA8\u7387\u7684\u89C6\u9891\uFF0C\u89C6\u9891\u683C\u5F0F\u4E3A.mp4\u6216.mov\uFF0C\u5927\u5C0F\u4E0D\u8D85\u8FC71G", -1);
|
|
1509
1507
|
function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1510
1508
|
const _component_el_button = resolveComponent("el-button");
|
|
1511
1509
|
const _component_BasicDialog = resolveComponent("BasicDialog");
|
|
@@ -1527,11 +1525,11 @@ function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1527
1525
|
onClick: $options.emitEvent
|
|
1528
1526
|
}, {
|
|
1529
1527
|
default: withCtx(() => [
|
|
1530
|
-
|
|
1528
|
+
createTextVNode("\u9009\u62E9\u89C6\u9891")
|
|
1531
1529
|
]),
|
|
1532
1530
|
_: 1
|
|
1533
1531
|
}, 8, ["onClick"]),
|
|
1534
|
-
|
|
1532
|
+
_hoisted_3$3,
|
|
1535
1533
|
createElementVNode("input", {
|
|
1536
1534
|
type: "file",
|
|
1537
1535
|
accept: "video/*",
|
|
@@ -1654,8 +1652,8 @@ const _hoisted_1$1 = {
|
|
|
1654
1652
|
};
|
|
1655
1653
|
const _hoisted_2$1 = ["src"];
|
|
1656
1654
|
const _hoisted_3$1 = { class: "article-item_right" };
|
|
1657
|
-
const _hoisted_4
|
|
1658
|
-
const _hoisted_5
|
|
1655
|
+
const _hoisted_4 = { class: "name" };
|
|
1656
|
+
const _hoisted_5 = { class: "score" };
|
|
1659
1657
|
function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
|
|
1660
1658
|
const _component_el_icon_error = resolveComponent("el-icon-error");
|
|
1661
1659
|
return openBlock(), createElementBlock("div", _hoisted_1$1, [
|
|
@@ -1665,8 +1663,8 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
1665
1663
|
alt: ""
|
|
1666
1664
|
}, null, 8, _hoisted_2$1)) : createCommentVNode("", true),
|
|
1667
1665
|
createElementVNode("div", _hoisted_3$1, [
|
|
1668
|
-
createElementVNode("div", _hoisted_4
|
|
1669
|
-
createElementVNode("div", _hoisted_5
|
|
1666
|
+
createElementVNode("div", _hoisted_4, toDisplayString($props.article.title), 1),
|
|
1667
|
+
createElementVNode("div", _hoisted_5, [
|
|
1670
1668
|
createElementVNode("span", null, toDisplayString($props.article.author), 1),
|
|
1671
1669
|
createElementVNode("span", null, toDisplayString($props.article.viewNum) + "\u6D4F\u89C8", 1),
|
|
1672
1670
|
createElementVNode("span", null, toDisplayString($props.article.replycnt) + "\u8BC4\u8BBA", 1)
|
|
@@ -1706,3776 +1704,125 @@ const mountArticleDom = (props, del) => {
|
|
|
1706
1704
|
return div;
|
|
1707
1705
|
};
|
|
1708
1706
|
const car_ciose = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLBAMAAADKYGfZAAAAG1BMVEUAAAAAAABHcExSUlLz8/P////IyMifn5/k5OQx49C2AAAACXRSTlMzZgB/7//CpN1ci7LLAAABHUlEQVR4AY3TgUbAUBjF8e0NmiiAY28QIYCkXqB9GUBIT7AHCHvvss3l73Y4g3vx87ft3m8Yp+C5GZSxecyYMuZzZMqYz5EpYz5Hpoz5HJkS1uceP67N7TeYyF7r59xs9XmxlgNbj/W+6hmMua86c9vfCsbcXdV6xpYHsj53xF4msj7XYmB97oqB9bmlxcC6XIuBdbkWI2Nur3qfyFouqc0K3g05/6XI+f+GnD8F5NyZMmdvCHP2vjFX7vYyt7tZYO7p7f/JYs7NKXMZk2fMZUyeMZcxecZcxuQZcxmTZ8xlTJ4xlzF5xlzG5BlzGZNnzGVMnjGXMXnGXMbkGXMZk2fMZUyeMZcxecZcxuQZcxmTZ8xlTJ4xlzFlbB5+AVncQI3j46OFAAAAAElFTkSuQmCC";
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1707
|
+
const Editor_vue_vue_type_style_index_0_lang = "";
|
|
1708
|
+
const cursorImg = `url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAYCAMAAACoeN87AAAAh1BMVEUAAAACAgL39/cICAgFBQUAAAADAwMKCgr6+vrn5+fr6+v6+voEBAT19fXm5ubf39+pqanBwcH8/PzOzs76+vrx8fHz8/P29vbh4eHm5ubT09OXl5f///9ZWVkiIiLIyMjGxsY+Pj5LS0uenp4vLy/V1dXk5OSsrKxnZ2eRkZF1dXXj4+ODg4P4y9kGAAAAHHRSTlMACMUDDQYOCuONi8MSt2tJMCryT9OpqKaRezobrP6h8wAAAR9JREFUKM+dk1lygzAMQOMtxoQlS/dKBrMn7f3PVwEFPND0I+/Dg8RD0mjM7nGEZoIOqfwc+0jTVE+RgcAcTQBvbFFOvM7zJvgcIw2uaKF0DuRS5LW1RBmKMQyhdugyMGJWGMciywrkauobZrY2kgxPQQCcFGIPFvb+sNGkSLUo3iDqEvPzqJz5IVF/KEnTIVak0IG35rJV1OFGr7AEKJHULh7KRKRE86gHLPKZAjnrkwEpgV4U6zEqEugRpL+TmXtVEGaQlO0sfK1sVnds7Pf/yim42q9FccjVai/q5WornKlsm4hVFRGX6NFlT7rPSlPb3GgxNnrmHvF7nxYh5A5dDaEaWzGf4TsGzpXQFsut2yDC37tr1O4eSurhD6CaPzWzJeCQ3tPtAAAAAElFTkSuQmCC) 28 10, text`;
|
|
1709
|
+
const keyToEditorMethod = {
|
|
1710
|
+
bold: "bold",
|
|
1711
|
+
italic: "italic",
|
|
1712
|
+
underline: "underline",
|
|
1713
|
+
size: "setFontSize",
|
|
1714
|
+
color: "setTextColour"
|
|
1715
|
+
};
|
|
1716
|
+
const _sfc_main = {
|
|
1717
|
+
name: "Edit",
|
|
1718
|
+
components: {
|
|
1719
|
+
InsertArticle: _sfc_main$5,
|
|
1720
|
+
ImgUpload: _sfc_main$4,
|
|
1721
|
+
VideoUpload,
|
|
1722
|
+
CollectArticle
|
|
1723
|
+
},
|
|
1724
|
+
props: [
|
|
1725
|
+
"disabled",
|
|
1726
|
+
"isOss",
|
|
1727
|
+
"getEassyDetail",
|
|
1728
|
+
"getArticleList",
|
|
1729
|
+
"importEssay",
|
|
1730
|
+
"uploadImageByOther"
|
|
1731
|
+
],
|
|
1732
|
+
data() {
|
|
1733
|
+
return {
|
|
1734
|
+
hasArticleCard: false,
|
|
1735
|
+
cursorStyle: "auto",
|
|
1736
|
+
titleCount: 0,
|
|
1737
|
+
viewLinkDialog: false,
|
|
1738
|
+
linkForm: {
|
|
1739
|
+
linkAddress: "",
|
|
1740
|
+
linkWriting: ""
|
|
1741
|
+
},
|
|
1742
|
+
setAlignFlag: true,
|
|
1743
|
+
article: {},
|
|
1744
|
+
imgList: [],
|
|
1745
|
+
videoList: [],
|
|
1746
|
+
visibleVideo: false,
|
|
1747
|
+
visibleCollectArticle: false,
|
|
1748
|
+
visibleArticle: false,
|
|
1749
|
+
visibleImg: false,
|
|
1750
|
+
imgType: "normal",
|
|
1751
|
+
typeEnum: {
|
|
1752
|
+
"\u6587\u5B57": "1",
|
|
1753
|
+
"\u56FE\u7247": "2",
|
|
1754
|
+
"\u56FE\u6587": "3",
|
|
1755
|
+
"\u6BB5\u843D\u6807\u9898": "4",
|
|
1756
|
+
"\u5173\u8054": "5",
|
|
1757
|
+
"\u5355\u89C6\u9891": "6",
|
|
1758
|
+
"\u89C6\u9891\u6587\u5B57": "7",
|
|
1759
|
+
"URL": "8",
|
|
1760
|
+
"\u6587\u7AE0\u5361\u7247": "11"
|
|
1761
|
+
},
|
|
1762
|
+
fontInfo: {
|
|
1763
|
+
size: ""
|
|
1764
|
+
},
|
|
1765
|
+
user: {},
|
|
1766
|
+
editor: {},
|
|
1767
|
+
editorDom: {},
|
|
1768
|
+
uploadStore: {},
|
|
1769
|
+
linkContent: "",
|
|
1770
|
+
loadingText: "",
|
|
1771
|
+
progressPercent: "",
|
|
1772
|
+
currentIndex: 0,
|
|
1773
|
+
loading: false,
|
|
1774
|
+
viewStatus: false,
|
|
1775
|
+
linkStatus: false,
|
|
1776
|
+
styleStatus: {
|
|
1777
|
+
bold: false,
|
|
1778
|
+
italic: false,
|
|
1779
|
+
size: "",
|
|
1780
|
+
color: "",
|
|
1781
|
+
underline: false,
|
|
1782
|
+
title: false
|
|
1783
|
+
},
|
|
1784
|
+
contentLen: 0,
|
|
1785
|
+
imgCount: 0,
|
|
1786
|
+
backState: {
|
|
1787
|
+
redo: false,
|
|
1788
|
+
undo: false
|
|
1789
|
+
},
|
|
1790
|
+
countList: [],
|
|
1791
|
+
replaceSeamless: 0,
|
|
1792
|
+
seamlessCount: 0
|
|
1752
1793
|
};
|
|
1753
|
-
}
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
8: 128,
|
|
1759
|
-
9: 256,
|
|
1760
|
-
11: 1024
|
|
1761
|
-
};
|
|
1762
|
-
function TreeWalker(root, nodeType, filter) {
|
|
1763
|
-
this.root = this.currentNode = root;
|
|
1764
|
-
this.nodeType = nodeType;
|
|
1765
|
-
this.filter = filter;
|
|
1766
|
-
}
|
|
1767
|
-
TreeWalker.prototype.nextNode = function() {
|
|
1768
|
-
var current = this.currentNode, root = this.root, nodeType = this.nodeType, filter = this.filter, node;
|
|
1769
|
-
while (true) {
|
|
1770
|
-
node = current.firstChild;
|
|
1771
|
-
while (!node && current) {
|
|
1772
|
-
if (current === root) {
|
|
1773
|
-
break;
|
|
1774
|
-
}
|
|
1775
|
-
node = current.nextSibling;
|
|
1776
|
-
if (!node) {
|
|
1777
|
-
current = current.parentNode;
|
|
1778
|
-
}
|
|
1779
|
-
}
|
|
1780
|
-
if (!node) {
|
|
1781
|
-
return null;
|
|
1782
|
-
}
|
|
1783
|
-
if (typeToBitArray[node.nodeType] & nodeType && filter(node)) {
|
|
1784
|
-
this.currentNode = node;
|
|
1785
|
-
return node;
|
|
1786
|
-
}
|
|
1787
|
-
current = node;
|
|
1788
|
-
}
|
|
1789
|
-
};
|
|
1790
|
-
TreeWalker.prototype.previousNode = function() {
|
|
1791
|
-
var current = this.currentNode, root = this.root, nodeType = this.nodeType, filter = this.filter, node;
|
|
1792
|
-
while (true) {
|
|
1793
|
-
if (current === root) {
|
|
1794
|
-
return null;
|
|
1795
|
-
}
|
|
1796
|
-
node = current.previousSibling;
|
|
1797
|
-
if (node) {
|
|
1798
|
-
while (current = node.lastChild) {
|
|
1799
|
-
node = current;
|
|
1800
|
-
}
|
|
1801
|
-
} else {
|
|
1802
|
-
node = current.parentNode;
|
|
1803
|
-
}
|
|
1804
|
-
if (!node) {
|
|
1805
|
-
return null;
|
|
1806
|
-
}
|
|
1807
|
-
if (typeToBitArray[node.nodeType] & nodeType && filter(node)) {
|
|
1808
|
-
this.currentNode = node;
|
|
1809
|
-
return node;
|
|
1810
|
-
}
|
|
1811
|
-
current = node;
|
|
1812
|
-
}
|
|
1813
|
-
};
|
|
1814
|
-
TreeWalker.prototype.previousPONode = function() {
|
|
1815
|
-
var current = this.currentNode, root = this.root, nodeType = this.nodeType, filter = this.filter, node;
|
|
1816
|
-
while (true) {
|
|
1817
|
-
node = current.lastChild;
|
|
1818
|
-
while (!node && current) {
|
|
1819
|
-
if (current === root) {
|
|
1820
|
-
break;
|
|
1821
|
-
}
|
|
1822
|
-
node = current.previousSibling;
|
|
1823
|
-
if (!node) {
|
|
1824
|
-
current = current.parentNode;
|
|
1825
|
-
}
|
|
1826
|
-
}
|
|
1827
|
-
if (!node) {
|
|
1828
|
-
return null;
|
|
1829
|
-
}
|
|
1830
|
-
if (typeToBitArray[node.nodeType] & nodeType && filter(node)) {
|
|
1831
|
-
this.currentNode = node;
|
|
1832
|
-
return node;
|
|
1833
|
-
}
|
|
1834
|
-
current = node;
|
|
1835
|
-
}
|
|
1836
|
-
};
|
|
1837
|
-
var inlineNodeNames = /^(?:#text|A(?:BBR|CRONYM)?|B(?:R|D[IO])?|C(?:ITE|ODE)|D(?:ATA|EL|FN)|EM|FONT|HR|I(?:FRAME|MG|NPUT|NS)?|KBD|Q|R(?:P|T|UBY)|S(?:AMP|MALL|PAN|TR(?:IKE|ONG)|U[BP])?|TIME|U|VAR|WBR)$/;
|
|
1838
|
-
var leafNodeNames = {
|
|
1839
|
-
BR: 1,
|
|
1840
|
-
HR: 1,
|
|
1841
|
-
IFRAME: 1,
|
|
1842
|
-
IMG: 1,
|
|
1843
|
-
INPUT: 1
|
|
1844
|
-
};
|
|
1845
|
-
function every(nodeList, fn) {
|
|
1846
|
-
var l = nodeList.length;
|
|
1847
|
-
while (l--) {
|
|
1848
|
-
if (!fn(nodeList[l])) {
|
|
1849
|
-
return false;
|
|
1850
|
-
}
|
|
1851
|
-
}
|
|
1852
|
-
return true;
|
|
1853
|
-
}
|
|
1854
|
-
var UNKNOWN = 0;
|
|
1855
|
-
var INLINE = 1;
|
|
1856
|
-
var BLOCK = 2;
|
|
1857
|
-
var CONTAINER = 3;
|
|
1858
|
-
var nodeCategoryCache = canWeakMap ? /* @__PURE__ */ new WeakMap() : null;
|
|
1859
|
-
function isLeaf(node) {
|
|
1860
|
-
return node.nodeType === ELEMENT_NODE && !!leafNodeNames[node.nodeName];
|
|
1861
|
-
}
|
|
1862
|
-
function getNodeCategory(node) {
|
|
1863
|
-
switch (node.nodeType) {
|
|
1864
|
-
case TEXT_NODE:
|
|
1865
|
-
return INLINE;
|
|
1866
|
-
case ELEMENT_NODE:
|
|
1867
|
-
case DOCUMENT_FRAGMENT_NODE:
|
|
1868
|
-
if (canWeakMap && nodeCategoryCache.has(node)) {
|
|
1869
|
-
return nodeCategoryCache.get(node);
|
|
1870
|
-
}
|
|
1871
|
-
break;
|
|
1872
|
-
default:
|
|
1873
|
-
return UNKNOWN;
|
|
1874
|
-
}
|
|
1875
|
-
var nodeCategory;
|
|
1876
|
-
if (!every(node.childNodes, isInline)) {
|
|
1877
|
-
nodeCategory = CONTAINER;
|
|
1878
|
-
} else if (inlineNodeNames.test(node.nodeName)) {
|
|
1879
|
-
nodeCategory = INLINE;
|
|
1880
|
-
} else {
|
|
1881
|
-
nodeCategory = BLOCK;
|
|
1882
|
-
}
|
|
1883
|
-
if (canWeakMap) {
|
|
1884
|
-
nodeCategoryCache.set(node, nodeCategory);
|
|
1885
|
-
}
|
|
1886
|
-
return nodeCategory;
|
|
1887
|
-
}
|
|
1888
|
-
function isInline(node) {
|
|
1889
|
-
return getNodeCategory(node) === INLINE;
|
|
1890
|
-
}
|
|
1891
|
-
function isBlock(node) {
|
|
1892
|
-
return getNodeCategory(node) === BLOCK;
|
|
1893
|
-
}
|
|
1894
|
-
function isContainer(node) {
|
|
1895
|
-
return getNodeCategory(node) === CONTAINER;
|
|
1896
|
-
}
|
|
1897
|
-
function getBlockWalker(node, root) {
|
|
1898
|
-
var walker2 = new TreeWalker(root, SHOW_ELEMENT, isBlock);
|
|
1899
|
-
walker2.currentNode = node;
|
|
1900
|
-
return walker2;
|
|
1901
|
-
}
|
|
1902
|
-
function getPreviousBlock(node, root) {
|
|
1903
|
-
node = getBlockWalker(node, root).previousNode();
|
|
1904
|
-
return node !== root ? node : null;
|
|
1905
|
-
}
|
|
1906
|
-
function getNextBlock(node, root) {
|
|
1907
|
-
node = getBlockWalker(node, root).nextNode();
|
|
1908
|
-
return node !== root ? node : null;
|
|
1909
|
-
}
|
|
1910
|
-
function isEmptyBlock(block) {
|
|
1911
|
-
return !block.textContent && !block.querySelector("IMG");
|
|
1912
|
-
}
|
|
1913
|
-
function areAlike(node, node2) {
|
|
1914
|
-
return !isLeaf(node) && (node.nodeType === node2.nodeType && node.nodeName === node2.nodeName && node.nodeName !== "A" && node.className === node2.className && (!node.style && !node2.style || node.style.cssText === node2.style.cssText));
|
|
1915
|
-
}
|
|
1916
|
-
function hasTagAttributes(node, tag, attributes) {
|
|
1917
|
-
if (node.nodeName !== tag) {
|
|
1918
|
-
return false;
|
|
1919
|
-
}
|
|
1920
|
-
for (var attr in attributes) {
|
|
1921
|
-
if (node.getAttribute(attr) !== attributes[attr]) {
|
|
1922
|
-
return false;
|
|
1923
|
-
}
|
|
1924
|
-
}
|
|
1925
|
-
return true;
|
|
1926
|
-
}
|
|
1927
|
-
function getNearest(node, root, tag, attributes) {
|
|
1928
|
-
while (node && node !== root && tag !== "SPAN") {
|
|
1929
|
-
if (hasTagAttributes(node, tag, attributes)) {
|
|
1930
|
-
return node;
|
|
1931
|
-
}
|
|
1932
|
-
node = node.parentNode;
|
|
1933
|
-
}
|
|
1934
|
-
return null;
|
|
1935
|
-
}
|
|
1936
|
-
function isOrContains(parent, node) {
|
|
1937
|
-
while (node) {
|
|
1938
|
-
if (node === parent) {
|
|
1939
|
-
return true;
|
|
1940
|
-
}
|
|
1941
|
-
node = node.parentNode;
|
|
1942
|
-
}
|
|
1943
|
-
return false;
|
|
1944
|
-
}
|
|
1945
|
-
function getPath(node, root) {
|
|
1946
|
-
var path = "";
|
|
1947
|
-
var id, className, classNames, dir;
|
|
1948
|
-
if (node && node !== root) {
|
|
1949
|
-
path = getPath(node.parentNode, root);
|
|
1950
|
-
if (node.nodeType === ELEMENT_NODE) {
|
|
1951
|
-
path += (path ? ">" : "") + node.nodeName;
|
|
1952
|
-
if (id = node.id) {
|
|
1953
|
-
path += "#" + id;
|
|
1954
|
-
}
|
|
1955
|
-
if (className = node.className.trim()) {
|
|
1956
|
-
classNames = className.split(/\s\s*/);
|
|
1957
|
-
classNames.sort();
|
|
1958
|
-
path += ".";
|
|
1959
|
-
path += classNames.join(".");
|
|
1960
|
-
}
|
|
1961
|
-
if (dir = node.dir) {
|
|
1962
|
-
path += "[dir=" + dir + "]";
|
|
1963
|
-
}
|
|
1964
|
-
if (classNames) {
|
|
1965
|
-
if (indexOf.call(classNames, HIGHLIGHT_CLASS) > -1) {
|
|
1966
|
-
path += "[backgroundColor=" + node.style.backgroundColor.replace(/ /g, "") + "]";
|
|
1967
|
-
}
|
|
1968
|
-
if (indexOf.call(classNames, COLOUR_CLASS) > -1) {
|
|
1969
|
-
path += "[color=" + node.style.color.replace(/ /g, "") + "]";
|
|
1970
|
-
}
|
|
1971
|
-
if (indexOf.call(classNames, FONT_FAMILY_CLASS) > -1) {
|
|
1972
|
-
path += "[fontFamily=" + node.style.fontFamily.replace(/ /g, "") + "]";
|
|
1973
|
-
}
|
|
1974
|
-
if (indexOf.call(classNames, FONT_SIZE_CLASS) > -1) {
|
|
1975
|
-
path += "[fontSize=" + node.style.fontSize + "]";
|
|
1976
|
-
}
|
|
1977
|
-
}
|
|
1978
|
-
}
|
|
1979
|
-
}
|
|
1980
|
-
return path;
|
|
1981
|
-
}
|
|
1982
|
-
function getLength(node) {
|
|
1983
|
-
var nodeType = node.nodeType;
|
|
1984
|
-
return nodeType === ELEMENT_NODE || nodeType === DOCUMENT_FRAGMENT_NODE ? node.childNodes.length : node.length || 0;
|
|
1985
|
-
}
|
|
1986
|
-
function detach(node) {
|
|
1987
|
-
var parent = node.parentNode;
|
|
1988
|
-
if (parent) {
|
|
1989
|
-
parent.removeChild(node);
|
|
1990
|
-
}
|
|
1991
|
-
return node;
|
|
1992
|
-
}
|
|
1993
|
-
function replaceWith(node, node2) {
|
|
1994
|
-
var parent = node.parentNode;
|
|
1995
|
-
if (parent) {
|
|
1996
|
-
parent.replaceChild(node2, node);
|
|
1997
|
-
}
|
|
1998
|
-
}
|
|
1999
|
-
function empty(node) {
|
|
2000
|
-
var frag = node.ownerDocument.createDocumentFragment(), childNodes = node.childNodes, l = childNodes ? childNodes.length : 0;
|
|
2001
|
-
while (l--) {
|
|
2002
|
-
frag.appendChild(node.firstChild);
|
|
2003
|
-
}
|
|
2004
|
-
return frag;
|
|
2005
|
-
}
|
|
2006
|
-
function createElement(doc2, tag, props, children) {
|
|
2007
|
-
var el = doc2.createElement(tag), attr, value, i, l;
|
|
2008
|
-
if (props instanceof Array) {
|
|
2009
|
-
children = props;
|
|
2010
|
-
props = null;
|
|
2011
|
-
}
|
|
2012
|
-
if (props) {
|
|
2013
|
-
for (attr in props) {
|
|
2014
|
-
value = props[attr];
|
|
2015
|
-
if (value !== undefined$1) {
|
|
2016
|
-
el.setAttribute(attr, props[attr]);
|
|
2017
|
-
}
|
|
2018
|
-
}
|
|
2019
|
-
}
|
|
2020
|
-
if (children) {
|
|
2021
|
-
for (i = 0, l = children.length; i < l; i += 1) {
|
|
2022
|
-
el.appendChild(children[i]);
|
|
2023
|
-
}
|
|
2024
|
-
}
|
|
2025
|
-
return el;
|
|
2026
|
-
}
|
|
2027
|
-
function fixCursor(node, root) {
|
|
2028
|
-
var self2 = root.__squire__;
|
|
2029
|
-
var doc2 = node.ownerDocument;
|
|
2030
|
-
var originalNode = node;
|
|
2031
|
-
var fixer, child;
|
|
2032
|
-
if (node === root) {
|
|
2033
|
-
if (!(child = node.firstChild) || child.nodeName === "BR") {
|
|
2034
|
-
fixer = self2.createDefaultBlock();
|
|
2035
|
-
if (child) {
|
|
2036
|
-
node.replaceChild(fixer, child);
|
|
2037
|
-
} else {
|
|
2038
|
-
node.appendChild(fixer);
|
|
2039
|
-
}
|
|
2040
|
-
node = fixer;
|
|
2041
|
-
fixer = null;
|
|
2042
|
-
}
|
|
2043
|
-
}
|
|
2044
|
-
if (node.nodeType === TEXT_NODE) {
|
|
2045
|
-
return originalNode;
|
|
2046
|
-
}
|
|
2047
|
-
if (isInline(node)) {
|
|
2048
|
-
child = node.firstChild;
|
|
2049
|
-
while (cantFocusEmptyTextNodes && child && child.nodeType === TEXT_NODE && !child.data) {
|
|
2050
|
-
node.removeChild(child);
|
|
2051
|
-
child = node.firstChild;
|
|
2052
|
-
}
|
|
2053
|
-
if (!child) {
|
|
2054
|
-
if (cantFocusEmptyTextNodes) {
|
|
2055
|
-
fixer = doc2.createTextNode(ZWS);
|
|
2056
|
-
self2._didAddZWS();
|
|
2057
|
-
} else {
|
|
2058
|
-
fixer = doc2.createTextNode("");
|
|
2059
|
-
}
|
|
2060
|
-
}
|
|
2061
|
-
} else {
|
|
2062
|
-
if (useTextFixer) {
|
|
2063
|
-
while (node.nodeType !== TEXT_NODE && !isLeaf(node)) {
|
|
2064
|
-
child = node.firstChild;
|
|
2065
|
-
if (!child) {
|
|
2066
|
-
fixer = doc2.createTextNode("");
|
|
2067
|
-
break;
|
|
2068
|
-
}
|
|
2069
|
-
node = child;
|
|
2070
|
-
}
|
|
2071
|
-
if (node.nodeType === TEXT_NODE) {
|
|
2072
|
-
if (/^ +$/.test(node.data)) {
|
|
2073
|
-
node.data = "";
|
|
2074
|
-
}
|
|
2075
|
-
} else if (isLeaf(node)) {
|
|
2076
|
-
node.parentNode.insertBefore(doc2.createTextNode(""), node);
|
|
2077
|
-
}
|
|
2078
|
-
} else if (!node.querySelector("BR")) {
|
|
2079
|
-
fixer = createElement(doc2, "BR");
|
|
2080
|
-
while ((child = node.lastElementChild) && !isInline(child)) {
|
|
2081
|
-
node = child;
|
|
2082
|
-
}
|
|
2083
|
-
}
|
|
2084
|
-
}
|
|
2085
|
-
if (fixer) {
|
|
2086
|
-
try {
|
|
2087
|
-
node.appendChild(fixer);
|
|
2088
|
-
} catch (error) {
|
|
2089
|
-
self2.didError({
|
|
2090
|
-
name: "Squire: fixCursor \u2013\xA0" + error,
|
|
2091
|
-
message: "Parent: " + node.nodeName + "/" + node.innerHTML + " appendChild: " + fixer.nodeName
|
|
2092
|
-
});
|
|
1794
|
+
},
|
|
1795
|
+
computed: {
|
|
1796
|
+
align() {
|
|
1797
|
+
if (!this.isInputing && !this.titleCount && !this.hasArticleCard) {
|
|
1798
|
+
return this.getCursorAlignStyle() || "left";
|
|
2093
1799
|
}
|
|
1800
|
+
return "left";
|
|
1801
|
+
},
|
|
1802
|
+
isInputing() {
|
|
1803
|
+
return this.contentLen > 0 || this.imgCount > 0;
|
|
2094
1804
|
}
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
if (!isBR && isInline(child)) {
|
|
2107
|
-
if (child.classList && child.classList.contains("halo-picture-area")) {
|
|
2108
|
-
return;
|
|
2109
|
-
}
|
|
2110
|
-
if (!wrapper) {
|
|
2111
|
-
wrapper = createElement(
|
|
2112
|
-
doc2,
|
|
2113
|
-
config.blockTag,
|
|
2114
|
-
config.blockAttributes
|
|
2115
|
-
);
|
|
2116
|
-
}
|
|
2117
|
-
wrapper.appendChild(child);
|
|
2118
|
-
i -= 1;
|
|
2119
|
-
l -= 1;
|
|
2120
|
-
} else if (isBR || wrapper) {
|
|
2121
|
-
if (!wrapper) {
|
|
2122
|
-
wrapper = createElement(
|
|
2123
|
-
doc2,
|
|
2124
|
-
config.blockTag,
|
|
2125
|
-
config.blockAttributes
|
|
2126
|
-
);
|
|
2127
|
-
}
|
|
2128
|
-
fixCursor(wrapper, root);
|
|
2129
|
-
if (isBR) {
|
|
2130
|
-
container.replaceChild(wrapper, child);
|
|
2131
|
-
} else {
|
|
2132
|
-
container.insertBefore(wrapper, child);
|
|
2133
|
-
i += 1;
|
|
2134
|
-
l += 1;
|
|
1805
|
+
},
|
|
1806
|
+
watch: {
|
|
1807
|
+
progressPercent(val) {
|
|
1808
|
+
const inner = document.querySelector(".video-progress .inner");
|
|
1809
|
+
console.log(val, "\u89C6\u9891\u4E0A\u4F20\u8FDB\u5EA6");
|
|
1810
|
+
if (inner) {
|
|
1811
|
+
inner.style.width = val + "%";
|
|
1812
|
+
if (val === 100) {
|
|
1813
|
+
document.querySelector(".video-progress").innerHTML = `
|
|
1814
|
+
<div class="no-calc" style="text-align:center;color:#999999;font-size:18px;">\u6B63\u5728\u83B7\u53D6\u89C6\u9891\u5C01\u9762</div>
|
|
1815
|
+
`;
|
|
2135
1816
|
}
|
|
2136
|
-
wrapper = null;
|
|
2137
|
-
}
|
|
2138
|
-
if (isContainer(child)) {
|
|
2139
|
-
fixContainer(child, root);
|
|
2140
|
-
}
|
|
2141
|
-
}
|
|
2142
|
-
if (wrapper) {
|
|
2143
|
-
container.appendChild(fixCursor(wrapper, root));
|
|
2144
|
-
}
|
|
2145
|
-
return container;
|
|
2146
|
-
}
|
|
2147
|
-
function split(node, offset, stopNode, root) {
|
|
2148
|
-
var nodeType = node.nodeType, parent, clone, next;
|
|
2149
|
-
if (nodeType === TEXT_NODE && node !== stopNode) {
|
|
2150
|
-
return split(
|
|
2151
|
-
node.parentNode,
|
|
2152
|
-
node.splitText(offset),
|
|
2153
|
-
stopNode,
|
|
2154
|
-
root
|
|
2155
|
-
);
|
|
2156
|
-
}
|
|
2157
|
-
if (nodeType === ELEMENT_NODE) {
|
|
2158
|
-
if (typeof offset === "number") {
|
|
2159
|
-
offset = offset < node.childNodes.length ? node.childNodes[offset] : null;
|
|
2160
|
-
}
|
|
2161
|
-
if (node === stopNode) {
|
|
2162
|
-
return offset;
|
|
2163
1817
|
}
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
offset = next;
|
|
2170
|
-
}
|
|
2171
|
-
if (node.nodeName === "OL" && getNearest(node, root, "BLOCKQUOTE")) {
|
|
2172
|
-
clone.start = (+node.start || 1) + node.childNodes.length - 1;
|
|
2173
|
-
}
|
|
2174
|
-
fixCursor(node, root);
|
|
2175
|
-
fixCursor(clone, root);
|
|
2176
|
-
if (next = node.nextSibling) {
|
|
2177
|
-
parent.insertBefore(clone, next);
|
|
2178
|
-
} else {
|
|
2179
|
-
parent.appendChild(clone);
|
|
2180
|
-
}
|
|
2181
|
-
return split(parent, clone, stopNode, root);
|
|
2182
|
-
}
|
|
2183
|
-
return offset;
|
|
2184
|
-
}
|
|
2185
|
-
function _mergeInlines(node, fakeRange) {
|
|
2186
|
-
var children = node.childNodes, l = children.length, frags = [], child, prev, len;
|
|
2187
|
-
while (l--) {
|
|
2188
|
-
child = children[l];
|
|
2189
|
-
prev = l && children[l - 1];
|
|
2190
|
-
if (l && isInline(child) && areAlike(child, prev) && !leafNodeNames[child.nodeName]) {
|
|
2191
|
-
if (fakeRange.startContainer === child) {
|
|
2192
|
-
fakeRange.startContainer = prev;
|
|
2193
|
-
fakeRange.startOffset += getLength(prev);
|
|
2194
|
-
}
|
|
2195
|
-
if (fakeRange.endContainer === child) {
|
|
2196
|
-
fakeRange.endContainer = prev;
|
|
2197
|
-
fakeRange.endOffset += getLength(prev);
|
|
2198
|
-
}
|
|
2199
|
-
if (fakeRange.startContainer === node) {
|
|
2200
|
-
if (fakeRange.startOffset > l) {
|
|
2201
|
-
fakeRange.startOffset -= 1;
|
|
2202
|
-
} else if (fakeRange.startOffset === l) {
|
|
2203
|
-
fakeRange.startContainer = prev;
|
|
2204
|
-
fakeRange.startOffset = getLength(prev);
|
|
2205
|
-
}
|
|
2206
|
-
}
|
|
2207
|
-
if (fakeRange.endContainer === node) {
|
|
2208
|
-
if (fakeRange.endOffset > l) {
|
|
2209
|
-
fakeRange.endOffset -= 1;
|
|
2210
|
-
} else if (fakeRange.endOffset === l) {
|
|
2211
|
-
fakeRange.endContainer = prev;
|
|
2212
|
-
fakeRange.endOffset = getLength(prev);
|
|
2213
|
-
}
|
|
2214
|
-
}
|
|
2215
|
-
detach(child);
|
|
2216
|
-
if (child.nodeType === TEXT_NODE) {
|
|
2217
|
-
prev.appendData(child.data);
|
|
2218
|
-
} else {
|
|
2219
|
-
frags.push(empty(child));
|
|
2220
|
-
}
|
|
2221
|
-
} else if (child.nodeType === ELEMENT_NODE) {
|
|
2222
|
-
len = frags.length;
|
|
2223
|
-
while (len--) {
|
|
2224
|
-
child.appendChild(frags.pop());
|
|
1818
|
+
},
|
|
1819
|
+
disabled: {
|
|
1820
|
+
handler(val) {
|
|
1821
|
+
if (val) {
|
|
1822
|
+
this.editorDom.contentEditable = "false";
|
|
2225
1823
|
}
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
}
|
|
2229
|
-
}
|
|
2230
|
-
function mergeInlines(node, range) {
|
|
2231
|
-
if (node.nodeType === TEXT_NODE) {
|
|
2232
|
-
node = node.parentNode;
|
|
2233
|
-
}
|
|
2234
|
-
if (node.nodeType === ELEMENT_NODE) {
|
|
2235
|
-
var fakeRange = {
|
|
2236
|
-
startContainer: range.startContainer,
|
|
2237
|
-
startOffset: range.startOffset,
|
|
2238
|
-
endContainer: range.endContainer,
|
|
2239
|
-
endOffset: range.endOffset
|
|
2240
|
-
};
|
|
2241
|
-
_mergeInlines(node, fakeRange);
|
|
2242
|
-
range.setStart(fakeRange.startContainer, fakeRange.startOffset);
|
|
2243
|
-
range.setEnd(fakeRange.endContainer, fakeRange.endOffset);
|
|
2244
|
-
}
|
|
2245
|
-
}
|
|
2246
|
-
function mergeWithBlock(block, next, range, root) {
|
|
2247
|
-
var container = next;
|
|
2248
|
-
var parent, last, offset;
|
|
2249
|
-
while ((parent = container.parentNode) && parent !== root && parent.nodeType === ELEMENT_NODE && parent.childNodes.length === 1) {
|
|
2250
|
-
container = parent;
|
|
2251
|
-
}
|
|
2252
|
-
detach(container);
|
|
2253
|
-
offset = block.childNodes.length;
|
|
2254
|
-
last = block.lastChild;
|
|
2255
|
-
if (last && last.nodeName === "BR") {
|
|
2256
|
-
block.removeChild(last);
|
|
2257
|
-
offset -= 1;
|
|
2258
|
-
}
|
|
2259
|
-
block.appendChild(empty(next));
|
|
2260
|
-
range.setStart(block, offset);
|
|
2261
|
-
range.collapse(true);
|
|
2262
|
-
mergeInlines(block, range);
|
|
2263
|
-
if (isPresto && (last = block.lastChild) && last.nodeName === "BR") {
|
|
2264
|
-
block.removeChild(last);
|
|
2265
|
-
}
|
|
2266
|
-
}
|
|
2267
|
-
function mergeContainers(node, root) {
|
|
2268
|
-
var prev = node.previousSibling, first = node.firstChild, doc2 = node.ownerDocument, isListItem = node.nodeName === "LI", needsFix, block;
|
|
2269
|
-
if (isListItem && (!first || !/^[OU]L$/.test(first.nodeName))) {
|
|
2270
|
-
return;
|
|
2271
|
-
}
|
|
2272
|
-
if (prev && areAlike(prev, node)) {
|
|
2273
|
-
if (!isContainer(prev)) {
|
|
2274
|
-
if (isListItem) {
|
|
2275
|
-
block = createElement(doc2, "DIV");
|
|
2276
|
-
block.appendChild(empty(prev));
|
|
2277
|
-
prev.appendChild(block);
|
|
2278
|
-
} else {
|
|
2279
|
-
return;
|
|
2280
|
-
}
|
|
2281
|
-
}
|
|
2282
|
-
detach(node);
|
|
2283
|
-
needsFix = !isContainer(node);
|
|
2284
|
-
prev.appendChild(empty(node));
|
|
2285
|
-
if (needsFix) {
|
|
2286
|
-
fixContainer(prev, root);
|
|
2287
|
-
}
|
|
2288
|
-
if (first) {
|
|
2289
|
-
mergeContainers(first, root);
|
|
2290
|
-
}
|
|
2291
|
-
} else if (isListItem) {
|
|
2292
|
-
prev = createElement(doc2, "DIV");
|
|
2293
|
-
node.insertBefore(prev, first);
|
|
2294
|
-
fixCursor(prev, root);
|
|
2295
|
-
}
|
|
2296
|
-
}
|
|
2297
|
-
var getNodeBefore = function(node, offset) {
|
|
2298
|
-
var children = node.childNodes;
|
|
2299
|
-
while (offset && node.nodeType === ELEMENT_NODE) {
|
|
2300
|
-
node = children[offset - 1];
|
|
2301
|
-
children = node.childNodes;
|
|
2302
|
-
offset = children.length;
|
|
2303
|
-
}
|
|
2304
|
-
return node;
|
|
2305
|
-
};
|
|
2306
|
-
var getNodeAfter = function(node, offset) {
|
|
2307
|
-
if (node.nodeType === ELEMENT_NODE) {
|
|
2308
|
-
var children = node.childNodes;
|
|
2309
|
-
if (offset < children.length) {
|
|
2310
|
-
node = children[offset];
|
|
2311
|
-
} else {
|
|
2312
|
-
while (node && !node.nextSibling) {
|
|
2313
|
-
node = node.parentNode;
|
|
2314
|
-
}
|
|
2315
|
-
if (node) {
|
|
2316
|
-
node = node.nextSibling;
|
|
2317
|
-
}
|
|
2318
|
-
}
|
|
2319
|
-
}
|
|
2320
|
-
return node;
|
|
2321
|
-
};
|
|
2322
|
-
var insertNodeInRange = function(range, node) {
|
|
2323
|
-
var startContainer = range.startContainer, startOffset = range.startOffset, endContainer = range.endContainer, endOffset = range.endOffset, parent, children, childCount, afterSplit;
|
|
2324
|
-
if (startContainer.nodeType === TEXT_NODE) {
|
|
2325
|
-
parent = startContainer.parentNode;
|
|
2326
|
-
children = parent.childNodes;
|
|
2327
|
-
if (startOffset === startContainer.length) {
|
|
2328
|
-
startOffset = indexOf.call(children, startContainer) + 1;
|
|
2329
|
-
if (range.collapsed) {
|
|
2330
|
-
endContainer = parent;
|
|
2331
|
-
endOffset = startOffset;
|
|
2332
|
-
}
|
|
2333
|
-
} else {
|
|
2334
|
-
if (startOffset) {
|
|
2335
|
-
afterSplit = startContainer.splitText(startOffset);
|
|
2336
|
-
if (endContainer === startContainer) {
|
|
2337
|
-
endOffset -= startOffset;
|
|
2338
|
-
endContainer = afterSplit;
|
|
2339
|
-
} else if (endContainer === parent) {
|
|
2340
|
-
endOffset += 1;
|
|
2341
|
-
}
|
|
2342
|
-
startContainer = afterSplit;
|
|
2343
|
-
}
|
|
2344
|
-
startOffset = indexOf.call(children, startContainer);
|
|
2345
|
-
}
|
|
2346
|
-
startContainer = parent;
|
|
2347
|
-
} else {
|
|
2348
|
-
children = startContainer.childNodes;
|
|
2349
|
-
}
|
|
2350
|
-
childCount = children.length;
|
|
2351
|
-
if (startOffset === childCount) {
|
|
2352
|
-
startContainer.appendChild(node);
|
|
2353
|
-
} else {
|
|
2354
|
-
startContainer.insertBefore(node, children[startOffset]);
|
|
2355
|
-
}
|
|
2356
|
-
if (startContainer === endContainer) {
|
|
2357
|
-
endOffset += children.length - childCount;
|
|
2358
|
-
}
|
|
2359
|
-
range.setStart(startContainer, startOffset);
|
|
2360
|
-
range.setEnd(endContainer, endOffset);
|
|
2361
|
-
};
|
|
2362
|
-
var extractContentsOfRange = function(range, common, root) {
|
|
2363
|
-
var startContainer = range.startContainer, startOffset = range.startOffset, endContainer = range.endContainer, endOffset = range.endOffset;
|
|
2364
|
-
if (!common) {
|
|
2365
|
-
common = range.commonAncestorContainer;
|
|
2366
|
-
}
|
|
2367
|
-
if (common.nodeType === TEXT_NODE) {
|
|
2368
|
-
common = common.parentNode;
|
|
2369
|
-
}
|
|
2370
|
-
var endNode = split(endContainer, endOffset, common, root), startNode = split(startContainer, startOffset, common, root), frag = common.ownerDocument.createDocumentFragment(), next, before, after;
|
|
2371
|
-
while (startNode !== endNode) {
|
|
2372
|
-
next = startNode.nextSibling;
|
|
2373
|
-
frag.appendChild(startNode);
|
|
2374
|
-
startNode = next;
|
|
2375
|
-
}
|
|
2376
|
-
startContainer = common;
|
|
2377
|
-
startOffset = endNode ? indexOf.call(common.childNodes, endNode) : common.childNodes.length;
|
|
2378
|
-
after = common.childNodes[startOffset];
|
|
2379
|
-
before = after && after.previousSibling;
|
|
2380
|
-
if (before && before.nodeType === TEXT_NODE && after.nodeType === TEXT_NODE) {
|
|
2381
|
-
startContainer = before;
|
|
2382
|
-
startOffset = before.length;
|
|
2383
|
-
before.appendData(after.data);
|
|
2384
|
-
detach(after);
|
|
2385
|
-
}
|
|
2386
|
-
range.setStart(startContainer, startOffset);
|
|
2387
|
-
range.collapse(true);
|
|
2388
|
-
fixCursor(common, root);
|
|
2389
|
-
return frag;
|
|
2390
|
-
};
|
|
2391
|
-
var deleteContentsOfRange = function(range, root) {
|
|
2392
|
-
var startBlock = getStartBlockOfRange(range, root);
|
|
2393
|
-
var endBlock = getEndBlockOfRange(range, root);
|
|
2394
|
-
var needsMerge = startBlock !== endBlock;
|
|
2395
|
-
var frag, child;
|
|
2396
|
-
moveRangeBoundariesDownTree(range);
|
|
2397
|
-
moveRangeBoundariesUpTree(range, startBlock, endBlock, root);
|
|
2398
|
-
frag = extractContentsOfRange(range, null, root);
|
|
2399
|
-
moveRangeBoundariesDownTree(range);
|
|
2400
|
-
if (needsMerge) {
|
|
2401
|
-
endBlock = getEndBlockOfRange(range, root);
|
|
2402
|
-
if (startBlock && endBlock && startBlock !== endBlock) {
|
|
2403
|
-
mergeWithBlock(startBlock, endBlock, range, root);
|
|
2404
|
-
}
|
|
2405
|
-
}
|
|
2406
|
-
if (startBlock) {
|
|
2407
|
-
fixCursor(startBlock, root);
|
|
2408
|
-
}
|
|
2409
|
-
child = root.firstChild;
|
|
2410
|
-
if (!child || child.nodeName === "BR") {
|
|
2411
|
-
fixCursor(root, root);
|
|
2412
|
-
range.selectNodeContents(root.firstChild);
|
|
2413
|
-
} else {
|
|
2414
|
-
range.collapse(true);
|
|
2415
|
-
}
|
|
2416
|
-
return frag;
|
|
2417
|
-
};
|
|
2418
|
-
var insertTreeFragmentIntoRange = function(range, frag, root) {
|
|
2419
|
-
var node, block, blockContentsAfterSplit, stopPoint, container, offset;
|
|
2420
|
-
var replaceBlock, firstBlockInFrag, nodeAfterSplit, nodeBeforeSplit;
|
|
2421
|
-
var tempRange;
|
|
2422
|
-
fixContainer(frag, root);
|
|
2423
|
-
node = frag;
|
|
2424
|
-
while (node = getNextBlock(node, root)) {
|
|
2425
|
-
fixCursor(node, root);
|
|
2426
|
-
}
|
|
2427
|
-
if (!range.collapsed) {
|
|
2428
|
-
deleteContentsOfRange(range, root);
|
|
2429
|
-
}
|
|
2430
|
-
moveRangeBoundariesDownTree(range);
|
|
2431
|
-
range.collapse(false);
|
|
2432
|
-
stopPoint = getNearest(range.endContainer, root, "BLOCKQUOTE") || root;
|
|
2433
|
-
block = getStartBlockOfRange(range, root);
|
|
2434
|
-
firstBlockInFrag = getNextBlock(frag, frag);
|
|
2435
|
-
replaceBlock = !!block && isEmptyBlock(block);
|
|
2436
|
-
if (block && firstBlockInFrag && !replaceBlock && !getNearest(firstBlockInFrag, frag, "PRE") && !getNearest(firstBlockInFrag, frag, "TABLE")) {
|
|
2437
|
-
moveRangeBoundariesUpTree(range, block, block, root);
|
|
2438
|
-
range.collapse(true);
|
|
2439
|
-
container = range.endContainer;
|
|
2440
|
-
offset = range.endOffset;
|
|
2441
|
-
cleanupBRs(block, root, false);
|
|
2442
|
-
if (isInline(container)) {
|
|
2443
|
-
nodeAfterSplit = split(
|
|
2444
|
-
container,
|
|
2445
|
-
offset,
|
|
2446
|
-
getPreviousBlock(container, root),
|
|
2447
|
-
root
|
|
2448
|
-
);
|
|
2449
|
-
container = nodeAfterSplit.parentNode;
|
|
2450
|
-
offset = indexOf.call(container.childNodes, nodeAfterSplit);
|
|
2451
|
-
}
|
|
2452
|
-
if (offset !== getLength(container)) {
|
|
2453
|
-
blockContentsAfterSplit = root.ownerDocument.createDocumentFragment();
|
|
2454
|
-
while (node = container.childNodes[offset]) {
|
|
2455
|
-
blockContentsAfterSplit.appendChild(node);
|
|
2456
|
-
}
|
|
2457
|
-
}
|
|
2458
|
-
mergeWithBlock(container, firstBlockInFrag, range, root);
|
|
2459
|
-
offset = indexOf.call(container.parentNode.childNodes, container) + 1;
|
|
2460
|
-
container = container.parentNode;
|
|
2461
|
-
range.setEnd(container, offset);
|
|
2462
|
-
}
|
|
2463
|
-
if (getLength(frag)) {
|
|
2464
|
-
if (replaceBlock) {
|
|
2465
|
-
range.setEndBefore(block);
|
|
2466
|
-
range.collapse(false);
|
|
2467
|
-
detach(block);
|
|
2468
|
-
}
|
|
2469
|
-
moveRangeBoundariesUpTree(range, stopPoint, stopPoint, root);
|
|
2470
|
-
nodeAfterSplit = split(
|
|
2471
|
-
range.endContainer,
|
|
2472
|
-
range.endOffset,
|
|
2473
|
-
stopPoint,
|
|
2474
|
-
root
|
|
2475
|
-
);
|
|
2476
|
-
nodeBeforeSplit = nodeAfterSplit ? nodeAfterSplit.previousSibling : stopPoint.lastChild;
|
|
2477
|
-
stopPoint.insertBefore(frag, nodeAfterSplit);
|
|
2478
|
-
if (nodeAfterSplit) {
|
|
2479
|
-
range.setEndBefore(nodeAfterSplit);
|
|
2480
|
-
} else {
|
|
2481
|
-
range.setEnd(stopPoint, getLength(stopPoint));
|
|
2482
|
-
}
|
|
2483
|
-
block = getEndBlockOfRange(range, root);
|
|
2484
|
-
moveRangeBoundariesDownTree(range);
|
|
2485
|
-
container = range.endContainer;
|
|
2486
|
-
offset = range.endOffset;
|
|
2487
|
-
if (nodeAfterSplit && isContainer(nodeAfterSplit)) {
|
|
2488
|
-
mergeContainers(nodeAfterSplit, root);
|
|
2489
|
-
}
|
|
2490
|
-
nodeAfterSplit = nodeBeforeSplit && nodeBeforeSplit.nextSibling;
|
|
2491
|
-
if (nodeAfterSplit && isContainer(nodeAfterSplit)) {
|
|
2492
|
-
mergeContainers(nodeAfterSplit, root);
|
|
2493
|
-
}
|
|
2494
|
-
range.setEnd(container, offset);
|
|
2495
|
-
}
|
|
2496
|
-
if (blockContentsAfterSplit) {
|
|
2497
|
-
tempRange = range.cloneRange();
|
|
2498
|
-
mergeWithBlock(block, blockContentsAfterSplit, tempRange, root);
|
|
2499
|
-
range.setEnd(tempRange.endContainer, tempRange.endOffset);
|
|
2500
|
-
}
|
|
2501
|
-
moveRangeBoundariesDownTree(range);
|
|
2502
|
-
};
|
|
2503
|
-
var isNodeContainedInRange = function(range, node, partial) {
|
|
2504
|
-
var nodeRange = node.ownerDocument.createRange();
|
|
2505
|
-
nodeRange.selectNode(node);
|
|
2506
|
-
if (partial) {
|
|
2507
|
-
var nodeEndBeforeStart = range.compareBoundaryPoints(
|
|
2508
|
-
END_TO_START,
|
|
2509
|
-
nodeRange
|
|
2510
|
-
) > -1, nodeStartAfterEnd = range.compareBoundaryPoints(
|
|
2511
|
-
START_TO_END,
|
|
2512
|
-
nodeRange
|
|
2513
|
-
) < 1;
|
|
2514
|
-
return !nodeEndBeforeStart && !nodeStartAfterEnd;
|
|
2515
|
-
} else {
|
|
2516
|
-
var nodeStartAfterStart = range.compareBoundaryPoints(
|
|
2517
|
-
START_TO_START,
|
|
2518
|
-
nodeRange
|
|
2519
|
-
) < 1, nodeEndBeforeEnd = range.compareBoundaryPoints(
|
|
2520
|
-
END_TO_END,
|
|
2521
|
-
nodeRange
|
|
2522
|
-
) > -1;
|
|
2523
|
-
return nodeStartAfterStart && nodeEndBeforeEnd;
|
|
2524
|
-
}
|
|
2525
|
-
};
|
|
2526
|
-
var moveRangeBoundariesDownTree = function(range) {
|
|
2527
|
-
var startContainer = range.startContainer, startOffset = range.startOffset, endContainer = range.endContainer, endOffset = range.endOffset, maySkipBR = true, child;
|
|
2528
|
-
while (startContainer.nodeType !== TEXT_NODE) {
|
|
2529
|
-
child = startContainer.childNodes[startOffset];
|
|
2530
|
-
if (!child || isLeaf(child)) {
|
|
2531
|
-
break;
|
|
2532
|
-
}
|
|
2533
|
-
startContainer = child;
|
|
2534
|
-
startOffset = 0;
|
|
2535
|
-
}
|
|
2536
|
-
if (endOffset) {
|
|
2537
|
-
while (endContainer.nodeType !== TEXT_NODE) {
|
|
2538
|
-
child = endContainer.childNodes[endOffset - 1];
|
|
2539
|
-
if (!child || isLeaf(child)) {
|
|
2540
|
-
if (maySkipBR && child && child.nodeName === "BR") {
|
|
2541
|
-
endOffset -= 1;
|
|
2542
|
-
maySkipBR = false;
|
|
2543
|
-
continue;
|
|
2544
|
-
}
|
|
2545
|
-
break;
|
|
2546
|
-
}
|
|
2547
|
-
endContainer = child;
|
|
2548
|
-
endOffset = getLength(endContainer);
|
|
2549
|
-
}
|
|
2550
|
-
} else {
|
|
2551
|
-
while (endContainer.nodeType !== TEXT_NODE) {
|
|
2552
|
-
child = endContainer.firstChild;
|
|
2553
|
-
if (!child || isLeaf(child)) {
|
|
2554
|
-
break;
|
|
2555
|
-
}
|
|
2556
|
-
endContainer = child;
|
|
2557
|
-
}
|
|
2558
|
-
}
|
|
2559
|
-
if (range.collapsed) {
|
|
2560
|
-
range.setStart(endContainer, endOffset);
|
|
2561
|
-
range.setEnd(startContainer, startOffset);
|
|
2562
|
-
} else {
|
|
2563
|
-
range.setStart(startContainer, startOffset);
|
|
2564
|
-
range.setEnd(endContainer, endOffset);
|
|
2565
|
-
}
|
|
2566
|
-
};
|
|
2567
|
-
var moveRangeBoundariesUpTree = function(range, startMax, endMax, root) {
|
|
2568
|
-
var startContainer = range.startContainer;
|
|
2569
|
-
var startOffset = range.startOffset;
|
|
2570
|
-
var endContainer = range.endContainer;
|
|
2571
|
-
var endOffset = range.endOffset;
|
|
2572
|
-
var maySkipBR = true;
|
|
2573
|
-
var parent;
|
|
2574
|
-
if (!startMax) {
|
|
2575
|
-
startMax = range.commonAncestorContainer;
|
|
2576
|
-
}
|
|
2577
|
-
if (!endMax) {
|
|
2578
|
-
endMax = startMax;
|
|
2579
|
-
}
|
|
2580
|
-
while (!startOffset && startContainer !== startMax && startContainer !== root) {
|
|
2581
|
-
parent = startContainer.parentNode;
|
|
2582
|
-
startOffset = indexOf.call(parent.childNodes, startContainer);
|
|
2583
|
-
startContainer = parent;
|
|
2584
|
-
}
|
|
2585
|
-
while (true) {
|
|
2586
|
-
if (maySkipBR && endContainer.nodeType !== TEXT_NODE && endContainer.childNodes[endOffset] && endContainer.childNodes[endOffset].nodeName === "BR") {
|
|
2587
|
-
endOffset += 1;
|
|
2588
|
-
maySkipBR = false;
|
|
2589
|
-
}
|
|
2590
|
-
if (endContainer === endMax || endContainer === root || endOffset !== getLength(endContainer)) {
|
|
2591
|
-
break;
|
|
2592
|
-
}
|
|
2593
|
-
parent = endContainer.parentNode;
|
|
2594
|
-
endOffset = indexOf.call(parent.childNodes, endContainer) + 1;
|
|
2595
|
-
endContainer = parent;
|
|
2596
|
-
}
|
|
2597
|
-
range.setStart(startContainer, startOffset);
|
|
2598
|
-
range.setEnd(endContainer, endOffset);
|
|
2599
|
-
};
|
|
2600
|
-
var getStartBlockOfRange = function(range, root) {
|
|
2601
|
-
var container = range.startContainer, block;
|
|
2602
|
-
if (isInline(container)) {
|
|
2603
|
-
block = getPreviousBlock(container, root);
|
|
2604
|
-
} else if (container !== root && isBlock(container)) {
|
|
2605
|
-
block = container;
|
|
2606
|
-
} else {
|
|
2607
|
-
block = getNodeBefore(container, range.startOffset);
|
|
2608
|
-
block = getNextBlock(block, root);
|
|
2609
|
-
}
|
|
2610
|
-
return block && isNodeContainedInRange(range, block, true) ? block : null;
|
|
2611
|
-
};
|
|
2612
|
-
var getEndBlockOfRange = function(range, root) {
|
|
2613
|
-
var container = range.endContainer, block, child;
|
|
2614
|
-
if (isInline(container)) {
|
|
2615
|
-
block = getPreviousBlock(container, root);
|
|
2616
|
-
} else if (container !== root && isBlock(container)) {
|
|
2617
|
-
block = container;
|
|
2618
|
-
} else {
|
|
2619
|
-
block = getNodeAfter(container, range.endOffset);
|
|
2620
|
-
if (!block || !isOrContains(root, block)) {
|
|
2621
|
-
block = root;
|
|
2622
|
-
while (child = block.lastChild) {
|
|
2623
|
-
block = child;
|
|
2624
|
-
}
|
|
2625
|
-
}
|
|
2626
|
-
block = getPreviousBlock(block, root);
|
|
2627
|
-
}
|
|
2628
|
-
return block && isNodeContainedInRange(range, block, true) ? block : null;
|
|
2629
|
-
};
|
|
2630
|
-
var contentWalker = new TreeWalker(
|
|
2631
|
-
null,
|
|
2632
|
-
SHOW_TEXT | SHOW_ELEMENT,
|
|
2633
|
-
function(node) {
|
|
2634
|
-
return node.nodeType === TEXT_NODE ? notWS.test(node.data) : node.nodeName === "IMG";
|
|
2635
|
-
}
|
|
2636
|
-
);
|
|
2637
|
-
var rangeDoesStartAtBlockBoundary = function(range, root) {
|
|
2638
|
-
var startContainer = range.startContainer;
|
|
2639
|
-
var startOffset = range.startOffset;
|
|
2640
|
-
var nodeAfterCursor;
|
|
2641
|
-
contentWalker.root = null;
|
|
2642
|
-
if (startContainer.nodeType === TEXT_NODE) {
|
|
2643
|
-
if (startOffset) {
|
|
2644
|
-
return false;
|
|
2645
|
-
}
|
|
2646
|
-
nodeAfterCursor = startContainer;
|
|
2647
|
-
} else {
|
|
2648
|
-
nodeAfterCursor = getNodeAfter(startContainer, startOffset);
|
|
2649
|
-
if (nodeAfterCursor && !isOrContains(root, nodeAfterCursor)) {
|
|
2650
|
-
nodeAfterCursor = null;
|
|
2651
|
-
}
|
|
2652
|
-
if (!nodeAfterCursor) {
|
|
2653
|
-
nodeAfterCursor = getNodeBefore(startContainer, startOffset);
|
|
2654
|
-
if (nodeAfterCursor.nodeType === TEXT_NODE && nodeAfterCursor.length) {
|
|
2655
|
-
return false;
|
|
2656
|
-
}
|
|
2657
|
-
}
|
|
2658
|
-
}
|
|
2659
|
-
contentWalker.currentNode = nodeAfterCursor;
|
|
2660
|
-
contentWalker.root = getStartBlockOfRange(range, root);
|
|
2661
|
-
return !contentWalker.previousNode();
|
|
2662
|
-
};
|
|
2663
|
-
var rangeDoesEndAtBlockBoundary = function(range, root) {
|
|
2664
|
-
var endContainer = range.endContainer, endOffset = range.endOffset, length;
|
|
2665
|
-
contentWalker.root = null;
|
|
2666
|
-
if (endContainer.nodeType === TEXT_NODE) {
|
|
2667
|
-
length = endContainer.data.length;
|
|
2668
|
-
if (length && endOffset < length) {
|
|
2669
|
-
return false;
|
|
2670
|
-
}
|
|
2671
|
-
contentWalker.currentNode = endContainer;
|
|
2672
|
-
} else {
|
|
2673
|
-
contentWalker.currentNode = getNodeBefore(endContainer, endOffset);
|
|
2674
|
-
}
|
|
2675
|
-
contentWalker.root = getEndBlockOfRange(range, root);
|
|
2676
|
-
return !contentWalker.nextNode();
|
|
2677
|
-
};
|
|
2678
|
-
var expandRangeToBlockBoundaries = function(range, root) {
|
|
2679
|
-
var start = getStartBlockOfRange(range, root), end = getEndBlockOfRange(range, root), parent;
|
|
2680
|
-
if (start && end) {
|
|
2681
|
-
parent = start.parentNode;
|
|
2682
|
-
range.setStart(parent, indexOf.call(parent.childNodes, start));
|
|
2683
|
-
parent = end.parentNode;
|
|
2684
|
-
range.setEnd(parent, indexOf.call(parent.childNodes, end) + 1);
|
|
2685
|
-
}
|
|
2686
|
-
};
|
|
2687
|
-
var keys = {
|
|
2688
|
-
8: "backspace",
|
|
2689
|
-
9: "tab",
|
|
2690
|
-
13: "enter",
|
|
2691
|
-
32: "space",
|
|
2692
|
-
33: "pageup",
|
|
2693
|
-
34: "pagedown",
|
|
2694
|
-
37: "left",
|
|
2695
|
-
39: "right",
|
|
2696
|
-
46: "delete",
|
|
2697
|
-
219: "[",
|
|
2698
|
-
221: "]"
|
|
2699
|
-
};
|
|
2700
|
-
var onKey = function(event) {
|
|
2701
|
-
if (event.target.classList.contains("desc-input"))
|
|
2702
|
-
return;
|
|
2703
|
-
var code = event.keyCode, key = keys[code], modifiers = "", range = this.getSelection();
|
|
2704
|
-
if (event.defaultPrevented) {
|
|
2705
|
-
return;
|
|
2706
|
-
}
|
|
2707
|
-
if (!key) {
|
|
2708
|
-
key = String.fromCharCode(code).toLowerCase();
|
|
2709
|
-
if (!/^[A-Za-z0-9]$/.test(key)) {
|
|
2710
|
-
key = "";
|
|
2711
|
-
}
|
|
2712
|
-
}
|
|
2713
|
-
if (isPresto && event.which === 46) {
|
|
2714
|
-
key = ".";
|
|
2715
|
-
}
|
|
2716
|
-
if (code > 111 && code < 124) {
|
|
2717
|
-
key = "f" + (code - 111);
|
|
2718
|
-
}
|
|
2719
|
-
if (key !== "backspace" && key !== "delete") {
|
|
2720
|
-
if (event.altKey) {
|
|
2721
|
-
modifiers += "alt-";
|
|
2722
|
-
}
|
|
2723
|
-
if (event.ctrlKey) {
|
|
2724
|
-
modifiers += "ctrl-";
|
|
2725
|
-
}
|
|
2726
|
-
if (event.metaKey) {
|
|
2727
|
-
modifiers += "meta-";
|
|
2728
|
-
}
|
|
2729
|
-
}
|
|
2730
|
-
if (event.shiftKey) {
|
|
2731
|
-
modifiers += "shift-";
|
|
2732
|
-
}
|
|
2733
|
-
key = modifiers + key;
|
|
2734
|
-
if (this._keyHandlers[key]) {
|
|
2735
|
-
this._keyHandlers[key](this, event, range);
|
|
2736
|
-
} else if (!range.collapsed && !event.ctrlKey && !event.metaKey && (event.key || key).length === 1) {
|
|
2737
|
-
this.saveUndoState(range);
|
|
2738
|
-
deleteContentsOfRange(range, this._root);
|
|
2739
|
-
this._ensureBottomLine();
|
|
2740
|
-
this.setSelection(range);
|
|
2741
|
-
this._updatePath(range, true);
|
|
2742
|
-
}
|
|
2743
|
-
};
|
|
2744
|
-
var mapKeyTo = function(method) {
|
|
2745
|
-
return function(self2, event) {
|
|
2746
|
-
event.preventDefault();
|
|
2747
|
-
self2[method]();
|
|
2748
|
-
};
|
|
2749
|
-
};
|
|
2750
|
-
var mapKeyToFormat = function(tag, remove) {
|
|
2751
|
-
remove = remove || null;
|
|
2752
|
-
return function(self2, event) {
|
|
2753
|
-
event.preventDefault();
|
|
2754
|
-
var range = self2.getSelection();
|
|
2755
|
-
if (self2.hasFormat(tag, null, range)) {
|
|
2756
|
-
self2.changeFormat(null, { tag }, range);
|
|
2757
|
-
} else {
|
|
2758
|
-
self2.changeFormat({ tag }, remove, range);
|
|
2759
|
-
}
|
|
2760
|
-
};
|
|
2761
|
-
};
|
|
2762
|
-
var afterDelete = function(self2, range) {
|
|
2763
|
-
try {
|
|
2764
|
-
if (!range) {
|
|
2765
|
-
range = self2.getSelection();
|
|
2766
|
-
}
|
|
2767
|
-
var node = range.startContainer, parent;
|
|
2768
|
-
if (node.nodeType === TEXT_NODE) {
|
|
2769
|
-
node = node.parentNode;
|
|
2770
|
-
}
|
|
2771
|
-
parent = node;
|
|
2772
|
-
while (isInline(parent) && (!parent.textContent || parent.textContent === ZWS)) {
|
|
2773
|
-
node = parent;
|
|
2774
|
-
parent = node.parentNode;
|
|
2775
|
-
}
|
|
2776
|
-
if (node !== parent) {
|
|
2777
|
-
range.setStart(
|
|
2778
|
-
parent,
|
|
2779
|
-
indexOf.call(parent.childNodes, node)
|
|
2780
|
-
);
|
|
2781
|
-
range.collapse(true);
|
|
2782
|
-
parent.removeChild(node);
|
|
2783
|
-
if (!isBlock(parent)) {
|
|
2784
|
-
parent = getPreviousBlock(parent, self2._root);
|
|
2785
|
-
}
|
|
2786
|
-
fixCursor(parent, self2._root);
|
|
2787
|
-
moveRangeBoundariesDownTree(range);
|
|
2788
|
-
}
|
|
2789
|
-
if (node === self2._root && (node = node.firstChild) && node.nodeName === "BR") {
|
|
2790
|
-
detach(node);
|
|
2791
|
-
}
|
|
2792
|
-
self2._ensureBottomLine();
|
|
2793
|
-
self2.setSelection(range);
|
|
2794
|
-
self2._updatePath(range, true);
|
|
2795
|
-
} catch (error) {
|
|
2796
|
-
self2.didError(error);
|
|
2797
|
-
}
|
|
2798
|
-
};
|
|
2799
|
-
var keyHandlers = {
|
|
2800
|
-
enter: function(self2, event, range) {
|
|
2801
|
-
var root = self2._root;
|
|
2802
|
-
var block, parent, nodeAfterSplit;
|
|
2803
|
-
event.preventDefault();
|
|
2804
|
-
self2._recordUndoState(range);
|
|
2805
|
-
addLinks(range.startContainer, root, self2);
|
|
2806
|
-
self2._removeZWS();
|
|
2807
|
-
self2._getRangeAndRemoveBookmark(range);
|
|
2808
|
-
if (!range.collapsed) {
|
|
2809
|
-
deleteContentsOfRange(range, root);
|
|
2810
|
-
}
|
|
2811
|
-
block = getStartBlockOfRange(range, root);
|
|
2812
|
-
if (!block || /^T[HD]$/.test(block.nodeName)) {
|
|
2813
|
-
parent = getNearest(range.endContainer, root, "A");
|
|
2814
|
-
if (parent) {
|
|
2815
|
-
parent = parent.parentNode;
|
|
2816
|
-
moveRangeBoundariesUpTree(range, parent, parent, root);
|
|
2817
|
-
range.collapse(false);
|
|
2818
|
-
}
|
|
2819
|
-
insertNodeInRange(range, self2.createElement("BR"));
|
|
2820
|
-
range.collapse(false);
|
|
2821
|
-
self2.setSelection(range);
|
|
2822
|
-
self2._updatePath(range, true);
|
|
2823
|
-
return;
|
|
2824
|
-
}
|
|
2825
|
-
if (parent = getNearest(block, root, "LI")) {
|
|
2826
|
-
block = parent;
|
|
2827
|
-
}
|
|
2828
|
-
if (isEmptyBlock(block)) {
|
|
2829
|
-
if (getNearest(block, root, "UL") || getNearest(block, root, "OL")) {
|
|
2830
|
-
return self2.decreaseListLevel(range);
|
|
2831
|
-
} else if (getNearest(block, root, "BLOCKQUOTE")) {
|
|
2832
|
-
return self2.modifyBlocks(removeBlockQuote, range);
|
|
2833
|
-
}
|
|
2834
|
-
}
|
|
2835
|
-
nodeAfterSplit = splitBlock(
|
|
2836
|
-
self2,
|
|
2837
|
-
block,
|
|
2838
|
-
range.startContainer,
|
|
2839
|
-
range.startOffset
|
|
2840
|
-
);
|
|
2841
|
-
removeZWS(block);
|
|
2842
|
-
removeEmptyInlines(block);
|
|
2843
|
-
fixCursor(block, root);
|
|
2844
|
-
while (nodeAfterSplit.nodeType === ELEMENT_NODE) {
|
|
2845
|
-
var child = nodeAfterSplit.firstChild, next;
|
|
2846
|
-
if (nodeAfterSplit.nodeName === "A" && (!nodeAfterSplit.textContent || nodeAfterSplit.textContent === ZWS)) {
|
|
2847
|
-
child = self2._doc.createTextNode("");
|
|
2848
|
-
replaceWith(nodeAfterSplit, child);
|
|
2849
|
-
nodeAfterSplit = child;
|
|
2850
|
-
break;
|
|
2851
|
-
}
|
|
2852
|
-
while (child && child.nodeType === TEXT_NODE && !child.data) {
|
|
2853
|
-
next = child.nextSibling;
|
|
2854
|
-
if (!next || next.nodeName === "BR") {
|
|
2855
|
-
break;
|
|
2856
|
-
}
|
|
2857
|
-
detach(child);
|
|
2858
|
-
child = next;
|
|
2859
|
-
}
|
|
2860
|
-
if (!child || child.nodeName === "BR" || child.nodeType === TEXT_NODE && !isPresto) {
|
|
2861
|
-
break;
|
|
2862
|
-
}
|
|
2863
|
-
nodeAfterSplit = child;
|
|
2864
|
-
}
|
|
2865
|
-
range = self2.createRange(nodeAfterSplit, 0);
|
|
2866
|
-
self2.setSelection(range);
|
|
2867
|
-
self2._updatePath(range, true);
|
|
2868
|
-
},
|
|
2869
|
-
backspace: function(self2, event, range) {
|
|
2870
|
-
var root = self2._root;
|
|
2871
|
-
self2._removeZWS();
|
|
2872
|
-
self2.saveUndoState(range);
|
|
2873
|
-
if (!range.collapsed) {
|
|
2874
|
-
event.preventDefault();
|
|
2875
|
-
deleteContentsOfRange(range, root);
|
|
2876
|
-
afterDelete(self2, range);
|
|
2877
|
-
} else if (rangeDoesStartAtBlockBoundary(range, root)) {
|
|
2878
|
-
event.preventDefault();
|
|
2879
|
-
var current = getStartBlockOfRange(range, root);
|
|
2880
|
-
var previous;
|
|
2881
|
-
if (!current) {
|
|
2882
|
-
return;
|
|
2883
|
-
}
|
|
2884
|
-
fixContainer(current.parentNode, root);
|
|
2885
|
-
previous = getPreviousBlock(current, root);
|
|
2886
|
-
if (previous) {
|
|
2887
|
-
if (!previous.isContentEditable) {
|
|
2888
|
-
detach(previous);
|
|
2889
|
-
return;
|
|
2890
|
-
}
|
|
2891
|
-
mergeWithBlock(previous, current, range, root);
|
|
2892
|
-
current = previous.parentNode;
|
|
2893
|
-
while (current !== root && !current.nextSibling) {
|
|
2894
|
-
current = current.parentNode;
|
|
2895
|
-
}
|
|
2896
|
-
if (current !== root && (current = current.nextSibling)) {
|
|
2897
|
-
mergeContainers(current, root);
|
|
2898
|
-
}
|
|
2899
|
-
self2.setSelection(range);
|
|
2900
|
-
} else if (current) {
|
|
2901
|
-
if (getNearest(current, root, "UL") || getNearest(current, root, "OL")) {
|
|
2902
|
-
return self2.decreaseListLevel(range);
|
|
2903
|
-
} else if (getNearest(current, root, "BLOCKQUOTE")) {
|
|
2904
|
-
return self2.modifyBlocks(decreaseBlockQuoteLevel, range);
|
|
2905
|
-
}
|
|
2906
|
-
self2.setSelection(range);
|
|
2907
|
-
self2._updatePath(range, true);
|
|
2908
|
-
}
|
|
2909
|
-
} else {
|
|
2910
|
-
self2.setSelection(range);
|
|
2911
|
-
setTimeout(function() {
|
|
2912
|
-
afterDelete(self2);
|
|
2913
|
-
}, 0);
|
|
2914
|
-
}
|
|
2915
|
-
},
|
|
2916
|
-
"delete": function(self2, event, range) {
|
|
2917
|
-
var root = self2._root;
|
|
2918
|
-
var current, next, originalRange, cursorContainer, cursorOffset, nodeAfterCursor;
|
|
2919
|
-
self2._removeZWS();
|
|
2920
|
-
self2.saveUndoState(range);
|
|
2921
|
-
if (!range.collapsed) {
|
|
2922
|
-
event.preventDefault();
|
|
2923
|
-
deleteContentsOfRange(range, root);
|
|
2924
|
-
afterDelete(self2, range);
|
|
2925
|
-
} else if (rangeDoesEndAtBlockBoundary(range, root)) {
|
|
2926
|
-
event.preventDefault();
|
|
2927
|
-
current = getStartBlockOfRange(range, root);
|
|
2928
|
-
if (!current) {
|
|
2929
|
-
return;
|
|
2930
|
-
}
|
|
2931
|
-
fixContainer(current.parentNode, root);
|
|
2932
|
-
next = getNextBlock(current, root);
|
|
2933
|
-
if (next) {
|
|
2934
|
-
if (!next.isContentEditable) {
|
|
2935
|
-
detach(next);
|
|
2936
|
-
return;
|
|
2937
|
-
}
|
|
2938
|
-
mergeWithBlock(current, next, range, root);
|
|
2939
|
-
next = current.parentNode;
|
|
2940
|
-
while (next !== root && !next.nextSibling) {
|
|
2941
|
-
next = next.parentNode;
|
|
2942
|
-
}
|
|
2943
|
-
if (next !== root && (next = next.nextSibling)) {
|
|
2944
|
-
mergeContainers(next, root);
|
|
2945
|
-
}
|
|
2946
|
-
self2.setSelection(range);
|
|
2947
|
-
self2._updatePath(range, true);
|
|
2948
|
-
}
|
|
2949
|
-
} else {
|
|
2950
|
-
originalRange = range.cloneRange();
|
|
2951
|
-
moveRangeBoundariesUpTree(range, root, root, root);
|
|
2952
|
-
cursorContainer = range.endContainer;
|
|
2953
|
-
cursorOffset = range.endOffset;
|
|
2954
|
-
if (cursorContainer.nodeType === ELEMENT_NODE) {
|
|
2955
|
-
nodeAfterCursor = cursorContainer.childNodes[cursorOffset];
|
|
2956
|
-
if (nodeAfterCursor && nodeAfterCursor.nodeName === "IMG") {
|
|
2957
|
-
event.preventDefault();
|
|
2958
|
-
detach(nodeAfterCursor);
|
|
2959
|
-
moveRangeBoundariesDownTree(range);
|
|
2960
|
-
afterDelete(self2, range);
|
|
2961
|
-
return;
|
|
2962
|
-
}
|
|
2963
|
-
}
|
|
2964
|
-
self2.setSelection(originalRange);
|
|
2965
|
-
setTimeout(function() {
|
|
2966
|
-
afterDelete(self2);
|
|
2967
|
-
}, 0);
|
|
2968
|
-
}
|
|
2969
|
-
},
|
|
2970
|
-
tab: function(self2, event, range) {
|
|
2971
|
-
var root = self2._root;
|
|
2972
|
-
var node, parent;
|
|
2973
|
-
self2._removeZWS();
|
|
2974
|
-
if (range.collapsed && rangeDoesStartAtBlockBoundary(range, root)) {
|
|
2975
|
-
node = getStartBlockOfRange(range, root);
|
|
2976
|
-
while (parent = node.parentNode) {
|
|
2977
|
-
if (parent.nodeName === "UL" || parent.nodeName === "OL") {
|
|
2978
|
-
event.preventDefault();
|
|
2979
|
-
self2.increaseListLevel(range);
|
|
2980
|
-
break;
|
|
2981
|
-
}
|
|
2982
|
-
node = parent;
|
|
2983
|
-
}
|
|
2984
|
-
}
|
|
2985
|
-
},
|
|
2986
|
-
"shift-tab": function(self2, event, range) {
|
|
2987
|
-
var root = self2._root;
|
|
2988
|
-
var node;
|
|
2989
|
-
self2._removeZWS();
|
|
2990
|
-
if (range.collapsed && rangeDoesStartAtBlockBoundary(range, root)) {
|
|
2991
|
-
node = range.startContainer;
|
|
2992
|
-
if (getNearest(node, root, "UL") || getNearest(node, root, "OL")) {
|
|
2993
|
-
event.preventDefault();
|
|
2994
|
-
self2.decreaseListLevel(range);
|
|
2995
|
-
}
|
|
2996
|
-
}
|
|
2997
|
-
},
|
|
2998
|
-
space: function(self2, _, range) {
|
|
2999
|
-
var node, parent;
|
|
3000
|
-
self2._recordUndoState(range);
|
|
3001
|
-
addLinks(range.startContainer, self2._root, self2);
|
|
3002
|
-
self2._getRangeAndRemoveBookmark(range);
|
|
3003
|
-
node = range.endContainer;
|
|
3004
|
-
parent = node.parentNode;
|
|
3005
|
-
if (range.collapsed && range.endOffset === getLength(node)) {
|
|
3006
|
-
if (node.nodeName === "A") {
|
|
3007
|
-
range.setStartAfter(node);
|
|
3008
|
-
} else if (parent.nodeName === "A" && !node.nextSibling) {
|
|
3009
|
-
range.setStartAfter(parent);
|
|
3010
|
-
}
|
|
3011
|
-
}
|
|
3012
|
-
if (!range.collapsed) {
|
|
3013
|
-
deleteContentsOfRange(range, self2._root);
|
|
3014
|
-
self2._ensureBottomLine();
|
|
3015
|
-
self2.setSelection(range);
|
|
3016
|
-
self2._updatePath(range, true);
|
|
3017
|
-
}
|
|
3018
|
-
self2.setSelection(range);
|
|
3019
|
-
},
|
|
3020
|
-
left: function(self2) {
|
|
3021
|
-
self2._removeZWS();
|
|
3022
|
-
},
|
|
3023
|
-
right: function(self2) {
|
|
3024
|
-
self2._removeZWS();
|
|
3025
|
-
}
|
|
3026
|
-
};
|
|
3027
|
-
if (isMac && isGecko) {
|
|
3028
|
-
keyHandlers["meta-left"] = function(self2, event) {
|
|
3029
|
-
event.preventDefault();
|
|
3030
|
-
var sel = getWindowSelection(self2);
|
|
3031
|
-
if (sel && sel.modify) {
|
|
3032
|
-
sel.modify("move", "backward", "lineboundary");
|
|
3033
|
-
}
|
|
3034
|
-
};
|
|
3035
|
-
keyHandlers["meta-right"] = function(self2, event) {
|
|
3036
|
-
event.preventDefault();
|
|
3037
|
-
var sel = getWindowSelection(self2);
|
|
3038
|
-
if (sel && sel.modify) {
|
|
3039
|
-
sel.modify("move", "forward", "lineboundary");
|
|
3040
|
-
}
|
|
3041
|
-
};
|
|
3042
|
-
}
|
|
3043
|
-
if (!isMac) {
|
|
3044
|
-
keyHandlers.pageup = function(self2) {
|
|
3045
|
-
self2.moveCursorToStart();
|
|
3046
|
-
};
|
|
3047
|
-
keyHandlers.pagedown = function(self2) {
|
|
3048
|
-
self2.moveCursorToEnd();
|
|
3049
|
-
};
|
|
3050
|
-
}
|
|
3051
|
-
keyHandlers[ctrlKey + "b"] = mapKeyToFormat("B");
|
|
3052
|
-
keyHandlers[ctrlKey + "i"] = mapKeyToFormat("I");
|
|
3053
|
-
keyHandlers[ctrlKey + "u"] = mapKeyToFormat("U");
|
|
3054
|
-
keyHandlers[ctrlKey + "shift-7"] = mapKeyToFormat("S");
|
|
3055
|
-
keyHandlers[ctrlKey + "shift-5"] = mapKeyToFormat("SUB", { tag: "SUP" });
|
|
3056
|
-
keyHandlers[ctrlKey + "shift-6"] = mapKeyToFormat("SUP", { tag: "SUB" });
|
|
3057
|
-
keyHandlers[ctrlKey + "shift-8"] = mapKeyTo("makeUnorderedList");
|
|
3058
|
-
keyHandlers[ctrlKey + "shift-9"] = mapKeyTo("makeOrderedList");
|
|
3059
|
-
keyHandlers[ctrlKey + "["] = mapKeyTo("decreaseQuoteLevel");
|
|
3060
|
-
keyHandlers[ctrlKey + "]"] = mapKeyTo("increaseQuoteLevel");
|
|
3061
|
-
keyHandlers[ctrlKey + "y"] = mapKeyTo("redo");
|
|
3062
|
-
keyHandlers[ctrlKey + "z"] = mapKeyTo("undo");
|
|
3063
|
-
keyHandlers[ctrlKey + "shift-z"] = mapKeyTo("redo");
|
|
3064
|
-
var fontSizes = {
|
|
3065
|
-
1: 10,
|
|
3066
|
-
2: 13,
|
|
3067
|
-
3: 16,
|
|
3068
|
-
4: 18,
|
|
3069
|
-
5: 24,
|
|
3070
|
-
6: 32,
|
|
3071
|
-
7: 48
|
|
3072
|
-
};
|
|
3073
|
-
var styleToSemantic = {
|
|
3074
|
-
backgroundColor: {
|
|
3075
|
-
regexp: notWS,
|
|
3076
|
-
replace: function(doc2, colour) {
|
|
3077
|
-
return createElement(doc2, "SPAN", {
|
|
3078
|
-
"class": HIGHLIGHT_CLASS,
|
|
3079
|
-
style: "background-color:" + colour
|
|
3080
|
-
});
|
|
3081
|
-
}
|
|
3082
|
-
},
|
|
3083
|
-
color: {
|
|
3084
|
-
regexp: notWS,
|
|
3085
|
-
replace: function(doc2, colour) {
|
|
3086
|
-
return createElement(doc2, "SPAN", {
|
|
3087
|
-
"class": COLOUR_CLASS,
|
|
3088
|
-
style: "color:" + colour
|
|
3089
|
-
});
|
|
3090
|
-
}
|
|
3091
|
-
},
|
|
3092
|
-
fontWeight: {
|
|
3093
|
-
regexp: /^bold|^700/i,
|
|
3094
|
-
replace: function(doc2) {
|
|
3095
|
-
return createElement(doc2, "B");
|
|
3096
|
-
}
|
|
3097
|
-
},
|
|
3098
|
-
fontStyle: {
|
|
3099
|
-
regexp: /^italic/i,
|
|
3100
|
-
replace: function(doc2) {
|
|
3101
|
-
return createElement(doc2, "I");
|
|
3102
|
-
}
|
|
3103
|
-
},
|
|
3104
|
-
fontFamily: {
|
|
3105
|
-
regexp: notWS,
|
|
3106
|
-
replace: function(doc2, family) {
|
|
3107
|
-
return createElement(doc2, "SPAN", {
|
|
3108
|
-
"class": FONT_FAMILY_CLASS,
|
|
3109
|
-
style: "font-family:" + family
|
|
3110
|
-
});
|
|
3111
|
-
}
|
|
3112
|
-
},
|
|
3113
|
-
fontSize: {
|
|
3114
|
-
regexp: notWS,
|
|
3115
|
-
replace: function(doc2, size) {
|
|
3116
|
-
return createElement(doc2, "SPAN", {
|
|
3117
|
-
"class": FONT_SIZE_CLASS,
|
|
3118
|
-
style: "font-size:" + size
|
|
3119
|
-
});
|
|
3120
|
-
}
|
|
3121
|
-
},
|
|
3122
|
-
textDecoration: {
|
|
3123
|
-
regexp: /^underline/i,
|
|
3124
|
-
replace: function(doc2) {
|
|
3125
|
-
return createElement(doc2, "U");
|
|
3126
|
-
}
|
|
3127
|
-
}
|
|
3128
|
-
};
|
|
3129
|
-
var replaceWithTag = function(tag) {
|
|
3130
|
-
return function(node, parent) {
|
|
3131
|
-
var el = createElement(node.ownerDocument, tag);
|
|
3132
|
-
parent.replaceChild(el, node);
|
|
3133
|
-
el.appendChild(empty(node));
|
|
3134
|
-
return el;
|
|
3135
|
-
};
|
|
3136
|
-
};
|
|
3137
|
-
var replaceStyles = function(node, parent) {
|
|
3138
|
-
var style = node.style;
|
|
3139
|
-
var doc2 = node.ownerDocument;
|
|
3140
|
-
var attr, converter, css, newTreeBottom, newTreeTop, el;
|
|
3141
|
-
for (attr in styleToSemantic) {
|
|
3142
|
-
converter = styleToSemantic[attr];
|
|
3143
|
-
css = style[attr];
|
|
3144
|
-
if (css && converter.regexp.test(css)) {
|
|
3145
|
-
el = converter.replace(doc2, css);
|
|
3146
|
-
if (!newTreeTop) {
|
|
3147
|
-
newTreeTop = el;
|
|
3148
|
-
}
|
|
3149
|
-
if (newTreeBottom) {
|
|
3150
|
-
newTreeBottom.appendChild(el);
|
|
3151
|
-
}
|
|
3152
|
-
newTreeBottom = el;
|
|
3153
|
-
node.style[attr] = "";
|
|
3154
|
-
}
|
|
3155
|
-
}
|
|
3156
|
-
if (newTreeTop) {
|
|
3157
|
-
newTreeBottom.appendChild(empty(node));
|
|
3158
|
-
if (node.nodeName === "SPAN") {
|
|
3159
|
-
parent.replaceChild(newTreeTop, node);
|
|
3160
|
-
} else {
|
|
3161
|
-
node.appendChild(newTreeTop);
|
|
3162
|
-
}
|
|
3163
|
-
}
|
|
3164
|
-
return newTreeBottom || node;
|
|
3165
|
-
};
|
|
3166
|
-
var stylesRewriters = {
|
|
3167
|
-
P: replaceStyles,
|
|
3168
|
-
SPAN: replaceStyles,
|
|
3169
|
-
STRONG: replaceWithTag("B"),
|
|
3170
|
-
EM: replaceWithTag("I"),
|
|
3171
|
-
INS: replaceWithTag("U"),
|
|
3172
|
-
STRIKE: replaceWithTag("S"),
|
|
3173
|
-
FONT: function(node, parent) {
|
|
3174
|
-
var face = node.face, size = node.size, colour = node.color, doc2 = node.ownerDocument, fontSpan, sizeSpan, colourSpan, newTreeBottom, newTreeTop;
|
|
3175
|
-
if (face) {
|
|
3176
|
-
fontSpan = createElement(doc2, "SPAN", {
|
|
3177
|
-
"class": FONT_FAMILY_CLASS,
|
|
3178
|
-
style: "font-family:" + face
|
|
3179
|
-
});
|
|
3180
|
-
newTreeTop = fontSpan;
|
|
3181
|
-
newTreeBottom = fontSpan;
|
|
3182
|
-
}
|
|
3183
|
-
if (size) {
|
|
3184
|
-
sizeSpan = createElement(doc2, "SPAN", {
|
|
3185
|
-
"class": FONT_SIZE_CLASS,
|
|
3186
|
-
style: "font-size:" + fontSizes[size] + "px"
|
|
3187
|
-
});
|
|
3188
|
-
if (!newTreeTop) {
|
|
3189
|
-
newTreeTop = sizeSpan;
|
|
3190
|
-
}
|
|
3191
|
-
if (newTreeBottom) {
|
|
3192
|
-
newTreeBottom.appendChild(sizeSpan);
|
|
3193
|
-
}
|
|
3194
|
-
newTreeBottom = sizeSpan;
|
|
3195
|
-
}
|
|
3196
|
-
if (colour && /^#?([\dA-F]{3}){1,2}$/i.test(colour)) {
|
|
3197
|
-
if (colour.charAt(0) !== "#") {
|
|
3198
|
-
colour = "#" + colour;
|
|
3199
|
-
}
|
|
3200
|
-
colourSpan = createElement(doc2, "SPAN", {
|
|
3201
|
-
"class": COLOUR_CLASS,
|
|
3202
|
-
style: "color:" + colour
|
|
3203
|
-
});
|
|
3204
|
-
if (!newTreeTop) {
|
|
3205
|
-
newTreeTop = colourSpan;
|
|
3206
|
-
}
|
|
3207
|
-
if (newTreeBottom) {
|
|
3208
|
-
newTreeBottom.appendChild(colourSpan);
|
|
3209
|
-
}
|
|
3210
|
-
newTreeBottom = colourSpan;
|
|
3211
|
-
}
|
|
3212
|
-
if (!newTreeTop) {
|
|
3213
|
-
newTreeTop = newTreeBottom = createElement(doc2, "SPAN");
|
|
3214
|
-
}
|
|
3215
|
-
parent.replaceChild(newTreeTop, node);
|
|
3216
|
-
newTreeBottom.appendChild(empty(node));
|
|
3217
|
-
return newTreeBottom;
|
|
3218
|
-
},
|
|
3219
|
-
TT: function(node, parent) {
|
|
3220
|
-
var el = createElement(node.ownerDocument, "SPAN", {
|
|
3221
|
-
"class": FONT_FAMILY_CLASS,
|
|
3222
|
-
style: 'font-family:menlo,consolas,"courier new",monospace'
|
|
3223
|
-
});
|
|
3224
|
-
parent.replaceChild(el, node);
|
|
3225
|
-
el.appendChild(empty(node));
|
|
3226
|
-
return el;
|
|
3227
|
-
}
|
|
3228
|
-
};
|
|
3229
|
-
var allowedBlock = /^(?:A(?:DDRESS|RTICLE|SIDE|UDIO)|BLOCKQUOTE|CAPTION|D(?:[DLT]|IV)|F(?:IGURE|IGCAPTION|OOTER)|H[1-6]|HEADER|L(?:ABEL|EGEND|I)|O(?:L|UTPUT)|P(?:RE)?|SECTION|T(?:ABLE|BODY|D|FOOT|H|HEAD|R)|COL(?:GROUP)?|UL)$/;
|
|
3230
|
-
var blacklist = /^(?:HEAD|META|STYLE)/;
|
|
3231
|
-
var walker = new TreeWalker(null, SHOW_TEXT | SHOW_ELEMENT, function() {
|
|
3232
|
-
return true;
|
|
3233
|
-
});
|
|
3234
|
-
var cleanTree = function cleanTree2(node, preserveWS) {
|
|
3235
|
-
if (node.classList && node.classList.contains("halo-img-content")) {
|
|
3236
|
-
return node;
|
|
3237
|
-
}
|
|
3238
|
-
var children = node.childNodes, nonInlineParent, i, l, child, nodeName, nodeType, rewriter, childLength, startsWithWS, endsWithWS, data, sibling;
|
|
3239
|
-
nonInlineParent = node;
|
|
3240
|
-
while (isInline(nonInlineParent)) {
|
|
3241
|
-
nonInlineParent = nonInlineParent.parentNode;
|
|
3242
|
-
}
|
|
3243
|
-
walker.root = nonInlineParent;
|
|
3244
|
-
for (i = 0, l = children.length; i < l; i += 1) {
|
|
3245
|
-
child = children[i];
|
|
3246
|
-
nodeName = child.nodeName;
|
|
3247
|
-
nodeType = child.nodeType;
|
|
3248
|
-
rewriter = stylesRewriters[nodeName];
|
|
3249
|
-
if (nodeType === ELEMENT_NODE) {
|
|
3250
|
-
childLength = child.childNodes.length;
|
|
3251
|
-
if (rewriter) {
|
|
3252
|
-
child = rewriter(child, node);
|
|
3253
|
-
} else if (blacklist.test(nodeName)) {
|
|
3254
|
-
node.removeChild(child);
|
|
3255
|
-
i -= 1;
|
|
3256
|
-
l -= 1;
|
|
3257
|
-
continue;
|
|
3258
|
-
} else if (!allowedBlock.test(nodeName) && !isInline(child)) {
|
|
3259
|
-
i -= 1;
|
|
3260
|
-
l += childLength - 1;
|
|
3261
|
-
node.replaceChild(empty(child), child);
|
|
3262
|
-
continue;
|
|
3263
|
-
}
|
|
3264
|
-
if (childLength) {
|
|
3265
|
-
cleanTree2(child, preserveWS || nodeName === "PRE");
|
|
3266
|
-
}
|
|
3267
|
-
} else {
|
|
3268
|
-
if (nodeType === TEXT_NODE) {
|
|
3269
|
-
data = child.data;
|
|
3270
|
-
startsWithWS = !notWS.test(data.charAt(0));
|
|
3271
|
-
endsWithWS = !notWS.test(data.charAt(data.length - 1));
|
|
3272
|
-
if (preserveWS || !startsWithWS && !endsWithWS) {
|
|
3273
|
-
continue;
|
|
3274
|
-
}
|
|
3275
|
-
if (startsWithWS) {
|
|
3276
|
-
walker.currentNode = child;
|
|
3277
|
-
while (sibling = walker.previousPONode()) {
|
|
3278
|
-
nodeName = sibling.nodeName;
|
|
3279
|
-
if (nodeName === "IMG" || nodeName === "#text" && notWS.test(sibling.data)) {
|
|
3280
|
-
break;
|
|
3281
|
-
}
|
|
3282
|
-
if (!isInline(sibling)) {
|
|
3283
|
-
sibling = null;
|
|
3284
|
-
break;
|
|
3285
|
-
}
|
|
3286
|
-
}
|
|
3287
|
-
data = data.replace(/^[ \t\r\n]+/g, sibling ? " " : "");
|
|
3288
|
-
}
|
|
3289
|
-
if (endsWithWS) {
|
|
3290
|
-
walker.currentNode = child;
|
|
3291
|
-
while (sibling = walker.nextNode()) {
|
|
3292
|
-
if (nodeName === "IMG" || nodeName === "#text" && notWS.test(sibling.data)) {
|
|
3293
|
-
break;
|
|
3294
|
-
}
|
|
3295
|
-
if (!isInline(sibling)) {
|
|
3296
|
-
sibling = null;
|
|
3297
|
-
break;
|
|
3298
|
-
}
|
|
3299
|
-
}
|
|
3300
|
-
data = data.replace(/[ \t\r\n]+$/g, sibling ? " " : "");
|
|
3301
|
-
}
|
|
3302
|
-
if (data) {
|
|
3303
|
-
child.data = data;
|
|
3304
|
-
continue;
|
|
3305
|
-
}
|
|
3306
|
-
}
|
|
3307
|
-
node.removeChild(child);
|
|
3308
|
-
i -= 1;
|
|
3309
|
-
l -= 1;
|
|
3310
|
-
}
|
|
3311
|
-
}
|
|
3312
|
-
return node;
|
|
3313
|
-
};
|
|
3314
|
-
var removeEmptyInlines = function removeEmptyInlines2(node) {
|
|
3315
|
-
var children = node.childNodes, l = children.length, child;
|
|
3316
|
-
while (l--) {
|
|
3317
|
-
child = children[l];
|
|
3318
|
-
if (child.nodeType === ELEMENT_NODE && !isLeaf(child)) {
|
|
3319
|
-
removeEmptyInlines2(child);
|
|
3320
|
-
if (isInline(child) && !child.firstChild) {
|
|
3321
|
-
node.removeChild(child);
|
|
3322
|
-
}
|
|
3323
|
-
} else if (child.nodeType === TEXT_NODE && !child.data) {
|
|
3324
|
-
node.removeChild(child);
|
|
3325
|
-
}
|
|
3326
|
-
}
|
|
3327
|
-
};
|
|
3328
|
-
var notWSTextNode = function(node) {
|
|
3329
|
-
return node.nodeType === ELEMENT_NODE ? node.nodeName === "BR" : notWS.test(node.data);
|
|
3330
|
-
};
|
|
3331
|
-
var isLineBreak = function(br, isLBIfEmptyBlock) {
|
|
3332
|
-
var block = br.parentNode;
|
|
3333
|
-
var walker2;
|
|
3334
|
-
while (isInline(block)) {
|
|
3335
|
-
block = block.parentNode;
|
|
3336
|
-
}
|
|
3337
|
-
walker2 = new TreeWalker(
|
|
3338
|
-
block,
|
|
3339
|
-
SHOW_ELEMENT | SHOW_TEXT,
|
|
3340
|
-
notWSTextNode
|
|
3341
|
-
);
|
|
3342
|
-
walker2.currentNode = br;
|
|
3343
|
-
return !!walker2.nextNode() || isLBIfEmptyBlock && !walker2.previousNode();
|
|
3344
|
-
};
|
|
3345
|
-
var cleanupBRs = function(node, root, keepForBlankLine) {
|
|
3346
|
-
var brs = node.querySelectorAll("BR");
|
|
3347
|
-
var brBreaksLine = [];
|
|
3348
|
-
var l = brs.length;
|
|
3349
|
-
var i, br, parent;
|
|
3350
|
-
for (i = 0; i < l; i += 1) {
|
|
3351
|
-
brBreaksLine[i] = isLineBreak(brs[i], keepForBlankLine);
|
|
3352
|
-
}
|
|
3353
|
-
while (l--) {
|
|
3354
|
-
br = brs[l];
|
|
3355
|
-
parent = br.parentNode;
|
|
3356
|
-
if (!parent) {
|
|
3357
|
-
continue;
|
|
3358
|
-
}
|
|
3359
|
-
if (!brBreaksLine[l]) {
|
|
3360
|
-
detach(br);
|
|
3361
|
-
} else if (!isInline(parent)) {
|
|
3362
|
-
fixContainer(parent, root);
|
|
3363
|
-
}
|
|
3364
|
-
}
|
|
3365
|
-
};
|
|
3366
|
-
var setClipboardData = function(clipboardData, node, root) {
|
|
3367
|
-
var body = node.ownerDocument.body;
|
|
3368
|
-
var html, text;
|
|
3369
|
-
cleanupBRs(node, root, true);
|
|
3370
|
-
node.setAttribute(
|
|
3371
|
-
"style",
|
|
3372
|
-
"position:fixed;overflow:hidden;bottom:100%;right:100%;"
|
|
3373
|
-
);
|
|
3374
|
-
body.appendChild(node);
|
|
3375
|
-
html = node.innerHTML;
|
|
3376
|
-
text = node.innerText || node.textContent;
|
|
3377
|
-
if (isWin) {
|
|
3378
|
-
text = text.replace(/\r?\n/g, "\r\n");
|
|
3379
|
-
}
|
|
3380
|
-
clipboardData.setData("text/html", html);
|
|
3381
|
-
clipboardData.setData("text/plain", text);
|
|
3382
|
-
body.removeChild(node);
|
|
3383
|
-
};
|
|
3384
|
-
var onCut = function(event) {
|
|
3385
|
-
var clipboardData = event.clipboardData;
|
|
3386
|
-
var range = this.getSelection();
|
|
3387
|
-
var root = this._root;
|
|
3388
|
-
var self2 = this;
|
|
3389
|
-
var startBlock, endBlock, copyRoot, contents, parent, newContents, node;
|
|
3390
|
-
if (range.collapsed) {
|
|
3391
|
-
event.preventDefault();
|
|
3392
|
-
return;
|
|
3393
|
-
}
|
|
3394
|
-
this.saveUndoState(range);
|
|
3395
|
-
if (!isEdge && !isIOS && clipboardData) {
|
|
3396
|
-
startBlock = getStartBlockOfRange(range, root);
|
|
3397
|
-
endBlock = getEndBlockOfRange(range, root);
|
|
3398
|
-
copyRoot = startBlock === endBlock && startBlock || root;
|
|
3399
|
-
contents = deleteContentsOfRange(range, root);
|
|
3400
|
-
parent = range.commonAncestorContainer;
|
|
3401
|
-
if (parent.nodeType === TEXT_NODE) {
|
|
3402
|
-
parent = parent.parentNode;
|
|
3403
|
-
}
|
|
3404
|
-
while (parent && parent !== copyRoot) {
|
|
3405
|
-
newContents = parent.cloneNode(false);
|
|
3406
|
-
newContents.appendChild(contents);
|
|
3407
|
-
contents = newContents;
|
|
3408
|
-
parent = parent.parentNode;
|
|
3409
|
-
}
|
|
3410
|
-
node = this.createElement("div");
|
|
3411
|
-
node.appendChild(contents);
|
|
3412
|
-
setClipboardData(clipboardData, node, root);
|
|
3413
|
-
event.preventDefault();
|
|
3414
|
-
} else {
|
|
3415
|
-
setTimeout(function() {
|
|
3416
|
-
try {
|
|
3417
|
-
self2._ensureBottomLine();
|
|
3418
|
-
} catch (error) {
|
|
3419
|
-
self2.didError(error);
|
|
3420
|
-
}
|
|
3421
|
-
}, 0);
|
|
3422
|
-
}
|
|
3423
|
-
this.setSelection(range);
|
|
3424
|
-
};
|
|
3425
|
-
var onCopy = function(event) {
|
|
3426
|
-
var clipboardData = event.clipboardData;
|
|
3427
|
-
var range = this.getSelection();
|
|
3428
|
-
var root = this._root;
|
|
3429
|
-
var startBlock, endBlock, copyRoot, contents, parent, newContents, node;
|
|
3430
|
-
if (!isEdge && !isIOS && clipboardData) {
|
|
3431
|
-
startBlock = getStartBlockOfRange(range, root);
|
|
3432
|
-
endBlock = getEndBlockOfRange(range, root);
|
|
3433
|
-
copyRoot = startBlock === endBlock && startBlock || root;
|
|
3434
|
-
range = range.cloneRange();
|
|
3435
|
-
moveRangeBoundariesDownTree(range);
|
|
3436
|
-
moveRangeBoundariesUpTree(range, copyRoot, copyRoot, root);
|
|
3437
|
-
contents = range.cloneContents();
|
|
3438
|
-
parent = range.commonAncestorContainer;
|
|
3439
|
-
if (parent.nodeType === TEXT_NODE) {
|
|
3440
|
-
parent = parent.parentNode;
|
|
3441
|
-
}
|
|
3442
|
-
while (parent && parent !== copyRoot) {
|
|
3443
|
-
newContents = parent.cloneNode(false);
|
|
3444
|
-
newContents.appendChild(contents);
|
|
3445
|
-
contents = newContents;
|
|
3446
|
-
parent = parent.parentNode;
|
|
3447
|
-
}
|
|
3448
|
-
node = this.createElement("div");
|
|
3449
|
-
node.appendChild(contents);
|
|
3450
|
-
setClipboardData(clipboardData, node, root);
|
|
3451
|
-
event.preventDefault();
|
|
3452
|
-
}
|
|
3453
|
-
};
|
|
3454
|
-
function monitorShiftKey(event) {
|
|
3455
|
-
this.isShiftDown = event.shiftKey;
|
|
3456
|
-
}
|
|
3457
|
-
var onPaste = function(event) {
|
|
3458
|
-
if (event.target.tagName === "TEXTAREA")
|
|
3459
|
-
return true;
|
|
3460
|
-
var clipboardData = event.clipboardData;
|
|
3461
|
-
var items = clipboardData && clipboardData.items;
|
|
3462
|
-
var choosePlain = this.isShiftDown;
|
|
3463
|
-
var fireDrop = false;
|
|
3464
|
-
var hasImage = false;
|
|
3465
|
-
var plainItem = null;
|
|
3466
|
-
var self2 = this;
|
|
3467
|
-
var l, item, type, types, data;
|
|
3468
|
-
if (isEdge && items) {
|
|
3469
|
-
l = items.length;
|
|
3470
|
-
while (l--) {
|
|
3471
|
-
if (!choosePlain && /^image\/.*/.test(items[l].type)) {
|
|
3472
|
-
hasImage = true;
|
|
3473
|
-
}
|
|
3474
|
-
}
|
|
3475
|
-
if (!hasImage) {
|
|
3476
|
-
items = null;
|
|
3477
|
-
}
|
|
3478
|
-
}
|
|
3479
|
-
if (items) {
|
|
3480
|
-
event.preventDefault();
|
|
3481
|
-
l = items.length;
|
|
3482
|
-
while (l--) {
|
|
3483
|
-
item = items[l];
|
|
3484
|
-
type = item.type;
|
|
3485
|
-
if (!choosePlain && type === "text/html") {
|
|
3486
|
-
item.getAsString(function(html) {
|
|
3487
|
-
self2.insertHTML(html, true);
|
|
3488
|
-
});
|
|
3489
|
-
return;
|
|
3490
|
-
}
|
|
3491
|
-
if (type === "text/plain") {
|
|
3492
|
-
plainItem = item;
|
|
3493
|
-
}
|
|
3494
|
-
if (!choosePlain && /^image\/.*/.test(type)) {
|
|
3495
|
-
hasImage = true;
|
|
3496
|
-
}
|
|
3497
|
-
}
|
|
3498
|
-
if (hasImage) {
|
|
3499
|
-
this.fireEvent("dragover", {
|
|
3500
|
-
dataTransfer: clipboardData,
|
|
3501
|
-
preventDefault: function() {
|
|
3502
|
-
fireDrop = true;
|
|
3503
|
-
}
|
|
3504
|
-
});
|
|
3505
|
-
if (fireDrop) {
|
|
3506
|
-
this.fireEvent("drop", {
|
|
3507
|
-
dataTransfer: clipboardData
|
|
3508
|
-
});
|
|
3509
|
-
}
|
|
3510
|
-
} else if (plainItem) {
|
|
3511
|
-
plainItem.getAsString(function(text) {
|
|
3512
|
-
self2.insertPlainText(text, true);
|
|
3513
|
-
});
|
|
3514
|
-
}
|
|
3515
|
-
return;
|
|
3516
|
-
}
|
|
3517
|
-
types = clipboardData && clipboardData.types;
|
|
3518
|
-
if (!isEdge && types && (indexOf.call(types, "text/html") > -1 || !isGecko && indexOf.call(types, "text/plain") > -1 && indexOf.call(types, "text/rtf") < 0)) {
|
|
3519
|
-
event.preventDefault();
|
|
3520
|
-
if (!choosePlain && (data = clipboardData.getData("text/html"))) {
|
|
3521
|
-
this.insertHTML(data, true);
|
|
3522
|
-
} else if ((data = clipboardData.getData("text/plain")) || (data = clipboardData.getData("text/uri-list"))) {
|
|
3523
|
-
this.insertPlainText(data, true);
|
|
3524
|
-
}
|
|
3525
|
-
return;
|
|
3526
|
-
}
|
|
3527
|
-
this._awaitingPaste = true;
|
|
3528
|
-
var body = this._doc.body, range = this.getSelection(), startContainer = range.startContainer, startOffset = range.startOffset, endContainer = range.endContainer, endOffset = range.endOffset;
|
|
3529
|
-
var pasteArea = this.createElement("DIV", {
|
|
3530
|
-
contenteditable: "true",
|
|
3531
|
-
style: "position:fixed; overflow:hidden; top:0; right:100%; width:1px; height:1px;"
|
|
3532
|
-
});
|
|
3533
|
-
body.appendChild(pasteArea);
|
|
3534
|
-
range.selectNodeContents(pasteArea);
|
|
3535
|
-
this.setSelection(range);
|
|
3536
|
-
setTimeout(function() {
|
|
3537
|
-
try {
|
|
3538
|
-
self2._awaitingPaste = false;
|
|
3539
|
-
var html = "", next = pasteArea, first, range2;
|
|
3540
|
-
while (pasteArea = next) {
|
|
3541
|
-
next = pasteArea.nextSibling;
|
|
3542
|
-
detach(pasteArea);
|
|
3543
|
-
first = pasteArea.firstChild;
|
|
3544
|
-
if (first && first === pasteArea.lastChild && first.nodeName === "DIV") {
|
|
3545
|
-
pasteArea = first;
|
|
3546
|
-
}
|
|
3547
|
-
html += pasteArea.innerHTML;
|
|
3548
|
-
}
|
|
3549
|
-
range2 = self2.createRange(
|
|
3550
|
-
startContainer,
|
|
3551
|
-
startOffset,
|
|
3552
|
-
endContainer,
|
|
3553
|
-
endOffset
|
|
3554
|
-
);
|
|
3555
|
-
self2.setSelection(range2);
|
|
3556
|
-
if (html) {
|
|
3557
|
-
self2.insertHTML(html, true);
|
|
3558
|
-
}
|
|
3559
|
-
} catch (error) {
|
|
3560
|
-
self2.didError(error);
|
|
3561
|
-
}
|
|
3562
|
-
}, 0);
|
|
3563
|
-
};
|
|
3564
|
-
var onDrop = function(event) {
|
|
3565
|
-
var types = event.dataTransfer.types;
|
|
3566
|
-
var l = types.length;
|
|
3567
|
-
var hasPlain = false;
|
|
3568
|
-
var hasHTML = false;
|
|
3569
|
-
while (l--) {
|
|
3570
|
-
switch (types[l]) {
|
|
3571
|
-
case "text/plain":
|
|
3572
|
-
hasPlain = true;
|
|
3573
|
-
break;
|
|
3574
|
-
case "text/html":
|
|
3575
|
-
hasHTML = true;
|
|
3576
|
-
break;
|
|
3577
|
-
default:
|
|
3578
|
-
return;
|
|
3579
|
-
}
|
|
3580
|
-
}
|
|
3581
|
-
if (hasHTML || hasPlain) {
|
|
3582
|
-
this.saveUndoState();
|
|
3583
|
-
}
|
|
3584
|
-
};
|
|
3585
|
-
function mergeObjects(base, extras, mayOverride) {
|
|
3586
|
-
var prop, value;
|
|
3587
|
-
if (!base) {
|
|
3588
|
-
base = {};
|
|
3589
|
-
}
|
|
3590
|
-
if (extras) {
|
|
3591
|
-
for (prop in extras) {
|
|
3592
|
-
if (mayOverride || !(prop in base)) {
|
|
3593
|
-
value = extras[prop];
|
|
3594
|
-
base[prop] = value && value.constructor === Object ? mergeObjects(base[prop], value, mayOverride) : value;
|
|
3595
|
-
}
|
|
3596
|
-
}
|
|
3597
|
-
}
|
|
3598
|
-
return base;
|
|
3599
|
-
}
|
|
3600
|
-
function Squire(root, config) {
|
|
3601
|
-
if (root.nodeType === DOCUMENT_NODE) {
|
|
3602
|
-
root = root.body;
|
|
3603
|
-
}
|
|
3604
|
-
var doc2 = root.ownerDocument;
|
|
3605
|
-
var win2 = doc2.defaultView;
|
|
3606
|
-
var mutation;
|
|
3607
|
-
this._win = win2;
|
|
3608
|
-
this._doc = doc2;
|
|
3609
|
-
this._root = root;
|
|
3610
|
-
this._events = {};
|
|
3611
|
-
this._isFocused = false;
|
|
3612
|
-
this._lastSelection = null;
|
|
3613
|
-
if (losesSelectionOnBlur) {
|
|
3614
|
-
this.addEventListener("beforedeactivate", this.getSelection);
|
|
3615
|
-
}
|
|
3616
|
-
this._hasZWS = false;
|
|
3617
|
-
this._lastAnchorNode = null;
|
|
3618
|
-
this._lastFocusNode = null;
|
|
3619
|
-
this._path = "";
|
|
3620
|
-
this._willUpdatePath = false;
|
|
3621
|
-
if ("onselectionchange" in doc2) {
|
|
3622
|
-
this.addEventListener("selectionchange", this._updatePathOnEvent);
|
|
3623
|
-
} else {
|
|
3624
|
-
this.addEventListener("keyup", this._updatePathOnEvent);
|
|
3625
|
-
this.addEventListener("mouseup", this._updatePathOnEvent);
|
|
3626
|
-
}
|
|
3627
|
-
this._undoIndex = -1;
|
|
3628
|
-
this._undoStack = [];
|
|
3629
|
-
this._undoStackLength = 0;
|
|
3630
|
-
this._isInUndoState = false;
|
|
3631
|
-
this._ignoreChange = false;
|
|
3632
|
-
this._ignoreAllChanges = false;
|
|
3633
|
-
if (canObserveMutations) {
|
|
3634
|
-
mutation = new MutationObserver(this._docWasChanged.bind(this));
|
|
3635
|
-
mutation.observe(root, {
|
|
3636
|
-
childList: true,
|
|
3637
|
-
attributes: true,
|
|
3638
|
-
characterData: true,
|
|
3639
|
-
subtree: true
|
|
3640
|
-
});
|
|
3641
|
-
this._mutation = mutation;
|
|
3642
|
-
} else {
|
|
3643
|
-
this.addEventListener("keyup", this._keyUpDetectChange);
|
|
3644
|
-
}
|
|
3645
|
-
this._restoreSelection = false;
|
|
3646
|
-
this.addEventListener("blur", enableRestoreSelection);
|
|
3647
|
-
this.addEventListener("mousedown", disableRestoreSelection);
|
|
3648
|
-
this.addEventListener("touchstart", disableRestoreSelection);
|
|
3649
|
-
this.addEventListener("focus", restoreSelection);
|
|
3650
|
-
this._awaitingPaste = false;
|
|
3651
|
-
this.addEventListener(isIElt11 ? "beforecut" : "cut", onCut);
|
|
3652
|
-
this.addEventListener("copy", onCopy);
|
|
3653
|
-
this.addEventListener("keydown", monitorShiftKey);
|
|
3654
|
-
this.addEventListener("keyup", monitorShiftKey);
|
|
3655
|
-
this.addEventListener(isIElt11 ? "beforepaste" : "paste", onPaste);
|
|
3656
|
-
this.addEventListener("drop", onDrop);
|
|
3657
|
-
this.addEventListener(isPresto ? "keypress" : "keydown", onKey);
|
|
3658
|
-
this._keyHandlers = Object.create(keyHandlers);
|
|
3659
|
-
this.setConfig(config);
|
|
3660
|
-
if (isIElt11) {
|
|
3661
|
-
win2.Text.prototype.splitText = function(offset) {
|
|
3662
|
-
var afterSplit = this.ownerDocument.createTextNode(
|
|
3663
|
-
this.data.slice(offset)
|
|
3664
|
-
), next = this.nextSibling, parent = this.parentNode, toDelete = this.length - offset;
|
|
3665
|
-
if (next) {
|
|
3666
|
-
parent.insertBefore(afterSplit, next);
|
|
3667
|
-
} else {
|
|
3668
|
-
parent.appendChild(afterSplit);
|
|
3669
|
-
}
|
|
3670
|
-
if (toDelete) {
|
|
3671
|
-
this.deleteData(offset, toDelete);
|
|
3672
|
-
}
|
|
3673
|
-
return afterSplit;
|
|
3674
|
-
};
|
|
3675
|
-
}
|
|
3676
|
-
root.setAttribute("contenteditable", "true");
|
|
3677
|
-
try {
|
|
3678
|
-
doc2.execCommand("enableObjectResizing", false, "false");
|
|
3679
|
-
doc2.execCommand("enableInlineTableEditing", false, "false");
|
|
3680
|
-
} catch (error) {
|
|
3681
|
-
}
|
|
3682
|
-
root.__squire__ = this;
|
|
3683
|
-
this.setHTML("");
|
|
3684
|
-
}
|
|
3685
|
-
var proto = Squire.prototype;
|
|
3686
|
-
var sanitizeToDOMFragment = function(html, isPaste, self2) {
|
|
3687
|
-
var doc2 = self2._doc;
|
|
3688
|
-
var frag = html ? DOMPurify.sanitize(html, {
|
|
3689
|
-
ALLOW_UNKNOWN_PROTOCOLS: true,
|
|
3690
|
-
WHOLE_DOCUMENT: false,
|
|
3691
|
-
RETURN_DOM: true,
|
|
3692
|
-
RETURN_DOM_FRAGMENT: true
|
|
3693
|
-
}) : null;
|
|
3694
|
-
return frag ? doc2.importNode(frag, true) : doc2.createDocumentFragment();
|
|
3695
|
-
};
|
|
3696
|
-
proto.setConfig = function(config) {
|
|
3697
|
-
config = mergeObjects({
|
|
3698
|
-
blockTag: "DIV",
|
|
3699
|
-
blockAttributes: null,
|
|
3700
|
-
tagAttributes: {
|
|
3701
|
-
blockquote: null,
|
|
3702
|
-
ul: null,
|
|
3703
|
-
ol: null,
|
|
3704
|
-
li: null,
|
|
3705
|
-
a: null
|
|
3706
|
-
},
|
|
3707
|
-
leafNodeNames,
|
|
3708
|
-
undo: {
|
|
3709
|
-
documentSizeThreshold: -1,
|
|
3710
|
-
undoLimit: -1
|
|
3711
|
-
},
|
|
3712
|
-
isInsertedHTMLSanitized: true,
|
|
3713
|
-
isSetHTMLSanitized: true,
|
|
3714
|
-
sanitizeToDOMFragment: typeof DOMPurify !== "undefined" && DOMPurify.isSupported ? sanitizeToDOMFragment : null
|
|
3715
|
-
}, config, true);
|
|
3716
|
-
config.blockTag = config.blockTag.toUpperCase();
|
|
3717
|
-
this._config = config;
|
|
3718
|
-
return this;
|
|
3719
|
-
};
|
|
3720
|
-
proto.createElement = function(tag, props, children) {
|
|
3721
|
-
return createElement(this._doc, tag, props, children);
|
|
3722
|
-
};
|
|
3723
|
-
proto.createDefaultBlock = function(children) {
|
|
3724
|
-
var config = this._config;
|
|
3725
|
-
return fixCursor(
|
|
3726
|
-
this.createElement(config.blockTag, config.blockAttributes, children),
|
|
3727
|
-
this._root
|
|
3728
|
-
);
|
|
3729
|
-
};
|
|
3730
|
-
proto.didError = function(error) {
|
|
3731
|
-
console.log(error);
|
|
3732
|
-
};
|
|
3733
|
-
proto.getDocument = function() {
|
|
3734
|
-
return this._doc;
|
|
3735
|
-
};
|
|
3736
|
-
proto.getRoot = function() {
|
|
3737
|
-
return this._root;
|
|
3738
|
-
};
|
|
3739
|
-
proto.modifyDocument = function(modificationCallback) {
|
|
3740
|
-
var mutation = this._mutation;
|
|
3741
|
-
if (mutation) {
|
|
3742
|
-
if (mutation.takeRecords().length) {
|
|
3743
|
-
this._docWasChanged();
|
|
3744
|
-
}
|
|
3745
|
-
mutation.disconnect();
|
|
3746
|
-
}
|
|
3747
|
-
this._ignoreAllChanges = true;
|
|
3748
|
-
modificationCallback();
|
|
3749
|
-
this._ignoreAllChanges = false;
|
|
3750
|
-
if (mutation) {
|
|
3751
|
-
mutation.observe(this._root, {
|
|
3752
|
-
childList: true,
|
|
3753
|
-
attributes: true,
|
|
3754
|
-
characterData: true,
|
|
3755
|
-
subtree: true
|
|
3756
|
-
});
|
|
3757
|
-
this._ignoreChange = false;
|
|
3758
|
-
}
|
|
3759
|
-
};
|
|
3760
|
-
var customEvents = {
|
|
3761
|
-
pathChange: 1,
|
|
3762
|
-
select: 1,
|
|
3763
|
-
input: 1,
|
|
3764
|
-
undoStateChange: 1
|
|
3765
|
-
};
|
|
3766
|
-
proto.fireEvent = function(type, event) {
|
|
3767
|
-
var handlers = this._events[type];
|
|
3768
|
-
var isFocused, l, obj;
|
|
3769
|
-
if (/^(?:focus|blur)/.test(type)) {
|
|
3770
|
-
isFocused = this._root === this._doc.activeElement;
|
|
3771
|
-
if (type === "focus") {
|
|
3772
|
-
if (!isFocused || this._isFocused) {
|
|
3773
|
-
return this;
|
|
3774
|
-
}
|
|
3775
|
-
this._isFocused = true;
|
|
3776
|
-
} else {
|
|
3777
|
-
if (isFocused || !this._isFocused) {
|
|
3778
|
-
return this;
|
|
3779
|
-
}
|
|
3780
|
-
this._isFocused = false;
|
|
3781
|
-
}
|
|
3782
|
-
}
|
|
3783
|
-
if (handlers) {
|
|
3784
|
-
if (!event) {
|
|
3785
|
-
event = {};
|
|
3786
|
-
}
|
|
3787
|
-
if (event.type !== type) {
|
|
3788
|
-
event.type = type;
|
|
3789
|
-
}
|
|
3790
|
-
handlers = handlers.slice();
|
|
3791
|
-
l = handlers.length;
|
|
3792
|
-
while (l--) {
|
|
3793
|
-
obj = handlers[l];
|
|
3794
|
-
try {
|
|
3795
|
-
if (obj.handleEvent) {
|
|
3796
|
-
obj.handleEvent(event);
|
|
3797
|
-
} else {
|
|
3798
|
-
obj.call(this, event);
|
|
3799
|
-
}
|
|
3800
|
-
} catch (error) {
|
|
3801
|
-
error.details = "Squire: fireEvent error. Event type: " + type;
|
|
3802
|
-
this.didError(error);
|
|
3803
|
-
}
|
|
3804
|
-
}
|
|
3805
|
-
}
|
|
3806
|
-
return this;
|
|
3807
|
-
};
|
|
3808
|
-
proto.destroy = function() {
|
|
3809
|
-
var events = this._events;
|
|
3810
|
-
var type;
|
|
3811
|
-
for (type in events) {
|
|
3812
|
-
this.removeEventListener(type);
|
|
3813
|
-
}
|
|
3814
|
-
if (this._mutation) {
|
|
3815
|
-
this._mutation.disconnect();
|
|
3816
|
-
}
|
|
3817
|
-
delete this._root.__squire__;
|
|
3818
|
-
this._undoIndex = -1;
|
|
3819
|
-
this._undoStack = [];
|
|
3820
|
-
this._undoStackLength = 0;
|
|
3821
|
-
};
|
|
3822
|
-
proto.handleEvent = function(event) {
|
|
3823
|
-
this.fireEvent(event.type, event);
|
|
3824
|
-
};
|
|
3825
|
-
proto.addEventListener = function(type, fn) {
|
|
3826
|
-
var handlers = this._events[type];
|
|
3827
|
-
var target = this._root;
|
|
3828
|
-
if (!fn) {
|
|
3829
|
-
this.didError({
|
|
3830
|
-
name: "Squire: addEventListener with null or undefined fn",
|
|
3831
|
-
message: "Event type: " + type
|
|
3832
|
-
});
|
|
3833
|
-
return this;
|
|
3834
|
-
}
|
|
3835
|
-
if (!handlers) {
|
|
3836
|
-
handlers = this._events[type] = [];
|
|
3837
|
-
if (!customEvents[type]) {
|
|
3838
|
-
if (type === "selectionchange") {
|
|
3839
|
-
target = this._doc;
|
|
3840
|
-
}
|
|
3841
|
-
target.addEventListener(type, this, true);
|
|
3842
|
-
}
|
|
3843
|
-
}
|
|
3844
|
-
handlers.push(fn);
|
|
3845
|
-
return this;
|
|
3846
|
-
};
|
|
3847
|
-
proto.removeEventListener = function(type, fn) {
|
|
3848
|
-
var handlers = this._events[type];
|
|
3849
|
-
var target = this._root;
|
|
3850
|
-
var l;
|
|
3851
|
-
if (handlers) {
|
|
3852
|
-
if (fn) {
|
|
3853
|
-
l = handlers.length;
|
|
3854
|
-
while (l--) {
|
|
3855
|
-
if (handlers[l] === fn) {
|
|
3856
|
-
handlers.splice(l, 1);
|
|
3857
|
-
}
|
|
3858
|
-
}
|
|
3859
|
-
} else {
|
|
3860
|
-
handlers.length = 0;
|
|
3861
|
-
}
|
|
3862
|
-
if (!handlers.length) {
|
|
3863
|
-
delete this._events[type];
|
|
3864
|
-
if (!customEvents[type]) {
|
|
3865
|
-
if (type === "selectionchange") {
|
|
3866
|
-
target = this._doc;
|
|
3867
|
-
}
|
|
3868
|
-
target.removeEventListener(type, this, true);
|
|
3869
|
-
}
|
|
3870
|
-
}
|
|
3871
|
-
}
|
|
3872
|
-
return this;
|
|
3873
|
-
};
|
|
3874
|
-
proto.createRange = function(range, startOffset, endContainer, endOffset) {
|
|
3875
|
-
if (range instanceof this._win.Range) {
|
|
3876
|
-
return range.cloneRange();
|
|
3877
|
-
}
|
|
3878
|
-
var domRange = this._doc.createRange();
|
|
3879
|
-
domRange.setStart(range, startOffset);
|
|
3880
|
-
if (endContainer) {
|
|
3881
|
-
domRange.setEnd(endContainer, endOffset);
|
|
3882
|
-
} else {
|
|
3883
|
-
domRange.setEnd(range, startOffset);
|
|
3884
|
-
}
|
|
3885
|
-
return domRange;
|
|
3886
|
-
};
|
|
3887
|
-
proto.getCursorPosition = function(range) {
|
|
3888
|
-
if (!range && !(range = this.getSelection()) || !range.getBoundingClientRect) {
|
|
3889
|
-
return null;
|
|
3890
|
-
}
|
|
3891
|
-
var rect = range.getBoundingClientRect();
|
|
3892
|
-
var node, parent;
|
|
3893
|
-
if (rect && !rect.top) {
|
|
3894
|
-
this._ignoreChange = true;
|
|
3895
|
-
node = this._doc.createElement("SPAN");
|
|
3896
|
-
node.textContent = ZWS;
|
|
3897
|
-
insertNodeInRange(range, node);
|
|
3898
|
-
rect = node.getBoundingClientRect();
|
|
3899
|
-
parent = node.parentNode;
|
|
3900
|
-
parent.removeChild(node);
|
|
3901
|
-
mergeInlines(parent, range);
|
|
3902
|
-
}
|
|
3903
|
-
return rect;
|
|
3904
|
-
};
|
|
3905
|
-
proto._moveCursorTo = function(toStart) {
|
|
3906
|
-
var root = this._root, range = this.createRange(root, toStart ? 0 : root.childNodes.length);
|
|
3907
|
-
moveRangeBoundariesDownTree(range);
|
|
3908
|
-
this.setSelection(range);
|
|
3909
|
-
return this;
|
|
3910
|
-
};
|
|
3911
|
-
proto.moveCursorToStart = function() {
|
|
3912
|
-
return this._moveCursorTo(true);
|
|
3913
|
-
};
|
|
3914
|
-
proto.moveCursorToEnd = function() {
|
|
3915
|
-
return this._moveCursorTo(false);
|
|
3916
|
-
};
|
|
3917
|
-
var getWindowSelection = function(self2) {
|
|
3918
|
-
return self2._win.getSelection() || null;
|
|
3919
|
-
};
|
|
3920
|
-
proto.setSelection = function(range) {
|
|
3921
|
-
if (range) {
|
|
3922
|
-
this._lastSelection = range;
|
|
3923
|
-
if (!this._isFocused) {
|
|
3924
|
-
enableRestoreSelection.call(this);
|
|
3925
|
-
} else if (isAndroid && !this._restoreSelection) {
|
|
3926
|
-
enableRestoreSelection.call(this);
|
|
3927
|
-
this.blur();
|
|
3928
|
-
this.focus();
|
|
3929
|
-
} else {
|
|
3930
|
-
if (isIOS) {
|
|
3931
|
-
this._win.focus();
|
|
3932
|
-
}
|
|
3933
|
-
var sel = getWindowSelection(this);
|
|
3934
|
-
if (sel) {
|
|
3935
|
-
sel.removeAllRanges();
|
|
3936
|
-
sel.addRange(range);
|
|
3937
|
-
}
|
|
3938
|
-
}
|
|
3939
|
-
}
|
|
3940
|
-
return this;
|
|
3941
|
-
};
|
|
3942
|
-
proto.getSelection = function() {
|
|
3943
|
-
var sel = getWindowSelection(this);
|
|
3944
|
-
var root = this._root;
|
|
3945
|
-
var selection, startContainer, endContainer, node;
|
|
3946
|
-
if (this._isFocused && sel && sel.rangeCount) {
|
|
3947
|
-
selection = sel.getRangeAt(0).cloneRange();
|
|
3948
|
-
startContainer = selection.startContainer;
|
|
3949
|
-
endContainer = selection.endContainer;
|
|
3950
|
-
if (startContainer && isLeaf(startContainer)) {
|
|
3951
|
-
selection.setStartBefore(startContainer);
|
|
3952
|
-
}
|
|
3953
|
-
if (endContainer && isLeaf(endContainer)) {
|
|
3954
|
-
selection.setEndBefore(endContainer);
|
|
3955
|
-
}
|
|
3956
|
-
}
|
|
3957
|
-
if (selection && isOrContains(root, selection.commonAncestorContainer)) {
|
|
3958
|
-
this._lastSelection = selection;
|
|
3959
|
-
} else {
|
|
3960
|
-
selection = this._lastSelection;
|
|
3961
|
-
node = selection.commonAncestorContainer;
|
|
3962
|
-
if (!isOrContains(node.ownerDocument, node)) {
|
|
3963
|
-
selection = null;
|
|
3964
|
-
}
|
|
3965
|
-
}
|
|
3966
|
-
if (!selection) {
|
|
3967
|
-
selection = this.createRange(root.firstChild, 0);
|
|
3968
|
-
}
|
|
3969
|
-
return selection;
|
|
3970
|
-
};
|
|
3971
|
-
function enableRestoreSelection() {
|
|
3972
|
-
this._restoreSelection = true;
|
|
3973
|
-
}
|
|
3974
|
-
function disableRestoreSelection() {
|
|
3975
|
-
this._restoreSelection = false;
|
|
3976
|
-
}
|
|
3977
|
-
function restoreSelection() {
|
|
3978
|
-
if (this._restoreSelection) {
|
|
3979
|
-
this.setSelection(this._lastSelection);
|
|
3980
|
-
}
|
|
3981
|
-
}
|
|
3982
|
-
proto.getSelectedText = function() {
|
|
3983
|
-
var range = this.getSelection();
|
|
3984
|
-
if (!range || range.collapsed) {
|
|
3985
|
-
return "";
|
|
3986
|
-
}
|
|
3987
|
-
var walker2 = new TreeWalker(
|
|
3988
|
-
range.commonAncestorContainer,
|
|
3989
|
-
SHOW_TEXT | SHOW_ELEMENT,
|
|
3990
|
-
function(node2) {
|
|
3991
|
-
return isNodeContainedInRange(range, node2, true);
|
|
3992
|
-
}
|
|
3993
|
-
);
|
|
3994
|
-
var startContainer = range.startContainer;
|
|
3995
|
-
var endContainer = range.endContainer;
|
|
3996
|
-
var node = walker2.currentNode = startContainer;
|
|
3997
|
-
var textContent = "";
|
|
3998
|
-
var addedTextInBlock = false;
|
|
3999
|
-
var value;
|
|
4000
|
-
if (!walker2.filter(node)) {
|
|
4001
|
-
node = walker2.nextNode();
|
|
4002
|
-
}
|
|
4003
|
-
while (node) {
|
|
4004
|
-
if (node.nodeType === TEXT_NODE) {
|
|
4005
|
-
value = node.data;
|
|
4006
|
-
if (value && /\S/.test(value)) {
|
|
4007
|
-
if (node === endContainer) {
|
|
4008
|
-
value = value.slice(0, range.endOffset);
|
|
4009
|
-
}
|
|
4010
|
-
if (node === startContainer) {
|
|
4011
|
-
value = value.slice(range.startOffset);
|
|
4012
|
-
}
|
|
4013
|
-
textContent += value;
|
|
4014
|
-
addedTextInBlock = true;
|
|
4015
|
-
}
|
|
4016
|
-
} else if (node.nodeName === "BR" || addedTextInBlock && !isInline(node)) {
|
|
4017
|
-
textContent += "\n";
|
|
4018
|
-
addedTextInBlock = false;
|
|
4019
|
-
}
|
|
4020
|
-
node = walker2.nextNode();
|
|
4021
|
-
}
|
|
4022
|
-
return textContent;
|
|
4023
|
-
};
|
|
4024
|
-
proto.getPath = function() {
|
|
4025
|
-
return this._path;
|
|
4026
|
-
};
|
|
4027
|
-
var removeZWS = function(root, keepNode) {
|
|
4028
|
-
var walker2 = new TreeWalker(root, SHOW_TEXT, function() {
|
|
4029
|
-
return true;
|
|
4030
|
-
}), parent, node, index;
|
|
4031
|
-
while (node = walker2.nextNode()) {
|
|
4032
|
-
while ((index = node.data.indexOf(ZWS)) > -1 && (!keepNode || node.parentNode !== keepNode)) {
|
|
4033
|
-
if (node.length === 1) {
|
|
4034
|
-
do {
|
|
4035
|
-
parent = node.parentNode;
|
|
4036
|
-
parent.removeChild(node);
|
|
4037
|
-
node = parent;
|
|
4038
|
-
walker2.currentNode = parent;
|
|
4039
|
-
} while (isInline(node) && !getLength(node));
|
|
4040
|
-
break;
|
|
4041
|
-
} else {
|
|
4042
|
-
node.deleteData(index, 1);
|
|
4043
|
-
}
|
|
4044
|
-
}
|
|
4045
|
-
}
|
|
4046
|
-
};
|
|
4047
|
-
proto._didAddZWS = function() {
|
|
4048
|
-
this._hasZWS = true;
|
|
4049
|
-
};
|
|
4050
|
-
proto._removeZWS = function() {
|
|
4051
|
-
if (!this._hasZWS) {
|
|
4052
|
-
return;
|
|
4053
|
-
}
|
|
4054
|
-
removeZWS(this._root);
|
|
4055
|
-
this._hasZWS = false;
|
|
4056
|
-
};
|
|
4057
|
-
proto._updatePath = function(range, force) {
|
|
4058
|
-
if (!range) {
|
|
4059
|
-
return;
|
|
4060
|
-
}
|
|
4061
|
-
var anchor = range.startContainer, focus = range.endContainer, newPath;
|
|
4062
|
-
if (force || anchor !== this._lastAnchorNode || focus !== this._lastFocusNode) {
|
|
4063
|
-
this._lastAnchorNode = anchor;
|
|
4064
|
-
this._lastFocusNode = focus;
|
|
4065
|
-
newPath = anchor && focus ? anchor === focus ? getPath(focus, this._root) : "(selection)" : "";
|
|
4066
|
-
if (this._path !== newPath) {
|
|
4067
|
-
this._path = newPath;
|
|
4068
|
-
this.fireEvent("pathChange", { path: newPath });
|
|
4069
|
-
}
|
|
4070
|
-
}
|
|
4071
|
-
this.fireEvent(range.collapsed ? "cursor" : "select", {
|
|
4072
|
-
range
|
|
4073
|
-
});
|
|
4074
|
-
};
|
|
4075
|
-
proto._updatePathOnEvent = function(event) {
|
|
4076
|
-
var self2 = this;
|
|
4077
|
-
if (self2._isFocused && !self2._willUpdatePath) {
|
|
4078
|
-
self2._willUpdatePath = true;
|
|
4079
|
-
setTimeout(function() {
|
|
4080
|
-
self2._willUpdatePath = false;
|
|
4081
|
-
self2._updatePath(self2.getSelection());
|
|
4082
|
-
}, 0);
|
|
4083
|
-
}
|
|
4084
|
-
};
|
|
4085
|
-
proto.focus = function() {
|
|
4086
|
-
this._root.focus();
|
|
4087
|
-
if (isIE) {
|
|
4088
|
-
this.fireEvent("focus");
|
|
4089
|
-
}
|
|
4090
|
-
return this;
|
|
4091
|
-
};
|
|
4092
|
-
proto.blur = function() {
|
|
4093
|
-
this._root.blur();
|
|
4094
|
-
if (isIE) {
|
|
4095
|
-
this.fireEvent("blur");
|
|
4096
|
-
}
|
|
4097
|
-
return this;
|
|
4098
|
-
};
|
|
4099
|
-
var startSelectionId = "squire-selection-start";
|
|
4100
|
-
var endSelectionId = "squire-selection-end";
|
|
4101
|
-
proto._saveRangeToBookmark = function(range) {
|
|
4102
|
-
var startNode = this.createElement("INPUT", {
|
|
4103
|
-
id: startSelectionId,
|
|
4104
|
-
type: "hidden"
|
|
4105
|
-
}), endNode = this.createElement("INPUT", {
|
|
4106
|
-
id: endSelectionId,
|
|
4107
|
-
type: "hidden"
|
|
4108
|
-
}), temp;
|
|
4109
|
-
insertNodeInRange(range, startNode);
|
|
4110
|
-
range.collapse(false);
|
|
4111
|
-
insertNodeInRange(range, endNode);
|
|
4112
|
-
if (startNode.compareDocumentPosition(endNode) & DOCUMENT_POSITION_PRECEDING) {
|
|
4113
|
-
startNode.id = endSelectionId;
|
|
4114
|
-
endNode.id = startSelectionId;
|
|
4115
|
-
temp = startNode;
|
|
4116
|
-
startNode = endNode;
|
|
4117
|
-
endNode = temp;
|
|
4118
|
-
}
|
|
4119
|
-
range.setStartAfter(startNode);
|
|
4120
|
-
range.setEndBefore(endNode);
|
|
4121
|
-
};
|
|
4122
|
-
proto._getRangeAndRemoveBookmark = function(range) {
|
|
4123
|
-
var root = this._root, start = root.querySelector("#" + startSelectionId), end = root.querySelector("#" + endSelectionId);
|
|
4124
|
-
if (start && end) {
|
|
4125
|
-
var startContainer = start.parentNode, endContainer = end.parentNode, startOffset = indexOf.call(startContainer.childNodes, start), endOffset = indexOf.call(endContainer.childNodes, end);
|
|
4126
|
-
if (startContainer === endContainer) {
|
|
4127
|
-
endOffset -= 1;
|
|
4128
|
-
}
|
|
4129
|
-
detach(start);
|
|
4130
|
-
detach(end);
|
|
4131
|
-
if (!range) {
|
|
4132
|
-
range = this._doc.createRange();
|
|
4133
|
-
}
|
|
4134
|
-
range.setStart(startContainer, startOffset);
|
|
4135
|
-
range.setEnd(endContainer, endOffset);
|
|
4136
|
-
mergeInlines(startContainer, range);
|
|
4137
|
-
if (startContainer !== endContainer) {
|
|
4138
|
-
mergeInlines(endContainer, range);
|
|
4139
|
-
}
|
|
4140
|
-
if (range.collapsed) {
|
|
4141
|
-
startContainer = range.startContainer;
|
|
4142
|
-
if (startContainer.nodeType === TEXT_NODE) {
|
|
4143
|
-
endContainer = startContainer.childNodes[range.startOffset];
|
|
4144
|
-
if (!endContainer || endContainer.nodeType !== TEXT_NODE) {
|
|
4145
|
-
endContainer = startContainer.childNodes[range.startOffset - 1];
|
|
4146
|
-
}
|
|
4147
|
-
if (endContainer && endContainer.nodeType === TEXT_NODE) {
|
|
4148
|
-
range.setStart(endContainer, 0);
|
|
4149
|
-
range.collapse(true);
|
|
4150
|
-
}
|
|
4151
|
-
}
|
|
4152
|
-
}
|
|
4153
|
-
}
|
|
4154
|
-
return range || null;
|
|
4155
|
-
};
|
|
4156
|
-
proto._keyUpDetectChange = function(event) {
|
|
4157
|
-
var code = event.keyCode;
|
|
4158
|
-
if (!event.ctrlKey && !event.metaKey && !event.altKey && (code < 16 || code > 20) && (code < 33 || code > 45)) {
|
|
4159
|
-
this._docWasChanged();
|
|
4160
|
-
}
|
|
4161
|
-
};
|
|
4162
|
-
proto._docWasChanged = function() {
|
|
4163
|
-
if (canWeakMap) {
|
|
4164
|
-
nodeCategoryCache = /* @__PURE__ */ new WeakMap();
|
|
4165
|
-
}
|
|
4166
|
-
if (this._ignoreAllChanges) {
|
|
4167
|
-
return;
|
|
4168
|
-
}
|
|
4169
|
-
if (canObserveMutations && this._ignoreChange) {
|
|
4170
|
-
this._ignoreChange = false;
|
|
4171
|
-
return;
|
|
4172
|
-
}
|
|
4173
|
-
if (this._isInUndoState) {
|
|
4174
|
-
this._isInUndoState = false;
|
|
4175
|
-
this.fireEvent("undoStateChange", {
|
|
4176
|
-
canUndo: true,
|
|
4177
|
-
canRedo: false
|
|
4178
|
-
});
|
|
4179
|
-
}
|
|
4180
|
-
this.fireEvent("input");
|
|
4181
|
-
};
|
|
4182
|
-
proto._recordUndoState = function(range, replace) {
|
|
4183
|
-
if (!this._isInUndoState || replace) {
|
|
4184
|
-
var undoIndex = this._undoIndex;
|
|
4185
|
-
var undoStack = this._undoStack;
|
|
4186
|
-
var undoConfig = this._config.undo;
|
|
4187
|
-
var undoThreshold = undoConfig.documentSizeThreshold;
|
|
4188
|
-
var undoLimit = undoConfig.undoLimit;
|
|
4189
|
-
var html;
|
|
4190
|
-
if (!replace) {
|
|
4191
|
-
undoIndex += 1;
|
|
4192
|
-
}
|
|
4193
|
-
if (undoIndex < this._undoStackLength) {
|
|
4194
|
-
undoStack.length = this._undoStackLength = undoIndex;
|
|
4195
|
-
}
|
|
4196
|
-
if (range) {
|
|
4197
|
-
this._saveRangeToBookmark(range);
|
|
4198
|
-
}
|
|
4199
|
-
html = this._getHTML();
|
|
4200
|
-
if (undoThreshold > -1 && html.length * 2 > undoThreshold) {
|
|
4201
|
-
if (undoLimit > -1 && undoIndex > undoLimit) {
|
|
4202
|
-
undoStack.splice(0, undoIndex - undoLimit);
|
|
4203
|
-
undoIndex = undoLimit;
|
|
4204
|
-
this._undoStackLength = undoLimit;
|
|
4205
|
-
}
|
|
4206
|
-
}
|
|
4207
|
-
undoStack[undoIndex] = html;
|
|
4208
|
-
this._undoIndex = undoIndex;
|
|
4209
|
-
this._undoStackLength += 1;
|
|
4210
|
-
this._isInUndoState = true;
|
|
4211
|
-
}
|
|
4212
|
-
};
|
|
4213
|
-
proto.saveUndoState = function(range) {
|
|
4214
|
-
if (range === undefined$1) {
|
|
4215
|
-
range = this.getSelection();
|
|
4216
|
-
}
|
|
4217
|
-
this._recordUndoState(range, this._isInUndoState);
|
|
4218
|
-
this._getRangeAndRemoveBookmark(range);
|
|
4219
|
-
return this;
|
|
4220
|
-
};
|
|
4221
|
-
proto.getUndoOrRedoState = function() {
|
|
4222
|
-
return {
|
|
4223
|
-
undo: this._undoIndex !== 0 || !this._isInUndoState,
|
|
4224
|
-
redo: this._undoIndex + 1 < this._undoStackLength && this._isInUndoState
|
|
4225
|
-
};
|
|
4226
|
-
};
|
|
4227
|
-
proto.undo = function() {
|
|
4228
|
-
if (this._undoIndex !== 0 || !this._isInUndoState) {
|
|
4229
|
-
this._recordUndoState(this.getSelection(), false);
|
|
4230
|
-
this._undoIndex -= 1;
|
|
4231
|
-
this._setHTML(this._undoStack[this._undoIndex]);
|
|
4232
|
-
var range = this._getRangeAndRemoveBookmark();
|
|
4233
|
-
if (range) {
|
|
4234
|
-
this.setSelection(range);
|
|
4235
|
-
}
|
|
4236
|
-
this._isInUndoState = true;
|
|
4237
|
-
this.fireEvent("undoStateChange", {
|
|
4238
|
-
canUndo: this._undoIndex !== 0,
|
|
4239
|
-
canRedo: true
|
|
4240
|
-
});
|
|
4241
|
-
this.fireEvent("input");
|
|
4242
|
-
}
|
|
4243
|
-
return this;
|
|
4244
|
-
};
|
|
4245
|
-
proto.redo = function() {
|
|
4246
|
-
var undoIndex = this._undoIndex, undoStackLength = this._undoStackLength;
|
|
4247
|
-
if (undoIndex + 1 < undoStackLength && this._isInUndoState) {
|
|
4248
|
-
this._undoIndex += 1;
|
|
4249
|
-
this._setHTML(this._undoStack[this._undoIndex]);
|
|
4250
|
-
var range = this._getRangeAndRemoveBookmark();
|
|
4251
|
-
if (range) {
|
|
4252
|
-
this.setSelection(range);
|
|
4253
|
-
}
|
|
4254
|
-
this.fireEvent("undoStateChange", {
|
|
4255
|
-
canUndo: true,
|
|
4256
|
-
canRedo: undoIndex + 2 < undoStackLength
|
|
4257
|
-
});
|
|
4258
|
-
this.fireEvent("input");
|
|
4259
|
-
}
|
|
4260
|
-
return this;
|
|
4261
|
-
};
|
|
4262
|
-
proto.hasFormat = function(tag, attributes, range) {
|
|
4263
|
-
tag = tag.toUpperCase();
|
|
4264
|
-
if (!attributes) {
|
|
4265
|
-
attributes = {};
|
|
4266
|
-
}
|
|
4267
|
-
if (!range && !(range = this.getSelection())) {
|
|
4268
|
-
return false;
|
|
4269
|
-
}
|
|
4270
|
-
if (!range.collapsed && range.startContainer.nodeType === TEXT_NODE && range.startOffset === range.startContainer.length && range.startContainer.nextSibling) {
|
|
4271
|
-
range.setStartBefore(range.startContainer.nextSibling);
|
|
4272
|
-
}
|
|
4273
|
-
if (!range.collapsed && range.endContainer.nodeType === TEXT_NODE && range.endOffset === 0 && range.endContainer.previousSibling) {
|
|
4274
|
-
range.setEndAfter(range.endContainer.previousSibling);
|
|
4275
|
-
}
|
|
4276
|
-
var root = this._root;
|
|
4277
|
-
var common = range.commonAncestorContainer;
|
|
4278
|
-
var walker2, node;
|
|
4279
|
-
if (getNearest(common, root, tag, attributes)) {
|
|
4280
|
-
return true;
|
|
4281
|
-
}
|
|
4282
|
-
if (common.nodeType === TEXT_NODE) {
|
|
4283
|
-
return false;
|
|
4284
|
-
}
|
|
4285
|
-
walker2 = new TreeWalker(common, SHOW_TEXT, function(node2) {
|
|
4286
|
-
return isNodeContainedInRange(range, node2, true);
|
|
4287
|
-
});
|
|
4288
|
-
var seenNode = false;
|
|
4289
|
-
while (node = walker2.nextNode()) {
|
|
4290
|
-
if (!getNearest(node, root, tag, attributes)) {
|
|
4291
|
-
return false;
|
|
4292
|
-
}
|
|
4293
|
-
seenNode = true;
|
|
4294
|
-
}
|
|
4295
|
-
return seenNode;
|
|
4296
|
-
};
|
|
4297
|
-
proto.getFontInfo = function(range) {
|
|
4298
|
-
var fontInfo = {
|
|
4299
|
-
color: undefined$1,
|
|
4300
|
-
backgroundColor: undefined$1,
|
|
4301
|
-
family: undefined$1,
|
|
4302
|
-
size: undefined$1
|
|
4303
|
-
};
|
|
4304
|
-
var seenAttributes = 0;
|
|
4305
|
-
var element, style, attr;
|
|
4306
|
-
if (!range && !(range = this.getSelection())) {
|
|
4307
|
-
return fontInfo;
|
|
4308
|
-
}
|
|
4309
|
-
element = range.commonAncestorContainer;
|
|
4310
|
-
if (range.collapsed || element.nodeType === TEXT_NODE) {
|
|
4311
|
-
if (element.nodeType === TEXT_NODE) {
|
|
4312
|
-
element = element.parentNode;
|
|
4313
|
-
}
|
|
4314
|
-
while (seenAttributes < 4 && element) {
|
|
4315
|
-
if (style = element.style) {
|
|
4316
|
-
if (!fontInfo.color && (attr = style.color)) {
|
|
4317
|
-
fontInfo.color = attr;
|
|
4318
|
-
seenAttributes += 1;
|
|
4319
|
-
}
|
|
4320
|
-
if (!fontInfo.backgroundColor && (attr = style.backgroundColor)) {
|
|
4321
|
-
fontInfo.backgroundColor = attr;
|
|
4322
|
-
seenAttributes += 1;
|
|
4323
|
-
}
|
|
4324
|
-
if (!fontInfo.family && (attr = style.fontFamily)) {
|
|
4325
|
-
fontInfo.family = attr;
|
|
4326
|
-
seenAttributes += 1;
|
|
4327
|
-
}
|
|
4328
|
-
if (!fontInfo.size && (attr = style.fontSize)) {
|
|
4329
|
-
fontInfo.size = attr;
|
|
4330
|
-
seenAttributes += 1;
|
|
4331
|
-
}
|
|
4332
|
-
}
|
|
4333
|
-
element = element.parentNode;
|
|
4334
|
-
}
|
|
4335
|
-
}
|
|
4336
|
-
return fontInfo;
|
|
4337
|
-
};
|
|
4338
|
-
proto._addFormat = function(tag, attributes, range) {
|
|
4339
|
-
var root = this._root;
|
|
4340
|
-
var el, walker2, startContainer, endContainer, startOffset, endOffset, node, needsFormat, block;
|
|
4341
|
-
if (range.collapsed) {
|
|
4342
|
-
el = fixCursor(this.createElement(tag, attributes), root);
|
|
4343
|
-
insertNodeInRange(range, el);
|
|
4344
|
-
range.setStart(el.firstChild, el.firstChild.length);
|
|
4345
|
-
range.collapse(true);
|
|
4346
|
-
block = el;
|
|
4347
|
-
while (isInline(block)) {
|
|
4348
|
-
block = block.parentNode;
|
|
4349
|
-
}
|
|
4350
|
-
removeZWS(block, el);
|
|
4351
|
-
} else {
|
|
4352
|
-
walker2 = new TreeWalker(
|
|
4353
|
-
range.commonAncestorContainer,
|
|
4354
|
-
SHOW_TEXT | SHOW_ELEMENT,
|
|
4355
|
-
function(node2) {
|
|
4356
|
-
return (node2.nodeType === TEXT_NODE || node2.nodeName === "BR" || node2.nodeName === "IMG") && isNodeContainedInRange(range, node2, true);
|
|
4357
|
-
}
|
|
4358
|
-
);
|
|
4359
|
-
startContainer = range.startContainer;
|
|
4360
|
-
startOffset = range.startOffset;
|
|
4361
|
-
endContainer = range.endContainer;
|
|
4362
|
-
endOffset = range.endOffset;
|
|
4363
|
-
walker2.currentNode = startContainer;
|
|
4364
|
-
if (!walker2.filter(startContainer)) {
|
|
4365
|
-
startContainer = walker2.nextNode();
|
|
4366
|
-
startOffset = 0;
|
|
4367
|
-
}
|
|
4368
|
-
if (!startContainer) {
|
|
4369
|
-
return range;
|
|
4370
|
-
}
|
|
4371
|
-
do {
|
|
4372
|
-
node = walker2.currentNode;
|
|
4373
|
-
needsFormat = !getNearest(node, root, tag, attributes);
|
|
4374
|
-
if (needsFormat) {
|
|
4375
|
-
if (node === endContainer && node.length > endOffset) {
|
|
4376
|
-
node.splitText(endOffset);
|
|
4377
|
-
}
|
|
4378
|
-
if (node === startContainer && startOffset) {
|
|
4379
|
-
node = node.splitText(startOffset);
|
|
4380
|
-
if (endContainer === startContainer) {
|
|
4381
|
-
endContainer = node;
|
|
4382
|
-
endOffset -= startOffset;
|
|
4383
|
-
}
|
|
4384
|
-
startContainer = node;
|
|
4385
|
-
startOffset = 0;
|
|
4386
|
-
}
|
|
4387
|
-
el = this.createElement(tag, attributes);
|
|
4388
|
-
replaceWith(node, el);
|
|
4389
|
-
el.appendChild(node);
|
|
4390
|
-
}
|
|
4391
|
-
} while (walker2.nextNode());
|
|
4392
|
-
if (endContainer.nodeType !== TEXT_NODE) {
|
|
4393
|
-
if (node.nodeType === TEXT_NODE) {
|
|
4394
|
-
endContainer = node;
|
|
4395
|
-
endOffset = node.length;
|
|
4396
|
-
} else {
|
|
4397
|
-
endContainer = node.parentNode;
|
|
4398
|
-
endOffset = 1;
|
|
4399
|
-
}
|
|
4400
|
-
}
|
|
4401
|
-
range = this.createRange(
|
|
4402
|
-
startContainer,
|
|
4403
|
-
startOffset,
|
|
4404
|
-
endContainer,
|
|
4405
|
-
endOffset
|
|
4406
|
-
);
|
|
4407
|
-
}
|
|
4408
|
-
return range;
|
|
4409
|
-
};
|
|
4410
|
-
proto._removeFormat = function(tag, attributes, range, partial) {
|
|
4411
|
-
this._saveRangeToBookmark(range);
|
|
4412
|
-
var doc2 = this._doc, fixer;
|
|
4413
|
-
if (range.collapsed) {
|
|
4414
|
-
if (cantFocusEmptyTextNodes) {
|
|
4415
|
-
fixer = doc2.createTextNode(ZWS);
|
|
4416
|
-
this._didAddZWS();
|
|
4417
|
-
} else {
|
|
4418
|
-
fixer = doc2.createTextNode("");
|
|
4419
|
-
}
|
|
4420
|
-
insertNodeInRange(range, fixer);
|
|
4421
|
-
}
|
|
4422
|
-
var root = range.commonAncestorContainer;
|
|
4423
|
-
while (isInline(root)) {
|
|
4424
|
-
root = root.parentNode;
|
|
4425
|
-
}
|
|
4426
|
-
var startContainer = range.startContainer, startOffset = range.startOffset, endContainer = range.endContainer, endOffset = range.endOffset, toWrap = [], examineNode = function(node, exemplar) {
|
|
4427
|
-
if (isNodeContainedInRange(range, node, false)) {
|
|
4428
|
-
return;
|
|
4429
|
-
}
|
|
4430
|
-
var isText = node.nodeType === TEXT_NODE, child, next;
|
|
4431
|
-
if (!isNodeContainedInRange(range, node, true)) {
|
|
4432
|
-
if (node.nodeName !== "INPUT" && (!isText || node.data)) {
|
|
4433
|
-
toWrap.push([exemplar, node]);
|
|
4434
|
-
}
|
|
4435
|
-
return;
|
|
4436
|
-
}
|
|
4437
|
-
if (isText) {
|
|
4438
|
-
if (node === endContainer && endOffset !== node.length) {
|
|
4439
|
-
toWrap.push([exemplar, node.splitText(endOffset)]);
|
|
4440
|
-
}
|
|
4441
|
-
if (node === startContainer && startOffset) {
|
|
4442
|
-
node.splitText(startOffset);
|
|
4443
|
-
toWrap.push([exemplar, node]);
|
|
4444
|
-
}
|
|
4445
|
-
} else {
|
|
4446
|
-
for (child = node.firstChild; child; child = next) {
|
|
4447
|
-
next = child.nextSibling;
|
|
4448
|
-
examineNode(child, exemplar);
|
|
4449
|
-
}
|
|
4450
|
-
}
|
|
4451
|
-
}, formatTags = Array.prototype.filter.call(
|
|
4452
|
-
root.getElementsByTagName(tag),
|
|
4453
|
-
function(el) {
|
|
4454
|
-
return isNodeContainedInRange(range, el, true) && hasTagAttributes(el, tag, attributes);
|
|
4455
|
-
}
|
|
4456
|
-
);
|
|
4457
|
-
if (!partial) {
|
|
4458
|
-
formatTags.forEach(function(node) {
|
|
4459
|
-
examineNode(node, node);
|
|
4460
|
-
});
|
|
4461
|
-
}
|
|
4462
|
-
toWrap.forEach(function(item) {
|
|
4463
|
-
var el = item[0].cloneNode(false), node = item[1];
|
|
4464
|
-
replaceWith(node, el);
|
|
4465
|
-
el.appendChild(node);
|
|
4466
|
-
});
|
|
4467
|
-
formatTags.forEach(function(el) {
|
|
4468
|
-
replaceWith(el, empty(el));
|
|
4469
|
-
});
|
|
4470
|
-
this._getRangeAndRemoveBookmark(range);
|
|
4471
|
-
if (fixer) {
|
|
4472
|
-
range.collapse(false);
|
|
4473
|
-
}
|
|
4474
|
-
mergeInlines(root, range);
|
|
4475
|
-
return range;
|
|
4476
|
-
};
|
|
4477
|
-
proto.hasFormatTag = function(tag) {
|
|
4478
|
-
const range = this.getSelection();
|
|
4479
|
-
const node = range.startContainer;
|
|
4480
|
-
return !!getNearest(node, this._root, tag);
|
|
4481
|
-
};
|
|
4482
|
-
proto.changeFormat = function(add, remove, range, partial) {
|
|
4483
|
-
if (!range && !(range = this.getSelection())) {
|
|
4484
|
-
return this;
|
|
4485
|
-
}
|
|
4486
|
-
this.saveUndoState(range);
|
|
4487
|
-
if (remove) {
|
|
4488
|
-
range = this._removeFormat(
|
|
4489
|
-
remove.tag.toUpperCase(),
|
|
4490
|
-
remove.attributes || {},
|
|
4491
|
-
range,
|
|
4492
|
-
partial
|
|
4493
|
-
);
|
|
4494
|
-
}
|
|
4495
|
-
if (add) {
|
|
4496
|
-
range = this._addFormat(
|
|
4497
|
-
add.tag.toUpperCase(),
|
|
4498
|
-
add.attributes || {},
|
|
4499
|
-
range
|
|
4500
|
-
);
|
|
4501
|
-
}
|
|
4502
|
-
this.setSelection(range);
|
|
4503
|
-
this._updatePath(range, true);
|
|
4504
|
-
if (!canObserveMutations) {
|
|
4505
|
-
this._docWasChanged();
|
|
4506
|
-
}
|
|
4507
|
-
return this;
|
|
4508
|
-
};
|
|
4509
|
-
var tagAfterSplit = {
|
|
4510
|
-
DT: "DD",
|
|
4511
|
-
DD: "DT",
|
|
4512
|
-
LI: "LI",
|
|
4513
|
-
PRE: "PRE"
|
|
4514
|
-
};
|
|
4515
|
-
var splitBlock = function(self2, block, node, offset) {
|
|
4516
|
-
var splitTag = tagAfterSplit[block.nodeName], splitProperties = null, nodeAfterSplit = split(node, offset, block.parentNode, self2._root), config = self2._config;
|
|
4517
|
-
var temAttr;
|
|
4518
|
-
if (!splitTag) {
|
|
4519
|
-
splitTag = config.blockTag;
|
|
4520
|
-
var attr = { ...config.blockAttributes };
|
|
4521
|
-
splitProperties = attr;
|
|
4522
|
-
temAttr = { ...attr };
|
|
4523
|
-
delete temAttr.class;
|
|
4524
|
-
}
|
|
4525
|
-
if (!hasTagAttributes(nodeAfterSplit, splitTag, temAttr || splitProperties)) {
|
|
4526
|
-
block = createElement(
|
|
4527
|
-
nodeAfterSplit.ownerDocument,
|
|
4528
|
-
splitTag,
|
|
4529
|
-
splitProperties
|
|
4530
|
-
);
|
|
4531
|
-
if (nodeAfterSplit.dir) {
|
|
4532
|
-
block.dir = nodeAfterSplit.dir;
|
|
4533
|
-
}
|
|
4534
|
-
replaceWith(nodeAfterSplit, block);
|
|
4535
|
-
block.appendChild(empty(nodeAfterSplit));
|
|
4536
|
-
nodeAfterSplit = block;
|
|
4537
|
-
}
|
|
4538
|
-
return nodeAfterSplit;
|
|
4539
|
-
};
|
|
4540
|
-
proto.forEachBlock = function(fn, mutates, range) {
|
|
4541
|
-
if (!range && !(range = this.getSelection())) {
|
|
4542
|
-
return this;
|
|
4543
|
-
}
|
|
4544
|
-
if (mutates) {
|
|
4545
|
-
this.saveUndoState(range);
|
|
4546
|
-
}
|
|
4547
|
-
var root = this._root;
|
|
4548
|
-
var start = getStartBlockOfRange(range, root);
|
|
4549
|
-
var end = getEndBlockOfRange(range, root);
|
|
4550
|
-
if (start && end) {
|
|
4551
|
-
do {
|
|
4552
|
-
if (fn(start) || start === end) {
|
|
4553
|
-
break;
|
|
4554
|
-
}
|
|
4555
|
-
} while (start = getNextBlock(start, root));
|
|
4556
|
-
}
|
|
4557
|
-
if (mutates) {
|
|
4558
|
-
this.setSelection(range);
|
|
4559
|
-
this._updatePath(range, true);
|
|
4560
|
-
if (!canObserveMutations) {
|
|
4561
|
-
this._docWasChanged();
|
|
4562
|
-
}
|
|
4563
|
-
}
|
|
4564
|
-
return this;
|
|
4565
|
-
};
|
|
4566
|
-
proto.modifyBlocks = function(modify, range) {
|
|
4567
|
-
if (!range && !(range = this.getSelection())) {
|
|
4568
|
-
return this;
|
|
4569
|
-
}
|
|
4570
|
-
this._recordUndoState(range, this._isInUndoState);
|
|
4571
|
-
var root = this._root;
|
|
4572
|
-
var frag;
|
|
4573
|
-
expandRangeToBlockBoundaries(range, root);
|
|
4574
|
-
moveRangeBoundariesUpTree(range, root, root, root);
|
|
4575
|
-
frag = extractContentsOfRange(range, root, root);
|
|
4576
|
-
insertNodeInRange(range, modify.call(this, frag));
|
|
4577
|
-
if (range.endOffset < range.endContainer.childNodes.length) {
|
|
4578
|
-
mergeContainers(range.endContainer.childNodes[range.endOffset], root);
|
|
4579
|
-
}
|
|
4580
|
-
mergeContainers(range.startContainer.childNodes[range.startOffset], root);
|
|
4581
|
-
this._getRangeAndRemoveBookmark(range);
|
|
4582
|
-
this.setSelection(range);
|
|
4583
|
-
this._updatePath(range, true);
|
|
4584
|
-
if (!canObserveMutations) {
|
|
4585
|
-
this._docWasChanged();
|
|
4586
|
-
}
|
|
4587
|
-
return this;
|
|
4588
|
-
};
|
|
4589
|
-
var increaseBlockQuoteLevel = function(frag) {
|
|
4590
|
-
return this.createElement(
|
|
4591
|
-
"BLOCKQUOTE",
|
|
4592
|
-
this._config.tagAttributes.blockquote,
|
|
4593
|
-
[
|
|
4594
|
-
frag
|
|
4595
|
-
]
|
|
4596
|
-
);
|
|
4597
|
-
};
|
|
4598
|
-
var decreaseBlockQuoteLevel = function(frag) {
|
|
4599
|
-
var root = this._root;
|
|
4600
|
-
var blockquotes = frag.querySelectorAll("blockquote");
|
|
4601
|
-
Array.prototype.filter.call(blockquotes, function(el) {
|
|
4602
|
-
return !getNearest(el.parentNode, root, "BLOCKQUOTE");
|
|
4603
|
-
}).forEach(function(el) {
|
|
4604
|
-
replaceWith(el, empty(el));
|
|
4605
|
-
});
|
|
4606
|
-
return frag;
|
|
4607
|
-
};
|
|
4608
|
-
var removeBlockQuote = function() {
|
|
4609
|
-
return this.createDefaultBlock([
|
|
4610
|
-
this.createElement("INPUT", {
|
|
4611
|
-
id: startSelectionId,
|
|
4612
|
-
type: "hidden"
|
|
4613
|
-
}),
|
|
4614
|
-
this.createElement("INPUT", {
|
|
4615
|
-
id: endSelectionId,
|
|
4616
|
-
type: "hidden"
|
|
4617
|
-
})
|
|
4618
|
-
]);
|
|
4619
|
-
};
|
|
4620
|
-
var makeList = function(self2, frag, type) {
|
|
4621
|
-
var walker2 = getBlockWalker(frag, self2._root), node, tag, prev, newLi, tagAttributes = self2._config.tagAttributes, listAttrs = tagAttributes[type.toLowerCase()], listItemAttrs = tagAttributes.li;
|
|
4622
|
-
while (node = walker2.nextNode()) {
|
|
4623
|
-
if (node.parentNode.nodeName === "LI") {
|
|
4624
|
-
node = node.parentNode;
|
|
4625
|
-
walker2.currentNode = node.lastChild;
|
|
4626
|
-
}
|
|
4627
|
-
if (node.nodeName !== "LI") {
|
|
4628
|
-
newLi = self2.createElement("LI", listItemAttrs);
|
|
4629
|
-
if (node.dir) {
|
|
4630
|
-
newLi.dir = node.dir;
|
|
4631
|
-
}
|
|
4632
|
-
if ((prev = node.previousSibling) && prev.nodeName === type) {
|
|
4633
|
-
prev.appendChild(newLi);
|
|
4634
|
-
detach(node);
|
|
4635
|
-
} else {
|
|
4636
|
-
replaceWith(
|
|
4637
|
-
node,
|
|
4638
|
-
self2.createElement(type, listAttrs, [
|
|
4639
|
-
newLi
|
|
4640
|
-
])
|
|
4641
|
-
);
|
|
4642
|
-
}
|
|
4643
|
-
newLi.appendChild(empty(node));
|
|
4644
|
-
walker2.currentNode = newLi;
|
|
4645
|
-
} else {
|
|
4646
|
-
node = node.parentNode;
|
|
4647
|
-
tag = node.nodeName;
|
|
4648
|
-
if (tag !== type && /^[OU]L$/.test(tag)) {
|
|
4649
|
-
replaceWith(
|
|
4650
|
-
node,
|
|
4651
|
-
self2.createElement(type, listAttrs, [empty(node)])
|
|
4652
|
-
);
|
|
4653
|
-
}
|
|
4654
|
-
}
|
|
4655
|
-
}
|
|
4656
|
-
};
|
|
4657
|
-
var makeUnorderedList = function(frag) {
|
|
4658
|
-
makeList(this, frag, "UL");
|
|
4659
|
-
return frag;
|
|
4660
|
-
};
|
|
4661
|
-
var makeOrderedList = function(frag) {
|
|
4662
|
-
makeList(this, frag, "OL");
|
|
4663
|
-
return frag;
|
|
4664
|
-
};
|
|
4665
|
-
var removeList = function(frag) {
|
|
4666
|
-
var lists = frag.querySelectorAll("UL, OL"), items = frag.querySelectorAll("LI"), root = this._root, i, l, list, listFrag, item;
|
|
4667
|
-
for (i = 0, l = lists.length; i < l; i += 1) {
|
|
4668
|
-
list = lists[i];
|
|
4669
|
-
listFrag = empty(list);
|
|
4670
|
-
fixContainer(listFrag, root);
|
|
4671
|
-
replaceWith(list, listFrag);
|
|
4672
|
-
}
|
|
4673
|
-
for (i = 0, l = items.length; i < l; i += 1) {
|
|
4674
|
-
item = items[i];
|
|
4675
|
-
if (isBlock(item)) {
|
|
4676
|
-
replaceWith(
|
|
4677
|
-
item,
|
|
4678
|
-
this.createDefaultBlock([empty(item)])
|
|
4679
|
-
);
|
|
4680
|
-
} else {
|
|
4681
|
-
fixContainer(item, root);
|
|
4682
|
-
replaceWith(item, empty(item));
|
|
4683
|
-
}
|
|
4684
|
-
}
|
|
4685
|
-
return frag;
|
|
4686
|
-
};
|
|
4687
|
-
var getListSelection = function(range, root) {
|
|
4688
|
-
var list = range.commonAncestorContainer;
|
|
4689
|
-
var startLi = range.startContainer;
|
|
4690
|
-
var endLi = range.endContainer;
|
|
4691
|
-
while (list && list !== root && !/^[OU]L$/.test(list.nodeName)) {
|
|
4692
|
-
list = list.parentNode;
|
|
4693
|
-
}
|
|
4694
|
-
if (!list || list === root) {
|
|
4695
|
-
return null;
|
|
4696
|
-
}
|
|
4697
|
-
if (startLi === list) {
|
|
4698
|
-
startLi = startLi.childNodes[range.startOffset];
|
|
4699
|
-
}
|
|
4700
|
-
if (endLi === list) {
|
|
4701
|
-
endLi = endLi.childNodes[range.endOffset];
|
|
4702
|
-
}
|
|
4703
|
-
while (startLi && startLi.parentNode !== list) {
|
|
4704
|
-
startLi = startLi.parentNode;
|
|
4705
|
-
}
|
|
4706
|
-
while (endLi && endLi.parentNode !== list) {
|
|
4707
|
-
endLi = endLi.parentNode;
|
|
4708
|
-
}
|
|
4709
|
-
return [list, startLi, endLi];
|
|
4710
|
-
};
|
|
4711
|
-
proto.increaseListLevel = function(range) {
|
|
4712
|
-
if (!range && !(range = this.getSelection())) {
|
|
4713
|
-
return this.focus();
|
|
4714
|
-
}
|
|
4715
|
-
var root = this._root;
|
|
4716
|
-
var listSelection = getListSelection(range, root);
|
|
4717
|
-
if (!listSelection) {
|
|
4718
|
-
return this.focus();
|
|
4719
|
-
}
|
|
4720
|
-
var list = listSelection[0];
|
|
4721
|
-
var startLi = listSelection[1];
|
|
4722
|
-
var endLi = listSelection[2];
|
|
4723
|
-
if (!startLi || startLi === list.firstChild) {
|
|
4724
|
-
return this.focus();
|
|
4725
|
-
}
|
|
4726
|
-
this._recordUndoState(range, this._isInUndoState);
|
|
4727
|
-
var type = list.nodeName;
|
|
4728
|
-
var newParent = startLi.previousSibling;
|
|
4729
|
-
var listAttrs, next;
|
|
4730
|
-
if (newParent.nodeName !== type) {
|
|
4731
|
-
listAttrs = this._config.tagAttributes[type.toLowerCase()];
|
|
4732
|
-
newParent = this.createElement(type, listAttrs);
|
|
4733
|
-
list.insertBefore(newParent, startLi);
|
|
4734
|
-
}
|
|
4735
|
-
do {
|
|
4736
|
-
next = startLi === endLi ? null : startLi.nextSibling;
|
|
4737
|
-
newParent.appendChild(startLi);
|
|
4738
|
-
} while (startLi = next);
|
|
4739
|
-
next = newParent.nextSibling;
|
|
4740
|
-
if (next) {
|
|
4741
|
-
mergeContainers(next, root);
|
|
4742
|
-
}
|
|
4743
|
-
this._getRangeAndRemoveBookmark(range);
|
|
4744
|
-
this.setSelection(range);
|
|
4745
|
-
this._updatePath(range, true);
|
|
4746
|
-
if (!canObserveMutations) {
|
|
4747
|
-
this._docWasChanged();
|
|
4748
|
-
}
|
|
4749
|
-
return this.focus();
|
|
4750
|
-
};
|
|
4751
|
-
proto.decreaseListLevel = function(range) {
|
|
4752
|
-
if (!range && !(range = this.getSelection())) {
|
|
4753
|
-
return this.focus();
|
|
4754
|
-
}
|
|
4755
|
-
var root = this._root;
|
|
4756
|
-
var listSelection = getListSelection(range, root);
|
|
4757
|
-
if (!listSelection) {
|
|
4758
|
-
return this.focus();
|
|
4759
|
-
}
|
|
4760
|
-
var list = listSelection[0];
|
|
4761
|
-
var startLi = listSelection[1];
|
|
4762
|
-
var endLi = listSelection[2];
|
|
4763
|
-
if (!startLi) {
|
|
4764
|
-
startLi = list.firstChild;
|
|
4765
|
-
}
|
|
4766
|
-
if (!endLi) {
|
|
4767
|
-
endLi = list.lastChild;
|
|
4768
|
-
}
|
|
4769
|
-
this._recordUndoState(range, this._isInUndoState);
|
|
4770
|
-
var newParent = list.parentNode;
|
|
4771
|
-
var next;
|
|
4772
|
-
var insertBefore = !endLi.nextSibling ? list.nextSibling : split(list, endLi.nextSibling, newParent, root);
|
|
4773
|
-
if (newParent !== root && newParent.nodeName === "LI") {
|
|
4774
|
-
newParent = newParent.parentNode;
|
|
4775
|
-
while (insertBefore) {
|
|
4776
|
-
next = insertBefore.nextSibling;
|
|
4777
|
-
endLi.appendChild(insertBefore);
|
|
4778
|
-
insertBefore = next;
|
|
4779
|
-
}
|
|
4780
|
-
insertBefore = list.parentNode.nextSibling;
|
|
4781
|
-
}
|
|
4782
|
-
var makeNotList = !/^[OU]L$/.test(newParent.nodeName);
|
|
4783
|
-
do {
|
|
4784
|
-
next = startLi === endLi ? null : startLi.nextSibling;
|
|
4785
|
-
list.removeChild(startLi);
|
|
4786
|
-
if (makeNotList && startLi.nodeName === "LI") {
|
|
4787
|
-
startLi = this.createDefaultBlock([empty(startLi)]);
|
|
4788
|
-
}
|
|
4789
|
-
newParent.insertBefore(startLi, insertBefore);
|
|
4790
|
-
} while (startLi = next);
|
|
4791
|
-
if (!list.firstChild) {
|
|
4792
|
-
detach(list);
|
|
4793
|
-
}
|
|
4794
|
-
if (insertBefore) {
|
|
4795
|
-
mergeContainers(insertBefore, root);
|
|
4796
|
-
}
|
|
4797
|
-
this._getRangeAndRemoveBookmark(range);
|
|
4798
|
-
this.setSelection(range);
|
|
4799
|
-
this._updatePath(range, true);
|
|
4800
|
-
if (!canObserveMutations) {
|
|
4801
|
-
this._docWasChanged();
|
|
4802
|
-
}
|
|
4803
|
-
return this.focus();
|
|
4804
|
-
};
|
|
4805
|
-
proto._ensureBottomLine = function() {
|
|
4806
|
-
var root = this._root;
|
|
4807
|
-
var last = root.lastElementChild;
|
|
4808
|
-
if (!last || last.nodeName !== this._config.blockTag || !isBlock(last)) {
|
|
4809
|
-
root.appendChild(this.createDefaultBlock());
|
|
4810
|
-
}
|
|
4811
|
-
};
|
|
4812
|
-
proto.setKeyHandler = function(key, fn) {
|
|
4813
|
-
this._keyHandlers[key] = fn;
|
|
4814
|
-
return this;
|
|
4815
|
-
};
|
|
4816
|
-
proto._getHTML = function() {
|
|
4817
|
-
return this._root.innerHTML;
|
|
4818
|
-
};
|
|
4819
|
-
function fixTextarea(node) {
|
|
4820
|
-
var nodes = node.childNodes;
|
|
4821
|
-
for (let i = 0; i < nodes.length; i++) {
|
|
4822
|
-
const node2 = nodes[i];
|
|
4823
|
-
if (node2.nodeType === 1) {
|
|
4824
|
-
if (node2.classList.contains("halo-img-content")) {
|
|
4825
|
-
var img = node2.querySelector("img");
|
|
4826
|
-
var desc = img.dataset.desc;
|
|
4827
|
-
var textarea = node2.querySelector("textarea");
|
|
4828
|
-
textarea.innerHTML = "";
|
|
4829
|
-
textarea.value = desc || "";
|
|
4830
|
-
}
|
|
4831
|
-
}
|
|
4832
|
-
}
|
|
4833
|
-
}
|
|
4834
|
-
proto._setHTML = function(html) {
|
|
4835
|
-
var root = this._root;
|
|
4836
|
-
var node = root;
|
|
4837
|
-
node.innerHTML = html;
|
|
4838
|
-
fixTextarea(node);
|
|
4839
|
-
do {
|
|
4840
|
-
fixCursor(node, root);
|
|
4841
|
-
} while (node = getNextBlock(node, root));
|
|
4842
|
-
this._ignoreChange = true;
|
|
4843
|
-
};
|
|
4844
|
-
proto.getHTML = function(withBookMark) {
|
|
4845
|
-
var brs = [], root, node, fixer, html, l, range;
|
|
4846
|
-
if (withBookMark && (range = this.getSelection())) {
|
|
4847
|
-
this._saveRangeToBookmark(range);
|
|
4848
|
-
}
|
|
4849
|
-
if (useTextFixer) {
|
|
4850
|
-
root = this._root;
|
|
4851
|
-
node = root;
|
|
4852
|
-
while (node = getNextBlock(node, root)) {
|
|
4853
|
-
if (!node.textContent && !node.querySelector("BR")) {
|
|
4854
|
-
fixer = this.createElement("BR");
|
|
4855
|
-
node.appendChild(fixer);
|
|
4856
|
-
brs.push(fixer);
|
|
4857
|
-
}
|
|
4858
|
-
}
|
|
4859
|
-
}
|
|
4860
|
-
html = this._getHTML().replace(/\u200B/g, "");
|
|
4861
|
-
if (useTextFixer) {
|
|
4862
|
-
l = brs.length;
|
|
4863
|
-
while (l--) {
|
|
4864
|
-
detach(brs[l]);
|
|
4865
|
-
}
|
|
4866
|
-
}
|
|
4867
|
-
if (range) {
|
|
4868
|
-
this._getRangeAndRemoveBookmark(range);
|
|
4869
|
-
}
|
|
4870
|
-
return html;
|
|
4871
|
-
};
|
|
4872
|
-
proto.setHTML = function(html) {
|
|
4873
|
-
var config = this._config;
|
|
4874
|
-
var sanitizeToDOMFragment2 = config.isSetHTMLSanitized ? config.sanitizeToDOMFragment : null;
|
|
4875
|
-
var root = this._root;
|
|
4876
|
-
var div, frag, child;
|
|
4877
|
-
if (typeof sanitizeToDOMFragment2 === "function") {
|
|
4878
|
-
frag = sanitizeToDOMFragment2(html, false, this);
|
|
4879
|
-
} else {
|
|
4880
|
-
div = this.createElement("DIV");
|
|
4881
|
-
div.innerHTML = html;
|
|
4882
|
-
frag = this._doc.createDocumentFragment();
|
|
4883
|
-
frag.appendChild(empty(div));
|
|
4884
|
-
}
|
|
4885
|
-
cleanTree(frag);
|
|
4886
|
-
cleanupBRs(frag, root, false);
|
|
4887
|
-
fixContainer(frag, root);
|
|
4888
|
-
var node = frag;
|
|
4889
|
-
while (node = getNextBlock(node, root)) {
|
|
4890
|
-
fixCursor(node, root);
|
|
4891
|
-
}
|
|
4892
|
-
this._ignoreChange = true;
|
|
4893
|
-
while (child = root.lastChild) {
|
|
4894
|
-
root.removeChild(child);
|
|
4895
|
-
}
|
|
4896
|
-
root.appendChild(frag);
|
|
4897
|
-
fixCursor(root, root);
|
|
4898
|
-
this._undoIndex = -1;
|
|
4899
|
-
this._undoStack.length = 0;
|
|
4900
|
-
this._undoStackLength = 0;
|
|
4901
|
-
this._isInUndoState = false;
|
|
4902
|
-
var range = this._getRangeAndRemoveBookmark() || this.createRange(root.firstChild, 0);
|
|
4903
|
-
this.saveUndoState(range);
|
|
4904
|
-
this._lastSelection = range;
|
|
4905
|
-
enableRestoreSelection.call(this);
|
|
4906
|
-
this._updatePath(range, true);
|
|
4907
|
-
return this;
|
|
4908
|
-
};
|
|
4909
|
-
proto.insertElement = function(el, range) {
|
|
4910
|
-
if (!range) {
|
|
4911
|
-
range = this.getSelection();
|
|
4912
|
-
}
|
|
4913
|
-
range.collapse(true);
|
|
4914
|
-
if (isInline(el)) {
|
|
4915
|
-
insertNodeInRange(range, el);
|
|
4916
|
-
range.setStartAfter(el);
|
|
4917
|
-
} else {
|
|
4918
|
-
var root = this._root;
|
|
4919
|
-
var splitNode = getStartBlockOfRange(range, root) || root;
|
|
4920
|
-
var parent, nodeAfterSplit;
|
|
4921
|
-
while (splitNode !== root && !splitNode.nextSibling) {
|
|
4922
|
-
splitNode = splitNode.parentNode;
|
|
4923
|
-
}
|
|
4924
|
-
if (splitNode !== root) {
|
|
4925
|
-
parent = splitNode.parentNode;
|
|
4926
|
-
nodeAfterSplit = split(parent, splitNode.nextSibling, root, root);
|
|
4927
|
-
}
|
|
4928
|
-
if (nodeAfterSplit) {
|
|
4929
|
-
root.insertBefore(el, nodeAfterSplit);
|
|
4930
|
-
const node = this.createDefaultBlock();
|
|
4931
|
-
root.insertBefore(node, nodeAfterSplit);
|
|
4932
|
-
nodeAfterSplit = node;
|
|
4933
|
-
} else {
|
|
4934
|
-
root.appendChild(el);
|
|
4935
|
-
nodeAfterSplit = this.createDefaultBlock();
|
|
4936
|
-
root.appendChild(nodeAfterSplit);
|
|
4937
|
-
}
|
|
4938
|
-
range.setStart(nodeAfterSplit, 0);
|
|
4939
|
-
range.setEnd(nodeAfterSplit, 0);
|
|
4940
|
-
moveRangeBoundariesDownTree(range);
|
|
4941
|
-
}
|
|
4942
|
-
this.focus();
|
|
4943
|
-
this.setSelection(range);
|
|
4944
|
-
this._updatePath(range);
|
|
4945
|
-
if (!canObserveMutations) {
|
|
4946
|
-
this._docWasChanged();
|
|
4947
|
-
}
|
|
4948
|
-
return this;
|
|
4949
|
-
};
|
|
4950
|
-
proto.insertImage = function(src, attributes) {
|
|
4951
|
-
var img = this.createElement("IMG", mergeObjects({
|
|
4952
|
-
src
|
|
4953
|
-
}, attributes, true));
|
|
4954
|
-
this.insertElement(img);
|
|
4955
|
-
return img;
|
|
4956
|
-
};
|
|
4957
|
-
var linkRegExp = /\b((?:(?:ht|f)tps?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,}\/)(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))|([\w\-.%+]+@(?:[\w\-]+\.)+[A-Z]{2,}\b)(?:\?[^&?\s]+=[^&?\s]+(?:&[^&?\s]+=[^&?\s]+)*)?/i;
|
|
4958
|
-
var addLinks = function(frag, root, self2) {
|
|
4959
|
-
var doc2 = frag.ownerDocument, walker2 = new TreeWalker(
|
|
4960
|
-
frag,
|
|
4961
|
-
SHOW_TEXT,
|
|
4962
|
-
function(node2) {
|
|
4963
|
-
return !getNearest(node2, root, "A");
|
|
4964
|
-
}
|
|
4965
|
-
), defaultAttributes = self2._config.tagAttributes.a, node, data, parent, match, index, endIndex, child;
|
|
4966
|
-
while (node = walker2.nextNode()) {
|
|
4967
|
-
data = node.data;
|
|
4968
|
-
parent = node.parentNode;
|
|
4969
|
-
while (match = linkRegExp.exec(data)) {
|
|
4970
|
-
index = match.index;
|
|
4971
|
-
endIndex = index + match[0].length;
|
|
4972
|
-
if (index) {
|
|
4973
|
-
child = doc2.createTextNode(data.slice(0, index));
|
|
4974
|
-
parent.insertBefore(child, node);
|
|
4975
|
-
}
|
|
4976
|
-
child = self2.createElement("A", mergeObjects({
|
|
4977
|
-
href: match[1] ? /^(?:ht|f)tps?:/i.test(match[1]) ? match[1] : "http://" + match[1] : "mailto:" + match[0]
|
|
4978
|
-
}, defaultAttributes, false));
|
|
4979
|
-
child.textContent = data.slice(index, endIndex);
|
|
4980
|
-
parent.insertBefore(child, node);
|
|
4981
|
-
node.data = data = data.slice(endIndex);
|
|
4982
|
-
}
|
|
4983
|
-
}
|
|
4984
|
-
};
|
|
4985
|
-
proto.insertHTML = function(html, isPaste) {
|
|
4986
|
-
var config = this._config;
|
|
4987
|
-
var sanitizeToDOMFragment2 = config.isInsertedHTMLSanitized ? config.sanitizeToDOMFragment : null;
|
|
4988
|
-
var range = this.getSelection();
|
|
4989
|
-
var doc2 = this._doc;
|
|
4990
|
-
var startFragmentIndex, endFragmentIndex;
|
|
4991
|
-
var div, frag, root, node, event;
|
|
4992
|
-
if (typeof sanitizeToDOMFragment2 === "function") {
|
|
4993
|
-
frag = sanitizeToDOMFragment2(html, isPaste, this);
|
|
4994
|
-
} else {
|
|
4995
|
-
if (isPaste) {
|
|
4996
|
-
startFragmentIndex = html.indexOf("<!--StartFragment-->");
|
|
4997
|
-
endFragmentIndex = html.lastIndexOf("<!--EndFragment-->");
|
|
4998
|
-
if (startFragmentIndex > -1 && endFragmentIndex > -1) {
|
|
4999
|
-
html = html.slice(startFragmentIndex + 20, endFragmentIndex);
|
|
5000
|
-
}
|
|
5001
|
-
}
|
|
5002
|
-
if (/<\/td>((?!<\/tr>)[\s\S])*$/i.test(html)) {
|
|
5003
|
-
html = "<TR>" + html + "</TR>";
|
|
5004
|
-
}
|
|
5005
|
-
if (/<\/tr>((?!<\/table>)[\s\S])*$/i.test(html)) {
|
|
5006
|
-
html = "<TABLE>" + html + "</TABLE>";
|
|
5007
|
-
}
|
|
5008
|
-
div = this.createElement("DIV");
|
|
5009
|
-
div.innerHTML = html;
|
|
5010
|
-
frag = doc2.createDocumentFragment();
|
|
5011
|
-
frag.appendChild(empty(div));
|
|
5012
|
-
}
|
|
5013
|
-
this.saveUndoState(range);
|
|
5014
|
-
try {
|
|
5015
|
-
root = this._root;
|
|
5016
|
-
node = frag;
|
|
5017
|
-
event = {
|
|
5018
|
-
fragment: frag,
|
|
5019
|
-
preventDefault: function() {
|
|
5020
|
-
this.defaultPrevented = true;
|
|
5021
|
-
},
|
|
5022
|
-
defaultPrevented: false
|
|
5023
|
-
};
|
|
5024
|
-
addLinks(frag, frag, this);
|
|
5025
|
-
cleanTree(frag);
|
|
5026
|
-
cleanupBRs(frag, root, false);
|
|
5027
|
-
removeEmptyInlines(frag);
|
|
5028
|
-
frag.normalize();
|
|
5029
|
-
while (node = getNextBlock(node, frag)) {
|
|
5030
|
-
fixCursor(node, root);
|
|
5031
|
-
}
|
|
5032
|
-
if (isPaste) {
|
|
5033
|
-
this.fireEvent("willPaste", event);
|
|
5034
|
-
}
|
|
5035
|
-
if (!event.defaultPrevented) {
|
|
5036
|
-
insertTreeFragmentIntoRange(range, event.fragment, root);
|
|
5037
|
-
if (!canObserveMutations) {
|
|
5038
|
-
this._docWasChanged();
|
|
5039
|
-
}
|
|
5040
|
-
range.collapse(false);
|
|
5041
|
-
this._ensureBottomLine();
|
|
5042
|
-
}
|
|
5043
|
-
this.setSelection(range);
|
|
5044
|
-
this._updatePath(range, true);
|
|
5045
|
-
if (isPaste) {
|
|
5046
|
-
this.focus();
|
|
5047
|
-
}
|
|
5048
|
-
} catch (error) {
|
|
5049
|
-
this.didError(error);
|
|
5050
|
-
}
|
|
5051
|
-
return this;
|
|
5052
|
-
};
|
|
5053
|
-
var escapeHTMLFragement = function(text) {
|
|
5054
|
-
return text.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""");
|
|
5055
|
-
};
|
|
5056
|
-
proto.insertPlainText = function(plainText, isPaste) {
|
|
5057
|
-
var lines = plainText.split("\n");
|
|
5058
|
-
var config = this._config;
|
|
5059
|
-
var tag = config.blockTag;
|
|
5060
|
-
var attributes = config.blockAttributes;
|
|
5061
|
-
var closeBlock = "</" + tag + ">";
|
|
5062
|
-
var openBlock2 = "<" + tag;
|
|
5063
|
-
var attr, i, l, line;
|
|
5064
|
-
for (attr in attributes) {
|
|
5065
|
-
openBlock2 += " " + attr + '="' + escapeHTMLFragement(attributes[attr]) + '"';
|
|
5066
|
-
}
|
|
5067
|
-
openBlock2 += ">";
|
|
5068
|
-
for (i = 0, l = lines.length; i < l; i += 1) {
|
|
5069
|
-
line = lines[i];
|
|
5070
|
-
line = escapeHTMLFragement(line).replace(/ (?= )/g, " ");
|
|
5071
|
-
lines[i] = openBlock2 + (line || "<BR>") + closeBlock;
|
|
5072
|
-
}
|
|
5073
|
-
return this.insertHTML(lines.join(""), isPaste);
|
|
5074
|
-
};
|
|
5075
|
-
var command = function(method, arg, arg2) {
|
|
5076
|
-
return function() {
|
|
5077
|
-
this[method](arg, arg2);
|
|
5078
|
-
return this.focus();
|
|
5079
|
-
};
|
|
5080
|
-
};
|
|
5081
|
-
proto.addStyles = function(styles) {
|
|
5082
|
-
if (styles) {
|
|
5083
|
-
var head = this._doc.documentElement.firstChild, style = this.createElement("STYLE", {
|
|
5084
|
-
type: "text/css"
|
|
5085
|
-
});
|
|
5086
|
-
style.appendChild(this._doc.createTextNode(styles));
|
|
5087
|
-
head.appendChild(style);
|
|
5088
|
-
}
|
|
5089
|
-
return this;
|
|
5090
|
-
};
|
|
5091
|
-
proto.bold = command("changeFormat", { tag: "B" });
|
|
5092
|
-
proto.italic = command("changeFormat", { tag: "I" });
|
|
5093
|
-
proto.underline = command("changeFormat", { tag: "U" });
|
|
5094
|
-
proto.strikethrough = command("changeFormat", { tag: "S" });
|
|
5095
|
-
proto.subscript = command("changeFormat", { tag: "SUB" }, { tag: "SUP" });
|
|
5096
|
-
proto.superscript = command("changeFormat", { tag: "SUP" }, { tag: "SUB" });
|
|
5097
|
-
proto.removeBold = command("changeFormat", null, { tag: "B" });
|
|
5098
|
-
proto.removeItalic = command("changeFormat", null, { tag: "I" });
|
|
5099
|
-
proto.removeUnderline = command("changeFormat", null, { tag: "U" });
|
|
5100
|
-
proto.removeStrikethrough = command("changeFormat", null, { tag: "S" });
|
|
5101
|
-
proto.removeSubscript = command("changeFormat", null, { tag: "SUB" });
|
|
5102
|
-
proto.removeSuperscript = command("changeFormat", null, { tag: "SUP" });
|
|
5103
|
-
proto.makeLink = function(url, attributes) {
|
|
5104
|
-
var range = this.getSelection();
|
|
5105
|
-
if (range.collapsed) {
|
|
5106
|
-
var protocolEnd = url.indexOf(":") + 1;
|
|
5107
|
-
if (protocolEnd) {
|
|
5108
|
-
while (url[protocolEnd] === "/") {
|
|
5109
|
-
protocolEnd += 1;
|
|
5110
|
-
}
|
|
5111
|
-
}
|
|
5112
|
-
insertNodeInRange(
|
|
5113
|
-
range,
|
|
5114
|
-
this._doc.createTextNode(url.slice(protocolEnd))
|
|
5115
|
-
);
|
|
5116
|
-
}
|
|
5117
|
-
attributes = mergeObjects(
|
|
5118
|
-
mergeObjects({
|
|
5119
|
-
href: url
|
|
5120
|
-
}, attributes, true),
|
|
5121
|
-
this._config.tagAttributes.a,
|
|
5122
|
-
false
|
|
5123
|
-
);
|
|
5124
|
-
this.changeFormat({
|
|
5125
|
-
tag: "A",
|
|
5126
|
-
attributes
|
|
5127
|
-
}, {
|
|
5128
|
-
tag: "A"
|
|
5129
|
-
}, range);
|
|
5130
|
-
return this.focus();
|
|
5131
|
-
};
|
|
5132
|
-
proto.removeLink = function() {
|
|
5133
|
-
this.changeFormat(null, {
|
|
5134
|
-
tag: "A"
|
|
5135
|
-
}, this.getSelection(), true);
|
|
5136
|
-
return this.focus();
|
|
5137
|
-
};
|
|
5138
|
-
proto.setFontFace = function(name) {
|
|
5139
|
-
this.changeFormat(name ? {
|
|
5140
|
-
tag: "SPAN",
|
|
5141
|
-
attributes: {
|
|
5142
|
-
"class": FONT_FAMILY_CLASS,
|
|
5143
|
-
style: "font-family: " + name + ", sans-serif;"
|
|
5144
|
-
}
|
|
5145
|
-
} : null, {
|
|
5146
|
-
tag: "SPAN",
|
|
5147
|
-
attributes: { "class": FONT_FAMILY_CLASS }
|
|
5148
|
-
});
|
|
5149
|
-
return this.focus();
|
|
5150
|
-
};
|
|
5151
|
-
proto.setFontSize = function(size) {
|
|
5152
|
-
this.changeFormat(size ? {
|
|
5153
|
-
tag: "SPAN",
|
|
5154
|
-
attributes: {
|
|
5155
|
-
"class": FONT_SIZE_CLASS,
|
|
5156
|
-
style: "font-size: " + (typeof size === "number" ? size + "px" : size)
|
|
5157
|
-
}
|
|
5158
|
-
} : null, {
|
|
5159
|
-
tag: "SPAN",
|
|
5160
|
-
attributes: { "class": FONT_SIZE_CLASS }
|
|
5161
|
-
});
|
|
5162
|
-
return this.focus();
|
|
5163
|
-
};
|
|
5164
|
-
proto.setTextColour = function(colour) {
|
|
5165
|
-
this.changeFormat(colour ? {
|
|
5166
|
-
tag: "SPAN",
|
|
5167
|
-
attributes: {
|
|
5168
|
-
"class": COLOUR_CLASS,
|
|
5169
|
-
style: "color:" + colour
|
|
5170
|
-
}
|
|
5171
|
-
} : null);
|
|
5172
|
-
return this.focus();
|
|
5173
|
-
};
|
|
5174
|
-
proto.setHighlightColour = function(colour) {
|
|
5175
|
-
this.changeFormat(colour ? {
|
|
5176
|
-
tag: "SPAN",
|
|
5177
|
-
attributes: {
|
|
5178
|
-
"class": HIGHLIGHT_CLASS,
|
|
5179
|
-
style: "background-color:" + colour
|
|
5180
|
-
}
|
|
5181
|
-
} : colour, {
|
|
5182
|
-
tag: "SPAN",
|
|
5183
|
-
attributes: { "class": HIGHLIGHT_CLASS }
|
|
5184
|
-
});
|
|
5185
|
-
return this.focus();
|
|
5186
|
-
};
|
|
5187
|
-
proto.setTextAlignment = function(alignment) {
|
|
5188
|
-
this.forEachBlock(function(block) {
|
|
5189
|
-
var className = block.className.split(/\s+/).filter(function(klass) {
|
|
5190
|
-
return !!klass && !/^align/.test(klass);
|
|
5191
|
-
}).join(" ");
|
|
5192
|
-
if (alignment) {
|
|
5193
|
-
block.className = className + " align-" + alignment;
|
|
5194
|
-
block.style.textAlign = alignment;
|
|
5195
|
-
} else {
|
|
5196
|
-
block.className = className;
|
|
5197
|
-
block.style.textAlign = "";
|
|
5198
|
-
}
|
|
5199
|
-
}, true);
|
|
5200
|
-
return this.focus();
|
|
5201
|
-
};
|
|
5202
|
-
proto.setIndent = function() {
|
|
5203
|
-
this.forEachBlock(function(block) {
|
|
5204
|
-
var className = block.className.split(/\s+/).filter(function(klass) {
|
|
5205
|
-
return !!klass && !/^indent/.test(klass);
|
|
5206
|
-
}).join(" ");
|
|
5207
|
-
if (block.className.indexOf("indent-text") > -1) {
|
|
5208
|
-
block.className = className;
|
|
5209
|
-
block.style.textIndent = "";
|
|
5210
|
-
} else {
|
|
5211
|
-
block.className = className + " indent-text";
|
|
5212
|
-
block.style.textIndent = "2em";
|
|
5213
|
-
}
|
|
5214
|
-
}, true);
|
|
5215
|
-
return this.focus();
|
|
5216
|
-
};
|
|
5217
|
-
proto.setTextDirection = function(direction) {
|
|
5218
|
-
this.forEachBlock(function(block) {
|
|
5219
|
-
if (direction) {
|
|
5220
|
-
block.dir = direction;
|
|
5221
|
-
} else {
|
|
5222
|
-
block.removeAttribute("dir");
|
|
5223
|
-
}
|
|
5224
|
-
}, true);
|
|
5225
|
-
return this.focus();
|
|
5226
|
-
};
|
|
5227
|
-
function removeFormatting(self2, root, clean) {
|
|
5228
|
-
var node, next;
|
|
5229
|
-
for (node = root.firstChild; node; node = next) {
|
|
5230
|
-
next = node.nextSibling;
|
|
5231
|
-
if (isInline(node)) {
|
|
5232
|
-
if (node.nodeType === TEXT_NODE || node.nodeName === "BR" || node.nodeName === "IMG") {
|
|
5233
|
-
clean.appendChild(node);
|
|
5234
|
-
continue;
|
|
5235
|
-
}
|
|
5236
|
-
} else if (isBlock(node)) {
|
|
5237
|
-
clean.appendChild(self2.createDefaultBlock([
|
|
5238
|
-
removeFormatting(
|
|
5239
|
-
self2,
|
|
5240
|
-
node,
|
|
5241
|
-
self2._doc.createDocumentFragment()
|
|
5242
|
-
)
|
|
5243
|
-
]));
|
|
5244
|
-
continue;
|
|
5245
|
-
}
|
|
5246
|
-
removeFormatting(self2, node, clean);
|
|
5247
|
-
}
|
|
5248
|
-
return clean;
|
|
5249
|
-
}
|
|
5250
|
-
proto.removeAllFormatting = function(range) {
|
|
5251
|
-
if (!range && !(range = this.getSelection()) || range.collapsed) {
|
|
5252
|
-
return this;
|
|
5253
|
-
}
|
|
5254
|
-
var root = this._root;
|
|
5255
|
-
var stopNode = range.commonAncestorContainer;
|
|
5256
|
-
while (stopNode && !isBlock(stopNode)) {
|
|
5257
|
-
stopNode = stopNode.parentNode;
|
|
5258
|
-
}
|
|
5259
|
-
if (!stopNode) {
|
|
5260
|
-
expandRangeToBlockBoundaries(range, root);
|
|
5261
|
-
stopNode = root;
|
|
5262
|
-
}
|
|
5263
|
-
if (stopNode.nodeType === TEXT_NODE) {
|
|
5264
|
-
return this;
|
|
5265
|
-
}
|
|
5266
|
-
this.saveUndoState(range);
|
|
5267
|
-
moveRangeBoundariesUpTree(range, stopNode, stopNode, root);
|
|
5268
|
-
var doc2 = stopNode.ownerDocument;
|
|
5269
|
-
var startContainer = range.startContainer;
|
|
5270
|
-
var startOffset = range.startOffset;
|
|
5271
|
-
var endContainer = range.endContainer;
|
|
5272
|
-
var endOffset = range.endOffset;
|
|
5273
|
-
var formattedNodes = doc2.createDocumentFragment();
|
|
5274
|
-
var cleanNodes = doc2.createDocumentFragment();
|
|
5275
|
-
var nodeAfterSplit = split(endContainer, endOffset, stopNode, root);
|
|
5276
|
-
var nodeInSplit = split(startContainer, startOffset, stopNode, root);
|
|
5277
|
-
var nextNode, childNodes;
|
|
5278
|
-
while (nodeInSplit !== nodeAfterSplit) {
|
|
5279
|
-
nextNode = nodeInSplit.nextSibling;
|
|
5280
|
-
formattedNodes.appendChild(nodeInSplit);
|
|
5281
|
-
nodeInSplit = nextNode;
|
|
5282
|
-
}
|
|
5283
|
-
removeFormatting(this, formattedNodes, cleanNodes);
|
|
5284
|
-
cleanNodes.normalize();
|
|
5285
|
-
nodeInSplit = cleanNodes.firstChild;
|
|
5286
|
-
nextNode = cleanNodes.lastChild;
|
|
5287
|
-
childNodes = stopNode.childNodes;
|
|
5288
|
-
if (nodeInSplit) {
|
|
5289
|
-
stopNode.insertBefore(cleanNodes, nodeAfterSplit);
|
|
5290
|
-
startOffset = indexOf.call(childNodes, nodeInSplit);
|
|
5291
|
-
endOffset = indexOf.call(childNodes, nextNode) + 1;
|
|
5292
|
-
} else {
|
|
5293
|
-
startOffset = indexOf.call(childNodes, nodeAfterSplit);
|
|
5294
|
-
endOffset = startOffset;
|
|
5295
|
-
}
|
|
5296
|
-
range.setStart(stopNode, startOffset);
|
|
5297
|
-
range.setEnd(stopNode, endOffset);
|
|
5298
|
-
mergeInlines(stopNode, range);
|
|
5299
|
-
moveRangeBoundariesDownTree(range);
|
|
5300
|
-
this.setSelection(range);
|
|
5301
|
-
this._updatePath(range, true);
|
|
5302
|
-
return this.focus();
|
|
5303
|
-
};
|
|
5304
|
-
proto.increaseQuoteLevel = command("modifyBlocks", increaseBlockQuoteLevel);
|
|
5305
|
-
proto.decreaseQuoteLevel = command("modifyBlocks", decreaseBlockQuoteLevel);
|
|
5306
|
-
proto.makeUnorderedList = command("modifyBlocks", makeUnorderedList);
|
|
5307
|
-
proto.makeOrderedList = command("modifyBlocks", makeOrderedList);
|
|
5308
|
-
proto.removeList = command("modifyBlocks", removeList);
|
|
5309
|
-
proto.empty = empty;
|
|
5310
|
-
Squire.isInline = isInline;
|
|
5311
|
-
Squire.isBlock = isBlock;
|
|
5312
|
-
Squire.isContainer = isContainer;
|
|
5313
|
-
Squire.getBlockWalker = getBlockWalker;
|
|
5314
|
-
Squire.getPreviousBlock = getPreviousBlock;
|
|
5315
|
-
Squire.getNextBlock = getNextBlock;
|
|
5316
|
-
Squire.areAlike = areAlike;
|
|
5317
|
-
Squire.hasTagAttributes = hasTagAttributes;
|
|
5318
|
-
Squire.getNearest = getNearest;
|
|
5319
|
-
Squire.isOrContains = isOrContains;
|
|
5320
|
-
Squire.detach = detach;
|
|
5321
|
-
Squire.replaceWith = replaceWith;
|
|
5322
|
-
Squire.empty = empty;
|
|
5323
|
-
Squire.getNodeBefore = getNodeBefore;
|
|
5324
|
-
Squire.getNodeAfter = getNodeAfter;
|
|
5325
|
-
Squire.insertNodeInRange = insertNodeInRange;
|
|
5326
|
-
Squire.extractContentsOfRange = extractContentsOfRange;
|
|
5327
|
-
Squire.deleteContentsOfRange = deleteContentsOfRange;
|
|
5328
|
-
Squire.insertTreeFragmentIntoRange = insertTreeFragmentIntoRange;
|
|
5329
|
-
Squire.isNodeContainedInRange = isNodeContainedInRange;
|
|
5330
|
-
Squire.moveRangeBoundariesDownTree = moveRangeBoundariesDownTree;
|
|
5331
|
-
Squire.moveRangeBoundariesUpTree = moveRangeBoundariesUpTree;
|
|
5332
|
-
Squire.getStartBlockOfRange = getStartBlockOfRange;
|
|
5333
|
-
Squire.getEndBlockOfRange = getEndBlockOfRange;
|
|
5334
|
-
Squire.contentWalker = contentWalker;
|
|
5335
|
-
Squire.rangeDoesStartAtBlockBoundary = rangeDoesStartAtBlockBoundary;
|
|
5336
|
-
Squire.rangeDoesEndAtBlockBoundary = rangeDoesEndAtBlockBoundary;
|
|
5337
|
-
Squire.expandRangeToBlockBoundaries = expandRangeToBlockBoundaries;
|
|
5338
|
-
Squire.onPaste = onPaste;
|
|
5339
|
-
Squire.addLinks = addLinks;
|
|
5340
|
-
Squire.splitBlock = splitBlock;
|
|
5341
|
-
Squire.startSelectionId = startSelectionId;
|
|
5342
|
-
Squire.endSelectionId = endSelectionId;
|
|
5343
|
-
if (typeof exports === "object") {
|
|
5344
|
-
module.exports = Squire;
|
|
5345
|
-
} else if (typeof define === "function" && define.amd) {
|
|
5346
|
-
define(function() {
|
|
5347
|
-
return Squire;
|
|
5348
|
-
});
|
|
5349
|
-
} else {
|
|
5350
|
-
win.Squire = Squire;
|
|
5351
|
-
if (top !== win && doc.documentElement.getAttribute("data-squireinit") === "true") {
|
|
5352
|
-
win.editor = new Squire(doc);
|
|
5353
|
-
if (win.onEditorLoad) {
|
|
5354
|
-
win.onEditorLoad(win.editor);
|
|
5355
|
-
win.onEditorLoad = null;
|
|
5356
|
-
}
|
|
5357
|
-
}
|
|
5358
|
-
}
|
|
5359
|
-
})(document);
|
|
5360
|
-
const Editor_vue_vue_type_style_index_0_lang = "";
|
|
5361
|
-
const cursorImg = `url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAYCAMAAACoeN87AAAAh1BMVEUAAAACAgL39/cICAgFBQUAAAADAwMKCgr6+vrn5+fr6+v6+voEBAT19fXm5ubf39+pqanBwcH8/PzOzs76+vrx8fHz8/P29vbh4eHm5ubT09OXl5f///9ZWVkiIiLIyMjGxsY+Pj5LS0uenp4vLy/V1dXk5OSsrKxnZ2eRkZF1dXXj4+ODg4P4y9kGAAAAHHRSTlMACMUDDQYOCuONi8MSt2tJMCryT9OpqKaRezobrP6h8wAAAR9JREFUKM+dk1lygzAMQOMtxoQlS/dKBrMn7f3PVwEFPND0I+/Dg8RD0mjM7nGEZoIOqfwc+0jTVE+RgcAcTQBvbFFOvM7zJvgcIw2uaKF0DuRS5LW1RBmKMQyhdugyMGJWGMciywrkauobZrY2kgxPQQCcFGIPFvb+sNGkSLUo3iDqEvPzqJz5IVF/KEnTIVak0IG35rJV1OFGr7AEKJHULh7KRKRE86gHLPKZAjnrkwEpgV4U6zEqEugRpL+TmXtVEGaQlO0sfK1sVnds7Pf/yim42q9FccjVai/q5WornKlsm4hVFRGX6NFlT7rPSlPb3GgxNnrmHvF7nxYh5A5dDaEaWzGf4TsGzpXQFsut2yDC37tr1O4eSurhD6CaPzWzJeCQ3tPtAAAAAElFTkSuQmCC) 28 10, text`;
|
|
5362
|
-
const keyToEditorMethod = {
|
|
5363
|
-
bold: "bold",
|
|
5364
|
-
italic: "italic",
|
|
5365
|
-
underline: "underline",
|
|
5366
|
-
size: "setFontSize",
|
|
5367
|
-
color: "setTextColour"
|
|
5368
|
-
};
|
|
5369
|
-
const _sfc_main = {
|
|
5370
|
-
name: "Edit",
|
|
5371
|
-
components: {
|
|
5372
|
-
InsertArticle: _sfc_main$5,
|
|
5373
|
-
ImgUpload: _sfc_main$4,
|
|
5374
|
-
VideoUpload,
|
|
5375
|
-
CollectArticle
|
|
5376
|
-
},
|
|
5377
|
-
props: [
|
|
5378
|
-
"disabled",
|
|
5379
|
-
"isOss",
|
|
5380
|
-
"getEassyDetail",
|
|
5381
|
-
"getArticleList",
|
|
5382
|
-
"importEssay",
|
|
5383
|
-
"uploadImageByOther"
|
|
5384
|
-
],
|
|
5385
|
-
data() {
|
|
5386
|
-
return {
|
|
5387
|
-
hasArticleCard: false,
|
|
5388
|
-
cursorStyle: "auto",
|
|
5389
|
-
titleCount: 0,
|
|
5390
|
-
viewLinkDialog: false,
|
|
5391
|
-
linkForm: {
|
|
5392
|
-
linkAddress: "",
|
|
5393
|
-
linkWriting: ""
|
|
5394
|
-
},
|
|
5395
|
-
setAlignFlag: true,
|
|
5396
|
-
article: {},
|
|
5397
|
-
imgList: [],
|
|
5398
|
-
videoList: [],
|
|
5399
|
-
visibleVideo: false,
|
|
5400
|
-
visibleCollectArticle: false,
|
|
5401
|
-
visibleArticle: false,
|
|
5402
|
-
visibleImg: false,
|
|
5403
|
-
imgType: "normal",
|
|
5404
|
-
typeEnum: {
|
|
5405
|
-
"\u6587\u5B57": "1",
|
|
5406
|
-
"\u56FE\u7247": "2",
|
|
5407
|
-
"\u56FE\u6587": "3",
|
|
5408
|
-
"\u6BB5\u843D\u6807\u9898": "4",
|
|
5409
|
-
"\u5173\u8054": "5",
|
|
5410
|
-
"\u5355\u89C6\u9891": "6",
|
|
5411
|
-
"\u89C6\u9891\u6587\u5B57": "7",
|
|
5412
|
-
"URL": "8",
|
|
5413
|
-
"\u6587\u7AE0\u5361\u7247": "11"
|
|
5414
|
-
},
|
|
5415
|
-
fontInfo: {
|
|
5416
|
-
size: ""
|
|
5417
|
-
},
|
|
5418
|
-
user: {},
|
|
5419
|
-
editor: {},
|
|
5420
|
-
editorDom: {},
|
|
5421
|
-
uploadStore: {},
|
|
5422
|
-
linkContent: "",
|
|
5423
|
-
loadingText: "",
|
|
5424
|
-
progressPercent: "",
|
|
5425
|
-
currentIndex: 0,
|
|
5426
|
-
loading: false,
|
|
5427
|
-
viewStatus: false,
|
|
5428
|
-
linkStatus: false,
|
|
5429
|
-
styleStatus: {
|
|
5430
|
-
bold: false,
|
|
5431
|
-
italic: false,
|
|
5432
|
-
size: "",
|
|
5433
|
-
color: "",
|
|
5434
|
-
underline: false,
|
|
5435
|
-
title: false
|
|
5436
|
-
},
|
|
5437
|
-
contentLen: 0,
|
|
5438
|
-
imgCount: 0,
|
|
5439
|
-
backState: {
|
|
5440
|
-
redo: false,
|
|
5441
|
-
undo: false
|
|
5442
|
-
},
|
|
5443
|
-
countList: [],
|
|
5444
|
-
replaceSeamless: 0,
|
|
5445
|
-
seamlessCount: 0
|
|
5446
|
-
};
|
|
5447
|
-
},
|
|
5448
|
-
computed: {
|
|
5449
|
-
align() {
|
|
5450
|
-
if (!this.isInputing && !this.titleCount && !this.hasArticleCard) {
|
|
5451
|
-
return this.getCursorAlignStyle() || "left";
|
|
5452
|
-
}
|
|
5453
|
-
return "left";
|
|
5454
|
-
},
|
|
5455
|
-
isInputing() {
|
|
5456
|
-
return this.contentLen > 0 || this.imgCount > 0;
|
|
5457
|
-
}
|
|
5458
|
-
},
|
|
5459
|
-
watch: {
|
|
5460
|
-
progressPercent(val) {
|
|
5461
|
-
const inner = document.querySelector(".video-progress .inner");
|
|
5462
|
-
console.log(val, "\u89C6\u9891\u4E0A\u4F20\u8FDB\u5EA6");
|
|
5463
|
-
if (inner) {
|
|
5464
|
-
inner.style.width = val + "%";
|
|
5465
|
-
if (val === 100) {
|
|
5466
|
-
document.querySelector(".video-progress").innerHTML = `
|
|
5467
|
-
<div class="no-calc" style="text-align:center;color:#999999;font-size:18px;">\u6B63\u5728\u83B7\u53D6\u89C6\u9891\u5C01\u9762</div>
|
|
5468
|
-
`;
|
|
5469
|
-
}
|
|
5470
|
-
}
|
|
5471
|
-
},
|
|
5472
|
-
disabled: {
|
|
5473
|
-
handler(val) {
|
|
5474
|
-
if (val) {
|
|
5475
|
-
this.editorDom.contentEditable = "false";
|
|
5476
|
-
}
|
|
5477
|
-
},
|
|
5478
|
-
immediate: true
|
|
1824
|
+
},
|
|
1825
|
+
immediate: true
|
|
5479
1826
|
}
|
|
5480
1827
|
},
|
|
5481
1828
|
created() {
|
|
@@ -5491,7 +1838,9 @@ const _sfc_main = {
|
|
|
5491
1838
|
me.editorDom = document.getElementById("editor-content");
|
|
5492
1839
|
me.editorDom.addEventListener("blur", this.canSetAlign);
|
|
5493
1840
|
if (!window.Squire) {
|
|
5494
|
-
|
|
1841
|
+
import("./squire-raw.b8e23325.js").then(function() {
|
|
1842
|
+
me.initSquire();
|
|
1843
|
+
});
|
|
5495
1844
|
} else {
|
|
5496
1845
|
me.initSquire();
|
|
5497
1846
|
}
|
|
@@ -6602,8 +2951,6 @@ const _hoisted_3 = {
|
|
|
6602
2951
|
slot: "footer",
|
|
6603
2952
|
class: "dialog-footer"
|
|
6604
2953
|
};
|
|
6605
|
-
const _hoisted_4 = /* @__PURE__ */ createTextVNode("\u53D6 \u6D88");
|
|
6606
|
-
const _hoisted_5 = /* @__PURE__ */ createTextVNode("\u786E \u5B9A");
|
|
6607
2954
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
6608
2955
|
const _component_el_input = resolveComponent("el-input");
|
|
6609
2956
|
const _component_el_form_item = resolveComponent("el-form-item");
|
|
@@ -6627,8 +2974,8 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
6627
2974
|
onKeyup: _cache[0] || (_cache[0] = ($event) => $options.setBack($event))
|
|
6628
2975
|
}, null, 36),
|
|
6629
2976
|
createVNode(_component_el_dialog, {
|
|
6630
|
-
|
|
6631
|
-
"onUpdate:
|
|
2977
|
+
modelValue: $data.viewLinkDialog,
|
|
2978
|
+
"onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => $data.viewLinkDialog = $event),
|
|
6632
2979
|
"before-close": $options.handleClose,
|
|
6633
2980
|
class: "squire-dialog-content",
|
|
6634
2981
|
"append-to-body": ""
|
|
@@ -6671,7 +3018,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
6671
3018
|
onClick: _cache[3] || (_cache[3] = ($event) => $data.viewLinkDialog = false)
|
|
6672
3019
|
}, {
|
|
6673
3020
|
default: withCtx(() => [
|
|
6674
|
-
|
|
3021
|
+
createTextVNode("\u53D6 \u6D88")
|
|
6675
3022
|
]),
|
|
6676
3023
|
_: 1
|
|
6677
3024
|
}),
|
|
@@ -6680,14 +3027,14 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
6680
3027
|
onClick: $options.insertLink
|
|
6681
3028
|
}, {
|
|
6682
3029
|
default: withCtx(() => [
|
|
6683
|
-
|
|
3030
|
+
createTextVNode("\u786E \u5B9A")
|
|
6684
3031
|
]),
|
|
6685
3032
|
_: 1
|
|
6686
3033
|
}, 8, ["onClick"])
|
|
6687
3034
|
])
|
|
6688
3035
|
]),
|
|
6689
3036
|
_: 1
|
|
6690
|
-
}, 8, ["
|
|
3037
|
+
}, 8, ["modelValue", "before-close"]),
|
|
6691
3038
|
createVNode(_component_InsertArticle, {
|
|
6692
3039
|
article: $data.article,
|
|
6693
3040
|
visible: $data.visibleArticle,
|