@opentiny/fluent-editor 4.0.0-alpha.1 → 4.0.0-alpha.2

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 (462) hide show
  1. package/README.md +7 -24
  2. package/es/config/editor.utils.es.js +0 -2
  3. package/es/config/editor.utils.es.js.map +1 -1
  4. package/es/config/index.es.js +2 -2
  5. package/es/config/index.es.js.map +1 -1
  6. package/es/config/types/index.es.js +0 -20
  7. package/es/config/types/index.es.js.map +1 -1
  8. package/es/core/fluent-editor.es.js +4 -1
  9. package/es/core/fluent-editor.es.js.map +1 -1
  10. package/es/fluent-editor.es.js +24 -19
  11. package/es/fluent-editor.es.js.map +1 -1
  12. package/es/formats/emoji.es.js +14 -0
  13. package/es/formats/emoji.es.js.map +1 -0
  14. package/es/formats/index.es.js +11 -0
  15. package/es/formats/index.es.js.map +1 -0
  16. package/es/formats/soft-break.es.js +12 -5
  17. package/es/formats/soft-break.es.js.map +1 -1
  18. package/es/formats/strike.es.js +8 -5
  19. package/es/formats/strike.es.js.map +1 -1
  20. package/es/formats/video.es.js +14 -10
  21. package/es/formats/video.es.js.map +1 -1
  22. package/es/index.es.js +90 -31
  23. package/es/index.es.js.map +1 -1
  24. package/es/modules/counter.es.js +8 -3
  25. package/es/modules/counter.es.js.map +1 -1
  26. package/es/modules/custom-clipboard.es.js +20 -22
  27. package/es/modules/custom-clipboard.es.js.map +1 -1
  28. package/es/modules/custom-image/actions/action.es.js +19 -0
  29. package/es/modules/custom-image/actions/action.es.js.map +1 -0
  30. package/es/modules/custom-image/actions/{CustomResizeAction.es.js → custom-resize-action.es.js} +24 -11
  31. package/es/modules/custom-image/actions/{CustomResizeAction.es.js.map → custom-resize-action.es.js.map} +1 -1
  32. package/es/modules/custom-image/actions/{DeleteAction.es.js → delete-action.es.js} +8 -5
  33. package/es/modules/custom-image/actions/delete-action.es.js.map +1 -0
  34. package/es/modules/custom-image/actions/image-toolbar-buttons.es.js +137 -0
  35. package/es/modules/custom-image/actions/image-toolbar-buttons.es.js.map +1 -0
  36. package/es/modules/custom-image/actions/index.es.js +18 -0
  37. package/es/modules/custom-image/actions/index.es.js.map +1 -0
  38. package/es/modules/custom-image/actions/toolbar-action.es.js +33 -0
  39. package/es/modules/custom-image/actions/toolbar-action.es.js.map +1 -0
  40. package/es/modules/custom-image/actions/toolbar.es.js +110 -0
  41. package/es/modules/custom-image/actions/toolbar.es.js.map +1 -0
  42. package/es/modules/custom-image/{BlotFormatter.es.js → blot-formatter.es.js} +23 -49
  43. package/es/modules/custom-image/blot-formatter.es.js.map +1 -0
  44. package/es/modules/custom-image/image.es.js +31 -6
  45. package/es/modules/custom-image/image.es.js.map +1 -1
  46. package/es/modules/custom-image/index.es.js +9 -0
  47. package/es/modules/custom-image/index.es.js.map +1 -0
  48. package/es/modules/custom-image/options.es.js +85 -0
  49. package/es/modules/custom-image/options.es.js.map +1 -0
  50. package/es/modules/custom-image/specs/blot-spec.es.js +33 -0
  51. package/es/modules/custom-image/specs/blot-spec.es.js.map +1 -0
  52. package/es/modules/custom-image/specs/{CustomImageSpec.es.js → custom-image-spec.es.js} +13 -14
  53. package/es/modules/custom-image/specs/custom-image-spec.es.js.map +1 -0
  54. package/es/modules/custom-image/specs/image-spec.es.js +32 -0
  55. package/es/modules/custom-image/specs/image-spec.es.js.map +1 -0
  56. package/es/modules/custom-image/specs/index.es.js +9 -0
  57. package/es/modules/custom-image/specs/index.es.js.map +1 -0
  58. package/es/modules/custom-uploader.es.js +6 -4
  59. package/es/modules/custom-uploader.es.js.map +1 -1
  60. package/es/modules/divider.es.js +8 -7
  61. package/es/modules/divider.es.js.map +1 -1
  62. package/es/modules/emoji.es.js +175 -0
  63. package/es/modules/emoji.es.js.map +1 -0
  64. package/es/modules/file/formats/file.es.js +10 -8
  65. package/es/modules/file/formats/file.es.js.map +1 -1
  66. package/es/modules/file/index.es.js +6 -28
  67. package/es/modules/file/index.es.js.map +1 -1
  68. package/es/modules/file/modules/file-bar.es.js +11 -3
  69. package/es/modules/file/modules/file-bar.es.js.map +1 -1
  70. package/es/modules/file/modules/file-module.es.js +35 -0
  71. package/es/modules/file/modules/file-module.es.js.map +1 -0
  72. package/es/modules/i18n.es.js +6 -3
  73. package/es/modules/i18n.es.js.map +1 -1
  74. package/es/modules/index.es.js +26 -0
  75. package/es/modules/index.es.js.map +1 -0
  76. package/es/modules/link/formats/link.es.js +14 -10
  77. package/es/modules/link/formats/link.es.js.map +1 -1
  78. package/es/modules/link/index.es.js +4 -12
  79. package/es/modules/link/index.es.js.map +1 -1
  80. package/es/modules/link/modules/tooltip.es.js +28 -19
  81. package/es/modules/link/modules/tooltip.es.js.map +1 -1
  82. package/es/modules/mathlive/formats.es.js +10 -7
  83. package/es/modules/mathlive/formats.es.js.map +1 -1
  84. package/es/modules/mathlive/index.es.js +6 -30
  85. package/es/modules/mathlive/index.es.js.map +1 -1
  86. package/es/modules/mathlive/module.es.js +40 -0
  87. package/es/modules/mathlive/module.es.js.map +1 -0
  88. package/es/modules/mathlive/tooltip.es.js +9 -5
  89. package/es/modules/mathlive/tooltip.es.js.map +1 -1
  90. package/es/modules/mention/index.es.js +7 -0
  91. package/es/modules/{emoji/emoji-list → mention}/index.es.js.map +1 -1
  92. package/es/modules/mention/{MentionLink.es.js → mention-link.es.js} +14 -6
  93. package/es/modules/mention/mention-link.es.js.map +1 -0
  94. package/es/modules/mention/{Mention.es.js → mention.es.js} +28 -20
  95. package/es/modules/mention/mention.es.js.map +1 -0
  96. package/es/modules/shortcut-key/index.es.js.map +1 -1
  97. package/es/modules/syntax.es.js +4 -0
  98. package/es/modules/syntax.es.js.map +1 -1
  99. package/es/modules/table-up/index.es.js +4 -0
  100. package/es/modules/table-up/index.es.js.map +1 -1
  101. package/es/modules/toolbar/better-picker.es.js +5 -0
  102. package/es/modules/toolbar/better-picker.es.js.map +1 -1
  103. package/es/modules/toolbar/better-toolbar.es.js +138 -0
  104. package/es/modules/toolbar/better-toolbar.es.js.map +1 -0
  105. package/es/modules/toolbar/index.es.js +5 -135
  106. package/es/modules/toolbar/index.es.js.map +1 -1
  107. package/es/node_modules/.pnpm/@emoji-mart_data@1.2.1/node_modules/@emoji-mart/data/sets/15/native.json.es.js +40145 -0
  108. package/es/node_modules/.pnpm/@emoji-mart_data@1.2.1/node_modules/@emoji-mart/data/sets/15/native.json.es.js.map +1 -0
  109. package/es/node_modules/.pnpm/@floating-ui_core@1.7.2/node_modules/@floating-ui/core/dist/floating-ui.core.es.js +938 -0
  110. package/es/node_modules/.pnpm/@floating-ui_core@1.7.2/node_modules/@floating-ui/core/dist/floating-ui.core.es.js.map +1 -0
  111. package/es/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.es.js +624 -0
  112. package/es/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.es.js.map +1 -0
  113. package/es/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.es.js +174 -0
  114. package/es/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.es.js.map +1 -0
  115. package/es/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.es.js +159 -0
  116. package/es/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.es.js.map +1 -0
  117. package/es/node_modules/.pnpm/emoji-mart@5.6.0/node_modules/emoji-mart/dist/module.es.js +2849 -0
  118. package/es/node_modules/.pnpm/emoji-mart@5.6.0/node_modules/emoji-mart/dist/module.es.js.map +1 -0
  119. package/es/themes/snow.es.js +4 -10
  120. package/es/themes/snow.es.js.map +1 -1
  121. package/es/tools/fullscreen.es.js.map +1 -1
  122. package/es/ui/icons.config.es.js +8 -0
  123. package/es/ui/icons.config.es.js.map +1 -1
  124. package/es/utils/is.es.js.map +1 -1
  125. package/lib/config/editor.utils.cjs.js +0 -2
  126. package/lib/config/editor.utils.cjs.js.map +1 -1
  127. package/lib/config/index.cjs.js +1 -1
  128. package/lib/config/index.cjs.js.map +1 -1
  129. package/lib/config/types/index.cjs.js +0 -20
  130. package/lib/config/types/index.cjs.js.map +1 -1
  131. package/lib/core/fluent-editor.cjs.js +4 -1
  132. package/lib/core/fluent-editor.cjs.js.map +1 -1
  133. package/lib/fluent-editor.cjs.js +33 -28
  134. package/lib/fluent-editor.cjs.js.map +1 -1
  135. package/lib/formats/emoji.cjs.js +14 -0
  136. package/lib/formats/emoji.cjs.js.map +1 -0
  137. package/lib/formats/index.cjs.js +11 -0
  138. package/lib/formats/index.cjs.js.map +1 -0
  139. package/lib/formats/soft-break.cjs.js +13 -6
  140. package/lib/formats/soft-break.cjs.js.map +1 -1
  141. package/lib/formats/strike.cjs.js +9 -6
  142. package/lib/formats/strike.cjs.js.map +1 -1
  143. package/lib/formats/video.cjs.js +15 -11
  144. package/lib/formats/video.cjs.js.map +1 -1
  145. package/lib/index.cjs.js +111 -34
  146. package/lib/index.cjs.js.map +1 -1
  147. package/lib/modules/counter.cjs.js +8 -3
  148. package/lib/modules/counter.cjs.js.map +1 -1
  149. package/lib/modules/custom-clipboard.cjs.js +21 -23
  150. package/lib/modules/custom-clipboard.cjs.js.map +1 -1
  151. package/lib/modules/custom-image/actions/action.cjs.js +19 -0
  152. package/lib/modules/custom-image/actions/action.cjs.js.map +1 -0
  153. package/lib/modules/custom-image/actions/{CustomResizeAction.cjs.js → custom-resize-action.cjs.js} +26 -13
  154. package/lib/modules/custom-image/actions/{CustomResizeAction.cjs.js.map → custom-resize-action.cjs.js.map} +1 -1
  155. package/lib/modules/custom-image/actions/{DeleteAction.cjs.js → delete-action.cjs.js} +10 -7
  156. package/lib/modules/custom-image/actions/delete-action.cjs.js.map +1 -0
  157. package/lib/modules/custom-image/actions/image-toolbar-buttons.cjs.js +137 -0
  158. package/lib/modules/custom-image/actions/image-toolbar-buttons.cjs.js.map +1 -0
  159. package/lib/modules/custom-image/actions/index.cjs.js +18 -0
  160. package/lib/modules/custom-image/actions/index.cjs.js.map +1 -0
  161. package/lib/modules/custom-image/actions/toolbar-action.cjs.js +33 -0
  162. package/lib/modules/custom-image/actions/toolbar-action.cjs.js.map +1 -0
  163. package/lib/modules/custom-image/actions/toolbar.cjs.js +110 -0
  164. package/lib/modules/custom-image/actions/toolbar.cjs.js.map +1 -0
  165. package/lib/modules/custom-image/{BlotFormatter.cjs.js → blot-formatter.cjs.js} +24 -50
  166. package/lib/modules/custom-image/blot-formatter.cjs.js.map +1 -0
  167. package/lib/modules/custom-image/image.cjs.js +32 -7
  168. package/lib/modules/custom-image/image.cjs.js.map +1 -1
  169. package/lib/modules/custom-image/index.cjs.js +9 -0
  170. package/lib/modules/custom-image/index.cjs.js.map +1 -0
  171. package/lib/modules/custom-image/options.cjs.js +85 -0
  172. package/lib/modules/custom-image/options.cjs.js.map +1 -0
  173. package/lib/modules/custom-image/specs/blot-spec.cjs.js +33 -0
  174. package/lib/modules/custom-image/specs/blot-spec.cjs.js.map +1 -0
  175. package/lib/modules/custom-image/specs/{CustomImageSpec.cjs.js → custom-image-spec.cjs.js} +14 -15
  176. package/lib/modules/custom-image/specs/custom-image-spec.cjs.js.map +1 -0
  177. package/lib/modules/custom-image/specs/image-spec.cjs.js +32 -0
  178. package/lib/modules/custom-image/specs/image-spec.cjs.js.map +1 -0
  179. package/lib/modules/custom-image/specs/index.cjs.js +9 -0
  180. package/lib/modules/custom-image/specs/index.cjs.js.map +1 -0
  181. package/lib/modules/custom-uploader.cjs.js +6 -4
  182. package/lib/modules/custom-uploader.cjs.js.map +1 -1
  183. package/lib/modules/divider.cjs.js +9 -8
  184. package/lib/modules/divider.cjs.js.map +1 -1
  185. package/lib/modules/emoji.cjs.js +175 -0
  186. package/lib/modules/emoji.cjs.js.map +1 -0
  187. package/lib/modules/file/formats/file.cjs.js +11 -9
  188. package/lib/modules/file/formats/file.cjs.js.map +1 -1
  189. package/lib/modules/file/index.cjs.js +5 -27
  190. package/lib/modules/file/index.cjs.js.map +1 -1
  191. package/lib/modules/file/modules/file-bar.cjs.js +12 -4
  192. package/lib/modules/file/modules/file-bar.cjs.js.map +1 -1
  193. package/lib/modules/file/modules/file-module.cjs.js +35 -0
  194. package/lib/modules/file/modules/file-module.cjs.js.map +1 -0
  195. package/lib/modules/i18n.cjs.js +6 -3
  196. package/lib/modules/i18n.cjs.js.map +1 -1
  197. package/lib/modules/index.cjs.js +26 -0
  198. package/lib/modules/index.cjs.js.map +1 -0
  199. package/lib/modules/link/formats/link.cjs.js +15 -11
  200. package/lib/modules/link/formats/link.cjs.js.map +1 -1
  201. package/lib/modules/link/index.cjs.js +4 -12
  202. package/lib/modules/link/index.cjs.js.map +1 -1
  203. package/lib/modules/link/modules/tooltip.cjs.js +28 -19
  204. package/lib/modules/link/modules/tooltip.cjs.js.map +1 -1
  205. package/lib/modules/mathlive/formats.cjs.js +11 -8
  206. package/lib/modules/mathlive/formats.cjs.js.map +1 -1
  207. package/lib/modules/mathlive/index.cjs.js +5 -29
  208. package/lib/modules/mathlive/index.cjs.js.map +1 -1
  209. package/lib/modules/mathlive/module.cjs.js +40 -0
  210. package/lib/modules/mathlive/module.cjs.js.map +1 -0
  211. package/lib/modules/mathlive/tooltip.cjs.js +10 -6
  212. package/lib/modules/mathlive/tooltip.cjs.js.map +1 -1
  213. package/lib/modules/mention/index.cjs.js +7 -0
  214. package/lib/modules/{emoji/emoji-list → mention}/index.cjs.js.map +1 -1
  215. package/lib/modules/mention/{MentionLink.cjs.js → mention-link.cjs.js} +15 -7
  216. package/lib/modules/mention/mention-link.cjs.js.map +1 -0
  217. package/lib/modules/mention/{Mention.cjs.js → mention.cjs.js} +30 -22
  218. package/lib/modules/mention/mention.cjs.js.map +1 -0
  219. package/lib/modules/shortcut-key/index.cjs.js.map +1 -1
  220. package/lib/modules/syntax.cjs.js +4 -0
  221. package/lib/modules/syntax.cjs.js.map +1 -1
  222. package/lib/modules/table-up/index.cjs.js +4 -0
  223. package/lib/modules/table-up/index.cjs.js.map +1 -1
  224. package/lib/modules/toolbar/better-picker.cjs.js +5 -0
  225. package/lib/modules/toolbar/better-picker.cjs.js.map +1 -1
  226. package/lib/modules/toolbar/better-toolbar.cjs.js +138 -0
  227. package/lib/modules/toolbar/better-toolbar.cjs.js.map +1 -0
  228. package/lib/modules/toolbar/index.cjs.js +6 -136
  229. package/lib/modules/toolbar/index.cjs.js.map +1 -1
  230. package/lib/node_modules/.pnpm/@emoji-mart_data@1.2.1/node_modules/@emoji-mart/data/sets/15/native.json.cjs.js +40145 -0
  231. package/lib/node_modules/.pnpm/@emoji-mart_data@1.2.1/node_modules/@emoji-mart/data/sets/15/native.json.cjs.js.map +1 -0
  232. package/lib/node_modules/.pnpm/@floating-ui_core@1.7.2/node_modules/@floating-ui/core/dist/floating-ui.core.cjs.js +938 -0
  233. package/lib/node_modules/.pnpm/@floating-ui_core@1.7.2/node_modules/@floating-ui/core/dist/floating-ui.core.cjs.js.map +1 -0
  234. package/lib/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.cjs.js +624 -0
  235. package/lib/node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.cjs.js.map +1 -0
  236. package/lib/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.cjs.js +159 -0
  237. package/lib/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.cjs.js.map +1 -0
  238. package/lib/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.cjs.js +174 -0
  239. package/lib/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.cjs.js.map +1 -0
  240. package/lib/node_modules/.pnpm/emoji-mart@5.6.0/node_modules/emoji-mart/dist/module.cjs.js +2847 -0
  241. package/lib/node_modules/.pnpm/emoji-mart@5.6.0/node_modules/emoji-mart/dist/module.cjs.js.map +1 -0
  242. package/lib/themes/snow.cjs.js +5 -11
  243. package/lib/themes/snow.cjs.js.map +1 -1
  244. package/lib/tools/fullscreen.cjs.js.map +1 -1
  245. package/lib/ui/icons.config.cjs.js +8 -0
  246. package/lib/ui/icons.config.cjs.js.map +1 -1
  247. package/lib/utils/is.cjs.js.map +1 -1
  248. package/package.json +8 -7
  249. package/style.css +2 -933
  250. package/types/config/editor.utils.d.ts +0 -1
  251. package/types/config/index.d.ts +1 -0
  252. package/types/config/types/editor-config.interface.d.ts +0 -7
  253. package/types/config/types/editor-modules.interface.d.ts +21 -12
  254. package/types/config/types/index.d.ts +0 -20
  255. package/types/config/types/type.d.ts +0 -4
  256. package/types/core/fluent-editor.d.ts +0 -1
  257. package/types/formats/emoji.d.ts +9 -0
  258. package/types/formats/index.d.ts +4 -0
  259. package/types/formats/soft-break.d.ts +6 -7
  260. package/types/formats/strike.d.ts +6 -4
  261. package/types/formats/video.d.ts +4 -6
  262. package/types/index.d.ts +6 -5
  263. package/types/modules/counter.d.ts +8 -1
  264. package/types/modules/custom-clipboard.d.ts +3 -6
  265. package/types/modules/custom-image/Options.d.ts +34 -23
  266. package/types/modules/custom-image/actions/Action.d.ts +5 -3
  267. package/types/modules/custom-image/actions/custom-resize-action.d.ts +24 -0
  268. package/types/modules/custom-image/actions/delete-action.d.ts +7 -0
  269. package/types/modules/custom-image/actions/image-toolbar-buttons.d.ts +17 -0
  270. package/types/modules/custom-image/actions/index.d.ts +6 -0
  271. package/types/modules/custom-image/actions/toolbar-action.d.ts +12 -0
  272. package/types/modules/custom-image/actions/toolbar.d.ts +20 -0
  273. package/types/modules/custom-image/blot-formatter.d.ts +24 -0
  274. package/types/modules/custom-image/image-bar.d.ts +9 -7
  275. package/types/modules/custom-image/image.d.ts +15 -13
  276. package/types/modules/custom-image/index.d.ts +4 -0
  277. package/types/modules/custom-image/specs/blot-spec.d.ts +13 -0
  278. package/types/modules/custom-image/specs/custom-image-spec.d.ts +18 -0
  279. package/types/modules/custom-image/specs/image-spec.d.ts +9 -0
  280. package/types/modules/custom-image/specs/index.d.ts +3 -0
  281. package/types/modules/custom-uploader.d.ts +41 -0
  282. package/types/modules/divider.d.ts +6 -4
  283. package/types/modules/emoji/formats/emoji-blot.d.ts +9 -7
  284. package/types/modules/emoji/index.d.ts +3 -10
  285. package/types/modules/emoji/modules/emoji.d.ts +6 -6
  286. package/types/modules/emoji/modules/toolbar-emoji.d.ts +7 -6
  287. package/types/modules/emoji.d.ts +35 -0
  288. package/types/modules/file/formats/file.d.ts +2 -2
  289. package/types/modules/file/index.d.ts +3 -11
  290. package/types/modules/file/modules/file-bar.d.ts +1 -1
  291. package/types/modules/file/modules/file-module.d.ts +10 -0
  292. package/types/modules/i18n.d.ts +1 -2
  293. package/types/modules/index.d.ts +15 -0
  294. package/types/modules/link/formats/link.d.ts +5 -5
  295. package/types/modules/link/index.d.ts +2 -6
  296. package/types/modules/link/modules/tooltip.d.ts +5 -10
  297. package/types/modules/mathlive/formats.d.ts +2 -2
  298. package/types/modules/mathlive/index.d.ts +3 -9
  299. package/types/modules/mathlive/module.d.ts +10 -0
  300. package/types/modules/mathlive/tooltip.d.ts +1 -1
  301. package/types/modules/mention/Mention.d.ts +3 -4
  302. package/types/modules/mention/index.d.ts +2 -0
  303. package/types/modules/mention/mention-link.d.ts +17 -0
  304. package/types/modules/shortcut-key/index.d.ts +12 -8
  305. package/types/modules/table-up/index.d.ts +3 -3
  306. package/types/modules/toolbar/better-toolbar.d.ts +8 -0
  307. package/types/modules/toolbar/index.d.ts +2 -8
  308. package/types/tools/fullscreen.d.ts +5 -1
  309. package/types/ui/icons.config.d.ts +1 -0
  310. package/types/utils/is.d.ts +1 -1
  311. package/es/config/types/additional-toolbar-item.interface.es.js +0 -2
  312. package/es/config/types/additional-toolbar-item.interface.es.js.map +0 -1
  313. package/es/config/types/content-change.interface.es.js +0 -2
  314. package/es/config/types/content-change.interface.es.js.map +0 -1
  315. package/es/config/types/content-save.interface.es.js +0 -2
  316. package/es/config/types/content-save.interface.es.js.map +0 -1
  317. package/es/config/types/counter-option.interface.es.js +0 -2
  318. package/es/config/types/counter-option.interface.es.js.map +0 -1
  319. package/es/config/types/editor-toolbar.interface.es.js +0 -2
  320. package/es/config/types/editor-toolbar.interface.es.js.map +0 -1
  321. package/es/config/types/file-operation.interface.es.js +0 -2
  322. package/es/config/types/file-operation.interface.es.js.map +0 -1
  323. package/es/config/types/focus-change.interface.es.js +0 -2
  324. package/es/config/types/focus-change.interface.es.js.map +0 -1
  325. package/es/config/types/fullscreen-module.interface.es.js +0 -2
  326. package/es/config/types/fullscreen-module.interface.es.js.map +0 -1
  327. package/es/config/types/help-panel-item.interface.es.js +0 -2
  328. package/es/config/types/help-panel-item.interface.es.js.map +0 -1
  329. package/es/config/types/help-panel-option.interface.es.js +0 -2
  330. package/es/config/types/help-panel-option.interface.es.js.map +0 -1
  331. package/es/config/types/image-module.interface.es.js +0 -2
  332. package/es/config/types/image-module.interface.es.js.map +0 -1
  333. package/es/config/types/image-upload.interface.es.js +0 -2
  334. package/es/config/types/image-upload.interface.es.js.map +0 -1
  335. package/es/config/types/load-on-demand-module.interface.es.js +0 -2
  336. package/es/config/types/load-on-demand-module.interface.es.js.map +0 -1
  337. package/es/config/types/mention-module.interface.es.js +0 -2
  338. package/es/config/types/mention-module.interface.es.js.map +0 -1
  339. package/es/config/types/paste-change.interface.es.js +0 -2
  340. package/es/config/types/paste-change.interface.es.js.map +0 -1
  341. package/es/config/types/quick-menu-module.interface.es.js +0 -2
  342. package/es/config/types/quick-menu-module.interface.es.js.map +0 -1
  343. package/es/config/types/range.interface.es.js +0 -2
  344. package/es/config/types/range.interface.es.js.map +0 -1
  345. package/es/config/types/registry-options.interface.es.js +0 -2
  346. package/es/config/types/registry-options.interface.es.js.map +0 -1
  347. package/es/config/types/selection-change.interface.es.js +0 -2
  348. package/es/config/types/selection-change.interface.es.js.map +0 -1
  349. package/es/config/types/toolbar-item.interface.es.js +0 -2
  350. package/es/config/types/toolbar-item.interface.es.js.map +0 -1
  351. package/es/config/types/validate-error.interface.es.js +0 -2
  352. package/es/config/types/validate-error.interface.es.js.map +0 -1
  353. package/es/modules/custom-image/BlotFormatter.es.js.map +0 -1
  354. package/es/modules/custom-image/Options.es.js +0 -95
  355. package/es/modules/custom-image/Options.es.js.map +0 -1
  356. package/es/modules/custom-image/actions/Action.es.js +0 -15
  357. package/es/modules/custom-image/actions/Action.es.js.map +0 -1
  358. package/es/modules/custom-image/actions/DeleteAction.es.js.map +0 -1
  359. package/es/modules/custom-image/image-bar.es.js +0 -127
  360. package/es/modules/custom-image/image-bar.es.js.map +0 -1
  361. package/es/modules/custom-image/specs/BlotSpec.es.js +0 -27
  362. package/es/modules/custom-image/specs/BlotSpec.es.js.map +0 -1
  363. package/es/modules/custom-image/specs/CustomImageSpec.es.js.map +0 -1
  364. package/es/modules/custom-image/specs/ImageSpec.es.js +0 -29
  365. package/es/modules/custom-image/specs/ImageSpec.es.js.map +0 -1
  366. package/es/modules/emoji/emoji-list/index.es.js +0 -5
  367. package/es/modules/emoji/emoji-list/people.es.js +0 -114
  368. package/es/modules/emoji/emoji-list/people.es.js.map +0 -1
  369. package/es/modules/emoji/emoji-list.es.js +0 -9
  370. package/es/modules/emoji/emoji-list.es.js.map +0 -1
  371. package/es/modules/emoji/emoji-map.es.js +0 -9
  372. package/es/modules/emoji/emoji-map.es.js.map +0 -1
  373. package/es/modules/emoji/emoji-sprite.es.js +0 -5
  374. package/es/modules/emoji/emoji-sprite.es.js.map +0 -1
  375. package/es/modules/emoji/formats/emoji-blot.es.js +0 -41
  376. package/es/modules/emoji/formats/emoji-blot.es.js.map +0 -1
  377. package/es/modules/emoji/index.es.js +0 -8
  378. package/es/modules/emoji/index.es.js.map +0 -1
  379. package/es/modules/emoji/modules/emoji.es.js +0 -248
  380. package/es/modules/emoji/modules/emoji.es.js.map +0 -1
  381. package/es/modules/emoji/modules/toolbar-emoji.es.js +0 -153
  382. package/es/modules/emoji/modules/toolbar-emoji.es.js.map +0 -1
  383. package/es/modules/emoji/utils.es.js +0 -19
  384. package/es/modules/emoji/utils.es.js.map +0 -1
  385. package/es/modules/mention/Mention.es.js.map +0 -1
  386. package/es/modules/mention/MentionLink.es.js.map +0 -1
  387. package/lib/config/types/additional-toolbar-item.interface.cjs.js +0 -2
  388. package/lib/config/types/additional-toolbar-item.interface.cjs.js.map +0 -1
  389. package/lib/config/types/content-change.interface.cjs.js +0 -2
  390. package/lib/config/types/content-change.interface.cjs.js.map +0 -1
  391. package/lib/config/types/content-save.interface.cjs.js +0 -2
  392. package/lib/config/types/content-save.interface.cjs.js.map +0 -1
  393. package/lib/config/types/counter-option.interface.cjs.js +0 -2
  394. package/lib/config/types/counter-option.interface.cjs.js.map +0 -1
  395. package/lib/config/types/editor-toolbar.interface.cjs.js +0 -2
  396. package/lib/config/types/editor-toolbar.interface.cjs.js.map +0 -1
  397. package/lib/config/types/file-operation.interface.cjs.js +0 -2
  398. package/lib/config/types/file-operation.interface.cjs.js.map +0 -1
  399. package/lib/config/types/focus-change.interface.cjs.js +0 -2
  400. package/lib/config/types/focus-change.interface.cjs.js.map +0 -1
  401. package/lib/config/types/fullscreen-module.interface.cjs.js +0 -2
  402. package/lib/config/types/fullscreen-module.interface.cjs.js.map +0 -1
  403. package/lib/config/types/help-panel-item.interface.cjs.js +0 -2
  404. package/lib/config/types/help-panel-item.interface.cjs.js.map +0 -1
  405. package/lib/config/types/help-panel-option.interface.cjs.js +0 -2
  406. package/lib/config/types/help-panel-option.interface.cjs.js.map +0 -1
  407. package/lib/config/types/image-module.interface.cjs.js +0 -2
  408. package/lib/config/types/image-module.interface.cjs.js.map +0 -1
  409. package/lib/config/types/image-upload.interface.cjs.js +0 -2
  410. package/lib/config/types/image-upload.interface.cjs.js.map +0 -1
  411. package/lib/config/types/load-on-demand-module.interface.cjs.js +0 -2
  412. package/lib/config/types/load-on-demand-module.interface.cjs.js.map +0 -1
  413. package/lib/config/types/mention-module.interface.cjs.js +0 -2
  414. package/lib/config/types/mention-module.interface.cjs.js.map +0 -1
  415. package/lib/config/types/paste-change.interface.cjs.js +0 -2
  416. package/lib/config/types/paste-change.interface.cjs.js.map +0 -1
  417. package/lib/config/types/quick-menu-module.interface.cjs.js +0 -2
  418. package/lib/config/types/quick-menu-module.interface.cjs.js.map +0 -1
  419. package/lib/config/types/range.interface.cjs.js +0 -2
  420. package/lib/config/types/range.interface.cjs.js.map +0 -1
  421. package/lib/config/types/registry-options.interface.cjs.js +0 -2
  422. package/lib/config/types/registry-options.interface.cjs.js.map +0 -1
  423. package/lib/config/types/selection-change.interface.cjs.js +0 -2
  424. package/lib/config/types/selection-change.interface.cjs.js.map +0 -1
  425. package/lib/config/types/toolbar-item.interface.cjs.js +0 -2
  426. package/lib/config/types/toolbar-item.interface.cjs.js.map +0 -1
  427. package/lib/config/types/validate-error.interface.cjs.js +0 -2
  428. package/lib/config/types/validate-error.interface.cjs.js.map +0 -1
  429. package/lib/modules/custom-image/BlotFormatter.cjs.js.map +0 -1
  430. package/lib/modules/custom-image/Options.cjs.js +0 -95
  431. package/lib/modules/custom-image/Options.cjs.js.map +0 -1
  432. package/lib/modules/custom-image/actions/Action.cjs.js +0 -15
  433. package/lib/modules/custom-image/actions/Action.cjs.js.map +0 -1
  434. package/lib/modules/custom-image/actions/DeleteAction.cjs.js.map +0 -1
  435. package/lib/modules/custom-image/image-bar.cjs.js +0 -127
  436. package/lib/modules/custom-image/image-bar.cjs.js.map +0 -1
  437. package/lib/modules/custom-image/specs/BlotSpec.cjs.js +0 -27
  438. package/lib/modules/custom-image/specs/BlotSpec.cjs.js.map +0 -1
  439. package/lib/modules/custom-image/specs/CustomImageSpec.cjs.js.map +0 -1
  440. package/lib/modules/custom-image/specs/ImageSpec.cjs.js +0 -29
  441. package/lib/modules/custom-image/specs/ImageSpec.cjs.js.map +0 -1
  442. package/lib/modules/emoji/emoji-list/index.cjs.js +0 -5
  443. package/lib/modules/emoji/emoji-list/people.cjs.js +0 -114
  444. package/lib/modules/emoji/emoji-list/people.cjs.js.map +0 -1
  445. package/lib/modules/emoji/emoji-list.cjs.js +0 -9
  446. package/lib/modules/emoji/emoji-list.cjs.js.map +0 -1
  447. package/lib/modules/emoji/emoji-map.cjs.js +0 -9
  448. package/lib/modules/emoji/emoji-map.cjs.js.map +0 -1
  449. package/lib/modules/emoji/emoji-sprite.cjs.js +0 -5
  450. package/lib/modules/emoji/emoji-sprite.cjs.js.map +0 -1
  451. package/lib/modules/emoji/formats/emoji-blot.cjs.js +0 -41
  452. package/lib/modules/emoji/formats/emoji-blot.cjs.js.map +0 -1
  453. package/lib/modules/emoji/index.cjs.js +0 -8
  454. package/lib/modules/emoji/index.cjs.js.map +0 -1
  455. package/lib/modules/emoji/modules/emoji.cjs.js +0 -248
  456. package/lib/modules/emoji/modules/emoji.cjs.js.map +0 -1
  457. package/lib/modules/emoji/modules/toolbar-emoji.cjs.js +0 -153
  458. package/lib/modules/emoji/modules/toolbar-emoji.cjs.js.map +0 -1
  459. package/lib/modules/emoji/utils.cjs.js +0 -19
  460. package/lib/modules/emoji/utils.cjs.js.map +0 -1
  461. package/lib/modules/mention/Mention.cjs.js.map +0 -1
  462. package/lib/modules/mention/MentionLink.cjs.js.map +0 -1
