vue-editify 0.2.13 → 0.2.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. package/examples/App.vue +49 -67
  2. package/lib/components/button/button.vue.d.ts +62 -60
  3. package/lib/components/button/index.d.ts +4 -0
  4. package/lib/components/button/props.d.ts +12 -1
  5. package/lib/components/checkbox/checkbox.vue.d.ts +9 -9
  6. package/lib/components/checkbox/index.d.ts +4 -0
  7. package/lib/components/checkbox/props.d.ts +2 -2
  8. package/lib/components/colors/colors.vue.d.ts +4 -4
  9. package/lib/components/colors/index.d.ts +4 -0
  10. package/lib/components/colors/props.d.ts +2 -2
  11. package/lib/components/icon/index.d.ts +4 -0
  12. package/lib/components/insertAttachment/index.d.ts +4 -0
  13. package/lib/{plugins/attachment → components}/insertAttachment/insertAttachment.vue.d.ts +3 -3
  14. package/lib/{plugins/attachment → components}/insertAttachment/props.d.ts +1 -1
  15. package/lib/components/insertImage/index.d.ts +4 -0
  16. package/lib/components/insertImage/insertImage.vue.d.ts +3 -3
  17. package/lib/components/insertImage/props.d.ts +1 -1
  18. package/lib/components/insertLink/index.d.ts +4 -0
  19. package/lib/components/insertLink/insertLink.vue.d.ts +6 -6
  20. package/lib/components/insertLink/props.d.ts +3 -3
  21. package/lib/components/insertMathformula/index.d.ts +4 -0
  22. package/lib/{plugins/mathformula → components}/insertMathformula/insertMathformula.vue.d.ts +3 -3
  23. package/lib/{plugins/mathformula → components}/insertMathformula/props.d.ts +2 -2
  24. package/lib/components/insertTable/index.d.ts +4 -0
  25. package/lib/components/insertTable/insertTable.vue.d.ts +3 -3
  26. package/lib/components/insertTable/props.d.ts +2 -2
  27. package/lib/components/insertVideo/index.d.ts +4 -0
  28. package/lib/components/insertVideo/insertVideo.vue.d.ts +3 -3
  29. package/lib/components/insertVideo/props.d.ts +1 -1
  30. package/lib/components/layer/index.d.ts +4 -0
  31. package/lib/components/layer/layer.vue.d.ts +10 -8
  32. package/lib/components/tooltip/index.d.ts +4 -0
  33. package/lib/components/tooltip/tooltip.vue.d.ts +6 -4
  34. package/lib/components/triangle/index.d.ts +4 -0
  35. package/lib/components/triangle/triangle.vue.d.ts +1 -1
  36. package/lib/components/updateLink/index.d.ts +4 -0
  37. package/lib/components/updateLink/props.d.ts +17 -0
  38. package/lib/components/updateLink/updateLink.vue.d.ts +38 -0
  39. package/lib/core/function.d.ts +113 -36
  40. package/lib/core/rule.d.ts +20 -0
  41. package/lib/core/tool.d.ts +36 -34
  42. package/lib/editify/editify.vue.d.ts +86 -53
  43. package/lib/editify/menu/index.d.ts +4 -0
  44. package/lib/{components → editify}/menu/menu.vue.d.ts +3 -4
  45. package/lib/{components → editify}/menu/props.d.ts +1 -1
  46. package/lib/editify/props.d.ts +3 -7
  47. package/lib/editify/toolbar/index.d.ts +4 -0
  48. package/lib/{components → editify}/toolbar/props.d.ts +2 -2
  49. package/lib/{components → editify}/toolbar/toolbar.vue.d.ts +53 -53
  50. package/lib/editify.es.js +8879 -7668
  51. package/lib/editify.umd.js +2 -2
  52. package/lib/feature/align.d.ts +32 -0
  53. package/lib/feature/attachment.d.ts +18 -0
  54. package/lib/feature/backColor.d.ts +32 -0
  55. package/lib/feature/bold.d.ts +32 -0
  56. package/lib/feature/code.d.ts +32 -0
  57. package/lib/feature/codeBlock.d.ts +32 -0
  58. package/lib/feature/fontFamily.d.ts +32 -0
  59. package/lib/feature/fontSize.d.ts +32 -0
  60. package/lib/feature/foreColor.d.ts +32 -0
  61. package/lib/feature/formatClear.d.ts +32 -0
  62. package/lib/feature/fullScreen.d.ts +18 -0
  63. package/lib/feature/heading.d.ts +32 -0
  64. package/lib/feature/image.d.ts +32 -0
  65. package/lib/feature/indent.d.ts +18 -0
  66. package/lib/feature/infoBlock.d.ts +18 -0
  67. package/lib/feature/italic.d.ts +32 -0
  68. package/lib/feature/lineHeight.d.ts +32 -0
  69. package/lib/feature/link.d.ts +26 -0
  70. package/lib/feature/mathformula.d.ts +22 -0
  71. package/lib/feature/orderList.d.ts +32 -0
  72. package/lib/feature/panel.d.ts +18 -0
  73. package/lib/feature/quote.d.ts +18 -0
  74. package/lib/feature/redo.d.ts +18 -0
  75. package/lib/feature/separator.d.ts +18 -0
  76. package/lib/feature/sourceView.d.ts +18 -0
  77. package/lib/feature/strikethrough.d.ts +32 -0
  78. package/lib/feature/sub.d.ts +32 -0
  79. package/lib/feature/super.d.ts +32 -0
  80. package/lib/feature/table.d.ts +32 -0
  81. package/lib/feature/task.d.ts +32 -0
  82. package/lib/feature/underline.d.ts +32 -0
  83. package/lib/feature/undo.d.ts +18 -0
  84. package/lib/feature/unorderList.d.ts +32 -0
  85. package/lib/feature/video.d.ts +38 -0
  86. package/lib/index.d.ts +104 -69
  87. package/package.json +5 -5
  88. package/src/components/button/button.vue +21 -24
  89. package/src/components/button/index.ts +5 -0
  90. package/src/components/button/props.ts +14 -1
  91. package/src/components/checkbox/checkbox.vue +1 -1
  92. package/src/components/checkbox/index.ts +5 -0
  93. package/src/components/checkbox/props.ts +1 -1
  94. package/src/components/colors/colors.vue +3 -3
  95. package/src/components/colors/index.ts +5 -0
  96. package/src/components/colors/props.ts +2 -2
  97. package/src/components/icon/index.ts +5 -0
  98. package/src/components/insertAttachment/index.ts +5 -0
  99. package/src/{plugins/attachment → components}/insertAttachment/insertAttachment.vue +4 -2
  100. package/src/{plugins/attachment → components}/insertAttachment/props.ts +1 -1
  101. package/src/components/insertImage/index.ts +5 -0
  102. package/src/components/insertImage/insertImage.vue +5 -5
  103. package/src/components/insertImage/props.ts +1 -1
  104. package/src/components/insertLink/index.ts +5 -0
  105. package/src/components/insertLink/insertLink.vue +10 -10
  106. package/src/components/insertLink/props.ts +3 -3
  107. package/src/components/insertMathformula/index.ts +5 -0
  108. package/src/{plugins/mathformula → components}/insertMathformula/props.ts +2 -2
  109. package/src/components/insertTable/index.ts +5 -0
  110. package/src/components/insertTable/props.ts +2 -2
  111. package/src/components/insertVideo/index.ts +5 -0
  112. package/src/components/insertVideo/insertVideo.vue +2 -2
  113. package/src/components/insertVideo/props.ts +1 -1
  114. package/src/components/layer/index.ts +5 -0
  115. package/src/components/layer/layer.vue +42 -4
  116. package/src/components/tooltip/index.ts +5 -0
  117. package/src/components/tooltip/tooltip.vue +1 -1
  118. package/src/components/triangle/index.ts +5 -0
  119. package/src/components/triangle/triangle.vue +1 -1
  120. package/src/components/updateLink/index.ts +5 -0
  121. package/src/components/updateLink/props.ts +21 -0
  122. package/src/components/{toolbar/toolbar.less → updateLink/updateLink.less} +4 -20
  123. package/src/components/updateLink/updateLink.vue +74 -0
  124. package/src/core/function.ts +289 -97
  125. package/src/core/rule.ts +96 -7
  126. package/src/core/tool.ts +234 -78
  127. package/src/editify/editify.less +2 -0
  128. package/src/editify/editify.vue +182 -185
  129. package/src/editify/menu/index.ts +5 -0
  130. package/src/editify/menu/menu.vue +215 -0
  131. package/src/{components → editify}/menu/props.ts +1 -1
  132. package/src/editify/props.ts +7 -11
  133. package/src/editify/toolbar/index.ts +5 -0
  134. package/src/{components → editify}/toolbar/props.ts +1 -1
  135. package/src/editify/toolbar/toolbar.less +10 -0
  136. package/src/editify/toolbar/toolbar.vue +103 -0
  137. package/src/feature/align.ts +128 -0
  138. package/src/feature/attachment.ts +109 -0
  139. package/src/feature/backColor.ts +171 -0
  140. package/src/feature/bold.ts +136 -0
  141. package/src/feature/code.ts +136 -0
  142. package/src/feature/codeBlock.ts +204 -0
  143. package/src/feature/fontFamily.ts +140 -0
  144. package/src/feature/fontSize.ts +142 -0
  145. package/src/feature/foreColor.ts +173 -0
  146. package/src/feature/formatClear.ts +118 -0
  147. package/src/feature/fullScreen.ts +57 -0
  148. package/src/feature/heading.ts +154 -0
  149. package/src/feature/image.ts +225 -0
  150. package/src/feature/indent.ts +73 -0
  151. package/src/feature/infoBlock.ts +94 -0
  152. package/src/feature/italic.ts +136 -0
  153. package/src/feature/lineHeight.ts +165 -0
  154. package/src/feature/link.ts +149 -0
  155. package/src/feature/mathformula.ts +147 -0
  156. package/src/feature/orderList.ts +116 -0
  157. package/src/feature/panel.ts +108 -0
  158. package/src/feature/quote.ts +61 -0
  159. package/src/feature/redo.ts +56 -0
  160. package/src/feature/separator.ts +62 -0
  161. package/src/feature/sourceView.ts +59 -0
  162. package/src/feature/strikethrough.ts +136 -0
  163. package/src/feature/sub.ts +136 -0
  164. package/src/feature/super.ts +136 -0
  165. package/src/feature/table.ts +994 -0
  166. package/src/feature/task.ts +116 -0
  167. package/src/feature/underline.ts +136 -0
  168. package/src/feature/undo.ts +56 -0
  169. package/src/feature/unorderList.ts +116 -0
  170. package/src/feature/video.ts +339 -0
  171. package/src/hljs/index.ts +1 -1
  172. package/src/index.ts +69 -21
  173. package/src/locale/en_US.ts +3 -3
  174. package/src/locale/zh_CN.ts +3 -3
  175. package/lib/plugins/attachment/index.d.ts +0 -37
  176. package/lib/plugins/infoBlock/index.d.ts +0 -55
  177. package/lib/plugins/mathformula/index.d.ts +0 -49
  178. package/lib/plugins/panel/index.d.ts +0 -48
  179. package/src/components/menu/menu.vue +0 -1655
  180. package/src/components/toolbar/toolbar.vue +0 -1677
  181. package/src/plugins/attachment/index.ts +0 -237
  182. package/src/plugins/infoBlock/index.ts +0 -238
  183. package/src/plugins/mathformula/index.ts +0 -295
  184. package/src/plugins/panel/index.ts +0 -228
  185. package/tsconfig.json +0 -31
  186. package/tsconfig.node.json +0 -11
  187. /package/src/{plugins/attachment → components}/insertAttachment/insertAttachment.less +0 -0
  188. /package/src/{plugins/mathformula → components}/insertMathformula/insertMathformula.less +0 -0
  189. /package/src/{plugins/mathformula → components}/insertMathformula/insertMathformula.vue +0 -0
  190. /package/src/{components → editify}/menu/menu.less +0 -0
