@opentiny/fluent-editor 3.19.1 → 3.20.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 (47) hide show
  1. package/README.md +5 -3
  2. package/es/attributors/font-size.es.js +9 -0
  3. package/es/attributors/font-size.es.js.map +1 -0
  4. package/es/attributors/font-style.es.js +9 -0
  5. package/es/attributors/font-style.es.js.map +1 -0
  6. package/es/attributors/index.es.js +11 -0
  7. package/es/attributors/index.es.js.map +1 -0
  8. package/es/attributors/line-height.es.js +9 -0
  9. package/es/attributors/line-height.es.js.map +1 -0
  10. package/es/attributors/text-indent.es.js +9 -0
  11. package/es/attributors/text-indent.es.js.map +1 -0
  12. package/es/config/icons.config.es.js +4 -4
  13. package/es/config/icons.config.es.js.map +1 -1
  14. package/es/config.es.js +0 -35
  15. package/es/config.es.js.map +1 -1
  16. package/es/fluent-editor.es.js +18 -16
  17. package/es/fluent-editor.es.js.map +1 -1
  18. package/es/screenshot/index.es.js +140 -138
  19. package/es/screenshot/index.es.js.map +1 -1
  20. package/es/table/table-config.es.js +1 -1
  21. package/es/table/table-config.es.js.map +1 -1
  22. package/lib/attributors/font-size.cjs.js +9 -0
  23. package/lib/attributors/font-size.cjs.js.map +1 -0
  24. package/lib/attributors/font-style.cjs.js +9 -0
  25. package/lib/attributors/font-style.cjs.js.map +1 -0
  26. package/lib/attributors/index.cjs.js +11 -0
  27. package/lib/attributors/index.cjs.js.map +1 -0
  28. package/lib/attributors/line-height.cjs.js +9 -0
  29. package/lib/attributors/line-height.cjs.js.map +1 -0
  30. package/lib/attributors/text-indent.cjs.js +9 -0
  31. package/lib/attributors/text-indent.cjs.js.map +1 -0
  32. package/lib/config/icons.config.cjs.js +4 -4
  33. package/lib/config/icons.config.cjs.js.map +1 -1
  34. package/lib/config.cjs.js +0 -35
  35. package/lib/config.cjs.js.map +1 -1
  36. package/lib/fluent-editor.cjs.js +32 -30
  37. package/lib/fluent-editor.cjs.js.map +1 -1
  38. package/lib/screenshot/index.cjs.js +141 -139
  39. package/lib/screenshot/index.cjs.js.map +1 -1
  40. package/lib/table/table-config.cjs.js +1 -1
  41. package/lib/table/table-config.cjs.js.map +1 -1
  42. package/package.json +2 -2
  43. package/theme/style.css +88 -14
  44. package/es/lineheight.es.js +0 -11
  45. package/es/lineheight.es.js.map +0 -1
  46. package/lib/lineheight.cjs.js +0 -11
  47. package/lib/lineheight.cjs.js.map +0 -1
package/lib/config.cjs.js CHANGED
@@ -6,39 +6,6 @@ const enUs = require("./config/i18n/en-us.cjs.js");
6
6
  const zhCn = require("./config/i18n/zh-cn.cjs.js");
7
7
  const localLang = localStorage.getItem("lang") || "zh-cn";
8
8
  const LANG_CONF = localLang === "en-us" ? enUs.EN_US : zhCn.ZH_CN;
9
- const FONT_FAMILY_CONFIG = [
10
- "songti",
11
- "yahei",
12
- "kaiti",
13
- "heiti",
14
- "lishu",
15
- "mono",
16
- "arial",
17
- "arialblack",
18
- "comic",
19
- "impact",
20
- "times"
21
- ];
22
- const FONT_SIZE_CONFIG = [
23
- "12px",
24
- "13px",
25
- "14px",
26
- "15px",
27
- "16px",
28
- "17px",
29
- "18px",
30
- "19px",
31
- "20px",
32
- "22px",
33
- "24px",
34
- "26px",
35
- "29px",
36
- "32px",
37
- "36px",
38
- "40px",
39
- "48px",
40
- "72px"
41
- ];
42
9
  const ICONS_CONFIG = {
43
10
  "undo": icons_config.UNDO_ICON,
44
11
  "redo": icons_config.REDO_ICON,
@@ -158,8 +125,6 @@ function getListValue(value, preListValue) {
158
125
  }
159
126
  return curListValue;
160
127
  }
161
- exports.FONT_FAMILY_CONFIG = FONT_FAMILY_CONFIG;
162
- exports.FONT_SIZE_CONFIG = FONT_SIZE_CONFIG;
163
128
  exports.ICONS_CONFIG = ICONS_CONFIG;
164
129
  exports.LANG_CONF = LANG_CONF;
165
130
  exports.TABLE_RIGHT_MENU_CONFIG = TABLE_RIGHT_MENU_CONFIG;
@@ -1 +1 @@
1
- {"version":3,"file":"config.cjs.js","sources":["../../src/config.ts"],"sourcesContent":["import {\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 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 FORMAT_PAINTER_ICON,\r\n} from './config/icons.config'\r\nimport { isNullOrUndefined } from './config/editor.utils'\r\n\r\nimport { EN_US } from './config/i18n/en-us'\r\nimport { ZH_CN } from './config/i18n/zh-cn'\r\nconst localLang = localStorage.getItem('lang') || 'zh-cn'\r\nexport const LANG_CONF = localLang === 'en-us' ? EN_US : ZH_CN\r\n\r\nexport const FONT_FAMILY_CONFIG = [\r\n 'songti',\r\n 'yahei',\r\n 'kaiti',\r\n 'heiti',\r\n 'lishu',\r\n 'mono',\r\n 'arial',\r\n 'arialblack',\r\n 'comic',\r\n 'impact',\r\n 'times',\r\n]\r\n\r\nexport const FONT_SIZE_CONFIG = [\r\n '12px',\r\n '13px',\r\n '14px',\r\n '15px',\r\n '16px',\r\n '17px',\r\n '18px',\r\n '19px',\r\n '20px',\r\n '22px',\r\n '24px',\r\n '26px',\r\n '29px',\r\n '32px',\r\n '36px',\r\n '40px',\r\n '48px',\r\n '72px',\r\n]\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 '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"],"names":["EN_US","ZH_CN","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","EMOJI_ICON","HELP_ICON","SCREENSHOT_ICON","FORMAT_PAINTER_ICON","isNullOrUndefined"],"mappings":";;;;;;AAmCA,MAAM,YAAY,aAAa,QAAQ,MAAM,KAAK;AACrC,MAAA,YAAY,cAAc,UAAUA,KAAAA,QAAQC,KAAA;AAElD,MAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,eAAuC;AAAA,EAClD,QAAQC,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,SAASC,aAAA;AAAA,EACT,QAAQC,aAAA;AAAA,EACR,cAAcC,aAAA;AAAA,EACd,kBAAkBC,aAAA;AACpB;AAEO,MAAM,0BAA0B;AAAA,EACrC,WAAW;AAAA,IACT,MAAM,UAAU,YAAY;AAAA,EAC9B;AAAA,EACA,WAAW;AAAA,IACT,MAAM,UAAU,YAAY;AAAA,EAC9B;AAAA,EACA,UAAU;AAAA,IACR,MAAM,UAAU,WAAW;AAAA,EAC7B;AAAA,EACA,YAAY;AAAA,IACV,MAAM,UAAU,aAAa;AAAA,EAC/B;AAAA,EACA,aAAa;AAAA,IACX,MAAM,UAAU,eAAe;AAAA,EACjC;AAAA,EACA,eAAe;AAAA,IACb,MAAM,UAAU,iBAAiB;AAAA,EACnC;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM,UAAU,oBAAoB;AAAA,EACtC;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAM,UAAU,qBAAqB;AAAA,EACvC;AAAA,EACA,YAAY;AAAA,IACV,MAAM,UAAU,aAAa;AAAA,EAC/B;AAAA,EACA,cAAc;AAAA,IACZ,MAAM,UAAU,eAAe;AAAA,EACjC;AAAA,EACA,WAAW;AAAA,IACT,MAAM,UAAU,YAAY;AAAA,EAC9B;AAAA,EACA,cAAc;AAAA,IACZ,MAAM,UAAU,eAAe;AAAA,EACjC;AAAA,EACA,aAAa;AAAA,IACX,MAAM,UAAU,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;;;;;;;;"}
1
+ {"version":3,"file":"config.cjs.js","sources":["../../src/config.ts"],"sourcesContent":["import {\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 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 FORMAT_PAINTER_ICON,\r\n} from './config/icons.config'\r\nimport { isNullOrUndefined } from './config/editor.utils'\r\n\r\nimport { EN_US } from './config/i18n/en-us'\r\nimport { ZH_CN } from './config/i18n/zh-cn'\r\nconst localLang = localStorage.getItem('lang') || 'zh-cn'\r\nexport const LANG_CONF = localLang === 'en-us' ? EN_US : ZH_CN\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 '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"],"names":["EN_US","ZH_CN","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","EMOJI_ICON","HELP_ICON","SCREENSHOT_ICON","FORMAT_PAINTER_ICON","isNullOrUndefined"],"mappings":"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"}
@@ -2,33 +2,34 @@
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const Quill = require("quill");
4
4
  const config = require("./config.cjs.js");
