vue-editify 0.1.9 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. package/examples/App.vue +22 -5644
  2. package/examples/main.ts +4 -0
  3. package/lib/components/button/button.vue.d.ts +143 -0
  4. package/lib/components/button/props.d.ts +73 -0
  5. package/lib/components/checkbox/checkbox.vue.d.ts +80 -0
  6. package/lib/components/checkbox/props.d.ts +36 -0
  7. package/lib/components/colors/colors.vue.d.ts +47 -0
  8. package/lib/components/colors/props.d.ts +22 -0
  9. package/lib/components/icon/icon.vue.d.ts +14 -0
  10. package/lib/components/icon/props.d.ts +9 -0
  11. package/lib/components/insertImage/insertImage.vue.d.ts +74 -0
  12. package/lib/components/insertImage/props.d.ts +34 -0
  13. package/lib/components/insertLink/insertLink.vue.d.ts +27 -0
  14. package/lib/components/insertLink/props.d.ts +13 -0
  15. package/lib/components/insertTable/insertTable.vue.d.ts +36 -0
  16. package/lib/components/insertTable/props.d.ts +22 -0
  17. package/lib/components/insertVideo/insertVideo.vue.d.ts +74 -0
  18. package/lib/components/insertVideo/props.d.ts +34 -0
  19. package/lib/components/layer/layer.vue.d.ts +129 -0
  20. package/lib/components/layer/props.d.ts +53 -0
  21. package/lib/components/menu/menu.vue.d.ts +25 -0
  22. package/lib/components/menu/props.d.ts +14 -0
  23. package/lib/components/toolbar/props.d.ts +27 -0
  24. package/lib/components/toolbar/toolbar.vue.d.ts +56 -0
  25. package/lib/components/tooltip/props.d.ts +17 -0
  26. package/lib/components/tooltip/tooltip.vue.d.ts +39 -0
  27. package/lib/components/triangle/props.d.ts +19 -0
  28. package/lib/components/triangle/triangle.vue.d.ts +34 -0
  29. package/lib/core/function.d.ts +45 -0
  30. package/lib/core/rule.d.ts +9 -0
  31. package/lib/core/tool.d.ts +185 -0
  32. package/lib/editify/editify.vue.d.ts +676 -0
  33. package/lib/editify/props.d.ts +110 -0
  34. package/lib/editify.es.js +5547 -5667
  35. package/lib/editify.umd.js +1 -1
  36. package/lib/hljs/index.d.ts +7 -0
  37. package/lib/index.d.ts +17 -0
  38. package/lib/locale/en_US.d.ts +3 -0
  39. package/lib/locale/index.d.ts +2 -0
  40. package/lib/locale/zh_CN.d.ts +3 -0
  41. package/lib/style.css +1 -1
  42. package/package.json +16 -8
  43. package/src/components/button/button.less +145 -0
  44. package/src/components/button/button.vue +197 -0
  45. package/src/components/button/props.ts +95 -0
  46. package/src/components/checkbox/checkbox.less +84 -0
  47. package/src/components/checkbox/checkbox.vue +68 -0
  48. package/src/components/checkbox/props.ts +49 -0
  49. package/src/components/colors/colors.less +75 -0
  50. package/src/components/colors/colors.vue +36 -0
  51. package/src/components/colors/props.ts +29 -0
  52. package/src/components/{base/Icon.vue → icon/icon.less} +0 -17
  53. package/src/components/icon/icon.vue +12 -0
  54. package/src/components/icon/props.ts +11 -0
  55. package/src/components/insertImage/insertImage.less +135 -0
  56. package/src/components/insertImage/insertImage.vue +146 -0
  57. package/src/components/insertImage/props.ts +43 -0
  58. package/src/components/insertLink/insertLink.less +64 -0
  59. package/src/components/insertLink/insertLink.vue +58 -0
  60. package/src/components/insertLink/props.ts +16 -0
  61. package/src/components/insertTable/insertTable.less +54 -0
  62. package/src/components/insertTable/insertTable.vue +85 -0
  63. package/src/components/insertTable/props.ts +27 -0
  64. package/src/components/insertVideo/insertVideo.less +135 -0
  65. package/src/components/insertVideo/insertVideo.vue +146 -0
  66. package/src/components/insertVideo/props.ts +43 -0
  67. package/src/components/layer/layer.less +49 -0
  68. package/src/components/layer/layer.vue +598 -0
  69. package/src/components/layer/props.ts +71 -0
  70. package/src/components/menu/menu.less +64 -0
  71. package/src/components/menu/menu.vue +1570 -0
  72. package/src/components/menu/props.ts +17 -0
  73. package/src/components/toolbar/props.ts +35 -0
  74. package/src/components/toolbar/toolbar.less +89 -0
  75. package/src/components/toolbar/toolbar.vue +1101 -0
  76. package/src/components/tooltip/props.ts +21 -0
  77. package/src/components/tooltip/tooltip.less +23 -0
  78. package/src/components/tooltip/tooltip.vue +37 -0
  79. package/src/components/triangle/props.ts +26 -0
  80. package/src/components/triangle/triangle.less +79 -0
  81. package/src/components/triangle/triangle.vue +65 -0
  82. package/src/core/{function.js → function.ts} +268 -267
  83. package/src/core/{rule.js → rule.ts} +33 -33
  84. package/src/core/{tool.js → tool.ts} +221 -145
  85. package/src/editify/editify.less +404 -0
  86. package/src/editify/editify.vue +805 -0
  87. package/src/editify/props.ts +141 -0
  88. package/src/hljs/{index.js → index.ts} +7 -4
  89. package/src/index.ts +32 -0
  90. package/src/locale/{en_US.js → en_US.ts} +3 -1
  91. package/src/locale/index.ts +12 -0
  92. package/src/locale/{zh_CN.js → zh_CN.ts} +3 -1
  93. package/tsconfig.json +27 -0
  94. package/tsconfig.node.json +11 -0
  95. package/vite-env.d.ts +1 -0
  96. package/vite.config.ts +39 -0
  97. package/examples/main.js +0 -4
  98. package/src/Editify.vue +0 -1184
  99. package/src/components/Menu.vue +0 -1623
  100. package/src/components/Toolbar.vue +0 -1215
  101. package/src/components/base/Button.vue +0 -450
  102. package/src/components/base/Checkbox.vue +0 -196
  103. package/src/components/base/Layer.vue +0 -713
  104. package/src/components/base/Tooltip.vue +0 -82
  105. package/src/components/base/Triangle.vue +0 -159
  106. package/src/components/common/Colors.vue +0 -138
  107. package/src/components/common/InsertImage.vue +0 -316
  108. package/src/components/common/InsertLink.vue +0 -136
  109. package/src/components/common/InsertTable.vue +0 -157
  110. package/src/components/common/InsertVideo.vue +0 -316
  111. package/src/index.js +0 -24
  112. package/src/locale/index.js +0 -14
@@ -1,27 +1,28 @@
1
1
  /**
2
2
  * 这里的方法都是对编辑器内容元素进行判断或者操作的方法,不涉及到格式化、dom渲染和光标渲染
3
3
  */
4
- import { AlexElement } from 'alex-editor'
4
+ import { AlexElement, AlexElementsRangeType, AlexEditor } from 'alex-editor'
5
5
  import { common as DapCommon } from 'dap-util'
6
- import { cloneData, queryHasValue, getButtonOptionsConfig } from './tool'
6
+ import { cloneData, queryHasValue, getButtonOptionsConfig, ObjectType } from './tool'
7
+ import { ButtonOptionsItemType } from '../components/button/props'
7
8
 
8
9
  //判断元素是否在某个标签下,如果是返回该标签对应的元素,否则返回null