@@ -2,9 +2,9 @@
2
2
  * 这里的方法都是对编辑器内容元素进行判断或者操作的方法,不涉及到格式化、dom渲染和光标渲染
3
3
  */
4
4
  import { common as DapCommon } from 'dap-util'
5
- import { AlexElement, AlexElementsRangeType, AlexEditor, AlexElementCreateConfigType } from 'alex-editor'
5
+ import { AlexEditor, AlexElement, AlexElementsRangeType, AlexElementCreateConfigType } from 'alex-editor'
6
+ import { ButtonOptionsItemType } from '@/components/button'
6
7
  import { cloneData, queryHasValue, getButtonOptionsConfig, ObjectType } from './tool'
7
- import { ButtonOptionsItemType } from '@/components/button/props'
8
8
 
9
9
  export type ElementMatchConfigType = {
10
10
  parsedom?: string
@@ -239,13 +239,13 @@ export const elementIsMatch = (element: AlexElement, config: ElementMatchConfigT
239
239
  * @returns
240
240
  */
241
241
  export const getMatchElementByElement = (element: AlexElement, config: ElementMatchConfigType): AlexElement | null => {
242
- if (element.isBlock()) {
243
- return elementIsMatch(element, config) ? element : null
244
- }
245
242
  if (elementIsMatch(element, config)) {
246
243
  return element
247
244
  }
248
- return getMatchElementByElement(element.parent!, config)
245
+ if (element.parent) {
246
+ return getMatchElementByElement(element.parent, config)
247
+ }
248
+ return null
249
249
  }
250
250
 
251
251
  /**
@@ -293,258 +293,448 @@ export const getMatchElementByRange = (editor: AlexEditor, dataRangeCaches: Alex
293
293
  }
294
294
 
295
295
  /**
296
- * Open API:判断元素是否有序或者无序列表
296
+ * Open API:判断元素是否有序或者无序列表,不做空元素判断
297
297
  * @param element
298
298
  * @param ordered
299
299
  * @returns
300
300
  */
301
- export const isList = (element: AlexElement, ordered: boolean | undefined = false) => {
302
- if (element.isEmpty()) {
303
- return false
304
- }
305
- return element.parsedom == 'div' && element.hasMarks() && element.marks!['data-editify-list'] == (ordered ? 'ol' : 'ul')
301
+ export const elementIsList = (element: AlexElement, ordered: boolean | undefined = false) => {
302
+ return elementIsMatch(element, {
303
+ parsedom: 'div',
304
+ marks: {
305
+ 'data-editify-list': ordered ? 'ol' : 'ul'
306
+ }
307
+ })
306
308
  }
307
309
 
308
310
  /**
309
- * Open API:判断元素是否任务列表
311
+ * Open API:判断元素是否在有序列表或者无序列表下,是的话返回有序列表或者无序列表元素,否则返回null
310
312
  * @param element
313
+ * @param ordered
311
314
  * @returns
312
315
  */
313
- export const isTask = (element: AlexElement) => {
314
- if (element.isEmpty()) {
316
+ export const getListByElement = (element: AlexElement, ordered: boolean): AlexElement | null => {
317
+ return getMatchElementByElement(element, {
318
+ parsedom: 'div',
319
+ marks: {
320
+ 'data-editify-list': ordered ? 'ol' : 'ul'
321
+ }
322
+ })
323
+ }
324
+
325
+ /**
326
+ * Open API:选区是否含有有序列表或者无序列表,不一定是同一个有序列表或者序列表,只要含有有序列表或者序列表即返回true
327
+ * @param editor
328
+ * @param dataRangeCaches
329
+ * @param ordered
330
+ * @returns
331
+ */
332
+ export const hasListInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, ordered: boolean | undefined = false) => {
333
+ if (!editor.range) {
315
334
  return false
316
335
  }
317
- return element.parsedom == 'div' && element.hasMarks() && element.marks!.hasOwnProperty('data-editify-task')
336
+ if (editor.range.anchor.isEqual(editor.range.focus)) {
337
+ return !!getListByElement(editor.range.anchor.element, ordered)
338
+ }
339
+ return dataRangeCaches.flatList.some(item => {
340
+ return !!getListByElement(item.element, ordered)
341
+ })
318
342
  }
319
343
 
320
344
  /**
321
- * Open API:判断元素是否在有序列表或者无序列表下
322
- * @param element
345
+ * Open API:选区是否全部在有序列表或者无序列表内,不一定是同一个有序列表或者无序列表
346
+ * @param editor
347
+ * @param dataRangeCaches
323
348
  * @param ordered
324
349
  * @returns
325
350
  */
326
- export const elementIsInList = (element: AlexElement, ordered: boolean): boolean => {
327
- if (isList(element, ordered)) {
328
- return true
351
+ export const rangeIsInList = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, ordered: boolean | undefined = false) => {
352
+ if (!editor.range) {
353
+ return false
329
354
  }
330
- if (element.parent) {
331
- return elementIsInList(element.parent, ordered)
355
+ if (editor.range.anchor.isEqual(editor.range.focus)) {
356
+ return !!getListByElement(editor.range.anchor.element, ordered)
332
357
  }
333
- return false
358
+ return dataRangeCaches.list.every(item => {
359
+ return !!getListByElement(item.element, ordered)
360
+ })
361
+ }
362
+
363
+ /**
364
+ * Open API:判断元素是否任务列表,不做空元素判断
365
+ * @param element
366
+ * @returns
367
+ */
368
+ export const elementIsTask = (element: AlexElement) => {
369
+ return elementIsMatch(element, {
370
+ parsedom: 'div',
371
+ marks: {
372
+ 'data-editify-task': true
373
+ }
374
+ })
334
375
  }
335
376
 
336
377
  /**
337
- * Open API:判断元素是否在任务列表下
378
+ * Open API:判断元素是否在任务列表下,是的话返回任务列表元素,否则返回null
338
379
  * @param element
339
380
  * @returns
340
381
  */
341
- export const elementIsInTask = (element: AlexElement): boolean => {
342
- if (isTask(element)) {
343
- return true
382
+ export const getTaskByElement = (element: AlexElement): AlexElement | null => {
383
+ return getMatchElementByElement(element, {
384
+ parsedom: 'div',
385
+ marks: {
386
+ 'data-editify-task': true
387
+ }
388
+ })
389
+ }
390
+
391
+ /**
392
+ * Open API:选区是否含有任务列表,不一定是同一个任务列表,只要含有任务列表即返回true
393
+ * @param editor
394
+ * @param dataRangeCaches
395
+ * @returns
396
+ */
397
+ export const hasTaskInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
398
+ if (!editor.range) {
399
+ return false
344
400
  }
345
- if (element.parent) {
346
- return elementIsInTask(element.parent)
401
+ if (editor.range.anchor.isEqual(editor.range.focus)) {
402
+ return !!getTaskByElement(editor.range.anchor.element)
347
403
  }
348
- return false
404
+ return dataRangeCaches.flatList.some(item => {
405
+ return !!getTaskByElement(item.element)
406
+ })
349
407
  }
350
408
 
351
409
  /**
352
- * Open API:选区是否含有代码块
410
+ * Open API:选区是否全部在任务列表里,不一定是同一个任务列表
353
411
  * @param editor
354
412
  * @param dataRangeCaches
355
413
  * @returns
356
414
  */
357
- export const hasPreInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
415
+ export const rangeIsInTask = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
358
416
  if (!editor.range) {
359
417
  return false
360
418
  }
361
419
  if (editor.range.anchor.isEqual(editor.range.focus)) {
362
- return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'pre' })
420
+ return !!getTaskByElement(editor.range.anchor.element)
421
+ }
422
+ return dataRangeCaches.list.every(item => {
423
+ return !!getTaskByElement(item.element)
424
+ })
425
+ }
426
+
427
+ /**
428
+ * Open API:判断元素是否附件,不做空元素判断
429
+ * @param element
430
+ * @returns
431
+ */
432
+ export const elementIsAttachment = (element: AlexElement) => {
433
+ return elementIsMatch(element, {
434
+ parsedom: 'span',
435
+ marks: {
436
+ 'data-editify-attachment': true
437
+ }
438
+ })
439
+ }
440
+
441
+ /**
442
+ * Open API:选区是否含有附件,不一定是同一个附件,只要含有附件即返回true
443
+ * @param editor
444
+ * @param dataRangeCaches
445
+ * @returns
446
+ */
447
+ export const hasAttachmentInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
448
+ if (!editor.range) {
449
+ return false
450
+ }
451
+ if (editor.range.anchor.isEqual(editor.range.focus)) {
452
+ return elementIsAttachment(editor.range.anchor.element)
363
453
  }
364
454
  return dataRangeCaches.flatList.some(item => {
365
- return !!getMatchElementByElement(item.element, { parsedom: 'pre' })
455
+ return elementIsAttachment(item.element)
456
+ })
457
+ }
458
+
459
+ /**
460
+ * Open API:判断元素是否数学公式,不做空元素判断
461
+ * @param element
462
+ * @returns
463
+ */
464
+ export const elementIsMathformula = (element: AlexElement) => {
465
+ return elementIsMatch(element, {
466
+ parsedom: 'span',
467
+ marks: {
468
+ 'data-editify-mathformula': true
469
+ }
366
470
  })
367
471
  }
368
472
 
369
473
  /**
370
- * Open API:选区是否含有引用
474
+ * Open API:判断元素是否在数学公式下,是的话返回数学公式元素,否则返回null
475
+ * @param element
476
+ * @returns
477
+ */
478
+ export const getMathformulaByElement = (element: AlexElement): AlexElement | null => {
479
+ return getMatchElementByElement(element, {
480
+ parsedom: 'span',
481
+ marks: {
482
+ 'data-editify-mathformula': true
483
+ }
484
+ })
485
+ }
486
+
487
+ /**
488
+ * Open API:选区是否含有数学公式,不一定是同一个数学公式,只要含有数学公式即返回true
371
489
  * @param editor
372
490
  * @param dataRangeCaches
373
491
  * @returns
374
492
  */
375
- export const hasQuoteInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
493
+ export const hasMathformulaInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
376
494
  if (!editor.range) {
377
495
  return false
378
496
  }
379
497
  if (editor.range.anchor.isEqual(editor.range.focus)) {
380
- return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'blockquote' })
498
+ return !!getMathformulaByElement(editor.range.anchor.element)
381
499
  }
382
500
  return dataRangeCaches.flatList.some(item => {
383
- return !!getMatchElementByElement(item.element, { parsedom: 'blockquote' })
501
+ return !!getMathformulaByElement(item.element)
384
502
  })
385
503
  }
386
504
 
387
505
  /**
388
- * Open API:选区是否含有有序列表或者无序列表
506
+ * Open API:判断元素是否面板,不做空元素判断
507
+ * @param el
508
+ * @returns
509
+ */
510
+ export const elementIsPanel = (element: AlexElement) => {
511
+ return elementIsMatch(element, {
512
+ parsedom: 'div',
513
+ marks: {
514
+ 'data-editify-panel': true
515
+ }
516
+ })
517
+ }
518
+
519
+ /**
520
+ * Open API:判断元素是否在面板内,是的话返回面板元素,否则返回null
521
+ * @param el
522
+ * @returns
523
+ */
524
+ export const getPanelByElement = (element: AlexElement): AlexElement | null => {
525
+ return getMatchElementByElement(element, {
526
+ parsedom: 'div',
527
+ marks: {
528
+ 'data-editify-panel': true
529
+ }
530
+ })
531
+ }
532
+
533
+ /**
534
+ * Open API:选区是否含有面板,不一定是同一个面板,只要含有面板即返回true
389
535
  * @param editor
390
536
  * @param dataRangeCaches
391
- * @param ordered
392
537
  * @returns
393
538
  */
394
- export const hasListInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, ordered: boolean | undefined = false) => {
539
+ export const hasPanelInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
395
540
  if (!editor.range) {
396
541
  return false
397
542
  }
398
543
  if (editor.range.anchor.isEqual(editor.range.focus)) {
399
- return elementIsInList(editor.range.anchor.element, ordered)
544
+ return !!getPanelByElement(editor.range.anchor.element)
400
545
  }
401
546
  return dataRangeCaches.flatList.some(item => {
402
- return elementIsInList(item.element, ordered)
547
+ return !!getPanelByElement(item.element)
548
+ })
549
+ }
550
+
551
+ /**
552
+ * Open API:判断元素是否信息块,不做空元素判断
553
+ * @param el
554
+ * @returns
555
+ */
556
+ export const elementIsInfoBlock = (element: AlexElement) => {
557
+ return elementIsMatch(element, {
558
+ parsedom: 'div',
559
+ marks: {
560
+ 'data-editify-info': true
561
+ }
562
+ })
563
+ }
564
+
565
+ /**
566
+ * Open API:判断元素是否在信息块内,是的话返回信息块元素,否则返回null
567
+ * @param el
568
+ * @returns
569
+ */
570
+ export const getInfoBlockByElement = (element: AlexElement): AlexElement | null => {
571
+ return getMatchElementByElement(element, {
572
+ parsedom: 'div',
573
+ marks: {
574
+ 'data-editify-info': true
575
+ }
403
576
  })
404
577
  }
