vue-editify 0.2.18 → 0.2.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. package/examples/App.vue +3 -287
  2. package/lib/components/tooltip/tooltip.vue.d.ts +1 -1
  3. package/lib/core/function.d.ts +1 -28
  4. package/lib/core/shortcut.d.ts +36 -0
  5. package/lib/core/tool.d.ts +11 -3
  6. package/lib/editify/editify.vue.d.ts +152 -14
  7. package/lib/editify/props.d.ts +0 -4
  8. package/lib/editify/toolbar/toolbar.vue.d.ts +1 -1
  9. package/lib/editify.es.js +3534 -2669
  10. package/lib/editify.umd.js +2 -2
  11. package/lib/index.d.ts +154 -16
  12. package/package.json +2 -2
  13. package/src/core/function.ts +1 -105
  14. package/src/core/rule.ts +2 -2
  15. package/src/core/shortcut.ts +386 -0
  16. package/src/core/tool.ts +107 -49
  17. package/src/css/var.less +0 -10
  18. package/src/editify/editify.less +1 -29
  19. package/src/editify/editify.vue +89 -25
  20. package/src/editify/menu/menu.vue +2 -3
  21. package/src/editify/props.ts +0 -5
  22. package/src/feature/align.ts +1 -1
  23. package/src/feature/attachment.ts +1 -1
  24. package/src/feature/backColor.ts +1 -1
  25. package/src/feature/bold.ts +1 -1
  26. package/src/feature/code.ts +1 -1
  27. package/src/feature/codeBlock.ts +3 -3
  28. package/src/feature/fontFamily.ts +1 -1
  29. package/src/feature/fontSize.ts +1 -1
  30. package/src/feature/foreColor.ts +1 -1
  31. package/src/feature/formatClear.ts +1 -1
  32. package/src/feature/fullScreen.ts +1 -1
  33. package/src/feature/heading.ts +3 -3
  34. package/src/feature/image.ts +1 -1
  35. package/src/feature/indent.ts +1 -1
  36. package/src/feature/infoBlock.ts +3 -3
  37. package/src/feature/italic.ts +1 -1
  38. package/src/feature/lineHeight.ts +1 -1
  39. package/src/feature/link.ts +1 -1
  40. package/src/feature/mathformula.ts +1 -1
  41. package/src/feature/orderList.ts +3 -3
  42. package/src/feature/quote.ts +3 -3
  43. package/src/feature/redo.ts +1 -1
  44. package/src/feature/separator.ts +1 -1
  45. package/src/feature/sourceView.ts +1 -1
  46. package/src/feature/strikethrough.ts +1 -1
  47. package/src/feature/sub.ts +1 -1
  48. package/src/feature/super.ts +1 -1
  49. package/src/feature/table.ts +3 -3
  50. package/src/feature/task.ts +3 -3
  51. package/src/feature/underline.ts +1 -1
  52. package/src/feature/undo.ts +1 -1
  53. package/src/feature/unorderList.ts +3 -3
  54. package/src/feature/video.ts +1 -1
  55. package/src/icon/iconfont.css +4 -8
  56. package/src/icon/iconfont.ttf +0 -0
  57. package/src/icon/iconfont.woff +0 -0
  58. package/src/index.ts +2 -6
  59. package/src/locale/en_US.ts +0 -3
  60. package/src/locale/zh_CN.ts +0 -3
  61. package/lib/feature/panel.d.ts +0 -18
  62. package/src/feature/panel.ts +0 -62
package/lib/index.d.ts CHANGED
@@ -107,10 +107,6 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
107
107
  type: BooleanConstructor;
108
108
  default: boolean;
109
109
  };
110
- tab: {
111
- type: BooleanConstructor;
112
- default: boolean;
113
- };
114
110
  dark: {
115
111
  type: BooleanConstructor;
116
112
  default: boolean;
@@ -287,11 +283,156 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
287
283
  };
288
284
  } | null;
289
285
  }[];
