@jx3box/jx3box-editor 2.2.47 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/config/global.js +79 -0
  2. package/config/global.less +16 -0
  3. package/index.js +21 -8
  4. package/package.json +64 -63
  5. package/readme.md +25 -99
  6. package/src/Article.vue +96 -57
  7. package/src/ArticleMarkdown.vue +54 -47
  8. package/src/BoxResource.vue +67 -42
  9. package/src/Buff.vue +18 -7
  10. package/src/GameText.vue +32 -45
  11. package/src/Item.vue +143 -235
  12. package/src/ItemSimple.vue +27 -37
  13. package/src/Markdown.vue +362 -210
  14. package/src/Npc.vue +51 -30
  15. package/src/Resource.vue +296 -252
  16. package/src/Skill.vue +36 -26
  17. package/src/Tinymce.vue +162 -126
  18. package/src/Upload.vue +238 -155
  19. package/src/UploadAlbum.vue +189 -118
  20. package/{assets → src/assets}/css/article.less +1 -0
  21. package/src/assets/css/markdown.less +4 -0
  22. package/{assets → src/assets}/css/module/author.less +4 -3
  23. package/{assets → src/assets}/css/module/directory.less +23 -32
  24. package/{assets → src/assets}/css/module/talent.less +2 -2
  25. package/{assets → src/assets}/css/resource.less +56 -22
  26. package/src/assets/css/tinymce/_.less +28 -0
  27. package/src/assets/css/tinymce/a.less +21 -0
  28. package/{assets → src/assets}/css/tinymce/code.less +1 -1
  29. package/{assets/css → src/assets/css/tinymce}/combo.less +123 -18
  30. package/{assets → src/assets}/css/tinymce/fold.less +3 -6
  31. package/src/assets/css/tinymce/h.less +90 -0
  32. package/{assets → src/assets}/css/tinymce/latex.less +14 -14
  33. package/{assets → src/assets}/css/tinymce/macro.less +3 -3
  34. package/{assets → src/assets}/css/tinymce/pz.less +2 -2
  35. package/{assets → src/assets}/css/tinymce/table.less +5 -10
  36. package/{assets → src/assets}/css/tinymce.less +8 -4
  37. package/src/assets/css/upload.less +195 -0
  38. package/src/assets/css/upload_album.less +164 -0
  39. package/src/assets/css/var.less +2 -0
  40. package/src/assets/img/other/qr-code.svg +1 -0
  41. package/{assets → src/assets}/js/audio.js +2 -2
  42. package/{assets → src/assets}/js/directory.js +51 -23
  43. package/src/assets/js/hljs_languages.js +177 -0
  44. package/src/assets/js/katex.js +211 -0
  45. package/src/assets/js/renderImgPreview.js +49 -0
  46. package/{assets → src/assets}/js/xss.js +48 -5
  47. package/src/components/Author.vue +32 -13
  48. package/src/components/Avatar.vue +22 -3
  49. package/src/components/Combo.vue +118 -72
  50. package/src/components/PostAuthor.vue +13 -11
  51. package/src/components/QRcode.vue +136 -0
  52. package/src/components/SkillMartial.vue +13 -12
  53. package/src/pages/article.js +14 -0
  54. package/src/pages/index.js +5 -0
  55. package/src/pages/markdown.js +14 -0
  56. package/src/pages/tinymce.js +49 -0
  57. package/src/pages/upload.js +14 -0
  58. package/{service → src/service}/author.js +2 -2
  59. package/{service → src/service}/cms.js +5 -3
  60. package/{service → src/service}/database.js +4 -2
  61. package/{service → src/service}/item.js +1 -1
  62. package/{service → src/service}/node.js +1 -1
  63. package/{service → src/service}/resource.js +1 -1
  64. package/src/views/article.vue +72 -0
  65. package/src/views/index.vue +11 -0
  66. package/src/views/markdown.vue +58 -0
  67. package/src/views/tinymce.vue +58 -0
  68. package/src/views/upload.vue +111 -0
  69. package/.env +0 -2
  70. package/.vscode/settings.json +0 -5
  71. package/assets/css/katex-fix.css +0 -20
  72. package/assets/css/tinymce/_.less +0 -30
  73. package/assets/css/tinymce/a.less +0 -30
  74. package/assets/css/tinymce/combo.less +0 -111
  75. package/assets/css/tinymce/h.less +0 -58
  76. package/assets/css/upload.less +0 -105
  77. package/assets/js/katex.js +0 -191
  78. package/assets/js/renderImgPreview.js +0 -25
  79. package/babel.config.js +0 -3
  80. package/docs/markdown.md +0 -16
  81. package/jsconfig.json +0 -9
  82. package/public/article.html +0 -15
  83. package/public/css/article.css +0 -2481
  84. package/public/css/article.less +0 -3
  85. package/public/favicon.ico +0 -0
  86. package/public/tinymce.html +0 -33
  87. package/src/Equip.vue +0 -301
  88. package/src/components/LetterDemo.vue +0 -93
  89. package/src/components/medal.vue +0 -43
  90. package/test-audio.html +0 -121
  91. package/vue.config.js +0 -147
  92. /package/{assets → src/assets}/css/markdown/_.less +0 -0
  93. /package/{assets → src/assets}/css/markdown/macro.less +0 -0
  94. /package/{assets/css/article_markdown.less → src/assets/css/markdown/markdown-article.less} +0 -0
  95. /package/{assets/css/markdown.less → src/assets/css/markdown/markdown-editor.less} +0 -0
  96. /package/{assets → src/assets}/css/markdown/talent.less +0 -0
  97. /package/{assets → src/assets}/css/markdown/video.less +0 -0
  98. /package/{assets → src/assets}/css/module/buff.less +0 -0
  99. /package/{assets → src/assets}/css/module/icon.less +0 -0
  100. /package/{assets → src/assets}/css/module/item.less +0 -0
  101. /package/{assets → src/assets}/css/module/item_simple.less +0 -0
  102. /package/{assets → src/assets}/css/module/jx3_element.less +0 -0
  103. /package/{assets → src/assets}/css/module/macro.less +0 -0
  104. /package/{assets → src/assets}/css/module/npc.less +0 -0
  105. /package/{assets → src/assets}/css/module/resource.less +0 -0
  106. /package/{assets → src/assets}/css/module/skill.less +0 -0
  107. /package/{assets → src/assets}/css/tinymce/hr.less +0 -0
  108. /package/{assets → src/assets}/css/tinymce/img.less +0 -0
  109. /package/{assets → src/assets}/css/tinymce/imgpreview.less +0 -0
  110. /package/{assets → src/assets}/css/tinymce/list.less +0 -0
  111. /package/{assets → src/assets}/css/tinymce/nextpage.less +0 -0
  112. /package/{assets → src/assets}/css/tinymce/p.less +0 -0
  113. /package/{assets → src/assets}/css/tinymce/plugin.less +0 -0
  114. /package/{assets → src/assets}/css/tinymce/qixue.less +0 -0
  115. /package/{assets → src/assets}/css/tinymce/quote.less +0 -0
  116. /package/{assets → src/assets}/css/tinymce/video.less +0 -0
  117. /package/{assets → src/assets}/css/tinymce/voice.less +0 -0
  118. /package/{assets → src/assets}/data/detach_type.json +0 -0
  119. /package/{assets → src/assets}/data/game_font.json +0 -0
  120. /package/{assets → src/assets}/data/markdown_whitelist.json +0 -0
  121. /package/{assets → src/assets}/data/weapon_type.json +0 -0
  122. /package/{assets → src/assets}/img/buff.svg +0 -0
  123. /package/{assets → src/assets}/img/equip_bg.png +0 -0
  124. /package/{assets → src/assets}/img/file.svg +0 -0
  125. /package/{assets → src/assets}/img/icons.svg +0 -0
  126. /package/{assets → src/assets}/img/item/pve.png +0 -0
  127. /package/{assets → src/assets}/img/item/pvp.png +0 -0
  128. /package/{assets → src/assets}/img/item/pvx.png +0 -0
  129. /package/{assets → src/assets}/img/item/std.png +0 -0
  130. /package/{assets → src/assets}/img/item/wujie.png +0 -0
  131. /package/{assets → src/assets}/img/item.svg +0 -0
  132. /package/{assets → src/assets}/img/jx3.svg +0 -0
  133. /package/{assets → src/assets}/img/jx3box.svg +0 -0
  134. /package/{assets → src/assets}/img/npc/attack.svg +0 -0
  135. /package/{assets → src/assets}/img/npc/buff.svg +0 -0
  136. /package/{assets → src/assets}/img/npc/energy.svg +0 -0
  137. /package/{assets → src/assets}/img/npc/miss.svg +0 -0
  138. /package/{assets → src/assets}/img/npc/npc.svg +0 -0
  139. /package/{assets → src/assets}/img/npc/radar.svg +0 -0
  140. /package/{assets → src/assets}/img/npc/shield.svg +0 -0
  141. /package/{assets → src/assets}/img/npc/sight.svg +0 -0
  142. /package/{assets → src/assets}/img/npc/skull.svg +0 -0
  143. /package/{assets → src/assets}/img/npc/target.svg +0 -0
  144. /package/{assets → src/assets}/img/skill.svg +0 -0
  145. /package/{assets → src/assets}/img/skillset.png +0 -0
  146. /package/{assets → src/assets}/js/a.js +0 -0
  147. /package/{assets → src/assets}/js/code.js +0 -0
  148. /package/{assets → src/assets}/js/combo.js +0 -0
  149. /package/{assets → src/assets}/js/drag.js +0 -0
  150. /package/{assets → src/assets}/js/filter2.js +0 -0
  151. /package/{assets → src/assets}/js/fold.js +0 -0
  152. /package/{assets → src/assets}/js/gallery.js +0 -0
  153. /package/{assets → src/assets}/js/iframe.js +0 -0
  154. /package/{assets → src/assets}/js/img.js +0 -0
  155. /package/{assets → src/assets}/js/item/attribute_percent.js +0 -0
  156. /package/{assets → src/assets}/js/item/bind.js +0 -0
  157. /package/{assets → src/assets}/js/item/border.js +0 -0
  158. /package/{assets → src/assets}/js/item/border_quest.js +0 -0
  159. /package/{assets → src/assets}/js/item/color.js +0 -0
  160. /package/{assets → src/assets}/js/item/hljs_languages.js +0 -0
  161. /package/{assets → src/assets}/js/item/icon_url.js +0 -0
  162. /package/{assets → src/assets}/js/item/second_format.js +0 -0
  163. /package/{assets → src/assets}/js/jx3_element.js +0 -0
  164. /package/{assets → src/assets}/js/macro.js +0 -0
  165. /package/{assets → src/assets}/js/nextpage.js +0 -0
  166. /package/{assets → src/assets}/js/pswp.js +0 -0
  167. /package/{assets → src/assets}/js/pswp_template.js +0 -0
  168. /package/{assets → src/assets}/js/pz_iframe.js +0 -0
  169. /package/{assets → src/assets}/js/qixue.js +0 -0
  170. /package/{assets → src/assets}/js/script.js +0 -0
  171. /package/{assets → src/assets}/js/talent2.js +0 -0
  172. /package/{assets → src/assets}/js/tex-mml-chtml.js +0 -0
  173. /package/{service → src/service}/enum/CollectionPublic.js +0 -0
  174. /package/{service → src/service}/enum/EquipPosition.js +0 -0
  175. /package/{service → src/service}/enum/EquipType.js +0 -0
