@opentiny/fluent-editor 3.22.0-alpha.0 → 3.23.0

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 (82) hide show
  1. package/README.md +2 -0
  2. package/es/config/editor.config.es.js +9 -3
  3. package/es/config/editor.config.es.js.map +1 -1
  4. package/es/config/i18n/en-us.es.js +47 -26
  5. package/es/config/i18n/en-us.es.js.map +1 -1
  6. package/es/config/i18n/zh-cn.es.js +47 -26
  7. package/es/config/i18n/zh-cn.es.js.map +1 -1
  8. package/es/config/index.es.js +3 -44
  9. package/es/config/index.es.js.map +1 -1
  10. package/es/counter/index.es.js +16 -11
  11. package/es/counter/index.es.js.map +1 -1
  12. package/es/custom-clipboard.es.js +4 -4
  13. package/es/custom-clipboard.es.js.map +1 -1
  14. package/es/fluent-editor.es.js +28 -3
  15. package/es/fluent-editor.es.js.map +1 -1
  16. package/es/fullscreen/handler.es.js +10 -0
  17. package/es/fullscreen/handler.es.js.map +1 -1
  18. package/es/index.es.js +4 -3
  19. package/es/link/modules/tooltip.es.js +22 -5
  20. package/es/link/modules/tooltip.es.js.map +1 -1
  21. package/es/table/modules/table-operation-menu.es.js +213 -203
  22. package/es/table/modules/table-operation-menu.es.js.map +1 -1
  23. package/es/table/modules/table-selection.es.js.map +1 -1
  24. package/es/toolbar/index.es.js +2 -0
  25. package/es/toolbar/index.es.js.map +1 -1
  26. package/es/toolbar/toolbar-tip.es.js +106 -0
  27. package/es/toolbar/toolbar-tip.es.js.map +1 -0
  28. package/es/utils/debounce.es.js +2 -1
  29. package/es/utils/debounce.es.js.map +1 -1
  30. package/es/utils/is.es.js +10 -0
  31. package/es/utils/is.es.js.map +1 -0
  32. package/es/utils/method.es.js +0 -5
  33. package/es/utils/method.es.js.map +1 -1
  34. package/lib/config/editor.config.cjs.js +8 -2
  35. package/lib/config/editor.config.cjs.js.map +1 -1
  36. package/lib/config/i18n/en-us.cjs.js +47 -26
  37. package/lib/config/i18n/en-us.cjs.js.map +1 -1
  38. package/lib/config/i18n/zh-cn.cjs.js +47 -26
  39. package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
  40. package/lib/config/index.cjs.js +3 -43
  41. package/lib/config/index.cjs.js.map +1 -1
  42. package/lib/counter/index.cjs.js +15 -10
  43. package/lib/counter/index.cjs.js.map +1 -1
  44. package/lib/custom-clipboard.cjs.js +3 -3
  45. package/lib/custom-clipboard.cjs.js.map +1 -1
  46. package/lib/fluent-editor.cjs.js +27 -2
  47. package/lib/fluent-editor.cjs.js.map +1 -1
  48. package/lib/fullscreen/handler.cjs.js +10 -0
  49. package/lib/fullscreen/handler.cjs.js.map +1 -1
  50. package/lib/index.cjs.js +2 -1
  51. package/lib/index.cjs.js.map +1 -1
  52. package/lib/link/modules/tooltip.cjs.js +22 -5
  53. package/lib/link/modules/tooltip.cjs.js.map +1 -1
  54. package/lib/table/modules/table-operation-menu.cjs.js +213 -203
  55. package/lib/table/modules/table-operation-menu.cjs.js.map +1 -1
  56. package/lib/table/modules/table-selection.cjs.js.map +1 -1
  57. package/lib/toolbar/index.cjs.js +2 -0
  58. package/lib/toolbar/index.cjs.js.map +1 -1
  59. package/lib/toolbar/toolbar-tip.cjs.js +106 -0
  60. package/lib/toolbar/toolbar-tip.cjs.js.map +1 -0
  61. package/lib/utils/debounce.cjs.js +2 -1
  62. package/lib/utils/debounce.cjs.js.map +1 -1
  63. package/lib/utils/is.cjs.js +10 -0
  64. package/lib/utils/is.cjs.js.map +1 -0
  65. package/lib/utils/method.cjs.js +0 -5
  66. package/lib/utils/method.cjs.js.map +1 -1
  67. package/package.json +4 -3
  68. package/style.css +15 -1
  69. package/types/config/editor.config.d.ts +214 -84
  70. package/types/config/i18n/en-us.d.ts +46 -26
  71. package/types/config/i18n/zh-cn.d.ts +46 -26
  72. package/types/config/index.d.ts +0 -41
  73. package/types/config/types/editor-config.interface.d.ts +2 -0
  74. package/types/counter/index.d.ts +9 -4
  75. package/types/custom-clipboard.d.ts +6 -3
  76. package/types/fluent-editor.d.ts +7 -1
  77. package/types/link/modules/tooltip.d.ts +1 -0
  78. package/types/table/modules/table-operation-menu.d.ts +6 -0
  79. package/types/toolbar/index.d.ts +1 -0
  80. package/types/toolbar/toolbar-tip.d.ts +9 -0
  81. package/types/utils/is.d.ts +2 -0
  82. package/types/utils/method.d.ts +0 -1