290
- current: number;
291
- push: (stack: AlexElement[], range?: import('alex-editor').AlexRange | null) => void;
292
- get: (type: -1 | 1) => import('alex-editor').AlexHistoryResultType | null;
293
- updateCurrentRange: (range: import('alex-editor').AlexRange) => void;
294
- __cloneRange: (newStack: AlexElement[], range?: import('alex-editor').AlexRange | null) => import('alex-editor').AlexRange | null;
286
+ redoRecords: {
287
+ stack: {
288
+ key: number;
289
+ type: import('alex-editor').AlexElementType;
290
+ parsedom: string | null;
291
+ marks: import('alex-editor').ObjectType | null;
292
+ styles: import('alex-editor').ObjectType | null;
293
+ textContent: string | null;
294
+ children: any[] | null;
295
+ parent: any | null;
296
+ behavior: "default" | "block";
297
+ namespace: string | null;
298
+ locked: boolean;
299
+ elm: HTMLElement | null;
300
+ isBlock: () => boolean;
301
+ isInblock: () => boolean;
302
+ isInline: () => boolean;
303
+ isClosed: () => boolean;
304
+ isText: () => boolean;
305
+ isBreak: () => boolean;
306
+ isEmpty: () => boolean;
307
+ isSpaceText: () => boolean;
308
+ getUneditableElement: () => AlexElement | null;
309
+ isEqual: (element: AlexElement) => boolean;
310
+ isContains: (element: AlexElement) => boolean;
311
+ isOnlyHasBreak: () => boolean | 0;
312
+ isPreStyle: () => boolean;
313
+ hasMarks: () => boolean;
314
+ hasStyles: () => boolean;
315
+ hasChildren: () => boolean;
316
+ hasContains: (element: AlexElement) => boolean;
317
+ clone: (deep?: boolean | undefined) => AlexElement;
318
+ convertToBlock: () => void;
319
+ toEmpty: () => void;
320
+ getBlock: () => AlexElement;
321
+ getInblock: () => AlexElement | null;
322
+ getInline: () => AlexElement | null;
323
+ isEqualStyles: (element: AlexElement) => boolean;
324
+ isEqualMarks: (element: AlexElement) => boolean;
325
+ isFirst: (element: AlexElement) => boolean;
326
+ isLast: (element: AlexElement) => boolean;
327
+ __render: () => void;
328
+ __fullClone: () => AlexElement;
329
+ }[];
330
+ range: {
331
+ anchor: {
332
+ element: {
333
+ key: number;
334
+ type: import('alex-editor').AlexElementType;
335
+ parsedom: string | null;
336
+ marks: import('alex-editor').ObjectType | null;
337
+ styles: import('alex-editor').ObjectType | null;
338
+ textContent: string | null;
339
+ children: any[] | null;
340
+ parent: any | null;
341
+ behavior: "default" | "block";
342
+ namespace: string | null;
343
+ locked: boolean;
344
+ elm: HTMLElement | null;
345
+ isBlock: () => boolean;
346
+ isInblock: () => boolean;
347
+ isInline: () => boolean;
348
+ isClosed: () => boolean;
349
+ isText: () => boolean;
350
+ isBreak: () => boolean;
351
+ isEmpty: () => boolean;
352
+ isSpaceText: () => boolean;
353
+ getUneditableElement: () => AlexElement | null;
354
+ isEqual: (element: AlexElement) => boolean;
355
+ isContains: (element: AlexElement) => boolean;
356
+ isOnlyHasBreak: () => boolean | 0;
357
+ isPreStyle: () => boolean;
358
+ hasMarks: () => boolean;
359
+ hasStyles: () => boolean;
360
+ hasChildren: () => boolean;
361
+ hasContains: (element: AlexElement) => boolean;
362
+ clone: (deep?: boolean | undefined) => AlexElement;
363
+ convertToBlock: () => void;
364
+ toEmpty: () => void;
365
+ getBlock: () => AlexElement;
366
+ getInblock: () => AlexElement | null;
367
+ getInline: () => AlexElement | null;
368
+ isEqualStyles: (element: AlexElement) => boolean;
369
+ isEqualMarks: (element: AlexElement) => boolean;
370
+ isFirst: (element: AlexElement) => boolean;
371
+ isLast: (element: AlexElement) => boolean;
372
+ __render: () => void;
373
+ __fullClone: () => AlexElement;
374
+ };
375
+ offset: number;
376
+ isEqual: (point: import('alex-editor').AlexPoint) => boolean;
377
+ moveToEnd: (element: AlexElement) => void;
378
+ moveToStart: (element: AlexElement) => void;
379
+ };
380
+ focus: {
381
+ element: {
382
+ key: number;
383
+ type: import('alex-editor').AlexElementType;
384
+ parsedom: string | null;
385
+ marks: import('alex-editor').ObjectType | null;
386
+ styles: import('alex-editor').ObjectType | null;
387
+ textContent: string | null;
388
+ children: any[] | null;
389
+ parent: any | null;
390
+ behavior: "default" | "block";
391
+ namespace: string | null;
392
+ locked: boolean;
393
+ elm: HTMLElement | null;
394
+ isBlock: () => boolean;
395
+ isInblock: () => boolean;
396
+ isInline: () => boolean;
397
+ isClosed: () => boolean;
398
+ isText: () => boolean;
399
+ isBreak: () => boolean;
400
+ isEmpty: () => boolean;
401
+ isSpaceText: () => boolean;
402
+ getUneditableElement: () => AlexElement | null;
403
+ isEqual: (element: AlexElement) => boolean;
404
+ isContains: (element: AlexElement) => boolean;
405
+ isOnlyHasBreak: () => boolean | 0;
406
+ isPreStyle: () => boolean;
407
+ hasMarks: () => boolean;
408
+ hasStyles: () => boolean;
409
+ hasChildren: () => boolean;
410
+ hasContains: (element: AlexElement) => boolean;
411
+ clone: (deep?: boolean | undefined) => AlexElement;
412
+ convertToBlock: () => void;
413
+ toEmpty: () => void;
414
+ getBlock: () => AlexElement;
415
+ getInblock: () => AlexElement | null;
416
+ getInline: () => AlexElement | null;
417
+ isEqualStyles: (element: AlexElement) => boolean;
418
+ isEqualMarks: (element: AlexElement) => boolean;
419
+ isFirst: (element: AlexElement) => boolean;
420
+ isLast: (element: AlexElement) => boolean;
421
+ __render: () => void;
422
+ __fullClone: () => AlexElement;
423
+ };
424
+ offset: number;
425
+ isEqual: (point: import('alex-editor').AlexPoint) => boolean;
426
+ moveToEnd: (element: AlexElement) => void;
427
+ moveToStart: (element: AlexElement) => void;
428
+ };
429
+ } | null;
430
+ }[];
431
+ cloneRange: (newStack: AlexElement[], range: import('alex-editor').AlexRange | null) => import('alex-editor').AlexRange | null;
432
+ setState: (stack: AlexElement[], range: import('alex-editor').AlexRange | null) => void;
433
+ undo: () => import('alex-editor').AlexHistoryRecordType | null;
434
+ redo: () => import('alex-editor').AlexHistoryRecordType | null;
435
+ updateRange: (range: import('alex-editor').AlexRange) => void;
295
436
  };