package/src/Article.vue CHANGED
@@ -1,15 +1,27 @@
1
1
  <template>
2
2
  <div class="c-article-tinymce c-article-box">
3
3
  <!-- <div id="c-article-origin" class="c-article-origin" ref="origin"><slot></slot></div> -->
4
+
4
5
  <div id="c-article" class="c-article" ref="article" v-if="pageable">
5
- <div class="c-article-chunk" v-for="(text, i) in data" :key="i" v-html="text" :class="{ on: i == page - 1 || all == true }" :id="'c-article-part' + ~~(i + 1)"></div>
6
+ <div
7
+ class="c-article-chunk"
8
+ v-for="(text, i) in data"
9
+ :key="i"
10
+ v-html="text"
11
+ :class="{ on: i == page - 1 || all == true }"
12
+ :id="'c-article-part' + ~~(i + 1)"
13
+ ></div>
6
14
  </div>
15
+
7
16
  <div id="c-article" class="c-article" ref="article" v-else-if="data && data.length" v-html="data[0]"></div>
17
+
8
18
  <el-button class="c-article-all" type="primary" v-if="!all && hasPages" @click="showAll">加载全部</el-button>
19
+
9
20
  <el-pagination
10
21
  class="c-article-pages"
11
22
  v-if="!all"
