@blueking/ai-ui-sdk 0.0.15-beta.3 → 0.0.15-beta.31

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 (89) hide show
  1. package/dist/assets/images/ai.png +0 -0
  2. package/dist/assets/images/user.png +0 -0
  3. package/dist/assets/svg/picture-fail.svg +1 -0
  4. package/dist/common/util.d.ts +10 -0
  5. package/dist/common/util.js +34 -0
  6. package/dist/component/render-image/index.script.vue.js +37 -0
  7. package/dist/component/render-image/index.vue.d.ts +6 -0
  8. package/dist/component/render-image/index.vue.js +3 -0
  9. package/dist/component/render-input/index.script.vue.js +210 -0
  10. package/dist/component/render-input/index.vue.css +124 -0
  11. package/dist/component/render-input/index.vue.d.ts +20 -0
  12. package/dist/component/render-input/index.vue.js +5 -0
  13. package/dist/component/render-input/render-drag.script.vue.js +61 -0
  14. package/dist/component/render-input/render-drag.vue.css +28 -0
  15. package/dist/component/render-input/render-drag.vue.d.ts +13 -0
  16. package/dist/component/render-input/render-drag.vue.js +5 -0
  17. package/dist/component/render-input/render-quill.script.vue.js +197 -0
  18. package/dist/component/render-input/render-quill.vue.css +27 -0
  19. package/dist/component/render-input/render-quill.vue.d.ts +24 -0
  20. package/dist/component/render-input/render-quill.vue.js +4 -0
  21. package/dist/component/render-knowledge-icon/index.script.vue.js +40 -0
  22. package/dist/component/render-knowledge-icon/index.vue.css +4 -0
  23. package/dist/component/render-knowledge-icon/index.vue.d.ts +14 -0
  24. package/dist/component/render-knowledge-icon/index.vue.js +5 -0
  25. package/dist/component/render-markdown/mark-down-code.d.ts +2 -0
  26. package/dist/component/render-markdown/mark-down-code.js +171 -0
  27. package/dist/component/render-markdown/mark-down-emoji.d.ts +2 -0
  28. package/dist/component/render-markdown/mark-down-emoji.js +4 -0
  29. package/dist/component/render-markdown/mark-down.d.ts +74 -0
  30. package/dist/component/render-markdown/mark-down.js +147 -0
  31. package/dist/component/render-markdown/mark-down.postcss.css +129 -0
  32. package/dist/component/render-message/index.d.ts +61 -0
  33. package/dist/component/render-message/index.js +110 -0
  34. package/dist/component/render-message/openai-message.script.vue.js +215 -0
  35. package/dist/component/render-message/openai-message.vue.css +99 -0
  36. package/dist/component/render-message/openai-message.vue.d.ts +15 -0
  37. package/dist/component/render-message/openai-message.vue.js +5 -0
  38. package/dist/component/render-message/skeleton-message.script.vue.js +7 -0
  39. package/dist/component/render-message/skeleton-message.vue.css +7 -0
  40. package/dist/component/render-message/skeleton-message.vue.d.ts +2 -0
  41. package/dist/component/render-message/skeleton-message.vue.js +6 -0
  42. package/dist/component/render-message/system-message.script.vue.js +17 -0
  43. package/dist/component/render-message/system-message.vue.css +18 -0
  44. package/dist/component/render-message/system-message.vue.d.ts +6 -0
  45. package/dist/component/render-message/system-message.vue.js +5 -0
  46. package/dist/component/render-message/time-message.script.vue.js +41 -0
  47. package/dist/component/render-message/time-message.vue.css +14 -0
  48. package/dist/component/render-message/time-message.vue.d.ts +6 -0
  49. package/dist/component/render-message/time-message.vue.js +5 -0
  50. package/dist/component/render-message/token-expired-message.script.vue.js +78 -0
  51. package/dist/component/render-message/token-expired-message.vue.css +56 -0
  52. package/dist/component/render-message/token-expired-message.vue.d.ts +15 -0
  53. package/dist/component/render-message/token-expired-message.vue.js +5 -0
  54. package/dist/component/render-message/user-message.script.vue.js +230 -0
  55. package/dist/component/render-message/user-message.vue.css +90 -0
  56. package/dist/component/render-message/user-message.vue.d.ts +21 -0
  57. package/dist/component/render-message/user-message.vue.js +5 -0
  58. package/dist/component/render-stop/index.script.vue.js +24 -0
  59. package/dist/component/render-stop/index.vue.css +18 -0
  60. package/dist/component/render-stop/index.vue.d.ts +6 -0
  61. package/dist/component/render-stop/index.vue.js +5 -0
  62. package/dist/component.d.ts +5 -0
  63. package/dist/component.js +6 -0
  64. package/dist/css/fonts/iconcool.eot +0 -0
  65. package/dist/css/fonts/iconcool.svg +30 -0
  66. package/dist/css/fonts/iconcool.ttf +0 -0
  67. package/dist/css/fonts/iconcool.woff +0 -0
  68. package/dist/css/iconcool.js +1 -1
  69. package/dist/css/style.css +34 -4
  70. package/dist/event/index.js +2 -1
  71. package/dist/hooks/use-chat.d.ts +8 -8
  72. package/dist/hooks/use-chat.js +88 -51
  73. package/dist/hooks/use-click-proxy.js +1 -1
  74. package/dist/hooks/use-http.d.ts +1 -0
  75. package/dist/hooks/use-http.js +4 -0
  76. package/dist/hooks/use-mouse-drag.d.ts +13 -0
  77. package/dist/hooks/use-mouse-drag.js +59 -0
  78. package/dist/hooks/use-reference-doc.js +4 -4
  79. package/dist/http/fetch/error-interceptor.js +23 -2
  80. package/dist/http/fetch/index.js +5 -6
  81. package/dist/http/helper/agent.d.ts +7 -0
  82. package/dist/http/helper/agent.js +10 -0
  83. package/dist/http/helper/session.js +1 -1
  84. package/dist/types/agent.d.ts +12 -0
  85. package/dist/types/enum.d.ts +6 -1
  86. package/dist/types/enum.js +7 -1
  87. package/dist/types/model.d.ts +14 -0
  88. package/dist/types/session.d.ts +4 -2
  89. package/package.json +25 -5