296
437
  stack: {
297
438
  key: number;
@@ -515,6 +656,8 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
515
656
  collapseToEnd: (element?: AlexElement) => void;
516
657
  setDisabled: () => void;
517
658
  setEnabled: () => void;
659
+ undo: () => void;
660
+ redo: () => void;
518
661
  emit: (eventName: string, ...value: any) => boolean;
519
662
  on: (eventName: string, eventHandle: (...args: any) => void) => void;
520
663
  off: (eventName: string, eventHandle?: (...args: any) => void) => void;
@@ -739,10 +882,6 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
739
882
  type: BooleanConstructor;
740
883
  default: boolean;
741
884
  };
742
- tab: {
743
- type: BooleanConstructor;
744
- default: boolean;
745
- };
746
885
  dark: {
747
886
  type: BooleanConstructor;
748
887
  default: boolean;
@@ -793,7 +932,6 @@ declare const Editify: import('./core/tool').SFCWithInstall<import('vue').Define
793
932
  extraKeepTags: string[];
794
933
  renderRules: ((el: AlexElement) => void)[];
795
934
  autoheight: boolean;
796
- tab: boolean;
797
935
  dark: boolean;
798
936
  offset: number;
799
937
  }, {}>>;
@@ -813,7 +951,7 @@ export type * from './core/tool';
813
951
  export type * from './core/function';
814
952
  export type * from './editify/menu';
815
953
  export type * from './editify/toolbar';