@@ -1,9 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const ZH_CN = {
4
- "undo": "撤销",
5
- "redo": "重做",
6
- "clean": "清除格式",
7
4
  "header": "段落格式",
8
5
  "normal": "正文",
9
6
  "h1": "标题1",
@@ -12,38 +9,17 @@ const ZH_CN = {
12
9
  "h4": "标题4",
13
10
  "h5": "标题5",
14
11
  "h6": "标题6",
15
- "font": "字体",
16
- "size": "字号",
17
12
  "lineheight": "行距",
18
13
  "songti": "宋体",
19
14
  "yahei": "微软雅黑",
20
15
  "kaiti": "楷体",
21
16
  "heiti": "黑体",
22
17
  "lishu": "隶书",
23
- "bold": "粗体",
24
- "italic": "斜体",
25
- "underline": "下划线",
26
- "strike": "删除线",
27
- "color": "字体颜色",
28
- "background": "背景色",
29
- "orderedlist": "有序列表",
30
- "bulletlist": "无序列表",
31
- "checklist": "任务列表",
32
18
  "left": "左对齐",
33
19
  "center": "居中对齐",
34
20
  "right": "右对齐",
35
- "image": "图片",
36
- "file": "文件",
37
- "table": "表格",
38
- "link": "超链接",
39
- "code": "行内代码",
40
21
  "codeblock": "代码块",
41
- "blockquote": "引用",
42
- "superscript": "上标",
43
- "subscript": "下标",
44
22
  "globallink": "全局链接",
45
- "emoji": "表情",
46
- "fullscreen": "全屏",
47
23
  "exit-fullscreen": "退出全屏",
48
24
  "help": "帮助",
49
25
  "more": "更多",
@@ -81,10 +57,55 @@ const ZH_CN = {
81
57
  "pasting": "您粘贴的内容较多,正在努力加载中,请耐心等待...",
82
58
  "img-error": "图片复制出错",
83
59
  "img-error-info": "此图片不支持复制,请将原图下载至本地后点击工具栏【插入图片】,重新上传。",
84
- "lastModified": "最后修改时间:",
60
+ "last-modified": "最后修改时间:",
85
61
  "screenshot": "截图",
86
62
  "uploading": "上传中...",
87
- "subTitleBgColor": "背景颜色"
63
+ "sub-title-bg-color": "背景颜色",
64
+ // blot tip name
65
+ "emoji": "表情",
66
+ "fullscreen": "全屏",
67
+ "blockquote": "引用",
68
+ "undo": "撤销",
69
+ "redo": "重做",
70
+ "clean": "清除格式",
71
+ "bold": "粗体",
72
+ "italic": "斜体",
73
+ "underline": "下划线",
74
+ "strike": "删除线",
75
+ "image": "图片",
76
+ "file": "文件",
77
+ "table": "表格",
78
+ "link": "超链接",
79
+ "code": "行内代码",
80
+ "better-table": "表格",
81
+ "code-block": "代码块",
82
+ "formula": "公式",
83
+ "format-painter": "格式刷",
84
+ "video": "视频",
85
+ "color": "字体颜色",
86
+ "background": "背景色",
87
+ "font": "字体",
88
+ "size": "字号",
89
+ "list-ordered": "有序列表",
90
+ "list-bullet": "无序列表",
91
+ "list-check": "任务列表",
92
+ "align-left": "左对齐",
93
+ "align-center": "居中对齐",
94
+ "align-right": "右对齐",
95
+ "align-justify": "两端对齐",
96
+ "direction-ltr": "文本方向左到右",
97
+ "direction-rtl": "文本方向右到左",
98
+ "indent--1": "减少缩进",
99
+ "indent-+1": "增加缩进",
100
+ "script-super": "上标",
101
+ "script-sub": "下标",
102
+ "header-normal": "正文",
103
+ "header-1": "标题1",
104
+ "header-2": "标题2",
105
+ "header-3": "标题3",
106
+ "header-4": "标题4",
107
+ "header-5": "标题5",
108
+ "header-6": "标题6"
88
109
  };
89
110
  exports.ZH_CN = ZH_CN;
90
111
  //# sourceMappingURL=zh-cn.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zh-cn.cjs.js","sources":["../../../../src/config/i18n/zh-cn.ts"],"sourcesContent":["export const ZH_CN = {\r\n 'undo': '撤销',\r\n 'redo': '重做',\r\n 'clean': '清除格式',\r\n\r\n 'header': '段落格式',\r\n 'normal': '正文',\r\n 'h1': '标题1',\r\n 'h2': '标题2',\r\n 'h3': '标题3',\r\n 'h4': '标题4',\r\n 'h5': '标题5',\r\n 'h6': '标题6',\r\n\r\n 'font': '字体',\r\n 'size': '字号',\r\n 'lineheight': '行距',\r\n 'songti': '宋体',\r\n 'yahei': '微软雅黑',\r\n 'kaiti': '楷体',\r\n 'heiti': '黑体',\r\n 'lishu': '隶书',\r\n\r\n 'bold': '粗体',\r\n 'italic': '斜体',\r\n 'underline': '下划线',\r\n 'strike': '删除线',\r\n\r\n 'color': '字体颜色',\r\n 'background': '背景色',\r\n\r\n 'orderedlist': '有序列表',\r\n 'bulletlist': '无序列表',\r\n 'checklist': '任务列表',\r\n\r\n 'left': '左对齐',\r\n 'center': '居中对齐',\r\n 'right': '右对齐',\r\n\r\n 'image': '图片',\r\n 'file': '文件',\r\n 'table': '表格',\r\n 'link': '超链接',\r\n\r\n 'code': '行内代码',\r\n 'codeblock': '代码块',\r\n 'blockquote': '引用',\r\n 'superscript': '上标',\r\n 'subscript': '下标',\r\n 'globallink': '全局链接',\r\n\r\n 'emoji': '表情',\r\n 'fullscreen': '全屏',\r\n 'exit-fullscreen': '退出全屏',\r\n 'help': '帮助',\r\n 'more': '更多',\r\n\r\n 'help-format': '格式',\r\n 'help-insert': '插入',\r\n 'help-operation': '操作',\r\n 'mention': '提及某人',\r\n 'quick-menu': '快捷菜单',\r\n 'toggle-help-panel': '打开/关闭帮助面板',\r\n 'scroll-table': '水平滚动表格',\r\n 'mouse-wheel': '鼠标滚轮',\r\n 'save': '保存',\r\n\r\n 'copy-cells': '复制',\r\n 'copy-table': '复制表格',\r\n 'cut-cells': '剪切',\r\n 'empty-cells': '清空内容',\r\n\r\n 'insert-row-up': '上插入行',\r\n 'insert-row-down': '下插入行',\r\n 'insert-column-left': '左插入列',\r\n 'insert-column-right': '右插入列',\r\n\r\n 'merge-cells': '合并单元格',\r\n 'unmerge-cells': '拆分单元格',\r\n\r\n 'delete-row': '删除当前行',\r\n 'delete-column': '删除当前列',\r\n 'delete-table': '删除表格',\r\n\r\n 'default-link-text': '链接',\r\n 'basicblock': '卡片',\r\n 'linkplaceholder': '请输入链接地址,按回车键确认',\r\n 'counter-template': '{{count}}/{{totalCount}}',\r\n 'char': '字符',\r\n 'word': '单词',\r\n 'counter-limit-tips': '{{countUnit}}数超出最大允许值',\r\n 'ie-msg': '为了有更好的体验,推荐使用最新版Chrome浏览器。',\r\n\r\n 'loading': '正在加载中...',\r\n 'pasting': '您粘贴的内容较多,正在努力加载中,请耐心等待...',\r\n 'img-error': '图片复制出错',\r\n 'img-error-info':\r\n '此图片不支持复制,请将原图下载至本地后点击工具栏【插入图片】,重新上传。',\r\n\r\n 'lastModified': '最后修改时间:',\r\n 'screenshot': '截图',\r\n 'uploading': '上传中...',\r\n 'subTitleBgColor': '背景颜色',\r\n}\r\n"],"names":[],"mappings":";;AAAO,MAAM,QAAQ;AAAA,EACnB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EAET,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EAEN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EAET,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,aAAa;AAAA,EACb,UAAU;AAAA,EAEV,SAAS;AAAA,EACT,cAAc;AAAA,EAEd,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EAEb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EAET,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EAER,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,cAAc;AAAA,EACd,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc;AAAA,EAEd,SAAS;AAAA,EACT,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,QAAQ;AAAA,EAER,eAAe;AAAA,EACf,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,QAAQ;AAAA,EAER,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EAEf,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EAEvB,eAAe;AAAA,EACf,iBAAiB;AAAA,EAEjB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAEhB,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,sBAAsB;AAAA,EACtB,UAAU;AAAA,EAEV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,kBACE;AAAA,EAEF,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,mBAAmB;AACrB;;"}
1
+ {"version":3,"file":"zh-cn.cjs.js","sources":["../../../../src/config/i18n/zh-cn.ts"],"sourcesContent":["export const ZH_CN = {\r\n\r\n 'header': '段落格式',\r\n 'normal': '正文',\r\n 'h1': '标题1',\r\n 'h2': '标题2',\r\n 'h3': '标题3',\r\n 'h4': '标题4',\r\n 'h5': '标题5',\r\n 'h6': '标题6',\r\n\r\n 'lineheight': '行距',\r\n 'songti': '宋体',\r\n 'yahei': '微软雅黑',\r\n 'kaiti': '楷体',\r\n 'heiti': '黑体',\r\n 'lishu': '隶书',\r\n\r\n 'left': '左对齐',\r\n 'center': '居中对齐',\r\n 'right': '右对齐',\r\n\r\n 'codeblock': '代码块',\r\n 'globallink': '全局链接',\r\n\r\n 'exit-fullscreen': '退出全屏',\r\n 'help': '帮助',\r\n 'more': '更多',\r\n\r\n 'help-format': '格式',\r\n 'help-insert': '插入',\r\n 'help-operation': '操作',\r\n 'mention': '提及某人',\r\n 'quick-menu': '快捷菜单',\r\n 'toggle-help-panel': '打开/关闭帮助面板',\r\n 'scroll-table': '水平滚动表格',\r\n 'mouse-wheel': '鼠标滚轮',\r\n 'save': '保存',\r\n\r\n 'copy-cells': '复制',\r\n 'copy-table': '复制表格',\r\n 'cut-cells': '剪切',\r\n 'empty-cells': '清空内容',\r\n\r\n 'insert-row-up': '上插入行',\r\n 'insert-row-down': '下插入行',\r\n 'insert-column-left': '左插入列',\r\n 'insert-column-right': '右插入列',\r\n\r\n 'merge-cells': '合并单元格',\r\n 'unmerge-cells': '拆分单元格',\r\n\r\n 'delete-row': '删除当前行',\r\n 'delete-column': '删除当前列',\r\n 'delete-table': '删除表格',\r\n\r\n 'default-link-text': '链接',\r\n 'basicblock': '卡片',\r\n 'linkplaceholder': '请输入链接地址,按回车键确认',\r\n 'counter-template': '{{count}}/{{totalCount}}',\r\n 'char': '字符',\r\n 'word': '单词',\r\n 'counter-limit-tips': '{{countUnit}}数超出最大允许值',\r\n 'ie-msg': '为了有更好的体验,推荐使用最新版Chrome浏览器。',\r\n\r\n 'loading': '正在加载中...',\r\n 'pasting': '您粘贴的内容较多,正在努力加载中,请耐心等待...',\r\n 'img-error': '图片复制出错',\r\n 'img-error-info':\r\n '此图片不支持复制,请将原图下载至本地后点击工具栏【插入图片】,重新上传。',\r\n\r\n 'last-modified': '最后修改时间:',\r\n 'screenshot': '截图',\r\n 'uploading': '上传中...',\r\n 'sub-title-bg-color': '背景颜色',\r\n\r\n // blot tip name\r\n 'emoji': '表情',\r\n 'fullscreen': '全屏',\r\n 'blockquote': '引用',\r\n 'undo': '撤销',\r\n 'redo': '重做',\r\n 'clean': '清除格式',\r\n 'bold': '粗体',\r\n 'italic': '斜体',\r\n 'underline': '下划线',\r\n 'strike': '删除线',\r\n 'image': '图片',\r\n 'file': '文件',\r\n 'table': '表格',\r\n 'link': '超链接',\r\n 'code': '行内代码',\r\n 'better-table': '表格',\r\n 'code-block': '代码块',\r\n 'formula': '公式',\r\n 'format-painter': '格式刷',\r\n 'video': '视频',\r\n 'color': '字体颜色',\r\n 'background': '背景色',\r\n 'font': '字体',\r\n 'size': '字号',\r\n 'list-ordered': '有序列表',\r\n 'list-bullet': '无序列表',\r\n 'list-check': '任务列表',\r\n 'align-left': '左对齐',\r\n 'align-center': '居中对齐',\r\n 'align-right': '右对齐',\r\n 'align-justify': '两端对齐',\r\n 'direction-ltr': '文本方向左到右',\r\n 'direction-rtl': '文本方向右到左',\r\n 'indent--1': '减少缩进',\r\n 'indent-+1': '增加缩进',\r\n 'script-super': '上标',\r\n 'script-sub': '下标',\r\n 'header-normal': '正文',\r\n 'header-1': '标题1',\r\n 'header-2': '标题2',\r\n 'header-3': '标题3',\r\n 'header-4': '标题4',\r\n 'header-5': '标题5',\r\n 'header-6': '标题6',\r\n}\r\n"],"names":[],"mappings":";;AAAO,MAAM,QAAQ;AAAA,EAEnB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EAEN,cAAc;AAAA,EACd,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EAET,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EAET,aAAa;AAAA,EACb,cAAc;AAAA,EAEd,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,QAAQ;AAAA,EAER,eAAe;AAAA,EACf,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,QAAQ;AAAA,EAER,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EAEf,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EAEvB,eAAe;AAAA,EACf,iBAAiB;AAAA,EAEjB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAEhB,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,sBAAsB;AAAA,EACtB,UAAU;AAAA,EAEV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,kBACE;AAAA,EAEF,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,sBAAsB;AAAA;AAAA,EAGtB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACd;;"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const editor_config = require("./editor.config.cjs.js");
4
3
  const editor_utils = require("./editor.utils.cjs.js");
5
4
  const icons_config = require("./icons.config.cjs.js");
5
+ const editor_config = require("./editor.config.cjs.js");
6
6
  const ICONS_CONFIG = {
7
7
  "undo": icons_config.UNDO_ICON,
8
8
  "redo": icons_config.REDO_ICON,
@@ -48,47 +48,6 @@ const ICONS_CONFIG = {
48
48
  "screenshot": icons_config.SCREENSHOT_ICON,
49
49
  "format-painter": icons_config.FORMAT_PAINTER_ICON
50
50
  };
51
- const TABLE_RIGHT_MENU_CONFIG = {
52
- copyCells: {
53
- text: editor_config.LANG_CONF["copy-cells"]
54
- },
55
- copyTable: {
56
- text: editor_config.LANG_CONF["copy-table"]
57
- },
58
- cutCells: {
59
- text: editor_config.LANG_CONF["cut-cells"]
60
- },
61
- emptyCells: {
62
- text: editor_config.LANG_CONF["empty-cells"]
63
- },
64
- insertRowUp: {
65
- text: editor_config.LANG_CONF["insert-row-up"]
66
- },
67
- insertRowDown: {
68
- text: editor_config.LANG_CONF["insert-row-down"]
69
- },
70
- insertColumnLeft: {
71
- text: editor_config.LANG_CONF["insert-column-left"]
72
- },
73
- insertColumnRight: {
74
- text: editor_config.LANG_CONF["insert-column-right"]
75
- },
76
- mergeCells: {
77
- text: editor_config.LANG_CONF["merge-cells"]
78
- },
79
- unmergeCells: {
80
- text: editor_config.LANG_CONF["unmerge-cells"]
81
- },
82
- deleteRow: {
83
- text: editor_config.LANG_CONF["delete-row"]
84
- },
85
- deleteColumn: {
86
- text: editor_config.LANG_CONF["delete-column"]
87
- },
88
- deleteTable: {
89
- text: editor_config.LANG_CONF["delete-table"]
90
- }
91
- };
92
51
  function inputFile(type, accept) {
93
52
  const defaultMIMETypes = this.quill.uploader.options[type].join(", ");
94
53
  const mimeTypes = accept || defaultMIMETypes;
@@ -126,6 +85,7 @@ function getListValue(value, preListValue) {
126
85
  const namespace = "fe";
127
86
  exports.AUDIO_VIDEO_UPLOADER_MIME_TYPES = editor_config.AUDIO_VIDEO_UPLOADER_MIME_TYPES;
128
87
  exports.BIG_DELTA_LIMIT = editor_config.BIG_DELTA_LIMIT;
88
+ exports.CHANGE_LANGUAGE_EVENT = editor_config.CHANGE_LANGUAGE_EVENT;
129
89
  exports.COMPRESSED_UPLOADER_MIME_TYPES = editor_config.COMPRESSED_UPLOADER_MIME_TYPES;
130
90
  exports.DOC_UPLOADER_MIME_TYPES = editor_config.DOC_UPLOADER_MIME_TYPES;
131
91
  exports.FILE_UPLOADER_MIME_TYPES = editor_config.FILE_UPLOADER_MIME_TYPES;
@@ -134,8 +94,8 @@ exports.LANG_CONF = editor_config.LANG_CONF;
134
94
  exports.OTHER_FILE_UPLOADER_MIME_TYPES = editor_config.OTHER_FILE_UPLOADER_MIME_TYPES;
135
95
  exports.PPT_UPLOADER_MIME_TYPES = editor_config.PPT_UPLOADER_MIME_TYPES;
136
96
  exports.XSL_UPLOADER_MIME_TYPES = editor_config.XSL_UPLOADER_MIME_TYPES;
97
+ exports.defaultLanguage = editor_config.defaultLanguage;
137
98
  exports.ICONS_CONFIG = ICONS_CONFIG;
138
- exports.TABLE_RIGHT_MENU_CONFIG = TABLE_RIGHT_MENU_CONFIG;
139
99
  exports.getListValue = getListValue;
140
100
  exports.inputFile = inputFile;
141
101
  exports.namespace = namespace;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/config/index.ts"],"sourcesContent":["import { LANG_CONF } from './editor.config'\r\nimport { isNullOrUndefined } from './editor.utils'\r\nimport {\r\n ALIGN_CENTER_ICON,\r\n ALIGN_LEFT_ICON,\r\n ALIGN_RIGHT_ICON,\r\n BACKGROUND_COLOR_ICON,\r\n BLOCKQUOTE_ICON,\r\n BOLD_ICON,\r\n CLEAN_ICON,\r\n CODE_BLOCK_ICON,\r\n CODE_ICON,\r\n COLOR_ICON,\r\n EMOJI_ICON,\r\n FILE_ICON,\r\n FORMAT_PAINTER_ICON,\r\n FULLSCREEN_EXIT_ICON,\r\n FULLSCREEN_ICON,\r\n GLOBAL_LINK_ICON,\r\n HELP_ICON,\r\n IMAGE_ICON,\r\n ITALIC_ICON,\r\n LINK_ICON,\r\n LIST_CHECK_ICON,\r\n LIST_ORDERED_ICON,\r\n LIST_UNORDERED_ICON,\r\n REDO_ICON,\r\n SCREENSHOT_ICON,\r\n STRIKE_ICON,\r\n TABLE_ICON,\r\n TRIANGLE_DOWN_ICON,\r\n UNDERLINE_ICON,\r\n UNDO_ICON,\r\n} from './icons.config'\r\n\r\nexport * from './editor.config'\r\n\r\nexport const ICONS_CONFIG: { [key: string]: any } = {\r\n 'undo': UNDO_ICON,\r\n 'redo': REDO_ICON,\r\n 'clean': CLEAN_ICON,\r\n\r\n 'bold': BOLD_ICON,\r\n 'italic': ITALIC_ICON,\r\n 'underline': UNDERLINE_ICON,\r\n 'strike': STRIKE_ICON,\r\n\r\n 'font': '',\r\n 'size': '',\r\n\r\n 'color': `<span class=\"ql-color-inner\">\r\n ${COLOR_ICON}\r\n ${TRIANGLE_DOWN_ICON}\r\n <span class=\"current-color-line\"></span>\r\n </span>`,\r\n 'background': `<span class=\"ql-color-inner\">\r\n ${BACKGROUND_COLOR_ICON}\r\n ${TRIANGLE_DOWN_ICON}\r\n <span class=\"current-color-line color-line-background\"></span>\r\n </span>`,\r\n\r\n 'align': {\r\n '': ALIGN_LEFT_ICON,\r\n 'center': ALIGN_CENTER_ICON,\r\n 'right': ALIGN_RIGHT_ICON,\r\n },\r\n 'list': {\r\n bullet: LIST_UNORDERED_ICON,\r\n ordered: LIST_ORDERED_ICON,\r\n check: LIST_CHECK_ICON,\r\n },\r\n\r\n 'code': CODE_ICON,\r\n 'code-block': CODE_BLOCK_ICON,\r\n 'blockquote': BLOCKQUOTE_ICON,\r\n\r\n 'image': IMAGE_ICON,\r\n 'file': FILE_ICON,\r\n 'better-table': TABLE_ICON,\r\n 'link': LINK_ICON,\r\n 'global-link': GLOBAL_LINK_ICON,\r\n 'fullscreen': FULLSCREEN_ICON,\r\n 'fullscreen-exit': FULLSCREEN_EXIT_ICON,\r\n 'emoji': EMOJI_ICON,\r\n 'help': HELP_ICON,\r\n 'screenshot': SCREENSHOT_ICON,\r\n 'format-painter': FORMAT_PAINTER_ICON,\r\n}\r\n\r\nexport const TABLE_RIGHT_MENU_CONFIG = {\r\n copyCells: {\r\n text: LANG_CONF['copy-cells'],\r\n },\r\n copyTable: {\r\n text: LANG_CONF['copy-table'],\r\n },\r\n cutCells: {\r\n text: LANG_CONF['cut-cells'],\r\n },\r\n emptyCells: {\r\n text: LANG_CONF['empty-cells'],\r\n },\r\n insertRowUp: {\r\n text: LANG_CONF['insert-row-up'],\r\n },\r\n insertRowDown: {\r\n text: LANG_CONF['insert-row-down'],\r\n },\r\n insertColumnLeft: {\r\n text: LANG_CONF['insert-column-left'],\r\n },\r\n insertColumnRight: {\r\n text: LANG_CONF['insert-column-right'],\r\n },\r\n mergeCells: {\r\n text: LANG_CONF['merge-cells'],\r\n },\r\n unmergeCells: {\r\n text: LANG_CONF['unmerge-cells'],\r\n },\r\n deleteRow: {\r\n text: LANG_CONF['delete-row'],\r\n },\r\n deleteColumn: {\r\n text: LANG_CONF['delete-column'],\r\n },\r\n deleteTable: {\r\n text: LANG_CONF['delete-table'],\r\n },\r\n}\r\n\r\n// 触发上传\r\nexport function inputFile(type, accept) {\r\n const defaultMIMETypes = this.quill.uploader.options[type].join(', ')\r\n const mimeTypes = accept || defaultMIMETypes\r\n let fileInput = this.container.querySelector(`input.ql-${type}[type=file]`)\r\n if (isNullOrUndefined(fileInput)) {\r\n fileInput = document.createElement('input')\r\n fileInput.classList.add(`ql-${type}`)\r\n fileInput.setAttribute('type', 'file')\r\n fileInput.setAttribute('accept', mimeTypes)\r\n if (\r\n this.quill.uploader.options.enableMultiUpload === true\r\n || (this.quill.uploader.options.enableMultiUpload.file && type === 'file')\r\n || (this.quill.uploader.options.enableMultiUpload.image && type === 'image')\r\n ) {\r\n fileInput.setAttribute('multiple', '')\r\n }\r\n fileInput.addEventListener('change', () => {\r\n const range = this.quill.getSelection(true)\r\n this.quill.uploader.upload(range, fileInput.files, type === 'file')\r\n fileInput.value = ''\r\n })\r\n this.container.appendChild(fileInput)\r\n }\r\n fileInput.click()\r\n}\r\n\r\nexport function getListValue(value, preListValue) {\r\n let curListValue = value\r\n if (preListValue && preListValue === value) {\r\n curListValue = false\r\n }\r\n else if (value === 'check') {\r\n if (preListValue === 'checked' || preListValue === 'unchecked') {\r\n curListValue = false\r\n }\r\n else {\r\n curListValue = 'unchecked'\r\n }\r\n }\r\n return curListValue\r\n}\r\n/** css namespace */\r\nexport const namespace = 'fe'\r\n"],"names":["UNDO_ICON","REDO_ICON","CLEAN_ICON","BOLD_ICON","ITALIC_ICON","UNDERLINE_ICON","STRIKE_ICON","COLOR_ICON","TRIANGLE_DOWN_ICON","BACKGROUND_COLOR_ICON","ALIGN_LEFT_ICON","ALIGN_CENTER_ICON","ALIGN_RIGHT_ICON","LIST_UNORDERED_ICON","LIST_ORDERED_ICON","LIST_CHECK_ICON","CODE_ICON","CODE_BLOCK_ICON","BLOCKQUOTE_ICON","IMAGE_ICON","FILE_ICON","TABLE_ICON","LINK_ICON","GLOBAL_LINK_ICON","FULLSCREEN_ICON","FULLSCREEN_EXIT_ICON","EMOJI_ICON","HELP_ICON","SCREENSHOT_ICON","FORMAT_PAINTER_ICON","LANG_CONF","isNullOrUndefined"],"mappings":";;;;;AAqCO,MAAM,eAAuC;AAAA,EAClD,QAAQA,aAAA;AAAA,EACR,QAAQC,aAAA;AAAA,EACR,SAASC,aAAA;AAAA,EAET,QAAQC,aAAA;AAAA,EACR,UAAUC,aAAA;AAAA,EACV,aAAaC,aAAA;AAAA,EACb,UAAUC,aAAA;AAAA,EAEV,QAAQ;AAAA,EACR,QAAQ;AAAA,EAER,SAAS;AAAA,MACLC,uBAAU;AAAA,MACVC,+BAAkB;AAAA;AAAA;AAAA,EAGtB,cAAc;AAAA,MACVC,kCAAqB;AAAA,MACrBD,+BAAkB;AAAA;AAAA;AAAA,EAItB,SAAS;AAAA,IACP,IAAIE,aAAA;AAAA,IACJ,UAAUC,aAAA;AAAA,IACV,SAASC,aAAA;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,QAAQC,aAAA;AAAA,IACR,SAASC,aAAA;AAAA,IACT,OAAOC,aAAA;AAAA,EACT;AAAA,EAEA,QAAQC,aAAA;AAAA,EACR,cAAcC,aAAA;AAAA,EACd,cAAcC,aAAA;AAAA,EAEd,SAASC,aAAA;AAAA,EACT,QAAQC,aAAA;AAAA,EACR,gBAAgBC,aAAA;AAAA,EAChB,QAAQC,aAAA;AAAA,EACR,eAAeC,aAAA;AAAA,EACf,cAAcC,aAAA;AAAA,EACd,mBAAmBC,aAAA;AAAA,EACnB,SAASC,aAAA;AAAA,EACT,QAAQC,aAAA;AAAA,EACR,cAAcC,aAAA;AAAA,EACd,kBAAkBC,aAAA;AACpB;AAEO,MAAM,0BAA0B;AAAA,EACrC,WAAW;AAAA,IACT,MAAMC,wBAAU,YAAY;AAAA,EAC9B;AAAA,EACA,WAAW;AAAA,IACT,MAAMA,wBAAU,YAAY;AAAA,EAC9B;AAAA,EACA,UAAU;AAAA,IACR,MAAMA,wBAAU,WAAW;AAAA,EAC7B;AAAA,EACA,YAAY;AAAA,IACV,MAAMA,wBAAU,aAAa;AAAA,EAC/B;AAAA,EACA,aAAa;AAAA,IACX,MAAMA,wBAAU,eAAe;AAAA,EACjC;AAAA,EACA,eAAe;AAAA,IACb,MAAMA,wBAAU,iBAAiB;AAAA,EACnC;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAMA,wBAAU,oBAAoB;AAAA,EACtC;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAMA,wBAAU,qBAAqB;AAAA,EACvC;AAAA,EACA,YAAY;AAAA,IACV,MAAMA,wBAAU,aAAa;AAAA,EAC/B;AAAA,EACA,cAAc;AAAA,IACZ,MAAMA,wBAAU,eAAe;AAAA,EACjC;AAAA,EACA,WAAW;AAAA,IACT,MAAMA,wBAAU,YAAY;AAAA,EAC9B;AAAA,EACA,cAAc;AAAA,IACZ,MAAMA,wBAAU,eAAe;AAAA,EACjC;AAAA,EACA,aAAa;AAAA,IACX,MAAMA,wBAAU,cAAc;AAAA,EAChC;AACF;AAGgB,SAAA,UAAU,MAAM,QAAQ;AAChC,QAAA,mBAAmB,KAAK,MAAM,SAAS,QAAQ,IAAI,EAAE,KAAK,IAAI;AACpE,QAAM,YAAY,UAAU;AAC5B,MAAI,YAAY,KAAK,UAAU,cAAc,YAAY,IAAI,aAAa;AACtE,MAAAC,aAAAA,kBAAkB,SAAS,GAAG;AACpB,gBAAA,SAAS,cAAc,OAAO;AAC1C,cAAU,UAAU,IAAI,MAAM,IAAI,EAAE;AAC1B,cAAA,aAAa,QAAQ,MAAM;AAC3B,cAAA,aAAa,UAAU,SAAS;AAExC,QAAA,KAAK,MAAM,SAAS,QAAQ,sBAAsB,QAC9C,KAAK,MAAM,SAAS,QAAQ,kBAAkB,QAAQ,SAAS,UAC/D,KAAK,MAAM,SAAS,QAAQ,kBAAkB,SAAS,SAAS,SACpE;AACU,gBAAA,aAAa,YAAY,EAAE;AAAA,IACvC;AACU,cAAA,iBAAiB,UAAU,MAAM;AACzC,YAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AAC1C,WAAK,MAAM,SAAS,OAAO,OAAO,UAAU,OAAO,SAAS,MAAM;AAClE,gBAAU,QAAQ;AAAA,IAAA,CACnB;AACI,SAAA,UAAU,YAAY,SAAS;AAAA,EACtC;AACA,YAAU,MAAM;AAClB;AAEgB,SAAA,aAAa,OAAO,cAAc;AAChD,MAAI,eAAe;AACf,MAAA,gBAAgB,iBAAiB,OAAO;AAC3B,mBAAA;AAAA,EAAA,WAER,UAAU,SAAS;AACtB,QAAA,iBAAiB,aAAa,iBAAiB,aAAa;AAC/C,qBAAA;AAAA,IAAA,OAEZ;AACY,qBAAA;AAAA,IACjB;AAAA,EACF;AACO,SAAA;AACT;AAEO,MAAM,YAAY;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/config/index.ts"],"sourcesContent":["import { isNullOrUndefined } from './editor.utils'\r\nimport {\r\n ALIGN_CENTER_ICON,\r\n ALIGN_LEFT_ICON,\r\n ALIGN_RIGHT_ICON,\r\n BACKGROUND_COLOR_ICON,\r\n BLOCKQUOTE_ICON,\r\n BOLD_ICON,\r\n CLEAN_ICON,\r\n CODE_BLOCK_ICON,\r\n CODE_ICON,\r\n COLOR_ICON,\r\n EMOJI_ICON,\r\n FILE_ICON,\r\n FORMAT_PAINTER_ICON,\r\n FULLSCREEN_EXIT_ICON,\r\n FULLSCREEN_ICON,\r\n GLOBAL_LINK_ICON,\r\n HELP_ICON,\r\n IMAGE_ICON,\r\n ITALIC_ICON,\r\n LINK_ICON,\r\n LIST_CHECK_ICON,\r\n LIST_ORDERED_ICON,\r\n LIST_UNORDERED_ICON,\r\n REDO_ICON,\r\n SCREENSHOT_ICON,\r\n STRIKE_ICON,\r\n TABLE_ICON,\r\n TRIANGLE_DOWN_ICON,\r\n UNDERLINE_ICON,\r\n UNDO_ICON,\r\n} from './icons.config'\r\n\r\nexport * from './editor.config'\r\n\r\nexport const ICONS_CONFIG: { [key: string]: any } = {\r\n 'undo': UNDO_ICON,\r\n 'redo': REDO_ICON,\r\n 'clean': CLEAN_ICON,\r\n\r\n 'bold': BOLD_ICON,\r\n 'italic': ITALIC_ICON,\r\n 'underline': UNDERLINE_ICON,\r\n 'strike': STRIKE_ICON,\r\n\r\n 'font': '',\r\n 'size': '',\r\n\r\n 'color': `<span class=\"ql-color-inner\">\r\n ${COLOR_ICON}\r\n ${TRIANGLE_DOWN_ICON}\r\n <span class=\"current-color-line\"></span>\r\n </span>`,\r\n 'background': `<span class=\"ql-color-inner\">\r\n ${BACKGROUND_COLOR_ICON}\r\n ${TRIANGLE_DOWN_ICON}\r\n <span class=\"current-color-line color-line-background\"></span>\r\n </span>`,\r\n\r\n 'align': {\r\n '': ALIGN_LEFT_ICON,\r\n 'center': ALIGN_CENTER_ICON,\r\n 'right': ALIGN_RIGHT_ICON,\r\n },\r\n 'list': {\r\n bullet: LIST_UNORDERED_ICON,\r\n ordered: LIST_ORDERED_ICON,\r\n check: LIST_CHECK_ICON,\r\n },\r\n\r\n 'code': CODE_ICON,\r\n 'code-block': CODE_BLOCK_ICON,\r\n 'blockquote': BLOCKQUOTE_ICON,\r\n\r\n 'image': IMAGE_ICON,\r\n 'file': FILE_ICON,\r\n 'better-table': TABLE_ICON,\r\n 'link': LINK_ICON,\r\n 'global-link': GLOBAL_LINK_ICON,\r\n 'fullscreen': FULLSCREEN_ICON,\r\n 'fullscreen-exit': FULLSCREEN_EXIT_ICON,\r\n 'emoji': EMOJI_ICON,\r\n 'help': HELP_ICON,\r\n 'screenshot': SCREENSHOT_ICON,\r\n 'format-painter': FORMAT_PAINTER_ICON,\r\n}\r\n\r\n// 触发上传\r\nexport function inputFile(type, accept) {\r\n const defaultMIMETypes = this.quill.uploader.options[type].join(', ')\r\n const mimeTypes = accept || defaultMIMETypes\r\n let fileInput = this.container.querySelector(`input.ql-${type}[type=file]`)\r\n if (isNullOrUndefined(fileInput)) {\r\n fileInput = document.createElement('input')\r\n fileInput.classList.add(`ql-${type}`)\r\n fileInput.setAttribute('type', 'file')\r\n fileInput.setAttribute('accept', mimeTypes)\r\n if (\r\n this.quill.uploader.options.enableMultiUpload === true\r\n || (this.quill.uploader.options.enableMultiUpload.file && type === 'file')\r\n || (this.quill.uploader.options.enableMultiUpload.image && type === 'image')\r\n ) {\r\n fileInput.setAttribute('multiple', '')\r\n }\r\n fileInput.addEventListener('change', () => {\r\n const range = this.quill.getSelection(true)\r\n this.quill.uploader.upload(range, fileInput.files, type === 'file')\r\n fileInput.value = ''\r\n })\r\n this.container.appendChild(fileInput)\r\n }\r\n fileInput.click()\r\n}\r\n\r\nexport function getListValue(value, preListValue) {\r\n let curListValue = value\r\n if (preListValue && preListValue === value) {\r\n curListValue = false\r\n }\r\n else if (value === 'check') {\r\n if (preListValue === 'checked' || preListValue === 'unchecked') {\r\n curListValue = false\r\n }\r\n else {\r\n curListValue = 'unchecked'\r\n }\r\n }\r\n return curListValue\r\n}\r\n/** css namespace */\r\nexport const namespace = 'fe'\r\n"],"names":["UNDO_ICON","REDO_ICON","CLEAN_ICON","BOLD_ICON","ITALIC_ICON","UNDERLINE_ICON","STRIKE_ICON","COLOR_ICON","TRIANGLE_DOWN_ICON","BACKGROUND_COLOR_ICON","ALIGN_LEFT_ICON","ALIGN_CENTER_ICON","ALIGN_RIGHT_ICON","LIST_UNORDERED_ICON","LIST_ORDERED_ICON","LIST_CHECK_ICON","CODE_ICON","CODE_BLOCK_ICON","BLOCKQUOTE_ICON","IMAGE_ICON","FILE_ICON","TABLE_ICON","LINK_ICON","GLOBAL_LINK_ICON","FULLSCREEN_ICON","FULLSCREEN_EXIT_ICON","EMOJI_ICON","HELP_ICON","SCREENSHOT_ICON","FORMAT_PAINTER_ICON","isNullOrUndefined"],"mappings":";;;;;AAoCO,MAAM,eAAuC;AAAA,EAClD,QAAQA,aAAA;AAAA,EACR,QAAQC,aAAA;AAAA,EACR,SAASC,aAAA;AAAA,EAET,QAAQC,aAAA;AAAA,EACR,UAAUC,aAAA;AAAA,EACV,aAAaC,aAAA;AAAA,EACb,UAAUC,aAAA;AAAA,EAEV,QAAQ;AAAA,EACR,QAAQ;AAAA,EAER,SAAS;AAAA,MACLC,uBAAU;AAAA,MACVC,+BAAkB;AAAA;AAAA;AAAA,EAGtB,cAAc;AAAA,MACVC,kCAAqB;AAAA,MACrBD,+BAAkB;AAAA;AAAA;AAAA,EAItB,SAAS;AAAA,IACP,IAAIE,aAAA;AAAA,IACJ,UAAUC,aAAA;AAAA,IACV,SAASC,aAAA;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,QAAQC,aAAA;AAAA,IACR,SAASC,aAAA;AAAA,IACT,OAAOC,aAAA;AAAA,EACT;AAAA,EAEA,QAAQC,aAAA;AAAA,EACR,cAAcC,aAAA;AAAA,EACd,cAAcC,aAAA;AAAA,EAEd,SAASC,aAAA;AAAA,EACT,QAAQC,aAAA;AAAA,EACR,gBAAgBC,aAAA;AAAA,EAChB,QAAQC,aAAA;AAAA,EACR,eAAeC,aAAA;AAAA,EACf,cAAcC,aAAA;AAAA,EACd,mBAAmBC,aAAA;AAAA,EACnB,SAASC,aAAA;AAAA,EACT,QAAQC,aAAA;AAAA,EACR,cAAcC,aAAA;AAAA,EACd,kBAAkBC,aAAA;AACpB;AAGgB,SAAA,UAAU,MAAM,QAAQ;AAChC,QAAA,mBAAmB,KAAK,MAAM,SAAS,QAAQ,IAAI,EAAE,KAAK,IAAI;AACpE,QAAM,YAAY,UAAU;AAC5B,MAAI,YAAY,KAAK,UAAU,cAAc,YAAY,IAAI,aAAa;AACtE,MAAAC,aAAAA,kBAAkB,SAAS,GAAG;AACpB,gBAAA,SAAS,cAAc,OAAO;AAC1C,cAAU,UAAU,IAAI,MAAM,IAAI,EAAE;AAC1B,cAAA,aAAa,QAAQ,MAAM;AAC3B,cAAA,aAAa,UAAU,SAAS;AAExC,QAAA,KAAK,MAAM,SAAS,QAAQ,sBAAsB,QAC9C,KAAK,MAAM,SAAS,QAAQ,kBAAkB,QAAQ,SAAS,UAC/D,KAAK,MAAM,SAAS,QAAQ,kBAAkB,SAAS,SAAS,SACpE;AACU,gBAAA,aAAa,YAAY,EAAE;AAAA,IACvC;AACU,cAAA,iBAAiB,UAAU,MAAM;AACzC,YAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AAC1C,WAAK,MAAM,SAAS,OAAO,OAAO,UAAU,OAAO,SAAS,MAAM;AAClE,gBAAU,QAAQ;AAAA,IAAA,CACnB;AACI,SAAA,UAAU,YAAY,SAAS;AAAA,EACtC;AACA,YAAU,MAAM;AAClB;AAEgB,SAAA,aAAa,OAAO,cAAc;AAChD,MAAI,eAAe;AACf,MAAA,gBAAgB,iBAAiB,OAAO;AAC3B,mBAAA;AAAA,EAAA,WAER,UAAU,SAAS;AACtB,QAAA,iBAAiB,aAAa,iBAAiB,aAAa;AAC/C,qBAAA;AAAA,IAAA,OAEZ;AACY,qBAAA;AAAA,IACjB;AAAA,EACF;AACO,SAAA;AACT;AAEO,MAAM,YAAY;;;;;;;;;;;;;;;;;"}
@@ -4,27 +4,20 @@ const Quill = require("quill");
4
4
  require("../config/index.cjs.js");
5
5
  const editor_config = require("../config/editor.config.cjs.js");
6
6
  class Counter {
7
- // @ts-ignore
8
7
  constructor(quill, options) {
9
8
  this.quill = quill;
10
- this.defaultOptions = {
11
- format: "text",
12
- unit: "char",
13
- template: editor_config.LANG_CONF["counter-template"],
14
- count: 500
15
- };
16
9
  this.renderCount = () => {
17
10
  setTimeout(() => {
18
11
  const { format, count: totalCount, unit, template: counterTemplate, errorTemplate } = this.options;
19
12
  const count = this.getContentLength(format);
20
13
  const restCount = totalCount - count;
21
- const countUnit = unit === "char" ? editor_config.LANG_CONF.char : editor_config.LANG_CONF.word;
14
+ const countUnit = unit === "char" ? this.quill.options.langText.char : this.quill.options.langText.word;
22
15
  let template = counterTemplate;
23
16
  if (typeof template === "function") {
24
17
  template = template(count, restCount);
25
18
  }
26
19
  const desc = template.replace("{{count}}", count).replace("{{totalCount}}", String(totalCount)).replace("{{restCount}}", String(restCount)).replace(/{{countUnit}}/g, countUnit);
27
- let limitTemplate = errorTemplate || editor_config.LANG_CONF["counter-limit-tips"];
20
+ let limitTemplate = errorTemplate || this.quill.options.langText["counter-limit-tips"];
28
21
  if (typeof limitTemplate === "function") {
29
22
  limitTemplate = limitTemplate(count, restCount);
30
23
  }
@@ -36,11 +29,23 @@ class Counter {
36
29
  }
37
30
  });
38
31
  };
39
- this.options = { ...this.defaultOptions, ...options };
32
+ this.options = this.resolveOptions(options);
40
33
  this.container = quill.addContainer("ql-counter");
41
34
  quill.on(Quill.events.TEXT_CHANGE, this.renderCount);
35
+ this.quill.on(editor_config.CHANGE_LANGUAGE_EVENT, () => {
36
+ this.options = this.resolveOptions(options);
37
+ this.renderCount();
38
+ });
42
39
  this.renderCount();
43
40
  }
41
+ resolveOptions(options) {
42
+ return Object.assign({
43
+ format: "text",
44
+ unit: "char",
45
+ template: this.quill.options.langText["counter-template"],
46
+ count: 500
47
+ }, options);
48
+ }
44
49
  getContentLength(format) {
45
50
  let content = this.quill.getText();
46
51
  if (format === "html") {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/counter/index.ts"],"sourcesContent":["import type { ICounterOption } from '../config/types'\r\nimport Quill from 'quill'\r\nimport { LANG_CONF } from '../config'\r\n\r\nexport default class Counter {\r\n container: HTMLDivElement\r\n options: ICounterOption\r\n defaultOptions: ICounterOption = {\r\n format: 'text',\r\n unit: 'char',\r\n template: LANG_CONF['counter-template'],\r\n count: 500,\r\n }\r\n\r\n // @ts-ignore\r\n constructor(private quill: Quill, options: ICounterOption) {\r\n this.options = { ...this.defaultOptions, ...options }\r\n this.container = quill.addContainer('ql-counter')\r\n quill.on(Quill.events.TEXT_CHANGE, this.renderCount)\r\n this.renderCount()\r\n }\r\n\r\n renderCount = () => {\r\n setTimeout(() => {\r\n // @ts-ignore\r\n const { format, count: totalCount, unit, template: counterTemplate, errorTemplate } = this.options\r\n const count = this.getContentLength(format)\r\n const restCount = totalCount - count\r\n const countUnit = unit === 'char' ? LANG_CONF.char : LANG_CONF.word\r\n let template: any = counterTemplate\r\n if (typeof template === 'function') {\r\n template = template(count, restCount)\r\n }\r\n const desc = template.replace('{{count}}', count)\r\n .replace('{{totalCount}}', String(totalCount))\r\n .replace('{{restCount}}', String(restCount))\r\n .replace(/{{countUnit}}/g, countUnit)\r\n\r\n let limitTemplate: any = errorTemplate || LANG_CONF['counter-limit-tips']\r\n if (typeof limitTemplate === 'function') {\r\n limitTemplate = limitTemplate(count, restCount)\r\n }\r\n const limitTips = limitTemplate.replace('{{countUnit}}', countUnit)\r\n if (restCount < 0) {\r\n this.container.innerHTML = errorTemplate ? limitTips : `<span style=\"color:red\">${limitTips}</span>`\r\n }\r\n else {\r\n this.container.innerHTML = desc\r\n }\r\n })\r\n }\r\n\r\n getContentLength(format) {\r\n let content = this.quill.getText()\r\n if (format === 'html') {\r\n let html = this.quill.root.innerHTML\r\n // 编辑器初始时\r\n if (html === '<p><br></p>' || html === '<div><br><div>') {\r\n html = ''\r\n }\r\n content = html\r\n }\r\n const text = content.replace(/\\s/g, '').trim()\r\n if (this.options.unit === 'word') {\r\n return !content.trim() ? 0 : content.trim().split(/\\s+/).length\r\n }\r\n return text.length\r\n }\r\n}\r\n"],"names":["LANG_CONF"],"mappings":";;;;;AAIA,MAAqB,QAAQ;AAAA;AAAA,EAW3B,YAAoB,OAAc,SAAyB;AAAvC,SAAA,QAAA;AARa,SAAA,iBAAA;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAUA,wBAAU,kBAAkB;AAAA,MACtC,OAAO;AAAA,IAAA;AAWT,SAAA,cAAc,MAAM;AAClB,iBAAW,MAAM;AAET,cAAA,EAAE,QAAQ,OAAO,YAAY,MAAM,UAAU,iBAAiB,cAAc,IAAI,KAAK;AACrF,cAAA,QAAQ,KAAK,iBAAiB,MAAM;AAC1C,cAAM,YAAY,aAAa;AAC/B,cAAM,YAAY,SAAS,SAASA,cAAA,UAAU,OAAOA,cAAU,UAAA;AAC/D,YAAI,WAAgB;AAChB,YAAA,OAAO,aAAa,YAAY;AACvB,qBAAA,SAAS,OAAO,SAAS;AAAA,QACtC;AACM,cAAA,OAAO,SAAS,QAAQ,aAAa,KAAK,EAC7C,QAAQ,kBAAkB,OAAO,UAAU,CAAC,EAC5C,QAAQ,iBAAiB,OAAO,SAAS,CAAC,EAC1C,QAAQ,kBAAkB,SAAS;AAElC,YAAA,gBAAqB,iBAAiBA,cAAA,UAAU,oBAAoB;AACpE,YAAA,OAAO,kBAAkB,YAAY;AACvB,0BAAA,cAAc,OAAO,SAAS;AAAA,QAChD;AACA,cAAM,YAAY,cAAc,QAAQ,iBAAiB,SAAS;AAClE,YAAI,YAAY,GAAG;AACjB,eAAK,UAAU,YAAY,gBAAgB,YAAY,2BAA2B,SAAS;AAAA,QAAA,OAExF;AACH,eAAK,UAAU,YAAY;AAAA,QAC7B;AAAA,MAAA,CACD;AAAA,IAAA;AAjCD,SAAK,UAAU,EAAE,GAAG,KAAK,gBAAgB,GAAG;AACvC,SAAA,YAAY,MAAM,aAAa,YAAY;AAChD,UAAM,GAAG,MAAM,OAAO,aAAa,KAAK,WAAW;AACnD,SAAK,YAAY;AAAA,EACnB;AAAA,EAgCA,iBAAiB,QAAQ;AACnB,QAAA,UAAU,KAAK,MAAM,QAAQ;AACjC,QAAI,WAAW,QAAQ;AACjB,UAAA,OAAO,KAAK,MAAM,KAAK;AAEvB,UAAA,SAAS,iBAAiB,SAAS,kBAAkB;AAChD,eAAA;AAAA,MACT;AACU,gBAAA;AAAA,IACZ;AACA,UAAM,OAAO,QAAQ,QAAQ,OAAO,EAAE,EAAE;AACpC,QAAA,KAAK,QAAQ,SAAS,QAAQ;AACzB,aAAA,CAAC,QAAQ,KAAS,IAAA,IAAI,QAAQ,KAAK,EAAE,MAAM,KAAK,EAAE;AAAA,IAC3D;AACA,WAAO,KAAK;AAAA,EACd;AACF;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/counter/index.ts"],"sourcesContent":["import type { FluentEditor } from 'src/fluent-editor'\r\nimport type { ICounterOption } from '../config/types'\r\nimport Quill from 'quill'\r\nimport { CHANGE_LANGUAGE_EVENT } from '../config'\r\n\r\nexport default class Counter {\r\n container: HTMLDivElement\r\n options: ICounterOption\r\n\r\n constructor(public quill: FluentEditor, options: ICounterOption) {\r\n this.options = this.resolveOptions(options)\r\n this.container = quill.addContainer('ql-counter')\r\n quill.on(Quill.events.TEXT_CHANGE, this.renderCount)\r\n this.quill.on(CHANGE_LANGUAGE_EVENT, () => {\r\n this.options = this.resolveOptions(options)\r\n this.renderCount()\r\n })\r\n this.renderCount()\r\n }\r\n\r\n resolveOptions(options: ICounterOption) {\r\n return Object.assign({\r\n format: 'text',\r\n unit: 'char',\r\n template: this.quill.options.langText['counter-template'],\r\n count: 500,\r\n }, options)\r\n }\r\n\r\n renderCount = () => {\r\n setTimeout(() => {\r\n // @ts-ignore\r\n const { format, count: totalCount, unit, template: counterTemplate, errorTemplate } = this.options\r\n const count = this.getContentLength(format)\r\n const restCount = totalCount - count\r\n const countUnit = unit === 'char' ? this.quill.options.langText.char : this.quill.options.langText.word\r\n let template: any = counterTemplate\r\n if (typeof template === 'function') {\r\n template = template(count, restCount)\r\n }\r\n const desc = template.replace('{{count}}', count)\r\n .replace('{{totalCount}}', String(totalCount))\r\n .replace('{{restCount}}', String(restCount))\r\n .replace(/{{countUnit}}/g, countUnit)\r\n\r\n let limitTemplate: any = errorTemplate || this.quill.options.langText['counter-limit-tips']\r\n if (typeof limitTemplate === 'function') {\r\n limitTemplate = limitTemplate(count, restCount)\r\n }\r\n const limitTips = limitTemplate.replace('{{countUnit}}', countUnit)\r\n if (restCount < 0) {\r\n this.container.innerHTML = errorTemplate ? limitTips : `<span style=\"color:red\">${limitTips}</span>`\r\n }\r\n else {\r\n this.container.innerHTML = desc\r\n }\r\n })\r\n }\r\n\r\n getContentLength(format) {\r\n let content = this.quill.getText()\r\n if (format === 'html') {\r\n let html = this.quill.root.innerHTML\r\n // 编辑器初始时\r\n if (html === '<p><br></p>' || html === '<div><br><div>') {\r\n html = ''\r\n }\r\n content = html\r\n }\r\n const text = content.replace(/\\s/g, '').trim()\r\n if (this.options.unit === 'word') {\r\n return !content.trim() ? 0 : content.trim().split(/\\s+/).length\r\n }\r\n return text.length\r\n }\r\n}\r\n"],"names":["CHANGE_LANGUAGE_EVENT"],"mappings":";;;;;AAKA,MAAqB,QAAQ;AAAA,EAI3B,YAAmB,OAAqB,SAAyB;AAA9C,SAAA,QAAA;AAoBnB,SAAA,cAAc,MAAM;AAClB,iBAAW,MAAM;AAET,cAAA,EAAE,QAAQ,OAAO,YAAY,MAAM,UAAU,iBAAiB,cAAc,IAAI,KAAK;AACrF,cAAA,QAAQ,KAAK,iBAAiB,MAAM;AAC1C,cAAM,YAAY,aAAa;AACzB,cAAA,YAAY,SAAS,SAAS,KAAK,MAAM,QAAQ,SAAS,OAAO,KAAK,MAAM,QAAQ,SAAS;AACnG,YAAI,WAAgB;AAChB,YAAA,OAAO,aAAa,YAAY;AACvB,qBAAA,SAAS,OAAO,SAAS;AAAA,QACtC;AACM,cAAA,OAAO,SAAS,QAAQ,aAAa,KAAK,EAC7C,QAAQ,kBAAkB,OAAO,UAAU,CAAC,EAC5C,QAAQ,iBAAiB,OAAO,SAAS,CAAC,EAC1C,QAAQ,kBAAkB,SAAS;AAEtC,YAAI,gBAAqB,iBAAiB,KAAK,MAAM,QAAQ,SAAS,oBAAoB;AACtF,YAAA,OAAO,kBAAkB,YAAY;AACvB,0BAAA,cAAc,OAAO,SAAS;AAAA,QAChD;AACA,cAAM,YAAY,cAAc,QAAQ,iBAAiB,SAAS;AAClE,YAAI,YAAY,GAAG;AACjB,eAAK,UAAU,YAAY,gBAAgB,YAAY,2BAA2B,SAAS;AAAA,QAAA,OAExF;AACH,eAAK,UAAU,YAAY;AAAA,QAC7B;AAAA,MAAA,CACD;AAAA,IAAA;AA9CI,SAAA,UAAU,KAAK,eAAe,OAAO;AACrC,SAAA,YAAY,MAAM,aAAa,YAAY;AAChD,UAAM,GAAG,MAAM,OAAO,aAAa,KAAK,WAAW;AAC9C,SAAA,MAAM,GAAGA,cAAAA,uBAAuB,MAAM;AACpC,WAAA,UAAU,KAAK,eAAe,OAAO;AAC1C,WAAK,YAAY;AAAA,IAAA,CAClB;AACD,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,eAAe,SAAyB;AACtC,WAAO,OAAO,OAAO;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU,KAAK,MAAM,QAAQ,SAAS,kBAAkB;AAAA,MACxD,OAAO;AAAA,OACN,OAAO;AAAA,EACZ;AAAA,EAgCA,iBAAiB,QAAQ;AACnB,QAAA,UAAU,KAAK,MAAM,QAAQ;AACjC,QAAI,WAAW,QAAQ;AACjB,UAAA,OAAO,KAAK,MAAM,KAAK;AAEvB,UAAA,SAAS,iBAAiB,SAAS,kBAAkB;AAChD,eAAA;AAAA,MACT;AACU,gBAAA;AAAA,IACZ;AACA,UAAM,OAAO,QAAQ,QAAQ,OAAO,EAAE,EAAE;AACpC,QAAA,KAAK,QAAQ,SAAS,QAAQ;AACzB,aAAA,CAAC,QAAQ,KAAS,IAAA,IAAI,QAAQ,KAAK,EAAE,MAAM,KAAK,EAAE;AAAA,IAC3D;AACA,WAAO,KAAK;AAAA,EACd;AACF;;"}
@@ -4,7 +4,7 @@ const Quill = require("quill");
4
4
  const base64Image = require("./config/base64-image.cjs.js");
5
5
  const editor_config = require("./config/editor.config.cjs.js");
6
6
  const editor_utils = require("./config/editor.utils.cjs.js");
7
- const Clipboard = Quill.imports["modules/clipboard"];
7
+ const Clipboard = Quill.import("modules/clipboard");
8
8
  const Delta = Quill.import("delta");
9
9
  class CustomClipboard extends Clipboard {
10
10
  prepareMatching(container, nodeMatches) {
@@ -110,7 +110,7 @@ class CustomClipboard extends Clipboard {
110
110
  let loadingTipsContainer;
111
111
  if (deltaLength > editor_config.BIG_DELTA_LIMIT) {
112
112
  loadingTipsContainer = this.quill.addContainer("ql-loading-tips");
113
- loadingTipsContainer.innerHTML = editor_config.LANG_CONF.pasting;
113
+ loadingTipsContainer.innerHTML = this.quill.options.langText.pasting;
114
114
  }
115
115
  const linePos = { index: range.index, length: range.length, fix: 0 };
116
116
  const [line, offset] = this.quill.getLine(range.index);
@@ -341,7 +341,7 @@ class CustomClipboard extends Clipboard {
341
341
  });
342
342
  } else if (image.src.startsWith("http")) {
343
343
  } else {
344
- const errorImagePlaceholderJpg = editor_config.LANG_CONF["img-error"] === "Image Copy Error" ? base64Image.ERROR_IMAGE_PLACEHOLDER_EN : base64Image.ERROR_IMAGE_PLACEHOLDER_CN;
344
+ const errorImagePlaceholderJpg = this.quill.options.langText["img-error"] === "Image Copy Error" ? base64Image.ERROR_IMAGE_PLACEHOLDER_EN : base64Image.ERROR_IMAGE_PLACEHOLDER_CN;
345
345
  file = await editor_utils.imageUrlToFile(errorImagePlaceholderJpg, true);
346
346
  isPlaceholderImage = true;
347
347
  }
@@ -1 +1 @@
1
- {"version":3,"file":"custom-clipboard.cjs.js","sources":["../../src/custom-clipboard.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport {\r\n ERROR_IMAGE_PLACEHOLDER_CN,\r\n ERROR_IMAGE_PLACEHOLDER_EN,\r\n} from './config/base64-image'\r\nimport { BIG_DELTA_LIMIT, LANG_CONF } from './config/editor.config'\r\nimport {\r\n hexToRgbA,\r\n imageFileToUrl,\r\n imageUrlToFile,\r\n insideTable,\r\n isNullOrUndefined,\r\n omit,\r\n replaceDeltaImage,\r\n splitWithBreak,\r\n} from './config/editor.utils'\r\n\r\nconst Clipboard = Quill.imports['modules/clipboard']\r\nconst Delta = Quill.import('delta')\r\n\r\nclass CustomClipboard extends Clipboard {\r\n quill\r\n convert\r\n onCopy\r\n matchers\r\n\r\n prepareMatching(container, nodeMatches) {\r\n const elementMatchers = []\r\n const textMatchers = []\r\n this.matchers.forEach((pair) => {\r\n const [selector, matcher] = pair\r\n switch (selector) {\r\n case Node.TEXT_NODE:\r\n textMatchers.push(matcher)\r\n break\r\n case Node.ELEMENT_NODE:\r\n elementMatchers.push(matcher)\r\n break\r\n default: {\r\n // word 的 v:shape 系列标签只能通过 getElementsByTagName 获取\r\n const vRegex = /v:(.+)/\r\n const nodeList = vRegex.test(selector)\r\n ? Array.from(container.getElementsByTagName(selector))\r\n : Array.from(container.querySelectorAll(selector))\r\n nodeList.forEach((node) => {\r\n if (nodeMatches.has(node)) {\r\n const matches = nodeMatches.get(node)\r\n matches.push(matcher)\r\n }\r\n else {\r\n nodeMatches.set(node, [matcher])\r\n }\r\n })\r\n break\r\n }\r\n }\r\n })\r\n return [elementMatchers, textMatchers]\r\n }\r\n\r\n onCaptureCopy(e, isCut = false) {\r\n if (e.defaultPrevented) {\r\n return\r\n }\r\n e.preventDefault()\r\n const [range] = this.quill.selection.getRange()\r\n if (isNullOrUndefined(range)) {\r\n return\r\n }\r\n const { html, text } = this.onCopy(range, isCut)\r\n\r\n // 兼容IE11浏览器`\r\n if (!e.clipboardData) {\r\n e.clipboardData = {\r\n types: 'text/plain',\r\n setData: (_type, value) => {\r\n return window.clipboardData.setData('Text', value)\r\n },\r\n }\r\n }\r\n\r\n // 复制代码时移除utf8中产生的不间断空格\\u00A0\r\n let plainText = text\r\n if (html.startsWith('<pre>')) {\r\n plainText = text.replace(/\\u00A0/g, ' ')\r\n }\r\n\r\n e.clipboardData.setData('text/html', html)\r\n e.clipboardData.setData('text/plain', plainText)\r\n if (isCut) {\r\n this.quill.deleteText(range, Quill.sources.USER)\r\n }\r\n }\r\n\r\n onCapturePaste(e) {\r\n if (e.defaultPrevented || !this.quill.isEnabled()) {\r\n return\r\n }\r\n e.preventDefault()\r\n const range = this.quill.getSelection(true)\r\n if (isNullOrUndefined(range)) {\r\n return\r\n }\r\n\r\n // 兼容IE11浏览器\r\n if (!e.clipboardData) {\r\n e.clipboardData = {\r\n types: 'text/plain',\r\n getData: () => {\r\n return window.clipboardData.getData('Text')\r\n },\r\n }\r\n }\r\n\r\n const html = e.clipboardData.getData('text/html')\r\n const text = e.clipboardData.getData('text/plain')\r\n const files = Array.from(e.clipboardData.files || [])\r\n const msExcelCheck = /<meta.*?Microsoft Excel\\s[\\d].*?>/\r\n\r\n if (html.search(msExcelCheck) === -1 && files.length > 0) {\r\n this.quill.uploader.upload(range, files)\r\n }\r\n else {\r\n const msWordCheck1\r\n = /<meta\\s*name=\"?generator\"?\\s*content=\"?microsoft\\s*word\\s*\\d+\"?\\/?>/i\r\n const msWordCheck2 = /xmlns:o=\"urn:schemas-microsoft-com/i\r\n const result = { html, text, files, rtf: null }\r\n if (html.search(msExcelCheck) !== -1) {\r\n result.html = renderStyles(html)\r\n }\r\n if (msWordCheck1.test(html) || msWordCheck2.test(html)) {\r\n // TODO: 当word文档包含heading时text/rtf读取为空,无法获取hex图片,待修复。可参考ckeditor5/issues/2493\r\n result.rtf = e.clipboardData.getData('text/rtf')\r\n }\r\n this.onPaste(range, result)\r\n }\r\n }\r\n\r\n onPaste(range, { html, text, files: clipboardFiles, rtf }) {\r\n const hexImages = this.extractImageDataFromRtf(rtf)\r\n const rootBgColor = getComputedStyle(this.quill.root).backgroundColor\r\n const formats = this.quill.getFormat(range.index)\r\n let pastedDelta = this.convert({ text, html }, formats)\r\n pastedDelta = replaceDeltaWhiteSpace(pastedDelta, rootBgColor)\r\n const deltaLength = pastedDelta.ops.length\r\n\r\n let loadingTipsContainer\r\n if (deltaLength > BIG_DELTA_LIMIT) {\r\n loadingTipsContainer = this.quill.addContainer('ql-loading-tips')\r\n loadingTipsContainer.innerHTML = LANG_CONF.pasting\r\n }\r\n\r\n const linePos = { index: range.index, length: range.length, fix: 0 }\r\n const [line, offset] = this.quill.getLine(range.index)\r\n const isInsideTable = insideTable.call(this)\r\n\r\n const handlePasteContent = (content: any) => {\r\n let pastedContent = content\r\n // fix: 阻止粘贴代码块和引用导致表格断裂\r\n const tableBreaker = pastedContent.ops.find((op) => {\r\n return (\r\n op.attributes\r\n && (op.attributes.blockquote || op.attributes['code-block'])\r\n )\r\n })\r\n if (isInsideTable) {\r\n // fix: 阻止带有表格内容粘贴在表格里\r\n const table = line.domNode.closest('table.quill-better-table')\r\n const tableBlot = Quill.find(table)\r\n const tableIndex = this.quill.getIndex(tableBlot)\r\n const tableLength = tableBlot.length()\r\n const tableEndPos = tableIndex + tableLength\r\n const anchorNode = getSelection().anchorNode\r\n if (tableBreaker) {\r\n return\r\n }\r\n if (formats['table-col']) {\r\n // fix: 光标在表格前端的table-col处时,获取整个表格的index后以此为基准向前移动一位插入粘贴内容且不删除任何内容\r\n linePos.index = tableIndex - 1\r\n linePos.length = 0\r\n }\r\n else if (\r\n range.index === tableEndPos - 1\r\n && anchorNode instanceof HTMLDivElement\r\n && anchorNode.classList.contains('quill-better-table-wrapper')\r\n ) {\r\n const list = pastedContent.filter(\r\n op => op.attributes && op.attributes.list,\r\n )\r\n if (list && list.length) {\r\n return\r\n }\r\n // fix: 光标在表格末端时,向后移动一位插入粘贴内容且不删除任何内容\r\n // TODO\r\n // 当表格最后一格有内容时,没法区分在表格最后一格最末尾和光标在表格后这两种情况,它们的 range 是一样\r\n // 这会导致在这两处粘贴表格内容都会将该内容粘贴到表格下一行中\r\n linePos.index = tableEndPos\r\n linePos.length = 0\r\n }\r\n else {\r\n if (!formats['table-cell-line']) {\r\n return\r\n }\r\n // fix: 解决表格内粘贴问题\r\n // 缺陷描述:将表格内的换行文本复制粘贴到别的单元格,会导致表格断开\r\n // 原因是:换行的文本delta对象有问题,delta对象前面多了一个纯换行和表格控制头(table-col)\r\n // 解决方法:将多余的delta项移除\r\n pastedContent = {\r\n ops: pastedContent.filter((op, index) => {\r\n const regexp = /^[\\n\\r]+$/\r\n const isString = op.insert && typeof op.insert === 'string'\r\n const isLine = isString && regexp.test(op.insert)\r\n const isCellLine\r\n = isLine && op.attributes && op.attributes['table-cell-line']\r\n const isList = isLine && op.attributes && op.attributes.list\r\n const isPureLine = isLine && !isCellLine && !isList\r\n const isTableCol\r\n = isLine && op.attributes && op.attributes['table-col']\r\n const isLastCellLine = isCellLine && index === deltaLength - 1\r\n return !isPureLine && !isTableCol && !isLastCellLine\r\n }),\r\n }\r\n // fix: 解决从表格外粘贴多行文本导致表格断开的问题\r\n pastedContent = rebuildDelta(\r\n new Delta(pastedContent.ops),\r\n formats['table-cell-line'],\r\n )\r\n }\r\n }\r\n\r\n // fix: 粘贴内容末尾为List,且粘贴位置的block或table-cell-line无内容则删除该block或table-cell-line\r\n // TODO 这里的lastChild如果不存在,则可能报错\r\n const lastChild = pastedContent.ops[pastedContent.ops.length - 1]\r\n const hasList\r\n = lastChild && lastChild.attributes && lastChild.attributes.list\r\n if (\r\n hasList\r\n && offset === 0\r\n && line\r\n && line.cache.length === 1\r\n && (line.statics.blotName === 'block'\r\n || line.statics.blotName === 'table-cell-line')\r\n && (!line.next || line.next.statics.blotName !== 'table-view')\r\n ) {\r\n linePos.index = this.quill.getIndex(line)\r\n linePos.length = line.length()\r\n linePos.fix = 1\r\n }\r\n\r\n const oldDelta = new Delta().retain(linePos.index).delete(linePos.length)\r\n const delta = oldDelta.concat(pastedContent)\r\n\r\n setTimeout(() => {\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(\r\n delta.length() - linePos.length - linePos.fix,\r\n Quill.sources.SILENT,\r\n )\r\n this.quill.scrollIntoView()\r\n if (loadingTipsContainer) {\r\n loadingTipsContainer.remove()\r\n }\r\n })\r\n }\r\n\r\n ;(async () => {\r\n try {\r\n const [files, placeholders, originalUrls, imageIndexs] = this.flipFilesArray(\r\n await this.extractFilesFromDelta(\r\n pastedDelta,\r\n clipboardFiles,\r\n hexImages,\r\n ),\r\n )\r\n\r\n if (files.length === 0) {\r\n handlePasteContent(pastedDelta)\r\n }\r\n else {\r\n if (this.quill.options.editorPaste && this.quill.options.editorPaste.observers.length !== 0) {\r\n // 设置editorPaste回调的情况\r\n this.quill.options.editorPaste.emit({\r\n files,\r\n callback: ({ code, message, data }) => {\r\n if (code === 0) {\r\n const { imageUrls } = data\r\n pastedDelta = replaceDeltaImage(\r\n pastedDelta,\r\n imageUrls,\r\n placeholders,\r\n )\r\n handlePasteContent(pastedDelta)\r\n }\r\n else {\r\n console.error('error message:', message)\r\n }\r\n },\r\n })\r\n }\r\n else {\r\n // 没有originalUrls 也没有文件粘贴\r\n if (files[0] !== undefined || originalUrls.length === 0) {\r\n // 没有设置editorPaste回调的情况下,File格式的占位图需要手动转换成url格式,插入到编辑器中\r\n const imageUrls = await this.files2urls(\r\n files,\r\n placeholders,\r\n originalUrls,\r\n pastedDelta,\r\n imageIndexs,\r\n )\r\n pastedDelta = replaceDeltaImage(\r\n pastedDelta,\r\n imageUrls,\r\n placeholders,\r\n )\r\n }\r\n handlePasteContent(pastedDelta)\r\n }\r\n }\r\n }\r\n catch (_e) {\r\n throw new Error('Paste failed.')\r\n }\r\n })()\r\n }\r\n\r\n files2urls(files, placeholders, originalUrls, pastedDelta, imageIndexs) {\r\n return Promise.all(\r\n files.map(async (imageFile, index) => {\r\n const netImgExp = /^((http|https)\\:)?\\/\\/([\\s\\S]+)$/\r\n if (\r\n !placeholders[index]\r\n && originalUrls[index]\r\n && netImgExp.test(originalUrls[index])\r\n ) {\r\n // 不是占位图的普通url图片直接返回url\r\n return new Promise((resolve) => {\r\n resolve(originalUrls[index])\r\n })\r\n }\r\n else if (this.quill.options.uploadOption.imageUploadToServer) {\r\n const range = this.getImgSelection(pastedDelta, imageIndexs[index])\r\n this.quill.uploader.upload(range, [imageFile])\r\n }\r\n else {\r\n // 占位图或者跨域图需要手动转换成url格式\r\n return imageFileToUrl(imageFile)\r\n }\r\n }),\r\n )\r\n }\r\n\r\n flipFilesArray(filesArr) {\r\n const files = []\r\n const placeholders = []\r\n const originalUrls = []\r\n const imageIndexs = []\r\n filesArr.forEach((item: any) => {\r\n if (item) {\r\n const [file, placeholder, originalUrl, imageIndex] = item\r\n files.push(file)\r\n placeholders.push(placeholder)\r\n originalUrls.push(originalUrl)\r\n if (imageIndex === 0 || imageIndex) {\r\n imageIndexs.push(imageIndex)\r\n }\r\n }\r\n })\r\n return [files, placeholders, originalUrls, imageIndexs]\r\n }\r\n\r\n // 将图片从hex转为base64\r\n convertHexToBase64(hexString) {\r\n return btoa(\r\n hexString\r\n .match(/\\w{2}/g)\r\n .map((char) => {\r\n return String.fromCharCode(Number.parseInt(char, 16))\r\n })\r\n .join(''),\r\n )\r\n }\r\n\r\n // 匹配rtf中的图片,存储为{hex, type}对象数组\r\n extractImageDataFromRtf(rtfData) {\r\n if (!rtfData) {\r\n return []\r\n }\r\n\r\n const regexPictureHeader\r\n = /{\\\\pict[\\s\\S]+?\\\\bliptag-?\\d+(\\\\blipupi-?\\d+)?({\\\\\\*\\\\blipuid\\s?[\\da-fA-F]+)?[\\s}]*?/\r\n const regexPicture = new RegExp(\r\n `(?:(${regexPictureHeader.source}))([\\\\da-fA-F\\\\s]+)\\\\}`,\r\n 'g',\r\n )\r\n const images = rtfData.match(regexPicture)\r\n const result = []\r\n\r\n if (images) {\r\n for (const image of images) {\r\n let imageType = ''\r\n\r\n if (image.includes('\\\\pngblip')) {\r\n imageType = 'image/png'\r\n }\r\n else if (image.includes('\\\\jpegblip')) {\r\n imageType = 'image/jpeg'\r\n }\r\n\r\n if (imageType) {\r\n result.push({\r\n hex: image\r\n .replace(regexPictureHeader, '')\r\n .replace(/[^\\da-fA-F]/g, ''),\r\n type: imageType,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n extractFilesFromDelta(delta, clipboardFiles, hexImages?) {\r\n let index = -1\r\n return Promise.all(\r\n delta.map(async (op) => {\r\n index++\r\n const image = op.insert.image\r\n if (!image || image.hasExisted) {\r\n return\r\n }\r\n\r\n let file\r\n let isPlaceholderImage = false\r\n let imageIndex\r\n try {\r\n // hex 图片存在则为 file:/// 协议本地图片,使用 hex 图片转为 base64 读取\r\n const hexImage = hexImages.length && hexImages.shift()\r\n const newImage\r\n = hexImage\r\n && `data:${hexImage.type};base64,${this.convertHexToBase64(\r\n hexImage.hex,\r\n )}`\r\n imageIndex = index\r\n file = await imageUrlToFile(newImage || image.src || image)\r\n }\r\n catch (_err) {\r\n if (clipboardFiles.length !== 0) {\r\n // 跨域获取图片失败时从剪切板获取图片\r\n const clipboardFile = clipboardFiles[0]\r\n const imageType\r\n = clipboardFile.type?.indexOf('image') === -1\r\n ? 'image/png'\r\n : clipboardFile.type\r\n const blob = clipboardFile.slice(0, clipboardFile.size, imageType)\r\n file = new File([blob], `image-CORS-${new Date().getTime()}.png`, {\r\n type: imageType,\r\n })\r\n }\r\n else if (image.src.startsWith('http')) {\r\n // 什么都不做\r\n }\r\n else {\r\n // 剪切板中无图片,用失败占位图替换\r\n const errorImagePlaceholderJpg\r\n = LANG_CONF['img-error'] === 'Image Copy Error'\r\n ? ERROR_IMAGE_PLACEHOLDER_EN\r\n : ERROR_IMAGE_PLACEHOLDER_CN\r\n file = await imageUrlToFile(errorImagePlaceholderJpg, true)\r\n isPlaceholderImage = true\r\n }\r\n }\r\n\r\n return [file, isPlaceholderImage, image, imageIndex]\r\n }),\r\n )\r\n }\r\n\r\n getImgSelection(delta, imageIndex) {\r\n let length = 0\r\n delta.ops.every((op, index) => {\r\n if (index === imageIndex) {\r\n return false\r\n }\r\n if (typeof op.insert === 'string') {\r\n length += op.insert.length\r\n }\r\n return true\r\n })\r\n const range = {\r\n index: length,\r\n length: 0,\r\n }\r\n return range\r\n }\r\n}\r\n\r\nfunction rebuildDelta(delta, cellLine) {\r\n const { cell: cellId, colspan, row: rowId, rowspan } = cellLine\r\n const buildedDelta = delta.reduce((newDelta, op) => {\r\n if (op.insert && typeof op.insert === 'string') {\r\n const lines = splitWithBreak(op.insert)\r\n\r\n lines.forEach((text) => {\r\n if (text === '\\n') {\r\n // 对换行增加 table-cell-line 格式,以避免表格断开\r\n newDelta.insert('\\n', {\r\n ...op.attributes,\r\n 'table-cell-line': { row: rowId, cell: cellId, rowspan, colspan },\r\n })\r\n }\r\n else {\r\n text = text.endsWith('\\r') ? text.slice(0, -1) : text\r\n newDelta.insert(\r\n text,\r\n omit(op.attributes, ['table', 'table-cell-line']),\r\n )\r\n }\r\n })\r\n }\r\n else {\r\n newDelta.insert(op.insert, op.attributes)\r\n }\r\n\r\n return newDelta\r\n }, new Delta())\r\n\r\n return buildedDelta\r\n}\r\n\r\nfunction replaceStrWhiteSpace(str) {\r\n const isWhiteSpace = value => /^(\\u3000|\\u0020){1}$/.test(value) // 空白字符\r\n let textWithWhiteSpace = ''\r\n let beginHasChar = false\r\n for (const char of str) {\r\n if (isWhiteSpace(char) && !beginHasChar) {\r\n textWithWhiteSpace += '\\u00A0'\r\n }\r\n else {\r\n textWithWhiteSpace += char\r\n beginHasChar = true\r\n }\r\n }\r\n return textWithWhiteSpace\r\n}\r\n\r\nfunction replaceDeltaWhiteSpace(delta, rootBgColor?) {\r\n return delta.reduce((newDelta, op) => {\r\n // fix: 当粘贴文字颜色和编辑器背景色一致且自身无背景色的情况下移除文字颜色样式,避免误导用户粘贴无效\r\n if (\r\n rootBgColor\r\n && op.attributes\r\n && op.attributes.color\r\n && !op.attributes.background\r\n ) {\r\n const originColor = op.attributes.color\r\n const fontColor\r\n = originColor.indexOf('#') === 0 ? hexToRgbA(originColor) : originColor\r\n if (\r\n fontColor === rootBgColor\r\n || (fontColor === 'rgba(255,255,255,1)'\r\n && rootBgColor === 'rgba(0, 0, 0, 0)')\r\n ) {\r\n delete op.attributes.color\r\n }\r\n }\r\n if (op.insert && typeof op.insert === 'string') {\r\n const lines = splitWithBreak(op.insert)\r\n let insertWithWhiteSpace = ''\r\n lines.forEach((text) => {\r\n insertWithWhiteSpace += replaceStrWhiteSpace(text)\r\n })\r\n newDelta.insert(insertWithWhiteSpace, op.attributes)\r\n }\r\n else {\r\n newDelta.insert(op.insert, op.attributes)\r\n }\r\n return newDelta\r\n }, new Delta())\r\n}\r\n\r\nfunction renderStyles(html) {\r\n let htmlString = html\r\n // Trim unnecessary parts.\r\n htmlString = htmlString.substring(\r\n htmlString.indexOf('<html '),\r\n htmlString.length,\r\n )\r\n htmlString = htmlString.substring(\r\n 0,\r\n htmlString.lastIndexOf('</html>') + '</html>'.length,\r\n )\r\n\r\n // Add temporary iframe.\r\n const iframe = document.createElement('iframe')\r\n iframe.style.display = 'none'\r\n document.body.appendChild(iframe)\r\n\r\n const iframeDoc = iframe.contentDocument || iframe.contentWindow.document\r\n iframeDoc.open()\r\n iframeDoc.write(htmlString)\r\n iframeDoc.close()\r\n\r\n let collection\r\n let pointer\r\n const rules\r\n = iframeDoc.styleSheets[iframeDoc.styleSheets.length - 1].cssRules\r\n\r\n // Convert internal styles to inline style of respective node.\r\n for (let idx = 0; idx < rules.length; idx++) {\r\n if ((rules[idx] as CSSStyleRule).selectorText === '') {\r\n continue\r\n }\r\n collection = iframeDoc.body.querySelectorAll(\r\n (rules[idx] as CSSStyleRule).selectorText,\r\n )\r\n\r\n for (pointer = 0; pointer < collection.length; pointer++) {\r\n collection[pointer].style.cssText += (\r\n rules[idx] as CSSStyleRule\r\n ).style.cssText\r\n }\r\n }\r\n\r\n const convertedString = iframeDoc.firstChild.outerHTML\r\n // Remove temporary iframe.\r\n iframe.parentNode.removeChild(iframe)\r\n\r\n return convertedString\r\n}\r\n\r\nexport default CustomClipboard\r\n"],"names":["isNullOrUndefined","BIG_DELTA_LIMIT","LANG_CONF","insideTable","replaceDeltaImage","imageFileToUrl","imageUrlToFile","ERROR_IMAGE_PLACEHOLDER_EN","ERROR_IMAGE_PLACEHOLDER_CN","splitWithBreak","omit","hexToRgbA"],"mappings":"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"}
1
+ {"version":3,"file":"custom-clipboard.cjs.js","sources":["../../src/custom-clipboard.ts"],"sourcesContent":["import type { Parchment as TypeParchment } from 'quill'\r\nimport type TypeBlock from 'quill/blots/block'\r\nimport type TypeClipboard from 'quill/modules/clipboard'\r\nimport type { FluentEditor } from './fluent-editor'\r\nimport Quill from 'quill'\r\nimport {\r\n ERROR_IMAGE_PLACEHOLDER_CN,\r\n ERROR_IMAGE_PLACEHOLDER_EN,\r\n} from './config/base64-image'\r\nimport { BIG_DELTA_LIMIT } from './config/editor.config'\r\nimport {\r\n hexToRgbA,\r\n imageFileToUrl,\r\n imageUrlToFile,\r\n insideTable,\r\n isNullOrUndefined,\r\n omit,\r\n replaceDeltaImage,\r\n splitWithBreak,\r\n} from './config/editor.utils'\r\n\r\nconst Clipboard = Quill.import('modules/clipboard') as typeof TypeClipboard\r\nconst Delta = Quill.import('delta')\r\n\r\nclass CustomClipboard extends Clipboard {\r\n quill: FluentEditor\r\n convert\r\n onCopy\r\n matchers\r\n\r\n prepareMatching(container, nodeMatches) {\r\n const elementMatchers = []\r\n const textMatchers = []\r\n this.matchers.forEach((pair) => {\r\n const [selector, matcher] = pair\r\n switch (selector) {\r\n case Node.TEXT_NODE:\r\n textMatchers.push(matcher)\r\n break\r\n case Node.ELEMENT_NODE:\r\n elementMatchers.push(matcher)\r\n break\r\n default: {\r\n // word 的 v:shape 系列标签只能通过 getElementsByTagName 获取\r\n const vRegex = /v:(.+)/\r\n const nodeList = vRegex.test(selector)\r\n ? Array.from(container.getElementsByTagName(selector))\r\n : Array.from(container.querySelectorAll(selector))\r\n nodeList.forEach((node) => {\r\n if (nodeMatches.has(node)) {\r\n const matches = nodeMatches.get(node)\r\n matches.push(matcher)\r\n }\r\n else {\r\n nodeMatches.set(node, [matcher])\r\n }\r\n })\r\n break\r\n }\r\n }\r\n })\r\n return [elementMatchers, textMatchers]\r\n }\r\n\r\n onCaptureCopy(e, isCut = false) {\r\n if (e.defaultPrevented) {\r\n return\r\n }\r\n e.preventDefault()\r\n const [range] = this.quill.selection.getRange()\r\n if (isNullOrUndefined(range)) {\r\n return\r\n }\r\n const { html, text } = this.onCopy(range, isCut)\r\n\r\n // 兼容IE11浏览器`\r\n if (!e.clipboardData) {\r\n e.clipboardData = {\r\n types: 'text/plain',\r\n setData: (_type, value) => {\r\n // @ts-ignore\r\n return window.clipboardData.setData('Text', value)\r\n },\r\n }\r\n }\r\n\r\n // 复制代码时移除utf8中产生的不间断空格\\u00A0\r\n let plainText = text\r\n if (html.startsWith('<pre>')) {\r\n plainText = text.replace(/\\u00A0/g, ' ')\r\n }\r\n\r\n e.clipboardData.setData('text/html', html)\r\n e.clipboardData.setData('text/plain', plainText)\r\n if (isCut) {\r\n this.quill.deleteText(range, Quill.sources.USER)\r\n }\r\n }\r\n\r\n onCapturePaste(e: ClipboardEvent) {\r\n if (e.defaultPrevented || !this.quill.isEnabled()) {\r\n return\r\n }\r\n e.preventDefault()\r\n const range = this.quill.getSelection(true)\r\n if (isNullOrUndefined(range)) {\r\n return\r\n }\r\n\r\n // 兼容IE11浏览器\r\n if (!e.clipboardData) {\r\n // @ts-ignore\r\n e.clipboardData = {\r\n types: 'text/plain',\r\n getData: () => {\r\n // @ts-ignore\r\n return window.clipboardData.getData('Text')\r\n },\r\n }\r\n }\r\n\r\n const html = e.clipboardData.getData('text/html')\r\n const text = e.clipboardData.getData('text/plain')\r\n const files = Array.from(e.clipboardData.files || [])\r\n const msExcelCheck = /<meta.*?Microsoft Excel\\s[\\d].*?>/\r\n\r\n if (html.search(msExcelCheck) === -1 && files.length > 0) {\r\n this.quill.uploader.upload(range, files)\r\n }\r\n else {\r\n const msWordCheck1\r\n = /<meta\\s*name=\"?generator\"?\\s*content=\"?microsoft\\s*word\\s*\\d+\"?\\/?>/i\r\n const msWordCheck2 = /xmlns:o=\"urn:schemas-microsoft-com/i\r\n const result = { html, text, files, rtf: null }\r\n if (html.search(msExcelCheck) !== -1) {\r\n result.html = renderStyles(html)\r\n }\r\n if (msWordCheck1.test(html) || msWordCheck2.test(html)) {\r\n // TODO: 当word文档包含heading时text/rtf读取为空,无法获取hex图片,待修复。可参考ckeditor5/issues/2493\r\n result.rtf = e.clipboardData.getData('text/rtf')\r\n }\r\n this.onPaste(range, result)\r\n }\r\n }\r\n\r\n onPaste(range, { html, text, files: clipboardFiles, rtf }) {\r\n const hexImages = this.extractImageDataFromRtf(rtf)\r\n const rootBgColor = getComputedStyle(this.quill.root).backgroundColor\r\n const formats = this.quill.getFormat(range.index)\r\n let pastedDelta = this.convert({ text, html }, formats)\r\n pastedDelta = replaceDeltaWhiteSpace(pastedDelta, rootBgColor)\r\n const deltaLength = pastedDelta.ops.length\r\n\r\n let loadingTipsContainer\r\n if (deltaLength > BIG_DELTA_LIMIT) {\r\n loadingTipsContainer = this.quill.addContainer('ql-loading-tips')\r\n loadingTipsContainer.innerHTML = this.quill.options.langText.pasting\r\n }\r\n\r\n const linePos = { index: range.index, length: range.length, fix: 0 }\r\n const [line, offset] = this.quill.getLine(range.index)\r\n const isInsideTable = insideTable.call(this)\r\n\r\n const handlePasteContent = (content: any) => {\r\n let pastedContent = content\r\n // fix: 阻止粘贴代码块和引用导致表格断裂\r\n const tableBreaker = pastedContent.ops.find((op) => {\r\n return (\r\n op.attributes\r\n && (op.attributes.blockquote || op.attributes['code-block'])\r\n )\r\n })\r\n if (isInsideTable) {\r\n // fix: 阻止带有表格内容粘贴在表格里\r\n const table = line.domNode.closest('table.quill-better-table')\r\n const tableBlot = Quill.find(table) as TypeParchment.Blot\r\n const tableIndex = this.quill.getIndex(tableBlot)\r\n const tableLength = tableBlot.length()\r\n const tableEndPos = tableIndex + tableLength\r\n const anchorNode = getSelection().anchorNode\r\n if (tableBreaker) {\r\n return\r\n }\r\n if (formats['table-col']) {\r\n // fix: 光标在表格前端的table-col处时,获取整个表格的index后以此为基准向前移动一位插入粘贴内容且不删除任何内容\r\n linePos.index = tableIndex - 1\r\n linePos.length = 0\r\n }\r\n else if (\r\n range.index === tableEndPos - 1\r\n && anchorNode instanceof HTMLDivElement\r\n && anchorNode.classList.contains('quill-better-table-wrapper')\r\n ) {\r\n const list = pastedContent.filter(\r\n op => op.attributes && op.attributes.list,\r\n )\r\n if (list && list.length) {\r\n return\r\n }\r\n // fix: 光标在表格末端时,向后移动一位插入粘贴内容且不删除任何内容\r\n // TODO\r\n // 当表格最后一格有内容时,没法区分在表格最后一格最末尾和光标在表格后这两种情况,它们的 range 是一样\r\n // 这会导致在这两处粘贴表格内容都会将该内容粘贴到表格下一行中\r\n linePos.index = tableEndPos\r\n linePos.length = 0\r\n }\r\n else {\r\n if (!formats['table-cell-line']) {\r\n return\r\n }\r\n // fix: 解决表格内粘贴问题\r\n // 缺陷描述:将表格内的换行文本复制粘贴到别的单元格,会导致表格断开\r\n // 原因是:换行的文本delta对象有问题,delta对象前面多了一个纯换行和表格控制头(table-col)\r\n // 解决方法:将多余的delta项移除\r\n pastedContent = {\r\n ops: pastedContent.filter((op, index) => {\r\n const regexp = /^[\\n\\r]+$/\r\n const isString = op.insert && typeof op.insert === 'string'\r\n const isLine = isString && regexp.test(op.insert)\r\n const isCellLine\r\n = isLine && op.attributes && op.attributes['table-cell-line']\r\n const isList = isLine && op.attributes && op.attributes.list\r\n const isPureLine = isLine && !isCellLine && !isList\r\n const isTableCol\r\n = isLine && op.attributes && op.attributes['table-col']\r\n const isLastCellLine = isCellLine && index === deltaLength - 1\r\n return !isPureLine && !isTableCol && !isLastCellLine\r\n }),\r\n }\r\n // fix: 解决从表格外粘贴多行文本导致表格断开的问题\r\n pastedContent = rebuildDelta(\r\n new Delta(pastedContent.ops),\r\n formats['table-cell-line'],\r\n )\r\n }\r\n }\r\n\r\n // fix: 粘贴内容末尾为List,且粘贴位置的block或table-cell-line无内容则删除该block或table-cell-line\r\n // TODO 这里的lastChild如果不存在,则可能报错\r\n const lastChild = pastedContent.ops[pastedContent.ops.length - 1]\r\n const hasList\r\n = lastChild && lastChild.attributes && lastChild.attributes.list\r\n if (\r\n hasList\r\n && offset === 0\r\n && line\r\n && (line as TypeBlock).cache.length === 1\r\n && (line.statics.blotName === 'block'\r\n || line.statics.blotName === 'table-cell-line')\r\n && (!line.next || line.next.statics.blotName !== 'table-view')\r\n ) {\r\n linePos.index = this.quill.getIndex(line)\r\n linePos.length = line.length()\r\n linePos.fix = 1\r\n }\r\n\r\n const oldDelta = new Delta().retain(linePos.index).delete(linePos.length)\r\n const delta = oldDelta.concat(pastedContent)\r\n\r\n setTimeout(() => {\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(\r\n delta.length() - linePos.length - linePos.fix,\r\n Quill.sources.SILENT,\r\n )\r\n this.quill.scrollIntoView()\r\n if (loadingTipsContainer) {\r\n loadingTipsContainer.remove()\r\n }\r\n })\r\n }\r\n\r\n ;(async () => {\r\n try {\r\n const [files, placeholders, originalUrls, imageIndexs] = this.flipFilesArray(\r\n await this.extractFilesFromDelta(\r\n pastedDelta,\r\n clipboardFiles,\r\n hexImages,\r\n ),\r\n )\r\n\r\n if (files.length === 0) {\r\n handlePasteContent(pastedDelta)\r\n }\r\n else {\r\n if (this.quill.options.editorPaste && this.quill.options.editorPaste.observers.length !== 0) {\r\n // 设置editorPaste回调的情况\r\n this.quill.options.editorPaste.emit({\r\n files,\r\n callback: ({ code, message, data }) => {\r\n if (code === 0) {\r\n const { imageUrls } = data\r\n pastedDelta = replaceDeltaImage(\r\n pastedDelta,\r\n imageUrls,\r\n placeholders,\r\n )\r\n handlePasteContent(pastedDelta)\r\n }\r\n else {\r\n console.error('error message:', message)\r\n }\r\n },\r\n })\r\n }\r\n else {\r\n // 没有originalUrls 也没有文件粘贴\r\n if (files[0] !== undefined || originalUrls.length === 0) {\r\n // 没有设置editorPaste回调的情况下,File格式的占位图需要手动转换成url格式,插入到编辑器中\r\n const imageUrls = await this.files2urls(\r\n files,\r\n placeholders,\r\n originalUrls,\r\n pastedDelta,\r\n imageIndexs,\r\n )\r\n pastedDelta = replaceDeltaImage(\r\n pastedDelta,\r\n imageUrls,\r\n placeholders,\r\n )\r\n }\r\n handlePasteContent(pastedDelta)\r\n }\r\n }\r\n }\r\n catch (_e) {\r\n throw new Error('Paste failed.')\r\n }\r\n })()\r\n }\r\n\r\n files2urls(files, placeholders, originalUrls, pastedDelta, imageIndexs) {\r\n return Promise.all(\r\n files.map(async (imageFile, index) => {\r\n const netImgExp = /^((http|https)\\:)?\\/\\/([\\s\\S]+)$/\r\n if (\r\n !placeholders[index]\r\n && originalUrls[index]\r\n && netImgExp.test(originalUrls[index])\r\n ) {\r\n // 不是占位图的普通url图片直接返回url\r\n return new Promise((resolve) => {\r\n resolve(originalUrls[index])\r\n })\r\n }\r\n else if (this.quill.options.uploadOption.imageUploadToServer) {\r\n const range = this.getImgSelection(pastedDelta, imageIndexs[index])\r\n this.quill.uploader.upload(range, [imageFile])\r\n }\r\n else {\r\n // 占位图或者跨域图需要手动转换成url格式\r\n return imageFileToUrl(imageFile)\r\n }\r\n }),\r\n )\r\n }\r\n\r\n flipFilesArray(filesArr) {\r\n const files = []\r\n const placeholders = []\r\n const originalUrls = []\r\n const imageIndexs = []\r\n filesArr.forEach((item: any) => {\r\n if (item) {\r\n const [file, placeholder, originalUrl, imageIndex] = item\r\n files.push(file)\r\n placeholders.push(placeholder)\r\n originalUrls.push(originalUrl)\r\n if (imageIndex === 0 || imageIndex) {\r\n imageIndexs.push(imageIndex)\r\n }\r\n }\r\n })\r\n return [files, placeholders, originalUrls, imageIndexs]\r\n }\r\n\r\n // 将图片从hex转为base64\r\n convertHexToBase64(hexString) {\r\n return btoa(\r\n hexString\r\n .match(/\\w{2}/g)\r\n .map((char) => {\r\n return String.fromCharCode(Number.parseInt(char, 16))\r\n })\r\n .join(''),\r\n )\r\n }\r\n\r\n // 匹配rtf中的图片,存储为{hex, type}对象数组\r\n extractImageDataFromRtf(rtfData) {\r\n if (!rtfData) {\r\n return []\r\n }\r\n\r\n const regexPictureHeader\r\n = /{\\\\pict[\\s\\S]+?\\\\bliptag-?\\d+(\\\\blipupi-?\\d+)?({\\\\\\*\\\\blipuid\\s?[\\da-fA-F]+)?[\\s}]*?/\r\n const regexPicture = new RegExp(\r\n `(?:(${regexPictureHeader.source}))([\\\\da-fA-F\\\\s]+)\\\\}`,\r\n 'g',\r\n )\r\n const images = rtfData.match(regexPicture)\r\n const result = []\r\n\r\n if (images) {\r\n for (const image of images) {\r\n let imageType = ''\r\n\r\n if (image.includes('\\\\pngblip')) {\r\n imageType = 'image/png'\r\n }\r\n else if (image.includes('\\\\jpegblip')) {\r\n imageType = 'image/jpeg'\r\n }\r\n\r\n if (imageType) {\r\n result.push({\r\n hex: image\r\n .replace(regexPictureHeader, '')\r\n .replace(/[^\\da-fA-F]/g, ''),\r\n type: imageType,\r\n })\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n extractFilesFromDelta(delta, clipboardFiles, hexImages?) {\r\n let index = -1\r\n return Promise.all(\r\n delta.map(async (op) => {\r\n index++\r\n const image = op.insert.image\r\n if (!image || image.hasExisted) {\r\n return\r\n }\r\n\r\n let file\r\n let isPlaceholderImage = false\r\n let imageIndex\r\n try {\r\n // hex 图片存在则为 file:/// 协议本地图片,使用 hex 图片转为 base64 读取\r\n const hexImage = hexImages.length && hexImages.shift()\r\n const newImage\r\n = hexImage\r\n && `data:${hexImage.type};base64,${this.convertHexToBase64(\r\n hexImage.hex,\r\n )}`\r\n imageIndex = index\r\n file = await imageUrlToFile(newImage || image.src || image)\r\n }\r\n catch (_err) {\r\n if (clipboardFiles.length !== 0) {\r\n // 跨域获取图片失败时从剪切板获取图片\r\n const clipboardFile = clipboardFiles[0]\r\n const imageType\r\n = clipboardFile.type?.indexOf('image') === -1\r\n ? 'image/png'\r\n : clipboardFile.type\r\n const blob = clipboardFile.slice(0, clipboardFile.size, imageType)\r\n file = new File([blob], `image-CORS-${new Date().getTime()}.png`, {\r\n type: imageType,\r\n })\r\n }\r\n else if (image.src.startsWith('http')) {\r\n // 什么都不做\r\n }\r\n else {\r\n // 剪切板中无图片,用失败占位图替换\r\n const errorImagePlaceholderJpg\r\n = this.quill.options.langText['img-error'] === 'Image Copy Error'\r\n ? ERROR_IMAGE_PLACEHOLDER_EN\r\n : ERROR_IMAGE_PLACEHOLDER_CN\r\n file = await imageUrlToFile(errorImagePlaceholderJpg, true)\r\n isPlaceholderImage = true\r\n }\r\n }\r\n\r\n return [file, isPlaceholderImage, image, imageIndex]\r\n }),\r\n )\r\n }\r\n\r\n getImgSelection(delta, imageIndex) {\r\n let length = 0\r\n delta.ops.every((op, index) => {\r\n if (index === imageIndex) {\r\n return false\r\n }\r\n if (typeof op.insert === 'string') {\r\n length += op.insert.length\r\n }\r\n return true\r\n })\r\n const range = {\r\n index: length,\r\n length: 0,\r\n }\r\n return range\r\n }\r\n}\r\n\r\nfunction rebuildDelta(delta, cellLine) {\r\n const { cell: cellId, colspan, row: rowId, rowspan } = cellLine\r\n const buildedDelta = delta.reduce((newDelta, op) => {\r\n if (op.insert && typeof op.insert === 'string') {\r\n const lines = splitWithBreak(op.insert)\r\n\r\n lines.forEach((text) => {\r\n if (text === '\\n') {\r\n // 对换行增加 table-cell-line 格式,以避免表格断开\r\n newDelta.insert('\\n', {\r\n ...op.attributes,\r\n 'table-cell-line': { row: rowId, cell: cellId, rowspan, colspan },\r\n })\r\n }\r\n else {\r\n text = text.endsWith('\\r') ? text.slice(0, -1) : text\r\n newDelta.insert(\r\n text,\r\n omit(op.attributes, ['table', 'table-cell-line']),\r\n )\r\n }\r\n })\r\n }\r\n else {\r\n newDelta.insert(op.insert, op.attributes)\r\n }\r\n\r\n return newDelta\r\n }, new Delta())\r\n\r\n return buildedDelta\r\n}\r\n\r\nfunction replaceStrWhiteSpace(str) {\r\n const isWhiteSpace = value => /^(\\u3000|\\u0020){1}$/.test(value) // 空白字符\r\n let textWithWhiteSpace = ''\r\n let beginHasChar = false\r\n for (const char of str) {\r\n if (isWhiteSpace(char) && !beginHasChar) {\r\n textWithWhiteSpace += '\\u00A0'\r\n }\r\n else {\r\n textWithWhiteSpace += char\r\n beginHasChar = true\r\n }\r\n }\r\n return textWithWhiteSpace\r\n}\r\n\r\nfunction replaceDeltaWhiteSpace(delta, rootBgColor?) {\r\n return delta.reduce((newDelta, op) => {\r\n // fix: 当粘贴文字颜色和编辑器背景色一致且自身无背景色的情况下移除文字颜色样式,避免误导用户粘贴无效\r\n if (\r\n rootBgColor\r\n && op.attributes\r\n && op.attributes.color\r\n && !op.attributes.background\r\n ) {\r\n const originColor = op.attributes.color\r\n const fontColor\r\n = originColor.indexOf('#') === 0 ? hexToRgbA(originColor) : originColor\r\n if (\r\n fontColor === rootBgColor\r\n || (fontColor === 'rgba(255,255,255,1)'\r\n && rootBgColor === 'rgba(0, 0, 0, 0)')\r\n ) {\r\n delete op.attributes.color\r\n }\r\n }\r\n if (op.insert && typeof op.insert === 'string') {\r\n const lines = splitWithBreak(op.insert)\r\n let insertWithWhiteSpace = ''\r\n lines.forEach((text) => {\r\n insertWithWhiteSpace += replaceStrWhiteSpace(text)\r\n })\r\n newDelta.insert(insertWithWhiteSpace, op.attributes)\r\n }\r\n else {\r\n newDelta.insert(op.insert, op.attributes)\r\n }\r\n return newDelta\r\n }, new Delta())\r\n}\r\n\r\nfunction renderStyles(html) {\r\n let htmlString = html\r\n // Trim unnecessary parts.\r\n htmlString = htmlString.substring(\r\n htmlString.indexOf('<html '),\r\n htmlString.length,\r\n )\r\n htmlString = htmlString.substring(\r\n 0,\r\n htmlString.lastIndexOf('</html>') + '</html>'.length,\r\n )\r\n\r\n // Add temporary iframe.\r\n const iframe = document.createElement('iframe')\r\n iframe.style.display = 'none'\r\n document.body.appendChild(iframe)\r\n\r\n const iframeDoc = iframe.contentDocument || iframe.contentWindow.document\r\n iframeDoc.open()\r\n iframeDoc.write(htmlString)\r\n iframeDoc.close()\r\n\r\n let collection\r\n let pointer\r\n const rules\r\n = iframeDoc.styleSheets[iframeDoc.styleSheets.length - 1].cssRules\r\n\r\n // Convert internal styles to inline style of respective node.\r\n for (let idx = 0; idx < rules.length; idx++) {\r\n if ((rules[idx] as CSSStyleRule).selectorText === '') {\r\n continue\r\n }\r\n collection = iframeDoc.body.querySelectorAll(\r\n (rules[idx] as CSSStyleRule).selectorText,\r\n )\r\n\r\n for (pointer = 0; pointer < collection.length; pointer++) {\r\n collection[pointer].style.cssText += (\r\n rules[idx] as CSSStyleRule\r\n ).style.cssText\r\n }\r\n }\r\n\r\n // @ts-ignore\r\n const convertedString = iframeDoc.firstChild.outerHTML\r\n // Remove temporary iframe.\r\n iframe.parentNode.removeChild(iframe)\r\n\r\n return convertedString\r\n}\r\n\r\nexport default CustomClipboard\r\n"],"names":["isNullOrUndefined","BIG_DELTA_LIMIT","insideTable","replaceDeltaImage","imageFileToUrl","imageUrlToFile","ERROR_IMAGE_PLACEHOLDER_EN","ERROR_IMAGE_PLACEHOLDER_CN","splitWithBreak","omit","hexToRgbA"],"mappings":"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"}
@@ -22,16 +22,40 @@ const index$a = require("./strike/index.cjs.js");
22
22
  const index$8 = require("./syntax/index.cjs.js");
23
23
  const betterTable = require("./table/better-table.cjs.js");
24
24
  const index$3 = require("./toolbar/index.cjs.js");
25
+ const is = require("./utils/is.cjs.js");
25
26
  const index$c = require("./video/index.cjs.js");
27
+ const editor_config = require("./config/editor.config.cjs.js");
28
+ const toolbarTip = require("./toolbar/toolbar-tip.cjs.js");
26
29
  const fontStyle = require("./attributors/font-style.cjs.js");
27
30
  const fontSize = require("./attributors/font-size.cjs.js");
28
31
  const lineHeight = require("./attributors/line-height.cjs.js");
29
32
  const textIndent = require("./attributors/text-indent.cjs.js");
33
+ function resolveLanguageOption(options) {
34
+ if (is.isUndefined(options.lang)) {
35
+ options.lang = editor_config.defaultLanguage;
36
+ }
37
+ if (!(options.lang in editor_config.LANG_CONF)) {
38
+ console.warn(`The language ${options.lang} is not supported. Use the default language: ${editor_config.defaultLanguage}`);
39
+ options.lang = editor_config.defaultLanguage;
40
+ }
41
+ return {
42
+ lang: options.lang,
43
+ langText: Object.assign({}, editor_config.LANG_CONF[options.lang], options.langText || {})
44
+ };
45
+ }
30
46
  class FluentEditor extends Quill {
31
47
  constructor(container, options = {}) {
48
+ options = Object.assign(options, resolveLanguageOption(options || {}));
32
49
  super(container, options);
33
50
  this.isFullscreen = false;
34
51
  }
52
+ changeLanguage(options) {
53
+ const langOps = resolveLanguageOption(options);
54
+ if (langOps.lang === this.options.lang) return;
55
+ this.options.lang = langOps.lang;
56
+ this.options.langText = langOps.langText;
57
+ this.emitter.emit(editor_config.CHANGE_LANGUAGE_EVENT, this.options.lang, this.options.langText);
58
+ }
35
59
  }
36
60
  const registerModules = function() {
37
61
  const Icons = Quill.import("ui/icons");
@@ -115,7 +139,6 @@ const registerModules = function() {
115
139
  },
116
140
  "better-table": {
117
141
  operationMenu: {
118
- items: index.TABLE_RIGHT_MENU_CONFIG,
119
142
  color: true
120
143
  }
121
144
  },
@@ -133,7 +156,8 @@ const registerModules = function() {
133
156
  right: '<i class="icon-text-align-right"></i>'
134
157
  }
135
158
  }
136
- }
159
+ },
160
+ [toolbarTip.ToolbarTip.moduleName]: true
137
161
  }
138
162
  };
139
163
  FluentEditor.register(
@@ -157,6 +181,7 @@ const registerModules = function() {
157
181
  // 'modules/quickmenu': QuickMenu,//暂未开发
158
182
  "modules/syntax": index$8.default,
159
183
  "modules/mathlive": index$9.default,
184
+ [`modules/${toolbarTip.ToolbarTip.moduleName}`]: toolbarTip.ToolbarTip,
160
185
  "formats/strike": index$a.default,
161
186
  "formats/softBreak": index$b.default,
162
187
  "formats/video": index$c.default,