@jx3box/jx3box-editor 2.2.48 → 3.0.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.
- package/config/global.js +79 -0
- package/config/global.less +16 -0
- package/index.js +21 -8
- package/package.json +64 -63
- package/readme.md +25 -99
- package/src/Article.vue +96 -57
- package/src/ArticleMarkdown.vue +54 -47
- package/src/BoxResource.vue +67 -42
- package/src/Buff.vue +18 -7
- package/src/GameText.vue +32 -45
- package/src/Item.vue +143 -235
- package/src/ItemSimple.vue +27 -37
- package/src/Markdown.vue +362 -210
- package/src/Npc.vue +51 -30
- package/src/Resource.vue +296 -252
- package/src/Skill.vue +36 -26
- package/src/Tinymce.vue +124 -137
- package/src/Upload.vue +238 -155
- package/src/UploadAlbum.vue +189 -118
- package/{assets → src/assets}/css/article.less +1 -0
- package/src/assets/css/markdown.less +4 -0
- package/{assets → src/assets}/css/module/author.less +4 -3
- package/{assets → src/assets}/css/module/directory.less +23 -32
- package/{assets → src/assets}/css/module/talent.less +2 -2
- package/{assets → src/assets}/css/resource.less +56 -22
- package/src/assets/css/tinymce/_.less +28 -0
- package/src/assets/css/tinymce/a.less +21 -0
- package/{assets → src/assets}/css/tinymce/code.less +1 -1
- package/{assets/css → src/assets/css/tinymce}/combo.less +123 -18
- package/{assets → src/assets}/css/tinymce/fold.less +3 -6
- package/src/assets/css/tinymce/h.less +90 -0
- package/{assets → src/assets}/css/tinymce/latex.less +14 -14
- package/{assets → src/assets}/css/tinymce/macro.less +3 -3
- package/{assets → src/assets}/css/tinymce/pz.less +2 -2
- package/{assets → src/assets}/css/tinymce/table.less +5 -10
- package/{assets → src/assets}/css/tinymce.less +8 -4
- package/src/assets/css/upload.less +195 -0
- package/src/assets/css/upload_album.less +164 -0
- package/src/assets/css/var.less +2 -0
- package/src/assets/img/other/qr-code.svg +1 -0
- package/{assets → src/assets}/js/audio.js +2 -2
- package/{assets → src/assets}/js/directory.js +51 -23
- package/src/assets/js/hljs_languages.js +177 -0
- package/src/assets/js/katex.js +211 -0
- package/src/assets/js/renderImgPreview.js +49 -0
- package/{assets → src/assets}/js/xss.js +48 -5
- package/src/components/Author.vue +32 -13
- package/src/components/Avatar.vue +22 -3
- package/src/components/Combo.vue +118 -72
- package/src/components/PostAuthor.vue +13 -11
- package/src/components/QRcode.vue +136 -0
- package/src/components/SkillMartial.vue +13 -12
- package/src/pages/article.js +14 -0
- package/src/pages/index.js +5 -0
- package/src/pages/markdown.js +14 -0
- package/src/pages/tinymce.js +49 -0
- package/src/pages/upload.js +14 -0
- package/{service → src/service}/author.js +2 -2
- package/{service → src/service}/cms.js +5 -3
- package/{service → src/service}/database.js +4 -2
- package/{service → src/service}/item.js +1 -1
- package/{service → src/service}/node.js +1 -1
- package/{service → src/service}/resource.js +1 -1
- package/src/views/article.vue +72 -0
- package/src/views/index.vue +11 -0
- package/src/views/markdown.vue +58 -0
- package/src/views/tinymce.vue +58 -0
- package/src/views/upload.vue +111 -0
- package/.env +0 -2
- package/.vscode/settings.json +0 -5
- package/assets/css/katex-fix.css +0 -20
- package/assets/css/tinymce/_.less +0 -30
- package/assets/css/tinymce/a.less +0 -30
- package/assets/css/tinymce/combo.less +0 -111
- package/assets/css/tinymce/h.less +0 -58
- package/assets/css/upload.less +0 -105
- package/assets/js/katex.js +0 -191
- package/assets/js/renderImgPreview.js +0 -25
- package/babel.config.js +0 -3
- package/docs/markdown.md +0 -16
- package/jsconfig.json +0 -9
- package/public/article.html +0 -15
- package/public/css/article.css +0 -2481
- package/public/css/article.less +0 -3
- package/public/favicon.ico +0 -0
- package/public/tinymce.html +0 -33
- package/src/Equip.vue +0 -301
- package/src/components/LetterDemo.vue +0 -93
- package/src/components/medal.vue +0 -43
- package/test-audio.html +0 -121
- package/vue.config.js +0 -147
- /package/{assets → src/assets}/css/markdown/_.less +0 -0
- /package/{assets → src/assets}/css/markdown/macro.less +0 -0
- /package/{assets/css/article_markdown.less → src/assets/css/markdown/markdown-article.less} +0 -0
- /package/{assets/css/markdown.less → src/assets/css/markdown/markdown-editor.less} +0 -0
- /package/{assets → src/assets}/css/markdown/talent.less +0 -0
- /package/{assets → src/assets}/css/markdown/video.less +0 -0
- /package/{assets → src/assets}/css/module/buff.less +0 -0
- /package/{assets → src/assets}/css/module/icon.less +0 -0
- /package/{assets → src/assets}/css/module/item.less +0 -0
- /package/{assets → src/assets}/css/module/item_simple.less +0 -0
- /package/{assets → src/assets}/css/module/jx3_element.less +0 -0
- /package/{assets → src/assets}/css/module/macro.less +0 -0
- /package/{assets → src/assets}/css/module/npc.less +0 -0
- /package/{assets → src/assets}/css/module/resource.less +0 -0
- /package/{assets → src/assets}/css/module/skill.less +0 -0
- /package/{assets → src/assets}/css/tinymce/hr.less +0 -0
- /package/{assets → src/assets}/css/tinymce/img.less +0 -0
- /package/{assets → src/assets}/css/tinymce/imgpreview.less +0 -0
- /package/{assets → src/assets}/css/tinymce/list.less +0 -0
- /package/{assets → src/assets}/css/tinymce/nextpage.less +0 -0
- /package/{assets → src/assets}/css/tinymce/p.less +0 -0
- /package/{assets → src/assets}/css/tinymce/plugin.less +0 -0
- /package/{assets → src/assets}/css/tinymce/qixue.less +0 -0
- /package/{assets → src/assets}/css/tinymce/quote.less +0 -0
- /package/{assets → src/assets}/css/tinymce/video.less +0 -0
- /package/{assets → src/assets}/css/tinymce/voice.less +0 -0
- /package/{assets → src/assets}/data/detach_type.json +0 -0
- /package/{assets → src/assets}/data/game_font.json +0 -0
- /package/{assets → src/assets}/data/markdown_whitelist.json +0 -0
- /package/{assets → src/assets}/data/weapon_type.json +0 -0
- /package/{assets → src/assets}/img/buff.svg +0 -0
- /package/{assets → src/assets}/img/equip_bg.png +0 -0
- /package/{assets → src/assets}/img/file.svg +0 -0
- /package/{assets → src/assets}/img/icons.svg +0 -0
- /package/{assets → src/assets}/img/item/pve.png +0 -0
- /package/{assets → src/assets}/img/item/pvp.png +0 -0
- /package/{assets → src/assets}/img/item/pvx.png +0 -0
- /package/{assets → src/assets}/img/item/std.png +0 -0
- /package/{assets → src/assets}/img/item/wujie.png +0 -0
- /package/{assets → src/assets}/img/item.svg +0 -0
- /package/{assets → src/assets}/img/jx3.svg +0 -0
- /package/{assets → src/assets}/img/jx3box.svg +0 -0
- /package/{assets → src/assets}/img/npc/attack.svg +0 -0
- /package/{assets → src/assets}/img/npc/buff.svg +0 -0
- /package/{assets → src/assets}/img/npc/energy.svg +0 -0
- /package/{assets → src/assets}/img/npc/miss.svg +0 -0
- /package/{assets → src/assets}/img/npc/npc.svg +0 -0
- /package/{assets → src/assets}/img/npc/radar.svg +0 -0
- /package/{assets → src/assets}/img/npc/shield.svg +0 -0
- /package/{assets → src/assets}/img/npc/sight.svg +0 -0
- /package/{assets → src/assets}/img/npc/skull.svg +0 -0
- /package/{assets → src/assets}/img/npc/target.svg +0 -0
- /package/{assets → src/assets}/img/skill.svg +0 -0
- /package/{assets → src/assets}/img/skillset.png +0 -0
- /package/{assets → src/assets}/js/a.js +0 -0
- /package/{assets → src/assets}/js/code.js +0 -0
- /package/{assets → src/assets}/js/combo.js +0 -0
- /package/{assets → src/assets}/js/drag.js +0 -0
- /package/{assets → src/assets}/js/filter2.js +0 -0
- /package/{assets → src/assets}/js/fold.js +0 -0
- /package/{assets → src/assets}/js/gallery.js +0 -0
- /package/{assets → src/assets}/js/iframe.js +0 -0
- /package/{assets → src/assets}/js/img.js +0 -0
- /package/{assets → src/assets}/js/item/attribute_percent.js +0 -0
- /package/{assets → src/assets}/js/item/bind.js +0 -0
- /package/{assets → src/assets}/js/item/border.js +0 -0
- /package/{assets → src/assets}/js/item/border_quest.js +0 -0
- /package/{assets → src/assets}/js/item/color.js +0 -0
- /package/{assets → src/assets}/js/item/hljs_languages.js +0 -0
- /package/{assets → src/assets}/js/item/icon_url.js +0 -0
- /package/{assets → src/assets}/js/item/second_format.js +0 -0
- /package/{assets → src/assets}/js/jx3_element.js +0 -0
- /package/{assets → src/assets}/js/macro.js +0 -0
- /package/{assets → src/assets}/js/nextpage.js +0 -0
- /package/{assets → src/assets}/js/pswp.js +0 -0
- /package/{assets → src/assets}/js/pswp_template.js +0 -0
- /package/{assets → src/assets}/js/pz_iframe.js +0 -0
- /package/{assets → src/assets}/js/qixue.js +0 -0
- /package/{assets → src/assets}/js/script.js +0 -0
- /package/{assets → src/assets}/js/talent2.js +0 -0
- /package/{assets → src/assets}/js/tex-mml-chtml.js +0 -0
- /package/{service → src/service}/enum/CollectionPublic.js +0 -0
- /package/{service → src/service}/enum/EquipPosition.js +0 -0
- /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
|
|
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
|
|
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 "
|
|
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 "
|
|
54
|
-
import execFilterIframe from "
|
|
55
|
-
import execFilterLink from "
|
|
56
|
-
import execSplitPages from "
|
|
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 "
|
|
60
|
-
import renderDirectory from "
|
|
61
|
-
import
|
|
62
|
-
import
|
|
63
|
-
import
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
import
|
|
67
|
-
import
|
|
68
|
-
import
|
|
69
|
-
import
|
|
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
|
|
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, [
|
|
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
|
-
|
|
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
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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 "
|
|
355
|
+
@import "./assets/css/article.less";
|
|
317
356
|
</style>
|
package/src/ArticleMarkdown.vue
CHANGED
|
@@ -1,46 +1,55 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="c-article-markdown">
|
|
3
|
-
<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
|
|
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
|
|
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 "
|
|
22
|
-
import execFilterIframe from "
|
|
23
|
-
import execFilterLink from "
|
|
24
|
-
import execFilterXSS from "
|
|
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 "
|
|
28
|
-
import renderMacro from "
|
|
29
|
-
import renderTalent from "
|
|
30
|
-
import renderTalent2 from "
|
|
31
|
-
import {renderKatexAll} from "
|
|
32
|
-
import renderCode from "
|
|
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 "
|
|
40
|
-
import renderImgPreview from "
|
|
41
|
-
import renderAudio from "
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
151
|
-
handler
|
|
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 "
|
|
176
|
+
@import "./assets/css/article_markdown.less";
|
|
170
177
|
|
|
171
178
|
.v-note-img-wrapper {
|
|
172
179
|
display: none;
|
package/src/BoxResource.vue
CHANGED
|
@@ -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
|
|
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
|
|
12
|
-
<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
|
|
15
|
-
<template
|
|
16
|
-
<template
|
|
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
|
-
<
|
|
25
|
-
<
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
<
|
|
57
|
-
<
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
72
|
-
<
|
|
73
|
-
|
|
74
|
-
|
|
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="
|
|
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
|
|
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
|
-
<
|
|
96
|
-
<
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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 "
|
|
107
|
-
import { loadAuthors, loadEmotions, getLetterPaper } from "
|
|
108
|
-
import { getUserInfo } from "
|
|
109
|
-
import
|
|
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.
|
|
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 "
|
|
444
|
+
@import "./assets/css/resource.less";
|
|
420
445
|
|
|
421
446
|
.m-item-pop {
|
|
422
447
|
padding: 0 !important;
|