vue-editify 0.2.13 → 0.2.15

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.
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 {