artalk 2.6.4 → 2.7.1

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 (316) hide show
  1. package/dist/Artalk.css +1 -1
  2. package/dist/Artalk.es.js +7756 -7432
  3. package/dist/Artalk.es.js.map +1 -0
  4. package/dist/Artalk.iife.js +2 -1
  5. package/dist/Artalk.iife.js.map +1 -0
  6. package/dist/Artalk.js +2 -1
  7. package/dist/Artalk.js.map +1 -0
  8. package/dist/ArtalkLite.css +1 -1
  9. package/dist/ArtalkLite.es.js +5576 -5252
  10. package/dist/ArtalkLite.es.js.map +1 -0
  11. package/dist/ArtalkLite.iife.js +2 -1
  12. package/dist/ArtalkLite.iife.js.map +1 -0
  13. package/dist/ArtalkLite.js +2 -1
  14. package/dist/ArtalkLite.js.map +1 -0
  15. package/dist/i18n/jp.js +1 -1
  16. package/dist/i18n/zh-TW.js +1 -1
  17. package/dist/src/api/{api-base.d.ts → _base.d.ts} +3 -7
  18. package/dist/src/api/_options.d.ts +19 -0
  19. package/dist/src/api/{request.d.ts → _request.d.ts} +3 -3
  20. package/dist/src/api/admin.d.ts +1 -1
  21. package/dist/src/api/captcha.d.ts +1 -1
  22. package/dist/src/api/comment.d.ts +2 -2
  23. package/dist/src/api/index.d.ts +2 -4
  24. package/dist/src/api/page.d.ts +3 -3
  25. package/dist/src/api/site.d.ts +2 -2
  26. package/dist/src/api/system.d.ts +13 -3
  27. package/dist/src/api/upload.d.ts +1 -1
  28. package/dist/src/api/user.d.ts +2 -2
  29. package/dist/src/artalk.d.ts +12 -37
  30. package/dist/src/comment/actions.d.ts +1 -1
  31. package/dist/src/comment/comment.d.ts +3 -4
  32. package/dist/src/comment/render.d.ts +21 -3
  33. package/dist/src/comment/renders/actions.d.ts +2 -2
  34. package/dist/src/comment/renders/avatar.d.ts +2 -2
  35. package/dist/src/comment/renders/content.d.ts +2 -2
  36. package/dist/src/comment/renders/header.d.ts +2 -2
  37. package/dist/src/comment/renders/index.d.ts +2 -2
  38. package/dist/src/comment/renders/pending.d.ts +2 -2
  39. package/dist/src/comment/renders/reply-at.d.ts +2 -2
  40. package/dist/src/comment/renders/reply-to.d.ts +2 -2
  41. package/dist/src/components/action-btn.d.ts +3 -5
  42. package/dist/src/{lib → components}/checker/admin.d.ts +1 -1
  43. package/dist/src/{lib → components}/checker/captcha-renders.d.ts +1 -1
  44. package/dist/src/{lib → components}/checker/captcha.d.ts +1 -1
  45. package/dist/src/{lib → components}/checker/index.d.ts +10 -7
  46. package/dist/src/components/dark-mode.d.ts +2 -0
  47. package/dist/src/components/dialog.d.ts +1 -3
  48. package/dist/src/components/error-dialog.d.ts +8 -0
  49. package/dist/src/components/pagination.d.ts +4 -3
  50. package/dist/src/components/read-more-btn.d.ts +3 -3
  51. package/dist/src/config.d.ts +24 -8
  52. package/dist/src/context.d.ts +16 -35
  53. package/dist/src/data.d.ts +27 -0
  54. package/dist/src/defaults.d.ts +1 -1
  55. package/dist/src/editor/editor.d.ts +14 -61
  56. package/dist/src/editor/state.d.ts +20 -0
  57. package/dist/src/i18n/en.d.ts +3 -0
  58. package/dist/src/i18n/external.d.ts +3 -0
  59. package/dist/src/i18n/index.d.ts +9 -0
  60. package/dist/src/i18n/jp.d.ts +3 -0
  61. package/dist/src/i18n/zh-CN.d.ts +1 -1
  62. package/dist/src/i18n/zh-TW.d.ts +3 -0
  63. package/dist/src/layer/index.d.ts +4 -3
  64. package/dist/src/layer/layer-manager.d.ts +9 -0
  65. package/dist/src/layer/layer.d.ts +8 -28
  66. package/dist/src/layer/scrollbar-helper.d.ts +5 -0
  67. package/dist/src/layer/sidebar-layer.d.ts +6 -6
  68. package/dist/src/layer/wrap.d.ts +13 -0
  69. package/dist/src/lib/component.d.ts +3 -8
  70. package/dist/src/lib/event-manager.d.ts +28 -0
  71. package/dist/src/lib/highlight.d.ts +1 -0
  72. package/dist/src/lib/marked-renderer.d.ts +4 -0
  73. package/dist/src/lib/marked.d.ts +4 -2
  74. package/dist/src/lib/sanitizer.d.ts +1 -0
  75. package/dist/src/lib/ui.d.ts +3 -2
  76. package/dist/src/lib/user.d.ts +8 -5
  77. package/dist/src/lib/utils.d.ts +11 -5
  78. package/dist/src/list/comment.d.ts +3 -0
  79. package/dist/src/list/layout.d.ts +23 -0
  80. package/dist/src/list/list.d.ts +13 -25
  81. package/dist/src/list/{list-nest.d.ts → nest.d.ts} +1 -1
  82. package/dist/src/list/page.d.ts +2 -0
  83. package/dist/src/list/paginator/index.d.ts +22 -7
  84. package/dist/src/list/paginator/read-more.d.ts +18 -0
  85. package/dist/src/list/paginator/up-down.d.ts +14 -0
  86. package/dist/src/main.d.ts +5 -0
  87. package/dist/src/plugins/admin-only-elem.d.ts +2 -0
  88. package/dist/src/plugins/conf-remoter.d.ts +2 -0
  89. package/dist/src/plugins/dark-mode.d.ts +2 -0
  90. package/dist/src/plugins/editor/_kit.d.ts +27 -0
  91. package/dist/src/plugins/editor/_plug.d.ts +29 -0
  92. package/dist/src/plugins/editor/_sample.d.ts +5 -0
  93. package/dist/src/plugins/editor/closable.d.ts +7 -0
  94. package/dist/src/{editor/plugs/emoticons-plug.d.ts → plugins/editor/emoticons.d.ts} +10 -16
  95. package/dist/src/plugins/editor/header-event.d.ts +6 -0
  96. package/dist/src/plugins/editor/header-link.d.ts +6 -0
  97. package/dist/src/plugins/editor/header-user.d.ts +16 -0
  98. package/dist/src/plugins/editor/index.d.ts +6 -0
  99. package/dist/src/plugins/editor/local-storage.d.ts +6 -0
  100. package/dist/src/plugins/editor/mover.d.ts +6 -0
  101. package/dist/src/plugins/editor/preview.d.ts +7 -0
  102. package/dist/src/plugins/editor/state-edit.d.ts +11 -0
  103. package/dist/src/plugins/editor/state-reply.d.ts +8 -0
  104. package/dist/src/plugins/editor/submit-add.d.ts +18 -0
  105. package/dist/src/plugins/editor/submit-btn.d.ts +5 -0
  106. package/dist/src/plugins/editor/submit.d.ts +17 -0
  107. package/dist/src/plugins/editor/textarea.d.ts +8 -0
  108. package/dist/src/plugins/editor/upload.d.ts +9 -0
  109. package/dist/src/plugins/editor-kit.d.ts +42 -0
  110. package/dist/src/plugins/index.d.ts +2 -0
  111. package/dist/src/plugins/list/copyright.d.ts +2 -0
  112. package/dist/src/plugins/list/count.d.ts +2 -0
  113. package/dist/src/plugins/list/dropdown.d.ts +2 -0
  114. package/dist/src/plugins/list/error-dialog.d.ts +2 -0
  115. package/dist/src/plugins/list/fetch.d.ts +2 -0
  116. package/dist/src/plugins/list/goto-first.d.ts +3 -0
  117. package/dist/src/plugins/list/goto.d.ts +2 -0
  118. package/dist/src/plugins/list/index.d.ts +3 -0
  119. package/dist/src/plugins/list/loading.d.ts +2 -0
  120. package/dist/src/plugins/list/no-comment.d.ts +2 -0
  121. package/dist/src/plugins/list/reach-bottom.d.ts +2 -0
  122. package/dist/src/plugins/list/sidebar-btn.d.ts +2 -0
  123. package/dist/src/plugins/list/time-ticking.d.ts +3 -0
  124. package/dist/src/plugins/list/unread-badge.d.ts +2 -0
  125. package/dist/src/plugins/list/unread.d.ts +2 -0
  126. package/dist/src/plugins/list/with-editor.d.ts +2 -0
  127. package/dist/src/plugins/markdown.d.ts +2 -0
  128. package/dist/src/plugins/stat.d.ts +13 -0
  129. package/dist/src/plugins/version-check.d.ts +2 -0
  130. package/dist/src/service.d.ts +19 -23
  131. package/dist/tests/e2e/comment-add.spec.d.ts +1 -0
  132. package/dist/types/config.d.ts +110 -0
  133. package/dist/types/context.d.ts +56 -136
  134. package/dist/types/data.d.ts +194 -0
  135. package/dist/types/editor.d.ts +76 -0
  136. package/dist/types/event.d.ts +36 -25
  137. package/dist/types/index.d.ts +7 -0
  138. package/dist/types/plugin.d.ts +2 -0
  139. package/dist/types/sidebar.d.ts +3 -0
  140. package/package.json +5 -2
  141. package/src/api/_base.ts +18 -0
  142. package/src/api/_options.ts +25 -0
  143. package/src/api/{request.ts → _request.ts} +19 -18
  144. package/src/api/admin.ts +1 -1
  145. package/src/api/captcha.ts +1 -1
  146. package/src/api/comment.ts +4 -4
  147. package/src/api/index.ts +3 -12
  148. package/src/api/page.ts +5 -5
  149. package/src/api/site.ts +2 -2
  150. package/src/api/system.ts +19 -7
  151. package/src/api/upload.ts +3 -3
  152. package/src/api/user.ts +3 -3
  153. package/src/artalk.ts +47 -99
  154. package/src/comment/actions.ts +1 -4
  155. package/src/comment/comment.ts +9 -6
  156. package/src/comment/render.ts +27 -5
  157. package/src/comment/renders/actions.ts +45 -45
  158. package/src/comment/renders/avatar.ts +7 -7
  159. package/src/comment/renders/content.ts +18 -18
  160. package/src/comment/renders/header.ts +13 -13
  161. package/src/comment/renders/index.ts +3 -3
  162. package/src/comment/renders/pending.ts +5 -5
  163. package/src/comment/renders/reply-at.ts +8 -8
  164. package/src/comment/renders/reply-to.ts +13 -13
  165. package/src/components/action-btn.ts +11 -13
  166. package/src/{lib → components}/checker/admin.ts +6 -6
  167. package/src/{lib → components}/checker/captcha-renders.ts +7 -6
  168. package/src/{lib → components}/checker/captcha.ts +1 -1
  169. package/src/{lib → components}/checker/index.ts +21 -26
  170. package/src/components/dark-mode.ts +30 -0
  171. package/src/components/dialog.ts +4 -9
  172. package/src/components/error-dialog.ts +35 -0
  173. package/src/components/pagination.ts +10 -6
  174. package/src/components/read-more-btn.ts +7 -7
  175. package/src/config.ts +60 -6
  176. package/src/context.ts +39 -144
  177. package/src/data.ts +110 -0
  178. package/src/defaults.ts +1 -1
  179. package/src/editor/editor.ts +39 -152
  180. package/src/editor/state.ts +52 -0
  181. package/src/i18n/en.ts +3 -0
  182. package/src/i18n/jp.ts +3 -0
  183. package/src/i18n/zh-CN.ts +4 -1
  184. package/src/i18n/zh-TW.ts +3 -0
  185. package/src/layer/index.ts +4 -4
  186. package/src/layer/layer-manager.ts +32 -0
  187. package/src/layer/layer.ts +20 -144
  188. package/src/layer/scrollbar-helper.ts +24 -0
  189. package/src/layer/sidebar-layer.ts +74 -64
  190. package/src/layer/wrap.ts +77 -0
  191. package/src/lib/component.ts +4 -11
  192. package/src/lib/detect.ts +1 -1
  193. package/src/lib/event-manager.ts +47 -0
  194. package/src/lib/highlight.ts +5 -0
  195. package/src/lib/marked-renderer.ts +32 -0
  196. package/src/lib/marked.ts +43 -104
  197. package/src/lib/sanitizer.ts +57 -0
  198. package/src/lib/ui.ts +22 -15
  199. package/src/lib/user.ts +21 -16
  200. package/src/lib/utils.ts +29 -18
  201. package/src/list/comment.ts +20 -0
  202. package/src/list/layout.ts +120 -0
  203. package/src/list/list.html +3 -1
  204. package/src/list/list.ts +56 -200
  205. package/src/list/{list-nest.ts → nest.ts} +1 -1
  206. package/src/list/page.ts +97 -0
  207. package/src/list/paginator/index.ts +20 -8
  208. package/src/list/paginator/read-more.ts +67 -0
  209. package/src/list/paginator/up-down.ts +51 -0
  210. package/src/main.ts +11 -0
  211. package/src/plugins/admin-only-elem.ts +40 -0
  212. package/src/plugins/conf-remoter.ts +54 -0
  213. package/src/plugins/dark-mode.ts +12 -0
  214. package/src/plugins/editor/_kit.ts +57 -0
  215. package/src/plugins/editor/_plug.ts +60 -0
  216. package/src/plugins/editor/_sample.ts +8 -0
  217. package/src/plugins/editor/closable.ts +44 -0
  218. package/src/{editor/plugs/emoticons-plug.ts → plugins/editor/emoticons.ts} +51 -52
  219. package/src/plugins/editor/header-event.ts +35 -0
  220. package/src/plugins/editor/header-link.ts +31 -0
  221. package/src/plugins/editor/header-user.ts +98 -0
  222. package/src/plugins/editor/index.ts +40 -0
  223. package/src/plugins/editor/local-storage.ts +36 -0
  224. package/src/plugins/editor/mover.ts +29 -0
  225. package/src/plugins/editor/preview.ts +41 -0
  226. package/src/plugins/editor/state-edit.ts +116 -0
  227. package/src/plugins/editor/state-reply.ts +91 -0
  228. package/src/plugins/editor/submit-add.ts +33 -0
  229. package/src/plugins/editor/submit-btn.ts +25 -0
  230. package/src/plugins/editor/submit.ts +73 -0
  231. package/src/plugins/editor/textarea.ts +55 -0
  232. package/src/plugins/editor/upload.ts +145 -0
  233. package/src/plugins/editor-kit.ts +161 -0
  234. package/src/plugins/index.ts +16 -0
  235. package/src/plugins/list/copyright.ts +16 -0
  236. package/src/plugins/list/count.ts +31 -0
  237. package/src/plugins/list/dropdown.ts +95 -0
  238. package/src/plugins/list/error-dialog.ts +22 -0
  239. package/src/plugins/list/fetch.ts +64 -0
  240. package/src/plugins/list/goto-first.ts +23 -0
  241. package/src/plugins/list/goto.ts +72 -0
  242. package/src/plugins/list/index.ts +25 -0
  243. package/src/plugins/list/loading.ts +17 -0
  244. package/src/plugins/list/no-comment.ts +25 -0
  245. package/src/plugins/list/reach-bottom.ts +46 -0
  246. package/src/plugins/list/sidebar-btn.ts +39 -0
  247. package/src/plugins/list/time-ticking.ts +22 -0
  248. package/src/plugins/list/unread-badge.ts +26 -0
  249. package/src/plugins/list/unread.ts +38 -0
  250. package/src/plugins/list/with-editor.ts +59 -0
  251. package/src/plugins/markdown.ts +10 -0
  252. package/src/plugins/stat.ts +82 -0
  253. package/src/plugins/version-check.ts +36 -0
  254. package/src/service.ts +34 -61
  255. package/src/style/comment.scss +5 -7
  256. package/src/style/editor.scss +5 -0
  257. package/src/style/list.scss +1 -1
  258. package/types/{artalk-config.d.ts → config.ts} +16 -2
  259. package/types/context.ts +84 -0
  260. package/types/{artalk-data.d.ts → data.ts} +41 -0
  261. package/types/editor.ts +95 -0
  262. package/types/event.ts +40 -0
  263. package/types/index.ts +7 -0
  264. package/types/plugin.ts +3 -0
  265. package/types/sidebar.ts +3 -0
  266. package/dist/src/comment/render-ctx.d.ts +0 -23
  267. package/dist/src/editor/edit-mode.d.ts +0 -9
  268. package/dist/src/editor/funcs.d.ts +0 -2
  269. package/dist/src/editor/index.d.ts +0 -2
  270. package/dist/src/editor/mover.d.ts +0 -8
  271. package/dist/src/editor/plug-manager.d.ts +0 -17
  272. package/dist/src/editor/plugs/editor-plug.d.ts +0 -38
  273. package/dist/src/editor/plugs/header-input-plug.d.ts +0 -13
  274. package/dist/src/editor/plugs/preview-plug.d.ts +0 -10
  275. package/dist/src/editor/plugs/upload-plug.d.ts +0 -10
  276. package/dist/src/editor/reply.d.ts +0 -9
  277. package/dist/src/editor/submit.d.ts +0 -16
  278. package/dist/src/lib/dark-mode.d.ts +0 -4
  279. package/dist/src/lib/stat.d.ts +0 -15
  280. package/dist/src/list/index.d.ts +0 -2
  281. package/dist/src/list/list-lite.d.ts +0 -77
  282. package/dist/src/list/list-ui.d.ts +0 -16
  283. package/dist/src/list/paginator/adaptors/index.d.ts +0 -12
  284. package/dist/src/list/paginator/adaptors/pagination.d.ts +0 -9
  285. package/dist/src/list/paginator/adaptors/read-more.d.ts +0 -10
  286. package/dist/src/list/paginator/holder.d.ts +0 -16
  287. package/dist/types/artalk-config.d.ts +0 -139
  288. package/dist/types/artalk-data.d.ts +0 -230
  289. package/dist/types/plug.d.ts +0 -4
  290. package/src/api/api-base.ts +0 -27
  291. package/src/comment/render-ctx.ts +0 -30
  292. package/src/editor/edit-mode.ts +0 -105
  293. package/src/editor/funcs.ts +0 -150
  294. package/src/editor/index.ts +0 -3
  295. package/src/editor/mover.ts +0 -43
  296. package/src/editor/plug-manager.ts +0 -172
  297. package/src/editor/plugs/editor-plug.ts +0 -69
  298. package/src/editor/plugs/header-input-plug.ts +0 -79
  299. package/src/editor/plugs/preview-plug.ts +0 -44
  300. package/src/editor/plugs/upload-plug.ts +0 -122
  301. package/src/editor/reply.ts +0 -62
  302. package/src/editor/submit.ts +0 -99
  303. package/src/lib/dark-mode.ts +0 -48
  304. package/src/lib/stat.ts +0 -71
  305. package/src/list/index.ts +0 -3
  306. package/src/list/list-lite.ts +0 -424
  307. package/src/list/list-ui.ts +0 -137
  308. package/src/list/paginator/adaptors/index.ts +0 -21
  309. package/src/list/paginator/adaptors/pagination.ts +0 -42
  310. package/src/list/paginator/adaptors/read-more.ts +0 -56
  311. package/src/list/paginator/holder.ts +0 -56
  312. package/types/context.d.ts +0 -142
  313. package/types/event.d.ts +0 -28
  314. package/types/plug.d.ts +0 -4
  315. /package/src/{editor/plugs/emoticons-plug.scss → plugins/editor/emoticons.scss} +0 -0
  316. /package/src/{editor/plugs/preview-plug.scss → plugins/editor/preview.scss} +0 -0