12
23
  background
24
+ center
13
25
  :page-size="1"
14
26
  :hide-on-single-page="true"
15
27
  @current-change="changePage"
@@ -17,75 +29,76 @@
17
29
  layout="total, prev, pager, next, jumper"
18
30
  :total="total"
19
31
  ></el-pagination>
32
+
20
33
  <div class="w-jx3-element-pop" :style="jx3_element.style">
21
34
  <jx3-item :item_id="item.id" :jx3ClientType="item.client" v-show="jx3_element.type == 'item'" />
22
35
  <jx3-buff :client="buff.client" :id="buff.id" :level="buff.level" v-show="jx3_element.type == 'buff'" />
23
- <jx3-skill :client="skill.client" :id="skill.id" :level="skill.level" v-show="jx3_element.type == 'skill'" />
36
+ <jx3-skill
37
+ :client="skill.client"
38
+ :id="skill.id"
39
+ :level="skill.level"
40
+ v-show="jx3_element.type == 'skill'"
41
+ />
24
42
  <jx3-npc :client="npc.client" :id="npc.id" v-show="jx3_element.type === 'npc'" />
25
43
  <jx3-author :uid="author.id" v-show="jx3_element.type === 'author'" />
26
44
  <jx3-emotion-author :id="emotion.id" v-show="jx3_element.type === 'emotion'" />
27
45
  </div>
28
- <!-- <gallery :images="images" :index="gallery_index" @close="index = null"></gallery> -->
29
46
  </div>
30
47
  </template>
31
48
 
32
49
  <script>
33
50
  import $ from "jquery";
34
- const HEADER_HEIGHT = 112; //头部高度
35
-
36
- import { Pagination, Button, Popover } from "element-ui";
37
- import "@jx3box/jx3box-common/css/element.css";
38
-
39
- // 相册
40
- // import gallery from "vue-gallery-slideshow";
41
- import Vue from "vue";
42
- import hevueImgPreview from "hevue-img-preview";
43
- Vue.use(hevueImgPreview);
44
51
 
45
52
  // XSS
46
- import execFilterXSS from "../assets/js/xss";
47
- // const execFilterXSS = require("xss");
48
- // const xss_options = {
49
- // allowCommentTag: true,
50
- // };
53
+ import execFilterXSS from "./assets/js/xss";
51
54
 
52
55
  // 基本文本
