vue-editify 0.2.17 → 0.2.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. package/examples/App.vue +4 -12
  2. package/lib/components/colors/colors.vue.d.ts +9 -0
  3. package/lib/components/colors/props.d.ts +4 -0
  4. package/lib/components/tooltip/tooltip.vue.d.ts +1 -1
  5. package/lib/core/function.d.ts +112 -64
  6. package/lib/core/rule.d.ts +23 -17
  7. package/lib/core/shortcut.d.ts +36 -0
  8. package/lib/core/tool.d.ts +12 -16
  9. package/lib/editify/editify.vue.d.ts +162 -15
  10. package/lib/editify/props.d.ts +1 -5
  11. package/lib/editify/toolbar/props.d.ts +1 -1
  12. package/lib/editify/toolbar/toolbar.vue.d.ts +3 -3
  13. package/lib/editify.es.js +13660 -12954
  14. package/lib/editify.umd.js +2 -2
  15. package/lib/feature/align.d.ts +0 -14
  16. package/lib/feature/heading.d.ts +0 -14
  17. package/lib/feature/lineHeight.d.ts +0 -14
  18. package/lib/feature/orderList.d.ts +1 -3
  19. package/lib/feature/task.d.ts +0 -14
  20. package/lib/feature/unorderList.d.ts +1 -3
  21. package/lib/index.d.ts +164 -17
  22. package/package.json +2 -2
  23. package/src/components/button/button.vue +3 -3
  24. package/src/components/checkbox/checkbox.vue +1 -1
  25. package/src/components/colors/colors.vue +4 -4
  26. package/src/components/colors/props.ts +6 -1
  27. package/src/components/insertAttachment/insertAttachment.vue +1 -1
  28. package/src/components/insertImage/insertImage.vue +1 -1
  29. package/src/components/insertLink/insertLink.vue +1 -1
  30. package/src/components/insertVideo/insertVideo.vue +1 -1
  31. package/src/components/layer/layer.vue +9 -3
  32. package/src/components/tooltip/tooltip.vue +1 -1
  33. package/src/components/updateLink/updateLink.vue +1 -1
  34. package/src/core/function.ts +873 -491
  35. package/src/core/rule.ts +86 -368
  36. package/src/core/shortcut.ts +386 -0
  37. package/src/core/tool.ts +111 -159
  38. package/src/css/var.less +0 -10
  39. package/src/editify/editify.less +85 -39
  40. package/src/editify/editify.vue +204 -88
  41. package/src/editify/menu/menu.vue +2 -3
  42. package/src/editify/props.ts +1 -6
  43. package/src/editify/toolbar/props.ts +2 -2
  44. package/src/editify/toolbar/toolbar.vue +12 -12
  45. package/src/feature/align.ts +2 -62
  46. package/src/feature/attachment.ts +14 -27
  47. package/src/feature/backColor.ts +2 -1
  48. package/src/feature/bold.ts +1 -1
  49. package/src/feature/code.ts +1 -1
  50. package/src/feature/codeBlock.ts +3 -3
  51. package/src/feature/fontFamily.ts +1 -1
  52. package/src/feature/fontSize.ts +1 -1
  53. package/src/feature/foreColor.ts +2 -1
  54. package/src/feature/formatClear.ts +1 -1
  55. package/src/feature/fullScreen.ts +1 -1
  56. package/src/feature/heading.ts +5 -76
  57. package/src/feature/image.ts +1 -1
  58. package/src/feature/indent.ts +1 -1
  59. package/src/feature/infoBlock.ts +6 -37
  60. package/src/feature/italic.ts +1 -1
  61. package/src/feature/lineHeight.ts +2 -78
  62. package/src/feature/link.ts +1 -1
  63. package/src/feature/mathformula.ts +4 -51
  64. package/src/feature/orderList.ts +168 -37
  65. package/src/feature/quote.ts +3 -3
  66. package/src/feature/redo.ts +1 -1
  67. package/src/feature/separator.ts +1 -1
  68. package/src/feature/sourceView.ts +1 -1
  69. package/src/feature/strikethrough.ts +1 -1
  70. package/src/feature/sub.ts +1 -1
  71. package/src/feature/super.ts +1 -1
  72. package/src/feature/table.ts +3 -3
  73. package/src/feature/task.ts +4 -58
  74. package/src/feature/underline.ts +1 -1
  75. package/src/feature/undo.ts +1 -1
  76. package/src/feature/unorderList.ts +108 -37
  77. package/src/feature/video.ts +1 -1
  78. package/src/icon/iconfont.css +39 -3
  79. package/src/icon/iconfont.ttf +0 -0
  80. package/src/icon/iconfont.woff +0 -0
  81. package/src/index.ts +13 -11
  82. package/src/locale/en_US.ts +109 -110
  83. package/src/locale/zh_CN.ts +11 -12
  84. package/lib/feature/panel.d.ts +0 -18
  85. package/src/feature/panel.ts +0 -107