816
- export { elementIsMatch, getMatchElementByElement, getMatchElementByRange, elementIsList, getListByElement, hasListInRange, rangeIsInList, elementIsTask, getTaskByElement, hasTaskInRange, rangeIsInTask, elementIsAttachment, hasAttachmentInRange, elementIsMathformula, getMathformulaByElement, hasMathformulaInRange, elementIsPanel, getPanelByElement, hasPanelInRange, elementIsInfoBlock, getInfoBlockByElement, hasInfoBlockInRange, rangeIsInInfoBlock, hasPreInRange, hasTableInRange, hasQuoteInRange, rangeIsInQuote, hasLinkInRange, hasImageInRange, hasVideoInRange, queryTextStyle, setTextStyle, removeTextStyle, queryTextMark, setTextMark, removeTextMark, getRangeText, addSpaceTextToBothSides, setHeading, setIndentIncrease, setIndentDecrease, setQuote, setAlign, setList, setTask, setLineHeight, insertLink, insertImage, insertVideo, insertTable, insertCodeBlock, insertSeparator, insertAttachment, insertMathformula, insertInfoBlock, insertPanel } from './core/function';
954
+ export { elementIsMatch, getMatchElementByElement, getMatchElementByRange, elementIsList, getListByElement, hasListInRange, rangeIsInList, elementIsTask, getTaskByElement, hasTaskInRange, rangeIsInTask, elementIsAttachment, hasAttachmentInRange, elementIsMathformula, getMathformulaByElement, hasMathformulaInRange, elementIsInfoBlock, getInfoBlockByElement, hasInfoBlockInRange, rangeIsInInfoBlock, hasPreInRange, hasTableInRange, hasQuoteInRange, rangeIsInQuote, hasLinkInRange, hasImageInRange, hasVideoInRange, queryTextStyle, setTextStyle, removeTextStyle, queryTextMark, setTextMark, removeTextMark, getRangeText, addSpaceTextToBothSides, setHeading, setIndentIncrease, setIndentDecrease, setQuote, setAlign, setList, setTask, setLineHeight, insertLink, insertImage, insertVideo, insertTable, insertCodeBlock, insertSeparator, insertAttachment, insertMathformula, insertInfoBlock } from './core/function';
817
955
  declare const install: (app: App) => void;
818
- declare const version = "0.2.18";
956
+ declare const version = "0.2.20";
819
957
  export { Editify as default, Editify, install, AlexElement, version };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-editify",
3
- "version": "0.2.18",
3
+ "version": "0.2.20",
4
4
  "private": false,
5
5
  "sideEffects": [
6
6
  "*.css"
@@ -17,7 +17,7 @@
17
17
  "lib": "vue-tsc && vite build"
18
18
  },
19
19
  "dependencies": {
20
- "alex-editor": "^1.4.30",
20
+ "alex-editor": "^1.4.34",
21
21
  "dap-util": "^1.5.8",
22
22
  "highlight.js": "^11.8.0",
23
23
  "katex": "^0.16.10",
@@ -763,54 +763,6 @@ export const hasMathformulaInRange = (editor: AlexEditor, dataRangeCaches: AlexE
763
763
  })
764
764
  }
765
765
 
766
- /** --------------------------------面板判断函数--------------------------------------------------- */
767
-
768
- /**
769
- * Open API:判断元素是否面板,不做空元素判断
770
- * @param el
771
- * @returns
772
- */
773
- export const elementIsPanel = (element: AlexElement) => {
774
- return elementIsMatch(element, {
775
- parsedom: 'div',
776
- marks: {
777
- 'data-editify-panel': true
778
- }
779
- })
780
- }
781
-
782
- /**
783
- * Open API:判断元素是否在面板内,是的话返回面板元素,否则返回null
784
- * @param el
785
- * @returns
786
- */
787
- export const getPanelByElement = (element: AlexElement): AlexElement | null => {
788
- return getMatchElementByElement(element, {
789
- parsedom: 'div',
790
- marks: {
791
- 'data-editify-panel': true
792
- }
793
- })
794
- }
795
-
796
- /**
797
- * Open API:选区是否含有面板,不一定是同一个面板,只要含有面板即返回true
798
- * @param editor
799
- * @param dataRangeCaches
800
- * @returns
801
- */
802
- export const hasPanelInRange = (editor: AlexEditor, dataRangeCaches: AlexElementsRangeType) => {
803
- if (!editor.range) {
804
- return false
805
- }
806
- if (editor.range.anchor.isEqual(editor.range.focus)) {
807
- return !!getPanelByElement(editor.range.anchor.element)
808
- }
809
- return dataRangeCaches.flatList.some(item => {
810
- return !!getPanelByElement(item.element)
811
- })
812
- }
813
-
814
766
  /** --------------------------------信息块判断函数---------------------------------------------- */