9
- export const getParsedomElementByElement = (element, parsedom) => {
10
+ export const getParsedomElementByElement = (element: AlexElement, parsedom: string): AlexElement | null => {
10
11
  if (element.isBlock()) {
11
12
  return element.parsedom == parsedom ? element : null
12
13
  }
13
14
  if (!element.isText() && element.parsedom == parsedom) {
14
15
  return element
15
16
  }
16
- return getParsedomElementByElement(element.parent, parsedom)
17
+ return getParsedomElementByElement(element.parent!, parsedom)
17
18
  }
18
19
 
19
20
  //获取光标是否在指定标签下,如果是返回该标签对应的元素,否则返回null
20
- export const getCurrentParsedomElement = (vm, parsedom) => {
21
- if (vm.editor.range.anchor.element.isEqual(vm.editor.range.focus.element)) {
22
- return getParsedomElementByElement(vm.editor.range.anchor.element, parsedom)
21
+ export const getCurrentParsedomElement = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, parsedom: string) => {
22
+ if (editor.range!.anchor.element.isEqual(editor.range!.focus.element)) {
23
+ return getParsedomElementByElement(editor.range!.anchor.element, parsedom)
23
24
  }
24
- const arr = vm.dataRangeCaches.list.map(item => {
25
+ const arr = dataRangeCaches.list.map(item => {
25
26
  return getParsedomElementByElement(item.element, parsedom)
26
27
  })
27
28
  let hasNull = arr.some(el => {
@@ -33,12 +34,12 @@ export const getCurrentParsedomElement = (vm, parsedom) => {
33
34
  }
34
35
  //如果只有一个元素,则返回该元素
35
36
  if (arr.length == 1) {
36
- return arr[0]
37
+ return arr[0]!
37
38
  }
38
39
  //默认数组中的元素都相等
39
40
  let flag = true
40
41
  for (let i = 1; i < arr.length; i++) {
41
- if (!arr[i].isEqual(arr[0])) {
42
+ if (!arr[i]!.isEqual(arr[0]!)) {
42
43
  flag = false
43
44
  break
44
45
  }
@@ -51,7 +52,7 @@ export const getCurrentParsedomElement = (vm, parsedom) => {
51
52
  }
52
53
 
53
54
  //判断元素是否在有序列表或者无序列表下
54
- export const elementIsInList = (element, ordered) => {
55
+ export const elementIsInList = (element: AlexElement, ordered: boolean): boolean => {
55
56
  if (isList(element, ordered)) {
56
57
  return true
57
58
  }
@@ -62,7 +63,7 @@ export const elementIsInList = (element, ordered) => {
62
63
  }
63
64
 
64
65
  //判断元素是否在任务列表下
65
- export const elementIsInTask = element => {
66
+ export const elementIsInTask = (element: AlexElement): boolean => {
66
67
  if (isTask(element)) {
67
68
  return true
68
69
  }
@@ -73,148 +74,148 @@ export const elementIsInTask = element => {
73
74
  }
74
75
 
75
76
  //判断元素是否有序或者无序列表
76
- export const isList = function (element, ordered = false) {
77
- return element.parsedom == 'div' && element.hasMarks() && element.marks['data-editify-list'] == (ordered ? 'ol' : 'ul')
77
+ export const isList = function (element: AlexElement, ordered: boolean | undefined = false) {
78
+ return element.parsedom == 'div' && element.hasMarks() && element.marks!['data-editify-list'] == (ordered ? 'ol' : 'ul')
78
79
  }
79
80
 
80
81
  //判断元素是否任务列表
81
- export const isTask = function (element) {
82
- return element.parsedom == 'div' && element.hasMarks() && element.marks.hasOwnProperty('data-editify-task')
82
+ export const isTask = function (element: AlexElement) {
83
+ return element.parsedom == 'div' && element.hasMarks() && element.marks!.hasOwnProperty('data-editify-task')
83
84
  }
84
85
 
85
86
  //选区是否含有代码块
86
- export const hasPreInRange = vm => {
87
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
88
- return !!getParsedomElementByElement(vm.editor.range.anchor.element, 'pre')
87
+ export const hasPreInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
88
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
89
+ return !!getParsedomElementByElement(editor.range!.anchor.element, 'pre')
89
90
  }
90
- return vm.dataRangeCaches.flatList.some(item => {
91
+ return dataRangeCaches.flatList.some(item => {
91
92
  return !!getParsedomElementByElement(item.element, 'pre')
92
93
  })
93
94
  }
94
95
 
95
96
  //选区是否全部在代码块内
96
- export const isRangeInPre = vm => {
97
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
98
- return !!getParsedomElementByElement(vm.editor.range.anchor.element, 'pre')
97
+ export const isRangeInPre = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
98
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
99
+ return !!getParsedomElementByElement(editor.range!.anchor.element, 'pre')
99
100
  }
100
- return vm.dataRangeCaches.list.every(item => {
101
+ return dataRangeCaches.list.every(item => {
101
102
  return !!getParsedomElementByElement(item.element, 'pre')
102
103
  })
103
104
  }
104
105
 
105
106
  //选区是否含有引用
106
- export const hasQuoteInRange = vm => {
107
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
108
- return !!getParsedomElementByElement(vm.editor.range.anchor.element, 'blockquote')
107
+ export const hasQuoteInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
108
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
109
+ return !!getParsedomElementByElement(editor.range!.anchor.element, 'blockquote')
109
110
  }
110
- return vm.dataRangeCaches.flatList.some(item => {
111
+ return dataRangeCaches.flatList.some(item => {
111
112
  return !!getParsedomElementByElement(item.element, 'blockquote')
112
113
  })
113
114
  }
114
115
 
115
116
  //选区是否全部在引用内
116
- export const isRangeInQuote = vm => {
117
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
118
- return !!getParsedomElementByElement(vm.editor.range.anchor.element, 'blockquote')
117
+ export const isRangeInQuote = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
118
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
119
+ return !!getParsedomElementByElement(editor.range!.anchor.element, 'blockquote')
119
120
  }
120
- return vm.dataRangeCaches.list.every(item => {
121
+ return dataRangeCaches.list.every(item => {
121
122
  return !!getParsedomElementByElement(item.element, 'blockquote')
122
123
  })
123
124
  }
124
125
 
125
126
  //选区是否含有有序列表或者无序列表
126
- export const hasListInRange = (vm, ordered = false) => {
127
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
128
- return elementIsInList(vm.editor.range.anchor.element, ordered)
127
+ export const hasListInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, ordered: boolean | undefined = false) => {
128
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
129
+ return elementIsInList(editor.range!.anchor.element, ordered)
129
130
  }
130
- return vm.dataRangeCaches.flatList.some(item => {
131
+ return dataRangeCaches.flatList.some(item => {
131
132
  return elementIsInList(item.element, ordered)
132
133
  })
133
134
  }
134
135
 
135
136
  //选区是否全部在有序列表或者无序列表内
136
- export const isRangeInList = (vm, ordered = false) => {
137
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
138
- return elementIsInList(vm.editor.range.anchor.element, ordered)
137
+ export const isRangeInList = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, ordered: boolean | undefined = false) => {
138
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
139
+ return elementIsInList(editor.range!.anchor.element, ordered)
139
140
  }
140
- return vm.dataRangeCaches.list.every(item => {
141
+ return dataRangeCaches.list.every(item => {
141
142
  return elementIsInList(item.element, ordered)
142
143
  })
143
144
  }
144
145
 
145
146
  //选区是否含有任务列表
146
- export const hasTaskInRange = vm => {
147
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
148
- return elementIsInTask(vm.editor.range.anchor.element)
147
+ export const hasTaskInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
148
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
149
+ return elementIsInTask(editor.range!.anchor.element)
149
150
  }
150
- return vm.dataRangeCaches.flatList.some(item => {
151
+ return dataRangeCaches.flatList.some(item => {
151
152
  return elementIsInTask(item.element)
152
153
  })
153
154
  }
154
155
 
155
156
  //选区是否全部在任务列表里
156
- export const isRangeInTask = vm => {
157
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
158
- return elementIsInTask(vm.editor.range.anchor.element)
157
+ export const isRangeInTask = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
158
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
159
+ return elementIsInTask(editor.range!.anchor.element)
159
160
  }
160
- return vm.dataRangeCaches.list.every(item => {
161
+ return dataRangeCaches.list.every(item => {
161
162
  return elementIsInTask(item.element)
162
163
  })
163
164
  }
164
165
 
165
166
  //选区是否含有链接
166
- export const hasLinkInRange = vm => {
167
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
168
- return !!getParsedomElementByElement(vm.editor.range.anchor.element, 'a')
167
+ export const hasLinkInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
168
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
169
+ return !!getParsedomElementByElement(editor.range!.anchor.element, 'a')
169
170
  }
170
- return vm.dataRangeCaches.flatList.some(item => {
171
+ return dataRangeCaches.flatList.some(item => {
171
172
  return !!getParsedomElementByElement(item.element, 'a')
172
173
  })
173
174
  }
174
175
 
175
176
  //选区是否含有表格
176
- export const hasTableInRange = vm => {
177
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
178
- return !!getParsedomElementByElement(vm.editor.range.anchor.element, 'table')
177
+ export const hasTableInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
178
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
179
+ return !!getParsedomElementByElement(editor.range!.anchor.element, 'table')
179
180
  }
180
- return vm.dataRangeCaches.flatList.some(item => {
181
+ return dataRangeCaches.flatList.some(item => {
181
182
  return !!getParsedomElementByElement(item.element, 'table')
182
183
  })
183
184
  }
184
185
 
185
186
  //选区是否含有图片
186
- export const hasImageInRange = vm => {
187
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
188
- return !!getParsedomElementByElement(vm.editor.range.anchor.element, 'img')
187
+ export const hasImageInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
188
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
189
+ return !!getParsedomElementByElement(editor.range!.anchor.element, 'img')
189
190
  }
190
- return vm.dataRangeCaches.flatList.some(item => {
191
+ return dataRangeCaches.flatList.some(item => {
191
192
  return !!getParsedomElementByElement(item.element, 'img')
192
193
  })
193
194
  }
194
195
 
195
196
  //选区是否含有视频
196
- export const hasVideoInRange = vm => {
197
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
198
- return !!getParsedomElementByElement(vm.editor.range.anchor.element, 'video')
197
+ export const hasVideoInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
198
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
199
+ return !!getParsedomElementByElement(editor.range!.anchor.element, 'video')
199
200
  }
200
- return vm.dataRangeCaches.flatList.some(item => {
201
+ return dataRangeCaches.flatList.some(item => {
201
202
  return !!getParsedomElementByElement(item.element, 'video')
202
203
  })
203
204
  }
204
205
 
205
- //查询文本元素是否具有某个样式
206
- export const queryTextStyle = (vm, name, value) => {
206
+ //查询光标所在的文本元素是否具有某个样式
207
+ export const queryTextStyle = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, name: string, value?: string | number) => {
207
208
  //起点和终点在一起
208
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
209
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
209
210
  //如果是文本元素并且具有样式
210
- if (vm.editor.range.anchor.element.isText() && vm.editor.range.anchor.element.hasStyles()) {
211
- return queryHasValue(vm.editor.range.anchor.element.styles, name, value)
211
+ if (editor.range!.anchor.element.isText() && editor.range!.anchor.element.hasStyles()) {
212
+ return queryHasValue(editor.range!.anchor.element.styles!, name, value)
212
213
  }
213
214
  //不是文本元素或者没有样式直接返回
214
215
  return false
215
216
  }
216
217
  //起点和终点不在一起获取选区中的文本元素
217
- let result = vm.dataRangeCaches.flatList.filter(item => {
218
+ let result = dataRangeCaches.flatList.filter(item => {
218
219
  return item.element.isText()
219
220
  })
220
221
  //如果不包含文本元素直接返回false
@@ -225,7 +226,7 @@ export const queryTextStyle = (vm, name, value) => {
225
226
  let flag = result.every(item => {
226
227
  //文本元素含有样式进一步判断
227
228
  if (item.element.hasStyles()) {
228
- return queryHasValue(item.element.styles, name, value)
229
+ return queryHasValue(item.element.styles!, name, value)
229
230
  }
230
231
  //文本元素没有样式直接返回false
231
232
  return false
@@ -233,19 +234,19 @@ export const queryTextStyle = (vm, name, value) => {
233
234
  return flag
234
235
  }
235
236
 
236
- //查询文本元素是否具有某个标记
237
- export const queryTextMark = (vm, name, value) => {
237
+ //查询光标所在的文本元素是否具有某个标记
238
+ export const queryTextMark = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, name: string, value?: string | number) => {
238
239
  //起点和终点在一起
239
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
240
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
240
241
  //如果是文本元素并且具有标记
241
- if (vm.editor.range.anchor.element.isText() && vm.editor.range.anchor.element.hasMarks()) {
242
- return queryHasValue(vm.editor.range.anchor.element.marks, name, value)
242
+ if (editor.range!.anchor.element.isText() && editor.range!.anchor.element.hasMarks()) {
243
+ return queryHasValue(editor.range!.anchor.element.marks!, name, value)
243
244
  }
244
245
  //不是文本元素或者没有标记直接返回
245
246
  return false
246
247
  }
247
248
  //起点和终点不在一起获取选区中的文本元素
248
- let result = vm.dataRangeCaches.flatList.filter(item => {
249
+ let result = dataRangeCaches.flatList.filter(item => {
249
250
  return item.element.isText()
250
251
  })
251
252
  //如果不包含文本元素直接返回false
@@ -256,7 +257,7 @@ export const queryTextMark = (vm, name, value) => {
256
257
  let flag = result.every(item => {
257
258
  //文本元素含有标记进一步判断
258
259
  if (item.element.hasMarks()) {
259
- return queryHasValue(item.element.marks, name, value)
260
+ return queryHasValue(item.element.marks!, name, value)
260
261
  }
261
262
  //文本元素没有标记直接返回false
262
263
  return false
@@ -264,14 +265,14 @@ export const queryTextMark = (vm, name, value) => {
264
265
  return flag
265
266
  }
266
267
 
267
- //获取链接文字内容,用于预置链接文字
268
- export const getLinkText = vm => {
268
+ //获取选区内的文字内容,用于预置链接文字
269
+ export const getRangeText = (dataRangeCaches: AlexElementsRangeType) => {
269
270
  //存在选区的情况下预置链接文本值
270
271
  let text = ''
271
- vm.dataRangeCaches.flatList.forEach(item => {
272
+ dataRangeCaches.flatList.forEach(item => {
272
273
  if (item.element.isText()) {
273
274
  if (item.offset) {
274
- text += item.element.textContent.substring(item.offset[0], item.offset[1])
275
+ text += item.element.textContent!.substring(item.offset[0], item.offset[1])
275
276
  } else {
276
277
  text += item.element.textContent || ''
277
278
  }
@@ -281,53 +282,53 @@ export const getLinkText = vm => {
281
282
  }
282
283
 
283
284
  //获取光标选取内的扁平化元素数组(可能会分割文本元素导致stack变更,同时也会更新选取元素和光标位置)
284
- export const getFlatElementsByRange = vm => {
285
+ export const getFlatElementsByRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
285
286
  //获取选区数据的长度
286
- let length = vm.dataRangeCaches.flatList.length
287
+ let length = dataRangeCaches.flatList.length
287
288
  //返回的元素数组
288
289
  let elements = []
289
290
  //遍历选区数据
290
291
  for (let i = 0; i < length; i++) {
291
- const item = vm.dataRangeCaches.flatList[i]
292
+ const item = dataRangeCaches.flatList[i]
292
293
  //如果存在offset那么一定是文本元素
293
294
  if (item.offset) {
294
295
  let selectEl = null
295
296
  //文本元素前面一部分在光标范围内
296
- if (item.offset[0] == 0 && item.offset[1] < item.element.textContent.length) {
297
+ if (item.offset[0] == 0 && item.offset[1] < item.element.textContent!.length) {
297
298
  const el = item.element.clone()
298
- item.element.textContent = item.element.textContent.substring(0, item.offset[1])
299
- el.textContent = el.textContent.substring(item.offset[1])
300
- vm.editor.addElementAfter(el, item.element)
299
+ item.element.textContent = item.element.textContent!.substring(0, item.offset[1])
300
+ el.textContent = el.textContent!.substring(item.offset[1])
301
+ editor.addElementAfter(el, item.element)
301
302
  selectEl = item.element
302
303
  }
303
304
  //文本元素后面一部分在光标范围内
304
- else if (item.offset[1] == item.element.textContent.length && item.offset[0] > 0) {
305
+ else if (item.offset[1] == item.element.textContent!.length && item.offset[0] > 0) {
305
306
  const el = item.element.clone()
306
- item.element.textContent = item.element.textContent.substring(0, item.offset[0])
307
- el.textContent = el.textContent.substring(item.offset[0])
308
- vm.editor.addElementAfter(el, item.element)
307
+ item.element.textContent = item.element.textContent!.substring(0, item.offset[0])
308
+ el.textContent = el.textContent!.substring(item.offset[0])
309
+ editor.addElementAfter(el, item.element)
309
310
  selectEl = el
310
311
  }
311
312
  //文本元素的中间一部分在光标范围内
312
- else if (item.offset[0] > 0 && item.offset[1] < item.element.textContent.length) {
313
+ else if (item.offset[0] > 0 && item.offset[1] < item.element.textContent!.length) {
313
314
  const el = item.element.clone()
314
315
  const el2 = item.element.clone()
315
- item.element.textContent = item.element.textContent.substring(0, item.offset[0])
316
- el.textContent = el.textContent.substring(item.offset[0], item.offset[1])
317
- el2.textContent = el2.textContent.substring(item.offset[1])
318
- vm.editor.addElementAfter(el, item.element)
319
- vm.editor.addElementAfter(el2, el)
316
+ item.element.textContent = item.element.textContent!.substring(0, item.offset[0])
317
+ el.textContent = el.textContent!.substring(item.offset[0], item.offset[1])
318
+ el2.textContent = el2.textContent!.substring(item.offset[1])
319
+ editor.addElementAfter(el, item.element)
320
+ editor.addElementAfter(el2, el)
320
321
  selectEl = el
321
322
  }
322
323
  //如果selectEl存在证明文本元素被分割了
323
324
  if (selectEl) {
324
325
  //如果i为0的话肯定是起点
325
326
  if (i == 0) {
326
- vm.editor.range.anchor.moveToStart(selectEl)
327
+ editor.range!.anchor.moveToStart(selectEl)
327
328
  }
328
329
  //如果i是最后一个序列的话肯定是终点
329
330
  if (i == length - 1) {
330
- vm.editor.range.focus.moveToEnd(selectEl)
331
+ editor.range!.focus.moveToEnd(selectEl)
331
332
  }
332
333
  elements.push(selectEl)
333
334
  }
@@ -339,14 +340,14 @@ export const getFlatElementsByRange = vm => {
339
340
  }
340
341
 
341
342
  //将某个元素转为段落标签
342
- export const elementToParagraph = function (element) {
343
+ export const elementToParagraph = function (element: AlexElement) {
343
344
  element.marks = null
344
345
  element.styles = null
345
346
  element.parsedom = AlexElement.BLOCK_NODE
346
347
  }
347
348
 
348
349
  //其他元素转为有序或者无序列表
349
- export const elementToList = function (element, ordered = false) {
350
+ export const elementToList = function (element: AlexElement, ordered: boolean | undefined = false) {
350
351
  //如果是列表则返回
351
352
  if (isList(element, ordered)) {
352
353
  return
@@ -358,11 +359,11 @@ export const elementToList = function (element, ordered = false) {
358
359
  if (!element.hasMarks()) {
359
360
  element.marks = {}
360
361
  }
361
- element.marks['data-editify-list'] = ordered ? 'ol' : 'ul'
362
+ element.marks!['data-editify-list'] = ordered ? 'ol' : 'ul'
362
363
  }
363
364
 
364
365
  //其他元素转为任务列表
365
- export const elementToTask = function (element) {
366
+ export const elementToTask = function (element: AlexElement) {
366
367
  //如果是任务列表则返回
367
368
  if (isTask(element)) {
368
369
  return
@@ -374,25 +375,25 @@ export const elementToTask = function (element) {
374
375
  if (!element.hasMarks()) {
375
376
  element.marks = {}
376
377
  }
377
- element.marks['data-editify-task'] = 'uncheck'
378
+ element.marks!['data-editify-task'] = 'uncheck'
378
379
  }
379
380
 
380
381
  //设置标题
381
- export const setHeading = (vm, parsedom) => {
382
- const values = getButtonOptionsConfig(vm.$editTrans, vm.$editLocale).heading.map(item => {
383
- return item.value
382
+ export const setHeading = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, editTrans: (key: string) => any, parsedom: string) => {
383
+ const values = getButtonOptionsConfig(editTrans).heading!.map(item => {
384
+ return (<ButtonOptionsItemType>item).value
384
385
  })
385
386
  if (!values.includes(parsedom)) {
386
387
  throw new Error('The parameter supports only h1-h6 and p')
387
388
  }
388
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
389
- const block = vm.editor.range.anchor.element.getBlock()
389
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
390
+ const block = editor.range!.anchor.element.getBlock()
390
391
  //先转为段落
391
392
  elementToParagraph(block)
392
393
  //设置标题
393
394
  block.parsedom = parsedom
394
395
  } else {
395
- vm.dataRangeCaches.list.forEach(el => {
396
+ dataRangeCaches.list.forEach(el => {
396
397
  if (el.element.isBlock()) {
397
398
  elementToParagraph(el.element)
398
399
  el.element.parsedom = parsedom
@@ -406,19 +407,19 @@ export const setHeading = (vm, parsedom) => {
406
407
  }
407
408
 
408
409
  //根级块元素或者内部块元素增加缩进
409
- export const setIndentIncrease = vm => {
410
- const fn = element => {
410
+ export const setIndentIncrease = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
411
+ const fn = (element: AlexElement) => {
411
412
  if (element.hasStyles()) {
412
- if (element.styles.hasOwnProperty('text-indent')) {
413
- let val = element.styles['text-indent']
413
+ if (element.styles!.hasOwnProperty('text-indent')) {
414
+ let val = element.styles!['text-indent']
414
415
  if (val.endsWith('em')) {
415
416
  val = parseFloat(val)
416
417
  } else {
417
418
  val = 0
418
419
  }
419
- element.styles['text-indent'] = `${val + 2}em`
420
+ element.styles!['text-indent'] = `${val + 2}em`
420
421
  } else {
421
- element.styles['text-indent'] = '2em'
422
+ element.styles!['text-indent'] = '2em'
422
423
  }
423
424
  } else {
424
425
  element.styles = {
@@ -426,16 +427,16 @@ export const setIndentIncrease = vm => {
426
427
  }
427
428
  }
428
429
  }
429
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
430
- const block = vm.editor.range.anchor.element.getBlock()
431
- const inblock = vm.editor.range.anchor.element.getInblock()
430
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
431
+ const block = editor.range!.anchor.element.getBlock()
432
+ const inblock = editor.range!.anchor.element.getInblock()
432
433
  if (inblock && inblock.behavior == 'block' && !inblock.isPreStyle()) {
433
434
  fn(inblock)
434
435
  } else if (!block.isPreStyle()) {
435
436
  fn(block)
436
437
  }
437
438
  } else {
438
- vm.dataRangeCaches.list.forEach(item => {
439
+ dataRangeCaches.list.forEach(item => {
439
440
  const block = item.element.getBlock()
440
441
  const inblock = item.element.getInblock()
441
442
  if (inblock && inblock.behavior == 'block' && !inblock.isPreStyle()) {
@@ -448,28 +449,28 @@ export const setIndentIncrease = vm => {
448
449
  }
449
450
 
450
451
  //根级块元素或者内部块元素减少缩进
451
- export const setIndentDecrease = vm => {
452
- const fn = element => {
453
- if (element.hasStyles() && element.styles.hasOwnProperty('text-indent')) {
454
- let val = element.styles['text-indent']
452
+ export const setIndentDecrease = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
453
+ const fn = (element: AlexElement) => {
454
+ if (element.hasStyles() && element.styles!.hasOwnProperty('text-indent')) {
455
+ let val = element.styles!['text-indent']
455
456
  if (val.endsWith('em')) {
456
457
  val = parseFloat(val)
457
458
  } else {
458
459
  val = 0
459
460
  }
460
- element.styles['text-indent'] = `${val - 2 >= 0 ? val - 2 : 0}em`
461
+ element.styles!['text-indent'] = `${val - 2 >= 0 ? val - 2 : 0}em`
461
462
  }
462
463
  }
463
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
464
- const block = vm.editor.range.anchor.element.getBlock()
465
- const inblock = vm.editor.range.anchor.element.getInblock()
464
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
465
+ const block = editor.range!.anchor.element.getBlock()
466
+ const inblock = editor.range!.anchor.element.getInblock()
466
467
  if (inblock && inblock.behavior == 'block' && !inblock.isPreStyle()) {
467
468
  fn(inblock)
468
469
  } else if (!block.isPreStyle()) {
469
470
  fn(block)
470
471
  }
471
472
  } else {
472
- vm.dataRangeCaches.list.forEach(item => {
473
+ dataRangeCaches.list.forEach(item => {
473
474
  const block = item.element.getBlock()
474
475
  const inblock = item.element.getInblock()
475
476
  if (inblock && inblock.behavior == 'block' && !inblock.isPreStyle()) {
@@ -482,12 +483,12 @@ export const setIndentDecrease = vm => {
482
483
  }
483
484
 
484
485
  //插入或者取消引用
485
- export const setQuote = vm => {
486
+ export const setQuote = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
486
487
  //是否都在引用里
487
- const flag = isRangeInQuote(vm)
488
+ const flag = isRangeInQuote(editor, dataRangeCaches)
488
489
  //起点和终点在一起
489
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
490
- const block = vm.editor.range.anchor.element.getBlock()
490
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
491
+ const block = editor.range!.anchor.element.getBlock()
491
492
  elementToParagraph(block)
492
493
  if (!flag) {
493
494
  block.parsedom = 'blockquote'
@@ -495,8 +496,8 @@ export const setQuote = vm => {
495
496
  }
496
497
  //起点和终点不在一起
497
498
  else {
498
- let blocks = []
499
- vm.dataRangeCaches.list.forEach(item => {
499
+ let blocks: AlexElement[] = []
500
+ dataRangeCaches.list.forEach(item => {
500
501
  const block = item.element.getBlock()
501
502
  const exist = blocks.some(el => block.isEqual(el))
502
503
  if (!exist) {
@@ -513,13 +514,13 @@ export const setQuote = vm => {
513
514
  }
514
515
 
515
516
  //设置对齐方式,参数取值justify/left/right/center
516
- export const setAlign = (vm, value) => {
517
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
518
- const block = vm.editor.range.anchor.element.getBlock()
519
- const inblock = vm.editor.range.anchor.element.getInblock()
517
+ export const setAlign = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, value: string) => {
518
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
519
+ const block = editor.range!.anchor.element.getBlock()
520
+ const inblock = editor.range!.anchor.element.getInblock()
520
521
  if (inblock) {
521
522
  if (inblock.hasStyles()) {
522
- inblock.styles['text-align'] = value
523
+ inblock.styles!['text-align'] = value
523
524
  } else {
524
525
  inblock.styles = {
525
526
  'text-align': value
@@ -527,7 +528,7 @@ export const setAlign = (vm, value) => {
527
528
  }
528
529
  } else {
529
530
  if (block.hasStyles()) {
530
- block.styles['text-align'] = value
531
+ block.styles!['text-align'] = value
531
532
  } else {
532
533
  block.styles = {
533
534
  'text-align': value
@@ -535,10 +536,10 @@ export const setAlign = (vm, value) => {
535
536
  }
536
537
  }
537
538
  } else {
538
- vm.dataRangeCaches.list.forEach(el => {
539
+ dataRangeCaches.list.forEach(el => {
539
540
  if (el.element.isBlock() || el.element.isInblock()) {
540
541
  if (el.element.hasStyles()) {
541
- el.element.styles['text-align'] = value
542
+ el.element.styles!['text-align'] = value
542
543
  } else {
543
544
  el.element.styles = {
544
545
  'text-align': value
@@ -549,7 +550,7 @@ export const setAlign = (vm, value) => {
549
550
  const inblock = el.element.getInblock()
550
551
  if (inblock) {
551
552
  if (inblock.hasStyles()) {
552
- inblock.styles['text-align'] = value
553
+ inblock.styles!['text-align'] = value
553
554
  } else {
554
555
  inblock.styles = {
555
556
  'text-align': value
@@ -557,7 +558,7 @@ export const setAlign = (vm, value) => {
557
558
  }
558
559
  } else {
559
560
  if (block.hasStyles()) {
560
- block.styles['text-align'] = value
561
+ block.styles!['text-align'] = value
561
562
  } else {
562
563
  block.styles = {
563
564
  'text-align': value
@@ -570,12 +571,12 @@ export const setAlign = (vm, value) => {
570
571
  }
571
572
 
572
573
  //插入或者取消 有序或者无序列表 ordered为true表示有序列表
573
- export const setList = (vm, ordered) => {
574
+ export const setList = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, ordered: boolean) => {
574
575
  //是否都在列表内
575
- const flag = isRangeInList(vm, ordered)
576
+ const flag = isRangeInList(editor, dataRangeCaches, ordered)
576
577
  //起点和终点在一起
577
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
578
- const block = vm.editor.range.anchor.element.getBlock()
578
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
579
+ const block = editor.range!.anchor.element.getBlock()
579
580
  if (flag) {
580
581
  elementToParagraph(block)
581
582
  } else {
@@ -584,8 +585,8 @@ export const setList = (vm, ordered) => {
584
585
  }
585
586
  //起点和终点不在一起
586
587
  else {
587
- let blocks = []
588
- vm.dataRangeCaches.list.forEach(item => {
588
+ let blocks: AlexElement[] = []
589
+ dataRangeCaches.list.forEach(item => {
589
590
  const block = item.element.getBlock()
590
591
  const exist = blocks.some(el => block.isEqual(el))
591
592
  if (!exist) {
@@ -603,12 +604,12 @@ export const setList = (vm, ordered) => {
603
604
  }
604
605
 
605
606
  //插入或者取消任务列表
606
- export const setTask = vm => {
607
+ export const setTask = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
607
608
  //是否都在任务列表那
608
- const flag = isRangeInTask(vm)
609
+ const flag = isRangeInTask(editor, dataRangeCaches)
609
610
  //起点和终点在一起
610
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
611
- const block = vm.editor.range.anchor.element.getBlock()
611
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
612
+ const block = editor.range!.anchor.element.getBlock()
612
613
  if (flag) {
613
614
  elementToParagraph(block)
614
615
  } else {
@@ -617,8 +618,8 @@ export const setTask = vm => {
617
618
  }
618
619
  //起点和终点不在一起
619
620
  else {
620
- let blocks = []
621
- vm.dataRangeCaches.list.forEach(item => {
621
+ let blocks: AlexElement[] = []
622
+ dataRangeCaches.list.forEach(item => {
622
623
  const block = item.element.getBlock()
623
624
  const exist = blocks.some(el => block.isEqual(el))
624
625
  if (!exist) {
@@ -636,47 +637,47 @@ export const setTask = vm => {
636
637
  }
637
638
 
638
639
  //设置文本元素的样式,styles为{ 'font-weight':'bold' }这类格式
639
- export const setTextStyle = (vm, styles) => {
640
+ export const setTextStyle = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, styles: ObjectType) => {
640
641
  //起点和终点在一起
641
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
642
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
642
643
  //如果是空白文本元素直接设置样式
643
- if (vm.editor.range.anchor.element.isSpaceText()) {
644
- if (vm.editor.range.anchor.element.hasStyles()) {
645
- Object.assign(vm.editor.range.anchor.element.styles, cloneData(styles))
644
+ if (editor.range!.anchor.element.isSpaceText()) {
645
+ if (editor.range!.anchor.element.hasStyles()) {
646
+ Object.assign(editor.range!.anchor.element.styles!, cloneData(styles))
646
647
  } else {
647
- vm.editor.range.anchor.element.styles = cloneData(styles)
648
+ editor.range!.anchor.element.styles = cloneData(styles)
648
649
  }
649
650
  }
650
651
  //如果是文本元素
651
- else if (vm.editor.range.anchor.element.isText()) {
652
+ else if (editor.range!.anchor.element.isText()) {
652
653
  //新建一个空白文本元素
653
654
  const el = AlexElement.getSpaceElement()
654
655
  //继承文本元素的样式和标记
655
- el.styles = cloneData(vm.editor.range.anchor.element.styles)
656
- el.marks = cloneData(vm.editor.range.anchor.element.marks)
656
+ el.styles = cloneData(editor.range!.anchor.element.styles)
657
+ el.marks = cloneData(editor.range!.anchor.element.marks)
657
658
  //设置样式
658
659
  if (el.hasStyles()) {
659
- Object.assign(el.styles, cloneData(styles))
660
+ Object.assign(el.styles!, cloneData(styles))
660
661
  } else {
661
662
  el.styles = cloneData(styles)
662
663
  }
663
664
  //插入空白文本元素
664
- vm.editor.insertElement(el)
665
+ editor.insertElement(el)
665
666
  }
666
667
  //如果是自闭合元素
667
668
  else {
668
669
  const el = AlexElement.getSpaceElement()
669
670
  el.styles = cloneData(styles)
670
- vm.editor.insertElement(el)
671
+ editor.insertElement(el)
671
672
  }
672
673
  }
673
674
  //不在同一个点
674
675
  else {
675
- const elements = getFlatElementsByRange(vm)
676
+ const elements = getFlatElementsByRange(editor, dataRangeCaches)
676
677
  elements.forEach(ele => {
677
678
  if (ele.isText()) {
678
679
  if (ele.hasStyles()) {
679
- Object.assign(ele.styles, cloneData(styles))
680
+ Object.assign(ele.styles!, cloneData(styles))
680
681
  } else {
681
682
  ele.styles = cloneData(styles)
682
683
  }
@@ -686,50 +687,50 @@ export const setTextStyle = (vm, styles) => {
686
687
  }
687
688
 
688
689
  //设置文本元素的标记,marks为{ 'class':'a' }这类格式
689
- export const setTextMark = (vm, marks) => {
690
+ export const setTextMark = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, marks: ObjectType) => {
690
691
  if (!DapCommon.isObject(marks)) {
691
692
  throw new Error('The argument must be an object')
692
693
  }
693
694
  //起点和终点在一起
694
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
695
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
695
696
  //如果是空白文本元素直接设置标记
696
- if (vm.editor.range.anchor.element.isSpaceText()) {
697
- if (vm.editor.range.anchor.element.hasMarks()) {
698
- Object.assign(vm.editor.range.anchor.element.marks, cloneData(marks))
697
+ if (editor.range!.anchor.element.isSpaceText()) {
698
+ if (editor.range!.anchor.element.hasMarks()) {
699
+ Object.assign(editor.range!.anchor.element.marks!, cloneData(marks))
699
700
  } else {
700
- vm.editor.range.anchor.element.marks = cloneData(marks)
701
+ editor.range!.anchor.element.marks = cloneData(marks)
701
702
  }
702
703
  }
703
704
  //如果是文本元素
704
- else if (vm.editor.range.anchor.element.isText()) {
705
+ else if (editor.range!.anchor.element.isText()) {
705
706
  //新建一个空白文本元素
706
707
  const el = AlexElement.getSpaceElement()
707
708
  //继承文本元素的样式和标记
708
- el.styles = cloneData(vm.editor.range.anchor.element.styles)
709
- el.marks = cloneData(vm.editor.range.anchor.element.marks)
709
+ el.styles = cloneData(editor.range!.anchor.element.styles)
710
+ el.marks = cloneData(editor.range!.anchor.element.marks)
710
711
  //设置标记
711
712
  if (el.hasMarks()) {
712
- Object.assign(el.marks, cloneData(marks))
713
+ Object.assign(el.marks!, cloneData(marks))
713
714
  } else {
714
715
  el.marks = cloneData(marks)
715
716
  }
716
717
  //插入空白文本元素
717
- vm.editor.insertElement(el)
718
+ editor.insertElement(el)
718
719
  }
719
720
  //如果是自闭合元素
720
721
  else {
721
722
  const el = AlexElement.getSpaceElement()
722
723
  el.marks = cloneData(marks)
723
- vm.editor.insertElement(el)
724
+ editor.insertElement(el)
724
725
  }
725
726
  }
726
727
  //不在同一个点
727
728
  else {
728
- const elements = getFlatElementsByRange(vm)
729
+ const elements = getFlatElementsByRange(editor, dataRangeCaches)
729
730
  elements.forEach(ele => {
730
731
  if (ele.isText()) {
731
732
  if (ele.hasMarks()) {
732
- Object.assign(ele.marks, cloneData(marks))
733
+ Object.assign(ele.marks!, cloneData(marks))
733
734
  } else {
734
735
  ele.marks = cloneData(marks)
735
736
  }
@@ -739,16 +740,16 @@ export const setTextMark = (vm, marks) => {
739
740
  }
740
741
 
741
742
  //移除文本元素的样式,styleNames是样式名称数组,如果不存在则移除全部样式
742
- export const removeTextStyle = (vm, styleNames) => {
743
+ export const removeTextStyle = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, styleNames?: string[]) => {
743
744
  //移除样式的方法
744
- const removeFn = el => {
745
+ const removeFn = (el: AlexElement) => {
745
746
  //如果参数是数组,表示删除指定的样式
746
747
  if (Array.isArray(styleNames)) {
747
748
  if (el.hasStyles()) {
748
- let styles = {}
749
- Object.keys(el.styles).forEach(key => {
749
+ let styles: ObjectType = {}
750
+ Object.keys(el.styles!).forEach(key => {
750
751
  if (!styleNames.includes(key)) {
751
- styles[key] = el.styles[key]
752
+ styles[key] = el.styles![key]
752
753
  }
753
754
  })
754
755
  el.styles = styles
@@ -760,26 +761,26 @@ export const removeTextStyle = (vm, styleNames) => {
760
761
  }
761
762
  }
762
763
  //如果起点和终点在一起
763
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
764
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
764
765
  //如果是空白文本元素直接移除样式
765
- if (vm.editor.range.anchor.element.isSpaceText()) {
766
- removeFn(vm.editor.range.anchor.element)
766
+ if (editor.range!.anchor.element.isSpaceText()) {
767
+ removeFn(editor.range!.anchor.element)
767
768
  }
768
769
  //如果是文本元素则新建一个空白文本元素
769
- else if (vm.editor.range.anchor.element.isText()) {
770
+ else if (editor.range!.anchor.element.isText()) {
770
771
  const el = AlexElement.getSpaceElement()
771
772
  //继承文本元素的样式和标记
772
- el.styles = cloneData(vm.editor.range.anchor.element.styles)
773
- el.marks = cloneData(vm.editor.range.anchor.element.marks)
773
+ el.styles = cloneData(editor.range!.anchor.element.styles)
774
+ el.marks = cloneData(editor.range!.anchor.element.marks)
774
775
  //移除样式
775
776
  removeFn(el)
776
777
  //插入
777
- vm.editor.insertElement(el)
778
+ editor.insertElement(el)
778
779
  }
779
780
  }
780
781
  //起点和终点不在一起
781
782
  else {
782
- const elements = getFlatElementsByRange(vm)
783
+ const elements = getFlatElementsByRange(editor, dataRangeCaches)
783
784
  elements.forEach(ele => {
784
785
  if (ele.isText()) {
785
786
  removeFn(ele)
@@ -789,16 +790,16 @@ export const removeTextStyle = (vm, styleNames) => {
789
790
  }
790
791
 
791
792
  //移除文本元素的标记,markNames是标记名称数组,如果不存在则移除全部标记
792
- export const removeTextMark = (vm, markNames) => {
793
+ export const removeTextMark = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, markNames?: string[]) => {
793
794
  //移除样式的方法
794
- const removeFn = el => {
795
+ const removeFn = (el: AlexElement) => {
795
796
  //如果参数是数组,表示删除指定的样式
796
797
  if (Array.isArray(markNames)) {
797
798
  if (el.hasMarks()) {
798
- let marks = {}
799
- Object.keys(el.marks).forEach(key => {
799
+ let marks: ObjectType = {}
800
+ Object.keys(el.marks!).forEach(key => {
800
801
  if (!markNames.includes(key)) {
801
- marks[key] = el.marks[key]
802
+ marks[key] = el.marks![key]
802
803
  }
803
804
  })
804
805
  el.marks = marks
@@ -810,26 +811,26 @@ export const removeTextMark = (vm, markNames) => {
810
811
  }
811
812
  }
812
813
  //如果起点和终点在一起
813
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
814
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
814
815
  //如果是空白文本元素直接移除标记
815
- if (vm.editor.range.anchor.element.isSpaceText()) {
816
- removeFn(vm.editor.range.anchor.element)
816
+ if (editor.range!.anchor.element.isSpaceText()) {
817
+ removeFn(editor.range!.anchor.element)
817
818
  }
818
819
  //如果是文本元素则新建一个空白文本元素
819
- else if (vm.editor.range.anchor.element.isText()) {
820
+ else if (editor.range!.anchor.element.isText()) {
820
821
  const el = AlexElement.getSpaceElement()
821
822
  //继承文本元素的样式和标记
822
- el.styles = cloneData(vm.editor.range.anchor.element.styles)
823
- el.marks = cloneData(vm.editor.range.anchor.element.marks)
823
+ el.styles = cloneData(editor.range!.anchor.element.styles)
824
+ el.marks = cloneData(editor.range!.anchor.element.marks)
824
825
  //移除标记
825
826
  removeFn(el)
826
827
  //插入
827
- vm.editor.insertElement(el)
828
+ editor.insertElement(el)
828
829
  }
829
830
  }
830
831
  //起点和终点不在一起
831
832
  else {
832
- const elements = getFlatElementsByRange(vm)
833
+ const elements = getFlatElementsByRange(editor, dataRangeCaches)
833
834
  elements.forEach(ele => {
834
835
  if (ele.isText()) {
835
836
  removeFn(ele)
@@ -839,13 +840,13 @@ export const removeTextMark = (vm, markNames) => {
839
840
  }
840
841
 
841
842
  //设置块元素或者根级块元素的行高
842
- export const setLineHeight = (vm, value) => {
843
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
844
- const block = vm.editor.range.anchor.element.getBlock()
845
- const inblock = vm.editor.range.anchor.element.getInblock()
843
+ export const setLineHeight = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, value: string | number) => {
844
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
845
+ const block = editor.range!.anchor.element.getBlock()
846
+ const inblock = editor.range!.anchor.element.getInblock()
846
847
  if (inblock) {
847
848
  if (inblock.hasStyles()) {
848
- inblock.styles['line-height'] = value
849
+ inblock.styles!['line-height'] = value
849
850
  } else {
850
851
  inblock.styles = {
851
852
  'line-height': value
@@ -853,7 +854,7 @@ export const setLineHeight = (vm, value) => {
853
854
  }
854
855
  } else {
855
856
  if (block.hasStyles()) {
856
- block.styles['line-height'] = value
857
+ block.styles!['line-height'] = value
857
858
  } else {
858
859
  block.styles = {
859
860
  'line-height': value
@@ -861,10 +862,10 @@ export const setLineHeight = (vm, value) => {
861
862
  }
862
863
  }
863
864
  } else {
864
- vm.dataRangeCaches.list.forEach(el => {
865
+ dataRangeCaches.list.forEach(el => {
865
866
  if (el.element.isBlock() || el.element.isInblock()) {
866
867
  if (el.element.hasStyles()) {
867
- el.element.styles['line-height'] = value
868
+ el.element.styles!['line-height'] = value
868
869
  } else {
869
870
  el.element.styles = {
870
871
  'line-height': value
@@ -875,7 +876,7 @@ export const setLineHeight = (vm, value) => {
875
876
  const inblock = el.element.getInblock()
876
877
  if (inblock) {
877
878
  if (inblock.hasStyles()) {
878
- inblock.styles['line-height'] = value
879
+ inblock.styles!['line-height'] = value
879
880
  } else {
880
881
  inblock.styles = {
881
882
  'line-height': value
@@ -883,7 +884,7 @@ export const setLineHeight = (vm, value) => {
883
884
  }
884
885
  } else {
885
886
  if (block.hasStyles()) {
886
- block.styles['line-height'] = value
887
+ block.styles!['line-height'] = value
887
888
  } else {
888
889
  block.styles = {
889
890
  'line-height': value
@@ -896,11 +897,11 @@ export const setLineHeight = (vm, value) => {
896
897
  }
897
898
 
898
899
  //插入链接
899
- export const insertLink = (vm, text, url, newOpen) => {
900
+ export const insertLink = (editor: AlexEditor, text: string, url: string, newOpen: boolean) => {
900
901
  if (!text) {
901
902
  text = url
902
903
  }
903
- const marks = {
904
+ const marks: ObjectType = {
904
905
  href: url
905
906
  }
906
907
  if (newOpen) {
@@ -908,12 +909,12 @@ export const insertLink = (vm, text, url, newOpen) => {
908
909
  }
909
910
  const linkEle = new AlexElement('inline', 'a', marks, null, null)
910
911
  const textEle = new AlexElement('text', null, null, null, text)
911
- vm.editor.addElementTo(textEle, linkEle)
912
- vm.editor.insertElement(linkEle)
912
+ editor.addElementTo(textEle, linkEle)
913
+ editor.insertElement(linkEle)
913
914
  }
914
915
 
915
916
  //插入图片
916
- export const insertImage = (vm, value) => {
917
+ export const insertImage = (editor: AlexEditor, value: string) => {
917
918
  const image = new AlexElement(
918
919
  'closed',
919
920
  'img',
@@ -923,11 +924,11 @@ export const insertImage = (vm, value) => {
923
924
  null,
924
925
  null
925
926
  )
926
- vm.editor.insertElement(image)
927
+ editor.insertElement(image)
927
928
  }
928
929
 
929
930
  //插入视频
930
- export const insertVideo = (vm, value) => {
931
+ export const insertVideo = (editor: AlexEditor, value: string) => {
931
932
  const video = new AlexElement(
932
933
  'closed',
933
934
  'video',
@@ -937,46 +938,46 @@ export const insertVideo = (vm, value) => {
937
938
  null,
938
939
  null
939
940
  )
940
- vm.editor.insertElement(video)
941
+ editor.insertElement(video)
941
942
  const leftSpace = AlexElement.getSpaceElement()
942
943
  const rightSpace = AlexElement.getSpaceElement()
943
- vm.editor.addElementAfter(rightSpace, video)
944
- vm.editor.addElementBefore(leftSpace, video)
945
- vm.editor.range.anchor.moveToEnd(rightSpace)
946
- vm.editor.range.focus.moveToEnd(rightSpace)
944
+ editor.addElementAfter(rightSpace, video)
945
+ editor.addElementBefore(leftSpace, video)
946
+ editor.range!.anchor.moveToEnd(rightSpace)
947
+ editor.range!.focus.moveToEnd(rightSpace)
947
948
  }
948
949
 
949
950
  //插入表格
950
- export const insertTable = (vm, rowLength, colLength) => {
951
+ export const insertTable = (editor: AlexEditor, rowLength: number, colLength: number) => {
951
952
  const table = new AlexElement('block', 'table', null, null, null)
952
953
  const tbody = new AlexElement('inblock', 'tbody', null, null, null)
953
- vm.editor.addElementTo(tbody, table)
954
+ editor.addElementTo(tbody, table)
954
955
  for (let i = 0; i < rowLength; i++) {
955
956
  const row = new AlexElement('inblock', 'tr', null, null, null)
956
957
  for (let j = 0; j < colLength; j++) {
957
958
  const column = new AlexElement('inblock', 'td', null, null, null)
958
959
  const breakEl = new AlexElement('closed', 'br', null, null, null)
959
- vm.editor.addElementTo(breakEl, column)
960
- vm.editor.addElementTo(column, row)
960
+ editor.addElementTo(breakEl, column)
961
+ editor.addElementTo(column, row)
961
962
  }
962
- vm.editor.addElementTo(row, tbody)
963
+ editor.addElementTo(row, tbody)
963
964
  }
964
- vm.editor.insertElement(table)
965
+ editor.insertElement(table)
965
966
  //在表格后创建一个段落
966
967
  const paragraph = new AlexElement('block', AlexElement.BLOCK_NODE, null, null, null)
967
968
  const breakEl = new AlexElement('closed', 'br', null, null, null)
968
- vm.editor.addElementTo(breakEl, paragraph)
969
- vm.editor.addElementAfter(paragraph, table)
970
- vm.editor.range.anchor.moveToStart(tbody)
971
- vm.editor.range.focus.moveToStart(tbody)
969
+ editor.addElementTo(breakEl, paragraph)
970
+ editor.addElementAfter(paragraph, table)
971
+ editor.range!.anchor.moveToStart(tbody)
972
+ editor.range!.focus.moveToStart(tbody)
972
973
  }
973
974
 
974
975
  //插入或者取消代码块
975
- export const insertCodeBlock = vm => {
976
- const pre = getCurrentParsedomElement(vm, 'pre')
976
+ export const insertCodeBlock = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
977
+ const pre = getCurrentParsedomElement(editor, dataRangeCaches, 'pre')
977
978
  if (pre) {
978
979
  let content = ''
979
- AlexElement.flatElements(pre.children)
980
+ AlexElement.flatElements(pre.children!)
980
981
  .filter(item => {
981
982
  return item.isText()
982
983
  })
@@ -987,27 +988,27 @@ export const insertCodeBlock = vm => {
987
988
  splits.forEach(item => {
988
989
  const paragraph = new AlexElement('block', AlexElement.BLOCK_NODE, null, null, null)
989
990
  const text = new AlexElement('text', null, null, null, item)
990
- vm.editor.addElementTo(text, paragraph)
991
- vm.editor.addElementBefore(paragraph, pre)
991
+ editor.addElementTo(text, paragraph)
992
+ editor.addElementBefore(paragraph, pre)
992
993
  })
993
994
  pre.toEmpty()
994
995
  } else {
995
996
  //起点和终点在一起
996
- if (vm.editor.range.anchor.isEqual(vm.editor.range.focus)) {
997
- const block = vm.editor.range.anchor.element.getBlock()
997
+ if (editor.range!.anchor.isEqual(editor.range!.focus)) {
998
+ const block = editor.range!.anchor.element.getBlock()
998
999
  elementToParagraph(block)
999
1000
  block.parsedom = 'pre'
1000
1001
  const paragraph = new AlexElement('block', AlexElement.BLOCK_NODE, null, null, null)
1001
1002
  const breakEl = new AlexElement('closed', 'br', null, null, null)
1002
- vm.editor.addElementTo(breakEl, paragraph)
1003
- vm.editor.addElementAfter(paragraph, block)
1003
+ editor.addElementTo(breakEl, paragraph)
1004
+ editor.addElementAfter(paragraph, block)
1004
1005
  }
1005
1006
  //起点和终点不在一起
1006
1007
  else {
1007
- vm.editor.range.anchor.moveToStart(vm.dataRangeCaches.list[0].element.getBlock())
1008
- vm.editor.range.focus.moveToEnd(vm.dataRangeCaches.list[vm.dataRangeCaches.list.length - 1].element.getBlock())
1009
- const res = vm.dataRangeCaches.flatList.filter(el => el.element.isText())
1010
- const obj = {}
1008
+ editor.range!.anchor.moveToStart(dataRangeCaches.list[0].element.getBlock())
1009
+ editor.range!.focus.moveToEnd(dataRangeCaches.list[dataRangeCaches.list.length - 1].element.getBlock())
1010
+ const res = dataRangeCaches.flatList.filter(el => el.element.isText())
1011
+ const obj: ObjectType = {}
1011
1012
  res.forEach(el => {
1012
1013
  if (obj[el.element.getBlock().key]) {
1013
1014
  obj[el.element.getBlock().key].push(el.element.clone())
@@ -1020,25 +1021,25 @@ export const insertCodeBlock = vm => {
1020
1021
  if (index > 0) {
1021
1022
  const text = new AlexElement('text', null, null, null, '\n')
1022
1023
  if (pre.hasChildren()) {
1023
- vm.editor.addElementTo(text, pre, pre.children.length)
1024
+ editor.addElementTo(text, pre, pre.children!.length)
1024
1025
  } else {
1025
- vm.editor.addElementTo(text, pre)
1026
+ editor.addElementTo(text, pre)
1026
1027
  }
1027
1028
  }
1028
- obj[key].forEach(el => {
1029
+ obj[key].forEach((el: AlexElement) => {
1029
1030
  if (pre.hasChildren()) {
1030
- vm.editor.addElementTo(el, pre, pre.children.length)
1031
+ editor.addElementTo(el, pre, pre.children!.length)
1031
1032
  } else {
1032
- vm.editor.addElementTo(el, pre)
1033
+ editor.addElementTo(el, pre)
1033
1034
  }
1034
1035
  })
1035
1036
  })
1036
- vm.editor.delete()
1037
- vm.editor.insertElement(pre)
1037
+ editor.delete()
1038
+ editor.insertElement(pre)
1038
1039
  const paragraph = new AlexElement('block', AlexElement.BLOCK_NODE, null, null, null)
1039
1040
  const breakEl = new AlexElement('closed', 'br', null, null, null)
1040
- vm.editor.addElementTo(breakEl, paragraph)
1041
- vm.editor.addElementAfter(paragraph, pre)
1041
+ editor.addElementTo(breakEl, paragraph)
1042
+ editor.addElementAfter(paragraph, pre)
1042
1043
  }
1043
1044
  }
1044
1045
  }