5
- const index$3 = require("./counter/index.cjs.js");
5
+ const index$4 = require("./counter/index.cjs.js");
6
6
  const customClipboard = require("./custom-clipboard.cjs.js");
7
7
  const BlotFormatter = require("./custom-image/BlotFormatter.cjs.js");
8
8
  const CustomImageSpec = require("./custom-image/specs/CustomImageSpec.cjs.js");
9
9
  const customUploader = require("./custom-uploader.cjs.js");
10
- const index$7 = require("./emoji/index.cjs.js");
11
- const index$2 = require("./file/index.cjs.js");
12
- const lineheight = require("./lineheight.cjs.js");
13
- const index$8 = require("./link/index.cjs.js");
10
+ const index$5 = require("./emoji/index.cjs.js");
11
+ const index$3 = require("./file/index.cjs.js");
12
+ const index$6 = require("./link/index.cjs.js");
14
13
  const Mention = require("./mention/Mention.cjs.js");
15
- const index$5 = require("./soft-break/index.cjs.js");
16
- const index$4 = require("./strike/index.cjs.js");
14
+ const index$1 = require("./screenshot/index.cjs.js");
15
+ const index$9 = require("./soft-break/index.cjs.js");
16
+ const index$8 = require("./strike/index.cjs.js");
17
17
  const betterTable = require("./table/better-table.cjs.js");
18
- const index$9 = require("./syntax/index.cjs.js");
19
- const index$1 = require("./toolbar/index.cjs.js");
20
- const index$6 = require("./video/index.cjs.js");
18
+ const index$7 = require("./syntax/index.cjs.js");
19
+ const index$2 = require("./toolbar/index.cjs.js");
20
+ const index$a = require("./video/index.cjs.js");
21
21
  const index = require("./format-painter/index.cjs.js");
22
+ require("./attributors/index.cjs.js");
23
+ const fontStyle = require("./attributors/font-style.cjs.js");
24
+ const fontSize = require("./attributors/font-size.cjs.js");
25
+ const lineHeight = require("./attributors/line-height.cjs.js");
26
+ const textIndent = require("./attributors/text-indent.cjs.js");
22
27
  class FluentEditor extends Quill {
23
28
  constructor(container, options = {}) {
24
29
  super(container, options);
25
30
  }
26
31
  }
27
32
  const registerModules = function() {
28
- const FontClass = Quill.imports["formats/font"];
29
- FontClass.whitelist = config.FONT_FAMILY_CONFIG;
30
- const SizeStyle = Quill.imports["attributors/style/size"];
31
- SizeStyle.whitelist = config.FONT_SIZE_CONFIG;
32
33
  const Icons = Quill.imports["ui/icons"];
33
34
  const iconKeys = Object.keys(config.ICONS_CONFIG);
34
35
  iconKeys.forEach((iconKey) => {
@@ -98,7 +99,8 @@ const registerModules = function() {
98
99
  this.quill.format("list", curListValue, Quill.sources.USER);
99
100
  }
100
101
  },
101
- [index.FormatPainter.toolName]: index.FormatPainter
102
+ [index.FormatPainter.toolName]: index.FormatPainter,
103
+ [index$1.Screenshot.toolName]: index$1.Screenshot
102
104
  }
103
105
  },