53
- import execLazyload from "../assets/js/img";
54
- import execFilterIframe from "../assets/js/iframe";
55
- import execFilterLink from "../assets/js/a";
56
- import execSplitPages from "../assets/js/nextpage";
56
+ import execLazyload from "./assets/js/img";
57
+ import execFilterIframe from "./assets/js/iframe";
58
+ import execFilterLink from "./assets/js/a";
59
+ import execSplitPages from "./assets/js/nextpage";
57
60
 
58
61
  // 扩展文本
59
- import renderFoldBlock from "../assets/js/fold";
60
- import renderDirectory from "../assets/js/directory";
61
- import renderMacro from "../assets/js/macro";
62
- import renderTalent from "../assets/js/qixue";
63
- import renderTalent2 from "../assets/js/talent2";
64
- import { renderKatexAll } from "../assets/js/katex";
65
- import renderCode from "../assets/js/code";
66
- import renderImgPreview from "../assets/js/renderImgPreview";
67
- import renderPzIframe from "../assets/js/pz_iframe";
68
- import renderCombo from "../assets/js/combo";
69
- import renderAudio from "../assets/js/audio";
62
+ import renderFoldBlock from "./assets/js/fold";
63
+ import renderDirectory from "./assets/js/directory";
64
+ import renderKatex from "./assets/js/katex";
65
+ import renderCode from "./assets/js/code";
66
+ import renderImgPreview from "./assets/js/renderImgPreview";
67
+
68
+ // 魔盒
69
+ import renderMacro from "./assets/js/macro";
70
+ import renderTalent from "./assets/js/qixue";
71
+ import renderTalent2 from "./assets/js/talent2";
72
+ import renderPzIframe from "./assets/js/pz_iframe";
73
+ import renderCombo from "./assets/js/combo";
74
+ import renderAudio from "./assets/js/audio";
75
+ import Author from "./components/Author";
76
+ import PostAuthor from "./components/PostAuthor.vue";
70
77
 
71
78
  // 剑三
72
79
  import Item from "./Item";
73
80
  import Buff from "./Buff";
74
81
  import Skill from "./Skill";
75
82
  import Npc from "./Npc";
76
- import Author from "./components/Author";
77
- import PostAuthor from "./components/PostAuthor.vue";
78
- import renderJx3Element from "../assets/js/jx3_element";
83
+ import renderJx3Element from "./assets/js/jx3_element";
79
84
 