405
578
 
406
579
  /**
407
- * Open API:选区是否含有任务列表
580
+ * Open API:选区是否含有信息块,不一定是同一个信息块,只要含有信息块即返回true
408
581
  * @param editor
409
582
  * @param dataRangeCaches
410
583
  * @returns
411
584
  */
412
- export const hasTaskInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
585
+ export const hasInfoBlockInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
413
586
  if (!editor.range) {
414
587
  return false
415
588
  }
416
589
  if (editor.range.anchor.isEqual(editor.range.focus)) {
417
- return elementIsInTask(editor.range.anchor.element)
590
+ return !!getInfoBlockByElement(editor.range.anchor.element)
418
591
  }
419
592
  return dataRangeCaches.flatList.some(item => {
420
- return elementIsInTask(item.element)
593
+ return !!getInfoBlockByElement(item.element)
421
594
  })
422
595
  }
423
596
 
424
597
  /**
425
- * Open API:选区是否含有链接
598
+ * Open API:选区是否全部在信息块里,不一定是同一个信息块
426
599
  * @param editor
427
600
  * @param dataRangeCaches
428
601
  * @returns
429
602
  */
430
- export const hasLinkInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
603
+ export const rangeIsInInfoBlock = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
431
604
  if (!editor.range) {
432
605
  return false
433
606
  }
