@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.
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 +124 -137
  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/Skill.vue CHANGED
@@ -1,17 +1,9 @@
1
1
  <template>
2
2
  <div class="w-skill" v-if="data">
3
3
  <div class="w-skill-wrapper">
4
- <img
5
- class="w-skill-icon"
6
- :src="iconLink(data.IconID || 13)"
7
- :alt="data.Name"
8
- />
4
+ <img class="w-skill-icon" :src="iconLink(data.IconID || 13)" :alt="data.Name" />
9
5
  <div class="w-skill-content">
10
- <el-button
11
- type="text"
12
- class="w-skill-switch-parse"
13
- @click="show_parse = !show_parse"
14
- >
6
+ <el-button link class="w-skill-switch-parse" @click="show_parse = !show_parse">
15
7
  <i class="el-icon-refresh"></i>
16
8
  </el-button>
17
9
  <span class="w-skill-name">{{ data.Name }}</span>
@@ -26,28 +18,42 @@
26
18
  </template>
27
19
 
28
20
  <script>
29
- import { getSkill } from "../service/database.js";
21
+ import { getSkill } from "./service/database.js";
30
22
  import { iconLink } from "@jx3box/jx3box-common/js/utils";
31
23
  export default {
32
24
  name: "Skill",
33
- props: ["client", "id", "level"],
25
+ props: {
26
+ client: {
27
+ type: String,
28
+ default: "std",
29
+ },
30
+ id: {
31
+ type: [String, Number],
32
+ default: "",
33
+ },
34
+ level: {
35
+ type: [String, Number],
36
+ default: "",
37
+ },
38
+ },
34
39
  data: () => ({
35
40
  data: null,
36
41
  show_parse: true,
42
+ requestVersion: 0,
37
43
  }),
38
44
  computed: {
39
45
  params: function () {
40
46
  return [this.client, this.id, this.level];
41
47
  },
42
48
  desc: function () {
43
- if (this.data.parse && this.show_parse) {
49
+ if (this.data?.parse && this.show_parse) {
44
50
  const result = this.data.parse.desc;
45
51
  return result.replace(/\\n/g, "\n");
46
52
  }
47
53
  return this.data?.Desc;
48
54
  },
49
55
  talent_desc: function () {
50
- if (this.data.parse && this.show_parse) {
56
+ if (this.data?.parse && this.show_parse) {
51
57
  return this.data.parse.talent_desc;
52
58
  }
53
59
  return "";
@@ -56,32 +62,36 @@ export default {
56
62
  watch: {
57
63
  params: {
58
64
  immediate: true,
59
- deep: true,
60
65
  handler(val) {
66
+ this.requestVersion += 1;
67
+ const currentVersion = this.requestVersion;
68
+
61
69
  if (val) {
62
70
  let [client, id, level] = val;
71
+ if (!id) {
72
+ this.data = null;
73
+ return;
74
+ }
63
75
  // 读取本地数据
64
- const cache = sessionStorage.getItem(
65
- `skill-${client}-${id}-${level}`
66
- );
76
+ const cache = sessionStorage.getItem(`skill-${client}-${id}-${level}`);
67
77
  if (cache) {
68
78
  try {
69
79
  this.data = JSON.parse(cache);
70
80
  return;
71
- } catch {}
81
+ } catch (e) {
82
+ console.log(e, "[Skill]无法解析本地缓存");
83
+ }
72
84
  // 没有缓存则发起请求获取数据
73
85
  }
74
- if (!id) return;
75
- getSkill(...this.params).then(res => {
86
+ getSkill(client, id, level).then((res) => {
87
+ if (currentVersion !== this.requestVersion) return;
88
+
76
89
  let data = res.data?.list?.[0];
77
90
  if (!data) data = null;
78
91
  this.data = data;
79
92
 
80
93
  // 将数据放入 sessionStorage
81
- sessionStorage.setItem(
82
- `skill-${client}-${id}-${level}`,
83
- JSON.stringify(data)
84
- );
94
+ sessionStorage.setItem(`skill-${client}-${id}-${level}`, JSON.stringify(data));
85
95
  });
86
96
  }
87
97
  },
@@ -96,5 +106,5 @@ export default {
96
106
  </script>
97
107
 
98
108
  <style lang="less">
99
- @import "../assets/css/module/skill.less";
109
+ @import "./assets/css/module/skill.less";
100
110
  </style>
package/src/Tinymce.vue CHANGED
@@ -3,17 +3,28 @@
3
3
  <slot name="prepend"></slot>
4
4
 
5
5
  <div class="c-editor-header">
6
+ <!-- 上传附件 -->
6
7
  <Upload v-if="attachmentEnable" @insert="insertAttachments" />
8
+ <!-- 剑三资源库 -->
7
9
  <Resource v-if="resourceEnable" @insert="insertResource" />
10
+ <!-- 魔盒资源库 -->
8
11
  <BoxResource v-if="resourceEnable" @insert="insertResource" :subtype="subtype" />
9
12
  </div>
10
- <Emotion class="c-editor-emotion" @selected="emotionSelected"></Emotion>
13
+
14
+ <Emotion v-if="emotionEnable" class="c-editor-emotion" @selected="emotionSelected"></Emotion>
11
15
 
12
16
  <slot></slot>
13
17
 
14
- <editor id="tinymce" v-model="data" :init="init" class="c-tinymce" placeholder="✔ 图片可右键粘贴或拖拽至编辑器内自动上传 ✔ 支持word/excel内容一键粘贴" />
18
+ <editor
19
+ id="tinymce"
20
+ v-model="data"
21
+ :init="init"
22
+ class="c-tinymce"
23
+ placeholder="✔ 图片可右键粘贴或拖拽至编辑器内自动上传 ✔ 支持word/excel内容一键粘贴"
24
+ />
15
25
  <el-alert class="u-tutorial" type="warning" show-icon
16
- >进入特殊区域(代码块,折叠块等等)脱离或使用工具栏触发后,请使用键盘方向 → ↓ 键进行脱离,回车只是正常在区块内换行。去掉样式点击第二行第一个&lt;清除格式&gt;即可复位。<a
26
+ >进入特殊区域(代码块,折叠块等等)脱离或使用工具栏触发后,请使用键盘方向 → ↓
27
+ 键进行脱离,回车只是正常在区块内换行。去掉样式点击第二行第一个&lt;清除格式&gt;即可复位。<a
17
28
  href="/collection/31"
18
29
  target="_blank"
19
30
  >[编辑器使用指南]</a
@@ -25,29 +36,75 @@
25
36
  </template>
26
37
 
27
38
  <script>
28
- import Vue from "vue";
29
- import axios from "axios";
30
- import Editor from "@tinymce/tinymce-vue";
39
+ import GlobalConf from "../config/global.js";
40
+ import JX3BOX from "@jx3box/jx3box-common/data/jx3box.json";
41
+ const { __cdn, __imgPath, __cms } = JX3BOX;
42
+ // 开发环境走 devServer proxy,避免跨域导致粘贴图片上传“看起来没反应”
43
+ const apiUrl = process.env.NODE_ENV === "development" ? "/api/cms/upload/tinymce" : __cms + "api/cms/upload/tinymce";
44
+
31
45
  import Upload from "./Upload";
32
46
  import Resource from "./Resource";
33
47
  import BoxResource from "./BoxResource";
34
- import { __cms } from "@jx3box/jx3box-common/data/jx3box.json";
35
- import { __imgPath } from "@jx3box/jx3box-common/data/jx3box.json";
36
48
  import Emotion from "@jx3box/jx3box-emotion/src/Emotion.vue";
37
- import hljs_languages from "../assets/js/item/hljs_languages.js";
38
- const API_Root = process.env.NODE_ENV === "production" ? __cms : "/";
39
- const API = API_Root + "api/cms/upload/tinymce";
40
49
 
41
- // directive
42
- import { draggable } from "../assets/js/drag";
43
- Vue.directive("draggable", draggable);
50
+ import axios from "axios";
51
+ import Editor from "@tinymce/tinymce-vue";
52
+ import hljs_languages from "./assets/js/item/hljs_languages.js";
53
+ // TODO:请求代理问题
44
54
 
45
55
  export default {
46
56
  name: "Tinymce",
47
- props: ["content", "height", "attachmentEnable", "resourceEnable", "subtype"],
57
+ components: {
58
+ Editor,
59
+ Upload,
60
+ Resource,
61
+ BoxResource,
62
+ Emotion,
63
+ },
64
+ props: {
65
+ // Vue3 默认 v-model
66
+ modelValue: {
67
+ type: String,
68
+ },
69
+
70
+ // 内容 兼容旧用法
71
+ content: {
72
+ type: String,
73
+ default: "",
74
+ },
75
+
76
+ // 默认高度
77
+ height: {
78
+ type: Number,
79
+ default: 800,
80
+ },
81
+
82
+ // 是否启用附件上传
83
+ attachmentEnable: {
84
+ type: Boolean,
85
+ default: true,
86
+ },
87
+ // 是否启用资源插入
88
+ resourceEnable: {
89
+ type: Boolean,
90
+ default: true,
91
+ },
92
+ // 是否启用表情插入
93
+ emotionEnable: {
94
+ type: Boolean,
95
+ default: true,
96
+ },
97
+
98
+ // 心法(技能连招使用)
99
+ subtype: {
100
+ type: String,
101
+ default: "通用",
102
+ },
103
+ },
104
+ emits: ["update:modelValue", "update:content", "update"],
48
105
  data: function () {
49
106
  return {
50
- data: this.content,
107
+ data: this.modelValue ?? this.content ?? "",
51
108
  init: {
52
109
  // 选择器
53
110
  selector: "#tinymce",
@@ -59,9 +116,10 @@ export default {
59
116
  convert_urls: false,
60
117
 
61
118
  // 样式
62
- // TODO:
63
- content_css: process.env.VUE_APP_DEV_COMPONENT == "true" ? "/css/article.css" : `https://cdn.jx3box.com/static/jx3box-editor/css/article.css`,
64
- // content_css: `http://localhost:3000/skins/content/default/content.min.css`,
119
+ content_css:
120
+ process.env.VUE_APP_TINYMCE_DEV === "true"
121
+ ? `http://localhost:5120/skins/content/default/content.min.css`
122
+ : `${__cdn}/static/tinymce/skins/content/default/content.min.css`,
65
123
  body_class: "c-article c-article-editor c-article-tinymce",
66
124
  height: this.height || 800,
67
125
  autosave_ask_before_unload: false,
@@ -72,125 +130,70 @@ export default {
72
130
  menubar: false,
73
131
  branding: false,
74
132
  contextmenu: "",
75
- plugins: [
76
- "link autolink",
77
- "hr lists advlist table codeinline codesample checklist foldtext latex anchor",
78
- "image emoticons media videox macro qixue talent2",
79
- "code fullscreen wordcount powerpaste pagebreak printpage pz audiox", // template anchor jx3icon autosave
80
- ],
81
- toolbar: [
82
- "undo | formatselect | fontsizeselect | forecolor backcolor | bold italic underline strikethrough superscript subscript | link unlink | fullscreen code", //anchor restoredraft
83
- "removeformat | hr alignleft aligncenter alignright alignjustify indent outdent | bullist numlist checklist table blockquote foldtext codeinline codesample latex | emoticons image media videox audiox | macro pz qixue talent2 pagebreak printpage", // template anchor jx3icon
84
- ],
85
- mobile: {
86
- toolbar_drawer: true,
87
- toolbar: [
88
- "undo emoticons bold italic underline strikethrough superscript subscript link unlink forecolor backcolor removeformat pagebreak fullscreen code",
89
- "hr alignleft aligncenter alignright alignjustify indent outdent bullist numlist checklist table blockquote foldtext codeinline codesample latex macro pz qixue talent2 media videox audiox",
90
- ],
91
- },
133
+ plugins: GlobalConf.plugins,
134
+ toolbar: GlobalConf.toolbar,
135
+ mobile: GlobalConf.mobile,
92
136
  block_formats: "段落=p;一级标题=h1;二级标题=h2;三级标题=h3;四级标题=h4;五级标题=h5;六级标题=h6;",
93
137
  fontsize_formats: "12px 14px 16px 18px 22px 24px 26px 28px 32px 48px 72px",
94
- color_map: [
95
- "FF99CC",
96
- "浅粉",
97
- "FF3399",
98
- "深粉",
99
- "FF0000",
100
- "正红",
101
- "CC99FF",
102
- "紫色",
103
- "9933ff",
104
- "深紫",
105
- "FFFF99",
106
- "浅黄",
107
- "FFFF00",
108
- "金黄",
109
- "FFCC00",
110
- "亮黄",
111
- "FFCC99",
112
- "浅桃",
113
- "FF6600",
114
- "橘色",
115
- "CCFFCC",
116
- "浅绿",
117
- "9bf915",
118
- "荧光绿",
119
- "00FF00",
120
- "辣眼绿",
121
- "49c10f",
122
- "深绿",
123
- "008080",
124
- "深青",
125
- "CCFFFF",
126
- "浅蓝",
127
- "00FFFF",
128
- "参考线",
129
- "00CCFF",
130
- "天蓝",
131
- "99CCFF",
132
- "蔚蓝",
133
- "0000FF",
134
- "辣眼蓝",
135
- "CC0000",
136
- "深红",
137
- "000000",
138
- "黑色",
139
- ],
138
+ color_map: GlobalConf.color_map,
140
139
 
141
140
  codesample_languages: hljs_languages,
142
141
 
143
142
  // Image
144
143
  image_advtab: true,
145
- // paste_data_images: true,
146
144
  file_picker_types: "file image",
145
+ // images_upload_url: this.uploadUrl,
147
146
  automatic_uploads: true,
148
- images_upload_handler: (blobInfo, success, failure, progress) => {
149
- this.imagesUploadHandler(blobInfo, success, failure, progress);
150
- },
151
-
152
- // Hook
153
- // setup: this.setup,
154
- // init_instance_callback: this.ready,
155
-
156
- // Template
157
- // templates: [
158
- // {
159
- // title: "剑三宏",
160
- // description: "",
161
- // content: `
162
- // <pre class="e-jx3macro-area w-jx3macro">/cast 自绝经脉</pre>
163
- // `,
164
- // },
165
- // ],
147
+ // 允许直接粘贴图片(会以 blob 形式触发 images_upload_handler)
148
+ paste_data_images: true,
149
+ // images_upload_credentials: true,
150
+ images_upload_handler: this.imagesUploadHandler,
166
151
  valid_children: "+body[style]",
167
152
  },
168
153
  mode: "tinymce",
169
- style: "",
170
154
  };
171
155
  },
172
- model: {
173
- prop: "content",
174
- event: "update",
175
- },
176
156
  watch: {
177
- data: function (newval) {
178
- this.$emit("update", newval);
157
+ data: function (val) {
158
+ this.$emit("update:modelValue", val);
159
+ this.$emit("update:content", val);
160
+ this.$emit("update", val);
179
161
  },
180
- content: function (newval) {
181
- this.data = newval;
162
+ modelValue: {
163
+ immediate: true,
164
+ handler: function (val) {
165
+ // 当外部未使用默认 v-model(modelValue 未传入)时,走 :content / v-model:content
166
+ if (val !== undefined && val !== this.data) this.data = val ?? "";
167
+ },
182
168
  },
183
- style(val) {
184
- this.init.content_style = val;
169
+ content: {
170
+ immediate: true,
171
+ handler: function (val) {
172
+ if (this.modelValue === undefined && val !== this.data) this.data = val ?? "";
173
+ },
185
174
  },
186
175
  },
187
176
  methods: {
188
- imagesUploadHandler: function (blobInfo, success, failure, progress) {
177
+ setup(editor) {
178
+ console.log("ID为: " + editor.id + " 的编辑器即将初始化.");
179
+ },
180
+ ready(editor) {
181
+ console.log("ID为: " + editor.id + " 的编辑器已初始化完成.");
182
+ },
183
+ insertAttachments(data) {
184
+ // eslint-disable-next-line no-undef
185
+ tinyMCE.editors["tinymce"].insertContent(data.html);
186
+ },
187
+ insertResource(data) {
188
+ // eslint-disable-next-line no-undef
189
+ tinyMCE.editors["tinymce"].insertContent(data);
190
+ },
191
+ imagesUploadHandler(blobInfo, success, failure, progress) {
189
192
  let fdata = new FormData();
190
193
  fdata.append("file", blobInfo.blob(), blobInfo.filename());
191
194
 
192
195
  axios
193
- .post(API, fdata, {
196
+ .post(apiUrl, fdata, {
194
197
  headers: {
195
198
  "Content-Type": "multipart/form-data",
196
199
  },
@@ -228,23 +231,13 @@ export default {
228
231
  success(url);
229
232
  })
230
233
  .catch((err) => {
231
- const message = (err.response && err.response.data && (err.response.data.msg || err.response.data.message)) || "图片上传请求异常";
234
+ const message =
235
+ (err.response && err.response.data && (err.response.data.msg || err.response.data.message)) ||
236
+ "图片上传请求异常";
232
237
  failure(message);
233
238
  });
234
239
  },
235
- setup: function (editor) {
236
- // console.log("ID为: " + editor.id + " 的编辑器即将初始化.");
237
- },
238
- ready: function (editor) {
239
- // console.log("ID为: " + editor.id + " 的编辑器已初始化完成.");
240
- },
241
- insertAttachments: function (data) {
242
- tinyMCE.editors["tinymce"].insertContent(data.html);
243
- },
244
- insertResource: function (data) {
245
- tinyMCE.editors["tinymce"].insertContent(data);
246
- },
247
- emotionSelected: function (emotion) {
240
+ emotionSelected(emotion) {
248
241
  let src = emotion.filename;
249
242
  if (!emotion.filename.startsWith("http")) {
250
243
  src = `${__imgPath}emotion/output/${emotion.filename}`;
@@ -253,18 +246,12 @@ export default {
253
246
  tinyMCE.editors["tinymce"].insertContent(IMAGE);
254
247
  },
255
248
  },
256
- mounted: function () {},
257
- components: {
258
- Editor,
259
- Upload,
260
- Resource,
261
- Emotion,
262
- BoxResource,
249
+ mounted() {
250
+ // console.log(process.env.VUE_APP_TINYMCE_DEV)
263
251
  },
264
252
  };
265
253
  </script>
266
254
 
267
255
  <style lang="less">
268
- @import "../assets/css/tinymce.less";
269
- @import "../assets/css/tinymce/combo.less";
256
+ @import "./assets/css/tinymce.less";
270
257
  </style>