@skitter/assistant_md 1.0.0-alpha.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/.parcel-cache/20b6e48fcf1b612f +0 -0
- package/.parcel-cache/b6694c1eefd2b32c +0 -0
- package/.parcel-cache/c0e87891cd14f32b.txt +4512 -0
- package/.parcel-cache/cbf39635cd1b2434 +0 -0
- package/.parcel-cache/data.mdb +0 -0
- package/.parcel-cache/ffdc629ccf572e1f +0 -0
- package/.parcel-cache/lock.mdb +0 -0
- package/dist/assistant_md.d.ts +60 -0
- package/dist/assistant_md.d.ts.map +1 -0
- package/dist/assistant_md.js +181 -0
- package/dist/assistant_md.js.map +1 -0
- package/package.json +28 -0
- package/src/assistant_md.tsx +289 -0
- package/src/backup.tsx +278 -0
- package/src/sol-1.tsx +363 -0
- package/tsconfig.json +104 -0
package/src/backup.tsx
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
const URL_REGEX =
|
|
4
|
+
/[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:%._\+~#=-]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/;
|
|
5
|
+
|
|
6
|
+
const normalStr = (str: string) => ({
|
|
7
|
+
type: "normal_str",
|
|
8
|
+
value: str,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const urlStr = (str: string) => ({
|
|
12
|
+
type: "url",
|
|
13
|
+
value: str,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export function parseUrlAndString(str: string) {
|
|
17
|
+
const results = [];
|
|
18
|
+
let remaining = str;
|
|
19
|
+
while (remaining) {
|
|
20
|
+
let match = remaining.match(URL_REGEX);
|
|
21
|
+
if (!match) {
|
|
22
|
+
results.push(normalStr(remaining));
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (match.index !== 0) {
|
|
27
|
+
results.push(normalStr(remaining.slice(0, match.index)));
|
|
28
|
+
results.push(
|
|
29
|
+
urlStr(
|
|
30
|
+
remaining.slice(
|
|
31
|
+
match.index,
|
|
32
|
+
match.index && match.index + match[0].length
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
);
|
|
36
|
+
remaining = remaining.slice(match.index && match.index + match[0].length);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
results.push(urlStr(remaining.slice(0, match[0].length)));
|
|
40
|
+
remaining = remaining.slice(match[0].length);
|
|
41
|
+
}
|
|
42
|
+
return results;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const DisplayLineBreaks = ({ text }: { text: string }) => {
|
|
46
|
+
let texts = text.split("\n");
|
|
47
|
+
let lastOne = texts[texts.length - 1];
|
|
48
|
+
let exceptLastOne = texts.slice(0, texts.length - 1);
|
|
49
|
+
return (
|
|
50
|
+
<>
|
|
51
|
+
{exceptLastOne.reduce(
|
|
52
|
+
(arr: (string | JSX.Element)[], text) => [
|
|
53
|
+
...arr,
|
|
54
|
+
text,
|
|
55
|
+
<br key={arr.length} />,
|
|
56
|
+
],
|
|
57
|
+
[]
|
|
58
|
+
)}
|
|
59
|
+
{lastOne}
|
|
60
|
+
</>
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const DisplayURL = ({ text }: { text: string }) => {
|
|
65
|
+
const parsed = parseUrlAndString(text);
|
|
66
|
+
return (
|
|
67
|
+
<>
|
|
68
|
+
{parsed.map(({ type, value }, i) =>
|
|
69
|
+
type === "url" ? (
|
|
70
|
+
<a href={value} target="_blank" key={i} rel="noreferrer">
|
|
71
|
+
{value}
|
|
72
|
+
</a>
|
|
73
|
+
) : (
|
|
74
|
+
<DisplayLineBreaks text={value} key={i}></DisplayLineBreaks>
|
|
75
|
+
)
|
|
76
|
+
)}
|
|
77
|
+
</>
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
type MdTypes =
|
|
82
|
+
| "normal_text"
|
|
83
|
+
| "bold"
|
|
84
|
+
| "italic"
|
|
85
|
+
| "underline"
|
|
86
|
+
| "hyperlink"
|
|
87
|
+
| "ordered_list"
|
|
88
|
+
| "unordered_list"
|
|
89
|
+
| "newline"
|
|
90
|
+
| "join";
|
|
91
|
+
|
|
92
|
+
type NormalText = {
|
|
93
|
+
normal_text: string;
|
|
94
|
+
markdown_text: "normal_text";
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
type MdValueContainer = { value: MdText };
|
|
98
|
+
|
|
99
|
+
type BoldText = {
|
|
100
|
+
bold: MdValueContainer;
|
|
101
|
+
markdown_text: "bold";
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
type ItalicText = {
|
|
105
|
+
italic: MdValueContainer;
|
|
106
|
+
markdown_text: "italic";
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
type UnderlineText = {
|
|
110
|
+
underline: MdValueContainer;
|
|
111
|
+
markdown_text: "underline";
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
type HyperLinkContainer = {
|
|
115
|
+
link: string;
|
|
116
|
+
value: MdText;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
type HyperLinkText = {
|
|
120
|
+
hyperlink: HyperLinkContainer;
|
|
121
|
+
markdown_text: "hyperlink";
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
type MdList = {
|
|
125
|
+
list: MdText[];
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
type OrdredListText = {
|
|
129
|
+
ordered_list: MdList;
|
|
130
|
+
markdown_text: "ordered_list";
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
type UnOrdredListText = {
|
|
134
|
+
unordered_list: MdList;
|
|
135
|
+
markdown_text: "unordered_list";
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
type NewlineText = {
|
|
139
|
+
markdown_text: "newline";
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
type JoinMdContainer = {
|
|
143
|
+
lhs: MdText;
|
|
144
|
+
rhs: MdText;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
type JoinMdText = {
|
|
148
|
+
join: JoinMdContainer;
|
|
149
|
+
markdown_text: "join";
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
type MdText =
|
|
153
|
+
| NormalText
|
|
154
|
+
| BoldText
|
|
155
|
+
| ItalicText
|
|
156
|
+
| UnderlineText
|
|
157
|
+
| HyperLinkText
|
|
158
|
+
| OrdredListText
|
|
159
|
+
| UnOrdredListText
|
|
160
|
+
| JoinMdText
|
|
161
|
+
| NewlineText;
|
|
162
|
+
|
|
163
|
+
type MdTextProp = { mdText: MdText };
|
|
164
|
+
|
|
165
|
+
type NormalRenderes = React.FunctionComponent<{ mdText: MdValueContainer }>;
|
|
166
|
+
|
|
167
|
+
type ListRenderers = React.FunctionComponent<{ mdText: MdList }>;
|
|
168
|
+
|
|
169
|
+
type TextRenderer = React.FunctionComponent<{ mdText: string }>;
|
|
170
|
+
|
|
171
|
+
type JoinMdRenderer = React.FunctionComponent<{ mdText: JoinMdContainer }>;
|
|
172
|
+
|
|
173
|
+
type HyperLinkRenderer = React.FunctionComponent<{
|
|
174
|
+
mdText: HyperLinkContainer;
|
|
175
|
+
}>;
|
|
176
|
+
|
|
177
|
+
const normalWrapper: (TagName: React.ElementType) => NormalRenderes =
|
|
178
|
+
(TagName: React.ElementType) =>
|
|
179
|
+
({ mdText }) =>
|
|
180
|
+
(
|
|
181
|
+
<TagName>
|
|
182
|
+
<AssistantMd mdText={mdText.value} />
|
|
183
|
+
</TagName>
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
const listWrapper: (TagName: React.ElementType) => ListRenderers =
|
|
187
|
+
(TagName) =>
|
|
188
|
+
({ mdText: { list } }) =>
|
|
189
|
+
(
|
|
190
|
+
<TagName>
|
|
191
|
+
{list.map((mdText) => (
|
|
192
|
+
<li>
|
|
193
|
+
<AssistantMd mdText={mdText} />
|
|
194
|
+
</li>
|
|
195
|
+
))}
|
|
196
|
+
</TagName>
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
type RenderTypes = MdTypes;
|
|
200
|
+
|
|
201
|
+
type MdRenderers =
|
|
202
|
+
| NormalRenderes
|
|
203
|
+
| ListRenderers
|
|
204
|
+
| TextRenderer
|
|
205
|
+
| HyperLinkRenderer
|
|
206
|
+
| JoinMdRenderer;
|
|
207
|
+
|
|
208
|
+
type RenderMap = Record<RenderTypes, MdRenderers>;
|
|
209
|
+
|
|
210
|
+
const NormalTextMd: TextRenderer = ({ mdText }) => {
|
|
211
|
+
return <DisplayURL text={mdText} />;
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const HyperLinkMd: HyperLinkRenderer = ({ mdText }) => (
|
|
215
|
+
<a href={mdText.link}>
|
|
216
|
+
<AssistantMd mdText={mdText.value} />
|
|
217
|
+
</a>
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
const JoinMd: JoinMdRenderer = ({ mdText: { lhs, rhs } }) => (
|
|
221
|
+
<>
|
|
222
|
+
<AssistantMd mdText={lhs} />
|
|
223
|
+
<AssistantMd mdText={rhs} />
|
|
224
|
+
</>
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
const mdTypeRenderers = {
|
|
230
|
+
normal_text: NormalTextMd,
|
|
231
|
+
bold: normalWrapper("strong"),
|
|
232
|
+
italic: normalWrapper("em"),
|
|
233
|
+
underline: normalWrapper("u"),
|
|
234
|
+
hyperlink: HyperLinkMd,
|
|
235
|
+
ordered_list: listWrapper("ol"),
|
|
236
|
+
unordered_list: listWrapper("ul"),
|
|
237
|
+
newline: () => <br />,
|
|
238
|
+
join: JoinMd,
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
type RendT<T> = {
|
|
243
|
+
[P in keyof T] : T[P]
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
type Renderers = typeof mdTypeRenderers
|
|
247
|
+
|
|
248
|
+
type MappedRend = RendT<Renderers>
|
|
249
|
+
|
|
250
|
+
type Pick<T,R extends keyof T> = {
|
|
251
|
+
[P in R] : T[P]
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
type boldRenderer<T> = T extends Pick<MappedRend, infer T> ?
|
|
255
|
+
|
|
256
|
+
type MDs<T extends MdTypes, S extends MdText> = S[infer T]
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
function getMdContainerAndRenderer<T>(x : T extends MdTypes) => {
|
|
260
|
+
let RRederMd = mdTypeRenderers[x] as Pick<MappedRend,infer T>
|
|
261
|
+
let container = x[x.markdown_text]
|
|
262
|
+
|
|
263
|
+
return <RRederMd mdText={container} />;
|
|
264
|
+
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export default function AssistantMd({ mdText }: MdTextProp) {
|
|
268
|
+
let RenderMd = mdTypeRenderers[mdText.markdown_text];
|
|
269
|
+
// let container: any = mdText[mdText.markdown_text];
|
|
270
|
+
if(mdText.markdown_text === "bold") {
|
|
271
|
+
let RRederMd = mdTypeRenderers[mdText.markdown_text]
|
|
272
|
+
let container = mdText[mdText.markdown_text]
|
|
273
|
+
return <RRederMd mdText={container} />;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
return null
|
|
278
|
+
}
|
package/src/sol-1.tsx
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
const URL_REGEX =
|
|
4
|
+
/[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:%._\+~#=-]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/;
|
|
5
|
+
|
|
6
|
+
const normalStr = (str: string) => ({
|
|
7
|
+
type: "normal_str",
|
|
8
|
+
value: str,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const urlStr = (str: string) => ({
|
|
12
|
+
type: "url",
|
|
13
|
+
value: str,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export function parseUrlAndString(str: string) {
|
|
17
|
+
const results = [];
|
|
18
|
+
let remaining = str;
|
|
19
|
+
while (remaining) {
|
|
20
|
+
let match = remaining.match(URL_REGEX);
|
|
21
|
+
if (!match) {
|
|
22
|
+
results.push(normalStr(remaining));
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (match.index !== 0) {
|
|
27
|
+
results.push(normalStr(remaining.slice(0, match.index)));
|
|
28
|
+
results.push(
|
|
29
|
+
urlStr(
|
|
30
|
+
remaining.slice(
|
|
31
|
+
match.index,
|
|
32
|
+
match.index && match.index + match[0].length
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
);
|
|
36
|
+
remaining = remaining.slice(match.index && match.index + match[0].length);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
results.push(urlStr(remaining.slice(0, match[0].length)));
|
|
40
|
+
remaining = remaining.slice(match[0].length);
|
|
41
|
+
}
|
|
42
|
+
return results;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const DisplayLineBreaks = ({ text }: { text: string }) => {
|
|
46
|
+
let texts = text.split("\n");
|
|
47
|
+
let lastOne = texts[texts.length - 1];
|
|
48
|
+
let exceptLastOne = texts.slice(0, texts.length - 1);
|
|
49
|
+
return (
|
|
50
|
+
<>
|
|
51
|
+
{exceptLastOne.reduce(
|
|
52
|
+
(arr: (string | JSX.Element)[], text) => [
|
|
53
|
+
...arr,
|
|
54
|
+
text,
|
|
55
|
+
<br key={arr.length} />,
|
|
56
|
+
],
|
|
57
|
+
[]
|
|
58
|
+
)}
|
|
59
|
+
{lastOne}
|
|
60
|
+
</>
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const DisplayURL = ({ text }: { text: string }) => {
|
|
65
|
+
const parsed = parseUrlAndString(text);
|
|
66
|
+
return (
|
|
67
|
+
<>
|
|
68
|
+
{parsed.map(({ type, value }, i) =>
|
|
69
|
+
type === "url" ? (
|
|
70
|
+
<a href={value} target="_blank" key={i} rel="noreferrer">
|
|
71
|
+
{value}
|
|
72
|
+
</a>
|
|
73
|
+
) : (
|
|
74
|
+
<DisplayLineBreaks text={value} key={i}></DisplayLineBreaks>
|
|
75
|
+
)
|
|
76
|
+
)}
|
|
77
|
+
</>
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
type MdTypes =
|
|
82
|
+
| "normal_text"
|
|
83
|
+
| "bold"
|
|
84
|
+
| "italic"
|
|
85
|
+
| "underline"
|
|
86
|
+
| "hyperlink"
|
|
87
|
+
| "ordered_list"
|
|
88
|
+
| "unordered_list"
|
|
89
|
+
| "newline"
|
|
90
|
+
| "join";
|
|
91
|
+
|
|
92
|
+
type NormalText = {
|
|
93
|
+
normal_text: string;
|
|
94
|
+
markdown_text: "normal_text";
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
type MdValueContainer = { value: MdText };
|
|
98
|
+
|
|
99
|
+
type BoldText = {
|
|
100
|
+
bold: MdValueContainer;
|
|
101
|
+
markdown_text: "bold";
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
type ItalicText = {
|
|
105
|
+
italic: MdValueContainer;
|
|
106
|
+
markdown_text: "italic";
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
type UnderlineText = {
|
|
110
|
+
underline: MdValueContainer;
|
|
111
|
+
markdown_text: "underline";
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
type HyperLinkContainer = {
|
|
115
|
+
link: string;
|
|
116
|
+
value: MdText;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
type HyperLinkText = {
|
|
120
|
+
hyperlink: HyperLinkContainer;
|
|
121
|
+
markdown_text: "hyperlink";
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
type MdList = {
|
|
125
|
+
list: MdText[];
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
type OrdredListText = {
|
|
129
|
+
ordered_list: MdList;
|
|
130
|
+
markdown_text: "ordered_list";
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
type UnOrdredListText = {
|
|
134
|
+
unordered_list: MdList;
|
|
135
|
+
markdown_text: "unordered_list";
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
type NewlineText = {
|
|
139
|
+
markdown_text: "newline";
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
type JoinMdContainer = {
|
|
143
|
+
lhs: MdText;
|
|
144
|
+
rhs: MdText;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
type JoinMdText = {
|
|
148
|
+
join: JoinMdContainer;
|
|
149
|
+
markdown_text: "join";
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
type MdText =
|
|
153
|
+
| NormalText
|
|
154
|
+
| BoldText
|
|
155
|
+
| ItalicText
|
|
156
|
+
| UnderlineText
|
|
157
|
+
| HyperLinkText
|
|
158
|
+
| OrdredListText
|
|
159
|
+
| UnOrdredListText
|
|
160
|
+
| JoinMdText
|
|
161
|
+
| NewlineText;
|
|
162
|
+
|
|
163
|
+
type MdTextProp = { mdText: MdText };
|
|
164
|
+
|
|
165
|
+
type NormalRenderes = React.FunctionComponent<{ mdText: MdValueContainer }>;
|
|
166
|
+
|
|
167
|
+
type ListRenderers = React.FunctionComponent<{ mdText: MdList }>;
|
|
168
|
+
|
|
169
|
+
type TextRenderer = React.FunctionComponent<{ mdText: string }>;
|
|
170
|
+
|
|
171
|
+
type JoinMdRenderer = React.FunctionComponent<{ mdText: JoinMdContainer }>;
|
|
172
|
+
|
|
173
|
+
type HyperLinkRenderer = React.FunctionComponent<{
|
|
174
|
+
mdText: HyperLinkContainer;
|
|
175
|
+
}>;
|
|
176
|
+
|
|
177
|
+
const normalWrapper: (TagName: React.ElementType) => NormalRenderes =
|
|
178
|
+
(TagName: React.ElementType) =>
|
|
179
|
+
({ mdText }) =>
|
|
180
|
+
(
|
|
181
|
+
<TagName>
|
|
182
|
+
<AssistantMd mdText={mdText.value} />
|
|
183
|
+
</TagName>
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
const listWrapper: (TagName: React.ElementType) => ListRenderers =
|
|
187
|
+
(TagName) =>
|
|
188
|
+
({ mdText: { list } }) =>
|
|
189
|
+
(
|
|
190
|
+
<TagName>
|
|
191
|
+
{list.map((mdText) => (
|
|
192
|
+
<li>
|
|
193
|
+
<AssistantMd mdText={mdText} />
|
|
194
|
+
</li>
|
|
195
|
+
))}
|
|
196
|
+
</TagName>
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
type RenderTypes = MdTypes;
|
|
200
|
+
|
|
201
|
+
type MdRenderers =
|
|
202
|
+
| NormalRenderes
|
|
203
|
+
| ListRenderers
|
|
204
|
+
| TextRenderer
|
|
205
|
+
| HyperLinkRenderer
|
|
206
|
+
| JoinMdRenderer;
|
|
207
|
+
|
|
208
|
+
// type RenderMap = Record<RenderTypes, MdRenderers>;
|
|
209
|
+
|
|
210
|
+
const NormalTextMd: TextRenderer = ({ mdText }) => {
|
|
211
|
+
return <DisplayURL text={mdText} />;
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const HyperLinkMd: HyperLinkRenderer = ({ mdText }) => (
|
|
215
|
+
<a href={mdText.link}>
|
|
216
|
+
<AssistantMd mdText={mdText.value} />
|
|
217
|
+
</a>
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
const JoinMd: JoinMdRenderer = ({ mdText: { lhs, rhs } }) => (
|
|
221
|
+
<>
|
|
222
|
+
<AssistantMd mdText={lhs} />
|
|
223
|
+
<AssistantMd mdText={rhs} />
|
|
224
|
+
</>
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
// const mdTypeRenderers = {
|
|
228
|
+
// normal_text: NormalTextMd,
|
|
229
|
+
// bold: normalWrapper("strong"),
|
|
230
|
+
// italic: normalWrapper("em"),
|
|
231
|
+
// underline: normalWrapper("u"),
|
|
232
|
+
// hyperlink: HyperLinkMd,
|
|
233
|
+
// ordered_list: listWrapper("ol"),
|
|
234
|
+
// unordered_list: listWrapper("ul"),
|
|
235
|
+
// newline: () => <br />,
|
|
236
|
+
// join: JoinMd,
|
|
237
|
+
// };
|
|
238
|
+
|
|
239
|
+
// type S<T extends MdTypes> = T extends MdTypes? Record<T,_mcR[T]> : never
|
|
240
|
+
|
|
241
|
+
// type _Rss<T extends _mcR, K extends MdTypes> = K extends infer L
|
|
242
|
+
// ? {
|
|
243
|
+
// [P in K]: _R<K>;
|
|
244
|
+
// }
|
|
245
|
+
// : never;
|
|
246
|
+
|
|
247
|
+
// type _Rss1<T> = T extends MdTypes ? T extends infer L ? L : never
|
|
248
|
+
|
|
249
|
+
type _R<T extends MdTypes> = T extends "bold" | "italic" | "underline"
|
|
250
|
+
? NormalRenderes
|
|
251
|
+
: T extends "hyperlink"
|
|
252
|
+
? HyperLinkRenderer
|
|
253
|
+
: T extends "join"
|
|
254
|
+
? JoinMdRenderer
|
|
255
|
+
: T extends "unordered_list" | "ordered_list"
|
|
256
|
+
? ListRenderers
|
|
257
|
+
: T extends "normal_text"
|
|
258
|
+
? TextRenderer
|
|
259
|
+
: T extends "newline"
|
|
260
|
+
? () => JSX.Element
|
|
261
|
+
: never;
|
|
262
|
+
|
|
263
|
+
type _mcR<T> = T extends MdTypes ? Record<T, _R<T>> : never;
|
|
264
|
+
|
|
265
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
|
|
266
|
+
k: infer I
|
|
267
|
+
) => void
|
|
268
|
+
? I
|
|
269
|
+
: never;
|
|
270
|
+
|
|
271
|
+
type Renderers<T extends MdTypes> = UnionToIntersection<_mcR<T>>;
|
|
272
|
+
|
|
273
|
+
const mdTypeRenderers: Renderers<MdTypes> = {
|
|
274
|
+
normal_text: NormalTextMd,
|
|
275
|
+
bold: normalWrapper("strong"),
|
|
276
|
+
italic: normalWrapper("em"),
|
|
277
|
+
underline: normalWrapper("u"),
|
|
278
|
+
hyperlink: HyperLinkMd,
|
|
279
|
+
ordered_list: listWrapper("ol"),
|
|
280
|
+
unordered_list: listWrapper("ul"),
|
|
281
|
+
newline: () => <br />,
|
|
282
|
+
join: JoinMd,
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
type _A = Renderers<MdTypes>["bold"];
|
|
286
|
+
|
|
287
|
+
type ReducerState<
|
|
288
|
+
R extends Renderers<MdTypes>,
|
|
289
|
+
K extends MdTypes
|
|
290
|
+
> = R extends Renderers<infer S> ? (S extends K ? _R<K> : never) : never;
|
|
291
|
+
|
|
292
|
+
type F = ReducerState<Renderers<MdTypes>, "normal_text">;
|
|
293
|
+
|
|
294
|
+
function MDD<K extends MdTypes>(
|
|
295
|
+
type: K,
|
|
296
|
+
renderers: Renderers<MdTypes>
|
|
297
|
+
): Renderers<MdTypes>[K] {
|
|
298
|
+
return renderers[type];
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
function exhaustiveCheck(param: never) {}
|
|
304
|
+
|
|
305
|
+
export default function AssistantMd({ mdText }: MdTextProp) {
|
|
306
|
+
if (mdText.markdown_text == "bold") {
|
|
307
|
+
let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
|
|
308
|
+
let container = mdText[mdText.markdown_text];
|
|
309
|
+
|
|
310
|
+
const x = MDD<"bold">(mdText.markdown_text, mdTypeRenderers);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// let container = mdText[mdText.markdown_text] as Renderers<mdText.markdown_text>
|
|
314
|
+
// return <RendenMDElement mdText={container} />;
|
|
315
|
+
|
|
316
|
+
switch (mdText.markdown_text) {
|
|
317
|
+
case "bold": {
|
|
318
|
+
let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
|
|
319
|
+
let container = mdText[mdText.markdown_text];
|
|
320
|
+
return <RendenMDElement mdText={container} />;
|
|
321
|
+
}
|
|
322
|
+
case "italic": {
|
|
323
|
+
let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
|
|
324
|
+
let container = mdText[mdText.markdown_text];
|
|
325
|
+
return <RendenMDElement mdText={container} />;
|
|
326
|
+
}
|
|
327
|
+
case "normal_text": {
|
|
328
|
+
let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
|
|
329
|
+
let container = mdText[mdText.markdown_text];
|
|
330
|
+
return <RendenMDElement mdText={container} />;
|
|
331
|
+
}
|
|
332
|
+
case "underline": {
|
|
333
|
+
let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
|
|
334
|
+
let container = mdText[mdText.markdown_text];
|
|
335
|
+
return <RendenMDElement mdText={container} />;
|
|
336
|
+
}
|
|
337
|
+
case "hyperlink": {
|
|
338
|
+
let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
|
|
339
|
+
let container = mdText[mdText.markdown_text];
|
|
340
|
+
return <RendenMDElement mdText={container} />;
|
|
341
|
+
}
|
|
342
|
+
case "ordered_list": {
|
|
343
|
+
let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
|
|
344
|
+
let container = mdText[mdText.markdown_text];
|
|
345
|
+
return <RendenMDElement mdText={container} />;
|
|
346
|
+
}
|
|
347
|
+
case "unordered_list": {
|
|
348
|
+
let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
|
|
349
|
+
let container = mdText[mdText.markdown_text];
|
|
350
|
+
return <RendenMDElement mdText={container} />;
|
|
351
|
+
}
|
|
352
|
+
case "join": {
|
|
353
|
+
let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
|
|
354
|
+
let container = mdText[mdText.markdown_text];
|
|
355
|
+
return <RendenMDElement mdText={container} />;
|
|
356
|
+
}
|
|
357
|
+
case "newline": {
|
|
358
|
+
let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
|
|
359
|
+
return <RendenMDElement />;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
exhaustiveCheck(mdText);
|
|
363
|
+
}
|