434
607
  if (editor.range.anchor.isEqual(editor.range.focus)) {
435
- return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'a' })
608
+ return !!getInfoBlockByElement(editor.range.anchor.element)
609
+ }
610
+ return dataRangeCaches.flatList.every(item => {
611
+ return !!getInfoBlockByElement(item.element)
612
+ })
613
+ }
614
+
615
+ /**
616
+ * Open API:选区是否含有代码块,不一定是同一个代码块,只要含有代码块即返回true
617
+ * @param editor
618
+ * @param dataRangeCaches
619
+ * @returns
620
+ */
621
+ export const hasPreInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
622
+ if (!editor.range) {
623
+ return false
624
+ }
625
+ if (editor.range.anchor.isEqual(editor.range.focus)) {
626
+ return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'pre' })
436
627
  }
437
628
  return dataRangeCaches.flatList.some(item => {
438
- return !!getMatchElementByElement(item.element, { parsedom: 'a' })
629
+ return !!getMatchElementByElement(item.element, { parsedom: 'pre' })
439
630
  })
440
631
  }
441
632
 
442
633
  /**
443
- * Open API:选区是否含有表格
634
+ * Open API:选区是否含有引用,不一定是同一个引用,只要含有引用即返回true
444
635
  * @param editor
445
636
  * @param dataRangeCaches
446
637
  * @returns
447
638
  */