80
85
  export default {
81
86
  name: "Article",
82
87
  props: {
88
+
89
+ post_mode : {
90
+ type: String,
91
+ default: "tinymce",
92
+ },
93
+
83
94
  content: String,
95
+
84
96
  // 拼接相对路径地址的图片,需要自带协议
85
97
  cdnDomain: {
86
98
  type: String,
87
99
  default: "https://cdn.jx3box.com",
88
100
  },
101
+
89
102
  // 链接白名单检查,不在白名单,使用新窗跳转
90
103
  linkWhitelist: {
91
104
  type: Array,
@@ -105,7 +118,10 @@ export default {
105
118
  return [];
106
119
  },
107
120
  },
121
+
122
+ // 目录容器选择器
108
123
  directorybox: String,
124
+ // 是否开启分页
109
125
  pageable: {
110
126
  type: Boolean,
111
127
  default: true,
@@ -177,13 +193,33 @@ export default {
177
193
  },
178
194
  },
179
195
  methods: {
196
+ getHeaderHeight: function () {
197
+ // 页面上可能没有这些元素,取存在的第一个:.c-header 优先,其次 .c-breadcrumb
198
+ const el =
199
+ document.querySelector(".c-header") ||
200
+ document.querySelector(".c-breadcrumb");
201
+ if (!el) return 0;
202
+ const rect = el.getBoundingClientRect && el.getBoundingClientRect();
203
+ const h = (rect && rect.height) || el.offsetHeight || 0;
204
+ return Math.max(0, Math.round(h));
205
+ },
206
+ scrollToTopWithOffset: function (top) {
207
+ const headerHeight = this.getHeaderHeight();
208
+ const targetTop = Math.max(0, (top || 0) - headerHeight);
209
+ window.scrollTo(0, targetTop);
210
+ },
180
211
  doReg: function (data) {
181
212
  if (data) {
182
213
  // 1. 先执行 XSS 过滤(xss.js 已包含所有配置)
183
214
  data = execFilterXSS(data);
184
215
 
185
216
  // 2. 然后执行 iframe 白名单过滤
186
- data = execFilterIframe(data, ["player.bilibili.com", "docs.qq.com", "open.douyu.com", ...this.iframeWhitelist]);
217
+ data = execFilterIframe(data, [
218
+ "player.bilibili.com",
219
+ "docs.qq.com",
220
+ "open.douyu.com",
221
+ ...this.iframeWhitelist,
222
+ ]);
187
223
 
188
224
  // 3. 处理图片懒加载
189
225
  data = execLazyload(data, this.cdnDomain);
@@ -202,11 +238,10 @@ export default {
202
238
  // 代码
203
239
  renderCode(`code[class=^'language-']`);
204
240
  // Tatex
205
- renderKatexAll();
241
+ renderKatex();
242
+ // 画廊
243
+ renderImgPreview($root, "img:not(.e-jx3-emotion-img)");
206
244
 
207
- // 画廊(需要在宏、奇穴、物品等之前渲染以排除下方自动生成图片)
208
- // renderGallery(this)
209
- renderImgPreview(this);
210
245
  // 宏
211
246
  renderMacro();
212
247
  // 奇穴
@@ -235,18 +270,27 @@ export default {
235
270
 
236
271
  if (window.location.hash?.includes("directory")) {
237
272
  let id = window.location.hash;
238
- let target = $(`${id}`).offset().top;
239
- console.log(target);
240
- $(document).scrollTop(target - HEADER_HEIGHT);
273
+ const $target = $(`${id}`);
274
+ if ($target.length) {
275
+ const top = $target.offset().top;
276
+ // 等待目录 DOM 真正插入并布局后再滚动
277
+ requestAnimationFrame(() => this.scrollToTopWithOffset(top));
278
+ }
241
279
  }
242
280
 
243
- $(".w-directory-anchor").on("click", function () {
244
- e.preventDefault();
245
- let id = $(this).attr("id");
246
- let target = $(`#${id}`).offset().top;
247
- $(document).scrollTop(target - HEADER_HEIGHT);
248
- window.location.hash = `#${id}`;
249
- });
281
+ const vm = this;
282
+ $(".w-directory-anchor")
283
+ .off("click.jx3boxArticleDir")
284
+ .on("click.jx3boxArticleDir", function (e) {
285
+ e.preventDefault();
286
+ let id = $(this).attr("id");
287
+ const $target = $(`#${id}`);
288
+ if ($target.length) {
289
+ const top = $target.offset().top;
290
+ vm.scrollToTopWithOffset(top);
291
+ }
292
+ window.location.hash = `#${id}`;
293
+ });
250
294
  },
251
295
  changePage: function (i) {
252
296
  this.page = i;
@@ -297,21 +341,16 @@ export default {
297
341
  this.run();
298
342
  },
299
343
  components: {
300
- "el-pagination": Pagination,
301
- "el-button": Button,
302
- // "el-popover": Popover,
303
344
  "jx3-item": Item,
304
345
  "jx3-buff": Buff,
305
346
  "jx3-skill": Skill,
306
347
  "jx3-npc": Npc,
307
348
  "jx3-author": Author,
308
349
  "jx3-emotion-author": PostAuthor,
309
- // "gallery":gallery,
310
- // VueViewer
311
350
  },
312
351
  };
313
352
  </script>
314
353
 
315
354
  <style lang="less">
316
- @import "../assets/css/article.less";
355
+ @import "./assets/css/article.less";
317
356
  </style>
@@ -1,46 +1,55 @@
1
1
  <template>
2
2
  <div class="c-article-markdown">
3
- <markdown-render id="c-article" class="c-markdown c-article" ref="article" v-model="origin" @change="updateOrigin" :preRender="doReg" :xssOptions="xssOptions"></markdown-render>
3
+ <markdown-render
4
+ id="c-article"
5
+ class="c-markdown c-article"
6
+ ref="article"
7
+ v-model="origin"
8
+ @change="updateOrigin"
9
+ :preRender="doReg"
10
+ :xssOptions="xssOptions"
11
+ ></markdown-render>
4
12
  <div class="w-jx3-element-pop" :style="jx3_element.style">
5
13
  <jx3-item :item_id="item.id" :jx3ClientType="item.client" v-show="jx3_element.type == 'item'" />
6
14
  <jx3-buff :client="buff.client" :id="buff.id" :level="buff.level" v-show="jx3_element.type == 'buff'" />
7
- <jx3-skill :client="skill.client" :id="skill.id" :level="skill.level" v-show="jx3_element.type == 'skill'" />
15
+ <jx3-skill
16
+ :client="skill.client"
17
+ :id="skill.id"
18
+ :level="skill.level"
19
+ v-show="jx3_element.type == 'skill'"
20
+ />
8
21
  <jx3-npc :client="npc.client" :id="npc.id" v-show="jx3_element.type === 'npc'"></jx3-npc>
9
22
  </div>
10
23
  </div>
11
24
  </template>
12
25
 
13
26
  <script>
14
- import markdownRender from '@jx3box/markdown/src/render.vue'
15
-
16
- import Vue from "vue";
17
- import hevueImgPreview from "hevue-img-preview";
18
- Vue.use(hevueImgPreview);
27
+ import markdownRender from "@jx3box/markdown/src/render.vue";
19
28
 
20
29
  // 基本文本
21
- import execLazyload from "../assets/js/img";
22
- import execFilterIframe from "../assets/js/iframe";
23
- import execFilterLink from "../assets/js/a";
24
- import execFilterXSS from "../assets/js/script";
30
+ import execLazyload from "./assets/js/img";
31
+ import execFilterIframe from "./assets/js/iframe";
32
+ import execFilterLink from "./assets/js/a";
33
+ import execFilterXSS from "./assets/js/script";
25
34
 
26
35
  // 扩展文本
27
- import renderDirectory from "../assets/js/directory";
28
- import renderMacro from "../assets/js/macro";
29
- import renderTalent from "../assets/js/qixue";
30
- import renderTalent2 from "../assets/js/talent2";
31
- import {renderKatexAll} from "../assets/js/katex";
32
- import renderCode from "../assets/js/code";
36
+ import renderDirectory from "./assets/js/directory";
37
+ import renderMacro from "./assets/js/macro";
38
+ import renderTalent from "./assets/js/qixue";
39
+ import renderTalent2 from "./assets/js/talent2";
40
+ import { renderKatexAll } from "./assets/js/katex";
41
+ import renderCode from "./assets/js/code";
33
42
 
34
43
  // 剑三
35
44
  import Item from "./Item";
36
45
  import Buff from "./Buff";
37
46
  import Skill from "./Skill";
38
47
  import Npc from "./Npc";
39
- import renderJx3Element from "../assets/js/jx3_element";
40
- import renderImgPreview from "../assets/js/renderImgPreview";
41
- import renderAudio from "../assets/js/audio";
48
+ import renderJx3Element from "./assets/js/jx3_element";
49
+ import renderImgPreview from "./assets/js/renderImgPreview";
50
+ import renderAudio from "./assets/js/audio";
42
51
 
43
- import {xssOptions} from '../assets/data/markdown_whitelist.json'
52
+ import { xssOptions } from "./assets/data/markdown_whitelist.json";
44
53
 
45
54
  export default {
46
55
  name: "ArticleMarkdown",
@@ -48,10 +57,10 @@ export default {
48
57
  content: String,
49
58
  directorybox: String,
50
59
  },
51
- data: function() {
60
+ data: function () {
52
61
  return {
53
62
  // 原始md
54
- origin : '',
63
+ origin: "",
55
64
  // 原始渲染md后的html(传入文本回调处理函数)
56
65
  html: "",
57
66
 
@@ -74,8 +83,8 @@ export default {
74
83
  },
75
84
  // NPC
76
85
  npc: {
77
- client: 'std',
78
- id: ""
86
+ client: "std",
87
+ id: "",
79
88
  },
80
89
  jx3_element: {
81
90
  style: {
@@ -87,13 +96,12 @@ export default {
87
96
  },
88
97
  images: [],
89
98
 
90
- xssOptions
99
+ xssOptions,
91
100
  };
92
101
  },
93
- computed: {
94
- },
102
+ computed: {},
95
103
  methods: {
96
- doReg: function(data) {
104
+ doReg: function (data) {
97
105
  if (data) {
98
106
  // 过滤内容
99
107
  data = execLazyload(data);
@@ -105,7 +113,7 @@ export default {
105
113
  return "";
106
114
  }
107
115
  },
108
- doDOM: function() {
116
+ doDOM: function () {
109
117
  // 宏
110
118
  renderMacro();
111
119
  // 奇穴
@@ -114,24 +122,24 @@ export default {
114
122
  // Tatex
115
123
  renderKatexAll();
116
124
  // 画廊
117
- renderImgPreview(this);
125
+ renderImgPreview(this.$refs.article, "img:not(.e-jx3-emotion-img)");
118
126
  // 语法高亮
119
- renderCode(`code[class=^'lang-']`)
127
+ renderCode(`code[class=^'lang-']`);
120
128
  // 音频
121
129
  renderAudio();
122
130
  // 物品
123
131
  renderJx3Element(this);
124
132
  },
125
- doDir: function() {
133
+ doDir: function () {
126
134
  let target = "#c-article";
127
135
  let dir = renderDirectory(target, this.directorybox);
128
- this.$emit("directoryRendered",dir);
136
+ this.$emit("directoryRendered", dir);
129
137
  },
130
- updateOrigin : function (md,html){
131
- this.html = html
132
- this.render()
138
+ updateOrigin: function (md, html) {
139
+ this.html = html;
140
+ this.render();
133
141
  },
134
- render: function() {
142
+ render: function () {
135
143
  // 等待html加载完毕后
136
144
  this.$nextTick(() => {
137
145
  this.$emit("contentLoaded");
@@ -146,15 +154,14 @@ export default {
146
154
  },
147
155
  },
148
156
  watch: {
149
- content : {
150
- immediate : true,
151
- handler : function (val){
152
- this.origin = val
153
- }
154
- }
155
- },
156
- mounted: function() {
157
+ content: {
158
+ immediate: true,
159
+ handler: function (val) {
160
+ this.origin = val;
161
+ },
162
+ },
157
163
  },
164
+ mounted: function () {},
158
165
  components: {
159
166
  "jx3-item": Item,
160
167
  "jx3-buff": Buff,
@@ -166,7 +173,7 @@ export default {
166
173
  </script>
167
174
 
168
175
  <style lang="less">
169
- @import "../assets/css/article_markdown.less";
176
+ @import "./assets/css/article_markdown.less";
170
177
 
171
178
  .v-note-img-wrapper {
172
179
  display: none;
@@ -4,16 +4,16 @@
4
4
  <el-button class="u-switch" type="primary" @click="openDialog" :disabled="!enable"> <img class="u-icon" svg-inline :src="boxIcon" />魔盒资源 </el-button>
5
5
 
6
6
  <!-- 弹出界面 -->
7
- <el-dialog v-draggable class="c-large-dialog" title="魔盒资源库" :visible.sync="dialogVisible">
7
+ <el-dialog draggable class="c-large-dialog" title="魔盒资源库" v-model="dialogVisible" :teleported="true">
8
8
  <div class="c-resource-content" v-loading="loading">
9
9
  <div class="m-database-search">
10
- <el-radio-group class="u-client" v-model="comboClient" @change="search" v-if="type === 'combo'">
11
- <el-radio-button label="std">重制</el-radio-button>
12
- <el-radio-button label="origin">缘起</el-radio-button>
10
+ <el-radio-group size="large" class="u-client" v-model="comboClient" @change="search" v-if="type === 'combo'">
11
+ <el-radio-button value="std">重制</el-radio-button>
12
+ <el-radio-button value="origin">缘起</el-radio-button>
13
13
  </el-radio-group>
14
- <el-input class="u-input" :placeholder="placeholderText" v-model="query" @change="search" @keyup.enter.native="search">
15
- <template slot="prepend">关键词</template>
16
- <template slot="append">
14
+ <el-input class="u-input" size="large" :placeholder="placeholderText" v-model="query" @change="search" @keyup.enter="search">
15
+ <template #prepend>关键词</template>
16
+ <template #append>
17
17
  <el-switch v-model="strict" active-text="精确匹配"></el-switch>
18
18
  </template>
19
19
  </el-input>
@@ -21,13 +21,15 @@
21
21
 
22
22
  <el-tabs class="m-database-tabs" v-model="type" type="card" @tab-click="changeType">
23
23
  <el-tab-pane label="魔盒用户" name="authors">
24
- <span slot="label" class="u-tab-label">
25
- <i class="el-icon-s-custom" style="margin-right: 5px"></i>
26
- <b>用户</b>
27
- <i class="u-lv-box">Lv2+</i>
28
- </span>
24
+ <template #label>
25
+ <span class="u-tab-label">
26
+ <el-icon class="u-tab-icon"><Avatar /></el-icon>
27
+ <b>用户</b>
28
+ <i class="u-lv-box">Lv2+</i>
29
+ </span>
30
+ </template>
29
31
  <p v-if="total && done" class="m-resource-count">
30
- <i class="el-icon-s-data"></i> 共找到 <b>{{ total }}</b> 条记录
32
+ <el-icon><Histogram /></el-icon> 共找到 <b>{{ total }}</b> 条记录
31
33
  </p>
32
34
  <ul class="m-resource-list">
33
35
  <li v-for="(o, i) in authors" class="u-item" :key="i" :class="{ on: !!o.isSelected }" @click="selectAuthor(o, i)" ref="author">
@@ -46,19 +48,23 @@
46
48
  <el-alert v-if="!authors.length && done" title="没有找到相关条目" type="info" show-icon></el-alert>
47
49
  </el-tab-pane>
48
50
  <el-tab-pane label="连招" name="combo">
49
- <span slot="label" class="u-tab-label">
50
- <i class="el-icon-lollipop" style="margin-right: 5px"></i>
51
- <b>连招</b>
52
- </span>
51
+ <template #label>
52
+ <span class="u-tab-label">
53
+ <el-icon class="u-tab-icon"><Lollipop /></el-icon>
54
+ <b>连招</b>
55
+ </span>
56
+ </template>
53
57
  <ComboVue :query="query" ref="combo" :client="comboClient" :strict="strict" :subtype="subtype"></ComboVue>
54
58
  </el-tab-pane>
55
59
  <el-tab-pane label="剑三趣图" name="emotions">
56
- <span slot="label" class="u-tab-label">
57
- <i class="el-icon-sugar" style="margin-right: 5px"></i>
58
- <b>趣图</b>
59
- </span>
60
+ <template #label>
61
+ <span class="u-tab-label">
62
+ <el-icon class="u-tab-icon"><Sugar></Sugar></el-icon>
63
+ <b>趣图</b>
64
+ </span>
65
+ </template>
60
66
  <p v-if="total && done" class="m-resource-count">
61
- <i class="el-icon-s-data"></i> 共找到 <b>{{ total }}</b> 条记录
67
+ <el-icon><Histogram /></el-icon> 共找到 <b>{{ total }}</b> 条记录
62
68
  </p>
63
69
  <ul class="m-resource-emotion">
64
70
  <li v-for="o in emotions" class="u-item" :key="o.id" :class="{ on: !!o.isSelected }" @click="selectEmotion(o)" ref="emotion">
@@ -68,10 +74,12 @@
68
74
  <el-alert v-if="!emotions.length && done" title="没有找到相关条目" type="info" show-icon></el-alert>
69
75
  </el-tab-pane>
70
76
  <el-tab-pane label="信纸" name="letter">
71
- <span slot="label" class="u-tab-label">
72
- <i class="el-icon-coffee-cup" style="margin-right: 5px"></i>
73
- <b>信纸</b>
74
- </span>
77
+ <template #label>
78
+ <span class="u-tab-label">
79
+ <el-icon class="u-tab-icon"><CoffeeCup /></el-icon>
80
+ <b>信纸</b>
81
+ </span>
82
+ </template>
75
83
  <div class="m-letter-list">
76
84
  <div class="m-letter" :class="{ active: !!o.isSelected }" v-for="o in filterLetter" :key="o.id" @click="selectLetter(o)">
77
85
  <LetterPaper :data="o" />
@@ -83,33 +91,37 @@
83
91
 
84
92
  <template v-if="multipage && type !== 'combo'">
85
93
  <!-- 下一页 -->
86
- <el-button class="m-archive-more" :class="{ show: hasNextPage }" type="primary" icon="el-icon-arrow-down" @click="appendPage">加载更多</el-button>
94
+ <el-button class="m-archive-more" :class="{ show: hasNextPage }" type="primary" icon="ArrowDown" @click="appendPage" size="large">加载更多</el-button>
87
95
  <!-- 分页 -->
88
- <el-pagination class="m-archive-pages" background layout="total, prev, pager, next,jumper" :hide-on-single-page="true" :page-size="per" :total="total" :current-page.sync="page" @current-change="changePage"></el-pagination>
96
+ <el-pagination class="m-archive-pages" background layout="total, prev, pager, next,jumper" :hide-on-single-page="true" :page-size="per" :total="total" v-model:current-page="page" @current-change="changePage"></el-pagination>
89
97
  </template>
90
98
 
91
99
  <div class="m-database-tip" v-show="isBlank && type !== 'combo'">❤ 请输入搜索条件查询</div>
92
100
  </div>
93
101
 
94
102
  <!-- 插入按钮 -->
95
- <span slot="footer" class="dialog-footer">
96
- <el-button @click="dialogVisible = false">取 消</el-button>
97
- <el-button type="primary" @click="insert">
98
- {{ buttonTXT }}
99
- </el-button>
100
- </span>
103
+ <template #footer>
104
+ <span class="dialog-footer">
105
+ <el-button @click="dialogVisible = false" size="large">取 消</el-button>
106
+ <el-button type="primary" @click="insert" size="large">
107
+ {{ buttonTXT }}
108
+ </el-button>
109
+ </span>
110
+ </template>
101
111
  </el-dialog>
102
112
  </div>
103
113
  </template>
104
114
 
105
115
  <script>
106
- import { loadStat } from "../service/database";
107
- import { loadAuthors, loadEmotions, getLetterPaper } from "../service/cms";
108
- import { getUserInfo } from "../service/author";
109
- import { __iconPath, __Root, __OriginRoot, __imgPath } from "@jx3box/jx3box-common/data/jx3box.json";
116
+ import { loadStat } from "./service/database";
117
+ import { loadAuthors, loadEmotions, getLetterPaper } from "./service/cms";
118
+ import { getUserInfo } from "./service/author";
119
+ import JX3BOX from "@jx3box/jx3box-common/data/jx3box.json";
110
120
  import { getLink, showAvatar, resolveImagePath } from "@jx3box/jx3box-common/js/utils";
111
121
  import User from "@jx3box/jx3box-common/js/user";
112
122
 
123
+ const { __iconPath, __Root, __OriginRoot, __imgPath } = JX3BOX;
124
+
113
125
  import ComboVue from "./components/Combo.vue";
114
126
  import LetterPaper from "./components/Letter.vue";
115
127
  export default {
@@ -214,6 +226,15 @@ export default {
214
226
  },
215
227
  },
216
228
  methods: {
229
+ resetResultState: function (type = this.type) {
230
+ if (Array.isArray(this[type])) {
231
+ this[type] = [];
232
+ }
233
+ this.total = 0;
234
+ this.pages = 1;
235
+ this.loading = false;
236
+ this.done = false;
237
+ },
217
238
  getData: function (page = 1, append = false) {
218
239
  this.loading = true;
219
240
  this.per = 10;
@@ -229,7 +250,8 @@ export default {
229
250
  // 图标
230
251
  if (this.type === "authors") {
231
252
  if (!this.query) {
232
- this.loading = false;
253
+ this.resetResultState("authors");
254
+ this.done = true;
233
255
  return;
234
256
  }
235
257
 
@@ -300,10 +322,13 @@ export default {
300
322
  changePage: function (i) {
301
323
  this.getData(i);
302
324
  },
303
- changeType: function () {
325
+ changeType: function (tab) {
326
+ const nextType = tab?.paneName || tab?.props?.name || tab?.name;
327
+ if (nextType) this.type = nextType;
304
328
  this.page = 1;
329
+ this.resetResultState(this.type);
330
+ this.html = "";
305
331
  if (this.type === "combo") {
306
- this.done = false;
307
332
  return;
308
333
  }
309
334
  this.getData();
@@ -416,7 +441,7 @@ export default {
416
441
  </script>
417
442
 
418
443
  <style lang="less">
419
- @import "../assets/css/resource.less";
444
+ @import "./assets/css/resource.less";
420
445
 
421
446
  .m-item-pop {
422
447
  padding: 0 !important;