@@ -1,44 +0,0 @@
1
- import './preview-plug.scss'
2
-
3
- import Editor from '../editor'
4
- import EditorPlug from './editor-plug'
5
-
6
- export default class PreviewPlug extends EditorPlug {
7
- public static Name = 'preview'
8
- declare protected $panel: HTMLElement
9
-
10
- private isBind = false
11
-
12
- public constructor(editor: Editor) {
13
- super(editor)
14
-
15
- this.registerPanel(`<div class="atk-editor-plug-preview"></div>`)
16
-
17
- let btnText = this.editor.$t('preview')
18
- if (this.ctx.getMarkedInstance()) btnText += ` <i title="Markdown is supported"><svg class="markdown" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M14.85 3H1.15C.52 3 0 3.52 0 4.15v7.69C0 12.48.52 13 1.15 13h13.69c.64 0 1.15-.52 1.15-1.15v-7.7C16 3.52 15.48 3 14.85 3zM9 11H7V8L5.5 9.92 4 8v3H2V5h2l1.5 2L7 5h2v6zm2.99.5L9.5 8H11V5h2v3h1.5l-2.51 3.5z"></path></svg></i>`
19
- this.registerBtn(btnText)
20
-
21
- this.registerContentUpdatedEvt((content) => {
22
- this.updateContent()
23
- })
24
- }
25
-
26
- public onPanelShow() {
27
- this.updateContent()
28
-
29
- if (!this.isBind) {
30
- const event = () => {
31
- this.updateContent()
32
- }
33
- this.editor.getUI().$textarea.addEventListener('input', event)
34
- this.editor.getUI().$textarea.addEventListener('change', event)
35
- this.isBind = true
36
- }
37
- }
38
-
39
- public updateContent() {
40
- if (this.$panel.style.display !== 'none') {
41
- this.$panel.innerHTML = this.editor.getContentMarked()
42
- }
43
- }
44
- }
@@ -1,122 +0,0 @@
1
- import * as Utils from '@/lib/utils'
2
- import Editor from '../editor'
3
- import User from '../../lib/user'
4
- import EditorPlug from './editor-plug'
5
-
6
- export default class UploadPlug extends EditorPlug {
7
- public static Name = 'upload'
8
-
9
- public $imgUploadInput?: HTMLInputElement
10
-
11
- /** 允许的图片格式 */
12
- allowImgExts = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'svg', 'webp']
13
-
14
- public constructor(editor: Editor) {
15
- super(editor)
16
-
17
- this.$imgUploadInput = document.createElement('input')
18
- this.$imgUploadInput.type = 'file'
19
- this.$imgUploadInput.style.display = 'none'
20
- this.$imgUploadInput.accept = this.allowImgExts.map(o => `.${o}`).join(',')
21
-
22
- const $btn = this.registerBtn(`${this.ctx.$t('image')}`)
23
- $btn.after(this.$imgUploadInput)
24
- $btn.onclick = () => {
25
- // 选择图片
26
- const $input = this.$imgUploadInput!
27
- $input.onchange = () => {
28
- (async () => { // 解决阻塞 UI 问题
29
- if (!$input.files || $input.files.length === 0) return
30
- const file = $input.files[0]
31
- this.uploadImg(file)
32
- })()
33
- }
34
- $input.click() // 显示选择图片对话框
35
- }
36
-
37
- if (!this.ctx.conf.imgUpload) {
38
- this.getBtn()!.setAttribute('atk-only-admin-show', '')
39
- }
40
-
41
- // 统一从 FileList 获取文件并上传图片方法
42
- const uploadFromFileList = (files?: FileList) => {
43
- if (!files) return
44
-
45
- for (let i = 0; i < files.length; i++) {
46
- const file = files[i]
47
- this.uploadImg(file)
48
- }
49
- }
50
-
51
- // 拖拽图片
52
- // @link https://developer.mozilla.org/zh-CN/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_drop
53
- // 阻止浏览器的默认释放行为
54
- this.editor.getUI().$textarea.addEventListener('dragover', (evt) => {
55
- evt.stopPropagation()
56
- evt.preventDefault()
57
- })
58
-
59
- this.editor.getUI().$textarea.addEventListener('drop', (evt) => {
60
- const files = evt.dataTransfer?.files
61
- if (files?.length) {
62
- evt.preventDefault()
63
- uploadFromFileList(files)
64
- }
65
- })
66
-
67
- // 粘贴图片
68
- this.editor.getUI().$textarea.addEventListener('paste', (evt) => {
69
- const files = evt.clipboardData?.files
70
- if (files?.length) {
71
- evt.preventDefault()
72
- uploadFromFileList(files)
73
- }
74
- })
75
- }
76
-
77
- public async uploadImg(file: File) {
78
- const fileExt = /[^.]+$/.exec(file.name)
79
- if (!fileExt || !this.allowImgExts.includes(fileExt[0])) return
80
-
81
- // 未登录提示
82
- if (!User.checkHasBasicUserInfo()) {
83
- this.editor.showNotify(this.ctx.$t('uploadLoginMsg'), 'w')
84
- return
85
- }
86
-
87
- // 插入图片前换一行
88
- let insertPrefix = '\n'
89
- if (this.editor.getUI().$textarea.value.trim() === '') insertPrefix = ''
90
-
91
- // 插入占位加载文字
92
- const uploadPlaceholderTxt = `${insertPrefix}![](Uploading ${file.name}...)`
93
- this.editor.insertContent(uploadPlaceholderTxt)
94
-
95
- // 上传图片
96
- let resp: any
97
- try {
98
- if (!this.ctx.conf.imgUploader) {
99
- // 使用 Artalk 进行图片上传
100
- resp = await this.ctx.getApi().upload.imgUpload(file)
101
- } else {
102
- // 使用自定义的图片上传器
103
- resp = {img_url: await this.ctx.conf.imgUploader(file)}
104
- }
105
- } catch (err: any) {
106
- console.error(err)
107
- this.editor.showNotify(`${this.ctx.$t('uploadFail')},${err.msg}`, 'e')
108
- }
109
- if (!!resp && resp.img_url) {
110
- let imgURL = resp.img_url as string
111
-
112
- // 若为相对路径,加上 artalk server
113
- if (!Utils.isValidURL(imgURL)) imgURL = Utils.getURLBasedOnApi(this.ctx, imgURL)
114
-
115
- // 上传成功插入图片
116
- this.editor.setContent(this.editor.getUI().$textarea.value.replace(uploadPlaceholderTxt, `${insertPrefix}![](${imgURL})`))
117
- } else {
118
- // 上传失败删除加载文字
119
- this.editor.setContent(this.editor.getUI().$textarea.value.replace(uploadPlaceholderTxt, ''))
120
- }
121
- }
122
- }
@@ -1,62 +0,0 @@
1
- import type { CommentData } from '~/types/artalk-data'
2
- import Editor from './editor'
3
- import * as Utils from '../lib/utils'
4
- import * as Ui from '../lib/ui'
5
-
6
- export interface ReplyManager {
7
- editor: Editor
8
- comment?: CommentData
9
- setReply(comment: CommentData, $comment: HTMLElement, scroll?: boolean): void
10
- cancelReply(): void
11
- }
12
-
13
- export function createReplyManager(editor: Editor): ReplyManager {
14
- const m: ReplyManager = {
15
- editor,
16
- comment: undefined,
17
- setReply: (c, $, s) => setReply(m, c, $, s),
18
- cancelReply: () => cancelReply(m)
19
- }
20
-
21
- return m
22
- }
23
-
24
- function setReply(m: ReplyManager, commentData: CommentData, $comment: HTMLElement, scroll = true) {
25
- m.editor.cancelEditComment()
26
- cancelReply(m)
27
-
28
- const ui = m.editor.getUI()
29
- if (!ui.$sendReply) {
30
- ui.$sendReply = Utils.createElement(
31
- `<div class="atk-send-reply">` +
32
- `${m.editor.$t('reply')} ` +
33
- `<span class="atk-text"></span><span class="atk-cancel">×</span>` +
34
- `</div>`
35
- )
36
- ui.$sendReply.querySelector<HTMLElement>('.atk-text')!.innerText = `@${commentData.nick}`
37
- ui.$sendReply.addEventListener('click', () => {
38
- m.editor.cancelReply()
39
- })
40
- ui.$textareaWrap.append(ui.$sendReply)
41
- }
42
-
43
- m.comment = commentData
44
- m.editor.travel($comment)
45
-
46
- if (scroll) Ui.scrollIntoView(ui.$el)
47
-
48
- ui.$textarea.focus()
49
- }
50
-
51
- function cancelReply(m: ReplyManager) {
52
- if (!m.comment) return
53
-
54
- const ui = m.editor.getUI()
55
- if (ui.$sendReply) {
56
- ui.$sendReply.remove()
57
- ui.$sendReply = undefined
58
- }
59
- m.comment = undefined
60
-
61
- m.editor.travelBack()
62
- }
@@ -1,99 +0,0 @@
1
- import type { CommentData } from '~/types/artalk-data'
2
- import Editor from './editor'
3
- import User from '../lib/user'
4
-
5
- export interface SubmitManager {
6
- editor: Editor
7
- do: () => Promise<void>
8
- customs: CustomSubmit[]
9
- registerCustom(c: CustomSubmit): void
10
- }
11
-
12
- export function createSubmitManager(editor: Editor) {
13
- const m: SubmitManager = {
14
- editor,
15
- do: () => Do(m),
16
- customs: [],
17
- registerCustom: (c) => { m.customs.push(c) }
18
- }
19
-
20
- return m
21
- }
22
-
23
- async function Do(m: SubmitManager) {
24
- if (m.editor.getFinalContent().trim() === '') {
25
- m.editor.focus()
26
- return
27
- }
28
-
29
- const custom = m.customs.find(o => o.activeCond())
30
-
31
- m.editor.ctx.trigger('editor-submit')
32
- m.editor.showLoading()
33
-
34
- try {
35
- // pre submit
36
- if (custom?.pre) custom.pre()
37
-
38
- let nComment: CommentData
39
-
40
- // submit request
41
- if (custom?.req) nComment = await custom.req()
42
- else nComment = await reqAdd(m)
43
-
44
- // post submit
45
- if (custom?.post) custom.post(nComment)
46
- else postSubmitAdd(m, nComment)
47
- } catch (err: any) {
48
- // submit error
49
- console.error(err)
50
- m.editor.showNotify(`${m.editor.$t('commentFail')},${err.msg || String(err)}`, 'e')
51
- return
52
- } finally {
53
- m.editor.hideLoading()
54
- }
55
-
56
- m.editor.reset() // 复原编辑器
57
- m.editor.ctx.trigger('editor-submitted')
58
- }
59
-
60
- interface CustomSubmit {
61
- activeCond: () => void
62
- pre?: () => void
63
- req?: () => Promise<CommentData>
64
- post?: (nComment: CommentData) => void
65
- }
66
-
67
- // ================== Submit Add =======================
68
- function getSubmitAddParams(m: SubmitManager) {
69
- const { nick, email, link } = User.data
70
- const conf = m.editor.ctx.conf
71
- const reply = m.editor.getReplyManager()?.comment
72
-
73
- return {
74
- content: m.editor.getFinalContent(),
75
- nick, email, link,
76
- rid: (!reply) ? 0 : reply.id,
77
- page_key: (!reply) ? conf.pageKey : reply.page_key,
78
- page_title: (!reply) ? conf.pageTitle : undefined,
79
- site_name: (!reply) ? conf.site : reply.site_name
80
- }
81
- }
82
-
83
- async function reqAdd(m: SubmitManager) {
84
- const nComment = await m.editor.ctx.getApi().comment.add({
85
- ...getSubmitAddParams(m)
86
- })
87
- return nComment
88
- }
89
-
90
- function postSubmitAdd(m: SubmitManager, commentNew: CommentData) {
91
- // 回复不同页面的评论,跳转到新页面
92
- const reply = m.editor.getReplyManager()
93
- const conf = m.editor.ctx.conf
94
- if (!!reply?.comment && reply.comment.page_key !== conf.pageKey) {
95
- window.open(`${reply.comment.page_url}#atk-comment-${commentNew.id}`)
96
- }
97
-
98
- m.editor.ctx.insertComment(commentNew)
99
- }
@@ -1,48 +0,0 @@
1
- import type Context from '~/types/context'
2
- import { getLayerWrap } from '../layer'
3
-
4
- const darkModeMedia = window.matchMedia('(prefers-color-scheme: dark)')
5
- let darkModeAutoFunc: (evt: MediaQueryListEvent) => void
6
-
7
- export function syncDarkModeConf(ctx: Context) {
8
- setDarkMode(ctx, ctx.conf.darkMode, false) // ref `conf.darkMode` data, so no need to `alterConf`
9
- }
10
-
11
- export function setDarkMode(ctx: Context, darkMode: boolean|'auto', alterConf = true) {
12
- const apply = (d: boolean) => {
13
- updateClassName(ctx, d)
14
- if (alterConf) alterCtxConf(ctx, d)
15
- }
16
-
17
- if (darkMode === 'auto') {
18
- if (!darkModeAutoFunc) { // 自动切换夜间模式,事件监听
19
- darkModeAutoFunc = (evt) => apply(evt.matches)
20
- darkModeMedia.addEventListener('change', darkModeAutoFunc)
21
- }
22
-
23
- apply(darkModeMedia.matches)
24
- } else {
25
- // if the type of darkMode is boolean
26
- if (darkModeAutoFunc) // 解除事件监听绑定
27
- darkModeMedia.removeEventListener('change', darkModeAutoFunc)
28
-
29
- apply(darkMode)
30
- }
31
- }
32
-
33
- function alterCtxConf(ctx: Context, darkMode: boolean) {
34
- ctx.conf.darkMode = darkMode
35
- }
36
-
37
- const DarkModeClassName = 'atk-dark-mode'
38
- export function updateClassName(ctx: Context, darkMode: boolean) {
39
- if (darkMode) ctx.$root.classList.add(DarkModeClassName)
40
- else ctx.$root.classList.remove(DarkModeClassName)
41
-
42
- // for Layer
43
- const { $wrap: $layerWrap } = getLayerWrap()
44
- if ($layerWrap) {
45
- if (darkMode) $layerWrap.classList.add(DarkModeClassName)
46
- else $layerWrap.classList.remove(DarkModeClassName)
47
- }
48
- }
package/src/lib/stat.ts DELETED
@@ -1,71 +0,0 @@
1
- import ContextApi from '~/types/context'
2
- import ArtalkPlug from '~/types/plug'
3
-
4
- export interface CountConf {
5
- ctx: ContextApi
6
-
7
- /** 是否增加当前页面 PV 数 */
8
- pvAdd?: boolean
9
- }
10
-
11
- export const PvCountWidget: ArtalkPlug = (ctx: ContextApi) => {
12
- if (!ctx.conf.useBackendConf) {
13
- // 不使用后端配置,在 Artalk 实例被创建后,立刻初始化
14
- initCountWidget({ ctx, pvAdd: true })
15
- } else {
16
- // 若使用后端配置,需待配置成功获取后 (来自后端设定的 pvEl 等),再初始化
17
- ctx.on('list-loaded', () => {
18
- initCountWidget({ ctx, pvAdd: true })
19
- })
20
- }
21
- }
22
-
23
- /** 初始化评论数和 PV 数量展示元素 */
24
- export async function initCountWidget(p: CountConf) {
25
- // 评论数
26
- const countEl = p.ctx.conf.countEl
27
- if (countEl && document.querySelector(countEl)) {
28
- handleStatCount(p, { api: 'page_comment', countEl })
29
- }
30
-
31
- // PV
32
- const curtPagePvNum = p.pvAdd ? await p.ctx.getApi().page.pv() : undefined
33
- const pvEl = p.ctx.conf.pvEl
34
- if (pvEl && document.querySelector(pvEl)) {
35
- handleStatCount(p, {
36
- api: 'page_pv',
37
- countEl: pvEl,
38
- curtPageCount: curtPagePvNum,
39
- })
40
- }
41
- }
42
-
43
- export async function handleStatCount(
44
- p: CountConf,
45
- args: {
46
- api: 'page_pv' | 'page_comment'
47
- countEl: string
48
- curtPageCount?: number
49
- }
50
- ) {
51
- let pageCounts: { [key: string]: number } = {}
52
-
53
- // 当前页面的统计数
54
- const curtPageKey = p.ctx.conf.pageKey
55
- if (args.curtPageCount) pageCounts[curtPageKey] = args.curtPageCount
56
-
57
- // 查询其他页面的统计数
58
- let queryPageKeys = Array.from(document.querySelectorAll(args.countEl))
59
- .map((e) => e.getAttribute('data-page-key') || curtPageKey)
60
- .filter((pageKey) => pageCounts[pageKey] === undefined)
61
- queryPageKeys = [...new Set(queryPageKeys)] // 去重
62
- if (queryPageKeys.length > 0) {
63
- const counts: any = await p.ctx.getApi().page.stat(args.api, queryPageKeys)
64
- pageCounts = { ...pageCounts, ...counts }
65
- }
66
-
67
- document.querySelectorAll(args.countEl).forEach((el) => {
68
- const pageKey = el.getAttribute('data-page-key') || curtPageKey
69
- el.innerHTML = `${Number(pageCounts[pageKey] || 0)}`
70
- })
71
- }
package/src/list/index.ts DELETED
@@ -1,3 +0,0 @@
1
- import List from './list'
2
-
3
- export default List