448
- export const hasTableInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
639
+ export const hasQuoteInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
449
640
  if (!editor.range) {
450
641
  return false
451
642
  }
452
643
  if (editor.range.anchor.isEqual(editor.range.focus)) {
453
- return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'table' })
644
+ return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'blockquote' })
454
645
  }
455
646
  return dataRangeCaches.flatList.some(item => {
456
- return !!getMatchElementByElement(item.element, { parsedom: 'table' })
647
+ return !!getMatchElementByElement(item.element, { parsedom: 'blockquote' })
457
648
  })
458
649
  }
459
650
 
460
651
  /**
461
- * Open API:选区是否含有图片
652
+ * Open API:选区是否含有链接,不一定是同一个链接,只要含有链接即返回true
462
653
  * @param editor
463
654
  * @param dataRangeCaches
464
655
  * @returns
465
656
  */
466
- export const hasImageInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
657
+ export const hasLinkInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
467
658
  if (!editor.range) {
468
659
  return false
469
660
  }
470
661
  if (editor.range.anchor.isEqual(editor.range.focus)) {
471
- return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'img' })
662
+ return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'a' })
472
663
  }
473
664
  return dataRangeCaches.flatList.some(item => {
474
- return !!getMatchElementByElement(item.element, { parsedom: 'img' })
665
+ return !!getMatchElementByElement(item.element, { parsedom: 'a' })
475
666
  })
