@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/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
+ }