@@ -0,0 +1,32 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ import { BlotSpec } from "./blot-spec.es.js";
5
+ class ImageSpec extends BlotSpec {
6
+ constructor() {
7
+ super(...arguments);
8
+ __publicField(this, "img", null);
9
+ __publicField(this, "onClick", (event) => {
10
+ const el = event.target;
11
+ if (!(el instanceof HTMLElement) || el.tagName !== "IMG") {
12
+ return;
13
+ }
14
+ event.stopPropagation();
15
+ this.img = el;
16
+ this.formatter.show(this);
17
+ });
18
+ }
19
+ init() {
20
+ this.formatter.quill.root.addEventListener("click", this.onClick);
21
+ }
22
+ getTargetElement() {
23
+ return this.img;
24
+ }
25
+ onHide() {
26
+ this.img = null;
27
+ }
28
+ }
29
+ export {
30
+ ImageSpec
31
+ };
32
+ //# sourceMappingURL=image-spec.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-spec.es.js","sources":["../../../../../src/modules/custom-image/specs/image-spec.ts"],"sourcesContent":["import { BlotSpec } from './blot-spec'\r\n\r\nexport class ImageSpec extends BlotSpec {\r\n img: HTMLImageElement | null = null\r\n\r\n init() {\r\n this.formatter.quill.root.addEventListener('click', this.onClick)\r\n }\r\n\r\n getTargetElement() {\r\n return this.img\r\n }\r\n\r\n onHide() {\r\n this.img = null\r\n }\r\n\r\n onClick = (event: MouseEvent) => {\r\n const el = event.target\r\n if (!(el instanceof HTMLElement) || el.tagName !== 'IMG') {\r\n return\r\n }\r\n event.stopPropagation()\r\n\r\n this.img = el as HTMLImageElement\r\n this.formatter.show(this)\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;AAEO,MAAM,kBAAkB,SAAS;AAAA,EAAjC;AAAA;AACL,+BAA+B;AAc/B,mCAAU,CAAC,UAAsB;AAC/B,YAAM,KAAK,MAAM;AACjB,UAAI,EAAE,cAAc,gBAAgB,GAAG,YAAY,OAAO;AACxD;AAAA,MAAA;AAEF,YAAM,gBAAgB;AAEtB,WAAK,MAAM;AACN,WAAA,UAAU,KAAK,IAAI;AAAA,IAC1B;AAAA;AAAA,EArBA,OAAO;AACL,SAAK,UAAU,MAAM,KAAK,iBAAiB,SAAS,KAAK,OAAO;AAAA,EAAA;AAAA,EAGlE,mBAAmB;AACjB,WAAO,KAAK;AAAA,EAAA;AAAA,EAGd,SAAS;AACP,SAAK,MAAM;AAAA,EAAA;AAaf;"}
@@ -0,0 +1,9 @@
1
+ import { BlotSpec } from "./blot-spec.es.js";
2
+ import { CustomImageSpec } from "./custom-image-spec.es.js";
3
+ import { ImageSpec } from "./image-spec.es.js";
4
+ export {
5
+ BlotSpec,
6
+ CustomImageSpec,
7
+ ImageSpec
8
+ };
9
+ //# sourceMappingURL=index.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -1,8 +1,11 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1
4
  import Quill from "quill";