476
667
  }
477
668
 
478
669
  /**
479
- * Open API:选区是否含有视频
670
+ * Open API:选区是否含有表格,不一定是同一个表格,只要含有表格即返回true
480
671
  * @param editor
481
672
  * @param dataRangeCaches
482
673
  * @returns
483
674
  */
484
- export const hasVideoInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
675
+ export const hasTableInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
485
676
  if (!editor.range) {
486
677
  return false
487
678
  }
488
679
  if (editor.range.anchor.isEqual(editor.range.focus)) {
489
- return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'video' })
680
+ return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'table' })
490
681
  }
491
682
  return dataRangeCaches.flatList.some(item => {
492
- return !!getMatchElementByElement(item.element, { parsedom: 'video' })
683
+ return !!getMatchElementByElement(item.element, { parsedom: 'table' })
493
684
  })
494
685
  }
495
686
 
496
687
  /**
497
- * Open API:选区是否全部在引用内
688
+ * Open API:选区是否含有图片,不一定是同一个图片,只要含有图片即返回true
498
689
  * @param editor
499
690
  * @param dataRangeCaches
500
691
  * @returns
501
692
  */
502
- export const isRangeInQuote = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
693
+ export const hasImageInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
503
694
  if (!editor.range) {
504
695
  return false
505
696
  }