@@ -1,16 +1,20 @@
1
1
  <template>
2
2
  <Layer v-model="show" ref="layerRef" :node="node" :scroll-node="scrollNode" border placement="bottom-start" :useRange="type == 'text'" :z-index="zIndex" :inside-elements="insideElements">
3
3
  <div class="editify-toolbar" :style="config.style">
4
- <!-- 链接工具条 -->
5
- <linkToolbar v-if="type == 'link'" :color="color" />
6
4
  <!-- 图片工具条 -->
7
- <ImageToolbar v-else-if="type == 'image'" @reset-toolbar="layerRef!.setPosition()" :tooltip="config.tooltip!" :color="color" :z-index="zIndex + 1" />
5
+ <ImageToolbar v-if="type == 'image'" @reset-toolbar="layerRef!.setPosition()" :tooltip="config.tooltip!" :color="color" :z-index="zIndex + 1" />
8
6
  <!-- 视频工具条 -->
9
7
  <VideoToolbar v-else-if="type == 'video'" @reset-toolbar="layerRef!.setPosition()" :tooltip="config.tooltip!" :color="color" :z-index="zIndex + 1" />
10
- <!-- 表格工具条 -->
11
- <TableToolbar v-else-if="type == 'table'" @reset-toolbar="layerRef!.setPosition()" :tooltip="config.tooltip!" :color="color" :z-index="zIndex + 1" />
12
8
  <!-- 代码块工具条 -->
13
9
  <CodeBlockToolbar v-else-if="type == 'codeBlock'" ref="codeBlockToolbarRef" :language="config.codeBlock!.languages!" :tooltip="config.tooltip!" :color="color" :z-index="zIndex + 1" />
10
+ <!-- 链接工具条 -->
11
+ <linkToolbar v-else-if="type == 'link'" :color="color" />
12
+ <!-- 表格工具条 -->
13
+ <TableToolbar v-else-if="type == 'table'" @reset-toolbar="layerRef!.setPosition()" :tooltip="config.tooltip!" :color="color" :z-index="zIndex + 1" />
14
+ <!-- 有序列表工具条 -->
15
+ <OrderListToolbar v-else-if="type == 'orderList'" :tooltip="config.tooltip!" :color="color" :z-index="zIndex + 1" />
16
+ <!-- 无序列表工具条 -->
17
+ <UnorderListToolbar v-else-if="type == 'unorderList'" :tooltip="config.tooltip!" :color="color" :z-index="zIndex + 1" />
14
18
  <!-- 文本工具条 -->
15
19
  <template v-else-if="type == 'text'">
16
20
  <component v-for="(btn, index) in textToolbarBtns" :ref="el => (textToolbarBtnRefs[index] = (el as BtnComponentPublicInstance))" :is="btn" :color="color" :z-index="zIndex + 1" :config="textButtonConfig(btn.name)" :tooltip="config.tooltip!" />
@@ -28,11 +32,8 @@ import { ImageToolbar } from '@/feature/image'
28
32
  import { VideoToolbar } from '@/feature/video'
29
33
  import { TableToolbar } from '@/feature/table'
30
34
  import { CodeBlockToolbar } from '@/feature/codeBlock'
31
- import { HeadingToolbarButton } from '@/feature/heading'
32
- import { AlignToolbarButton } from '@/feature/align'
33
- import { OrderListToolbarButton } from '@/feature/orderList'
34
- import { UnorderListToolbarButton } from '@/feature/unorderList'
35
- import { TaskToolbarButton } from '@/feature/task'
35
+ import { OrderListToolbar } from '@/feature/orderList'
36
+ import { UnorderListToolbar } from '@/feature/unorderList'
36
37
  import { BoldToolbarButton } from '@/feature/bold'
37
38
  import { ItalicToolbarButton } from '@/feature/italic'
38
39
  import { StrikethroughToolbarButton } from '@/feature/strikethrough'
@@ -42,7 +43,6 @@ import { SuperToolbarButton } from '@/feature/super'
42
43
  import { SubToolbarButton } from '@/feature/sub'
43
44
  import { FontSizeToolbarButton } from '@/feature/fontSize'
44
45
  import { FontFamilyToolbarButton } from '@/feature/fontFamily'
45
- import { LineHeightToolbarButton } from '@/feature/lineHeight'
46
46
  import { ForeColorToolbarButton } from '@/feature/foreColor'
47
47
  import { BackColorToolbarButton } from '@/feature/backColor'