104
106
  "better-table": {
@@ -126,7 +128,7 @@ const registerModules = function() {
126
128
  };
127
129
  FluentEditor.register(
128
130
  {
129
- "modules/toolbar": index$1.default,
131
+ "modules/toolbar": index$2.default,
130
132
  "modules/mention": Mention.default,
131
133
  "modules/better-table": betterTable.default,
132
134
  "modules/clipboard": customClipboard.default,
@@ -134,24 +136,24 @@ const registerModules = function() {
134
136
  // 三者关联性最强
135
137
  "modules/image": BlotFormatter.default,
136
138
  // 三者关联性最强
137
- "modules/file": index$2.default,
139
+ "modules/file": index$3.default,
138
140
  // 三者关联性最强
139
- "modules/counter": index$3.default,
140
- "formats/font": FontClass,
141
- "formats/size": SizeStyle,
142
- "formats/strike": index$4.default,
143
- "formats/softBreak": index$5.default,
144
- "formats/lineheight": lineheight.default,
145
- "formats/video": index$6.default,
146
- "formats/emoji": index$7.default.EmojiBlot,
147
- "modules/emoji-toolbar": index$7.default.ToolbarEmoji,
148
- "modules/emoji-shortname": index$7.default.ShortNameEmoji,
141
+ "modules/counter": index$4.default,
142
+ "modules/emoji-toolbar": index$5.default.ToolbarEmoji,
143
+ "modules/emoji-shortname": index$5.default.ShortNameEmoji,
149
144
  // 'modules/global-link': GlobalLink,//暂未开发
150
- "modules/link": index$8.default,
145
+ "modules/link": index$6.default,
151
146
  // 报错
152
- // 'modules/screenshot': Screenshot,//暂未开发
153
147
  // 'modules/quickmenu': QuickMenu,//暂未开发
154
- "modules/syntax": index$9.default
148
+ "modules/syntax": index$7.default,
149
+ "formats/strike": index$8.default,
150
+ "formats/softBreak": index$9.default,
151
+ "formats/video": index$a.default,
152
+ "formats/emoji": index$5.default.EmojiBlot,
153
+ "formats/font": fontStyle.FontStyle,
154
+ "formats/size": fontSize.SizeStyle,
155
+ "formats/line-height": lineHeight.LineHeightStyle,
156
+ "formats/text-indent": textIndent.TextIndentStyle
155
157
  },
156
158
  true
157
159
  // 覆盖内部模块
@@ -1 +1 @@
1
- {"version":3,"file":"fluent-editor.cjs.js","sources":["../../src/fluent-editor.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport type { Module, Parchment as TypeParchment } from 'quill'\r\nimport { FONT_FAMILY_CONFIG, FONT_SIZE_CONFIG, ICONS_CONFIG, TABLE_RIGHT_MENU_CONFIG, inputFile, getListValue } from './config'\r\nimport Counter from './counter' // 字符统计\r\nimport CustomClipboard from './custom-clipboard' // 粘贴板\r\nimport CustomImage from './custom-image/BlotFormatter' // 图片\r\nimport { CustomImageSpec } from './custom-image/specs/CustomImageSpec' // 图片拉伸模块\r\nimport CustomUploader from './custom-uploader' // 上传\r\nimport Emoji from './emoji' // 表情\r\nimport FileModule from './file' // 文件\r\n// import GlobalLink from './global-link' // 全局链接\r\nimport LineHeightStyle from './lineheight'\r\nimport Link from './link' // 超链接0\r\nimport Mention from './mention/Mention' // @提醒\r\n// import QuickMenu from './quick-menu' // 快捷菜单\r\n// import Screenshot from './screenshot' // 截图\r\nimport SoftBreak from './soft-break' // 软回车\r\nimport Strike from './strike' // 删除线\r\nimport BetterTable from './table/better-table' // 表格\r\nimport CustomSyntax from './syntax' // 代码块高亮\r\nimport Toolbar from './toolbar' // 工具栏\r\nimport Video from './video' // 视频\r\nimport { FormatPainter } from './format-painter'\r\nimport { IEditorConfig } from './config/types'\r\n\r\nclass FluentEditor extends Quill {\r\n constructor(container: HTMLElement | string, options: IEditorConfig = {}) {\r\n super(container, options)\r\n }\r\n}\r\n\r\nconst registerModules = function () {\r\n const FontClass = Quill.imports['formats/font'] as TypeParchment.ClassAttributor\r\n FontClass.whitelist = FONT_FAMILY_CONFIG\r\n\r\n const SizeStyle = Quill.imports['attributors/style/size'] as TypeParchment.StyleAttributor\r\n // const SizeClass = Quill.imports['attributors/class/size']\r\n SizeStyle.whitelist = FONT_SIZE_CONFIG\r\n\r\n const Icons = Quill.imports['ui/icons']\r\n const iconKeys = Object.keys(ICONS_CONFIG)\r\n iconKeys.forEach((iconKey) => {\r\n Icons[iconKey] = ICONS_CONFIG[iconKey]\r\n })\r\n\r\n const SnowTheme = Quill.imports['themes/snow'] as typeof Module\r\n SnowTheme.DEFAULTS = {\r\n modules: {\r\n 'keyboard': {\r\n bindings: {\r\n ...BetterTable.keyboardBindings,\r\n },\r\n },\r\n 'toolbar': {\r\n handlers: {\r\n ...(SnowTheme.DEFAULTS as Record<string, any>).modules.toolbar.handlers,\r\n 'undo': function () {\r\n this.quill.history.undo()\r\n },\r\n 'redo': function () {\r\n this.quill.history.redo()\r\n },\r\n 'better-table': function () {\r\n this.quill.getModule('better-table').insertTable(3, 3)\r\n },\r\n 'file': function () {\r\n const accept = this.quill.options?.uploadOption?.fileAccept\r\n inputFile.call(this, 'file', accept)\r\n },\r\n 'image': function () {\r\n const accept = this.quill.options?.uploadOption?.imageAccept\r\n inputFile.call(this, 'image', accept)\r\n },\r\n 'emoji': function () {},\r\n 'fullscreen': function () {},\r\n 'list': function (value) {\r\n const range = this.quill.getSelection()\r\n const formats = this.quill.getFormat(range)\r\n const preListValue = Array.isArray(formats.list) ? formats.list[0]?.value : formats.list?.value\r\n const curListValue = getListValue(value, preListValue)\r\n // 如果设置list的选区中有表格,判断第一个table-col位置,将表格前的内容设置为list格式\r\n const lines = this.quill.getLines(range.index, range.length)\r\n const tableCols = lines.filter(line => line.statics.blotName === 'table-col' && !line.prev)\r\n if (tableCols.length) {\r\n let start = range.index\r\n // 遍历table-col群组,以之获取表格,将表格前选区设置为对应list格式\r\n tableCols.forEach((item, index) => {\r\n const table = item.domNode.closest('table.quill-better-table')\r\n const tableBlot = Quill.find(table) as TypeParchment.Blot\r\n const tableLength = tableBlot.length()\r\n const tableStart = this.quill.getIndex(item)\r\n const tableEnd = tableStart + tableLength\r\n const beforeTableRangeLength = tableStart - start\r\n // 在表格前设置列表\r\n this.quill.setSelection(start, beforeTableRangeLength, Quill.sources.SILENT)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n table.parentNode.classList.remove('quill-better-table-selected')\r\n // 当前表格末尾为下一个选取的开始\r\n start = tableEnd\r\n if (index === tableCols.length - 1) {\r\n // 将最后一个表格之后所有选区内容设置list格式\r\n this.quill.setSelection(tableEnd, range.index + range.length - tableEnd)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n })\r\n }\r\n else {\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n },\r\n [FormatPainter.toolName]: FormatPainter,\r\n },\r\n },\r\n 'better-table': {\r\n operationMenu: {\r\n items: TABLE_RIGHT_MENU_CONFIG,\r\n color: true,\r\n },\r\n },\r\n 'image': {\r\n specs: [CustomImageSpec],\r\n overlay: {\r\n style: {\r\n border: '1px dashed rgb(68, 68, 68)',\r\n },\r\n },\r\n align: {\r\n icons: {\r\n left: '<i class=\"icon-text-align-left\"></i>',\r\n center: '<i class=\"icon-text-align-center\"></i>',\r\n right: '<i class=\"icon-text-align-right\"></i>',\r\n },\r\n },\r\n },\r\n },\r\n }\r\n\r\n FluentEditor.register(\r\n {\r\n 'modules/toolbar': Toolbar,\r\n 'modules/mention': Mention,\r\n 'modules/better-table': BetterTable,\r\n 'modules/clipboard': CustomClipboard,\r\n 'modules/uploader': CustomUploader, // 三者关联性最强\r\n 'modules/image': CustomImage, // 三者关联性最强\r\n 'modules/file': FileModule, // 三者关联性最强\r\n 'modules/counter': Counter,\r\n 'formats/font': FontClass,\r\n 'formats/size': SizeStyle,\r\n 'formats/strike': Strike,\r\n 'formats/softBreak': SoftBreak,\r\n 'formats/lineheight': LineHeightStyle,\r\n 'formats/video': Video,\r\n 'formats/emoji': Emoji.EmojiBlot,\r\n 'modules/emoji-toolbar': Emoji.ToolbarEmoji,\r\n 'modules/emoji-shortname': Emoji.ShortNameEmoji,\r\n // 'modules/global-link': GlobalLink,//暂未开发\r\n 'modules/link': Link, // 报错\r\n // 'modules/screenshot': Screenshot,//暂未开发\r\n // 'modules/quickmenu': QuickMenu,//暂未开发\r\n 'modules/syntax': CustomSyntax,\r\n },\r\n true, // 覆盖内部模块\r\n )\r\n\r\n return FluentEditor\r\n}\r\n\r\nexport default registerModules()\r\n"],"names":["FONT_FAMILY_CONFIG","FONT_SIZE_CONFIG","ICONS_CONFIG","BetterTable","inputFile","getListValue","index","FormatPainter","TABLE_RIGHT_MENU_CONFIG","CustomImageSpec","Toolbar","Mention","CustomClipboard","CustomUploader","CustomImage","FileModule","Counter","Strike","SoftBreak","LineHeightStyle","Video","Emoji","Link","CustomSyntax"],"mappings":"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"}
1
+ {"version":3,"file":"fluent-editor.cjs.js","sources":["../../src/fluent-editor.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport type { Module, Parchment as TypeParchment } from 'quill'\r\nimport { ICONS_CONFIG, TABLE_RIGHT_MENU_CONFIG, inputFile, getListValue } from './config'\r\nimport Counter from './counter' // 字符统计\r\nimport CustomClipboard from './custom-clipboard' // 粘贴板\r\nimport CustomImage from './custom-image/BlotFormatter' // 图片\r\nimport { CustomImageSpec } from './custom-image/specs/CustomImageSpec' // 图片拉伸模块\r\nimport CustomUploader from './custom-uploader' // 上传\r\nimport Emoji from './emoji' // 表情\r\nimport FileModule from './file' // 文件\r\n// import GlobalLink from './global-link' // 全局链接\r\nimport Link from './link' // 超链接0\r\nimport Mention from './mention/Mention' // @提醒\r\n// import QuickMenu from './quick-menu' // 快捷菜单\r\nimport { Screenshot } from './screenshot'// 截图\r\nimport SoftBreak from './soft-break' // 软回车\r\nimport Strike from './strike' // 删除线\r\nimport BetterTable from './table/better-table' // 表格\r\nimport CustomSyntax from './syntax' // 代码块高亮\r\nimport Toolbar from './toolbar' // 工具栏\r\nimport Video from './video' // 视频\r\nimport { FormatPainter } from './format-painter'\r\nimport { IEditorConfig } from './config/types'\r\nimport { LineHeightStyle, SizeStyle, FontStyle, TextIndentStyle } from './attributors'\r\n\r\nclass FluentEditor extends Quill {\r\n constructor(container: HTMLElement | string, options: IEditorConfig = {}) {\r\n super(container, options)\r\n }\r\n}\r\n\r\nconst registerModules = function () {\r\n const Icons = Quill.imports['ui/icons']\r\n const iconKeys = Object.keys(ICONS_CONFIG)\r\n iconKeys.forEach((iconKey) => {\r\n Icons[iconKey] = ICONS_CONFIG[iconKey]\r\n })\r\n\r\n const SnowTheme = Quill.imports['themes/snow'] as typeof Module\r\n SnowTheme.DEFAULTS = {\r\n modules: {\r\n 'keyboard': {\r\n bindings: {\r\n ...BetterTable.keyboardBindings,\r\n },\r\n },\r\n 'toolbar': {\r\n handlers: {\r\n ...(SnowTheme.DEFAULTS as Record<string, any>).modules.toolbar.handlers,\r\n 'undo': function () {\r\n this.quill.history.undo()\r\n },\r\n 'redo': function () {\r\n this.quill.history.redo()\r\n },\r\n 'better-table': function () {\r\n this.quill.getModule('better-table').insertTable(3, 3)\r\n },\r\n 'file': function () {\r\n const accept = this.quill.options?.uploadOption?.fileAccept\r\n inputFile.call(this, 'file', accept)\r\n },\r\n 'image': function () {\r\n const accept = this.quill.options?.uploadOption?.imageAccept\r\n inputFile.call(this, 'image', accept)\r\n },\r\n 'emoji': function () {},\r\n 'fullscreen': function () {},\r\n 'list': function (value) {\r\n const range = this.quill.getSelection()\r\n const formats = this.quill.getFormat(range)\r\n const preListValue = Array.isArray(formats.list) ? formats.list[0]?.value : formats.list?.value\r\n const curListValue = getListValue(value, preListValue)\r\n // 如果设置list的选区中有表格,判断第一个table-col位置,将表格前的内容设置为list格式\r\n const lines = this.quill.getLines(range.index, range.length)\r\n const tableCols = lines.filter(line => line.statics.blotName === 'table-col' && !line.prev)\r\n if (tableCols.length) {\r\n let start = range.index\r\n // 遍历table-col群组,以之获取表格,将表格前选区设置为对应list格式\r\n tableCols.forEach((item, index) => {\r\n const table = item.domNode.closest('table.quill-better-table')\r\n const tableBlot = Quill.find(table) as TypeParchment.Blot\r\n const tableLength = tableBlot.length()\r\n const tableStart = this.quill.getIndex(item)\r\n const tableEnd = tableStart + tableLength\r\n const beforeTableRangeLength = tableStart - start\r\n // 在表格前设置列表\r\n this.quill.setSelection(start, beforeTableRangeLength, Quill.sources.SILENT)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n table.parentNode.classList.remove('quill-better-table-selected')\r\n // 当前表格末尾为下一个选取的开始\r\n start = tableEnd\r\n if (index === tableCols.length - 1) {\r\n // 将最后一个表格之后所有选区内容设置list格式\r\n this.quill.setSelection(tableEnd, range.index + range.length - tableEnd)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n })\r\n }\r\n else {\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n },\r\n [FormatPainter.toolName]: FormatPainter,\r\n [Screenshot.toolName]: Screenshot,\r\n },\r\n },\r\n 'better-table': {\r\n operationMenu: {\r\n items: TABLE_RIGHT_MENU_CONFIG,\r\n color: true,\r\n },\r\n },\r\n 'image': {\r\n specs: [CustomImageSpec],\r\n overlay: {\r\n style: {\r\n border: '1px dashed rgb(68, 68, 68)',\r\n },\r\n },\r\n align: {\r\n icons: {\r\n left: '<i class=\"icon-text-align-left\"></i>',\r\n center: '<i class=\"icon-text-align-center\"></i>',\r\n right: '<i class=\"icon-text-align-right\"></i>',\r\n },\r\n },\r\n },\r\n },\r\n }\r\n\r\n FluentEditor.register(\r\n {\r\n 'modules/toolbar': Toolbar,\r\n 'modules/mention': Mention,\r\n 'modules/better-table': BetterTable,\r\n 'modules/clipboard': CustomClipboard,\r\n 'modules/uploader': CustomUploader, // 三者关联性最强\r\n 'modules/image': CustomImage, // 三者关联性最强\r\n 'modules/file': FileModule, // 三者关联性最强\r\n 'modules/counter': Counter,\r\n 'modules/emoji-toolbar': Emoji.ToolbarEmoji,\r\n 'modules/emoji-shortname': Emoji.ShortNameEmoji,\r\n // 'modules/global-link': GlobalLink,//暂未开发\r\n 'modules/link': Link, // 报错\r\n // 'modules/quickmenu': QuickMenu,//暂未开发\r\n 'modules/syntax': CustomSyntax,\r\n\r\n 'formats/strike': Strike,\r\n 'formats/softBreak': SoftBreak,\r\n 'formats/video': Video,\r\n 'formats/emoji': Emoji.EmojiBlot,\r\n 'formats/font': FontStyle,\r\n 'formats/size': SizeStyle,\r\n 'formats/line-height': LineHeightStyle,\r\n 'formats/text-indent': TextIndentStyle,\r\n },\r\n true, // 覆盖内部模块\r\n )\r\n\r\n return FluentEditor\r\n}\r\n\r\nexport default registerModules()\r\n"],"names":["ICONS_CONFIG","BetterTable","inputFile","getListValue","index","FormatPainter","Screenshot","TABLE_RIGHT_MENU_CONFIG","CustomImageSpec","Toolbar","Mention","CustomClipboard","CustomUploader","CustomImage","FileModule","Counter","Emoji","Link","CustomSyntax","Strike","SoftBreak","Video","FontStyle","SizeStyle","LineHeightStyle","TextIndentStyle"],"mappings":"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"}
@@ -1,147 +1,149 @@
1
1
  "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const Quill = require("quill");
4
- const editor_utils = require("../config/editor.utils.cjs.js");
5
4
  const Delta = Quill.import("delta");
6
- const _Screenshot = class _Screenshot {
7
- constructor(quill, options = {}, range) {
8
- this.quill = quill;
9
- this.options = options;
10
- this.leftClickLockFlag = false;
11
- this.removeContextmenu = (event) => {
12
- event.preventDefault();
13
- this.mask.remove();
14
- document.removeEventListener("contextmenu", this.removeContextmenu);
15
- };
16
- this.toggleRect = (event) => {
17
- if (event.button === 2) {
18
- document.removeEventListener("mousemove", this.drawRect);
19
- document.removeEventListener("mousedown", this.toggleRect);
20
- document.addEventListener("contextmenu", this.removeContextmenu);
21
- return;
22
- }
23
- if (!this.leftClickLockFlag) {
24
- if (this.start) {
25
- document.removeEventListener("mousemove", this.drawRect);
26
- const doneBtn = document.createElement("div");
27
- doneBtn.innerHTML = `<span class="ql-screenshot-ok"></span><span class="ql-screenshot-cancel"></span>`;
28
- doneBtn.className = "ql-screenshot-done";
29
- doneBtn.addEventListener("click", this.afterShotCtrl);
30
- this.coordinate.remove();
31
- this.cutter.appendChild(doneBtn);
32
- this.leftClickLockFlag = true;
33
- } else {
34
- this.start = { x: event.clientX, y: event.clientY };
35
- this.cutter.style.left = `${this.start.x}px`;
36
- this.cutter.style.top = `${this.start.y}px`;
37
- document.addEventListener("mousemove", this.drawRect);
38
- }
39
- }
40
- };
41
- this.drawRect = (event) => {
42
- this.width = event.clientX - this.start.x;
43
- this.height = event.clientY - this.start.y;
44
- this.cutter.style.width = `${this.width}px`;
45
- this.cutter.style.height = `${this.height}px`;
46
- this.coordinate.innerHTML = `${this.width}<br>${this.height}`;
47
- };
48
- this.afterShotCtrl = (event) => {
49
- document.removeEventListener("mousedown", this.toggleRect);
50
- this.mask.remove();
51
- const target = event.target;
52
- if (target && target.className === "ql-screenshot-ok") {
53
- const rect = {
54
- x: this.start.x,
55
- y: this.start.y,
56
- width: this.width,
57
- height: this.height,
58
- scrollX: document.body.scrollLeft,
59
- scrollY: document.body.scrollTop,
60
- allowTaint: true,
61
- // 是否允许跨域图片渲染
62
- logging: false
63
- // 是否启用日志记录
64
- };
65
- this.renderImage(rect);
66
- }
67
- this.start = void 0;
68
- };
69
- if (this.options.Html2Canvas == null) {
70
- throw new Error(
71
- "ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor."
72
- );
73
- }
74
- this.range = range;
5
+ const resolveOptions = (options) => {
6
+ return Object.assign({
7
+ // @ts-ignore
8
+ Html2Canvas: window.Html2Canvas,
9
+ useCORS: true,
10
+ foreignObjectRendering: true,
11
+ beforeCreateImage: void 0,
12
+ beforeCreateCanvas: void 0
13
+ }, options);
14
+ };
15
+ function init() {
16
+ const maskExits = document.querySelectorAll(".ql-screenshot-mask");
17
+ if (maskExits) {
18
+ maskExits.forEach((item) => item && item.remove());
75
19
  }
76
- init() {
77
- const maskExits = document.querySelectorAll(".ql-screenshot-mask");
78
- if (maskExits) {
79
- maskExits.forEach((item) => item && item.remove());
80
- }
81
- this.mask = document.createElement("div");
82
- this.mask.className = "ql-screenshot-mask";
83
- this.cutter = document.createElement("div");
84
- this.cutter.className = "ql-screenshot-cutter";
85
- this.coordinate = document.createElement("p");
86
- this.coordinate.className = "ql-screenshot-coordinate";
87
- this.insertBlock();
88
- this.cutter.appendChild(this.coordinate);
89
- this.mask.appendChild(this.cutter);
90
- document.body.appendChild(this.mask);
91
- document.addEventListener("mousedown", this.toggleRect);
20
+ const wrapper = document.createElement("div");
21
+ wrapper.classList.add("ql-screenshot-wrapper");
22
+ const mask = document.createElement("div");
23
+ mask.className = "ql-screenshot-mask";
24
+ const cutter = document.createElement("div");
25
+ cutter.className = "ql-screenshot-cutter";
26
+ const coordinate = document.createElement("p");
27
+ coordinate.className = "ql-screenshot-coordinate";
28
+ cutter.appendChild(coordinate);
29
+ wrapper.appendChild(mask);
30
+ wrapper.appendChild(cutter);
31
+ document.body.appendChild(wrapper);
32
+ document.body.style.overflow = "hidden";
33
+ return { wrapper, mask, cutter, coordinate };
34
+ }
35
+ async function renderImage(Html2Canvas, html2canvasOptions, rect, options) {
36
+ if (options && options.beforeCreateCanvas) {
37
+ await options.beforeCreateCanvas();
92
38
  }
93
- insertBlock() {
94
- for (let i = 0; i < 7; i++) {
95
- const blockItem = document.createElement("div");
96
- blockItem.className = "ql-screenshot-border-block";
97
- this.cutter.appendChild(blockItem);
98
- }
39
+ const canvas = await Html2Canvas(document.body, html2canvasOptions);
40
+ let cropCanvas = document.createElement("canvas");
41
+ cropCanvas.width = rect.width;
42
+ cropCanvas.height = rect.height;
43
+ const cropCanvasCtx = cropCanvas.getContext("2d");
44
+ cropCanvasCtx.drawImage(
45
+ canvas,
46
+ rect.x + window.scrollX,
47
+ rect.y + window.scrollY,
48
+ rect.width,
49
+ rect.height,
50
+ 0,
51
+ 0,
52
+ rect.width,
53
+ rect.height
54
+ );
55
+ if (options && options.beforeCreateImage) {
56
+ cropCanvas = await options.beforeCreateImage(cropCanvas);
99
57
  }
100
- renderImage(rect) {
101
- if (editor_utils.isPureIE) {
102
- this.options.Html2Canvas(document.body, rect).then((canvas) => this.insertEditor(canvas));
103
- } else {
104
- this.options.Html2Canvas(document.body, {
105
- allowTaint: true,
106
- // 是否允许跨域图片渲染
107
- foreignObjectRendering: this.quill.options.screenshotOnStaticPage,
108
- // 是否使用svg方式
109
- logging: false
110
- // 是否启用日志记录
111
- }).then((canvas) => {
112
- const cropCanvas = document.createElement("canvas");
113
- cropCanvas.width = this.width;
114
- cropCanvas.height = this.height;
115
- const cropCanvasCtx = cropCanvas.getContext("2d");
116
- cropCanvasCtx.drawImage(
117
- canvas,
118
- rect.x + window.scrollX,
119
- rect.y + window.scrollY,
120
- this.width,
121
- this.height,
122
- 0,
123
- 0,
124
- this.width,
125
- this.height
126
- );
127
- this.insertEditor(cropCanvas);
128
- cropCanvas.remove();
129
- });
130
- }
58
+ return typeof cropCanvas === "string" ? cropCanvas : cropCanvas.toDataURL();
59
+ }
60
+ function Screenshot() {
61
+ this.quill.options.screenshot = resolveOptions(this.quill.options.screenshot);
62
+ const options = this.quill.options.screenshot;
63
+ const { Html2Canvas, beforeCreateImage, beforeCreateCanvas, ...html2CanvasOptions } = options;
64
+ if (!Html2Canvas) {
65
+ throw new Error("ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.");
131
66
  }
132
- insertEditor(canvas) {
133
- const image = canvas.toDataURL();
134
- const delta = new Delta().retain(this.range.index).delete(this.range.length).insert({ image });
135
- this.quill.updateContents(delta, Quill.sources.USER);
136
- this.quill.setSelection(this.range.index + 1, Quill.sources.SILENT);
137
- }
138
- };
139
- _Screenshot.DEFAULTS = {
140
- Html2Canvas: (() => {
141
- return window.Html2Canvas;
142
- })(),
143
- screenshotOnStaticPage: false
144
- };
145
- let Screenshot = _Screenshot;
146
- exports.default = Screenshot;
67
+ const range = this.quill.getSelection(true);
68
+ const { wrapper, mask, cutter, coordinate } = init();
69
+ const status = {
70
+ leftClickLockFlag: false,
71
+ start: void 0
72
+ };
73
+ const removeContextmenu = (event) => {
74
+ event.preventDefault();
75
+ wrapper.remove();
76
+ document.removeEventListener("contextmenu", removeContextmenu);
77
+ };
78
+ const afterShotCtrl = async (event) => {
79
+ document.removeEventListener("mousedown", toggleRect);
80
+ Object.assign(document.body.style, { overflow: null });
81
+ const cutterRect = cutter.getBoundingClientRect();
82
+ const target = event.target;
83
+ wrapper.remove();
84
+ if (target && target.className === "ql-screenshot-confirm") {
85
+ const image = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage });
86
+ const delta = new Delta().retain(range.index).delete(range.length).insert({ image });
87
+ this.quill.updateContents(delta, Quill.sources.USER);
88
+ this.quill.setSelection(range.index + 1, Quill.sources.SILENT);
89
+ }
90
+ status.start = void 0;
91
+ };
92
+ const drawRect = (event) => {
93
+ const startX = status.start.x;
94
+ const startY = status.start.y;
95
+ const endX = event.clientX;
96
+ const endY = event.clientY;
97
+ const width = Math.abs(endX - startX);
98
+ const height = Math.abs(endY - startY);
99
+ const top = startY < endY ? startY : endY;
100
+ const left = startX < endX ? startX : endX;
101
+ const bottom = window.innerHeight - height - top;
102
+ const right = window.innerWidth - width - left;
103
+ const maskPath = `
104
+ linear-gradient(to top, #fff, #fff) top / 100% ${top}px,
105
+ linear-gradient(to bottom, #fff, #fff) bottom /100% ${bottom}px,
106
+ linear-gradient(to left, #fff, #fff) left / ${left}px 100%,
107
+ linear-gradient(to right, #fff, #fff) right / ${right}px 100%
108
+ `;
109
+ Object.assign(cutter.style, {
110
+ width: `${width}px`,
111
+ height: `${height}px`,
112
+ left: `${left}px`,
113
+ top: `${top}px`
114
+ });
115
+ Object.assign(mask.style, {
116
+ "mask": maskPath,
117
+ "-webkit-mask-repeat": "no-repeat"
118
+ });
119
+ coordinate.textContent = `${width}, ${height}`;
120
+ };
121
+ const toggleRect = (event) => {
122
+ if (event.button === 2) {
123
+ document.removeEventListener("mousemove", drawRect);
124
+ document.removeEventListener("mousedown", toggleRect);
125
+ console.log("right");
126
+ document.addEventListener("contextmenu", removeContextmenu);
127
+ return;
128
+ }
129
+ if (!status.leftClickLockFlag) {
130
+ if (status.start) {
131
+ document.removeEventListener("mousemove", drawRect);
132
+ const doneBtn = document.createElement("div");
133
+ doneBtn.innerHTML = `<div class="ql-screenshot-confirm"></div><div class="ql-screenshot-cancel"></div>`;
134
+ doneBtn.className = "ql-screenshot-done";
135
+ doneBtn.addEventListener("click", afterShotCtrl);
136
+ coordinate.remove();
137
+ cutter.appendChild(doneBtn);
138
+ status.leftClickLockFlag = true;
139
+ } else {
140
+ status.start = { x: event.clientX, y: event.clientY };
141
+ document.addEventListener("mousemove", drawRect);
142
+ }
143
+ }
144
+ };
145
+ document.addEventListener("mousedown", toggleRect);
146
+ }
147
+ Screenshot.toolName = "screenshot";
148
+ exports.Screenshot = Screenshot;
147
149
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/screenshot/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { isPureIE } from '../config/editor.utils'\r\n\r\nconst Delta = Quill.import('delta')\r\n\r\ninterface ScreenShotOptions {\r\n Html2Canvas: any\r\n screenshotOnStaticPage?: boolean\r\n}\r\n\r\nclass Screenshot {\r\n static DEFAULTS = {\r\n Html2Canvas: (() => {\r\n // @ts-ignore\r\n return window.Html2Canvas\r\n })(),\r\n screenshotOnStaticPage: false,\r\n }\r\n\r\n range: any\r\n cutter: HTMLDivElement\r\n mask: HTMLDivElement\r\n coordinate: HTMLDivElement\r\n width: number\r\n height: number\r\n leftClickLockFlag = false\r\n start: {\r\n x: number\r\n y: number\r\n }\r\n\r\n constructor(public quill, protected options: Partial<ScreenShotOptions> = {}, range) {\r\n if (this.options.Html2Canvas == null) {\r\n throw new Error(\r\n 'ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.',\r\n )\r\n }\r\n this.range = range\r\n }\r\n\r\n init() {\r\n const maskExits = document.querySelectorAll('.ql-screenshot-mask')\r\n if (maskExits) {\r\n maskExits.forEach(item => item && item.remove())\r\n }\r\n // 创建截图图层\r\n this.mask = document.createElement('div')\r\n this.mask.className = 'ql-screenshot-mask'\r\n this.cutter = document.createElement('div')\r\n this.cutter.className = 'ql-screenshot-cutter'\r\n this.coordinate = document.createElement('p')\r\n this.coordinate.className = 'ql-screenshot-coordinate'\r\n this.insertBlock()\r\n this.cutter.appendChild(this.coordinate)\r\n this.mask.appendChild(this.cutter)\r\n document.body.appendChild(this.mask)\r\n document.addEventListener('mousedown', this.toggleRect)\r\n }\r\n\r\n insertBlock() {\r\n for (let i = 0; i < 7; i++) {\r\n const blockItem = document.createElement('div')\r\n blockItem.className = 'ql-screenshot-border-block'\r\n this.cutter.appendChild(blockItem)\r\n }\r\n }\r\n\r\n removeContextmenu = (event) => {\r\n event.preventDefault()\r\n this.mask.remove()\r\n document.removeEventListener('contextmenu', this.removeContextmenu)\r\n }\r\n\r\n toggleRect = (event: MouseEvent) => {\r\n // 右键取消截图操作\r\n if (event.button === 2) {\r\n document.removeEventListener('mousemove', this.drawRect)\r\n document.removeEventListener('mousedown', this.toggleRect)\r\n document.addEventListener('contextmenu', this.removeContextmenu)\r\n return\r\n }\r\n if (!this.leftClickLockFlag) {\r\n if (this.start) {\r\n // 如果有起点,则当前触发坐标为终点,移除监听事件并添加确认和取消按钮\r\n document.removeEventListener('mousemove', this.drawRect)\r\n const doneBtn = document.createElement('div')\r\n doneBtn.innerHTML = `<span class=\"ql-screenshot-ok\"></span><span class=\"ql-screenshot-cancel\"></span>`\r\n doneBtn.className = 'ql-screenshot-done'\r\n doneBtn.addEventListener('click', this.afterShotCtrl)\r\n this.coordinate.remove()\r\n this.cutter.appendChild(doneBtn)\r\n this.leftClickLockFlag = true\r\n }\r\n else {\r\n // 无起点则设置起点坐标,监听鼠标移动\r\n this.start = { x: event.clientX, y: event.clientY }\r\n this.cutter.style.left = `${this.start.x}px`\r\n this.cutter.style.top = `${this.start.y}px`\r\n document.addEventListener('mousemove', this.drawRect)\r\n }\r\n }\r\n }\r\n\r\n drawRect = (event: MouseEvent) => {\r\n // 通过鼠标移动描绘截图图层\r\n this.width = event.clientX - this.start.x\r\n this.height = event.clientY - this.start.y\r\n this.cutter.style.width = `${this.width}px`\r\n this.cutter.style.height = `${this.height}px`\r\n this.coordinate.innerHTML = `${this.width}<br>${this.height}`\r\n }\r\n\r\n afterShotCtrl = (event) => {\r\n document.removeEventListener('mousedown', this.toggleRect)\r\n this.mask.remove()\r\n const target = event.target\r\n if (target && target.className === 'ql-screenshot-ok') {\r\n const rect = {\r\n x: this.start.x,\r\n y: this.start.y,\r\n width: this.width,\r\n height: this.height,\r\n scrollX: document.body.scrollLeft,\r\n scrollY: document.body.scrollTop,\r\n allowTaint: true, // 是否允许跨域图片渲染\r\n logging: false, // 是否启用日志记录\r\n }\r\n this.renderImage(rect)\r\n }\r\n this.start = undefined\r\n }\r\n\r\n renderImage(rect) {\r\n if (isPureIE) {\r\n this.options.Html2Canvas(document.body, rect).then(canvas => this.insertEditor(canvas))\r\n }\r\n else {\r\n this.options.Html2Canvas(document.body, {\r\n allowTaint: true, // 是否允许跨域图片渲染\r\n foreignObjectRendering: this.quill.options.screenshotOnStaticPage, // 是否使用svg方式\r\n logging: false, // 是否启用日志记录\r\n }).then((canvas) => {\r\n // 当前canvas为body全局截图,从当前截图中截取想要的部分重新绘制转成base64插入富文本\r\n const cropCanvas = document.createElement('canvas')\r\n cropCanvas.width = this.width\r\n cropCanvas.height = this.height\r\n const cropCanvasCtx = cropCanvas.getContext('2d')\r\n cropCanvasCtx.drawImage(\r\n canvas,\r\n rect.x + window.scrollX,\r\n rect.y + window.scrollY,\r\n this.width,\r\n this.height,\r\n 0,\r\n 0,\r\n this.width,\r\n this.height,\r\n )\r\n this.insertEditor(cropCanvas)\r\n cropCanvas.remove()\r\n })\r\n }\r\n }\r\n\r\n insertEditor(canvas) {\r\n const image = canvas.toDataURL()\r\n const delta = new Delta()\r\n .retain(this.range.index)\r\n .delete(this.range.length)\r\n .insert({ image })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(this.range.index + 1, Quill.sources.SILENT)\r\n }\r\n}\r\n\r\nexport default Screenshot\r\n"],"names":["isPureIE"],"mappings":";;;;AAGA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAOlC,MAAM,cAAN,MAAM,YAAW;AAAA,EAqBf,YAAmB,OAAiB,UAAsC,CAAA,GAAI,OAAO;AAAlE,SAAA,QAAA;AAAiB,SAAA,UAAA;AANhB,SAAA,oBAAA;AA0CpB,SAAA,oBAAoB,CAAC,UAAU;AAC7B,YAAM,eAAe;AACrB,WAAK,KAAK;AACD,eAAA,oBAAoB,eAAe,KAAK,iBAAiB;AAAA,IAAA;AAGpE,SAAA,aAAa,CAAC,UAAsB;AAE9B,UAAA,MAAM,WAAW,GAAG;AACb,iBAAA,oBAAoB,aAAa,KAAK,QAAQ;AAC9C,iBAAA,oBAAoB,aAAa,KAAK,UAAU;AAChD,iBAAA,iBAAiB,eAAe,KAAK,iBAAiB;AAC/D;AAAA,MACF;AACI,UAAA,CAAC,KAAK,mBAAmB;AAC3B,YAAI,KAAK,OAAO;AAEL,mBAAA,oBAAoB,aAAa,KAAK,QAAQ;AACjD,gBAAA,UAAU,SAAS,cAAc,KAAK;AAC5C,kBAAQ,YAAY;AACpB,kBAAQ,YAAY;AACZ,kBAAA,iBAAiB,SAAS,KAAK,aAAa;AACpD,eAAK,WAAW;AACX,eAAA,OAAO,YAAY,OAAO;AAC/B,eAAK,oBAAoB;AAAA,QAAA,OAEtB;AAEH,eAAK,QAAQ,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM;AAC1C,eAAK,OAAO,MAAM,OAAO,GAAG,KAAK,MAAM,CAAC;AACxC,eAAK,OAAO,MAAM,MAAM,GAAG,KAAK,MAAM,CAAC;AAC9B,mBAAA,iBAAiB,aAAa,KAAK,QAAQ;AAAA,QACtD;AAAA,MACF;AAAA,IAAA;AAGF,SAAA,WAAW,CAAC,UAAsB;AAEhC,WAAK,QAAQ,MAAM,UAAU,KAAK,MAAM;AACxC,WAAK,SAAS,MAAM,UAAU,KAAK,MAAM;AACzC,WAAK,OAAO,MAAM,QAAQ,GAAG,KAAK,KAAK;AACvC,WAAK,OAAO,MAAM,SAAS,GAAG,KAAK,MAAM;AACzC,WAAK,WAAW,YAAY,GAAG,KAAK,KAAK,OAAO,KAAK,MAAM;AAAA,IAAA;AAG7D,SAAA,gBAAgB,CAAC,UAAU;AAChB,eAAA,oBAAoB,aAAa,KAAK,UAAU;AACzD,WAAK,KAAK;AACV,YAAM,SAAS,MAAM;AACjB,UAAA,UAAU,OAAO,cAAc,oBAAoB;AACrD,cAAM,OAAO;AAAA,UACX,GAAG,KAAK,MAAM;AAAA,UACd,GAAG,KAAK,MAAM;AAAA,UACd,OAAO,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,SAAS,SAAS,KAAK;AAAA,UACvB,SAAS,SAAS,KAAK;AAAA,UACvB,YAAY;AAAA;AAAA,UACZ,SAAS;AAAA;AAAA,QAAA;AAEX,aAAK,YAAY,IAAI;AAAA,MACvB;AACA,WAAK,QAAQ;AAAA,IAAA;AAjGT,QAAA,KAAK,QAAQ,eAAe,MAAM;AACpC,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAO;AACC,UAAA,YAAY,SAAS,iBAAiB,qBAAqB;AACjE,QAAI,WAAW;AACb,gBAAU,QAAQ,CAAA,SAAQ,QAAQ,KAAK,QAAQ;AAAA,IACjD;AAEK,SAAA,OAAO,SAAS,cAAc,KAAK;AACxC,SAAK,KAAK,YAAY;AACjB,SAAA,SAAS,SAAS,cAAc,KAAK;AAC1C,SAAK,OAAO,YAAY;AACnB,SAAA,aAAa,SAAS,cAAc,GAAG;AAC5C,SAAK,WAAW,YAAY;AAC5B,SAAK,YAAY;AACZ,SAAA,OAAO,YAAY,KAAK,UAAU;AAClC,SAAA,KAAK,YAAY,KAAK,MAAM;AACxB,aAAA,KAAK,YAAY,KAAK,IAAI;AAC1B,aAAA,iBAAiB,aAAa,KAAK,UAAU;AAAA,EACxD;AAAA,EAEA,cAAc;AACZ,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACpB,YAAA,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,YAAY;AACjB,WAAA,OAAO,YAAY,SAAS;AAAA,IACnC;AAAA,EACF;AAAA,EAmEA,YAAY,MAAM;AAChB,QAAIA,uBAAU;AACP,WAAA,QAAQ,YAAY,SAAS,MAAM,IAAI,EAAE,KAAK,CAAU,WAAA,KAAK,aAAa,MAAM,CAAC;AAAA,IAAA,OAEnF;AACE,WAAA,QAAQ,YAAY,SAAS,MAAM;AAAA,QACtC,YAAY;AAAA;AAAA,QACZ,wBAAwB,KAAK,MAAM,QAAQ;AAAA;AAAA,QAC3C,SAAS;AAAA;AAAA,MAAA,CACV,EAAE,KAAK,CAAC,WAAW;AAEZ,cAAA,aAAa,SAAS,cAAc,QAAQ;AAClD,mBAAW,QAAQ,KAAK;AACxB,mBAAW,SAAS,KAAK;AACnB,cAAA,gBAAgB,WAAW,WAAW,IAAI;AAClC,sBAAA;AAAA,UACZ;AAAA,UACA,KAAK,IAAI,OAAO;AAAA,UAChB,KAAK,IAAI,OAAO;AAAA,UAChB,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,QAAA;AAEP,aAAK,aAAa,UAAU;AAC5B,mBAAW,OAAO;AAAA,MAAA,CACnB;AAAA,IACH;AAAA,EACF;AAAA,EAEA,aAAa,QAAQ;AACb,UAAA,QAAQ,OAAO;AACrB,UAAM,QAAQ,IAAI,MAAA,EACf,OAAO,KAAK,MAAM,KAAK,EACvB,OAAO,KAAK,MAAM,MAAM,EACxB,OAAO,EAAE,OAAO;AACnB,SAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AAC9C,SAAA,MAAM,aAAa,KAAK,MAAM,QAAQ,GAAG,MAAM,QAAQ,MAAM;AAAA,EACpE;AACF;AAlKE,YAAO,WAAW;AAAA,EAChB,cAAc,MAAM;AAElB,WAAO,OAAO;AAAA,EAAA,GACb;AAAA,EACH,wBAAwB;AAAA;AAN5B,IAAM,aAAN;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/screenshot/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport type Toolbar from 'quill/modules/toolbar'\r\nimport type html2canvas from 'html2canvas'\r\nimport type { Options as Html2CanvasOptions } from 'html2canvas'\r\n\r\nconst Delta = Quill.import('delta')\r\n\r\nexport type ScreenShotOptions = Partial<Html2CanvasOptions> & {\r\n Html2Canvas: typeof html2canvas\r\n beforeCreateCanvas: () => void | Promise<void>\r\n beforeCreateImage: (canvas: HTMLCanvasElement) => HTMLCanvasElement | string | Promise<HTMLCanvasElement | string>\r\n}\r\ntype ScreenShotOptionsInQuill = {\r\n quill: {\r\n options: {\r\n screenshot: Partial<ScreenShotOptions>\r\n }\r\n }\r\n}\r\n\r\nconst resolveOptions = (options: Partial<ScreenShotOptions>) => {\r\n return Object.assign({\r\n // @ts-ignore\r\n Html2Canvas: window.Html2Canvas,\r\n useCORS: true,\r\n foreignObjectRendering: true,\r\n beforeCreateImage: undefined,\r\n beforeCreateCanvas: undefined,\r\n }, options)\r\n}\r\n\r\nfunction init() {\r\n const maskExits = document.querySelectorAll('.ql-screenshot-mask')\r\n if (maskExits) {\r\n maskExits.forEach(item => item && item.remove())\r\n }\r\n // 创建截图图层\r\n const wrapper = document.createElement('div')\r\n wrapper.classList.add('ql-screenshot-wrapper')\r\n const mask = document.createElement('div')\r\n mask.className = 'ql-screenshot-mask'\r\n const cutter = document.createElement('div')\r\n cutter.className = 'ql-screenshot-cutter'\r\n const coordinate = document.createElement('p')\r\n coordinate.className = 'ql-screenshot-coordinate'\r\n cutter.appendChild(coordinate)\r\n wrapper.appendChild(mask)\r\n wrapper.appendChild(cutter)\r\n document.body.appendChild(wrapper)\r\n document.body.style.overflow = 'hidden'\r\n return { wrapper, mask, cutter, coordinate }\r\n}\r\n\r\nasync function renderImage(\r\n Html2Canvas: typeof html2canvas,\r\n html2canvasOptions: Partial<Html2CanvasOptions>,\r\n rect: DOMRect,\r\n options?: Omit<ScreenShotOptions, 'Html2Canvas' | keyof Html2CanvasOptions>,\r\n) {\r\n if (options && options.beforeCreateCanvas) {\r\n await options.beforeCreateCanvas()\r\n }\r\n const canvas: CanvasImageSource = await Html2Canvas(document.body, html2canvasOptions)\r\n // 当前canvas为body全局截图,从当前截图中截取想要的部分重新绘制转成base64插入富文本\r\n let cropCanvas: HTMLCanvasElement | string = document.createElement('canvas')\r\n cropCanvas.width = rect.width\r\n cropCanvas.height = rect.height\r\n const cropCanvasCtx = cropCanvas.getContext('2d')\r\n cropCanvasCtx.drawImage(\r\n canvas,\r\n rect.x + window.scrollX,\r\n rect.y + window.scrollY,\r\n rect.width,\r\n rect.height,\r\n 0,\r\n 0,\r\n rect.width,\r\n rect.height,\r\n )\r\n if (options && options.beforeCreateImage) {\r\n cropCanvas = await options.beforeCreateImage(cropCanvas)\r\n }\r\n return typeof cropCanvas === 'string' ? cropCanvas : cropCanvas.toDataURL()\r\n}\r\n\r\nexport function Screenshot(this: Toolbar & ScreenShotOptionsInQuill) {\r\n this.quill.options.screenshot = resolveOptions(this.quill.options.screenshot)\r\n const options = this.quill.options.screenshot\r\n // @ts-ignore\r\n const { Html2Canvas, beforeCreateImage, beforeCreateCanvas, ...html2CanvasOptions } = options\r\n if (!Html2Canvas) {\r\n throw new Error('ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.')\r\n }\r\n const range = this.quill.getSelection(true)\r\n const { wrapper, mask, cutter, coordinate } = init()\r\n const status: {\r\n leftClickLockFlag: boolean\r\n start?: {\r\n x: number\r\n y: number\r\n }\r\n } = {\r\n leftClickLockFlag: false,\r\n start: undefined,\r\n }\r\n\r\n const removeContextmenu = (event: Event) => {\r\n event.preventDefault()\r\n wrapper.remove()\r\n document.removeEventListener('contextmenu', removeContextmenu)\r\n }\r\n const afterShotCtrl = async (event: MouseEvent) => {\r\n document.removeEventListener('mousedown', toggleRect)\r\n Object.assign(document.body.style, { overflow: null })\r\n const cutterRect = cutter.getBoundingClientRect()\r\n const target = event.target as HTMLElement\r\n wrapper.remove()\r\n if (target && target.className === 'ql-screenshot-confirm') {\r\n const image = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage })\r\n\r\n const delta = new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n .insert({ image })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n }\r\n status.start = undefined\r\n }\r\n const drawRect = (event: MouseEvent) => {\r\n // 通过鼠标移动描绘截图图层\r\n const startX = status.start.x\r\n const startY = status.start.y\r\n const endX = event.clientX\r\n const endY = event.clientY\r\n const width = Math.abs(endX - startX)\r\n const height = Math.abs(endY - startY)\r\n const top = startY < endY ? startY : endY\r\n const left = startX < endX ? startX : endX\r\n const bottom = window.innerHeight - height - top\r\n const right = window.innerWidth - width - left\r\n\r\n const maskPath = `\r\n linear-gradient(to top, #fff, #fff) top / 100% ${top}px,\r\n linear-gradient(to bottom, #fff, #fff) bottom /100% ${bottom}px,\r\n linear-gradient(to left, #fff, #fff) left / ${left}px 100%,\r\n linear-gradient(to right, #fff, #fff) right / ${right}px 100%\r\n `\r\n Object.assign(cutter.style, {\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n left: `${left}px`,\r\n top: `${top}px`,\r\n })\r\n Object.assign(mask.style, {\r\n 'mask': maskPath,\r\n '-webkit-mask-repeat': 'no-repeat',\r\n })\r\n coordinate.textContent = `${width}, ${height}`\r\n }\r\n const toggleRect = (event: MouseEvent) => {\r\n // 右键取消截图操作\r\n if (event.button === 2) {\r\n document.removeEventListener('mousemove', drawRect)\r\n document.removeEventListener('mousedown', toggleRect)\r\n console.log('right')\r\n document.addEventListener('contextmenu', removeContextmenu)\r\n return\r\n }\r\n if (!status.leftClickLockFlag) {\r\n if (status.start) {\r\n // 如果有起点,则当前触发坐标为终点,移除监听事件并添加确认和取消按钮\r\n document.removeEventListener('mousemove', drawRect)\r\n const doneBtn = document.createElement('div')\r\n doneBtn.innerHTML = `<div class=\"ql-screenshot-confirm\"></div><div class=\"ql-screenshot-cancel\"></div>`\r\n doneBtn.className = 'ql-screenshot-done'\r\n doneBtn.addEventListener('click', afterShotCtrl)\r\n coordinate.remove()\r\n cutter.appendChild(doneBtn)\r\n status.leftClickLockFlag = true\r\n }\r\n else {\r\n // 无起点则设置起点坐标,监听鼠标移动\r\n status.start = { x: event.clientX, y: event.clientY }\r\n document.addEventListener('mousemove', drawRect)\r\n }\r\n }\r\n }\r\n document.addEventListener('mousedown', toggleRect)\r\n}\r\nScreenshot.toolName = 'screenshot'\r\n"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ const COL_DEFAULT = {
22
22
  width: 100
23
23
  };
24
24
  const CELL_IDENTITY_KEYS = ["row", "cell"];
25
- const CELL_ATTRIBUTES = ["rowspan", "colspan", "cell-bg"];
25
+ const CELL_ATTRIBUTES = ["rowspan", "colspan", "cell-bg", "list"];
26
26
  const CELL_DEFAULT = {
27
27
  rowspan: 1,
28
28
  colspan: 1
@@ -1 +1 @@
1
- {"version":3,"file":"table-config.cjs.js","sources":["../../../src/table/table-config.ts"],"sourcesContent":["export const TABLE_CELL_LINE_CLASS = 'qlrte__better-table-cell-line'\r\nexport const ROW_TOOL_CLASS = 'qlrte__row-tool'\r\nexport const ROW_TOOL_CELL_CLASS = 'qlrte__row-tool-cell'\r\nexport const ROW_TOOL_CELL_HOLDER_CLASS = 'qlrte__row-tool-cell-holder'\r\nexport const COL_TOOL_CLASS = 'qlrte__col-tool'\r\nexport const COL_TOOL_CELL_CLASS = 'qlrte__col-tool-cell'\r\nexport const COL_TOOL_CELL_HOLDER_CLASS = 'qlrte__col-tool-cell-holder'\r\nexport const SELECT_LINE_CLASS = 'qlrte__selection-line'\r\nexport const OPERATE_MENU_CLASS = 'qlrte__op-menu'\r\nexport const OPERATE_MENU_ITEM_CLASS = 'qlrte__op-menu-item'\r\nexport const OPERATE_MENU_ICON_CLASS = 'qlrte__op-menu-icon'\r\nexport const OPERATE_MENU_ICON_PREFIX_CLASS = 'qlrte__op-menu-icon-prefix'\r\nexport const OPERATE_MENU_TEXT_CLASS = 'qlrte__op-menu-text'\r\nexport const OPERATE_MENU_DIVIDING_CLASS = 'qlrte__op-menu-dividing'\r\nexport const OPERATE_MENU_SUBTITLE_CLASS = 'qlrte__op-menu-subtitle'\r\nexport const OPERATE_MENU_COLORPICKER_CLASS = 'qlrte__op-menu-color-picker'\r\nexport const OPERATE_MENU_COLORPICKER_ITEM_CLASS\r\n = 'qlrte__op-menu-color-picker-item'\r\nexport const COL_ATTRIBUTES = ['width']\r\nexport const COL_DEFAULT = {\r\n width: 100,\r\n}\r\nexport const CELL_IDENTITY_KEYS = ['row', 'cell']\r\nexport const CELL_ATTRIBUTES = ['rowspan', 'colspan', 'cell-bg']\r\nexport const CELL_DEFAULT = {\r\n rowspan: 1,\r\n colspan: 1,\r\n}\r\nexport const ERROR_LIMIT = 5\r\n\r\nexport const SCROLL_BAR_PANEL_HEIGHT = 32\r\nexport const ROW_TOOL_WIDTH = 16\r\nexport const COL_TOOL_HEIGHT = 16\r\nexport const CELL_MIN_WIDTH = 50\r\nexport const CELL_MIN_HEIGHT = 29\r\nexport const PRIMARY_COLOR = ['#5170ff', 'var(--brand-1, #5170ff)']\r\n\r\nexport const MENU_ITEM_HEIGHT = 40\r\nexport const MENU_MIN_HEIGHT = 150\r\nexport const MENU_WIDTH = 205\r\n\r\nexport const LINE_POSITIONS = ['left', 'right', 'top', 'bottom']\r\n"],"names":[],"mappings":";;AAAO,MAAM,wBAAwB;AAC9B,MAAM,iBAAiB;AACvB,MAAM,sBAAsB;AAC5B,MAAM,6BAA6B;AACnC,MAAM,iBAAiB;AACvB,MAAM,sBAAsB;AAC5B,MAAM,6BAA6B;AACnC,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAC3B,MAAM,0BAA0B;AAChC,MAAM,0BAA0B;AAChC,MAAM,iCAAiC;AACvC,MAAM,0BAA0B;AAChC,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM,iCAAiC;AACvC,MAAM,sCACT;AACS,MAAA,iBAAiB,CAAC,OAAO;AAC/B,MAAM,cAAc;AAAA,EACzB,OAAO;AACT;AACa,MAAA,qBAAqB,CAAC,OAAO,MAAM;AACzC,MAAM,kBAAkB,CAAC,WAAW,WAAW,SAAS;AACxD,MAAM,eAAe;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AACX;AACO,MAAM,cAAc;AAEpB,MAAM,0BAA0B;AAChC,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AAClB,MAAA,gBAAgB,CAAC,WAAW,yBAAyB;AAE3D,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,aAAa;AAEnB,MAAM,iBAAiB,CAAC,QAAQ,SAAS,OAAO,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"table-config.cjs.js","sources":["../../../src/table/table-config.ts"],"sourcesContent":["export const TABLE_CELL_LINE_CLASS = 'qlrte__better-table-cell-line'\r\nexport const ROW_TOOL_CLASS = 'qlrte__row-tool'\r\nexport const ROW_TOOL_CELL_CLASS = 'qlrte__row-tool-cell'\r\nexport const ROW_TOOL_CELL_HOLDER_CLASS = 'qlrte__row-tool-cell-holder'\r\nexport const COL_TOOL_CLASS = 'qlrte__col-tool'\r\nexport const COL_TOOL_CELL_CLASS = 'qlrte__col-tool-cell'\r\nexport const COL_TOOL_CELL_HOLDER_CLASS = 'qlrte__col-tool-cell-holder'\r\nexport const SELECT_LINE_CLASS = 'qlrte__selection-line'\r\nexport const OPERATE_MENU_CLASS = 'qlrte__op-menu'\r\nexport const OPERATE_MENU_ITEM_CLASS = 'qlrte__op-menu-item'\r\nexport const OPERATE_MENU_ICON_CLASS = 'qlrte__op-menu-icon'\r\nexport const OPERATE_MENU_ICON_PREFIX_CLASS = 'qlrte__op-menu-icon-prefix'\r\nexport const OPERATE_MENU_TEXT_CLASS = 'qlrte__op-menu-text'\r\nexport const OPERATE_MENU_DIVIDING_CLASS = 'qlrte__op-menu-dividing'\r\nexport const OPERATE_MENU_SUBTITLE_CLASS = 'qlrte__op-menu-subtitle'\r\nexport const OPERATE_MENU_COLORPICKER_CLASS = 'qlrte__op-menu-color-picker'\r\nexport const OPERATE_MENU_COLORPICKER_ITEM_CLASS\r\n = 'qlrte__op-menu-color-picker-item'\r\nexport const COL_ATTRIBUTES = ['width']\r\nexport const COL_DEFAULT = {\r\n width: 100,\r\n}\r\nexport const CELL_IDENTITY_KEYS = ['row', 'cell']\r\nexport const CELL_ATTRIBUTES = ['rowspan', 'colspan', 'cell-bg', 'list']\r\nexport const CELL_DEFAULT = {\r\n rowspan: 1,\r\n colspan: 1,\r\n}\r\nexport const ERROR_LIMIT = 5\r\n\r\nexport const SCROLL_BAR_PANEL_HEIGHT = 32\r\nexport const ROW_TOOL_WIDTH = 16\r\nexport const COL_TOOL_HEIGHT = 16\r\nexport const CELL_MIN_WIDTH = 50\r\nexport const CELL_MIN_HEIGHT = 29\r\nexport const PRIMARY_COLOR = ['#5170ff', 'var(--brand-1, #5170ff)']\r\n\r\nexport const MENU_ITEM_HEIGHT = 40\r\nexport const MENU_MIN_HEIGHT = 150\r\nexport const MENU_WIDTH = 205\r\n\r\nexport const LINE_POSITIONS = ['left', 'right', 'top', 'bottom']\r\n"],"names":[],"mappings":";;AAAO,MAAM,wBAAwB;AAC9B,MAAM,iBAAiB;AACvB,MAAM,sBAAsB;AAC5B,MAAM,6BAA6B;AACnC,MAAM,iBAAiB;AACvB,MAAM,sBAAsB;AAC5B,MAAM,6BAA6B;AACnC,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAC3B,MAAM,0BAA0B;AAChC,MAAM,0BAA0B;AAChC,MAAM,iCAAiC;AACvC,MAAM,0BAA0B;AAChC,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM,iCAAiC;AACvC,MAAM,sCACT;AACS,MAAA,iBAAiB,CAAC,OAAO;AAC/B,MAAM,cAAc;AAAA,EACzB,OAAO;AACT;AACa,MAAA,qBAAqB,CAAC,OAAO,MAAM;AACzC,MAAM,kBAAkB,CAAC,WAAW,WAAW,WAAW,MAAM;AAChE,MAAM,eAAe;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AACX;AACO,MAAM,cAAc;AAEpB,MAAM,0BAA0B;AAChC,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AAClB,MAAA,gBAAgB,CAAC,WAAW,yBAAyB;AAE3D,MAAM,mBAAmB;AACzB,MAAM,kBAAkB;AACxB,MAAM,aAAa;AAEnB,MAAM,iBAAiB,CAAC,QAAQ,SAAS,OAAO,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}