vue-editify 0.2.16 → 0.2.18

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 (60) hide show
  1. package/examples/App.vue +289 -5
  2. package/lib/components/colors/colors.vue.d.ts +9 -0
  3. package/lib/components/colors/props.d.ts +4 -0
  4. package/lib/core/function.d.ts +120 -45
  5. package/lib/core/rule.d.ts +23 -17
  6. package/lib/core/tool.d.ts +1 -13
  7. package/lib/editify/editify.vue.d.ts +10 -1
  8. package/lib/editify/props.d.ts +1 -1
  9. package/lib/editify/toolbar/props.d.ts +1 -1
  10. package/lib/editify/toolbar/toolbar.vue.d.ts +3 -3
  11. package/lib/editify.es.js +13640 -13799
  12. package/lib/editify.umd.js +2 -2
  13. package/lib/feature/align.d.ts +0 -14
  14. package/lib/feature/heading.d.ts +0 -14
  15. package/lib/feature/lineHeight.d.ts +0 -14
  16. package/lib/feature/orderList.d.ts +1 -3
  17. package/lib/feature/task.d.ts +0 -14
  18. package/lib/feature/unorderList.d.ts +1 -3
  19. package/lib/index.d.ts +12 -3
  20. package/package.json +2 -2
  21. package/src/components/button/button.vue +3 -3
  22. package/src/components/checkbox/checkbox.vue +1 -1
  23. package/src/components/colors/colors.vue +4 -4
  24. package/src/components/colors/props.ts +6 -1
  25. package/src/components/insertAttachment/insertAttachment.vue +1 -1
  26. package/src/components/insertImage/insertImage.vue +1 -1
  27. package/src/components/insertLink/insertLink.vue +1 -1
  28. package/src/components/insertVideo/insertVideo.vue +1 -1
  29. package/src/components/layer/layer.vue +9 -3
  30. package/src/components/tooltip/tooltip.vue +1 -1
  31. package/src/components/updateLink/updateLink.vue +1 -1
  32. package/src/core/function.ts +961 -475
  33. package/src/core/rule.ts +85 -367
  34. package/src/core/tool.ts +8 -114
  35. package/src/editify/editify.less +88 -14
  36. package/src/editify/editify.vue +117 -65
  37. package/src/editify/props.ts +1 -1
  38. package/src/editify/toolbar/props.ts +2 -2
  39. package/src/editify/toolbar/toolbar.vue +12 -12
  40. package/src/feature/align.ts +1 -61
  41. package/src/feature/attachment.ts +13 -26
  42. package/src/feature/backColor.ts +1 -0
  43. package/src/feature/foreColor.ts +1 -0
  44. package/src/feature/heading.ts +2 -73
  45. package/src/feature/infoBlock.ts +4 -35
  46. package/src/feature/lineHeight.ts +1 -77
  47. package/src/feature/mathformula.ts +3 -50
  48. package/src/feature/orderList.ts +166 -35
  49. package/src/feature/panel.ts +4 -49
  50. package/src/feature/sub.ts +1 -1
  51. package/src/feature/super.ts +1 -1
  52. package/src/feature/task.ts +1 -55
  53. package/src/feature/unorderList.ts +106 -35
  54. package/src/feature/video.ts +1 -1
  55. package/src/icon/iconfont.css +40 -0
  56. package/src/icon/iconfont.ttf +0 -0
  57. package/src/icon/iconfont.woff +0 -0
  58. package/src/index.ts +14 -8
  59. package/src/locale/en_US.ts +112 -110
  60. package/src/locale/zh_CN.ts +11 -9
@@ -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
  */
@@ -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
 
@@ -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
  }