@@ -0,0 +1,197 @@
1
+ import { defineComponent as _defineComponent } from 'vue';
2
+ import { openBlock as _openBlock, createElementBlock as _createElementBlock } from "vue";
3
+ import Quill from 'quill';
4
+ import Delta from 'quill-delta';
5
+ import { getCurrentInstance, onMounted, watch } from 'vue';
6
+ import 'quill/dist/quill.snow.css';
7
+ export default /*@__PURE__*/ _defineComponent({
8
+ props: {
9
+ placeholder: {},
10
+ value: {},
11
+ sessionId: {},
12
+ supportImage: {
13
+ type: Boolean
14
+ },
15
+ isUploadingImage: {
16
+ type: Boolean
17
+ }
18
+ },
19
+ emits: [
20
+ "change",
21
+ "update:isUploadingImage"
22
+ ],
23
+ setup (__props, { expose: __expose, emit: __emit }) {
24
+ const props = __props;
25
+ const emits = __emit;
26
+ const vm = getCurrentInstance();
27
+ let quill;
28
+ const allowedImageType = [
29
+ 'image/jpeg',
30
+ 'image/gif',
31
+ 'image/png',
32
+ 'image/webp',
33
+ 'image/bmp',
34
+ 'image/svg+xml',
35
+ 'image/apng',
36
+ 'image/avif'
37
+ ];
38
+ // 更新 placeholder
39
+ const updatePlaceholder = ()=>{
40
+ var _vm_proxy;
41
+ const el = vm === null || vm === void 0 ? void 0 : (_vm_proxy = vm.proxy) === null || _vm_proxy === void 0 ? void 0 : _vm_proxy.$el.querySelector('.ql-editor');
42
+ el.dataset.placeholder = props.placeholder;
43
+ };
44
+ // 值变化事件
45
+ const handleChange = ()=>{
46
+ let value = '';
47
+ const { ops } = quill.getContents();
48
+ ops === null || ops === void 0 ? void 0 : ops.forEach((op, index)=>{
49
+ var _op_insert;
50
+ if (typeof (op === null || op === void 0 ? void 0 : op.insert) === 'object' && (op === null || op === void 0 ? void 0 : (_op_insert = op.insert) === null || _op_insert === void 0 ? void 0 : _op_insert.image)) {
51
+ value += `![image.png](${op.insert.image})`;
52
+ }
53
+ if (typeof (op === null || op === void 0 ? void 0 : op.insert) === 'string') {
54
+ // 去掉最后一行的换行符
55
+ value += index === ops.length - 1 ? op.insert.replace(/\n$/, '') : op.insert;
56
+ }
57
+ });
58
+ // 触发值更新
59
+ emits('change', value);
60
+ };
61
+ // 覆盖粘贴事件,只复制纯文本
62
+ const handlePaste = (event)=>{
63
+ event.preventDefault();
64
+ // 聚焦
65
+ focus();
66
+ // 获取当前状态
67
+ const range = getSelection();
68
+ if (range) {
69
+ var _event_clipboardData;
70
+ const delta = new Delta().retain(range.index);
71
+ // 获取粘贴板的数据
72
+ const copyText = (_event_clipboardData = event.clipboardData) === null || _event_clipboardData === void 0 ? void 0 : _event_clipboardData.getData('text');
73
+ setTimeout(()=>{
74
+ var _copyText_replaceAll;
75
+ // 更新内容
76
+ const copyDelta = new Delta([
77
+ {
78
+ insert: copyText
79
+ }
80
+ ]);
81
+ const finalDelta = delta.concat(copyDelta).delete(range.length);
82
+ quill.updateContents(finalDelta, 'user');
83
+ // 设置光标位置
84
+ setSelection(range.index + ((copyText === null || copyText === void 0 ? void 0 : (_copyText_replaceAll = copyText.replaceAll('\r', '')) === null || _copyText_replaceAll === void 0 ? void 0 : _copyText_replaceAll.length) || 0), 0, 'silent');
85
+ }, 1);
86
+ }
87
+ };
88
+ // 复制选中html元素的内容
89
+ const handleCopySelection = (event)=>{
90
+ event.preventDefault();
91
+ // 获取选中内容的范围
92
+ const selection = window.getSelection();
93
+ if (selection) {
94
+ var // 覆盖原生的复制 or 剪切数据
95
+ _event_clipboardData;
96
+ const range = selection.getRangeAt(0);
97
+ const selectedHTML = range.cloneContents();
98
+ // 循环拼接复制的文本
99
+ const copyTexts = [];
100
+ Array.from(selectedHTML.childNodes).forEach((node)=>{
101
+ var _node_childNodes;
102
+ const childNode = (_node_childNodes = node.childNodes) === null || _node_childNodes === void 0 ? void 0 : _node_childNodes[0];
103
+ if (childNode instanceof HTMLImageElement) {
104
+ // 图片
105
+ copyTexts.push(`![image.png](${childNode.src})`);
106
+ } else if (childNode) {
107
+ // 完整行
108
+ copyTexts.push(childNode.textContent || '');
109
+ } else if (node.textContent) {
110
+ // 部分行
111
+ copyTexts.push(node.textContent || '');
112
+ }
113
+ });
114
+ (_event_clipboardData = event.clipboardData) === null || _event_clipboardData === void 0 ? void 0 : _event_clipboardData.setData('text/plain', copyTexts.join('\n'));
115
+ }
116
+ };
117
+ // 删除选中内容
118
+ const handleDeleteSelection = ()=>{
119
+ const range = quill.getSelection();
120
+ if (range) {
121
+ quill.deleteText(range.index, range.length);
122
+ }
123
+ };
124
+ // 覆盖复制事件
125
+ const handleCopy = (event)=>{
126
+ handleCopySelection(event);
127
+ };
128
+ // 覆盖剪切事件
129
+ const handleCut = (event)=>{
130
+ handleCopySelection(event);
131
+ handleDeleteSelection();
132
+ };
133
+ const handleInit = ()=>{
134
+ var _vm_proxy;
135
+ // 初始化
136
+ quill = new Quill(vm === null || vm === void 0 ? void 0 : (_vm_proxy = vm.proxy) === null || _vm_proxy === void 0 ? void 0 : _vm_proxy.$el, {
137
+ modules: {
138
+ toolbar: false
139
+ },
140
+ placeholder: props.placeholder,
141
+ theme: 'snow'
142
+ });
143
+ // listen change
144
+ quill.on('text-change', handleChange);
145
+ // listen paste
146
+ quill.root.addEventListener('paste', handlePaste);
147
+ // listen copy
148
+ quill.root.addEventListener('copy', handleCopy);
149
+ // listen cut
150
+ quill.root.addEventListener('cut', handleCut);
151
+ // set value & selection
152
+ if (props.value) {
153
+ setText(props.value);
154
+ setSelection(props.value.length);
155
+ }
156
+ // focus
157
+ quill.focus();
158
+ };
159
+ /**
160
+ * api 驱动设置,否则容易破坏图片的显示
161
+ * @param text 文本
162
+ */ const setText = (text)=>{
163
+ quill.setText(text);
164
+ };
165
+ // 聚焦
166
+ const focus = ()=>{
167
+ quill.focus();
168
+ };
169
+ // 删除
170
+ const deleteText = (index, length)=>{
171
+ quill.deleteText(index, length);
172
+ };
173
+ // 新增
174
+ const insertText = (index, text)=>{
175
+ quill.insertText(index, text);
176
+ };
177
+ // 获取当前光标位置
178
+ const getSelection = ()=>quill.getSelection();
179
+ // 设置光标位置
180
+ const setSelection = (index, length = 0, source)=>{
181
+ quill.setSelection(index, length, source);
182
+ };
183
+ watch(()=>props.placeholder, updatePlaceholder);
184
+ onMounted(handleInit);
185
+ __expose({
186
+ focus,
187
+ setText,
188
+ deleteText,
189
+ insertText,
190
+ getSelection,
191
+ setSelection
192
+ });
193
+ return (_ctx, _cache)=>{
194
+ return _openBlock(), _createElementBlock("section");
195
+ };
196
+ }
197
+ });
@@ -0,0 +1,27 @@
1
+
2
+ .ql-editor {
3
+ overflow-y: auto;
4
+ font-family: -apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei","Helvetica Neue",Arial,sans-serif;
5
+ }
6
+ .ql-editor img {
7
+ max-width: 250px !important;
8
+ max-height: 250px !important;
9
+ }
10
+ .ql-editor::-webkit-scrollbar {
11
+ width: 6px;
12
+ height: 6px;
13
+ }
14
+ .ql-editor::-webkit-scrollbar-thumb {
15
+ width: 6px;
16
+ height: 6px;
17
+ border-radius: 3px;
18
+ background-color: #dcdee5;
19
+ }
20
+ .ql-editor::-webkit-scrollbar-thumb:hover {
21
+ background-color: #979ba5;
22
+ }
23
+ .ql-editor::before {
24
+ line-height: 16px;
25
+ color: #DCDEE5 !important;
26
+ font-style: normal !important;
27
+ }
@@ -0,0 +1,24 @@
1
+ import type { RangeStatic } from 'quill';
2
+ import 'quill/dist/quill.snow.css';
3
+ interface IProps {
4
+ placeholder: string;
5
+ value?: string;
6
+ sessionId: string;
7
+ supportImage: boolean;
8
+ isUploadingImage: boolean;
9
+ }
10
+ declare const _default: import("vue").DefineComponent<IProps, {
11
+ focus: () => void;
12
+ setText: (text: string) => void;
13
+ deleteText: (index: number, length: number) => void;
14
+ insertText: (index: number, text: string) => void;
15
+ getSelection: () => RangeStatic | null;
16
+ setSelection: (index: number, length?: number) => void;
17
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
18
+ change: (value: string) => any;
19
+ "update:isUploadingImage": (value: boolean) => any;
20
+ }, string, import("vue").PublicProps, Readonly<IProps> & Readonly<{
21
+ onChange?: ((value: string) => any) | undefined;
22
+ "onUpdate:isUploadingImage"?: ((value: boolean) => any) | undefined;
23
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
24
+ export default _default;
@@ -0,0 +1,4 @@
1
+ import script from './render-quill.script.vue.js';
2
+ script.__file = "./src/component/render-input/render-quill.vue";
3
+ import './render-quill.vue.css';
4
+ export default script;
@@ -0,0 +1,40 @@
1
+ import { defineComponent as _defineComponent } from 'vue';
2
+ import { normalizeStyle as _normalizeStyle, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, unref as _unref, createElementVNode as _createElementVNode, Fragment as _Fragment } from "vue";
3
+ import { KnowledgePathType } from '../../types/enum.js';
4
+ export default /*@__PURE__*/ _defineComponent({
5
+ props: {
6
+ data: {},
7
+ size: {
8
+ default: '12'
9
+ }
10
+ },
11
+ setup (__props) {
12
+ // import FileTypeIcon from '@/components/file-type-icon.vue';
13
+ return (_ctx, _cache)=>{
14
+ var _ctx_data, _ctx_data1;
15
+ return !((_ctx_data = _ctx.data) === null || _ctx_data === void 0 ? void 0 : _ctx_data.id) ? (_openBlock(), _createElementBlock("i", {
16
+ key: 0,
17
+ style: _normalizeStyle({
18
+ fontSize: `${_ctx.size}px`
19
+ }),
20
+ class: "ai-ui-sdk-icon ai-ui-sdk-zonghe2"
21
+ }, null, 4 /* STYLE */ )) : ((_ctx_data1 = _ctx.data) === null || _ctx_data1 === void 0 ? void 0 : _ctx_data1.pathType) === _unref(KnowledgePathType).Folder ? (_openBlock(), _createElementBlock("i", {
22
+ key: 1,
23
+ style: _normalizeStyle({
24
+ fontSize: `${_ctx.size}px`
25
+ }),
26
+ class: "ai-ui-sdk-icon ai-ui-sdk-folder-fill"
27
+ }, null, 4 /* STYLE */ )) : (_openBlock(), _createElementBlock(_Fragment, {
28
+ key: 2
29
+ }, [
30
+ _createCommentVNode(" <file-type-icon\n v-else-if=\"data.pathType === KnowledgePathType.File\"\n :type=\"data.fileType\"\n :style=\"{\n fontSize: `${size}px`\n }\"\n /> "),
31
+ _createElementVNode("i", {
32
+ class: "ai-ui-sdk-icon ai-ui-sdk-zhishikufenlei",
33
+ style: _normalizeStyle({
34
+ fontSize: `${_ctx.size}px`
35
+ })
36
+ }, null, 4 /* STYLE */ )
37
+ ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */ ));
38
+ };
39
+ }
40
+ });
@@ -0,0 +1,4 @@
1
+
2
+ .ai-ui-sdk-icon[data-v-aw0tz55n] {
3
+ color: #C4C6CC;
4
+ }
@@ -0,0 +1,14 @@
1
+ import { KnowledgePathType } from '@/types/enum';
2
+ interface IData {
3
+ id?: number;
4
+ pathType?: KnowledgePathType;
5
+ fileType?: string;
6
+ }
7
+ interface IProps {
8
+ data?: IData;
9
+ size?: string;
10
+ }
11
+ declare const _default: import("vue").DefineComponent<IProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<IProps> & Readonly<{}>, {
12
+ size: string;
13
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import script from './index.script.vue.js';
2
+ script.__scopeId = "data-v-aw0tz55n";
3
+ script.__file = "./src/component/render-knowledge-icon/index.vue";
4
+ import './index.vue.css';
5
+ export default script;
@@ -0,0 +1,2 @@
1
+ import type MarkdownIt from 'markdown-it';
2
+ export declare const MarkDownCodePlugin: (markdownIt: MarkdownIt) => void;
@@ -0,0 +1,171 @@
1
+ const languageSuffixMap = {
2
+ c: '.c',
3
+ 'c++': '.cpp',
4
+ java: '.java',
5
+ python: '.py',
6
+ html: '.html',
7
+ css: '.css',
8
+ javascript: '.js',
9
+ js: '.js',
10
+ php: '.php',
11
+ ruby: '.rb',
12
+ swift: '.swift',
13
+ go: '.go',
14
+ perl: '.pl',
15
+ sql: '.sql',
16
+ xml: '.xml',
17
+ json: '.json',
18
+ vue: '.vue',
19
+ rust: '.rs',
20
+ jsx: '.jsx',
21
+ tsx: '.tsx',
22
+ typescript: '.ts',
23
+ ts: '.ts',
24
+ bash: '.sh'
25
+ };
26
+ const getLanguageSuffix = (name)=>languageSuffixMap[name.toLowerCase()] || '.txt';
27
+ let originalFence;
28
+ // 自定义代码块
29
+ export const MarkDownCodePlugin = (markdownIt)=>{
30
+ // 如果 originalFence 不存在,则获取原始的 fence 函数,防止嵌套调用
31
+ if (!originalFence) {
32
+ originalFence = markdownIt.renderer.rules.fence;
33
+ }
34
+ // 重写 fence 规则
35
+ markdownIt.block.ruler.at('fence', (state, startLine, endLine, silent)=>{
36
+ let pos = state.bMarks[startLine] + state.tShift[startLine];
37
+ let max = state.eMarks[startLine];
38
+ // 检查是否缩进过多
39
+ if (state.sCount[startLine] - state.blkIndent >= 4) {
40
+ return false;
41
+ }
42
+ // 检查是否有足够的字符
43
+ if (pos + 3 > max) {
44
+ return false;
45
+ }
46
+ const marker = state.src.charCodeAt(pos);
47
+ // 检查是否是有效的标记字符
48
+ if (marker !== 0x7E /* ~ */ && marker !== 0x60 /* ` */ ) {
49
+ return false;
50
+ }
51
+ // 获取标记的长度
52
+ let mem = pos;
53
+ pos = state.skipChars(pos, marker);
54
+ const len = pos - mem;
55
+ if (len < 3) {
56
+ return false;
57
+ }
58
+ const markup = state.src.slice(mem, pos);
59
+ const params = state.src.slice(pos, max);
60
+ // 检查参数中是否包含标记字符
61
+ if (marker === 0x60 /* ` */ ) {
62
+ if (params.indexOf(String.fromCharCode(marker)) >= 0) {
63
+ return false;
64
+ }
65
+ }
66
+ // 验证模式直接返回
67
+ if (silent) {
68
+ return true;
69
+ }
70
+ // 寻找结束标记
71
+ let nextLine = startLine;
72
+ let haveEndMarker = false;
73
+ for(;;){
74
+ nextLine += 1;
75
+ if (nextLine >= endLine) {
76
+ break;
77
+ }
78
+ pos = state.bMarks[nextLine] + state.tShift[nextLine];
79
+ mem = pos;
80
+ max = state.eMarks[nextLine];
81
+ if (pos < max && state.sCount[nextLine] < state.blkIndent) {
82
+ break;
83
+ }
84
+ // 如果不是标记字符,继续
85
+ if (state.src.charCodeAt(pos) !== marker) {
86
+ continue;
87
+ }
88
+ // 检查标记长度
89
+ if (state.sCount[nextLine] - state.blkIndent >= 4) {
90
+ continue;
91
+ }
92
+ pos = state.skipChars(pos, marker);
93
+ // 结束标记必须至少和开始标记一样长
94
+ if (pos - mem < len) {
95
+ continue;
96
+ }
97
+ // 检查标记后是否只有空格
98
+ pos = state.skipSpaces(pos);
99
+ if (pos < max) {
100
+ continue;
101
+ }
102
+ haveEndMarker = true;
103
+ break;
104
+ }
105
+ // 设置结束行
106
+ state.line = nextLine + (haveEndMarker ? 1 : 0);
107
+ // 创建 token
108
+ const token = state.push('fence', 'code', 0);
109
+ token.info = params;
110
+ token.content = state.getLines(startLine + 1, nextLine, state.sCount[startLine], true);
111
+ token.markup = markup;
112
+ token.map = [
113
+ startLine,
114
+ state.line
115
+ ];
116
+ token.haveEndMarker = haveEndMarker;
117
+ return true;
118
+ }, {
119
+ alt: [
120
+ 'paragraph',
121
+ 'reference',
122
+ 'blockquote',
123
+ 'list'
124
+ ]
125
+ });
126
+ // 自定义代码块渲染
127
+ markdownIt.renderer.rules.fence = (tokens, idx, options, env, self)=>{
128
+ const token = tokens[idx];
129
+ const hasEndBlock = token.haveEndMarker;
130
+ let language = token.info.trim();
131
+ let code = token.content;
132
+ // 原始渲染
133
+ const originalCode = originalFence(tokens, idx, options, env, self);
134
+ // 1. 如果代码块和语言不为空,则渲染代码块
135
+ if (code.trim() && language && hasEndBlock) {
136
+ const encodeCode = encodeURIComponent(code);
137
+ return `<section class="full-screen-wrap markdown-body" style="background-color: #2e2e2e;">
138
+ <section class="code-header g-flex-row">
139
+ <span>${language}</span>
140
+ <span class="g-flex-row">
141
+ <i class="ai-ui-sdk-icon ai-ui-sdk-un-full-screen click-un-full-screen"></i>
142
+ <i class="ai-ui-sdk-icon ai-ui-sdk-full-screen click-full-screen"></i>
143
+ <i class="ai-ui-sdk-icon ai-ui-sdk-copy click-copy" data-clipboard-text="${encodeCode}"></i>
144
+ <i class="ai-ui-sdk-icon ai-ui-sdk-dongzuo-xiazai click-download" data-clipboard-text="${encodeCode}" data-file-name="ai${getLanguageSuffix(language)}"></i>
145
+ </span>
146
+ </section>
147
+ ${originalCode}
148
+ </section>`;
149
+ }
150
+ // 2. 如果有结束标记并且有代码内容,则返回原始代码块
151
+ if (code.trim() && hasEndBlock) {
152
+ return originalCode;
153
+ }
154
+ // 3. 否则返回原始内容
155
+ // 开始标记
156
+ const start = token.markup;
157
+ // 结束标记
158
+ let end = '';
159
+ // 如果代码块长度大于行数,则添加结束标记(markdown不封闭语法)
160
+ if (hasEndBlock) {
161
+ end = '```';
162
+ }
163
+ // 如果代码块不为空,则添加换行符
164
+ if (code) {
165
+ code = code.replace(/\n/g, '<br>');
166
+ }
167
+ language = `${language}<br>`;
168
+ // 返回原始字符串
169
+ return `${start}${language}${code}${end}`;
170
+ };
171
+ };
@@ -0,0 +1,2 @@
1
+ import type MarkdownIt from 'markdown-it';
2
+ export declare const MarkDownEmojiPlugin: (markdownIt: MarkdownIt) => void;
@@ -0,0 +1,4 @@
1
+ // 关闭emoji
2
+ export const MarkDownEmojiPlugin = (markdownIt)=>{
3
+ markdownIt.core.ruler.disable('emoji');
4
+ };
@@ -0,0 +1,74 @@
1
+ import type MarkdownIt from 'markdown-it';
2
+ import 'x-mavon-editor/dist/css/index.css';
3
+ import 'x-mavon-editor/dist/markdown/github-markdown.min.css';
4
+ import 'x-mavon-editor/dist/highlightjs/styles/atom-one-dark.min.css';
5
+ import 'x-mavon-editor/dist/highlightjs/highlight.min.js';
6
+ import 'x-mavon-editor/dist/highlightjs/languages/javascript.min.js';
7
+ import 'x-mavon-editor/dist/highlightjs/languages/css.min.js';
8
+ import 'x-mavon-editor/dist/highlightjs/languages/python.min.js';
9
+ import 'x-mavon-editor/dist/highlightjs/languages/java.min.js';
10
+ import 'x-mavon-editor/dist/highlightjs/languages/php.min.js';
11
+ import 'x-mavon-editor/dist/highlightjs/languages/ruby.min.js';
12
+ import 'x-mavon-editor/dist/highlightjs/languages/swift.min.js';
13
+ import 'x-mavon-editor/dist/highlightjs/languages/go.min.js';
14
+ import 'x-mavon-editor/dist/highlightjs/languages/perl.min.js';
15
+ import 'x-mavon-editor/dist/highlightjs/languages/sql.min.js';
16
+ import 'x-mavon-editor/dist/highlightjs/languages/xml.min.js';
17
+ import 'x-mavon-editor/dist/highlightjs/languages/json.min.js';
18
+ import 'x-mavon-editor/dist/highlightjs/languages/typescript.min.js';
19
+ import 'x-mavon-editor/dist/highlightjs/languages/bash.min.js';
20
+ import 'x-mavon-editor/dist/highlightjs/languages/markdown.min.js';
21
+ import 'x-mavon-editor/dist/katex/katex.min.css';
22
+ import 'x-mavon-editor/dist/katex/katex.min.js';
23
+ import './mark-down.postcss';
24
+ export type MdProp = {
25
+ modelValue?: string;
26
+ codeStyle?: string;
27
+ previewBackground?: string;
28
+ defaultOpen: string;
29
+ editable: boolean;
30
+ subfield: boolean;
31
+ toolbarsFlag: boolean;
32
+ boxShadow: boolean;
33
+ ref?: (elm: MdRef) => void;
34
+ xssOptions: {
35
+ whiteList: {
36
+ [key: string]: string[];
37
+ };
38
+ };
39
+ };
40
+ type MdRef = {
41
+ $paste: () => void;
42
+ markdownIt: MarkdownIt;
43
+ };
44
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
45
+ value: {
46
+ type: StringConstructor;
47
+ };
48
+ isCode: {
49
+ type: BooleanConstructor;
50
+ default: boolean;
51
+ };
52
+ previewBackground: {
53
+ type: StringConstructor;
54
+ default: string;
55
+ };
56
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
57
+ [key: string]: any;
58
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
59
+ value: {
60
+ type: StringConstructor;
61
+ };
62
+ isCode: {
63
+ type: BooleanConstructor;
64
+ default: boolean;
65
+ };
66
+ previewBackground: {
67
+ type: StringConstructor;
68
+ default: string;
69
+ };
70
+ }>> & Readonly<{}>, {
71
+ isCode: boolean;
72
+ previewBackground: string;
73
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
74
+ export default _default;