vue-editify 0.1.47 → 0.1.49

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-editify",
3
- "version": "0.1.47",
3
+ "version": "0.1.49",
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.9",
20
+ "alex-editor": "^1.4.14",
21
21
  "dap-util": "^1.5.4",
22
22
  "highlight.js": "^11.8.0",
23
23
  "katex": "^0.16.10",
@@ -14,7 +14,7 @@ import InsertVideo from '../insertVideo/insertVideo.vue'
14
14
  import InsertTable from '../insertTable/insertTable.vue'
15
15
  import { h, getCurrentInstance, ref, computed, inject, ComponentInternalInstance, Ref, ComputedRef, defineComponent } from 'vue'
16
16
  import { common as DapCommon } from 'dap-util'
17
- import { getRangeText, setHeading, setIndentIncrease, setIndentDecrease, setQuote, setAlign, setList, setTask, setTextStyle, setTextMark, removeTextStyle, removeTextMark, setLineHeight, insertLink, insertImage, insertVideo, insertTable, insertCodeBlock, hasPreInRange, hasTableInRange, hasQuoteInRange, hasLinkInRange, isRangeInQuote, isRangeInList, isRangeInTask, queryTextStyle, queryTextMark, getMatchElementsByRange, hasImageInRange, hasVideoInRange, insertSeparator } from '../../core/function'
17
+ import { getRangeText, setHeading, setIndentIncrease, setIndentDecrease, setQuote, setAlign, setList, setTask, setTextStyle, setTextMark, removeTextStyle, removeTextMark, setLineHeight, insertLink, insertImage, insertVideo, insertTable, insertCodeBlock, hasPreInRange, hasTableInRange, hasLinkInRange, isRangeInQuote, isRangeInList, isRangeInTask, queryTextStyle, queryTextMark, getMatchElementByRange, hasImageInRange, hasVideoInRange, insertSeparator } from '../../core/function'
18
18
  import { MenuProps } from './props'
19
19
  import { MenuModeType, ObjectType, PluginResultType, MenuExtendType, MenuSequenceType, mergeObject } from '../../core/tool'
20
20
  import { AlexEditor, AlexElementsRangeType } from 'alex-editor'
@@ -457,7 +457,7 @@ const handleOperate = (name: string, val: any) => {
457
457
  }
458
458
  //设置对齐方式