@@ -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) => {
@@ -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) => {
@@ -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,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
  */
@@ -131,7 +60,7 @@ export const HeadingMenuButton = defineComponent(
131
60
  active: false,
132
61
  disabled: props.disabled || isSourceView.value || hasPreInRange(editor.value, dataRangeCaches.value) || hasTableInRange(editor.value, dataRangeCaches.value) || hasPanelInRange(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
  }
@@ -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 { hasPanelInRange, hasPreInRange, hasTableInRange, insertInfoBlock, rangeIsInInfoBlock } from '@/core/function'
7
7
 
8
8
  /**
9
9
  * feature名称
@@ -35,39 +35,8 @@ export const InfoBlockMenuButton = defineComponent(
35
35
  active: rangeIsInInfoBlock(editor.value, dataRangeCaches.value),
36
36
  disabled: props.disabled || isSourceView.value || hasPanelInRange(editor.value, dataRangeCaches.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()
@@ -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
  */
@@ -1,10 +1,8 @@
1
1
  import { computed, defineComponent, h, inject, PropType, ref, Ref } from 'vue'
2
2
  import { AlexEditor, AlexElementsRangeType } from 'alex-editor'
3
- import 'katex/dist/katex.css'
4
- import KaTex from 'katex'
5
3
  import { MenuMathformulaButtonType } from '@/core/tool'
6
4
  import { Button } from '@/components/button'
7
- import { getMatchElementByRange, hasLinkInRange, hasPreInRange } from '@/core/function'
5
+ import { getMatchElementByRange, hasLinkInRange, hasPreInRange, insertMathformula } from '@/core/function'
8
6
  import { Icon } from '@/components/icon'
9
7
  import { InsertMathformula } from '@/components/insertMathformula'
10
8
 
@@ -77,53 +75,8 @@ export const MathformulaMenuButton = defineComponent(
77
75
  color: props.color,
78
76
  defaultLaTexContent: defaultLaTexContent.value,
79
77
  onInsert: (content: string) => {
80
- //如果公式文本框有内容则进行下一步处理
81
- if (content) {
82
- //获取选区所在的数学公式元素
83
- const mathformulaElement = getMatchElementByRange(editor.value, dataRangeCaches.value, {
84
- parsedom: 'span',
85
- marks: {
86
- 'data-editify-mathformula': true
87
- }
88
- })
89
- //如果在数学公式下
90
- if (mathformulaElement) {
91
- //清除该数学公式
92
- mathformulaElement.toEmpty()
93
- //移动光标到后一个元素上
94
- editor.value.range!.anchor.moveToStart(editor.value.getNextElement(mathformulaElement)!)
95
- editor.value.range!.focus.moveToStart(editor.value.getNextElement(mathformulaElement)!)
96
- }
97
- //定义转换后的mathml内容
98
- let mathml: string = ''
99
- try {
100
- //获取转换后的mathml
101
- mathml = KaTex.renderToString(content, {
102
- output: 'mathml',
103
- throwOnError: true
104
- })
105
- } catch (error) {
106
- mathml = ''
107
- if (typeof props.config!.handleError == 'function') {
108
- props.config!.handleError(error as Error)
109
- }
110
- }
111
- //如果mathml存在则表示数学公式渲染成功则插入到编辑器
112
- if (mathml) {
113
- //设置最终的html内容
114
- const html = `<span data-editify-mathformula="${content}" contenteditable="false">${mathml}</span>`
115
- //html内容转为元素数组
116
- const elements = editor.value.parseHtml(html)
117
- //插入编辑器
118
- editor.value.insertElement(elements[0])
119
- //移动光标到新插入的元素
120
- editor.value.range!.anchor.moveToEnd(elements[0])
121
- editor.value.range!.focus.moveToEnd(elements[0])
122
- //渲染
123
- editor.value.domRender()
124
- editor.value.rangeRender()
125
- }
126
- }
78
+ //插入数学公式
79
+ insertMathformula(editor.value, dataRangeCaches.value, content, props.config.handleError)
127
80
  //关闭浮层
128
81
  btnRef.value!.show = false
129
82
  }