506
697
  if (editor.range.anchor.isEqual(editor.range.focus)) {
507
- return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'blockquote' })
698
+ return elementIsMatch(editor.range.anchor.element, { parsedom: 'img' })
508
699
  }
509
- return dataRangeCaches.list.every(item => {
510
- return !!getMatchElementByElement(item.element, { parsedom: 'blockquote' })
700
+ return dataRangeCaches.flatList.some(item => {
701
+ return elementIsMatch(item.element, { parsedom: 'img' })
511
702
  })
512
703
  }
513
704
 
514
705
  /**
515
- * Open API:选区是否全部在有序列表或者无序列表内
706
+ * Open API:选区是否含有视频,不一定是同一个视频,只要含有视频即返回true
516
707
  * @param editor
517
708
  * @param dataRangeCaches
518
- * @param ordered
519
709
  * @returns
520
710
  */
521
- export const isRangeInList = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType, ordered: boolean | undefined = false) => {
711
+ export const hasVideoInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
522
712
  if (!editor.range) {
523
713
  return false
524
714
  }
525
715
  if (editor.range.anchor.isEqual(editor.range.focus)) {
526
- return elementIsInList(editor.range.anchor.element, ordered)
716
+ return elementIsMatch(editor.range.anchor.element, { parsedom: 'video' })
527
717
  }
528
- return dataRangeCaches.list.every(item => {
529
- return elementIsInList(item.element, ordered)
718
+ return dataRangeCaches.flatList.some(item => {
719
+ return elementIsMatch(item.element, { parsedom: 'video' })
530
720
  })
531
721
  }
532
722
 
533
723
  /**
534
- * Open API:选区是否全部在任务列表里
724
+ * Open API:选区是否全部在引用内,不一定是同一个引用
535
725
  * @param editor
536
726
  * @param dataRangeCaches
537
727
  * @returns
538
728
  */
539
- export const isRangeInTask = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
729
+ export const rangeIsInQuote = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
540
730
  if (!editor.range) {
541
731
  return false
542
732
  }
543
733
  if (editor.range.anchor.isEqual(editor.range.focus)) {
544
- return elementIsInTask(editor.range.anchor.element)
734
+ return !!getMatchElementByElement(editor.range.anchor.element, { parsedom: 'blockquote' })
545
735
  }
546
736
  return dataRangeCaches.list.every(item => {
547
- return elementIsInTask(item.element)
737
+ return !!getMatchElementByElement(item.element, { parsedom: 'blockquote' })
548
738
  })
549
739
  }
550
740
 
@@ -631,7 +821,7 @@ export const queryTextMark = (editor: AlexEditor, dataRangeCaches: AlexElementsR
631
821
  }
632
822
 
633
823
  /**
634
- * Open API:获取选区内的文字内容,用于预置链接文字
824
+ * Open API:获取选区内的文字内容
635
825
  * @param dataRangeCaches
636
826
  * @returns
637
827
  */
@@ -734,7 +924,7 @@ export const elementToParagraph = (element: AlexElement) => {
734
924
  */
735
925
  export const elementToList = (element: AlexElement, ordered: boolean | undefined = false) => {
736
926
  //如果是列表则返回
737
- if (isList(element, ordered)) {
927
+ if (elementIsList(element, ordered)) {
738
928
  return
739
929
  }
740
930
  //先转为段落
@@ -754,7 +944,7 @@ export const elementToList = (element: AlexElement, ordered: boolean | undefined
754
944
  */
755
945
  export const elementToTask = (element: AlexElement) => {
756
946
  //如果是任务列表则返回
757
- if (isTask(element)) {
947
+ if (elementIsTask(element)) {
758
948
  return
759
949
  }
760
950
  //先转为段落
@@ -908,7 +1098,7 @@ export const setQuote = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeT
908
1098
  return
909
1099
  }
910
1100
  //是否都在引用里
911
- const flag = isRangeInQuote(editor, dataRangeCaches)
1101
+ const flag = rangeIsInQuote(editor, dataRangeCaches)
912
1102
  //起点和终点在一起
913
1103
  if (editor.range.anchor.isEqual(editor.range.focus)) {
914
1104
  const block = editor.range.anchor.element.getBlock()
@@ -1014,7 +1204,7 @@ export const setList = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeTy
1014
1204
  return
1015
1205
  }
1016
1206
  //是否都在列表内
1017
- const flag = isRangeInList(editor, dataRangeCaches, ordered)
1207
+ const flag = rangeIsInList(editor, dataRangeCaches, ordered)
1018
1208
  //起点和终点在一起
1019
1209
  if (editor.range.anchor.isEqual(editor.range.focus)) {
1020
1210
  const block = editor.range.anchor.element.getBlock()
@@ -1054,8 +1244,8 @@ export const setTask = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeTy
1054
1244
  if (!editor.range) {
1055
1245
  return
1056
1246
  }
1057
- //是否都在任务列表那
1058
- const flag = isRangeInTask(editor, dataRangeCaches)
1247
+ //是否都在任务列表里
1248
+ const flag = rangeIsInTask(editor, dataRangeCaches)
1059
1249
  //起点和终点在一起
1060
1250
  if (editor.range.anchor.isEqual(editor.range.focus)) {
1061
1251
  const block = editor.range.anchor.element.getBlock()
@@ -1584,20 +1774,22 @@ export const insertCodeBlock = (editor: AlexEditor, dataRangeCaches: AlexElement
1584
1774
  else {
1585
1775
  editor.range.anchor.moveToStart(dataRangeCaches.list[0].element.getBlock())
1586
1776
  editor.range.focus.moveToEnd(dataRangeCaches.list[dataRangeCaches.list.length - 1].element.getBlock())
1587
- const res = dataRangeCaches.flatList.filter(el => el.element.isText())
1588
- const obj: ObjectType = {}
1589
- res.forEach(el => {
1590
- if (obj[el.element.getBlock().key]) {
1591
- obj[el.element.getBlock().key].push(el.element.clone())
1592
- } else {
1593
- obj[el.element.getBlock().key] = [el.element.clone()]
1594
- }
1595
- })
1777
+ const result: ObjectType = {}
1778
+ editor
1779
+ .getElementsByRange()
1780
+ .flatList.filter(el => el.element.isText())
1781
+ .forEach(el => {
1782
+ if (result[`_${el.element.getBlock().key}`]) {
1783
+ result[`_${el.element.getBlock().key}`].push(el.element.clone())
1784
+ } else {
1785
+ result[`_${el.element.getBlock().key}`] = [el.element.clone()]
1786
+ }
1787
+ })
1596
1788
  const pre = AlexElement.create({
1597
1789
  type: 'block',
1598
1790
  parsedom: 'pre'
1599
1791
  })
1600
- Object.keys(obj).forEach((key, index) => {
1792
+ Object.keys(result).forEach((key, index) => {
1601
1793
  if (index > 0) {
1602
1794
  const text = AlexElement.create({
1603
1795
  type: 'text',
@@ -1609,7 +1801,7 @@ export const insertCodeBlock = (editor: AlexEditor, dataRangeCaches: AlexElement
1609
1801
  editor.addElementTo(text, pre)
1610
1802
  }
1611
1803
  }
1612
- obj[key].forEach((el: AlexElement) => {
1804
+ result[key].forEach((el: AlexElement) => {
1613
1805
  if (pre.hasChildren()) {
1614
1806
  editor.addElementTo(el, pre, pre.children!.length)
1615
1807
  } else {