459
459
  else if (name == 'align') {
460
- setAlign(editor.value, dataRangeCaches.value, <string>val)
460
+ setAlign(editor.value, dataRangeCaches.value, val as 'left' | 'right' | 'center' | 'justify')
461
461
  editor.value.formatElementStack()
462
462
  editor.value.domRender()
463
463
  editor.value.rangeRender()
@@ -712,22 +712,20 @@ const handleRangeUpdate = () => {
712
712
  const value_hasPreInRange = hasPreInRange(editor.value, dataRangeCaches.value)
713
713
  //选区是否含有表格元素
714
714
  const value_hasTableInRange = hasTableInRange(editor.value, dataRangeCaches.value)
715
- //选区是否含有引用元素
716
- const value_hasQuoteInRange = hasQuoteInRange(editor.value, dataRangeCaches.value)
717
- //选区是否都在引用元素内
718
- const value_isRangeInQuote = isRangeInQuote(editor.value, dataRangeCaches.value)
719
715
  //选区是否含有链接元素
720
716
  const value_hasLinkInRange = hasLinkInRange(editor.value, dataRangeCaches.value)
717
+ //选区是否含有图片
718
+ const value_hasImageInRange = hasImageInRange(editor.value, dataRangeCaches.value)
719
+ //选区是否含有视频
720
+ const value_hasVideoInRange = hasVideoInRange(editor.value, dataRangeCaches.value)
721
+ //选区是否都在引用元素内
722
+ const value_isRangeInQuote = isRangeInQuote(editor.value, dataRangeCaches.value)
721
723
  //选区是否都在有序列表内
722
724
  const value_isRangeInOrderList = isRangeInList(editor.value, dataRangeCaches.value, true)
723
725
  //选区是否都在无序列表内
724
726
  const value_isRangeInUnorderList = isRangeInList(editor.value, dataRangeCaches.value, false)
725
727
  //选区是否都在任务列表内
726
728
  const value_isRangeInTask = isRangeInTask(editor.value, dataRangeCaches.value)
727
- //选区是否含有图片
728
- const value_hasImageInRange = hasImageInRange(editor.value, dataRangeCaches.value)
729
- //选区是否含有视频
730
- const value_hasVideoInRange = hasVideoInRange(editor.value, dataRangeCaches.value)
731
729
  //额外禁用判定
732
730
  const extraDisabled = (name: string) => {
733
731
  //对插件列表的menu的extraDisabled配置进行处理,获取最终是否禁用的结果
@@ -784,6 +782,9 @@ const handleRangeUpdate = () => {
784
782
  //引用按钮禁用
785
783
  quoteConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || extraDisabled('quote')
786
784
 
785
+ //分隔线按钮禁用
786
+ separatorConfig.value.disabled = value_hasPreInRange || extraDisabled('separator')
787
+
787
788
  //对齐方式按钮禁用
788
789
  alignConfig.value.disabled = value_hasPreInRange || extraDisabled('align')
789
790
 
@@ -920,12 +921,12 @@ const handleRangeUpdate = () => {
920
921
  videoConfig.value.disabled = value_hasPreInRange || extraDisabled('video')
921
922
 
922
923
  //表格按钮禁用
923
- tableConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || value_hasQuoteInRange || extraDisabled('table')
924
+ tableConfig.value.disabled = value_hasPreInRange || value_hasTableInRange || extraDisabled('table')
924
925
 
925
926
  //代码块按钮激活
926
- codeBlockConfig.value.active = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'pre' }).length == 1
927
+ codeBlockConfig.value.active = !!getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'pre' })
927
928
  //代码块按钮禁用
928
- codeBlockConfig.value.disabled = value_hasTableInRange || value_hasQuoteInRange || value_hasImageInRange || value_hasVideoInRange || extraDisabled('codeBlock')
929
+ codeBlockConfig.value.disabled = value_hasTableInRange || value_hasImageInRange || value_hasVideoInRange || extraDisabled('codeBlock')
929
930
 
930
931
  //代码视图按钮激活
931
932
  sourceViewConfig.value.active = isSourceView.value
@@ -215,9 +215,9 @@ import Button from '../button/button.vue'
215
215
  import Icon from '../icon/icon.vue'
216
216
  import Checkbox from '../checkbox/checkbox.vue'
217
217
  import Colors from '../colors/colors.vue'
218
- import { AlexEditor, AlexElement, AlexElementsRangeType } from 'alex-editor'
218
+ import { AlexEditor, AlexElement, AlexElementCreateConfigType, AlexElementsRangeType } from 'alex-editor'
219
219
  import { common as DapCommon } from 'dap-util'
220
- import { getCellSpanNumber, getTableSize, getMatchElementsByRange, removeTextStyle, removeTextMark, setTextStyle, setLineHeight, setTextMark, setList, setTask, setHeading, setAlign, isRangeInList, isRangeInTask, queryTextStyle, queryTextMark, getMatchElementByElement, getCellMergeElement, setTableCellMerged } from '../../core/function'
220
+ import { getCellSpanNumber, getTableSize, getMatchElementByRange, removeTextStyle, removeTextMark, setTextStyle, setLineHeight, setTextMark, setList, setTask, setHeading, setAlign, isRangeInList, isRangeInTask, queryTextStyle, queryTextMark, getMatchElementByElement, getCellMergeElement, setTableCellMerged } from '../../core/function'
221
221
  import { ToolbarProps } from './props'
222
222
  import { Ref, computed, inject, ref } from 'vue'
223
223
  import { ObjectType } from '../../core/tool'
@@ -800,7 +800,7 @@ const _setHeading = (_name: string, value: string) => {
800
800
  }
801
801
  //设置对齐方式
802
802
  const _setAlign = (_name: string, value: string) => {
803
- setAlign(editor.value, dataRangeCaches.value, value)
803
+ setAlign(editor.value, dataRangeCaches.value, value as 'left' | 'right' | 'center' | 'justify')
804
804
  editor.value.formatElementStack()
805
805
  editor.value.domRender()
806
806
  editor.value.rangeRender()
@@ -847,13 +847,13 @@ const modifyLink = () => {
847
847
  if (!linkConfig.value.url) {
848
848
  return
849
849
  }
850
- const links = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'a' })
851
- if (links.length == 1) {
852
- links[0].marks!.href = linkConfig.value.url
850
+ const link = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'a' })
851
+ if (link) {
852
+ link.marks!.href = linkConfig.value.url
853
853
  if (linkConfig.value.newOpen) {
854
- links[0].marks!.target = '_blank'
854
+ link.marks!.target = '_blank'
855
855
  } else {
856
- delete links[0].marks!.target
856
+ delete link.marks!.target
857
857
  }
858
858
  editor.value.formatElementStack()
859
859
  editor.value.domRender()
@@ -861,12 +861,12 @@ const modifyLink = () => {
861
861
  }
862
862
  //移除链接
863
863
  const removeLink = () => {
864
- const links = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'a' })
865
- if (links.length == 1) {
866
- links[0].parsedom = AlexElement.TEXT_NODE
867
- delete links[0].marks!['target']
868
- delete links[0].marks!['href']
869
- delete links[0].marks!['data-editify-element']
864
+ const link = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'a' })
865
+ if (link) {
866
+ link.parsedom = AlexElement.TEXT_NODE
867
+ delete link.marks!['target']
868
+ delete link.marks!['href']
869
+ delete link.marks!['data-editify-element']
870
870
  editor.value.formatElementStack()
871
871
  editor.value.domRender()
872
872
  editor.value.rangeRender()
@@ -874,9 +874,9 @@ const removeLink = () => {
874
874
  }
875
875
  //选择代码语言
876
876
  const selectLanguage = (_name: string, value: string) => {
877
- const pres = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'pre' })
878
- if (pres.length == 1) {
879
- Object.assign(pres[0].marks!, {
877
+ const pre = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'pre' })
878
+ if (pre) {
879
+ Object.assign(pre.marks!, {
880
880
  'data-editify-hljs': value
881
881
  })
882
882
  editor.value.formatElementStack()
@@ -890,15 +890,22 @@ const insertParagraphWithPre = (type: string | undefined = 'up') => {
890
890
  editor.value.range!.anchor.element = editor.value.range!.focus.element
891
891
  editor.value.range!.anchor.offset = editor.value.range!.focus.offset
892
892
  }
893
- const pres = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'pre' })
894
- if (pres.length == 1) {
895
- const paragraph = new AlexElement('block', AlexElement.BLOCK_NODE, null, null, null)
896
- const breakEl = new AlexElement('closed', 'br', null, null, null)
897
- editor.value.addElementTo(breakEl, paragraph)
893
+ const pre = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'pre' })
894
+ if (pre) {
895
+ const paragraph = AlexElement.create({
896
+ type: 'block',
897
+ parsedom: AlexElement.BLOCK_NODE,
898
+ children: [
899
+ {
900
+ type: 'closed',
901
+ parsedom: 'br'
902
+ }
903
+ ]
904
+ })
898
905
  if (type == 'up') {
899
- editor.value.addElementBefore(paragraph, pres[0])
906
+ editor.value.addElementBefore(paragraph, pre)
900
907
  } else {
901
- editor.value.addElementAfter(paragraph, pres[0])
908
+ editor.value.addElementAfter(paragraph, pre)
902
909
  }
903
910
  editor.value.range!.anchor.moveToEnd(paragraph)
904
911
  editor.value.range!.focus.moveToEnd(paragraph)
@@ -913,20 +920,27 @@ const insertTableColumn = (type: string | undefined = 'left') => {
913
920
  editor.value.range!.anchor.element = editor.value.range!.focus.element
914
921
  editor.value.range!.anchor.offset = editor.value.range!.focus.offset
915
922
  }
916
- const columns = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'td' })
917
- if (columns.length == 1) {
918
- const row = columns[0].parent!
923
+ const column = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'td' })
924
+ if (column) {
925
+ const row = column.parent!
919
926
  const tbody = row.parent!
920
927
  const table = tbody.parent!
921
928
  const rows = tbody.children
922
929
  const index = row.children!.findIndex(item => {
923
- return item.isEqual(columns[0])
930
+ return item.isEqual(column)
924
931
  })
925
932
  //插入列
926
933
  rows!.forEach(item => {
927
- const newColumn = new AlexElement('inblock', 'td', null, null, null)
928
- const breakEl = new AlexElement('closed', 'br', null, null, null)
929
- editor.value.addElementTo(breakEl, newColumn)
934
+ const newColumn = AlexElement.create({
935
+ type: 'inblock',
936
+ parsedom: 'td',
937
+ children: [
938
+ {
939
+ type: 'closed',
940
+ parsedom: 'br'
941
+ }
942
+ ]
943
+ })
930
944
  if (type == 'left') {
931
945
  editor.value.addElementTo(newColumn, item, index)
932
946
  } else {
@@ -937,18 +951,21 @@ const insertTableColumn = (type: string | undefined = 'left') => {
937
951
  const colgroup = table.children!.find(item => {
938
952
  return item.parsedom == 'colgroup'
939
953
  })!
940
- const col = new AlexElement('closed', 'col', null, null, null)
954
+ const col = AlexElement.create({
955
+ type: 'closed',
956
+ parsedom: 'col'
957
+ })
941
958
  if (type == 'left') {
942
959
  editor.value.addElementTo(col, colgroup, index)
943
960
  } else {
944
961
  editor.value.addElementTo(col, colgroup, index + 1)
945
962
  }
946
963
  if (type == 'left') {
947
- const previousColumn = editor.value.getPreviousElement(columns[0])!
964
+ const previousColumn = editor.value.getPreviousElement(column)!
948
965
  editor.value.range!.anchor.moveToStart(previousColumn)
949
966
  editor.value.range!.focus.moveToStart(previousColumn)
950
967
  } else {
951
- const nextColumn = editor.value.getNextElement(columns[0])!
968
+ const nextColumn = editor.value.getNextElement(column)!
952
969
  editor.value.range!.anchor.moveToStart(nextColumn)
953
970
  editor.value.range!.focus.moveToStart(nextColumn)
954
971
  }
@@ -964,21 +981,32 @@ const insertTableRow = (type: string | undefined = 'up') => {
964
981
  editor.value.range!.anchor.element = editor.value.range!.focus.element
965
982
  editor.value.range!.anchor.offset = editor.value.range!.focus.offset
966
983
  }
967
- const rows = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'tr' })
968
- if (rows.length == 1) {
969
- const tbody = rows[0].parent!
984
+ const row = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'tr' })
985
+ if (row) {
986
+ const tbody = row.parent!
970
987
  const { columnNumber } = getTableSize(tbody.children!)
971
- const newRow = new AlexElement('inblock', 'tr', null, null, null)
988
+ const children: AlexElementCreateConfigType[] = []
972
989
  for (let i = 0; i < columnNumber; i++) {
973
- const column = new AlexElement('inblock', 'td', null, null, null)
974
- const breakEl = new AlexElement('closed', 'br', null, null, null)
975
- editor.value.addElementTo(breakEl, column)
976
- editor.value.addElementTo(column, newRow)
990
+ children.push({
991
+ type: 'inblock',
992
+ parsedom: 'td',
993
+ children: [
994
+ {
995
+ type: 'closed',
996
+ parsedom: 'br'
997
+ }
998
+ ]
999
+ })
977
1000
  }
1001
+ const newRow = AlexElement.create({
1002
+ type: 'inblock',
1003
+ parsedom: 'tr',
1004
+ children
1005
+ })
978
1006
  if (type == 'up') {
979
- editor.value.addElementBefore(newRow, rows[0])
1007
+ editor.value.addElementBefore(newRow, row)
980
1008
  } else {
981
- editor.value.addElementAfter(newRow, rows[0])
1009
+ editor.value.addElementAfter(newRow, row)
982
1010
  }
983
1011
  //重置光标
984
1012
  editor.value.range!.anchor.moveToStart(newRow)
@@ -995,15 +1023,22 @@ const insertTableRow = (type: string | undefined = 'up') => {
995
1023
  }
996
1024
  //表格前后插入段落
997
1025
  const insertParagraphWithTable = (type: string | undefined = 'up') => {
998
- const tables = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'table' })
999
- if (tables.length == 1) {
1000
- const paragraph = new AlexElement('block', AlexElement.BLOCK_NODE, null, null, null)
1001
- const breakEl = new AlexElement('closed', 'br', null, null, null)
1002
- editor.value.addElementTo(breakEl, paragraph)
1026
+ const table = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'table' })
1027
+ if (table) {
1028
+ const paragraph = AlexElement.create({
1029
+ type: 'block',
1030
+ parsedom: AlexElement.BLOCK_NODE,
1031
+ children: [
1032
+ {
1033
+ type: 'closed',
1034
+ parsedom: 'br'
1035
+ }
1036
+ ]
1037
+ })
1003
1038
  if (type == 'up') {
1004
- editor.value.addElementBefore(paragraph, tables[0])
1039
+ editor.value.addElementBefore(paragraph, table)
1005
1040
  } else {
1006
- editor.value.addElementAfter(paragraph, tables[0])
1041
+ editor.value.addElementAfter(paragraph, table)
1007
1042
  }
1008
1043
  editor.value.range!.anchor.moveToEnd(paragraph)
1009
1044
  editor.value.range!.focus.moveToEnd(paragraph)
@@ -1014,9 +1049,9 @@ const insertParagraphWithTable = (type: string | undefined = 'up') => {
1014
1049
  }
1015
1050
  //删除元素
1016
1051
  const deleteElement = (parsedom: string) => {
1017
- const elements = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom })
1018
- if (elements.length == 1) {
1019
- elements[0].toEmpty()
1052
+ const element = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom })
1053
+ if (element) {
1054
+ element.toEmpty()
1020
1055
  editor.value.formatElementStack()
1021
1056
  editor.value.domRender()
1022
1057
  editor.value.rangeRender()
@@ -1028,10 +1063,10 @@ const deleteTableRow = () => {
1028
1063
  editor.value.range!.anchor.element = editor.value.range!.focus.element
1029
1064
  editor.value.range!.anchor.offset = editor.value.range!.focus.offset
1030
1065
  }
1031
- const columns = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'td' })
1032
- if (columns.length == 1) {
1066
+ const column = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'td' })
1067
+ if (column) {
1033
1068
  //光标所在行
1034
- const row = columns[0].parent!
1069
+ const row = column.parent!
1035
1070
  //如果只有一行则删除表格
1036
1071
  if (row.parent!.children!.length == 1) {
1037
1072
  deleteElement('table')
@@ -1039,7 +1074,7 @@ const deleteTableRow = () => {
1039
1074
  }
1040
1075
  //光标所在的单元格在行中的序列
1041
1076
  const index = row.children!.findIndex(item => {
1042
- return item.isEqual(columns[0])
1077
+ return item.isEqual(column)
1043
1078
  })
1044
1079
  //上一行
1045
1080
  const previousRow = editor.value.getPreviousElement(row)
@@ -1103,10 +1138,10 @@ const deleteTableColumn = () => {
1103
1138
  editor.value.range!.anchor.element = editor.value.range!.focus.element
1104
1139
  editor.value.range!.anchor.offset = editor.value.range!.focus.offset
1105
1140
  }
1106
- const columns = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'td' })
1107
- if (columns.length == 1) {
1141
+ const column = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'td' })
1142
+ if (column) {
1108
1143
  //光标所在行
1109
- const row = columns[0].parent!
1144
+ const row = column.parent!
1110
1145
  //所有的行元素
1111
1146
  const rows = row.parent!.children!
1112
1147
  //表格元素
@@ -1118,12 +1153,12 @@ const deleteTableColumn = () => {
1118
1153
  }
1119
1154
  //光标所在的单元格在行中的序列
1120
1155
  const index = row.children!.findIndex(item => {
1121
- return item.isEqual(columns[0])
1156
+ return item.isEqual(column)
1122
1157
  })
1123
1158
  //前一个单元格
1124
- const previousColumn = editor.value.getPreviousElement(columns[0])
1159
+ const previousColumn = editor.value.getPreviousElement(column)
1125
1160
  //后一个单元格
1126
- const nextColumn = editor.value.getNextElement(columns[0])
1161
+ const nextColumn = editor.value.getNextElement(column)
1127
1162
  //遍历所有的行元素
1128
1163
  rows.forEach(item => {
1129
1164
  //对应序列的单元格
@@ -1185,14 +1220,14 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1185
1220
  editor.value.range!.anchor.element = editor.value.range!.focus.element
1186
1221
  editor.value.range!.anchor.offset = editor.value.range!.focus.offset
1187
1222
  }
1188
- const columns = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'td' })
1189
- if (columns.length == 1) {
1223
+ const column = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'td' })
1224
+ if (column) {
1190
1225
  //向左合并单元格
1191
1226
  if (type == 'left') {
1192
1227
  //当前单元格所占行数和列数
1193
- const cellSpanNum = getCellSpanNumber(columns[0])
1228
+ const cellSpanNum = getCellSpanNumber(column)
1194
1229
  //获取左侧单元格
1195
- const previousColumn = editor.value.getPreviousElement(columns[0])
1230
+ const previousColumn = editor.value.getPreviousElement(column)
1196
1231
  //如果左侧单元格存在
1197
1232
  if (previousColumn) {
1198
1233
  //左侧单元格是隐藏的单元格
@@ -1205,11 +1240,11 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1205
1240
  //进行合并
1206
1241
  if (rowspan == cellSpanNum.rowspan) {
1207
1242
  crossColumnElement.marks!['colspan'] = colspan + cellSpanNum.colspan
1208
- columns[0].children!.forEach(item => {
1243
+ column.children!.forEach(item => {
1209
1244
  crossColumnElement.children!.push(item)
1210
1245
  item.parent = crossColumnElement
1211
1246
  })
1212
- setTableCellMerged(columns[0])
1247
+ setTableCellMerged(column)
1213
1248
  editor.value.range!.anchor.moveToEnd(crossColumnElement)
1214
1249
  editor.value.range!.focus.moveToEnd(crossColumnElement)
1215
1250
  editor.value.formatElementStack()
@@ -1231,11 +1266,11 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1231
1266
  colspan: colspan + cellSpanNum.colspan
1232
1267
  }
1233
1268
  }
1234
- columns[0].children!.forEach(item => {
1269
+ column.children!.forEach(item => {
1235
1270
  previousColumn.children!.push(item)
1236
1271
  item.parent = previousColumn
1237
1272
  })
1238
- setTableCellMerged(columns[0])
1273
+ setTableCellMerged(column)
1239
1274
  editor.value.range!.anchor.moveToEnd(previousColumn)
1240
1275
  editor.value.range!.focus.moveToEnd(previousColumn)
1241
1276
  editor.value.formatElementStack()
@@ -1248,9 +1283,9 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1248
1283
  //向右合并单元格
1249
1284
  else if (type == 'right') {
1250
1285
  //当前单元格所占行数和列数
1251
- const cellSpanNum = getCellSpanNumber(columns[0])
1286
+ const cellSpanNum = getCellSpanNumber(column)
1252
1287
  //获取右侧的单元格
1253
- let nextColumn = editor.value.getNextElement(columns[0])
1288
+ let nextColumn = editor.value.getNextElement(column)
1254
1289
  //如果右侧单元格存在
1255
1290
  while (nextColumn) {
1256
1291
  //右侧单元格是隐藏的单元格
@@ -1272,20 +1307,20 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1272
1307
  const { rowspan, colspan } = getCellSpanNumber(nextColumn)
1273
1308
  //如果一致则可以合并
1274
1309
  if (rowspan == cellSpanNum.rowspan) {
1275
- if (columns[0].hasMarks()) {
1276
- columns[0].marks!['colspan'] = cellSpanNum.colspan + colspan
1310
+ if (column.hasMarks()) {
1311
+ column.marks!['colspan'] = cellSpanNum.colspan + colspan
1277
1312
  } else {
1278
- columns[0].marks = {
1313
+ column.marks = {
1279
1314
  colspan: cellSpanNum.colspan + colspan
1280
1315
  }
1281
1316
  }
1282
1317
  nextColumn.children!.forEach(item => {
1283
- columns[0].children!.push(item)
1284
- item.parent = columns[0]
1318
+ column.children!.push(item)
1319
+ item.parent = column
1285
1320
  })
1286
1321
  setTableCellMerged(nextColumn)
1287
- editor.value.range!.anchor.moveToEnd(columns[0])
1288
- editor.value.range!.focus.moveToEnd(columns[0])
1322
+ editor.value.range!.anchor.moveToEnd(column)
1323
+ editor.value.range!.focus.moveToEnd(column)
1289
1324
  editor.value.formatElementStack()
1290
1325
  editor.value.domRender()
1291
1326
  editor.value.rangeRender()
@@ -1298,11 +1333,11 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1298
1333
  //向上合并单元格
1299
1334
  else if (type == 'up') {
1300
1335
  //当前单元格所占行数和列数
1301
- const cellSpanNum = getCellSpanNumber(columns[0])
1336
+ const cellSpanNum = getCellSpanNumber(column)
1302
1337
  //获取单元格在行中的序列
1303
- const index = columns[0].parent!.children!.findIndex(item => item.isEqual(columns[0]))
1338
+ const index = column.parent!.children!.findIndex(item => item.isEqual(column))
1304
1339
  //获取上一行
1305
- const previousRow = editor.value.getPreviousElement(columns[0].parent!)
1340
+ const previousRow = editor.value.getPreviousElement(column.parent!)
1306
1341
  //如果上一行存在
1307
1342
  if (previousRow) {
1308
1343
  //获取上一行中对应序列的单元格
@@ -1317,11 +1352,11 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1317
1352
  //进行合并
1318
1353
  if (colspan == cellSpanNum.colspan) {
1319
1354
  crossRowElement.marks!['rowspan'] = rowspan + cellSpanNum.rowspan
1320
- columns[0].children!.forEach(item => {
1355
+ column.children!.forEach(item => {
1321
1356
  crossRowElement.children!.push(item)
1322
1357
  item.parent = crossRowElement
1323
1358
  })
1324
- setTableCellMerged(columns[0])
1359
+ setTableCellMerged(column)
1325
1360
  editor.value.range!.anchor.moveToEnd(crossRowElement)
1326
1361
  editor.value.range!.focus.moveToEnd(crossRowElement)
1327
1362
  editor.value.formatElementStack()
@@ -1343,11 +1378,11 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1343
1378
  rowspan: rowspan + cellSpanNum.rowspan
1344
1379
  }
1345
1380
  }
1346
- columns[0].children!.forEach(item => {
1381
+ column.children!.forEach(item => {
1347
1382
  previousColumn.children!.push(item)
1348
1383
  item.parent = previousColumn
1349
1384
  })
1350
- setTableCellMerged(columns[0])
1385
+ setTableCellMerged(column)
1351
1386
  editor.value.range!.anchor.moveToEnd(previousColumn)
1352
1387
  editor.value.range!.focus.moveToEnd(previousColumn)
1353
1388
  editor.value.formatElementStack()
@@ -1360,11 +1395,11 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1360
1395
  //向下合并单元格
1361
1396
  else if (type == 'down') {
1362
1397
  //当前单元格所占行数和列数
1363
- const cellSpanNum = getCellSpanNumber(columns[0])
1398
+ const cellSpanNum = getCellSpanNumber(column)
1364
1399
  //获取单元格在行中的序列
1365
- const index = columns[0].parent!.children!.findIndex(item => item.isEqual(columns[0]))
1400
+ const index = column.parent!.children!.findIndex(item => item.isEqual(column))
1366
1401
  //获取下一行
1367
- let nextRow = editor.value.getNextElement(columns[0].parent!)
1402
+ let nextRow = editor.value.getNextElement(column.parent!)
1368
1403
  //如果下一行存在
1369
1404
  while (nextRow) {
1370
1405
  //获取下一行中对应序列的单元格
@@ -1388,20 +1423,20 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1388
1423
  const { rowspan, colspan } = getCellSpanNumber(nextColumn)
1389
1424
  //如果一致则可以合并
1390
1425
  if (colspan == cellSpanNum.colspan) {
1391
- if (columns[0].hasMarks()) {
1392
- columns[0].marks!['rowspan'] = cellSpanNum.rowspan + rowspan
1426
+ if (column.hasMarks()) {
1427
+ column.marks!['rowspan'] = cellSpanNum.rowspan + rowspan
1393
1428
  } else {
1394
- columns[0].marks = {
1429
+ column.marks = {
1395
1430
  rowspan: cellSpanNum.rowspan + rowspan
1396
1431
  }
1397
1432
  }
1398
1433
  nextColumn.children!.forEach(item => {
1399
- columns[0].children!.push(item)
1400
- item.parent = columns[0]
1434
+ column.children!.push(item)
1435
+ item.parent = column
1401
1436
  })
1402
1437
  setTableCellMerged(nextColumn)
1403
- editor.value.range!.anchor.moveToEnd(columns[0])
1404
- editor.value.range!.focus.moveToEnd(columns[0])
1438
+ editor.value.range!.anchor.moveToEnd(column)
1439
+ editor.value.range!.focus.moveToEnd(column)
1405
1440
  editor.value.formatElementStack()
1406
1441
  editor.value.domRender()
1407
1442
  editor.value.rangeRender()
@@ -1417,29 +1452,29 @@ const mergeCells = (type: 'left' | 'right' | 'up' | 'down') => {
1417
1452
  const layerShow = () => {
1418
1453
  //链接初始化展示
1419
1454
  if (props.type == 'link') {
1420
- const links = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'a' })
1421
- if (links.length == 1) {
1422
- linkConfig.value.url = links[0].marks!['href']
1423
- linkConfig.value.newOpen = links[0].marks!['target'] == '_blank'
1455
+ const link = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'a' })
1456
+ if (link) {
1457
+ linkConfig.value.url = link.marks!['href']
1458
+ linkConfig.value.newOpen = link.marks!['target'] == '_blank'
1424
1459
  }
1425
1460
  }
1426
1461
  //视频初始化显示
1427
1462
  else if (props.type == 'video') {
1428
- const videos = getMatchElementsByRange(editor.value, dataRangeCaches.value, { parsedom: 'video' })
1429
- if (videos.length == 1) {
1430
- videoConfig.value.autoplay = !!videos[0].marks!['autoplay']
1431
- videoConfig.value.loop = !!videos[0].marks!['loop']
1432
- videoConfig.value.controls = !!videos[0].marks!['controls']
1433
- videoConfig.value.muted = !!videos[0].marks!['muted']
1463
+ const video = getMatchElementByRange(editor.value, dataRangeCaches.value, { parsedom: 'video' })
1464
+ if (video) {
1465
+ videoConfig.value.autoplay = !!video.marks!['autoplay']
1466
+ videoConfig.value.loop = !!video.marks!['loop']
1467
+ videoConfig.value.controls = !!video.marks!['controls']
1468
+ videoConfig.value.muted = !!video.marks!['muted']
1434
1469
  }
1435
1470
  }
1436
1471
  //代码块初始化展示设置
1437
1472
  else if (props.type == 'codeBlock') {
1438
- const pres = getMatchElementsByRange(editor.value, dataRangeCaches.value, {
1473
+ const pre = getMatchElementByRange(editor.value, dataRangeCaches.value, {
1439
1474
  parsedom: 'pre'
1440
1475
  })
1441
- if (pres.length == 1) {
1442
- languageConfig.value.displayConfig.value = pres[0].marks!['data-editify-hljs'] || ''
1476
+ if (pre) {
1477
+ languageConfig.value.displayConfig.value = pre.marks!['data-editify-hljs'] || ''
1443
1478
  }
1444
1479
  }
1445
1480
  //文本工具条初始化显示