815
767
 
816
768
  /**
@@ -1507,7 +1459,7 @@ export const addSpaceTextToBothSides = (editor: AlexEditor, element: AlexElement
1507
1459
  /** --------------------------------菜单功能函数----------------------------------------------------- */
1508
1460
 
1509
1461
  /**
1510
- * OpenAPI:设置标题,支持h1-h6和p
1462
+ * Open API:设置标题,支持h1-h6和p
1511
1463
  * @param editor
1512
1464
  * @param dataRangeCaches
1513
1465
  * @param editTrans
@@ -2274,59 +2226,3 @@ export const insertInfoBlock = (editor: AlexEditor, dataRangeCaches: AlexElement
2274
2226
  })
2275
2227
  }
2276
2228
  }
2277
-
2278
- /**
2279
- * Open API:插入面板
2280
- * @param editor
2281
- * @param panelTitle 面板标题
2282
- * @param panelContent 面板内容
2283
- */
2284
- export const insertPanel = (editor: AlexEditor, panelTitle: string, panelContent: string) => {
2285
- const panelElement = AlexElement.create({
2286
- type: 'block',
2287
- parsedom: 'div',
2288
- marks: {
2289
- 'data-editify-panel': 'true'
2290
- },
2291
- children: [
2292
- {
2293
- type: 'inblock',
2294
- parsedom: 'div',
2295
- behavior: 'block',
2296
- children: [
2297
- {
2298
- type: 'text',
2299
- textcontent: panelTitle
2300
- }
2301
- ]
2302
- },
2303
- {
2304
- type: 'inblock',
2305
- parsedom: 'div',
2306
- behavior: 'block',
2307
- children: [
2308
- {
2309
- type: 'text',
2310
- textcontent: panelContent
2311
- }
2312
- ]
2313
- }
2314
- ]
2315
- })
2316
- editor.insertElement(panelElement)
2317
- //面板后面插入段落
2318
- const paragraph = AlexElement.create({
2319
- type: 'block',
2320
- parsedom: AlexElement.BLOCK_NODE,
2321
- children: [
2322
- {
2323
- type: 'closed',
2324
- parsedom: 'br'
2325
- }
2326
- ]
2327
- })
2328
- editor.addElementAfter(paragraph, panelElement)
2329
- //移动光标到新插入的元素
2330
- editor.range!.anchor.moveToEnd(panelElement.children![0])
2331
- editor.range!.focus.moveToEnd(panelElement.children![0])
2332
- }
package/src/core/rule.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { AlexEditor, AlexElement, AlexElementCreateConfigType } from 'alex-editor'
2
2
  import { common as DapCommon, color as DapColor } from 'dap-util'
3
3
  import { LanguagesItemType, getHljsHtml } from '@/hljs'
4
- import { getTableSize, getCellSpanNumber, elementIsList, elementIsTask, elementIsAttachment, elementIsMathformula, elementIsInfoBlock, elementIsPanel, autocompleteTableCells, autoHideMergedTableCells, updateRangeInPre, addSpaceTextToBothSides } from './function'
4
+ import { getTableSize, getCellSpanNumber, elementIsList, elementIsTask, elementIsAttachment, elementIsMathformula, elementIsInfoBlock, autocompleteTableCells, autoHideMergedTableCells, updateRangeInPre, addSpaceTextToBothSides } from './function'
5
5
 
6
6
  /**
7
7
  * 有序列表和无序列表的格式化处理
@@ -434,7 +434,7 @@ export const infoBlockHandle = (_editor: AlexEditor, element: AlexElement, color
434
434
  export const specialInblockHandle = (editor: AlexEditor, element: AlexElement) => {
435
435
  if (element.hasChildren()) {
436
436
  element.children!.forEach(el => {
437
- if (elementIsList(el, true) || elementIsList(el, false) || elementIsTask(el) || elementIsInfoBlock(el) || elementIsPanel(el) || ['blockquote', 'pre', 'table', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p'].includes(el.parsedom!)) {
437
+ if (elementIsList(el, true) || elementIsList(el, false) || elementIsTask(el) || elementIsInfoBlock(el) || ['blockquote', 'pre', 'table', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p'].includes(el.parsedom!)) {
438
438
  const newEl = el.clone()
439
439
  newEl.type = 'block'
440
440
  const block = element.getBlock()