@ant-design/x-markdown-mini 0.1.0-beta.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/LICENSE +21 -0
- package/README.md +216 -0
- package/dist/components/Markdown/index.acss +103 -0
- package/dist/components/Markdown/index.axml +12 -0
- package/dist/components/Markdown/index.js +93 -0
- package/dist/components/Markdown/index.json +7 -0
- package/dist/components/MiniNodeRenderer/index.acss +11 -0
- package/dist/components/MiniNodeRenderer/index.axml +113 -0
- package/dist/components/MiniNodeRenderer/index.js +37 -0
- package/dist/components/MiniNodeRenderer/index.json +7 -0
- package/dist/components/MiniNodeRenderer/index.sjs +63 -0
- package/dist/es/Markdown/index.acss +103 -0
- package/dist/es/Markdown/index.axml +12 -0
- package/dist/es/Markdown/index.js +93 -0
- package/dist/es/Markdown/index.json +7 -0
- package/dist/es/MiniNodeRenderer/index.acss +11 -0
- package/dist/es/MiniNodeRenderer/index.axml +113 -0
- package/dist/es/MiniNodeRenderer/index.js +37 -0
- package/dist/es/MiniNodeRenderer/index.json +7 -0
- package/dist/es/MiniNodeRenderer/index.sjs +63 -0
- package/dist/index.d.mts +508 -0
- package/dist/index.d.ts +508 -0
- package/dist/index.js +3151 -0
- package/dist/index.mjs +3111 -0
- package/dist/miniprogram_dist/components/Markdown/index.js +85 -0
- package/dist/miniprogram_dist/components/Markdown/index.json +10 -0
- package/dist/miniprogram_dist/components/Markdown/index.wxml +11 -0
- package/dist/miniprogram_dist/components/Markdown/index.wxss +103 -0
- package/dist/miniprogram_dist/components/MiniNodeRenderer/index.js +39 -0
- package/dist/miniprogram_dist/components/MiniNodeRenderer/index.json +10 -0
- package/dist/miniprogram_dist/components/MiniNodeRenderer/index.wxml +112 -0
- package/dist/miniprogram_dist/components/MiniNodeRenderer/index.wxs +40 -0
- package/dist/miniprogram_dist/components/MiniNodeRenderer/index.wxss +11 -0
- package/dist/miniprogram_dist/es/Markdown/index.js +85 -0
- package/dist/miniprogram_dist/es/Markdown/index.json +10 -0
- package/dist/miniprogram_dist/es/Markdown/index.wxml +11 -0
- package/dist/miniprogram_dist/es/Markdown/index.wxss +103 -0
- package/dist/miniprogram_dist/es/MiniNodeRenderer/index.js +39 -0
- package/dist/miniprogram_dist/es/MiniNodeRenderer/index.json +10 -0
- package/dist/miniprogram_dist/es/MiniNodeRenderer/index.wxml +112 -0
- package/dist/miniprogram_dist/es/MiniNodeRenderer/index.wxs +40 -0
- package/dist/miniprogram_dist/es/MiniNodeRenderer/index.wxss +11 -0
- package/dist/miniprogram_dist/index.js +3151 -0
- package/dist/miniprogram_dist/plugins/CodeHighlight/index.js +8038 -0
- package/dist/miniprogram_dist/plugins/CodeHighlight/style.wxss +105 -0
- package/dist/miniprogram_dist/plugins/Latex/index.js +14728 -0
- package/dist/miniprogram_dist/plugins/Latex/style.wxss +648 -0
- package/dist/miniprogram_dist/shared/flattenInline.js +100 -0
- package/dist/plugins/CodeHighlight/index.d.mts +27 -0
- package/dist/plugins/CodeHighlight/index.d.ts +27 -0
- package/dist/plugins/CodeHighlight/index.js +8038 -0
- package/dist/plugins/CodeHighlight/index.mjs +8028 -0
- package/dist/plugins/CodeHighlight/style.acss +105 -0
- package/dist/plugins/Latex/index.d.mts +12 -0
- package/dist/plugins/Latex/index.d.ts +12 -0
- package/dist/plugins/Latex/index.js +14728 -0
- package/dist/plugins/Latex/index.mjs +14705 -0
- package/dist/plugins/Latex/style.acss +648 -0
- package/dist/shared/flattenInline.js +100 -0
- package/dist/types-CegkonfJ.d.mts +83 -0
- package/dist/types-CegkonfJ.d.ts +83 -0
- package/package.json +93 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// src/components/wechat/Markdown/index.ts
|
|
4
|
+
var import__ = require("../../index.js");
|
|
5
|
+
var import_flattenInline = require("../../shared/flattenInline.js");
|
|
6
|
+
Component({
|
|
7
|
+
options: {
|
|
8
|
+
multipleSlots: true,
|
|
9
|
+
styleIsolation: "shared"
|
|
10
|
+
},
|
|
11
|
+
properties: {
|
|
12
|
+
content: { type: String, value: "" },
|
|
13
|
+
streaming: { type: null, value: false },
|
|
14
|
+
selectable: { type: Boolean, value: true },
|
|
15
|
+
gfm: { type: null, value: null },
|
|
16
|
+
breaks: { type: null, value: null },
|
|
17
|
+
className: { type: String, value: "" },
|
|
18
|
+
extensions: { type: null, value: null },
|
|
19
|
+
components: { type: null, value: null },
|
|
20
|
+
footnote: { type: Boolean, value: false }
|
|
21
|
+
},
|
|
22
|
+
data: {
|
|
23
|
+
nodes: [],
|
|
24
|
+
slotComponents: []
|
|
25
|
+
},
|
|
26
|
+
md: null,
|
|
27
|
+
lifetimes: {
|
|
28
|
+
attached() {
|
|
29
|
+
this._build();
|
|
30
|
+
this._render();
|
|
31
|
+
},
|
|
32
|
+
detached() {
|
|
33
|
+
var _a;
|
|
34
|
+
(_a = this.md) == null ? void 0 : _a.reset();
|
|
35
|
+
this.md = null;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
observers: {
|
|
39
|
+
// `components` / `footnote` are baked into the marked instance, rebuild on change.
|
|
40
|
+
"components, footnote"() {
|
|
41
|
+
if (this.md) {
|
|
42
|
+
this._build();
|
|
43
|
+
this._render();
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"content, streaming, selectable, extensions, gfm, breaks"() {
|
|
47
|
+
if (this.md) this._render();
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
methods: {
|
|
51
|
+
_build() {
|
|
52
|
+
var _a, _b;
|
|
53
|
+
const components = (_a = this.data.components) != null ? _a : [];
|
|
54
|
+
const footnote = !!this.data.footnote;
|
|
55
|
+
const extensions = footnote ? [(0, import__.Footnote)()] : [];
|
|
56
|
+
(_b = this.md) == null ? void 0 : _b.reset();
|
|
57
|
+
this.md = new import__.XMarkdownMini({ escapeText: false, components, extensions });
|
|
58
|
+
const slotComponents = footnote ? components.concat(["footnote"]) : components;
|
|
59
|
+
this.setData({ slotComponents });
|
|
60
|
+
},
|
|
61
|
+
_render() {
|
|
62
|
+
var _a, _b, _c;
|
|
63
|
+
const data = this.data;
|
|
64
|
+
this.md.renderNodes({
|
|
65
|
+
content: data.content,
|
|
66
|
+
platform: "wechat",
|
|
67
|
+
streaming: data.streaming,
|
|
68
|
+
selectable: data.selectable,
|
|
69
|
+
gfm: (_a = data.gfm) != null ? _a : void 0,
|
|
70
|
+
breaks: (_b = data.breaks) != null ? _b : void 0,
|
|
71
|
+
extensions: (_c = data.extensions) != null ? _c : void 0,
|
|
72
|
+
onRenderStart: () => this.triggerEvent("renderstart"),
|
|
73
|
+
onRenderProgress: (payload) => this.triggerEvent("renderprogress", payload),
|
|
74
|
+
onRenderComplete: () => this.triggerEvent("rendercomplete"),
|
|
75
|
+
onPatch: (nodes) => this.setData({ nodes: (0, import_flattenInline.flattenInlineNodes)(nodes) })
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
_tap(e) {
|
|
79
|
+
this.triggerEvent("tap", e);
|
|
80
|
+
},
|
|
81
|
+
_appear(e) {
|
|
82
|
+
this.triggerEvent("appear", e);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<view class="md-root {{className}}">
|
|
2
|
+
<mini-node-renderer
|
|
3
|
+
generic:custom-slot="custom-slot"
|
|
4
|
+
nodes="{{nodes}}"
|
|
5
|
+
selectable="{{selectable}}"
|
|
6
|
+
animation="{{animation}}"
|
|
7
|
+
slotComponents="{{slotComponents}}"
|
|
8
|
+
bind:tap="_tap"
|
|
9
|
+
bind:appear="_appear"
|
|
10
|
+
/>
|
|
11
|
+
</view>
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
.md-root {
|
|
2
|
+
display: block;
|
|
3
|
+
font-size: 28rpx;
|
|
4
|
+
line-height: 1.65;
|
|
5
|
+
color: #1f1f1f;
|
|
6
|
+
word-break: break-word;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.md-paragraph {
|
|
10
|
+
display: block;
|
|
11
|
+
margin: 0 0 16rpx;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.md-heading {
|
|
15
|
+
display: block;
|
|
16
|
+
font-weight: 600;
|
|
17
|
+
margin: 24rpx 0 12rpx;
|
|
18
|
+
line-height: 1.3;
|
|
19
|
+
}
|
|
20
|
+
.md-h1 { font-size: 44rpx; }
|
|
21
|
+
.md-h2 { font-size: 38rpx; }
|
|
22
|
+
.md-h3 { font-size: 34rpx; }
|
|
23
|
+
.md-h4 { font-size: 30rpx; }
|
|
24
|
+
.md-h5 { font-size: 28rpx; }
|
|
25
|
+
.md-h6 { font-size: 26rpx; color: #666; }
|
|
26
|
+
|
|
27
|
+
.md-list {
|
|
28
|
+
display: block;
|
|
29
|
+
margin: 8rpx 0 16rpx;
|
|
30
|
+
padding-left: 32rpx;
|
|
31
|
+
}
|
|
32
|
+
.md-list-item {
|
|
33
|
+
display: list-item;
|
|
34
|
+
margin: 4rpx 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.md-blockquote {
|
|
38
|
+
display: block;
|
|
39
|
+
margin: 12rpx 0;
|
|
40
|
+
padding: 8rpx 16rpx;
|
|
41
|
+
border-left: 6rpx solid #d9d9d9;
|
|
42
|
+
color: #555;
|
|
43
|
+
background: #fafafa;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.md-code-block {
|
|
47
|
+
display: block;
|
|
48
|
+
margin: 12rpx 0;
|
|
49
|
+
padding: 16rpx;
|
|
50
|
+
background: #f6f8fa;
|
|
51
|
+
border-radius: 8rpx;
|
|
52
|
+
overflow-x: auto;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.md-code {
|
|
56
|
+
display: block;
|
|
57
|
+
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
|
58
|
+
font-size: 26rpx;
|
|
59
|
+
white-space: pre;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.md-inline-code {
|
|
63
|
+
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
|
64
|
+
font-size: 26rpx;
|
|
65
|
+
background: #f3f3f3;
|
|
66
|
+
padding: 0 6rpx;
|
|
67
|
+
border-radius: 4rpx;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.md-strong { font-weight: 600; }
|
|
71
|
+
.md-em { font-style: italic; }
|
|
72
|
+
|
|
73
|
+
.md-link {
|
|
74
|
+
color: #1677ff;
|
|
75
|
+
text-decoration: underline;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.md-img {
|
|
79
|
+
display: block;
|
|
80
|
+
max-width: 100%;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.md-hr {
|
|
84
|
+
display: block;
|
|
85
|
+
height: 2rpx;
|
|
86
|
+
background: #e5e5e5;
|
|
87
|
+
margin: 16rpx 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.md-table {
|
|
91
|
+
display: block;
|
|
92
|
+
width: 100%;
|
|
93
|
+
margin: 12rpx 0;
|
|
94
|
+
border-collapse: collapse;
|
|
95
|
+
}
|
|
96
|
+
.md-th, .md-td {
|
|
97
|
+
display: table-cell;
|
|
98
|
+
padding: 8rpx 12rpx;
|
|
99
|
+
border: 1rpx solid #e5e5e5;
|
|
100
|
+
}
|
|
101
|
+
.md-th { background: #fafafa; font-weight: 600; }
|
|
102
|
+
|
|
103
|
+
.md-html { display: block; }
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/components/wechat/MiniNodeRenderer/index.ts
|
|
17
|
+
var MiniNodeRenderer_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(MiniNodeRenderer_exports);
|
|
19
|
+
Component({
|
|
20
|
+
options: {
|
|
21
|
+
multipleSlots: true,
|
|
22
|
+
styleIsolation: "shared"
|
|
23
|
+
},
|
|
24
|
+
properties: {
|
|
25
|
+
nodes: { type: Array, value: [] },
|
|
26
|
+
selectable: { type: Boolean, value: true },
|
|
27
|
+
animation: { type: Boolean, value: false },
|
|
28
|
+
// 自定义组件标签白名单:命中的节点交给抽象节点 <custom-slot>(由宿主提供)渲染。
|
|
29
|
+
slotComponents: { type: Array, value: [] }
|
|
30
|
+
},
|
|
31
|
+
methods: {
|
|
32
|
+
_tap(e) {
|
|
33
|
+
this.triggerEvent("tap", e, { bubbles: true, composed: true });
|
|
34
|
+
},
|
|
35
|
+
_appear(e) {
|
|
36
|
+
this.triggerEvent("appear", e, { bubbles: true, composed: true });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<wxs src="./index.wxs" module="u" />
|
|
2
|
+
|
|
3
|
+
<block wx:for="{{nodes}}" wx:for-item="node" wx:for-index="i" wx:key="i">
|
|
4
|
+
<!-- text leaf -->
|
|
5
|
+
<text
|
|
6
|
+
wx:if="{{u.isText(node.name)}}"
|
|
7
|
+
class="{{u.classOf(node)}}"
|
|
8
|
+
selectable="{{selectable}}"
|
|
9
|
+
>{{u.valueOf(node)}}</text>
|
|
10
|
+
|
|
11
|
+
<!-- br -->
|
|
12
|
+
<text wx:elif="{{u.isBr(node.name)}}">{{'\n'}}</text>
|
|
13
|
+
|
|
14
|
+
<!-- hr -->
|
|
15
|
+
<view wx:elif="{{u.isHr(node.name)}}" class="{{u.classOf(node)}}" />
|
|
16
|
+
|
|
17
|
+
<!-- img -->
|
|
18
|
+
<image
|
|
19
|
+
wx:elif="{{u.isImg(node.name)}}"
|
|
20
|
+
class="{{u.classOf(node)}}"
|
|
21
|
+
style="{{u.styleOf(node)}}"
|
|
22
|
+
src="{{u.srcOf(node)}}"
|
|
23
|
+
mode="widthFix"
|
|
24
|
+
data-data="{{node}}"
|
|
25
|
+
catch:tap="_tap"
|
|
26
|
+
/>
|
|
27
|
+
|
|
28
|
+
<!-- pre: scrollable code container -->
|
|
29
|
+
<scroll-view
|
|
30
|
+
wx:elif="{{u.isPre(node.name)}}"
|
|
31
|
+
scroll-x
|
|
32
|
+
class="{{u.classOf(node)}}"
|
|
33
|
+
style="{{u.styleOf(node)}}"
|
|
34
|
+
data-data="{{node}}"
|
|
35
|
+
catch:tap="_tap"
|
|
36
|
+
>
|
|
37
|
+
<mini-node-renderer
|
|
38
|
+
wx:if="{{node.children}}"
|
|
39
|
+
generic:custom-slot="custom-slot"
|
|
40
|
+
nodes="{{node.children}}"
|
|
41
|
+
selectable="{{selectable}}"
|
|
42
|
+
animation="{{false}}"
|
|
43
|
+
slotComponents="{{slotComponents}}"
|
|
44
|
+
bind:tap="_tap"
|
|
45
|
+
bind:appear="_appear"
|
|
46
|
+
/>
|
|
47
|
+
</scroll-view>
|
|
48
|
+
|
|
49
|
+
<!-- anchor: kept interactive, children are already flattened text runs -->
|
|
50
|
+
<text
|
|
51
|
+
wx:elif="{{node.name === 'a'}}"
|
|
52
|
+
class="{{u.classOf(node)}}"
|
|
53
|
+
style="{{u.styleOf(node)}}"
|
|
54
|
+
selectable="{{selectable}}"
|
|
55
|
+
data-data="{{node}}"
|
|
56
|
+
catch:tap="_tap"
|
|
57
|
+
>
|
|
58
|
+
<text
|
|
59
|
+
wx:for="{{node.children}}"
|
|
60
|
+
wx:for-item="c"
|
|
61
|
+
wx:for-index="ci"
|
|
62
|
+
wx:key="ci"
|
|
63
|
+
class="{{u.classOf(c)}}"
|
|
64
|
+
>{{u.valueOf(c)}}</text>
|
|
65
|
+
</text>
|
|
66
|
+
|
|
67
|
+
<!-- inline tag rendered as <text>: children are flat text runs -->
|
|
68
|
+
<text
|
|
69
|
+
wx:elif="{{u.isInline(node.name)}}"
|
|
70
|
+
class="{{u.classOf(node)}}"
|
|
71
|
+
style="{{u.styleOf(node)}}"
|
|
72
|
+
selectable="{{selectable}}"
|
|
73
|
+
data-data="{{node}}"
|
|
74
|
+
catch:tap="_tap"
|
|
75
|
+
>
|
|
76
|
+
<text
|
|
77
|
+
wx:for="{{node.children}}"
|
|
78
|
+
wx:for-item="c"
|
|
79
|
+
wx:for-index="ci"
|
|
80
|
+
wx:key="ci"
|
|
81
|
+
class="{{u.classOf(c)}}"
|
|
82
|
+
>{{u.valueOf(c)}}</text>
|
|
83
|
+
</text>
|
|
84
|
+
|
|
85
|
+
<!-- custom component: hand off to host-provided abstract node, keyed by node.tag -->
|
|
86
|
+
<custom-slot
|
|
87
|
+
wx:elif="{{u.isSlot(node.name, slotComponents)}}"
|
|
88
|
+
node="{{node}}"
|
|
89
|
+
data-data="{{node}}"
|
|
90
|
+
catch:tap="_tap"
|
|
91
|
+
/>
|
|
92
|
+
|
|
93
|
+
<!-- block tag rendered as <view> -->
|
|
94
|
+
<view
|
|
95
|
+
wx:else
|
|
96
|
+
class="{{u.classOf(node)}}"
|
|
97
|
+
style="{{u.styleOf(node)}}"
|
|
98
|
+
data-data="{{node}}"
|
|
99
|
+
catch:tap="_tap"
|
|
100
|
+
>
|
|
101
|
+
<mini-node-renderer
|
|
102
|
+
wx:if="{{node.children}}"
|
|
103
|
+
generic:custom-slot="custom-slot"
|
|
104
|
+
nodes="{{node.children}}"
|
|
105
|
+
selectable="{{selectable}}"
|
|
106
|
+
animation="{{animation}}"
|
|
107
|
+
slotComponents="{{slotComponents}}"
|
|
108
|
+
bind:tap="_tap"
|
|
109
|
+
bind:appear="_appear"
|
|
110
|
+
/>
|
|
111
|
+
</view>
|
|
112
|
+
</block>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
var INLINE = { strong: 1, em: 1, del: 1, code: 1, a: 1, span: 1 };
|
|
2
|
+
|
|
3
|
+
function isInline(name) { return INLINE[name] === 1; }
|
|
4
|
+
function isText(name) { return name === 'text'; }
|
|
5
|
+
function isBr(name) { return name === 'br'; }
|
|
6
|
+
function isImg(name) { return name === 'img'; }
|
|
7
|
+
function isHr(name) { return name === 'hr'; }
|
|
8
|
+
function isPre(name) { return name === 'pre'; }
|
|
9
|
+
function isSlot(name, slotComponents) {
|
|
10
|
+
return !!slotComponents && slotComponents.indexOf(name) > -1;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function classOf(node) {
|
|
14
|
+
var attrs = node.attrs || {};
|
|
15
|
+
var cls = attrs['class'] || '';
|
|
16
|
+
if (node.animate) {
|
|
17
|
+
cls = cls ? cls + ' md-animate-block' : 'md-animate-block';
|
|
18
|
+
}
|
|
19
|
+
return cls;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function styleOf(node) { return (node.attrs || {}).style || ''; }
|
|
23
|
+
function srcOf(node) { return (node.attrs || {}).src || ''; }
|
|
24
|
+
function altOf(node) { return (node.attrs || {}).alt || ''; }
|
|
25
|
+
function valueOf(node) { return (node.attrs || {}).value || ''; }
|
|
26
|
+
|
|
27
|
+
module.exports = {
|
|
28
|
+
isInline: isInline,
|
|
29
|
+
isText: isText,
|
|
30
|
+
isBr: isBr,
|
|
31
|
+
isImg: isImg,
|
|
32
|
+
isHr: isHr,
|
|
33
|
+
isPre: isPre,
|
|
34
|
+
isSlot: isSlot,
|
|
35
|
+
classOf: classOf,
|
|
36
|
+
styleOf: styleOf,
|
|
37
|
+
srcOf: srcOf,
|
|
38
|
+
altOf: altOf,
|
|
39
|
+
valueOf: valueOf,
|
|
40
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
.md-animate-block {
|
|
2
|
+
animation-fill-mode: forwards;
|
|
3
|
+
animation-name: md-block-appear;
|
|
4
|
+
animation-timing-function: var(--md-animation-timing, ease-in);
|
|
5
|
+
animation-duration: var(--md-animation-duration, 300ms);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
@keyframes md-block-appear {
|
|
9
|
+
0% { opacity: 0; transform: translateY(4rpx); }
|
|
10
|
+
100% { opacity: 1; transform: translateY(0); }
|
|
11
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// src/components/wechat/Markdown/index.ts
|
|
4
|
+
var import__ = require("../../index.js");
|
|
5
|
+
var import_flattenInline = require("../../shared/flattenInline.js");
|
|
6
|
+
Component({
|
|
7
|
+
options: {
|
|
8
|
+
multipleSlots: true,
|
|
9
|
+
styleIsolation: "shared"
|
|
10
|
+
},
|
|
11
|
+
properties: {
|
|
12
|
+
content: { type: String, value: "" },
|
|
13
|
+
streaming: { type: null, value: false },
|
|
14
|
+
selectable: { type: Boolean, value: true },
|
|
15
|
+
gfm: { type: null, value: null },
|
|
16
|
+
breaks: { type: null, value: null },
|
|
17
|
+
className: { type: String, value: "" },
|
|
18
|
+
extensions: { type: null, value: null },
|
|
19
|
+
components: { type: null, value: null },
|
|
20
|
+
footnote: { type: Boolean, value: false }
|
|
21
|
+
},
|
|
22
|
+
data: {
|
|
23
|
+
nodes: [],
|
|
24
|
+
slotComponents: []
|
|
25
|
+
},
|
|
26
|
+
md: null,
|
|
27
|
+
lifetimes: {
|
|
28
|
+
attached() {
|
|
29
|
+
this._build();
|
|
30
|
+
this._render();
|
|
31
|
+
},
|
|
32
|
+
detached() {
|
|
33
|
+
var _a;
|
|
34
|
+
(_a = this.md) == null ? void 0 : _a.reset();
|
|
35
|
+
this.md = null;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
observers: {
|
|
39
|
+
// `components` / `footnote` are baked into the marked instance, rebuild on change.
|
|
40
|
+
"components, footnote"() {
|
|
41
|
+
if (this.md) {
|
|
42
|
+
this._build();
|
|
43
|
+
this._render();
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"content, streaming, selectable, extensions, gfm, breaks"() {
|
|
47
|
+
if (this.md) this._render();
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
methods: {
|
|
51
|
+
_build() {
|
|
52
|
+
var _a, _b;
|
|
53
|
+
const components = (_a = this.data.components) != null ? _a : [];
|
|
54
|
+
const footnote = !!this.data.footnote;
|
|
55
|
+
const extensions = footnote ? [(0, import__.Footnote)()] : [];
|
|
56
|
+
(_b = this.md) == null ? void 0 : _b.reset();
|
|
57
|
+
this.md = new import__.XMarkdownMini({ escapeText: false, components, extensions });
|
|
58
|
+
const slotComponents = footnote ? components.concat(["footnote"]) : components;
|
|
59
|
+
this.setData({ slotComponents });
|
|
60
|
+
},
|
|
61
|
+
_render() {
|
|
62
|
+
var _a, _b, _c;
|
|
63
|
+
const data = this.data;
|
|
64
|
+
this.md.renderNodes({
|
|
65
|
+
content: data.content,
|
|
66
|
+
platform: "wechat",
|
|
67
|
+
streaming: data.streaming,
|
|
68
|
+
selectable: data.selectable,
|
|
69
|
+
gfm: (_a = data.gfm) != null ? _a : void 0,
|
|
70
|
+
breaks: (_b = data.breaks) != null ? _b : void 0,
|
|
71
|
+
extensions: (_c = data.extensions) != null ? _c : void 0,
|
|
72
|
+
onRenderStart: () => this.triggerEvent("renderstart"),
|
|
73
|
+
onRenderProgress: (payload) => this.triggerEvent("renderprogress", payload),
|
|
74
|
+
onRenderComplete: () => this.triggerEvent("rendercomplete"),
|
|
75
|
+
onPatch: (nodes) => this.setData({ nodes: (0, import_flattenInline.flattenInlineNodes)(nodes) })
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
_tap(e) {
|
|
79
|
+
this.triggerEvent("tap", e);
|
|
80
|
+
},
|
|
81
|
+
_appear(e) {
|
|
82
|
+
this.triggerEvent("appear", e);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<view class="md-root {{className}}">
|
|
2
|
+
<mini-node-renderer
|
|
3
|
+
generic:custom-slot="custom-slot"
|
|
4
|
+
nodes="{{nodes}}"
|
|
5
|
+
selectable="{{selectable}}"
|
|
6
|
+
animation="{{animation}}"
|
|
7
|
+
slotComponents="{{slotComponents}}"
|
|
8
|
+
bind:tap="_tap"
|
|
9
|
+
bind:appear="_appear"
|
|
10
|
+
/>
|
|
11
|
+
</view>
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
.md-root {
|
|
2
|
+
display: block;
|
|
3
|
+
font-size: 28rpx;
|
|
4
|
+
line-height: 1.65;
|
|
5
|
+
color: #1f1f1f;
|
|
6
|
+
word-break: break-word;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.md-paragraph {
|
|
10
|
+
display: block;
|
|
11
|
+
margin: 0 0 16rpx;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.md-heading {
|
|
15
|
+
display: block;
|
|
16
|
+
font-weight: 600;
|
|
17
|
+
margin: 24rpx 0 12rpx;
|
|
18
|
+
line-height: 1.3;
|
|
19
|
+
}
|
|
20
|
+
.md-h1 { font-size: 44rpx; }
|
|
21
|
+
.md-h2 { font-size: 38rpx; }
|
|
22
|
+
.md-h3 { font-size: 34rpx; }
|
|
23
|
+
.md-h4 { font-size: 30rpx; }
|
|
24
|
+
.md-h5 { font-size: 28rpx; }
|
|
25
|
+
.md-h6 { font-size: 26rpx; color: #666; }
|
|
26
|
+
|
|
27
|
+
.md-list {
|
|
28
|
+
display: block;
|
|
29
|
+
margin: 8rpx 0 16rpx;
|
|
30
|
+
padding-left: 32rpx;
|
|
31
|
+
}
|
|
32
|
+
.md-list-item {
|
|
33
|
+
display: list-item;
|
|
34
|
+
margin: 4rpx 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.md-blockquote {
|
|
38
|
+
display: block;
|
|
39
|
+
margin: 12rpx 0;
|
|
40
|
+
padding: 8rpx 16rpx;
|
|
41
|
+
border-left: 6rpx solid #d9d9d9;
|
|
42
|
+
color: #555;
|
|
43
|
+
background: #fafafa;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.md-code-block {
|
|
47
|
+
display: block;
|
|
48
|
+
margin: 12rpx 0;
|
|
49
|
+
padding: 16rpx;
|
|
50
|
+
background: #f6f8fa;
|
|
51
|
+
border-radius: 8rpx;
|
|
52
|
+
overflow-x: auto;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.md-code {
|
|
56
|
+
display: block;
|
|
57
|
+
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
|
58
|
+
font-size: 26rpx;
|
|
59
|
+
white-space: pre;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.md-inline-code {
|
|
63
|
+
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
|
64
|
+
font-size: 26rpx;
|
|
65
|
+
background: #f3f3f3;
|
|
66
|
+
padding: 0 6rpx;
|
|
67
|
+
border-radius: 4rpx;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.md-strong { font-weight: 600; }
|
|
71
|
+
.md-em { font-style: italic; }
|
|
72
|
+
|
|
73
|
+
.md-link {
|
|
74
|
+
color: #1677ff;
|
|
75
|
+
text-decoration: underline;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.md-img {
|
|
79
|
+
display: block;
|
|
80
|
+
max-width: 100%;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.md-hr {
|
|
84
|
+
display: block;
|
|
85
|
+
height: 2rpx;
|
|
86
|
+
background: #e5e5e5;
|
|
87
|
+
margin: 16rpx 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.md-table {
|
|
91
|
+
display: block;
|
|
92
|
+
width: 100%;
|
|
93
|
+
margin: 12rpx 0;
|
|
94
|
+
border-collapse: collapse;
|
|
95
|
+
}
|
|
96
|
+
.md-th, .md-td {
|
|
97
|
+
display: table-cell;
|
|
98
|
+
padding: 8rpx 12rpx;
|
|
99
|
+
border: 1rpx solid #e5e5e5;
|
|
100
|
+
}
|
|
101
|
+
.md-th { background: #fafafa; font-weight: 600; }
|
|
102
|
+
|
|
103
|
+
.md-html { display: block; }
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/components/wechat/MiniNodeRenderer/index.ts
|
|
17
|
+
var MiniNodeRenderer_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(MiniNodeRenderer_exports);
|
|
19
|
+
Component({
|
|
20
|
+
options: {
|
|
21
|
+
multipleSlots: true,
|
|
22
|
+
styleIsolation: "shared"
|
|
23
|
+
},
|
|
24
|
+
properties: {
|
|
25
|
+
nodes: { type: Array, value: [] },
|
|
26
|
+
selectable: { type: Boolean, value: true },
|
|
27
|
+
animation: { type: Boolean, value: false },
|
|
28
|
+
// 自定义组件标签白名单:命中的节点交给抽象节点 <custom-slot>(由宿主提供)渲染。
|
|
29
|
+
slotComponents: { type: Array, value: [] }
|
|
30
|
+
},
|
|
31
|
+
methods: {
|
|
32
|
+
_tap(e) {
|
|
33
|
+
this.triggerEvent("tap", e, { bubbles: true, composed: true });
|
|
34
|
+
},
|
|
35
|
+
_appear(e) {
|
|
36
|
+
this.triggerEvent("appear", e, { bubbles: true, composed: true });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|