@cgboiler/biz-mobile 1.11.0 → 1.13.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.
- package/es/index.d.ts +4 -2
- package/es/index.js +5 -1
- package/es/md-preview/MdPreview.d.ts +49 -0
- package/es/md-preview/MdPreview.js +59 -0
- package/es/md-preview/_atomic.css +32 -0
- package/es/md-preview/index.css +1 -0
- package/es/md-preview/index.d.ts +3 -0
- package/es/md-preview/index.js +5 -0
- package/es/md-preview/index.less +102 -0
- package/es/md-preview/style/index.d.ts +1 -0
- package/es/md-preview/style/index.js +1 -0
- package/es/md-preview/style/less.d.ts +1 -0
- package/es/md-preview/style/less.js +1 -0
- package/es/md-preview/types.d.ts +23 -0
- package/es/md-preview/types.js +24 -0
- package/es/md-preview/utils/customRules.d.ts +12 -0
- package/es/md-preview/utils/customRules.js +31 -0
- package/es/md-preview/utils/diffRenderer.d.ts +8 -0
- package/es/md-preview/utils/diffRenderer.js +24 -0
- package/es/md-preview/utils/index.d.ts +4 -0
- package/es/md-preview/utils/index.js +4 -0
- package/es/md-preview/utils/markdownRenderer.d.ts +7 -0
- package/es/md-preview/utils/markdownRenderer.js +24 -0
- package/es/md-preview/utils/typewriterEffect.d.ts +34 -0
- package/es/md-preview/utils/typewriterEffect.js +61 -0
- package/es/org-picker/OrgPicker.d.ts +4 -4
- package/es/org-picker/OrgPicker.js +16 -42
- package/es/org-picker/types.d.ts +3 -2
- package/es/org-picker/useApi.d.ts +15 -1
- package/es/org-picker/useApi.js +20 -25
- package/es/vue-sfc-shim.d.ts +3 -0
- package/lib/index.d.ts +4 -2
- package/lib/index.js +5 -1
- package/lib/md-preview/MdPreview.d.ts +49 -0
- package/lib/md-preview/MdPreview.js +76 -0
- package/lib/md-preview/_atomic.css +32 -0
- package/lib/md-preview/index.css +1 -0
- package/lib/md-preview/index.d.ts +3 -0
- package/lib/md-preview/index.js +34 -0
- package/lib/md-preview/index.less +102 -0
- package/lib/md-preview/style/index.d.ts +1 -0
- package/lib/md-preview/style/index.js +1 -0
- package/lib/md-preview/style/less.d.ts +1 -0
- package/lib/md-preview/style/less.js +1 -0
- package/lib/md-preview/types.d.ts +23 -0
- package/lib/md-preview/types.js +43 -0
- package/lib/md-preview/utils/customRules.d.ts +12 -0
- package/lib/md-preview/utils/customRules.js +50 -0
- package/lib/md-preview/utils/diffRenderer.d.ts +8 -0
- package/lib/md-preview/utils/diffRenderer.js +53 -0
- package/lib/md-preview/utils/index.d.ts +4 -0
- package/lib/md-preview/utils/index.js +20 -0
- package/lib/md-preview/utils/markdownRenderer.d.ts +7 -0
- package/lib/md-preview/utils/markdownRenderer.js +53 -0
- package/lib/md-preview/utils/typewriterEffect.d.ts +34 -0
- package/lib/md-preview/utils/typewriterEffect.js +79 -0
- package/lib/org-picker/OrgPicker.d.ts +4 -4
- package/lib/org-picker/OrgPicker.js +17 -43
- package/lib/org-picker/types.d.ts +3 -2
- package/lib/org-picker/useApi.d.ts +15 -1
- package/lib/org-picker/useApi.js +19 -24
- package/lib/vue-sfc-shim.d.ts +3 -0
- package/package.json +3 -2
- /package/es/org-picker/components/{deptImg.d.ts → DeptImg.d.ts} +0 -0
- /package/es/org-picker/components/{deptImg.js → DeptImg.js} +0 -0
- /package/lib/org-picker/components/{deptImg.d.ts → DeptImg.d.ts} +0 -0
- /package/lib/org-picker/components/{deptImg.js → DeptImg.js} +0 -0
package/es/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from "./md-preview";
|
|
1
2
|
export * from "./org-picker";
|
|
2
3
|
export * from "./project-select";
|
|
3
4
|
declare namespace _default {
|
|
@@ -6,7 +7,8 @@ declare namespace _default {
|
|
|
6
7
|
}
|
|
7
8
|
export default _default;
|
|
8
9
|
export function install(app: any): void;
|
|
9
|
-
export const version: "1.
|
|
10
|
+
export const version: "1.12.0";
|
|
11
|
+
import MdPreview from './md-preview';
|
|
10
12
|
import OrgPicker from './org-picker';
|
|
11
13
|
import ProjectSelect from './project-select';
|
|
12
|
-
export { OrgPicker, ProjectSelect };
|
|
14
|
+
export { MdPreview, OrgPicker, ProjectSelect };
|
package/es/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import MdPreview from "./md-preview";
|
|
1
2
|
import OrgPicker from "./org-picker";
|
|
2
3
|
import ProjectSelect from "./project-select";
|
|
3
|
-
const version = "1.
|
|
4
|
+
const version = "1.12.0";
|
|
4
5
|
function install(app) {
|
|
5
6
|
const components = [
|
|
7
|
+
MdPreview,
|
|
6
8
|
OrgPicker,
|
|
7
9
|
ProjectSelect
|
|
8
10
|
];
|
|
@@ -14,6 +16,7 @@ function install(app) {
|
|
|
14
16
|
}
|
|
15
17
|
});
|
|
16
18
|
}
|
|
19
|
+
export * from "./md-preview";
|
|
17
20
|
export * from "./org-picker";
|
|
18
21
|
export * from "./project-select";
|
|
19
22
|
var stdin_default = {
|
|
@@ -21,6 +24,7 @@ var stdin_default = {
|
|
|
21
24
|
version
|
|
22
25
|
};
|
|
23
26
|
export {
|
|
27
|
+
MdPreview,
|
|
24
28
|
OrgPicker,
|
|
25
29
|
ProjectSelect,
|
|
26
30
|
stdin_default as default,
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import './index.less';
|
|
2
|
+
declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
3
|
+
text: {
|
|
4
|
+
type: StringConstructor;
|
|
5
|
+
required: boolean;
|
|
6
|
+
};
|
|
7
|
+
typewriter: {
|
|
8
|
+
type: BooleanConstructor;
|
|
9
|
+
default: boolean;
|
|
10
|
+
};
|
|
11
|
+
typewriterKey: {
|
|
12
|
+
type: NumberConstructor;
|
|
13
|
+
};
|
|
14
|
+
showDiff: {
|
|
15
|
+
type: BooleanConstructor;
|
|
16
|
+
default: boolean;
|
|
17
|
+
};
|
|
18
|
+
previousText: {
|
|
19
|
+
type: StringConstructor;
|
|
20
|
+
default: string;
|
|
21
|
+
};
|
|
22
|
+
}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "typewriterComplete"[], "typewriterComplete", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
23
|
+
text: {
|
|
24
|
+
type: StringConstructor;
|
|
25
|
+
required: boolean;
|
|
26
|
+
};
|
|
27
|
+
typewriter: {
|
|
28
|
+
type: BooleanConstructor;
|
|
29
|
+
default: boolean;
|
|
30
|
+
};
|
|
31
|
+
typewriterKey: {
|
|
32
|
+
type: NumberConstructor;
|
|
33
|
+
};
|
|
34
|
+
showDiff: {
|
|
35
|
+
type: BooleanConstructor;
|
|
36
|
+
default: boolean;
|
|
37
|
+
};
|
|
38
|
+
previousText: {
|
|
39
|
+
type: StringConstructor;
|
|
40
|
+
default: string;
|
|
41
|
+
};
|
|
42
|
+
}>> & Readonly<{
|
|
43
|
+
onTypewriterComplete?: ((...args: any[]) => any) | undefined;
|
|
44
|
+
}>, {
|
|
45
|
+
typewriter: boolean;
|
|
46
|
+
showDiff: boolean;
|
|
47
|
+
previousText: string;
|
|
48
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
49
|
+
export default _default;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
import { createVNode as _createVNode } from "vue";
|
|
18
|
+
import "./_atomic.css";
|
|
19
|
+
import { defineComponent, computed, watch } from "vue";
|
|
20
|
+
import { mdPreviewProps } from "./types";
|
|
21
|
+
import { initMarked, renderMarkdown, generateDiffHtml, useTypewriter } from "./utils";
|
|
22
|
+
import "./index.css";
|
|
23
|
+
var stdin_default = defineComponent({
|
|
24
|
+
name: "MdPreview",
|
|
25
|
+
props: __spreadValues({}, mdPreviewProps),
|
|
26
|
+
emits: ["typewriterComplete"],
|
|
27
|
+
setup(props, {
|
|
28
|
+
emit
|
|
29
|
+
}) {
|
|
30
|
+
initMarked();
|
|
31
|
+
const {
|
|
32
|
+
currentText,
|
|
33
|
+
controller: typewriterController
|
|
34
|
+
} = useTypewriter(() => {
|
|
35
|
+
emit("typewriterComplete");
|
|
36
|
+
});
|
|
37
|
+
const htmlContent = computed(() => renderMarkdown(props.text || ""));
|
|
38
|
+
const displayContent = computed(() => {
|
|
39
|
+
if (props.showDiff) {
|
|
40
|
+
return generateDiffHtml(props.previousText, props.text || "", htmlContent.value);
|
|
41
|
+
}
|
|
42
|
+
return props.typewriter ? currentText.value : htmlContent.value;
|
|
43
|
+
});
|
|
44
|
+
watch([() => props.text, () => props.typewriterKey], () => {
|
|
45
|
+
if (props.typewriter) {
|
|
46
|
+
typewriterController.start(htmlContent.value);
|
|
47
|
+
}
|
|
48
|
+
}, {
|
|
49
|
+
immediate: true
|
|
50
|
+
});
|
|
51
|
+
return () => _createVNode("div", {
|
|
52
|
+
"class": "cgx-markdown-preview",
|
|
53
|
+
"innerHTML": displayContent.value
|
|
54
|
+
}, null);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
export {
|
|
58
|
+
stdin_default as default
|
|
59
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
|
|
2
|
+
.cgx-atm .flex {
|
|
3
|
+
align-items: initial;
|
|
4
|
+
flex-direction: initial;
|
|
5
|
+
justify-content: initial;
|
|
6
|
+
flex-wrap: initial;
|
|
7
|
+
}
|
|
8
|
+
.cgx-atm .flex-row {
|
|
9
|
+
flex-direction: row;
|
|
10
|
+
}
|
|
11
|
+
.cgx-atm .flex-col {
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
}
|
|
14
|
+
.cgx-atm .justify-center {
|
|
15
|
+
justify-content: center;
|
|
16
|
+
}
|
|
17
|
+
.cgx-atm .justify-between {
|
|
18
|
+
justify-content: space-between;
|
|
19
|
+
}
|
|
20
|
+
.cgx-atm .justify-around {
|
|
21
|
+
justify-content: space-around;
|
|
22
|
+
}
|
|
23
|
+
.cgx-atm .justify-end {
|
|
24
|
+
justify-content: flex-end;
|
|
25
|
+
}
|
|
26
|
+
.cgx-atm .items-center {
|
|
27
|
+
align-items: center;
|
|
28
|
+
}
|
|
29
|
+
.cgx-atm .flex-wrap {
|
|
30
|
+
flex-wrap: wrap;
|
|
31
|
+
}
|
|
32
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.katex-block{display:block;margin:1em 0;text-align:center;overflow-x:auto;overflow-y:hidden}.cgx-markdown-preview{overflow-x:auto}.cgx-markdown-preview .diff-container{border:1px solid #ebeef5;border-radius:4px;overflow:auto}.cgx-markdown-preview .diff-equal{color:#606266}.cgx-markdown-preview .diff-delete{background-color:#ffeef0;color:#f56c6c;text-decoration:line-through}.cgx-markdown-preview .diff-insert{background-color:#e6ffec;color:#67c23a}.cgx-markdown-preview .diff-unified-view pre{margin:0;padding:8px;white-space:pre-wrap;word-break:break-word}.cgx-markdown-preview{line-height:1.6;font-size:var(--font-base)}.cgx-markdown-preview ol{list-style:auto}.cgx-markdown-preview ul{list-style:disc}.cgx-markdown-preview ol,.cgx-markdown-preview ul{padding-left:2em;margin:0 0 12px}.cgx-markdown-preview li::marker{text-align:start!important}.cgx-markdown-preview h1{font-size:2em;font-weight:700;margin:16px 0}.cgx-markdown-preview h2{font-size:1.5em;font-weight:700;margin:14px 0}.cgx-markdown-preview p{margin:12px 0}.cgx-markdown-preview blockquote{margin:0;padding-left:1em;border-left:4px solid #ddd;color:#666}.cgx-markdown-preview table{border-collapse:collapse;width:100%;margin-bottom:16px}.cgx-markdown-preview th,.cgx-markdown-preview td{border:1px solid #ddd;padding:8px;text-align:left}.cgx-markdown-preview th{background-color:#f6f8fa}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
.katex-block {
|
|
2
|
+
display: block;
|
|
3
|
+
margin: 1em 0;
|
|
4
|
+
text-align: center;
|
|
5
|
+
overflow-x: auto;
|
|
6
|
+
overflow-y: hidden;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.cgx-markdown-preview {
|
|
10
|
+
overflow-x: auto;
|
|
11
|
+
|
|
12
|
+
/* 差异对比样式 */
|
|
13
|
+
.diff-container {
|
|
14
|
+
border: 1px solid #ebeef5;
|
|
15
|
+
border-radius: 4px;
|
|
16
|
+
overflow: auto;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.diff-equal {
|
|
20
|
+
color: #606266;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.diff-delete {
|
|
24
|
+
background-color: #ffeef0;
|
|
25
|
+
color: #f56c6c;
|
|
26
|
+
text-decoration: line-through;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.diff-insert {
|
|
30
|
+
background-color: #e6ffec;
|
|
31
|
+
color: #67c23a;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.diff-unified-view pre {
|
|
35
|
+
margin: 0;
|
|
36
|
+
padding: 8px;
|
|
37
|
+
white-space: pre-wrap;
|
|
38
|
+
word-break: break-word;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.cgx-markdown-preview {
|
|
43
|
+
line-height: 1.6;
|
|
44
|
+
font-size: var(--font-base);
|
|
45
|
+
ol {
|
|
46
|
+
list-style: auto;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
ul {
|
|
50
|
+
list-style: disc;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
ol,
|
|
54
|
+
ul {
|
|
55
|
+
padding-left: 2em;
|
|
56
|
+
margin: 0 0 12px 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
li::marker {
|
|
60
|
+
text-align: start !important;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
h1 {
|
|
64
|
+
font-size: 2em;
|
|
65
|
+
font-weight: bold;
|
|
66
|
+
margin: 16px 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
h2 {
|
|
70
|
+
font-size: 1.5em;
|
|
71
|
+
font-weight: bold;
|
|
72
|
+
margin: 14px 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
p {
|
|
76
|
+
margin: 12px 0;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
blockquote {
|
|
80
|
+
margin: 0;
|
|
81
|
+
padding-left: 1em;
|
|
82
|
+
border-left: 4px solid #ddd;
|
|
83
|
+
color: #666;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
table {
|
|
87
|
+
border-collapse: collapse;
|
|
88
|
+
width: 100%;
|
|
89
|
+
margin-bottom: 16px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
th,
|
|
93
|
+
td {
|
|
94
|
+
border: 1px solid #ddd;
|
|
95
|
+
padding: 8px;
|
|
96
|
+
text-align: left;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
th {
|
|
100
|
+
background-color: #f6f8fa;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "../index.css";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "../index.less";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ExtractPropTypes } from 'vue';
|
|
2
|
+
export declare const mdPreviewProps: {
|
|
3
|
+
text: {
|
|
4
|
+
type: StringConstructor;
|
|
5
|
+
required: boolean;
|
|
6
|
+
};
|
|
7
|
+
typewriter: {
|
|
8
|
+
type: BooleanConstructor;
|
|
9
|
+
default: boolean;
|
|
10
|
+
};
|
|
11
|
+
typewriterKey: {
|
|
12
|
+
type: NumberConstructor;
|
|
13
|
+
};
|
|
14
|
+
showDiff: {
|
|
15
|
+
type: BooleanConstructor;
|
|
16
|
+
default: boolean;
|
|
17
|
+
};
|
|
18
|
+
previousText: {
|
|
19
|
+
type: StringConstructor;
|
|
20
|
+
default: string;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export type MdPreviewProps = ExtractPropTypes<typeof mdPreviewProps>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const mdPreviewProps = {
|
|
2
|
+
text: {
|
|
3
|
+
type: String,
|
|
4
|
+
required: true
|
|
5
|
+
},
|
|
6
|
+
typewriter: {
|
|
7
|
+
type: Boolean,
|
|
8
|
+
default: false
|
|
9
|
+
},
|
|
10
|
+
typewriterKey: {
|
|
11
|
+
type: Number
|
|
12
|
+
},
|
|
13
|
+
showDiff: {
|
|
14
|
+
type: Boolean,
|
|
15
|
+
default: false
|
|
16
|
+
},
|
|
17
|
+
previousText: {
|
|
18
|
+
type: String,
|
|
19
|
+
default: ""
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
export {
|
|
23
|
+
mdPreviewProps
|
|
24
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const customTildeRule: {
|
|
2
|
+
name: string;
|
|
3
|
+
level: string;
|
|
4
|
+
start(src: string): number;
|
|
5
|
+
tokenizer(src: string): {
|
|
6
|
+
type: string;
|
|
7
|
+
raw: string;
|
|
8
|
+
text: string;
|
|
9
|
+
} | undefined;
|
|
10
|
+
renderer(token: any): any;
|
|
11
|
+
};
|
|
12
|
+
export declare const initMarked: () => void;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { marked } from "marked";
|
|
2
|
+
const customTildeRule = {
|
|
3
|
+
name: "customTilde",
|
|
4
|
+
level: "inline",
|
|
5
|
+
start(src) {
|
|
6
|
+
return src.indexOf("~");
|
|
7
|
+
},
|
|
8
|
+
tokenizer(src) {
|
|
9
|
+
const rule = /^~([^~]+)~/;
|
|
10
|
+
const match = src.match(rule);
|
|
11
|
+
if (match) {
|
|
12
|
+
return {
|
|
13
|
+
type: "customTilde",
|
|
14
|
+
raw: match[0],
|
|
15
|
+
text: match[0]
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
renderer(token) {
|
|
20
|
+
return token.text;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const initMarked = () => {
|
|
24
|
+
marked.use({
|
|
25
|
+
extensions: [customTildeRule]
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
export {
|
|
29
|
+
customTildeRule,
|
|
30
|
+
initMarked
|
|
31
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as DiffMatchPatch from "diff-match-patch";
|
|
2
|
+
const generateDiffHtml = (previousText, currentText, fallbackHtml) => {
|
|
3
|
+
if (!previousText && !currentText)
|
|
4
|
+
return fallbackHtml;
|
|
5
|
+
const dmp = new DiffMatchPatch.diff_match_patch();
|
|
6
|
+
const diffs = dmp.diff_main(previousText, currentText);
|
|
7
|
+
dmp.diff_cleanupSemantic(diffs);
|
|
8
|
+
let html = '<div class="diff-unified-view"><pre>';
|
|
9
|
+
diffs.forEach(([type, text]) => {
|
|
10
|
+
const escapedText = text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/\n/g, "<br>");
|
|
11
|
+
if (type === 0) {
|
|
12
|
+
html += `<span class="diff-equal">${escapedText}</span>`;
|
|
13
|
+
} else if (type === -1) {
|
|
14
|
+
html += `<span class="diff-delete">${escapedText}</span>`;
|
|
15
|
+
} else if (type === 1) {
|
|
16
|
+
html += `<span class="diff-insert">${escapedText}</span>`;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
html += "</pre></div>";
|
|
20
|
+
return html;
|
|
21
|
+
};
|
|
22
|
+
export {
|
|
23
|
+
generateDiffHtml
|
|
24
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { marked } from "marked";
|
|
2
|
+
import * as katex from "katex";
|
|
3
|
+
import "katex/dist/katex.min.css";
|
|
4
|
+
const renderMarkdown = (text) => {
|
|
5
|
+
const processedText = (text || "").replace(/(\$\$[\s\S]+?\$\$|\$[^\$\n]+?\$)/g, (match) => {
|
|
6
|
+
return `@@MATH_FORMULA@@${encodeURIComponent(match)}@@`;
|
|
7
|
+
}).replace(/<\/?(pre|code)(\s[^>]*)?>/g, "").replace(/```markdown|```/g, "").replace(/(.*)```$/gm, "$1");
|
|
8
|
+
let renderedContent = marked(processedText);
|
|
9
|
+
renderedContent = renderedContent.replace(/@@MATH_FORMULA@@([^@]+)@@/g, (_, encoded) => {
|
|
10
|
+
const formula = decodeURIComponent(encoded);
|
|
11
|
+
const isBlock = formula.startsWith("$$") && formula.endsWith("$$");
|
|
12
|
+
const tex = isBlock ? formula.slice(2, -2).trim() : formula.slice(1, -1).trim();
|
|
13
|
+
const html = katex.renderToString(tex, {
|
|
14
|
+
displayMode: isBlock,
|
|
15
|
+
throwOnError: false,
|
|
16
|
+
strict: false
|
|
17
|
+
});
|
|
18
|
+
return isBlock ? `<div class="katex-block">${html}</div>` : html;
|
|
19
|
+
});
|
|
20
|
+
return renderedContent.replace(/<a\s/g, '<a target="_blank" ');
|
|
21
|
+
};
|
|
22
|
+
export {
|
|
23
|
+
renderMarkdown
|
|
24
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* 打字机效果控制器
|
|
4
|
+
*/
|
|
5
|
+
export declare class TypewriterController {
|
|
6
|
+
private currentText;
|
|
7
|
+
private typingTimer;
|
|
8
|
+
private onComplete;
|
|
9
|
+
/**
|
|
10
|
+
* 构造函数
|
|
11
|
+
* @param currentText 当前文本的响应式引用
|
|
12
|
+
* @param onComplete 打字完成时的回调函数
|
|
13
|
+
*/
|
|
14
|
+
constructor(currentText: Ref<string>, onComplete: () => void);
|
|
15
|
+
/**
|
|
16
|
+
* 开始打字机效果
|
|
17
|
+
* @param fullContent 完整的内容
|
|
18
|
+
* @param speed 打字速度(毫秒)
|
|
19
|
+
*/
|
|
20
|
+
start(fullContent: string, speed?: number): void;
|
|
21
|
+
/**
|
|
22
|
+
* 停止打字机效果
|
|
23
|
+
*/
|
|
24
|
+
stop(): void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 创建打字机效果控制器
|
|
28
|
+
* @param onComplete 打字完成时的回调函数
|
|
29
|
+
* @returns 打字机控制器和当前文本的引用
|
|
30
|
+
*/
|
|
31
|
+
export declare const useTypewriter: (onComplete: () => void) => {
|
|
32
|
+
currentText: Ref<string, string>;
|
|
33
|
+
controller: TypewriterController;
|
|
34
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => {
|
|
4
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
+
return value;
|
|
6
|
+
};
|
|
7
|
+
import { ref } from "vue";
|
|
8
|
+
class TypewriterController {
|
|
9
|
+
/**
|
|
10
|
+
* 构造函数
|
|
11
|
+
* @param currentText 当前文本的响应式引用
|
|
12
|
+
* @param onComplete 打字完成时的回调函数
|
|
13
|
+
*/
|
|
14
|
+
constructor(currentText, onComplete) {
|
|
15
|
+
__publicField(this, "currentText");
|
|
16
|
+
__publicField(this, "typingTimer", null);
|
|
17
|
+
__publicField(this, "onComplete");
|
|
18
|
+
this.currentText = currentText;
|
|
19
|
+
this.onComplete = onComplete;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 开始打字机效果
|
|
23
|
+
* @param fullContent 完整的内容
|
|
24
|
+
* @param speed 打字速度(毫秒)
|
|
25
|
+
*/
|
|
26
|
+
start(fullContent, speed = 5) {
|
|
27
|
+
this.stop();
|
|
28
|
+
this.currentText.value = "";
|
|
29
|
+
let index = 0;
|
|
30
|
+
this.typingTimer = window.setInterval(() => {
|
|
31
|
+
if (index < fullContent.length) {
|
|
32
|
+
this.currentText.value = fullContent.slice(0, index + 1);
|
|
33
|
+
index++;
|
|
34
|
+
} else {
|
|
35
|
+
this.stop();
|
|
36
|
+
this.onComplete();
|
|
37
|
+
}
|
|
38
|
+
}, speed);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 停止打字机效果
|
|
42
|
+
*/
|
|
43
|
+
stop() {
|
|
44
|
+
if (this.typingTimer) {
|
|
45
|
+
clearInterval(this.typingTimer);
|
|
46
|
+
this.typingTimer = null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const useTypewriter = (onComplete) => {
|
|
51
|
+
const currentText = ref("");
|
|
52
|
+
const controller = new TypewriterController(currentText, onComplete);
|
|
53
|
+
return {
|
|
54
|
+
currentText,
|
|
55
|
+
controller
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
export {
|
|
59
|
+
TypewriterController,
|
|
60
|
+
useTypewriter
|
|
61
|
+
};
|
|
@@ -17,10 +17,10 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
17
17
|
default: boolean;
|
|
18
18
|
};
|
|
19
19
|
'onUpdate:modelValue': {
|
|
20
|
-
type:
|
|
20
|
+
type: FunctionConstructor;
|
|
21
21
|
};
|
|
22
22
|
'onUpdate:show': {
|
|
23
|
-
type:
|
|
23
|
+
type: FunctionConstructor;
|
|
24
24
|
};
|
|
25
25
|
}>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("update:show" | "update:modelValue")[], "update:show" | "update:modelValue", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
26
26
|
modelValue: {
|
|
@@ -40,10 +40,10 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
40
40
|
default: boolean;
|
|
41
41
|
};
|
|
42
42
|
'onUpdate:modelValue': {
|
|
43
|
-
type:
|
|
43
|
+
type: FunctionConstructor;
|
|
44
44
|
};
|
|
45
45
|
'onUpdate:show': {
|
|
46
|
-
type:
|
|
46
|
+
type: FunctionConstructor;
|
|
47
47
|
};
|
|
48
48
|
}>> & Readonly<{
|
|
49
49
|
"onUpdate:modelValue"?: ((...args: any[]) => any) | undefined;
|