48
48
  import { FormatClearToolbarButton } from '@/feature/formatClear'
@@ -62,7 +62,7 @@ type BtnComponentPublicInstance = ComponentPublicInstance & { btnRef: InstanceTy
62
62
  //代码块语言选择按钮实例
63
63
  const codeBlockToolbarRef = ref<BtnComponentPublicInstance | null>(null)
64
64
  //文本工具条按钮数组
65
- const textToolbarBtns = shallowRef([HeadingToolbarButton, AlignToolbarButton, OrderListToolbarButton, UnorderListToolbarButton, TaskToolbarButton, BoldToolbarButton, ItalicToolbarButton, StrikethroughToolbarButton, UnderlineToolbarButton, CodeToolbarButton, SuperToolbarButton, SubToolbarButton, FontSizeToolbarButton, FontFamilyToolbarButton, LineHeightToolbarButton, ForeColorToolbarButton, BackColorToolbarButton, FormatClearToolbarButton])
65
+ const textToolbarBtns = shallowRef([BoldToolbarButton, ItalicToolbarButton, StrikethroughToolbarButton, UnderlineToolbarButton, CodeToolbarButton, SuperToolbarButton, SubToolbarButton, FontSizeToolbarButton, FontFamilyToolbarButton, ForeColorToolbarButton, BackColorToolbarButton, FormatClearToolbarButton])
66
66
  //文本工具条按钮实例
67
67
  const textToolbarBtnRefs = ref<BtnComponentPublicInstance[]>([])
68
68
 
@@ -1,4 +1,4 @@
1
- import { defineComponent, h, inject, PropType, Ref, ref } from 'vue'
1
+ import { defineComponent, h, inject, PropType, Ref } from 'vue'
2
2
  import { AlexElementsRangeType, AlexEditor } from 'alex-editor'
3
3
  import { MenuSelectButtonType } from '@/core/tool'
4
4
  import { hasPreInRange, setAlign } from '@/core/function'
@@ -10,66 +10,6 @@ import { Icon } from '@/components/icon'
10
10
  */
11
11
  const FEATURE_NAME = 'align'
12
12
 
13
- /**
14
- * 工具栏 - 对齐方式
15
- */
16
- export const AlignToolbarButton = defineComponent(
17
- (props, { expose }) => {
18
- const editor = inject<Ref<AlexEditor>>('editor')!
19
- const dataRangeCaches = inject<Ref<AlexElementsRangeType>>('dataRangeCaches')!
20
- const $editTrans = inject<(key: string) => any>('$editTrans')!
21
-
22
- const btnRef = ref<InstanceType<typeof Button> | null>(null)
23
-
24
- expose({
25
- btnRef
26
- })
27
-
28
- return () => {
29
- return props.config.show
30
- ? h(
31
- Button,
32
- {
33
- ref: btnRef,
34
- name: FEATURE_NAME,
35
- type: 'select',
36
- title: $editTrans('align'),
37
- tooltip: props.tooltip,
38
- color: props.color,
39
- zIndex: props.zIndex,
40
- leftBorder: props.config.leftBorder,
41
- rightBorder: props.config.rightBorder,
42
- active: false,
43
- disabled: props.config.disabled,
44
- selectConfig: {
45
- options: props.config.options,
46
- width: props.config.width,
47
- maxHeight: props.config.maxHeight
48
- },
49
- onOperate: (_name: string, val: 'left' | 'right' | 'center' | 'justify') => {
50
- setAlign(editor.value, dataRangeCaches.value, val)
51
- editor.value.domRender()
52
- editor.value.rangeRender()
53
- }
54
- },
55
- {
56
- default: () => h(Icon, { value: 'align-left' })
57
- }
58
- )
59
- : null
60
- }
61
- },
62
- {
63
- name: `_${FEATURE_NAME}`,
64
- props: {
65
- color: String,
66
- zIndex: Number,
67
- config: Object as PropType<MenuSelectButtonType>,
68
- tooltip: Boolean
69
- }
70
- }
71
- )
72
-
73
13
  /**
74
14
  * 菜单栏 - 对齐方式
75
15
  */
@@ -90,7 +30,7 @@ export const AlignMenuButton = defineComponent(
90
30
  color: props.color,
91
31
  zIndex: props.zIndex,
92
32
  type: 'select',
93
- title: $editTrans('align'),
33
+ title: `${$editTrans('align')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
94
34
  selectConfig: {
95
35
  options: props.config.options,
96
36
  width: props.config.width,
@@ -1,8 +1,8 @@
1
1
  import { defineComponent, h, inject, PropType, ref, Ref } from 'vue'
2
- import { AlexEditor, AlexElement, AlexElementsRangeType } from 'alex-editor'
3
- import { MenuAttachmentButtonType, ObjectType } from '@/core/tool'
2
+ import { AlexEditor, AlexElementsRangeType } from 'alex-editor'
3
+ import { MenuAttachmentButtonType } from '@/core/tool'
4
4
  import { Button } from '@/components/button'
5
- import { hasMathformulaInRange, hasPreInRange } from '@/core/function'
5
+ import { hasMathformulaInRange, hasPreInRange, insertAttachment } from '@/core/function'
6
6
  import { Icon } from '@/components/icon'
7
7
  import { InsertAttachment } from '@/components/insertAttachment'
8
8
 
@@ -35,7 +35,7 @@ export const AttachmentMenuButton = defineComponent(
35
35
  zIndex: props.zIndex,
36
36
  type: 'select',
37
37
  hideScroll: true,
38
- title: $editTrans('insertAttachment'),
38
+ title: `${$editTrans('insertAttachment')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
39
39
  leftBorder: props.config.leftBorder,
40
40
  rightBorder: props.config.rightBorder,
41
41
  active: false,
@@ -62,30 +62,17 @@ export const AttachmentMenuButton = defineComponent(
62
62
  urls = urls.filter(url => {
63
63
  return !!url
64
64
  })
65
- //如果有地址存在
66
- if (urls.length) {
67
- //遍历地址数组
68
- urls.forEach(url => {
69
- const marks: ObjectType = {
70
- 'data-editify-attachment': url,
71
- 'data-editify-attachment-name': name || $editTrans('attachmentDefaultName')
72
- }
73
- //创建元素
74
- const attachmentElement = AlexElement.create({
75
- type: 'closed',
76
- parsedom: 'span',
77
- marks
78
- })
79
- //插入编辑器
80
- editor.value.insertElement(attachmentElement)
81
- //移动光标到新插入的元素
82
- editor.value.range!.anchor.moveToEnd(attachmentElement)
83
- editor.value.range!.focus.moveToEnd(attachmentElement)
84
- })
85
- //渲染
86
- editor.value.domRender()
87
- editor.value.rangeRender()
65
+ //如果数组为0
66
+ if (urls.length == 0) {
67
+ return
88
68
  }
69
+ //遍历地址数组
70
+ urls.forEach(url => {
71
+ insertAttachment(editor.value, url, name || $editTrans('attachmentDefaultName'))
72
+ })
73
+ //渲染
74
+ editor.value.domRender()
75
+ editor.value.rangeRender()
89
76
  //关闭浮层
90
77
  btnRef.value!.show = false
91
78
  }
@@ -127,7 +127,7 @@ export const BackColorMenuButton = defineComponent(
127
127
  options: props.config.options
128
128
  },
129
129
  hideScroll: true,
130
- title: $editTrans('backColor'),
130
+ title: `${$editTrans('backColor')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
131
131
  leftBorder: props.config.leftBorder,
132
132
  rightBorder: props.config.rightBorder,
133
133
  active: false,
@@ -139,6 +139,7 @@ export const BackColorMenuButton = defineComponent(
139
139
  return h(Colors, {
140
140
  tooltip: props.tooltip,
141
141
  color: props.color,
142
+ zIndex: props.zIndex + 2,
142
143
  value: selectVal.value,
143
144
  data: options,
144
145
  onChange: (val: string) => {
@@ -97,7 +97,7 @@ export const BoldMenuButton = defineComponent(
97
97
  tooltip: props.tooltip,
98
98
  color: props.color,
99
99
  zIndex: props.zIndex,
100
- title: $editTrans('bold'),
100
+ title: `${$editTrans('bold')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
101
101
  leftBorder: props.config.leftBorder,
102
102
  rightBorder: props.config.rightBorder,
103
103
  active: active.value,
@@ -97,7 +97,7 @@ export const CodeMenuButton = defineComponent(
97
97
  tooltip: props.tooltip,
98
98
  color: props.color,
99
99
  zIndex: props.zIndex,
100
- title: $editTrans('code'),
100
+ title: `${$editTrans('code')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
101
101
  leftBorder: props.config.leftBorder,
102
102
  rightBorder: props.config.rightBorder,
103
103
  active: active.value,
@@ -2,7 +2,7 @@ import { computed, defineComponent, h, inject, PropType, ref, Ref } from 'vue'
2
2
  import { AlexEditor, AlexElement, AlexElementsRangeType } from 'alex-editor'
3
3
  import { Button } from '@/components/button'
4
4
  import { Icon } from '@/components/icon'
5
- import { getMatchElementByRange, hasAttachmentInRange, hasImageInRange, hasMathformulaInRange, hasPanelInRange, hasTableInRange, hasVideoInRange, insertCodeBlock } from '@/core/function'
5
+ import { getMatchElementByRange, hasAttachmentInRange, hasImageInRange, hasMathformulaInRange, hasTableInRange, hasVideoInRange, insertCodeBlock } from '@/core/function'
6
6
  import { MenuButtonType, MenuDisplayButtonType } from '@/core/tool'
7
7
 
8
8
  /**
@@ -170,11 +170,11 @@ export const CodeBlockMenuButton = defineComponent(
170
170
  tooltip: props.tooltip,
171
171
  color: props.color,
172
172
  zIndex: props.zIndex,
173
- title: $editTrans('inserCodeBlock'),
173
+ title: `${$editTrans('inserCodeBlock')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
174
174
  leftBorder: props.config.leftBorder,
175
175
  rightBorder: props.config.rightBorder,
176
176
  active: !!getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'pre' }),
177
- disabled: props.disabled || isSourceView.value || hasTableInRange(editor.value, dataRangeCaches.value) || hasImageInRange(editor.value, dataRangeCaches.value) || hasVideoInRange(editor.value, dataRangeCaches.value) || hasAttachmentInRange(editor.value, dataRangeCaches.value) || hasMathformulaInRange(editor.value, dataRangeCaches.value) || hasPanelInRange(editor.value, dataRangeCaches.value) || props.config.disabled,
177
+ disabled: props.disabled || isSourceView.value || hasTableInRange(editor.value, dataRangeCaches.value) || hasImageInRange(editor.value, dataRangeCaches.value) || hasVideoInRange(editor.value, dataRangeCaches.value) || hasAttachmentInRange(editor.value, dataRangeCaches.value) || hasMathformulaInRange(editor.value, dataRangeCaches.value) || props.config.disabled,
178
178
  onOperate: () => {
179
179
  insertCodeBlock(editor.value, dataRangeCaches.value)
180
180
  editor.value.domRender()
@@ -109,7 +109,7 @@ export const FontFamilyMenuButton = defineComponent(
109
109
  width: props.config.width,
110
110
  maxHeight: props.config.maxHeight
111
111
  },
112
- title: $editTrans('fontFamily'),
112
+ title: `${$editTrans('fontFamily')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
113
113
  leftBorder: props.config.leftBorder,
114
114
  rightBorder: props.config.rightBorder,
115
115
  active: false,
@@ -111,7 +111,7 @@ export const FontSizeMenuButton = defineComponent(
111
111
  width: props.config.width,
112
112
  maxHeight: props.config.maxHeight
113
113
  },
114
- title: $editTrans('fontSize'),
114
+ title: `${$editTrans('fontSize')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
115
115
  leftBorder: props.config.leftBorder,
116
116
  rightBorder: props.config.rightBorder,
117
117
  disabled: props.disabled || isSourceView.value || hasPreInRange(editor.value, dataRangeCaches.value) || props.config.disabled,
@@ -129,7 +129,7 @@ export const ForeColorMenuButton = defineComponent(
129
129
  options: props.config.options
130
130
  },
131
131
  hideScroll: true,
132
- title: $editTrans('foreColor'),
132
+ title: `${$editTrans('foreColor')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
133
133
  leftBorder: props.config.leftBorder,
134
134
  rightBorder: props.config.rightBorder,
135
135
  disabled: props.disabled || isSourceView.value || hasPreInRange(editor.value, dataRangeCaches.value) || props.config.disabled,
@@ -141,6 +141,7 @@ export const ForeColorMenuButton = defineComponent(
141
141
  return h(Colors, {
142
142
  tooltip: props.tooltip,
143
143
  color: props.color,
144
+ zIndex: props.zIndex + 2,
144
145
  value: selectVal.value,
145
146
  data: options,
146
147
  onChange: (val: string) => {
@@ -84,7 +84,7 @@ export const FormatClearMenuButton = defineComponent(
84
84
  tooltip: props.tooltip,
85
85
  color: props.color,
86
86
  zIndex: props.zIndex,
87
- title: $editTrans('formatClear'),
87
+ title: `${$editTrans('formatClear')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
88
88
  leftBorder: props.config.leftBorder,
89
89
  rightBorder: props.config.rightBorder,
90
90
  active: false,
@@ -27,7 +27,7 @@ export const FullScreenMenuButton = defineComponent(
27
27
  tooltip: props.tooltip,
28
28
  color: props.color,
29
29
  zIndex: props.zIndex,
30
- title: $editTrans('fullScreen'),
30
+ title: `${$editTrans('fullScreen')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
31
31
  leftBorder: props.config.leftBorder,
32
32
  rightBorder: props.config.rightBorder,
33
33
  active: isFullScreen.value,
@@ -1,8 +1,8 @@
1
- import { computed, defineComponent, h, inject, PropType, Ref, ref } from 'vue'
1
+ import { computed, defineComponent, h, inject, PropType, Ref } from 'vue'
2
2
  import { AlexElementsRangeType, AlexEditor } from 'alex-editor'
3
3
  import { common as DapCommon } from 'dap-util'
4
4
  import { MenuDisplayButtonType } from '@/core/tool'
5
- import { hasPanelInRange, hasPreInRange, hasTableInRange, setHeading } from '@/core/function'
5
+ import { hasPreInRange, hasTableInRange, setHeading } from '@/core/function'
6
6
  import { Button, ButtonOptionsItemType } from '@/components/button'
7
7
 
8
8
  /**
@@ -10,77 +10,6 @@ import { Button, ButtonOptionsItemType } from '@/components/button'
10
10
  */
11
11
  const FEATURE_NAME = 'heading'
12
12
 
13
- /**
14
- * 工具栏 - 标题
15
- */
16
- export const HeadingToolbarButton = defineComponent(
17
- (props, { expose }) => {
18
- const editor = inject<Ref<AlexEditor>>('editor')!
19
- const dataRangeCaches = inject<Ref<AlexElementsRangeType>>('dataRangeCaches')!
20
- const $editTrans = inject<(key: string) => any>('$editTrans')!
21
-
22
- const btnRef = ref<InstanceType<typeof Button> | null>(null)
23
-
24
- const selectVal = computed<string>(() => {
25
- //显示已设置标题
26
- const findHeadingItem = props.config.options!.find((item: string | number | ButtonOptionsItemType) => {
27
- let val: string | number | ButtonOptionsItemType = item
28
- if (DapCommon.isObject(item)) {
29
- val = (item as ButtonOptionsItemType).value!
30
- }
31
- return dataRangeCaches.value.list.every(el => {
32
- if (el.element.isBlock()) {
33
- return el.element.parsedom == val
34
- }
35
- return el.element.getBlock().parsedom == val
36
- })
37
- })
38
- return findHeadingItem ? (DapCommon.isObject(findHeadingItem) ? ((findHeadingItem as ButtonOptionsItemType).value as string) : (findHeadingItem as string)) : (props.config.defaultValue as string)
39
- })
40
-
41
- expose({
42
- btnRef
43
- })
44
- return () => {
45
- return props.config.show
46
- ? h(Button, {
47
- ref: btnRef,
48
- name: FEATURE_NAME,
49
- type: 'display',
50
- title: $editTrans('heading'),
51
- tooltip: props.tooltip,
52
- color: props.color,
53
- zIndex: props.zIndex,
54
- leftBorder: props.config.leftBorder,
55
- rightBorder: props.config.rightBorder,
56
- active: false,
57
- disabled: props.config.disabled,
58
- displayConfig: {
59
- options: props.config.options,
60
- value: selectVal.value,
61
- width: props.config.width,
62
- maxHeight: props.config.maxHeight
63
- },
64
- onOperate: (_name: string, val: string) => {
65
- setHeading(editor.value, dataRangeCaches.value, $editTrans, val)
66
- editor.value.domRender()
67
- editor.value.rangeRender()
68
- }
69
- })
70
- : null
71
- }
72
- },
73
- {
74
- name: `_${FEATURE_NAME}`,
75
- props: {
76
- color: String,
77
- zIndex: Number,
78
- config: Object as PropType<MenuDisplayButtonType>,
79
- tooltip: Boolean
80
- }
81
- }
82
- )
83
-
84
13
  /**
85
14
  * 菜单栏 - 标题
86
15
  */
@@ -125,13 +54,13 @@ export const HeadingMenuButton = defineComponent(
125
54
  width: props.config.width,
126
55
  maxHeight: props.config.maxHeight
127
56
  },
128
- title: $editTrans('heading'),
57
+ title: `${$editTrans('heading')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
129
58
  leftBorder: props.config.leftBorder,
130
59
  rightBorder: props.config.rightBorder,
131
60
  active: false,
132
- disabled: props.disabled || isSourceView.value || hasPreInRange(editor.value, dataRangeCaches.value) || hasTableInRange(editor.value, dataRangeCaches.value) || hasPanelInRange(editor.value, dataRangeCaches.value) || props.config.disabled,
61
+ disabled: props.disabled || isSourceView.value || hasPreInRange(editor.value, dataRangeCaches.value) || hasTableInRange(editor.value, dataRangeCaches.value) || props.config.disabled,
133
62
  onOperate: (_name: string, val: string) => {
134
- setHeading(editor.value, dataRangeCaches.value, $editTrans, val)
63
+ setHeading(editor.value, dataRangeCaches.value, val)
135
64
  editor.value.domRender()
136
65
  editor.value.rangeRender()
137
66
  }
@@ -163,7 +163,7 @@ export const ImageMenuButton = defineComponent(
163
163
  zIndex: props.zIndex,
164
164
  type: 'select',
165
165
  hideScroll: true,
166
- title: $editTrans('insertImage'),
166
+ title: `${$editTrans('insertImage')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
167
167
  leftBorder: props.config.leftBorder,
168
168
  rightBorder: props.config.rightBorder,
169
169
  active: false,
@@ -30,7 +30,7 @@ export const IndentMenuButton = defineComponent(
30
30
  color: props.color,
31
31
  zIndex: props.zIndex,
32
32
  type: 'select',
33
- title: $editTrans('indent'),
33
+ title: `${$editTrans('indent')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
34
34
  selectConfig: {
35
35
  options: props.config.options,
36
36
  width: props.config.width,
@@ -1,9 +1,9 @@
1
1
  import { defineComponent, h, inject, PropType, Ref } from 'vue'
2
- import { AlexEditor, AlexElement, AlexElementsRangeType } from 'alex-editor'
2
+ import { AlexEditor, AlexElementsRangeType } from 'alex-editor'
3
3
  import { Button } from '@/components/button'
4
4
  import { MenuButtonType } from '@/core/tool'
5
5
  import { Icon } from '@/components/icon'
6
- import { elementToParagraph, hasPanelInRange, hasPreInRange, hasTableInRange, rangeIsInInfoBlock } from '@/core/function'
6
+ import { hasPreInRange, hasTableInRange, insertInfoBlock, rangeIsInInfoBlock } from '@/core/function'
7
7
 
8
8
  /**
9
9
  * feature名称
@@ -29,45 +29,14 @@ export const InfoBlockMenuButton = defineComponent(
29
29
  tooltip: props.tooltip,
30
30
  color: props.color,
31
31
  zIndex: props.zIndex,
32
- title: $editTrans('insertInfoBlock'),
32
+ title: `${$editTrans('insertInfoBlock')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
33
33
  leftBorder: props.config.leftBorder,
34
34
  rightBorder: props.config.rightBorder,
35
35
  active: rangeIsInInfoBlock(editor.value, dataRangeCaches.value),
36
- disabled: props.disabled || isSourceView.value || hasPanelInRange(editor.value, dataRangeCaches.value) || hasTableInRange(editor.value, dataRangeCaches.value) || hasPreInRange(editor.value, dataRangeCaches.value) || props.config.disabled,
36
+ disabled: props.disabled || isSourceView.value || hasTableInRange(editor.value, dataRangeCaches.value) || hasPreInRange(editor.value, dataRangeCaches.value) || props.config.disabled,
37
37
  onOperate: () => {
38
- //是否都在信息块里
39
- const flag = rangeIsInInfoBlock(editor.value, dataRangeCaches.value)
40
- //起点和终点在一起
41
- if (editor.value.range!.anchor.isEqual(editor.value.range!.focus)) {
42
- const block = editor.value.range!.anchor.element.getBlock()
43
- elementToParagraph(block)
44
- if (!flag) {
45
- block.parsedom = 'div'
46
- block.marks = {
47
- 'data-editify-info': 'true'
48
- }
49
- }
50
- }
51
- //起点和终点不在一起
52
- else {
53
- let blocks: AlexElement[] = []
54
- dataRangeCaches.value.list.forEach(item => {
55
- const block = item.element.getBlock()
56
- const exist = blocks.some(el => block.isEqual(el))
57
- if (!exist) {
58
- blocks.push(block)
59
- }
60
- })
61
- blocks.forEach(block => {
62
- elementToParagraph(block)
63
- if (!flag) {
64
- block.parsedom = 'div'
65
- block.marks = {
66
- 'data-editify-info': 'true'
67
- }
68
- }
69
- })
70
- }
38
+ //插入信息块
39
+ insertInfoBlock(editor.value, dataRangeCaches.value)
71
40
  //渲染
72
41
  editor.value.domRender()
73
42
  editor.value.rangeRender()
@@ -97,7 +97,7 @@ export const ItalicMenuButton = defineComponent(
97
97
  tooltip: props.tooltip,
98
98
  color: props.color,
99
99
  zIndex: props.zIndex,
100
- title: $editTrans('italic'),
100
+ title: `${$editTrans('italic')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
101
101
  leftBorder: props.config.leftBorder,
102
102
  rightBorder: props.config.rightBorder,
103
103
  disabled: props.disabled || isSourceView.value || hasPreInRange(editor.value, dataRangeCaches.value) || props.config.disabled,
@@ -1,4 +1,4 @@
1
- import { computed, defineComponent, h, inject, PropType, Ref, ref } from 'vue'
1
+ import { computed, defineComponent, h, inject, PropType, Ref } from 'vue'
2
2
  import { AlexElementsRangeType, AlexEditor } from 'alex-editor'
3
3
  import { common as DapCommon } from 'dap-util'
4
4
  import { MenuDisplayButtonType } from '@/core/tool'
@@ -10,82 +10,6 @@ import { Button, ButtonOptionsItemType } from '@/components/button'
10
10
  */
11
11
  const FEATURE_NAME = 'lineHeight'
12
12
 
13
- /**
14
- * 工具栏 - 行高
15
- */
16
- export const LineHeightToolbarButton = defineComponent(
17
- (props, { expose }) => {
18
- const editor = inject<Ref<AlexEditor>>('editor')!
19
- const dataRangeCaches = inject<Ref<AlexElementsRangeType>>('dataRangeCaches')!
20
- const $editTrans = inject<(key: string) => any>('$editTrans')!
21
-
22
- const btnRef = ref<InstanceType<typeof Button> | null>(null)
23
-
24
- const selectVal = computed<string | number>(() => {
25
- const findHeightItem = props.config.options!.find((item: string | number | ButtonOptionsItemType) => {
26
- let val: string | number | ButtonOptionsItemType = item
27
- if (DapCommon.isObject(item)) {
28
- val = (item as ButtonOptionsItemType).value!
29
- }
30
- return dataRangeCaches.value.list.every(el => {
31
- if (el.element.isBlock() || el.element.isInblock()) {
32
- return el.element.hasStyles() && el.element.styles!['line-height'] == val
33
- }
34
- const block = el.element.getBlock()
35
- const inblock = el.element.getInblock()
36
- if (inblock) {
37
- return inblock.hasStyles() && inblock.styles!['line-height'] == val
38
- }
39
- return block.hasStyles() && block.styles!['line-height'] == val
40
- })
41
- })
42
- return findHeightItem ? (DapCommon.isObject(findHeightItem) ? ((findHeightItem as ButtonOptionsItemType).value as string | number) : (findHeightItem as string | number)) : (props.config.defaultValue as string | number)
43
- })
44
-
45
- expose({
46
- btnRef
47
- })
48
-
49
- return () => {
50
- return props.config.show
51
- ? h(Button, {
52
- ref: btnRef,
53
- name: FEATURE_NAME,
54
- type: 'display',
55
- title: $editTrans('lineHeight'),
56
- tooltip: props.tooltip,
57
- color: props.color,
58
- zIndex: props.zIndex,
59
- leftBorder: props.config.leftBorder,
60
- rightBorder: props.config.rightBorder,
61
- active: false,
62
- disabled: props.config.disabled,
63
- displayConfig: {
64
- options: props.config.options,
65
- value: selectVal.value,
66
- width: props.config.width,
67
- maxHeight: props.config.maxHeight
68
- },
69
- onOperate: (_name: string, val: string) => {
70
- setLineHeight(editor.value, dataRangeCaches.value, val)
71
- editor.value.domRender()
72
- editor.value.rangeRender()
73
- }
74
- })
75
- : null
76
- }
77
- },
78
- {
79
- name: `_${FEATURE_NAME}`,
80
- props: {
81
- color: String,
82
- zIndex: Number,
83
- config: Object as PropType<MenuDisplayButtonType>,
84
- tooltip: Boolean
85
- }
86
- }
87
- )
88
-
89
13
  /**
90
14
  * 菜单栏 - 行高
91
15
  */
@@ -136,7 +60,7 @@ export const LineHeightMenuButton = defineComponent(
136
60
  width: props.config.width,
137
61
  maxHeight: props.config.maxHeight
138
62
  },
139
- title: $editTrans('lineHeight'),
63
+ title: `${$editTrans('lineHeight')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
140
64
  leftBorder: props.config.leftBorder,
141
65
  rightBorder: props.config.rightBorder,
142
66
  disabled: props.disabled || isSourceView.value || hasPreInRange(editor.value, dataRangeCaches.value) || props.config.disabled,
@@ -103,7 +103,7 @@ export const LinkMenuButton = defineComponent(
103
103
  zIndex: props.zIndex,
104
104
  type: 'select',
105
105
  hideScroll: true,
106
- title: $editTrans('insertLink'),
106
+ title: `${$editTrans('insertLink')}${props.config.shortcut?.title ? `【${props.config.shortcut?.title}】` : ''}`,
107
107
  leftBorder: props.config.leftBorder,
108
108
  rightBorder: props.config.rightBorder,
109
109
  active: false,