2
5
  import { isString } from "../utils/is.es.js";
3
6
  const Uploader = Quill.import("modules/uploader");
4
7
  const Delta = Quill.import("delta");
5
- const _FileUploader = class _FileUploader extends Uploader {
8
+ class FileUploader extends Uploader {
6
9
  constructor(quill, options) {
7
10
  super(quill, options);
8
11
  this.quill = quill;
@@ -67,9 +70,8 @@ const _FileUploader = class _FileUploader extends Uploader {
67
70
  }
68
71
  }
69
72
  }
70
- };
71
- _FileUploader.DEFAULTS = {};
72
- let FileUploader = _FileUploader;
73
+ }
74
+ __publicField(FileUploader, "DEFAULTS", {});
73
75
  export {
74
76
  FileUploader
75
77
  };
@@ -1 +1 @@
1
- {"version":3,"file":"custom-uploader.es.js","sources":["../../../src/modules/custom-uploader.ts"],"sourcesContent":["import type { Range } from 'quill'\r\nimport type TypeUploader from 'quill/modules/uploader'\r\nimport type FluentEditor from '../core/fluent-editor'\r\nimport Quill from 'quill'\r\nimport { isString } from '../utils/is'\r\n\r\nconst Uploader = Quill.import('modules/uploader') as typeof TypeUploader\r\nconst Delta = Quill.import('delta')\r\n\r\ninterface UploaderOptions {\r\n mimetypes: string[]\r\n handler: (this: { quill: Quill }, range: Range, files: File[]) => void\r\n}\r\nexport interface FileUploaderOptions {\r\n mimetypes: string[]\r\n maxSize: number\r\n handler: (this: { quill: FluentEditor }, range: Range, files: File[]) => Promise<(string | false)[]> | (string | false)[]\r\n success: (this: { quill: FluentEditor }, file: File, range: Range) => void\r\n fail: (this: { quill: FluentEditor }, file: File, range: Range) => void\r\n}\r\nexport class FileUploader extends Uploader {\r\n static DEFAULTS = {} as typeof Uploader.DEFAULTS\r\n // Partial<UploaderOptions> for ts type\r\n options: Partial<UploaderOptions> & FileUploaderOptions\r\n constructor(public quill: FluentEditor, options: Partial<FileUploaderOptions>) {\r\n super(quill, options as any)\r\n this.options = this.resolveOptions(options)\r\n // paste handle in clipboard\r\n }\r\n\r\n resolveOptions(options: Partial<FileUploaderOptions> = {}) {\r\n return Object.assign({\r\n mimetypes: ['*'],\r\n maxSize: Number.POSITIVE_INFINITY,\r\n handler(range: Range, files: File[]) {\r\n return files.map(file => URL.createObjectURL(file))\r\n },\r\n success() {},\r\n fail() {},\r\n }, options)\r\n }\r\n\r\n validateFile(file: File) {\r\n return this.options.mimetypes.some(type => (file.type || 'text/plain').match(type.replaceAll('*', '.*'))) && file.size < this.options.maxSize\r\n }\r\n\r\n async getFileUrls(files: File[], range: Range) {\r\n const uploads = files.filter(file => this.validateFile(file))\r\n return this.options.handler.call(this, range, uploads)\r\n }\r\n\r\n async upload(range: Range, files: FileList | File[]) {\r\n const uploads = []\r\n const fails = []\r\n for (const file of Array.from(files)) {\r\n if (this.validateFile(file)) {\r\n uploads.push(file)\r\n }\r\n else {\r\n fails.push(file)\r\n }\r\n }\r\n const result = await this.options.handler.call(this, range, uploads)\r\n const updateDelta = result.reduce((delta, url, i) => {\r\n if (isString(url)) {\r\n const type = uploads[i].type\r\n if (type.startsWith('image/')) {\r\n delta.insert({ image: url })\r\n }\r\n else if (type.startsWith('video/')) {\r\n delta.insert({ video: { src: url } })\r\n }\r\n else {\r\n delta.insert({ file: { size: uploads[i].size, title: uploads[i].name, src: url } })\r\n }\r\n }\r\n else {\r\n delta.insert('\\n')\r\n }\r\n return delta\r\n }, new Delta().retain(range.index).delete(range.length))\r\n this.quill.updateContents(updateDelta, Quill.sources.USER)\r\n this.quill.setSelection(range.index + result.length, Quill.sources.SILENT)\r\n for (const file of fails) {\r\n this.options.fail.call(this, file, range)\r\n }\r\n for (const [i, res] of result.entries()) {\r\n if (isString(res)) {\r\n this.options.success.call(this, files[i], { index: range.index + i, length: 0 })\r\n }\r\n else {\r\n this.options.fail.call(this, files[i], { index: range.index + i, length: 0 })\r\n }\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"custom-uploader.es.js","sources":["../../../src/modules/custom-uploader.ts"],"sourcesContent":["import type { Range } from 'quill'\r\nimport type TypeUploader from 'quill/modules/uploader'\r\nimport type FluentEditor from '../core/fluent-editor'\r\nimport Quill from 'quill'\r\nimport { isString } from '../utils/is'\r\n\r\nconst Uploader = Quill.import('modules/uploader') as typeof TypeUploader\r\nconst Delta = Quill.import('delta')\r\n\r\ninterface UploaderOptions {\r\n mimetypes: string[]\r\n handler: (this: { quill: Quill }, range: Range, files: File[]) => void\r\n}\r\nexport interface FileUploaderOptions {\r\n mimetypes: string[]\r\n maxSize: number\r\n handler: (this: { quill: FluentEditor }, range: Range, files: File[]) => Promise<(string | false)[]> | (string | false)[]\r\n success: (this: { quill: FluentEditor }, file: File, range: Range) => void\r\n fail: (this: { quill: FluentEditor }, file: File, range: Range) => void\r\n}\r\nexport class FileUploader extends Uploader {\r\n static DEFAULTS = {} as any\r\n // Partial<UploaderOptions> for ts type\r\n declare options: Partial<UploaderOptions> & FileUploaderOptions\r\n constructor(public quill: FluentEditor, options: Partial<FileUploaderOptions>) {\r\n super(quill, options as any)\r\n this.options = this.resolveOptions(options)\r\n // paste handle in clipboard\r\n }\r\n\r\n resolveOptions(options: Partial<FileUploaderOptions> = {}) {\r\n return Object.assign({\r\n mimetypes: ['*'],\r\n maxSize: Number.POSITIVE_INFINITY,\r\n handler(range: Range, files: File[]) {\r\n return files.map(file => URL.createObjectURL(file))\r\n },\r\n success() {},\r\n fail() {},\r\n }, options)\r\n }\r\n\r\n validateFile(file: File) {\r\n return this.options.mimetypes.some(type => (file.type || 'text/plain').match(type.replaceAll('*', '.*'))) && file.size < this.options.maxSize\r\n }\r\n\r\n async getFileUrls(files: File[], range: Range) {\r\n const uploads = files.filter(file => this.validateFile(file))\r\n return this.options.handler.call(this, range, uploads)\r\n }\r\n\r\n async upload(range: Range, files: FileList | File[]) {\r\n const uploads = []\r\n const fails = []\r\n for (const file of Array.from(files)) {\r\n if (this.validateFile(file)) {\r\n uploads.push(file)\r\n }\r\n else {\r\n fails.push(file)\r\n }\r\n }\r\n const result = await this.options.handler.call(this, range, uploads)\r\n const updateDelta = result.reduce((delta, url, i) => {\r\n if (isString(url)) {\r\n const type = uploads[i].type\r\n if (type.startsWith('image/')) {\r\n delta.insert({ image: url })\r\n }\r\n else if (type.startsWith('video/')) {\r\n delta.insert({ video: { src: url } })\r\n }\r\n else {\r\n delta.insert({ file: { size: uploads[i].size, title: uploads[i].name, src: url } })\r\n }\r\n }\r\n else {\r\n delta.insert('\\n')\r\n }\r\n return delta\r\n }, new Delta().retain(range.index).delete(range.length))\r\n this.quill.updateContents(updateDelta, Quill.sources.USER)\r\n this.quill.setSelection(range.index + result.length, Quill.sources.SILENT)\r\n for (const file of fails) {\r\n this.options.fail.call(this, file, range)\r\n }\r\n for (const [i, res] of result.entries()) {\r\n if (isString(res)) {\r\n this.options.success.call(this, files[i], { index: range.index + i, length: 0 })\r\n }\r\n else {\r\n this.options.fail.call(this, files[i], { index: range.index + i, length: 0 })\r\n }\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;AAMA,MAAM,WAAW,MAAM,OAAO,kBAAkB;AAChD,MAAM,QAAQ,MAAM,OAAO,OAAO;AAa3B,MAAM,qBAAqB,SAAS;AAAA,EAIzC,YAAmB,OAAqB,SAAuC;AAC7E,UAAM,OAAO,OAAc;AADV,SAAA,QAAA;AAEZ,SAAA,UAAU,KAAK,eAAe,OAAO;AAAA,EAAA;AAAA,EAI5C,eAAe,UAAwC,IAAI;AACzD,WAAO,OAAO,OAAO;AAAA,MACnB,WAAW,CAAC,GAAG;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAc,OAAe;AACnC,eAAO,MAAM,IAAI,CAAA,SAAQ,IAAI,gBAAgB,IAAI,CAAC;AAAA,MACpD;AAAA,MACA,UAAU;AAAA,MAAC;AAAA,MACX,OAAO;AAAA,MAAA;AAAA,OACN,OAAO;AAAA,EAAA;AAAA,EAGZ,aAAa,MAAY;AACvB,WAAO,KAAK,QAAQ,UAAU,KAAK,CAAS,UAAA,KAAK,QAAQ,cAAc,MAAM,KAAK,WAAW,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,QAAQ;AAAA,EAAA;AAAA,EAGxI,MAAM,YAAY,OAAe,OAAc;AAC7C,UAAM,UAAU,MAAM,OAAO,UAAQ,KAAK,aAAa,IAAI,CAAC;AAC5D,WAAO,KAAK,QAAQ,QAAQ,KAAK,MAAM,OAAO,OAAO;AAAA,EAAA;AAAA,EAGvD,MAAM,OAAO,OAAc,OAA0B;AACnD,UAAM,UAAU,CAAC;AACjB,UAAM,QAAQ,CAAC;AACf,eAAW,QAAQ,MAAM,KAAK,KAAK,GAAG;AAChC,UAAA,KAAK,aAAa,IAAI,GAAG;AAC3B,gBAAQ,KAAK,IAAI;AAAA,MAAA,OAEd;AACH,cAAM,KAAK,IAAI;AAAA,MAAA;AAAA,IACjB;AAEI,UAAA,SAAS,MAAM,KAAK,QAAQ,QAAQ,KAAK,MAAM,OAAO,OAAO;AACnE,UAAM,cAAc,OAAO,OAAO,CAAC,OAAO,KAAK,MAAM;AAC/C,UAAA,SAAS,GAAG,GAAG;AACX,cAAA,OAAO,QAAQ,CAAC,EAAE;AACpB,YAAA,KAAK,WAAW,QAAQ,GAAG;AAC7B,gBAAM,OAAO,EAAE,OAAO,IAAA,CAAK;AAAA,QAEpB,WAAA,KAAK,WAAW,QAAQ,GAAG;AAClC,gBAAM,OAAO,EAAE,OAAO,EAAE,KAAK,IAAA,GAAO;AAAA,QAAA,OAEjC;AACH,gBAAM,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE,MAAM,OAAO,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAA,GAAO;AAAA,QAAA;AAAA,MACpF,OAEG;AACH,cAAM,OAAO,IAAI;AAAA,MAAA;AAEZ,aAAA;AAAA,IAAA,GACN,IAAI,QAAQ,OAAO,MAAM,KAAK,EAAE,OAAO,MAAM,MAAM,CAAC;AACvD,SAAK,MAAM,eAAe,aAAa,MAAM,QAAQ,IAAI;AACpD,SAAA,MAAM,aAAa,MAAM,QAAQ,OAAO,QAAQ,MAAM,QAAQ,MAAM;AACzE,eAAW,QAAQ,OAAO;AACxB,WAAK,QAAQ,KAAK,KAAK,MAAM,MAAM,KAAK;AAAA,IAAA;AAE1C,eAAW,CAAC,GAAG,GAAG,KAAK,OAAO,WAAW;AACnC,UAAA,SAAS,GAAG,GAAG;AACjB,aAAK,QAAQ,QAAQ,KAAK,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,MAAM,QAAQ,GAAG,QAAQ,GAAG;AAAA,MAAA,OAE5E;AACH,aAAK,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,MAAM,QAAQ,GAAG,QAAQ,GAAG;AAAA,MAAA;AAAA,IAC9E;AAAA,EACF;AAEJ;AA1EE,cADW,cACJ,YAAW,CAAC;"}
@@ -1,17 +1,18 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1
4
  import Quill from "quill";
2
5
  const BlockEmbed = Quill.import("blots/block/embed");
3
- const _DividerBlot = class _DividerBlot extends BlockEmbed {
6
+ class DividerBlot extends BlockEmbed {
4
7
  static create() {
5
8
  const node = super.create();
6
9
  node.setAttribute("contenteditable", "false");
7
10
  return node;
8
11
  }
9
- };
10
- _DividerBlot.blotName = "divider";
11
- _DividerBlot.tagName = "hr";
12
- let DividerBlot = _DividerBlot;
13
- Quill.register(DividerBlot);
12
+ }
13
+ __publicField(DividerBlot, "blotName", "divider");
14
+ __publicField(DividerBlot, "tagName", "hr");
14
15
  export {
15
- DividerBlot as default
16
+ DividerBlot
16
17
  };
17
18
  //# sourceMappingURL=divider.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"divider.es.js","sources":["../../../src/modules/divider.ts"],"sourcesContent":["import Quill from 'quill'\r\n\r\nconst BlockEmbed = Quill.import('blots/block/embed')\r\n\r\nclass DividerBlot extends BlockEmbed {\r\n static blotName = 'divider'\r\n static tagName = 'hr'\r\n\r\n static create() {\r\n const node = super.create()\r\n node.setAttribute('contenteditable', 'false')\r\n return node\r\n }\r\n}\r\n\r\nQuill.register(DividerBlot)\r\nexport default DividerBlot\r\n"],"names":[],"mappings":";AAEA,MAAM,aAAa,MAAM,OAAO,mBAAmB;AAEnD,MAAM,eAAN,MAAM,qBAAoB,WAAW;AAAA,EAInC,OAAO,SAAS;AACR,UAAA,OAAO,MAAM,OAAO;AACrB,SAAA,aAAa,mBAAmB,OAAO;AACrC,WAAA;AAAA,EAAA;AAEX;AARE,aAAO,WAAW;AAClB,aAAO,UAAU;AAFnB,IAAM,cAAN;AAWA,MAAM,SAAS,WAAW;"}
1
+ {"version":3,"file":"divider.es.js","sources":["../../../src/modules/divider.ts"],"sourcesContent":["import type { BlockEmbed as TypeBlockEmbed } from 'quill/blots/block'\r\nimport Quill from 'quill'\r\n\r\nconst BlockEmbed = Quill.import('blots/block/embed') as typeof TypeBlockEmbed\r\n\r\nexport class DividerBlot extends BlockEmbed {\r\n static blotName = 'divider'\r\n static tagName = 'hr'\r\n\r\n static create() {\r\n const node = super.create() as HTMLElement\r\n node.setAttribute('contenteditable', 'false')\r\n return node\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;AAGA,MAAM,aAAa,MAAM,OAAO,mBAAmB;AAE5C,MAAM,oBAAoB,WAAW;AAAA,EAI1C,OAAO,SAAS;AACR,UAAA,OAAO,MAAM,OAAO;AACrB,SAAA,aAAa,mBAAmB,OAAO;AACrC,WAAA;AAAA,EAAA;AAEX;AARE,cADW,aACJ,YAAW;AAClB,cAFW,aAEJ,WAAU;"}
@@ -0,0 +1,175 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ import data from "../node_modules/.pnpm/@emoji-mart_data@1.2.1/node_modules/@emoji-mart/data/sets/15/native.json.es.js";
5
+ import { computePosition } from "../node_modules/.pnpm/@floating-ui_dom@1.7.2/node_modules/@floating-ui/dom/dist/floating-ui.dom.es.js";
6
+ import { Picker as $efa000751917694d$export$2e2bcd8739ae039 } from "../node_modules/.pnpm/emoji-mart@5.6.0/node_modules/emoji-mart/dist/module.es.js";
7
+ import { debounce } from "lodash-es";
8
+ const DEFAULT_OPTIONS = {
9
+ theme: "light",
10
+ set: "native",
11
+ skinTonePosition: "none",
12
+ previewPosition: "bottom",
13
+ searchPosition: "sticky",
14
+ categories: ["frequent", "people", "nature", "foods", "activity", "places", "objects", "symbols", "flags"],
15
+ maxFrequentRows: 2,
16
+ perLine: 8,
17
+ navPosition: "top",
18
+ noCountryFlags: false,
19
+ dynamicWidth: false
20
+ };
21
+ const PICKER_DOM_ID = "emoji-picker";
22
+ const LOCALE_MAP = {
23
+ "zh-CN": "zh",
24
+ "en-US": "en"
25
+ };
26
+ class EmojiModule {
27
+ constructor(quill, options = {}) {
28
+ __publicField(this, "quill");
29
+ __publicField(this, "options");
30
+ __publicField(this, "picker", null);
31
+ __publicField(this, "isPickerVisible", false);
32
+ __publicField(this, "cleanupResizeObserver", null);
33
+ this.quill = quill;
34
+ this.options = options;
35
+ const toolbar = this.quill.getModule("toolbar");
36
+ if (toolbar) {
37
+ toolbar.addHandler("emoji", () => {
38
+ if (this.isPickerVisible) {
39
+ this.closeDialog();
40
+ } else {
41
+ this.openDialog();
42
+ }
43
+ });
44
+ }
45
+ }
46
+ getEmojiButton() {
47
+ return document.querySelector(".ql-emoji");
48
+ }
49
+ async updatePickerPosition() {
50
+ const button = this.getEmojiButton();
51
+ const pickerElement = document.getElementById(PICKER_DOM_ID);
52
+ if (!button || !this.picker || !pickerElement) {
53
+ return;
54
+ }
55
+ try {
56
+ const { x, y } = await computePosition(button, pickerElement);
57
+ this.picker.style.top = `${y}px`;
58
+ this.picker.style.left = `${x}px`;
59
+ } catch (error) {
60
+ console.warn("Failed to compute picker position:", error);
61
+ }
62
+ }
63
+ // 监听容器大小变化,更新表情选择弹窗位置
64
+ setupContainerResizeObserver() {
65
+ const container = this.quill.root.parentElement;
66
+ if (!container) {
67
+ return null;
68
+ }
69
+ const debouncedUpdate = debounce(() => {
70
+ this.updatePickerPosition();
71
+ }, 100);
72
+ const resizeObserver = new ResizeObserver(() => {
73
+ debouncedUpdate();
74
+ });
75
+ resizeObserver.observe(container);
76
+ return () => {
77
+ resizeObserver.disconnect();
78
+ debouncedUpdate.cancel();
79
+ };
80
+ }
81
+ // 创建表情选择弹窗
82
+ createPicker() {
83
+ const pickerConfig = {
84
+ ...DEFAULT_OPTIONS,
85
+ // emoji-mart 与 tiny-editor 国际化的的 locale 不一致使用 LOCALE_MAP 转换
86
+ locale: LOCALE_MAP[this.quill.lang] ?? "en",
87
+ ...this.options,
88
+ data,
89
+ onEmojiSelect: this.handleEmojiSelect.bind(this),
90
+ onClickOutside: this.handleClickOutside.bind(this)
91
+ };
92
+ const picker = new $efa000751917694d$export$2e2bcd8739ae039(pickerConfig);
93
+ picker.id = PICKER_DOM_ID;
94
+ picker.style.position = "absolute";
95
+ picker.style.zIndex = "1000";
96
+ return picker;
97
+ }
98
+ // 打开表情弹窗
99
+ openDialog() {
100
+ if (this.picker) {
101
+ return;
102
+ }
103
+ try {
104
+ this.picker = this.createPicker();
105
+ document.body.appendChild(this.picker);
106
+ this.updatePickerPosition();
107
+ this.cleanupResizeObserver = this.setupContainerResizeObserver();
108
+ this.isPickerVisible = true;
109
+ } catch (error) {
110
+ console.error("Failed to open emoji picker:", error);
111
+ this.closeDialog();
112
+ }
113
+ }
114
+ // 关闭表情弹窗
115
+ closeDialog() {
116
+ var _a;
117
+ if (!this.picker) {
118
+ return;
119
+ }
120
+ this.isPickerVisible = false;
121
+ this.picker.remove();
122
+ this.picker = null;
123
+ (_a = this.cleanupResizeObserver) == null ? void 0 : _a.call(this);
124
+ this.cleanupResizeObserver = null;
125
+ }
126
+ // 处理表情选择事件
127
+ handleEmojiSelect(emoji) {
128
+ const selection = this.quill.getSelection(true);
129
+ if (!selection) {
130
+ console.warn("No selection available for emoji insertion");
131
+ return;
132
+ }
133
+ try {
134
+ const emojiDelta = this.quill.insertText(selection.index, emoji.native, "user");
135
+ this.closeDialog();
136
+ this.setSelectionAfterEmoji(emojiDelta);
137
+ } catch (error) {
138
+ console.error("Failed to insert emoji:", error);
139
+ }
140
+ }
141
+ // 设置表情插入后的光标位置
142
+ setSelectionAfterEmoji(emojiDelta) {
143
+ setTimeout(() => {
144
+ try {
145
+ const newSelection = this.quill.getSelection(true);
146
+ if (newSelection && emojiDelta) {
147
+ this.quill.setSelection(newSelection.index + emojiDelta.length());
148
+ }
149
+ } catch (error) {
150
+ console.warn("Failed to set selection after emoji insertion:", error);
151
+ }
152
+ }, 0);
153
+ }
154
+ // 处理外部点击事件
155
+ handleClickOutside(event) {
156
+ const button = this.getEmojiButton();
157
+ const target = event.target;
158
+ const isClickOnButton = target === button || target instanceof Element && (button == null ? void 0 : button.contains(target));
159
+ if (isClickOnButton) {
160
+ return;
161
+ }
162
+ this.closeDialog();
163
+ }
164
+ // 销毁模块,清理资源
165
+ destroy() {
166
+ var _a;
167
+ (_a = this.cleanupResizeObserver) == null ? void 0 : _a.call(this);
168
+ this.cleanupResizeObserver = null;
169
+ this.closeDialog();
170
+ }
171
+ }
172
+ export {
173
+ EmojiModule
174
+ };
175
+ //# sourceMappingURL=emoji.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emoji.es.js","sources":["../../../src/modules/emoji.ts"],"sourcesContent":["import type { Delta } from 'quill'\r\nimport type TypeToolbar from 'quill/modules/toolbar'\r\nimport type FluentEditor from '../fluent-editor'\r\nimport data from '@emoji-mart/data'\r\nimport { computePosition } from '@floating-ui/dom'\r\nimport { Picker } from 'emoji-mart'\r\nimport { debounce } from 'lodash-es'\r\n\r\nexport interface EmojiModuleOptions {\r\n theme?: string\r\n locale?: string\r\n set?: string\r\n skinTonePosition?: string\r\n previewPosition?: string\r\n searchPosition?: string\r\n categories?: string[]\r\n maxFrequentRows?: number\r\n perLine?: number\r\n navPosition?: string\r\n noCountryFlags?: boolean\r\n dynamicWidth?: boolean\r\n}\r\n\r\nconst DEFAULT_OPTIONS: Readonly<EmojiModuleOptions> = {\r\n theme: 'light',\r\n set: 'native',\r\n skinTonePosition: 'none',\r\n previewPosition: 'bottom',\r\n searchPosition: 'sticky',\r\n categories: ['frequent', 'people', 'nature', 'foods', 'activity', 'places', 'objects', 'symbols', 'flags'],\r\n maxFrequentRows: 2,\r\n perLine: 8,\r\n navPosition: 'top',\r\n noCountryFlags: false,\r\n dynamicWidth: false,\r\n} as const\r\n\r\nconst PICKER_DOM_ID = 'emoji-picker'\r\n\r\nconst LOCALE_MAP = {\r\n 'zh-CN': 'zh',\r\n 'en-US': 'en',\r\n} as const\r\n\r\nclass EmojiModule {\r\n private readonly quill: FluentEditor\r\n private readonly options: EmojiModuleOptions\r\n private picker: HTMLElement | null = null\r\n private isPickerVisible = false\r\n private cleanupResizeObserver: (() => void) | null = null\r\n\r\n constructor(quill: FluentEditor, options: EmojiModuleOptions = {}) {\r\n this.quill = quill\r\n\r\n this.options = options\r\n\r\n const toolbar = this.quill.getModule('toolbar') as TypeToolbar\r\n\r\n if (toolbar) {\r\n toolbar.addHandler('emoji', () => {\r\n if (this.isPickerVisible) {\r\n this.closeDialog()\r\n }\r\n else {\r\n this.openDialog()\r\n }\r\n })\r\n }\r\n }\r\n\r\n private getEmojiButton() {\r\n return document.querySelector('.ql-emoji') as HTMLElement | null\r\n }\r\n\r\n private async updatePickerPosition() {\r\n const button = this.getEmojiButton()\r\n const pickerElement = document.getElementById(PICKER_DOM_ID)\r\n\r\n if (!button || !this.picker || !pickerElement) {\r\n return\r\n }\r\n\r\n try {\r\n const { x, y } = await computePosition(button, pickerElement)\r\n this.picker.style.top = `${y}px`\r\n this.picker.style.left = `${x}px`\r\n }\r\n catch (error) {\r\n console.warn('Failed to compute picker position:', error)\r\n }\r\n }\r\n\r\n // 监听容器大小变化,更新表情选择弹窗位置\r\n private setupContainerResizeObserver() {\r\n const container = this.quill.root.parentElement\r\n if (!container) {\r\n return null\r\n }\r\n\r\n const debouncedUpdate = debounce(() => {\r\n this.updatePickerPosition()\r\n }, 100)\r\n\r\n const resizeObserver = new ResizeObserver(() => {\r\n debouncedUpdate()\r\n })\r\n\r\n resizeObserver.observe(container)\r\n\r\n return () => {\r\n resizeObserver.disconnect()\r\n debouncedUpdate.cancel()\r\n }\r\n }\r\n\r\n // 创建表情选择弹窗\r\n private createPicker() {\r\n const pickerConfig = {\r\n ...DEFAULT_OPTIONS,\r\n // emoji-mart 与 tiny-editor 国际化的的 locale 不一致使用 LOCALE_MAP 转换\r\n locale: LOCALE_MAP[this.quill.lang] ?? 'en',\r\n ...this.options,\r\n data,\r\n onEmojiSelect: this.handleEmojiSelect.bind(this),\r\n onClickOutside: this.handleClickOutside.bind(this),\r\n }\r\n\r\n const picker = new Picker(pickerConfig) as unknown as HTMLElement\r\n\r\n // 设置样式和属性\r\n picker.id = PICKER_DOM_ID\r\n picker.style.position = 'absolute'\r\n picker.style.zIndex = '1000'\r\n\r\n return picker\r\n }\r\n\r\n // 打开表情弹窗\r\n public openDialog() {\r\n if (this.picker) {\r\n return\r\n }\r\n\r\n try {\r\n this.picker = this.createPicker()\r\n document.body.appendChild(this.picker)\r\n\r\n this.updatePickerPosition()\r\n this.cleanupResizeObserver = this.setupContainerResizeObserver()\r\n this.isPickerVisible = true\r\n }\r\n catch (error) {\r\n console.error('Failed to open emoji picker:', error)\r\n this.closeDialog()\r\n }\r\n }\r\n\r\n // 关闭表情弹窗\r\n public closeDialog() {\r\n if (!this.picker) {\r\n return\r\n }\r\n\r\n this.isPickerVisible = false\r\n this.picker.remove()\r\n this.picker = null\r\n\r\n this.cleanupResizeObserver?.()\r\n this.cleanupResizeObserver = null\r\n }\r\n\r\n // 处理表情选择事件\r\n private handleEmojiSelect(emoji: { native: string }) {\r\n const selection = this.quill.getSelection(true)\r\n if (!selection) {\r\n console.warn('No selection available for emoji insertion')\r\n return\r\n }\r\n\r\n try {\r\n const emojiDelta = this.quill.insertText(selection.index, emoji.native, 'user')\r\n\r\n this.closeDialog()\r\n\r\n // 异步设置光标位置,确保插入完成后再设置\r\n this.setSelectionAfterEmoji(emojiDelta)\r\n }\r\n catch (error) {\r\n console.error('Failed to insert emoji:', error)\r\n }\r\n }\r\n\r\n // 设置表情插入后的光标位置\r\n private setSelectionAfterEmoji(emojiDelta: Delta) {\r\n setTimeout(() => {\r\n try {\r\n const newSelection = this.quill.getSelection(true)\r\n if (newSelection && emojiDelta) {\r\n this.quill.setSelection(newSelection.index + emojiDelta.length())\r\n }\r\n }\r\n catch (error) {\r\n console.warn('Failed to set selection after emoji insertion:', error)\r\n }\r\n }, 0)\r\n }\r\n\r\n // 处理外部点击事件\r\n private handleClickOutside(event: MouseEvent) {\r\n const button = this.getEmojiButton()\r\n\r\n const target = event.target\r\n\r\n const isClickOnButton = target === button || (target instanceof Element && button?.contains(target))\r\n\r\n // 如果点击的是表情符号按钮或其子元素,则不关闭选择器\r\n if (isClickOnButton) {\r\n return\r\n }\r\n\r\n this.closeDialog()\r\n }\r\n\r\n // 销毁模块,清理资源\r\n public destroy() {\r\n this.cleanupResizeObserver?.()\r\n this.cleanupResizeObserver = null\r\n this.closeDialog()\r\n }\r\n}\r\n\r\nexport { EmojiModule }\r\n"],"names":["Picker"],"mappings":"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"}
@@ -1,8 +1,11 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1
4
  import Quill from "quill";
2
5
  import { sanitize } from "../../../config/editor.utils.es.js";
3
6
  const Embed = Quill.import("blots/embed");
4
7
  const FILE_ATTRIBUTES = ["id", "title", "size", "lastModified"];
5
- const _File = class _File extends Embed {
8
+ class File extends Embed {
6
9
  static create(value) {
7
10
  const node = super.create(value);
8
11
  const size = value.size / 1024;
@@ -42,13 +45,12 @@ const _File = class _File extends Embed {
42
45
  static sanitize(url) {
43
46
  return sanitize(url, this.PROTOCOL_WHITELIST) && url || "";
44
47
  }
45
- };
46
- _File.blotName = "file";
47
- _File.tagName = "A";
48
- _File.className = "ql-file-item";
49
- _File.PROTOCOL_WHITELIST = ["http", "https", "blob"];
50
- let File = _File;
48
+ }
49
+ __publicField(File, "blotName", "file");
50
+ __publicField(File, "tagName", "A");
51
+ __publicField(File, "className", "ql-file-item");
52
+ __publicField(File, "PROTOCOL_WHITELIST", ["http", "https", "blob"]);
51
53
  export {
52
- File as default
54
+ File
53
55
  };
54
56
  //# sourceMappingURL=file.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.es.js","sources":["../../../../../src/modules/file/formats/file.ts"],"sourcesContent":["import type TypeEmbed from 'quill/blots/embed'\r\nimport Quill from 'quill'\r\nimport { sanitize } from '../../../config/editor.utils'\r\n\r\nconst Embed = Quill.import('blots/embed') as typeof TypeEmbed\r\nconst FILE_ATTRIBUTES = ['id', 'title', 'size', 'lastModified']\r\n\r\nexport interface FileValue {\r\n size: number\r\n src: string\r\n title: string\r\n}\r\nclass File extends Embed {\r\n static blotName = 'file'\r\n static tagName = 'A'\r\n static className = 'ql-file-item'\r\n static PROTOCOL_WHITELIST = ['http', 'https', 'blob']\r\n\r\n static create(value: FileValue) {\r\n const node = super.create(value) as HTMLAnchorElement\r\n const size = value.size / 1024\r\n const fixSize = !size ? 0 : size < 1 ? 1 : size.toFixed(0)\r\n node.classList.add('icon-file')\r\n node.setAttribute('contenteditable', 'false')\r\n const fileSvg = '<svg viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"><path d=\"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326z m1.8 562H232V136h302v216c0 23.2 18.8 42 42 42h216v494z\" p-id=\"2307\"></path></svg>'\r\n node.innerHTML = `${fileSvg} ${value.title} (${fixSize} KB)`\r\n const src = this.sanitize(value.src)\r\n if (src) {\r\n node.href = src\r\n node.target = '_blank'\r\n }\r\n FILE_ATTRIBUTES.forEach((key) => {\r\n if (value[key]) {\r\n node.dataset[key] = value[key]\r\n }\r\n })\r\n return node\r\n }\r\n\r\n static value(domNode: HTMLAnchorElement) {\r\n return this.getFormats(domNode)\r\n }\r\n\r\n static getFormats(domNode: HTMLAnchorElement) {\r\n const formats: Record<string, string> = {}\r\n const href = this.sanitize(domNode.href)\r\n if (href) {\r\n formats.src = href\r\n }\r\n FILE_ATTRIBUTES.forEach((key) => {\r\n if (domNode.dataset[key]) {\r\n formats[key] = domNode.dataset[key]\r\n }\r\n })\r\n return formats\r\n }\r\n\r\n static sanitize(url: string) {\r\n return (sanitize(url, this.PROTOCOL_WHITELIST) && url) || ''\r\n }\r\n}\r\n\r\nexport default File\r\n"],"names":[],"mappings":";;AAIA,MAAM,QAAQ,MAAM,OAAO,aAAa;AACxC,MAAM,kBAAkB,CAAC,MAAM,SAAS,QAAQ,cAAc;AAO9D,MAAM,QAAN,MAAM,cAAa,MAAM;AAAA,EAMvB,OAAO,OAAO,OAAkB;AACxB,UAAA,OAAO,MAAM,OAAO,KAAK;AACzB,UAAA,OAAO,MAAM,OAAO;AACpB,UAAA,UAAU,CAAC,OAAO,IAAI,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC;AACpD,SAAA,UAAU,IAAI,WAAW;AACzB,SAAA,aAAa,mBAAmB,OAAO;AAC5C,UAAM,UAAU;AAChB,SAAK,YAAY,GAAG,OAAO,IAAI,MAAM,KAAK,KAAK,OAAO;AACtD,UAAM,MAAM,KAAK,SAAS,MAAM,GAAG;AACnC,QAAI,KAAK;AACP,WAAK,OAAO;AACZ,WAAK,SAAS;AAAA,IAAA;AAEA,oBAAA,QAAQ,CAAC,QAAQ;AAC3B,UAAA,MAAM,GAAG,GAAG;AACd,aAAK,QAAQ,GAAG,IAAI,MAAM,GAAG;AAAA,MAAA;AAAA,IAC/B,CACD;AACM,WAAA;AAAA,EAAA;AAAA,EAGT,OAAO,MAAM,SAA4B;AAChC,WAAA,KAAK,WAAW,OAAO;AAAA,EAAA;AAAA,EAGhC,OAAO,WAAW,SAA4B;AAC5C,UAAM,UAAkC,CAAC;AACzC,UAAM,OAAO,KAAK,SAAS,QAAQ,IAAI;AACvC,QAAI,MAAM;AACR,cAAQ,MAAM;AAAA,IAAA;AAEA,oBAAA,QAAQ,CAAC,QAAQ;AAC3B,UAAA,QAAQ,QAAQ,GAAG,GAAG;AACxB,gBAAQ,GAAG,IAAI,QAAQ,QAAQ,GAAG;AAAA,MAAA;AAAA,IACpC,CACD;AACM,WAAA;AAAA,EAAA;AAAA,EAGT,OAAO,SAAS,KAAa;AAC3B,WAAQ,SAAS,KAAK,KAAK,kBAAkB,KAAK,OAAQ;AAAA,EAAA;AAE9D;AA/CE,MAAO,WAAW;AAClB,MAAO,UAAU;AACjB,MAAO,YAAY;AACnB,MAAO,qBAAqB,CAAC,QAAQ,SAAS,MAAM;AAJtD,IAAM,OAAN;"}
1
+ {"version":3,"file":"file.es.js","sources":["../../../../../src/modules/file/formats/file.ts"],"sourcesContent":["import type TypeEmbed from 'quill/blots/embed'\r\nimport Quill from 'quill'\r\nimport { sanitize } from '../../../config/editor.utils'\r\n\r\nconst Embed = Quill.import('blots/embed') as typeof TypeEmbed\r\nconst FILE_ATTRIBUTES = ['id', 'title', 'size', 'lastModified']\r\n\r\nexport interface FileValue {\r\n size: number\r\n src: string\r\n title: string\r\n}\r\nexport class File extends Embed {\r\n static blotName = 'file'\r\n static tagName = 'A'\r\n static className = 'ql-file-item'\r\n static PROTOCOL_WHITELIST = ['http', 'https', 'blob']\r\n\r\n static create(value: FileValue) {\r\n const node = super.create(value) as HTMLAnchorElement\r\n const size = value.size / 1024\r\n const fixSize = !size ? 0 : size < 1 ? 1 : size.toFixed(0)\r\n node.classList.add('icon-file')\r\n node.setAttribute('contenteditable', 'false')\r\n const fileSvg = '<svg viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"><path d=\"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326z m1.8 562H232V136h302v216c0 23.2 18.8 42 42 42h216v494z\" p-id=\"2307\"></path></svg>'\r\n node.innerHTML = `${fileSvg} ${value.title} (${fixSize} KB)`\r\n const src = this.sanitize(value.src)\r\n if (src) {\r\n node.href = src\r\n node.target = '_blank'\r\n }\r\n FILE_ATTRIBUTES.forEach((key) => {\r\n if (value[key]) {\r\n node.dataset[key] = value[key]\r\n }\r\n })\r\n return node\r\n }\r\n\r\n static value(domNode: HTMLAnchorElement) {\r\n return this.getFormats(domNode)\r\n }\r\n\r\n static getFormats(domNode: HTMLAnchorElement) {\r\n const formats: Record<string, string> = {}\r\n const href = this.sanitize(domNode.href)\r\n if (href) {\r\n formats.src = href\r\n }\r\n FILE_ATTRIBUTES.forEach((key) => {\r\n if (domNode.dataset[key]) {\r\n formats[key] = domNode.dataset[key]\r\n }\r\n })\r\n return formats\r\n }\r\n\r\n static sanitize(url: string) {\r\n return (sanitize(url, this.PROTOCOL_WHITELIST) && url) || ''\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;AAIA,MAAM,QAAQ,MAAM,OAAO,aAAa;AACxC,MAAM,kBAAkB,CAAC,MAAM,SAAS,QAAQ,cAAc;AAOvD,MAAM,aAAa,MAAM;AAAA,EAM9B,OAAO,OAAO,OAAkB;AACxB,UAAA,OAAO,MAAM,OAAO,KAAK;AACzB,UAAA,OAAO,MAAM,OAAO;AACpB,UAAA,UAAU,CAAC,OAAO,IAAI,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC;AACpD,SAAA,UAAU,IAAI,WAAW;AACzB,SAAA,aAAa,mBAAmB,OAAO;AAC5C,UAAM,UAAU;AAChB,SAAK,YAAY,GAAG,OAAO,IAAI,MAAM,KAAK,KAAK,OAAO;AACtD,UAAM,MAAM,KAAK,SAAS,MAAM,GAAG;AACnC,QAAI,KAAK;AACP,WAAK,OAAO;AACZ,WAAK,SAAS;AAAA,IAAA;AAEA,oBAAA,QAAQ,CAAC,QAAQ;AAC3B,UAAA,MAAM,GAAG,GAAG;AACd,aAAK,QAAQ,GAAG,IAAI,MAAM,GAAG;AAAA,MAAA;AAAA,IAC/B,CACD;AACM,WAAA;AAAA,EAAA;AAAA,EAGT,OAAO,MAAM,SAA4B;AAChC,WAAA,KAAK,WAAW,OAAO;AAAA,EAAA;AAAA,EAGhC,OAAO,WAAW,SAA4B;AAC5C,UAAM,UAAkC,CAAC;AACzC,UAAM,OAAO,KAAK,SAAS,QAAQ,IAAI;AACvC,QAAI,MAAM;AACR,cAAQ,MAAM;AAAA,IAAA;AAEA,oBAAA,QAAQ,CAAC,QAAQ;AAC3B,UAAA,QAAQ,QAAQ,GAAG,GAAG;AACxB,gBAAQ,GAAG,IAAI,QAAQ,QAAQ,GAAG;AAAA,MAAA;AAAA,IACpC,CACD;AACM,WAAA;AAAA,EAAA;AAAA,EAGT,OAAO,SAAS,KAAa;AAC3B,WAAQ,SAAS,KAAK,KAAK,kBAAkB,KAAK,OAAQ;AAAA,EAAA;AAE9D;AA/CE,cADW,MACJ,YAAW;AAClB,cAFW,MAEJ,WAAU;AACjB,cAHW,MAGJ,aAAY;AACnB,cAJW,MAIJ,sBAAqB,CAAC,QAAQ,SAAS,MAAM;"}
@@ -1,31 +1,9 @@
1
- import Quill from "quill";
2
- import File from "./formats/file.es.js";
3
- import FileBar from "./modules/file-bar.es.js";
4
- class FileModule {
5
- constructor(quill) {
6
- this.quill = quill;
7
- this.quill = quill;
8
- quill.root.addEventListener("click", (event) => this.clickEvent(event), false);
9
- }
10
- static register() {
11
- Quill.register("formats/file", File, true);
12
- }
13
- clickEvent(event) {
14
- event.preventDefault();
15
- const target = event.target;
16
- const fileDom = target.closest("a.ql-file-item");
17
- if (fileDom) {
18
- if (this.fileBar) {
19
- this.fileBar.destroy();
20
- }
21
- this.fileBar = new FileBar(this.quill, fileDom);
22
- } else if (this.fileBar && !target.closest(".ql-file-bar")) {
23
- this.fileBar.destroy();
24
- this.fileBar = null;
25
- }
26
- }
27
- }
1
+ import { File } from "./formats/file.es.js";
2
+ import { FileBar } from "./modules/file-bar.es.js";
3
+ import { FileModule } from "./modules/file-module.es.js";
28
4
  export {
29
- FileModule as default
5
+ File,
6
+ FileBar,
7
+ FileModule
30
8
  };
31
9
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../../../../src/modules/file/index.ts"],"sourcesContent":["import type FluentEditor from '../../core/fluent-editor'\r\nimport Quill from 'quill'\r\nimport File from './formats/file'\r\nimport FileBar from './modules/file-bar'\r\n\r\nclass FileModule {\r\n fileBar: FileBar\r\n\r\n static register() {\r\n Quill.register('formats/file', File, true)\r\n }\r\n\r\n constructor(public quill: FluentEditor) {\r\n this.quill = quill\r\n quill.root.addEventListener('click', event => this.clickEvent(event), false)\r\n }\r\n\r\n clickEvent(event: MouseEvent) {\r\n event.preventDefault()\r\n const target = event.target as HTMLElement\r\n const fileDom = target.closest('a.ql-file-item')\r\n if (fileDom) {\r\n if (this.fileBar) {\r\n this.fileBar.destroy()\r\n }\r\n this.fileBar = new FileBar(this.quill, fileDom)\r\n }\r\n else if (this.fileBar && !target.closest('.ql-file-bar')) {\r\n this.fileBar.destroy()\r\n this.fileBar = null\r\n }\r\n }\r\n}\r\n\r\nexport default FileModule\r\n"],"names":[],"mappings":";;;AAKA,MAAM,WAAW;AAAA,EAOf,YAAmB,OAAqB;AAArB,SAAA,QAAA;AACjB,SAAK,QAAQ;AACP,UAAA,KAAK,iBAAiB,SAAS,CAAA,UAAS,KAAK,WAAW,KAAK,GAAG,KAAK;AAAA,EAAA;AAAA,EAN7E,OAAO,WAAW;AACV,UAAA,SAAS,gBAAgB,MAAM,IAAI;AAAA,EAAA;AAAA,EAQ3C,WAAW,OAAmB;AAC5B,UAAM,eAAe;AACrB,UAAM,SAAS,MAAM;AACf,UAAA,UAAU,OAAO,QAAQ,gBAAgB;AAC/C,QAAI,SAAS;AACX,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ,QAAQ;AAAA,MAAA;AAEvB,WAAK,UAAU,IAAI,QAAQ,KAAK,OAAO,OAAO;AAAA,IAAA,WAEvC,KAAK,WAAW,CAAC,OAAO,QAAQ,cAAc,GAAG;AACxD,WAAK,QAAQ,QAAQ;AACrB,WAAK,UAAU;AAAA,IAAA;AAAA,EACjB;AAEJ;"}
1
+ {"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -1,10 +1,18 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1
4
  import Quill from "quill";
2
5
  import { Range } from "quill/core/selection";
3
6
  import { unshiftString } from "../../../utils/method.es.js";
4
- import File from "../formats/file.es.js";
5
- const Delta = Quill.imports.delta;
7
+ import { File } from "../formats/file.es.js";
8
+ const Delta = Quill.import("delta");
6
9
  class FileBar {
7
10
  constructor(quill, target) {
11
+ __publicField(this, "quill");
12
+ __publicField(this, "file");
13
+ __publicField(this, "domNode");
14
+ __publicField(this, "fileRange");
15
+ __publicField(this, "template");
8
16
  this.quill = quill;
9
17
  this.file = target;
10
18
  const fileBlot = Quill.find(target);
@@ -120,6 +128,6 @@ class FileBar {
120
128
  }
121
129
  }
122
130
  export {
123
- FileBar as default
131
+ FileBar
124
132
  };
125
133
  //# sourceMappingURL=file-bar.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-bar.es.js","sources":["../../../../../src/modules/file/modules/file-bar.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { Range } from 'quill/core/selection'\r\nimport { unshiftString } from '../../../utils/method'\r\nimport File from '../formats/file'\r\n\r\nconst Delta = Quill.imports.delta\r\n\r\nexport default class FileBar {\r\n quill: any\r\n file: any\r\n domNode: HTMLElement\r\n fileRange: any\r\n template: string\r\n\r\n constructor(quill, target) {\r\n this.quill = quill\r\n this.file = target\r\n const fileBlot = Quill.find(target)\r\n const index = this.quill.getIndex(fileBlot)\r\n const [fileItem, offset] = this.quill.scroll.descendant(File, index)\r\n const length = fileItem && fileItem.length()\r\n this.fileRange = new Range(index - offset, length)\r\n\r\n const timestamp = Number(this.file.dataset.lastModified)\r\n const _lastModifiedDate = this.formatDate(timestamp)\r\n this.template = [\r\n // `<a class=\"ql-last-modified-date\" href=\"${this.file.href}\" target=\"_blank\">${this.file.href}</a>`,\r\n // '<span class=\"ql-split\"></span>',\r\n // `<a class=\"ql-file-preview\"><i class=\"icon-preview\"></i></a>`,\r\n `<a class=\"ql-file-download\"><i class=\"icon-download\"></i></a>`,\r\n '<a class=\"ql-file-delete\"><i class=\"icon-delete\"></i></a>',\r\n ].join('')\r\n\r\n this.createFileBar()\r\n }\r\n\r\n createFileBar() {\r\n this.domNode = document.createElement('div')\r\n this.domNode.className = 'ql-file-bar'\r\n this.domNode.innerHTML = this.template\r\n // 查看文件\r\n const filePreview = this.domNode.querySelector('a.ql-file-preview')\r\n if (filePreview) {\r\n filePreview.addEventListener('click', (event) => {\r\n this.operateFile(event, 'view')\r\n })\r\n }\r\n // 下载文件\r\n const fileDownload = this.domNode.querySelector('a.ql-file-download')\r\n if (fileDownload) {\r\n fileDownload.addEventListener('click', (event) => {\r\n this.operateFile(event, 'download')\r\n })\r\n }\r\n // 删除文件\r\n const fileDelete = this.domNode.querySelector('a.ql-file-delete')\r\n if (fileDelete) {\r\n fileDelete.addEventListener('click', (event) => {\r\n this.operateFile(event, 'delete')\r\n const delta = new Delta()\r\n .retain(this.fileRange.index)\r\n .delete(this.fileRange.length)\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(this.fileRange.index)\r\n })\r\n }\r\n\r\n this.setPosition()\r\n this.quill.root.parentNode.appendChild(this.domNode)\r\n }\r\n\r\n destroy() {\r\n if (this.domNode) {\r\n this.domNode.remove()\r\n this.domNode = null\r\n this.file = null\r\n }\r\n }\r\n\r\n operateFile(event, operate) {\r\n event.preventDefault()\r\n const fileId = this.file.dataset.id || ''\r\n const fileName = this.file.dataset.title || ''\r\n const fileDownloadUrl = this.file.href || ''\r\n if (fileId) {\r\n this.quill.emitter.emit('file-change', {\r\n operation: operate,\r\n data: { fileId, fileDownloadUrl },\r\n })\r\n }\r\n if (operate === 'download') {\r\n const a = document.createElement('a')\r\n a.href = fileDownloadUrl\r\n a.target = '_blank'\r\n a.id = 'exppub'\r\n a.download = fileName\r\n document.body.appendChild(a)\r\n const alink = document.getElementById('exppub')\r\n alink.click()\r\n alink.parentNode.removeChild(a)\r\n }\r\n this.destroy()\r\n }\r\n\r\n setPosition() {\r\n if (this.domNode && this.file) {\r\n const parent = this.quill.root.parentNode\r\n const child = this.file.querySelector('span')\r\n const containerRect = parent.getBoundingClientRect()\r\n const fileRect = child.getBoundingClientRect()\r\n this.css(this.domNode, {\r\n left: `${fileRect.left - containerRect.left}px`,\r\n top: `${fileRect.top - containerRect.top + 10}px`,\r\n })\r\n }\r\n }\r\n\r\n css(domNode, rules) {\r\n if (typeof rules === 'object') {\r\n for (const prop in rules) {\r\n if (prop) {\r\n if (Array.isArray(rules[prop])) {\r\n // 兼容IE11浏览器\r\n rules[prop].forEach((val) => {\r\n domNode.style[prop] = val\r\n })\r\n }\r\n else {\r\n domNode.style[prop] = rules[prop]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n formatDate(timestamp) {\r\n const date = new Date(timestamp)\r\n const year = date.getFullYear()\r\n // TODO\r\n const month = unshiftString(`${date.getMonth() + 1}`, 2, '0')\r\n const day = unshiftString(`${date.getDate()}`, 2, '0')\r\n const hour = unshiftString(`${date.getHours()}`, 2, '0')\r\n const minute = unshiftString(`${date.getMinutes()}`, 2, '0')\r\n return Number.isNaN(year) ? '--' : `${year}/${month}/${day} ${hour}:${minute}`\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-bar.es.js","sources":["../../../../../src/modules/file/modules/file-bar.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { Range } from 'quill/core/selection'\r\nimport { unshiftString } from '../../../utils/method'\r\nimport { File } from '../formats/file'\r\n\r\nconst Delta = Quill.import('delta')\r\n\r\nexport class FileBar {\r\n quill: any\r\n file: any\r\n domNode: HTMLElement\r\n fileRange: any\r\n template: string\r\n\r\n constructor(quill, target) {\r\n this.quill = quill\r\n this.file = target\r\n const fileBlot = Quill.find(target)\r\n const index = this.quill.getIndex(fileBlot)\r\n const [fileItem, offset] = this.quill.scroll.descendant(File, index)\r\n const length = fileItem && fileItem.length()\r\n this.fileRange = new Range(index - offset, length)\r\n\r\n const timestamp = Number(this.file.dataset.lastModified)\r\n const _lastModifiedDate = this.formatDate(timestamp)\r\n this.template = [\r\n // `<a class=\"ql-last-modified-date\" href=\"${this.file.href}\" target=\"_blank\">${this.file.href}</a>`,\r\n // '<span class=\"ql-split\"></span>',\r\n // `<a class=\"ql-file-preview\"><i class=\"icon-preview\"></i></a>`,\r\n `<a class=\"ql-file-download\"><i class=\"icon-download\"></i></a>`,\r\n '<a class=\"ql-file-delete\"><i class=\"icon-delete\"></i></a>',\r\n ].join('')\r\n\r\n this.createFileBar()\r\n }\r\n\r\n createFileBar() {\r\n this.domNode = document.createElement('div')\r\n this.domNode.className = 'ql-file-bar'\r\n this.domNode.innerHTML = this.template\r\n // 查看文件\r\n const filePreview = this.domNode.querySelector('a.ql-file-preview')\r\n if (filePreview) {\r\n filePreview.addEventListener('click', (event) => {\r\n this.operateFile(event, 'view')\r\n })\r\n }\r\n // 下载文件\r\n const fileDownload = this.domNode.querySelector('a.ql-file-download')\r\n if (fileDownload) {\r\n fileDownload.addEventListener('click', (event) => {\r\n this.operateFile(event, 'download')\r\n })\r\n }\r\n // 删除文件\r\n const fileDelete = this.domNode.querySelector('a.ql-file-delete')\r\n if (fileDelete) {\r\n fileDelete.addEventListener('click', (event) => {\r\n this.operateFile(event, 'delete')\r\n const delta = new Delta()\r\n .retain(this.fileRange.index)\r\n .delete(this.fileRange.length)\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(this.fileRange.index)\r\n })\r\n }\r\n\r\n this.setPosition()\r\n this.quill.root.parentNode.appendChild(this.domNode)\r\n }\r\n\r\n destroy() {\r\n if (this.domNode) {\r\n this.domNode.remove()\r\n this.domNode = null\r\n this.file = null\r\n }\r\n }\r\n\r\n operateFile(event, operate) {\r\n event.preventDefault()\r\n const fileId = this.file.dataset.id || ''\r\n const fileName = this.file.dataset.title || ''\r\n const fileDownloadUrl = this.file.href || ''\r\n if (fileId) {\r\n this.quill.emitter.emit('file-change', {\r\n operation: operate,\r\n data: { fileId, fileDownloadUrl },\r\n })\r\n }\r\n if (operate === 'download') {\r\n const a = document.createElement('a')\r\n a.href = fileDownloadUrl\r\n a.target = '_blank'\r\n a.id = 'exppub'\r\n a.download = fileName\r\n document.body.appendChild(a)\r\n const alink = document.getElementById('exppub')\r\n alink.click()\r\n alink.parentNode.removeChild(a)\r\n }\r\n this.destroy()\r\n }\r\n\r\n setPosition() {\r\n if (this.domNode && this.file) {\r\n const parent = this.quill.root.parentNode\r\n const child = this.file.querySelector('span')\r\n const containerRect = parent.getBoundingClientRect()\r\n const fileRect = child.getBoundingClientRect()\r\n this.css(this.domNode, {\r\n left: `${fileRect.left - containerRect.left}px`,\r\n top: `${fileRect.top - containerRect.top + 10}px`,\r\n })\r\n }\r\n }\r\n\r\n css(domNode, rules) {\r\n if (typeof rules === 'object') {\r\n for (const prop in rules) {\r\n if (prop) {\r\n if (Array.isArray(rules[prop])) {\r\n // 兼容IE11浏览器\r\n rules[prop].forEach((val) => {\r\n domNode.style[prop] = val\r\n })\r\n }\r\n else {\r\n domNode.style[prop] = rules[prop]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n formatDate(timestamp) {\r\n const date = new Date(timestamp)\r\n const year = date.getFullYear()\r\n // TODO\r\n const month = unshiftString(`${date.getMonth() + 1}`, 2, '0')\r\n const day = unshiftString(`${date.getDate()}`, 2, '0')\r\n const hour = unshiftString(`${date.getHours()}`, 2, '0')\r\n const minute = unshiftString(`${date.getMinutes()}`, 2, '0')\r\n return Number.isNaN(year) ? '--' : `${year}/${month}/${day} ${hour}:${minute}`\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ import Quill from "quill";
5
+ import { File } from "../formats/file.es.js";
6
+ import { FileBar } from "./file-bar.es.js";
7
+ class FileModule {
8
+ constructor(quill) {
9
+ __publicField(this, "fileBar");
10
+ this.quill = quill;
11
+ this.quill = quill;
12
+ quill.root.addEventListener("click", (event) => this.clickEvent(event), false);
13
+ }
14
+ static register() {
15
+ Quill.register("formats/file", File, true);
16
+ }
17
+ clickEvent(event) {
18
+ event.preventDefault();
19
+ const target = event.target;
20
+ const fileDom = target.closest("a.ql-file-item");
21
+ if (fileDom) {
22
+ if (this.fileBar) {
23
+ this.fileBar.destroy();
24
+ }
25
+ this.fileBar = new FileBar(this.quill, fileDom);
26
+ } else if (this.fileBar && !target.closest(".ql-file-bar")) {
27
+ this.fileBar.destroy();
28
+ this.fileBar = null;
29
+ }
30
+ }
31
+ }
32
+ export {
33
+ FileModule
34
+ };
35
+ //# sourceMappingURL=file-module.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-module.es.js","sources":["../../../../../src/modules/file/modules/file-module.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\r\nimport Quill from 'quill'\r\nimport { File } from '../formats/file'\r\nimport { FileBar } from './file-bar'\r\n\r\nexport class FileModule {\r\n fileBar: FileBar\r\n\r\n static register() {\r\n Quill.register('formats/file', File, true)\r\n }\r\n\r\n constructor(public quill: FluentEditor) {\r\n this.quill = quill\r\n quill.root.addEventListener('click', event => this.clickEvent(event), false)\r\n }\r\n\r\n clickEvent(event: MouseEvent) {\r\n event.preventDefault()\r\n const target = event.target as HTMLElement\r\n const fileDom = target.closest('a.ql-file-item')\r\n if (fileDom) {\r\n if (this.fileBar) {\r\n this.fileBar.destroy()\r\n }\r\n this.fileBar = new FileBar(this.quill, fileDom)\r\n }\r\n else if (this.fileBar && !target.closest('.ql-file-bar')) {\r\n this.fileBar.destroy()\r\n this.fileBar = null\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;;AAKO,MAAM,WAAW;AAAA,EAOtB,YAAmB,OAAqB;AANxC;AAMmB,SAAA,QAAA;AACjB,SAAK,QAAQ;AACP,UAAA,KAAK,iBAAiB,SAAS,CAAA,UAAS,KAAK,WAAW,KAAK,GAAG,KAAK;AAAA,EAAA;AAAA,EAN7E,OAAO,WAAW;AACV,UAAA,SAAS,gBAAgB,MAAM,IAAI;AAAA,EAAA;AAAA,EAQ3C,WAAW,OAAmB;AAC5B,UAAM,eAAe;AACrB,UAAM,SAAS,MAAM;AACf,UAAA,UAAU,OAAO,QAAQ,gBAAgB;AAC/C,QAAI,SAAS;AACX,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ,QAAQ;AAAA,MAAA;AAEvB,WAAK,UAAU,IAAI,QAAQ,KAAK,OAAO,OAAO;AAAA,IAAA,WAEvC,KAAK,WAAW,CAAC,OAAO,QAAQ,cAAc,GAAG;AACxD,WAAK,QAAQ,QAAQ;AACrB,WAAK,UAAU;AAAA,IAAA;AAAA,EACjB;AAEJ;"}
@@ -1,13 +1,16 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1
4
  import "../config/index.es.js";
2
5
  import { isUndefined } from "../utils/is.es.js";
3
6
  import { defaultLanguage, CHANGE_LANGUAGE_EVENT } from "../config/editor.config.es.js";
4
7
  const langs = {};
5
8
  class I18N {
6
9
  constructor(quill, options) {
7
- this.quill = quill;
8
- this.options = {
10
+ __publicField(this, "options", {
9
11
  lang: ""
10
- };
12
+ });
13
+ this.quill = quill;
11
14
  this.options = Object.assign({}, options, this.resolveLanguageOption(options || {}));
12
15
  Promise.resolve().then(() => this.changeLanguage(this.options, true));
13
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.es.js","sources":["../../../src/modules/i18n.ts"],"sourcesContent":["import type FluentEditor from '../fluent-editor'\r\nimport { CHANGE_LANGUAGE_EVENT, defaultLanguage } from '../config'\r\nimport { isUndefined } from '../utils/is'\r\n\r\nconst langs: Record<string, Record<string, string>> = {}\r\n\r\ninterface I18NOptions {\r\n lang: string\r\n}\r\nexport class I18N {\r\n static register(inputLangs: Record<string, Record<string, string>>, isCover: boolean = true) {\r\n for (const lang in inputLangs) {\r\n const texts = inputLangs[lang]\r\n if (isCover) {\r\n langs[lang] = texts\r\n }\r\n else {\r\n if (!langs[lang]) langs[lang] = {}\r\n Object.assign(langs[lang], texts)\r\n }\r\n }\r\n }\r\n\r\n static parserText(text: string, lang: string): string {\r\n const i18nPattern = /^_i18n\"([^\"]*)\"/\r\n const match = text.match(i18nPattern)\r\n let key = text\r\n if (match) {\r\n key = match[1]\r\n }\r\n return langs[lang]?.[key] || key\r\n }\r\n\r\n options: I18NOptions = {\r\n lang: '',\r\n }\r\n\r\n constructor(public quill: FluentEditor, options: Partial<I18NOptions>) {\r\n this.options = Object.assign({}, options, this.resolveLanguageOption(options || {}))\r\n // wait until all module registed\r\n Promise.resolve().then(() => this.changeLanguage(this.options, true))\r\n }\r\n\r\n resolveLanguageOption(options: Partial<I18NOptions>): I18NOptions {\r\n if (isUndefined(options.lang)) {\r\n options.lang = defaultLanguage\r\n }\r\n if (!(options.lang in langs)) {\r\n console.warn(`The language ${options.lang} is not supported. Use the default language: ${defaultLanguage}`)\r\n options.lang = defaultLanguage\r\n }\r\n return {\r\n lang: options.lang,\r\n }\r\n }\r\n\r\n changeLanguage(options: Partial<I18NOptions>, force: boolean = false) {\r\n const currentLang = this.options.lang\r\n const langOps = this.resolveLanguageOption(options)\r\n if (langOps.lang === currentLang && !force) return\r\n this.options.lang = langOps.lang\r\n this.quill.emitter.emit(CHANGE_LANGUAGE_EVENT, this.options.lang, langs[langOps.lang])\r\n }\r\n}\r\n\r\nexport { I18NOptions }\r\n\r\nexport default I18N\r\n"],"names":[],"mappings":";;;AAIA,MAAM,QAAgD,CAAC;AAKhD,MAAM,KAAK;AAAA,EA4BhB,YAAmB,OAAqB,SAA+B;AAApD,SAAA,QAAA;AAJI,SAAA,UAAA;AAAA,MACrB,MAAM;AAAA,IACR;AAGO,SAAA,UAAU,OAAO,OAAO,CAAC,GAAG,SAAS,KAAK,sBAAsB,WAAW,CAAA,CAAE,CAAC;AAE3E,YAAA,UAAU,KAAK,MAAM,KAAK,eAAe,KAAK,SAAS,IAAI,CAAC;AAAA,EAAA;AAAA,EA9BtE,OAAO,SAAS,YAAoD,UAAmB,MAAM;AAC3F,eAAW,QAAQ,YAAY;AACvB,YAAA,QAAQ,WAAW,IAAI;AAC7B,UAAI,SAAS;AACX,cAAM,IAAI,IAAI;AAAA,MAAA,OAEX;AACH,YAAI,CAAC,MAAM,IAAI,EAAS,OAAA,IAAI,IAAI,CAAC;AACjC,eAAO,OAAO,MAAM,IAAI,GAAG,KAAK;AAAA,MAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAGF,OAAO,WAAW,MAAc,MAAsB;;AACpD,UAAM,cAAc;AACd,UAAA,QAAQ,KAAK,MAAM,WAAW;AACpC,QAAI,MAAM;AACV,QAAI,OAAO;AACT,YAAM,MAAM,CAAC;AAAA,IAAA;AAEf,aAAO,WAAM,IAAI,MAAV,mBAAc,SAAQ;AAAA,EAAA;AAAA,EAa/B,sBAAsB,SAA4C;AAC5D,QAAA,YAAY,QAAQ,IAAI,GAAG;AAC7B,cAAQ,OAAO;AAAA,IAAA;AAEb,QAAA,EAAE,QAAQ,QAAQ,QAAQ;AAC5B,cAAQ,KAAK,gBAAgB,QAAQ,IAAI,gDAAgD,eAAe,EAAE;AAC1G,cAAQ,OAAO;AAAA,IAAA;AAEV,WAAA;AAAA,MACL,MAAM,QAAQ;AAAA,IAChB;AAAA,EAAA;AAAA,EAGF,eAAe,SAA+B,QAAiB,OAAO;AAC9D,UAAA,cAAc,KAAK,QAAQ;AAC3B,UAAA,UAAU,KAAK,sBAAsB,OAAO;AAClD,QAAI,QAAQ,SAAS,eAAe,CAAC,MAAO;AACvC,SAAA,QAAQ,OAAO,QAAQ;AACvB,SAAA,MAAM,QAAQ,KAAK,uBAAuB,KAAK,QAAQ,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,EAAA;AAEzF;"}
1
+ {"version":3,"file":"i18n.es.js","sources":["../../../src/modules/i18n.ts"],"sourcesContent":["import type FluentEditor from '../fluent-editor'\r\nimport { CHANGE_LANGUAGE_EVENT, defaultLanguage } from '../config'\r\nimport { isUndefined } from '../utils/is'\r\n\r\nconst langs: Record<string, Record<string, string>> = {}\r\n\r\nexport interface I18NOptions {\r\n lang: string\r\n}\r\nexport class I18N {\r\n static register(inputLangs: Record<string, Record<string, string>>, isCover: boolean = true) {\r\n for (const lang in inputLangs) {\r\n const texts = inputLangs[lang]\r\n if (isCover) {\r\n langs[lang] = texts\r\n }\r\n else {\r\n if (!langs[lang]) langs[lang] = {}\r\n Object.assign(langs[lang], texts)\r\n }\r\n }\r\n }\r\n\r\n static parserText(text: string, lang: string): string {\r\n const i18nPattern = /^_i18n\"([^\"]*)\"/\r\n const match = text.match(i18nPattern)\r\n let key = text\r\n if (match) {\r\n key = match[1]\r\n }\r\n return langs[lang]?.[key] || key\r\n }\r\n\r\n options: I18NOptions = {\r\n lang: '',\r\n }\r\n\r\n constructor(public quill: FluentEditor, options: Partial<I18NOptions>) {\r\n this.options = Object.assign({}, options, this.resolveLanguageOption(options || {}))\r\n // wait until all module registed\r\n Promise.resolve().then(() => this.changeLanguage(this.options, true))\r\n }\r\n\r\n resolveLanguageOption(options: Partial<I18NOptions>): I18NOptions {\r\n if (isUndefined(options.lang)) {\r\n options.lang = defaultLanguage\r\n }\r\n if (!(options.lang in langs)) {\r\n console.warn(`The language ${options.lang} is not supported. Use the default language: ${defaultLanguage}`)\r\n options.lang = defaultLanguage\r\n }\r\n return {\r\n lang: options.lang,\r\n }\r\n }\r\n\r\n changeLanguage(options: Partial<I18NOptions>, force: boolean = false) {\r\n const currentLang = this.options.lang\r\n const langOps = this.resolveLanguageOption(options)\r\n if (langOps.lang === currentLang && !force) return\r\n this.options.lang = langOps.lang\r\n this.quill.emitter.emit(CHANGE_LANGUAGE_EVENT, this.options.lang, langs[langOps.lang])\r\n }\r\n}\r\n\r\nexport default I18N\r\n"],"names":[],"mappings":";;;;;;AAIA,MAAM,QAAgD,CAAC;AAKhD,MAAM,KAAK;AAAA,EA4BhB,YAAmB,OAAqB,SAA+B;AAJvE,mCAAuB;AAAA,MACrB,MAAM;AAAA,IACR;AAEmB,SAAA,QAAA;AACZ,SAAA,UAAU,OAAO,OAAO,CAAC,GAAG,SAAS,KAAK,sBAAsB,WAAW,CAAA,CAAE,CAAC;AAE3E,YAAA,UAAU,KAAK,MAAM,KAAK,eAAe,KAAK,SAAS,IAAI,CAAC;AAAA,EAAA;AAAA,EA9BtE,OAAO,SAAS,YAAoD,UAAmB,MAAM;AAC3F,eAAW,QAAQ,YAAY;AACvB,YAAA,QAAQ,WAAW,IAAI;AAC7B,UAAI,SAAS;AACX,cAAM,IAAI,IAAI;AAAA,MAAA,OAEX;AACH,YAAI,CAAC,MAAM,IAAI,EAAS,OAAA,IAAI,IAAI,CAAC;AACjC,eAAO,OAAO,MAAM,IAAI,GAAG,KAAK;AAAA,MAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAGF,OAAO,WAAW,MAAc,MAAsB;;AACpD,UAAM,cAAc;AACd,UAAA,QAAQ,KAAK,MAAM,WAAW;AACpC,QAAI,MAAM;AACV,QAAI,OAAO;AACT,YAAM,MAAM,CAAC;AAAA,IAAA;AAEf,aAAO,WAAM,IAAI,MAAV,mBAAc,SAAQ;AAAA,EAAA;AAAA,EAa/B,sBAAsB,SAA4C;AAC5D,QAAA,YAAY,QAAQ,IAAI,GAAG;AAC7B,cAAQ,OAAO;AAAA,IAAA;AAEb,QAAA,EAAE,QAAQ,QAAQ,QAAQ;AAC5B,cAAQ,KAAK,gBAAgB,QAAQ,IAAI,gDAAgD,eAAe,EAAE;AAC1G,cAAQ,OAAO;AAAA,IAAA;AAEV,WAAA;AAAA,MACL,MAAM,QAAQ;AAAA,IAChB;AAAA,EAAA;AAAA,EAGF,eAAe,SAA+B,QAAiB,OAAO;AAC9D,UAAA,cAAc,KAAK,QAAQ;AAC3B,UAAA,UAAU,KAAK,sBAAsB,OAAO;AAClD,QAAI,QAAQ,SAAS,eAAe,CAAC,MAAO;AACvC,SAAA,QAAQ,OAAO,QAAQ;AACvB,SAAA,MAAM,QAAQ,KAAK,uBAAuB,KAAK,QAAQ,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,EAAA;AAEzF;"}
@@ -0,0 +1,26 @@
1
+ import "./counter.es.js";
2
+ import { CustomClipboard } from "./custom-clipboard.es.js";
3
+ import "./custom-image/index.es.js";
4
+ import { FileUploader } from "./custom-uploader.es.js";
5
+ import { DividerBlot } from "./divider.es.js";
6
+ import { EmojiModule } from "./emoji.es.js";
7
+ import "./file/index.es.js";
8
+ import { I18N } from "./i18n.es.js";
9
+ import "./link/index.es.js";
10
+ import "./mathlive/index.es.js";
11
+ import "./mention/index.es.js";
12
+ import { ShortCutKey, shortKey } from "./shortcut-key/index.es.js";
13
+ import "./syntax.es.js";
14
+ import { generateTableUp } from "./table-up/index.es.js";
15
+ import "./toolbar/index.es.js";
16
+ export {
17
+ CustomClipboard,
18
+ DividerBlot,
19
+ EmojiModule,
20
+ FileUploader,
21
+ I18N,
22
+ ShortCutKey,
23
+ generateTableUp,
24
+ shortKey
25
+ };
26
+ //# sourceMappingURL=index.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}