@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.
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,60 @@
1
+ export function parseUrlAndString(str: string): {
2
+ type: string;
3
+ value: string;
4
+ }[];
5
+ type NormalText = {
6
+ normal_text: string;
7
+ markdown_text: "normal_text";
8
+ };
9
+ type MdValueContainer = {
10
+ value: MdText;
11
+ };
12
+ type BoldText = {
13
+ bold: MdValueContainer;
14
+ markdown_text: "bold";
15
+ };
16
+ type ItalicText = {
17
+ italic: MdValueContainer;
18
+ markdown_text: "italic";
19
+ };
20
+ type UnderlineText = {
21
+ underline: MdValueContainer;
22
+ markdown_text: "underline";
23
+ };
24
+ type HyperLinkContainer = {
25
+ link: string;
26
+ value: MdText;
27
+ };
28
+ type HyperLinkText = {
29
+ hyperlink: HyperLinkContainer;
30
+ markdown_text: "hyperlink";
31
+ };
32
+ type MdList = {
33
+ list: MdText[];
34
+ };
35
+ type OrdredListText = {
36
+ ordered_list: MdList;
37
+ markdown_text: "ordered_list";
38
+ };
39
+ type UnOrdredListText = {
40
+ unordered_list: MdList;
41
+ markdown_text: "unordered_list";
42
+ };
43
+ type NewlineText = {
44
+ markdown_text: "newline";
45
+ };
46
+ type JoinMdContainer = {
47
+ lhs: MdText;
48
+ rhs: MdText;
49
+ };
50
+ type JoinMdText = {
51
+ join: JoinMdContainer;
52
+ markdown_text: "join";
53
+ };
54
+ type MdText = NormalText | BoldText | ItalicText | UnderlineText | HyperLinkText | OrdredListText | UnOrdredListText | JoinMdText | NewlineText;
55
+ type MdTextProp = {
56
+ mdText: MdText;
57
+ };
58
+ export default function AssistantMd({ mdText }: MdTextProp): JSX.Element;
59
+
60
+ //# sourceMappingURL=assistant_md.d.ts.map
@@ -0,0 +1 @@
1
+ {"mappings":"AAeA,kCAAkC,GAAG,EAAE,MAAM;;;IA2B5C;AAiDD,kBAAkB;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,wBAAwB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,gBAAgB;IACd,IAAI,EAAE,gBAAgB,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,kBAAkB;IAChB,MAAM,EAAE,gBAAgB,CAAC;IACzB,aAAa,EAAE,QAAQ,CAAC;CACzB,CAAC;AAEF,qBAAqB;IACnB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,EAAE,WAAW,CAAC;CAC5B,CAAC;AAEF,0BAA0B;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAqB;IACnB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,aAAa,EAAE,WAAW,CAAC;CAC5B,CAAC;AAEF,cAAc;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAEF,sBAAsB;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,cAAc,CAAC;CAC/B,CAAC;AAEF,wBAAwB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAEF,mBAAmB;IACjB,aAAa,EAAE,SAAS,CAAC;CAC1B,CAAC;AAEF,uBAAuB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,kBAAkB;IAChB,IAAI,EAAE,eAAe,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,cACI,UAAU,GACV,QAAQ,GACR,UAAU,GACV,aAAa,GACb,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,UAAU,GACV,WAAW,CAAC;AAEhB,kBAAkB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA8ErC,oCAAoC,EAAE,MAAM,EAAE,EAAE,UAAU,eAgDzD","sources":["src/src/assistant_md.tsx","src/assistant_md.tsx"],"sourcesContent":[null,"import React from \"react\";\n\nconst URL_REGEX =\n /[(http(s)?):\\/\\/(www\\.)?a-zA-Z0-9@:%._\\+~#=-]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/;\n\nconst normalStr = (str: string) => ({\n type: \"normal_str\",\n value: str,\n});\n\nconst urlStr = (str: string) => ({\n type: \"url\",\n value: str,\n});\n\nexport function parseUrlAndString(str: string) {\n const results = [];\n let remaining = str;\n while (remaining) {\n let match = remaining.match(URL_REGEX);\n if (!match) {\n results.push(normalStr(remaining));\n break;\n }\n\n if (match.index !== 0) {\n results.push(normalStr(remaining.slice(0, match.index)));\n results.push(\n urlStr(\n remaining.slice(\n match.index,\n match.index && match.index + match[0].length\n )\n )\n );\n remaining = remaining.slice(match.index && match.index + match[0].length);\n continue;\n }\n results.push(urlStr(remaining.slice(0, match[0].length)));\n remaining = remaining.slice(match[0].length);\n }\n return results;\n}\n\nconst DisplayLineBreaks = ({ text }: { text: string }) => {\n let texts = text.split(\"\\n\");\n let lastOne = texts[texts.length - 1];\n let exceptLastOne = texts.slice(0, texts.length - 1);\n return (\n <>\n {exceptLastOne.reduce(\n (arr: (string | JSX.Element)[], text) => [\n ...arr,\n text,\n <br key={arr.length} />,\n ],\n []\n )}\n {lastOne}\n </>\n );\n};\n\nconst DisplayURL = ({ text }: { text: string }) => {\n const parsed = parseUrlAndString(text);\n return (\n <>\n {parsed.map(({ type, value }, i) =>\n type === \"url\" ? (\n <a href={value} target=\"_blank\" key={i} rel=\"noreferrer\">\n {value}\n </a>\n ) : (\n <DisplayLineBreaks text={value} key={i}></DisplayLineBreaks>\n )\n )}\n </>\n );\n};\n\ntype MdTypes =\n | \"normal_text\"\n | \"bold\"\n | \"italic\"\n | \"underline\"\n | \"hyperlink\"\n | \"ordered_list\"\n | \"unordered_list\"\n | \"newline\"\n | \"join\";\n\ntype NormalText = {\n normal_text: string;\n markdown_text: \"normal_text\";\n};\n\ntype MdValueContainer = { value: MdText };\n\ntype BoldText = {\n bold: MdValueContainer;\n markdown_text: \"bold\";\n};\n\ntype ItalicText = {\n italic: MdValueContainer;\n markdown_text: \"italic\";\n};\n\ntype UnderlineText = {\n underline: MdValueContainer;\n markdown_text: \"underline\";\n};\n\ntype HyperLinkContainer = {\n link: string;\n value: MdText;\n};\n\ntype HyperLinkText = {\n hyperlink: HyperLinkContainer;\n markdown_text: \"hyperlink\";\n};\n\ntype MdList = {\n list: MdText[];\n};\n\ntype OrdredListText = {\n ordered_list: MdList;\n markdown_text: \"ordered_list\";\n};\n\ntype UnOrdredListText = {\n unordered_list: MdList;\n markdown_text: \"unordered_list\";\n};\n\ntype NewlineText = {\n markdown_text: \"newline\";\n};\n\ntype JoinMdContainer = {\n lhs: MdText;\n rhs: MdText;\n};\n\ntype JoinMdText = {\n join: JoinMdContainer;\n markdown_text: \"join\";\n};\n\ntype MdText =\n | NormalText\n | BoldText\n | ItalicText\n | UnderlineText\n | HyperLinkText\n | OrdredListText\n | UnOrdredListText\n | JoinMdText\n | NewlineText;\n\ntype MdTextProp = { mdText: MdText };\n\ntype NormalRenderes = React.FunctionComponent<{ mdText: MdValueContainer }>;\n\ntype ListRenderers = React.FunctionComponent<{ mdText: MdList }>;\n\ntype TextRenderer = React.FunctionComponent<{ mdText: string }>;\n\ntype JoinMdRenderer = React.FunctionComponent<{ mdText: JoinMdContainer }>;\n\ntype HyperLinkRenderer = React.FunctionComponent<{\n mdText: HyperLinkContainer;\n}>;\n\nconst normalWrapper: (TagName: React.ElementType) => NormalRenderes =\n (TagName: React.ElementType) =>\n ({ mdText }) =>\n (\n <TagName>\n <AssistantMd mdText={mdText.value} />\n </TagName>\n );\n\nconst listWrapper: (TagName: React.ElementType) => ListRenderers =\n (TagName) =>\n ({ mdText: { list } }) =>\n (\n <TagName>\n {list.map((mdText) => (\n <li>\n <AssistantMd mdText={mdText} />\n </li>\n ))}\n </TagName>\n );\n\ntype RenderTypes = MdTypes;\n\ntype MdRenderers =\n | NormalRenderes\n | ListRenderers\n | TextRenderer\n | HyperLinkRenderer\n | JoinMdRenderer;\n\n// type RenderMap = Record<RenderTypes, MdRenderers>;\n\nconst NormalTextMd: TextRenderer = ({ mdText }) => {\n return <DisplayURL text={mdText} />;\n};\n\nconst HyperLinkMd: HyperLinkRenderer = ({ mdText }) => (\n <a href={mdText.link}>\n <AssistantMd mdText={mdText.value} />\n </a>\n);\n\nconst JoinMd: JoinMdRenderer = ({ mdText: { lhs, rhs } }) => (\n <>\n <AssistantMd mdText={lhs} />\n <AssistantMd mdText={rhs} />\n </>\n);\n\nconst mdTypeRenderers = {\n normal_text: NormalTextMd,\n bold: normalWrapper(\"strong\"),\n italic: normalWrapper(\"em\"),\n underline: normalWrapper(\"u\"),\n hyperlink: HyperLinkMd,\n ordered_list: listWrapper(\"ol\"),\n unordered_list: listWrapper(\"ul\"),\n newline: () => <br />,\n join: JoinMd,\n};\n\nfunction exhaustiveCheck(param: never) {}\n\nexport default function AssistantMd({ mdText }: MdTextProp) {\n switch (mdText.markdown_text) {\n case \"bold\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"italic\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"normal_text\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"underline\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"hyperlink\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"ordered_list\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"unordered_list\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"join\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"newline\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n return <RendenMDElement />;\n }\n }\n exhaustiveCheck(mdText);\n}\n"],"names":[],"version":3,"file":"assistant_md.d.ts.map"}
@@ -0,0 +1,181 @@
1
+ var $kmRvl$react = require("react");
2
+
3
+ function $parcel$interopDefault(a) {
4
+ return a && a.__esModule ? a.default : a;
5
+ }
6
+ function $parcel$defineInteropFlag(a) {
7
+ Object.defineProperty(a, '__esModule', {value: true, configurable: true});
8
+ }
9
+ function $parcel$export(e, n, v, s) {
10
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
11
+ }
12
+
13
+ $parcel$defineInteropFlag(module.exports);
14
+
15
+ $parcel$export(module.exports, "parseUrlAndString", () => $69304f3cd9aa4f81$export$41849f4004f0a2a6);
16
+ $parcel$export(module.exports, "default", () => $69304f3cd9aa4f81$export$2e2bcd8739ae039);
17
+
18
+ const $69304f3cd9aa4f81$var$URL_REGEX = /[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:%._\+~#=-]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/;
19
+ const $69304f3cd9aa4f81$var$normalStr = (str)=>({
20
+ type: "normal_str",
21
+ value: str
22
+ });
23
+ const $69304f3cd9aa4f81$var$urlStr = (str)=>({
24
+ type: "url",
25
+ value: str
26
+ });
27
+ function $69304f3cd9aa4f81$export$41849f4004f0a2a6(str) {
28
+ const results = [];
29
+ let remaining = str;
30
+ while(remaining){
31
+ let match = remaining.match($69304f3cd9aa4f81$var$URL_REGEX);
32
+ if (!match) {
33
+ results.push($69304f3cd9aa4f81$var$normalStr(remaining));
34
+ break;
35
+ }
36
+ if (match.index !== 0) {
37
+ results.push($69304f3cd9aa4f81$var$normalStr(remaining.slice(0, match.index)));
38
+ results.push($69304f3cd9aa4f81$var$urlStr(remaining.slice(match.index, match.index && match.index + match[0].length)));
39
+ remaining = remaining.slice(match.index && match.index + match[0].length);
40
+ continue;
41
+ }
42
+ results.push($69304f3cd9aa4f81$var$urlStr(remaining.slice(0, match[0].length)));
43
+ remaining = remaining.slice(match[0].length);
44
+ }
45
+ return results;
46
+ }
47
+ const $69304f3cd9aa4f81$var$DisplayLineBreaks = ({ text: text1 })=>{
48
+ let texts = text1.split("\n");
49
+ let lastOne = texts[texts.length - 1];
50
+ let exceptLastOne = texts.slice(0, texts.length - 1);
51
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement((0, ($parcel$interopDefault($kmRvl$react))).Fragment, null, exceptLastOne.reduce((arr, text)=>[
52
+ ...arr,
53
+ text,
54
+ /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement("br", {
55
+ key: arr.length
56
+ }),
57
+ ], []), lastOne);
58
+ };
59
+ const $69304f3cd9aa4f81$var$DisplayURL = ({ text: text })=>{
60
+ const parsed = $69304f3cd9aa4f81$export$41849f4004f0a2a6(text);
61
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement((0, ($parcel$interopDefault($kmRvl$react))).Fragment, null, parsed.map(({ type: type , value: value }, i)=>type === "url" ? /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement("a", {
62
+ href: value,
63
+ target: "_blank",
64
+ key: i,
65
+ rel: "noreferrer"
66
+ }, value) : /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement($69304f3cd9aa4f81$var$DisplayLineBreaks, {
67
+ text: value,
68
+ key: i
69
+ })));
70
+ };
71
+ const $69304f3cd9aa4f81$var$normalWrapper = (TagName)=>({ mdText: mdText })=>/*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(TagName, null, /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement($69304f3cd9aa4f81$export$2e2bcd8739ae039, {
72
+ mdText: mdText.value
73
+ }));
74
+ const $69304f3cd9aa4f81$var$listWrapper = (TagName)=>({ mdText: { list: list } })=>/*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(TagName, null, list.map((mdText)=>/*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement("li", null, /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement($69304f3cd9aa4f81$export$2e2bcd8739ae039, {
75
+ mdText: mdText
76
+ }))));
77
+ // type RenderMap = Record<RenderTypes, MdRenderers>;
78
+ const $69304f3cd9aa4f81$var$NormalTextMd = ({ mdText: mdText })=>{
79
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement($69304f3cd9aa4f81$var$DisplayURL, {
80
+ text: mdText
81
+ });
82
+ };
83
+ const $69304f3cd9aa4f81$var$HyperLinkMd = ({ mdText: mdText })=>/*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement("a", {
84
+ href: mdText.link
85
+ }, /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement($69304f3cd9aa4f81$export$2e2bcd8739ae039, {
86
+ mdText: mdText.value
87
+ }));
88
+ const $69304f3cd9aa4f81$var$JoinMd = ({ mdText: { lhs: lhs , rhs: rhs } })=>/*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement((0, ($parcel$interopDefault($kmRvl$react))).Fragment, null, /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement($69304f3cd9aa4f81$export$2e2bcd8739ae039, {
89
+ mdText: lhs
90
+ }), /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement($69304f3cd9aa4f81$export$2e2bcd8739ae039, {
91
+ mdText: rhs
92
+ }));
93
+ const $69304f3cd9aa4f81$var$mdTypeRenderers = {
94
+ normal_text: $69304f3cd9aa4f81$var$NormalTextMd,
95
+ bold: $69304f3cd9aa4f81$var$normalWrapper("strong"),
96
+ italic: $69304f3cd9aa4f81$var$normalWrapper("em"),
97
+ underline: $69304f3cd9aa4f81$var$normalWrapper("u"),
98
+ hyperlink: $69304f3cd9aa4f81$var$HyperLinkMd,
99
+ ordered_list: $69304f3cd9aa4f81$var$listWrapper("ol"),
100
+ unordered_list: $69304f3cd9aa4f81$var$listWrapper("ul"),
101
+ newline: ()=>/*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement("br", null),
102
+ join: $69304f3cd9aa4f81$var$JoinMd
103
+ };
104
+ function $69304f3cd9aa4f81$var$exhaustiveCheck(param) {}
105
+ function $69304f3cd9aa4f81$export$2e2bcd8739ae039({ mdText: mdText }) {
106
+ switch(mdText.markdown_text){
107
+ case "bold":
108
+ {
109
+ let RendenMDElement = $69304f3cd9aa4f81$var$mdTypeRenderers[mdText.markdown_text];
110
+ let container = mdText[mdText.markdown_text];
111
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(RendenMDElement, {
112
+ mdText: container
113
+ });
114
+ }
115
+ case "italic":
116
+ {
117
+ let RendenMDElement = $69304f3cd9aa4f81$var$mdTypeRenderers[mdText.markdown_text];
118
+ let container = mdText[mdText.markdown_text];
119
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(RendenMDElement, {
120
+ mdText: container
121
+ });
122
+ }
123
+ case "normal_text":
124
+ {
125
+ let RendenMDElement = $69304f3cd9aa4f81$var$mdTypeRenderers[mdText.markdown_text];
126
+ let container = mdText[mdText.markdown_text];
127
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(RendenMDElement, {
128
+ mdText: container
129
+ });
130
+ }
131
+ case "underline":
132
+ {
133
+ let RendenMDElement = $69304f3cd9aa4f81$var$mdTypeRenderers[mdText.markdown_text];
134
+ let container = mdText[mdText.markdown_text];
135
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(RendenMDElement, {
136
+ mdText: container
137
+ });
138
+ }
139
+ case "hyperlink":
140
+ {
141
+ let RendenMDElement = $69304f3cd9aa4f81$var$mdTypeRenderers[mdText.markdown_text];
142
+ let container = mdText[mdText.markdown_text];
143
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(RendenMDElement, {
144
+ mdText: container
145
+ });
146
+ }
147
+ case "ordered_list":
148
+ {
149
+ let RendenMDElement = $69304f3cd9aa4f81$var$mdTypeRenderers[mdText.markdown_text];
150
+ let container = mdText[mdText.markdown_text];
151
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(RendenMDElement, {
152
+ mdText: container
153
+ });
154
+ }
155
+ case "unordered_list":
156
+ {
157
+ let RendenMDElement = $69304f3cd9aa4f81$var$mdTypeRenderers[mdText.markdown_text];
158
+ let container = mdText[mdText.markdown_text];
159
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(RendenMDElement, {
160
+ mdText: container
161
+ });
162
+ }
163
+ case "join":
164
+ {
165
+ let RendenMDElement = $69304f3cd9aa4f81$var$mdTypeRenderers[mdText.markdown_text];
166
+ let container = mdText[mdText.markdown_text];
167
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(RendenMDElement, {
168
+ mdText: container
169
+ });
170
+ }
171
+ case "newline":
172
+ {
173
+ let RendenMDElement = $69304f3cd9aa4f81$var$mdTypeRenderers[mdText.markdown_text];
174
+ return /*#__PURE__*/ (0, ($parcel$interopDefault($kmRvl$react))).createElement(RendenMDElement, null);
175
+ }
176
+ }
177
+ $69304f3cd9aa4f81$var$exhaustiveCheck(mdText);
178
+ }
179
+
180
+
181
+ //# sourceMappingURL=assistant_md.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["src/assistant_md.tsx"],"sourcesContent":["import React from \"react\";\n\nconst URL_REGEX =\n /[(http(s)?):\\/\\/(www\\.)?a-zA-Z0-9@:%._\\+~#=-]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/;\n\nconst normalStr = (str: string) => ({\n type: \"normal_str\",\n value: str,\n});\n\nconst urlStr = (str: string) => ({\n type: \"url\",\n value: str,\n});\n\nexport function parseUrlAndString(str: string) {\n const results = [];\n let remaining = str;\n while (remaining) {\n let match = remaining.match(URL_REGEX);\n if (!match) {\n results.push(normalStr(remaining));\n break;\n }\n\n if (match.index !== 0) {\n results.push(normalStr(remaining.slice(0, match.index)));\n results.push(\n urlStr(\n remaining.slice(\n match.index,\n match.index && match.index + match[0].length\n )\n )\n );\n remaining = remaining.slice(match.index && match.index + match[0].length);\n continue;\n }\n results.push(urlStr(remaining.slice(0, match[0].length)));\n remaining = remaining.slice(match[0].length);\n }\n return results;\n}\n\nconst DisplayLineBreaks = ({ text }: { text: string }) => {\n let texts = text.split(\"\\n\");\n let lastOne = texts[texts.length - 1];\n let exceptLastOne = texts.slice(0, texts.length - 1);\n return (\n <>\n {exceptLastOne.reduce(\n (arr: (string | JSX.Element)[], text) => [\n ...arr,\n text,\n <br key={arr.length} />,\n ],\n []\n )}\n {lastOne}\n </>\n );\n};\n\nconst DisplayURL = ({ text }: { text: string }) => {\n const parsed = parseUrlAndString(text);\n return (\n <>\n {parsed.map(({ type, value }, i) =>\n type === \"url\" ? (\n <a href={value} target=\"_blank\" key={i} rel=\"noreferrer\">\n {value}\n </a>\n ) : (\n <DisplayLineBreaks text={value} key={i}></DisplayLineBreaks>\n )\n )}\n </>\n );\n};\n\ntype MdTypes =\n | \"normal_text\"\n | \"bold\"\n | \"italic\"\n | \"underline\"\n | \"hyperlink\"\n | \"ordered_list\"\n | \"unordered_list\"\n | \"newline\"\n | \"join\";\n\ntype NormalText = {\n normal_text: string;\n markdown_text: \"normal_text\";\n};\n\ntype MdValueContainer = { value: MdText };\n\ntype BoldText = {\n bold: MdValueContainer;\n markdown_text: \"bold\";\n};\n\ntype ItalicText = {\n italic: MdValueContainer;\n markdown_text: \"italic\";\n};\n\ntype UnderlineText = {\n underline: MdValueContainer;\n markdown_text: \"underline\";\n};\n\ntype HyperLinkContainer = {\n link: string;\n value: MdText;\n};\n\ntype HyperLinkText = {\n hyperlink: HyperLinkContainer;\n markdown_text: \"hyperlink\";\n};\n\ntype MdList = {\n list: MdText[];\n};\n\ntype OrdredListText = {\n ordered_list: MdList;\n markdown_text: \"ordered_list\";\n};\n\ntype UnOrdredListText = {\n unordered_list: MdList;\n markdown_text: \"unordered_list\";\n};\n\ntype NewlineText = {\n markdown_text: \"newline\";\n};\n\ntype JoinMdContainer = {\n lhs: MdText;\n rhs: MdText;\n};\n\ntype JoinMdText = {\n join: JoinMdContainer;\n markdown_text: \"join\";\n};\n\ntype MdText =\n | NormalText\n | BoldText\n | ItalicText\n | UnderlineText\n | HyperLinkText\n | OrdredListText\n | UnOrdredListText\n | JoinMdText\n | NewlineText;\n\ntype MdTextProp = { mdText: MdText };\n\ntype NormalRenderes = React.FunctionComponent<{ mdText: MdValueContainer }>;\n\ntype ListRenderers = React.FunctionComponent<{ mdText: MdList }>;\n\ntype TextRenderer = React.FunctionComponent<{ mdText: string }>;\n\ntype JoinMdRenderer = React.FunctionComponent<{ mdText: JoinMdContainer }>;\n\ntype HyperLinkRenderer = React.FunctionComponent<{\n mdText: HyperLinkContainer;\n}>;\n\nconst normalWrapper: (TagName: React.ElementType) => NormalRenderes =\n (TagName: React.ElementType) =>\n ({ mdText }) =>\n (\n <TagName>\n <AssistantMd mdText={mdText.value} />\n </TagName>\n );\n\nconst listWrapper: (TagName: React.ElementType) => ListRenderers =\n (TagName) =>\n ({ mdText: { list } }) =>\n (\n <TagName>\n {list.map((mdText) => (\n <li>\n <AssistantMd mdText={mdText} />\n </li>\n ))}\n </TagName>\n );\n\ntype RenderTypes = MdTypes;\n\ntype MdRenderers =\n | NormalRenderes\n | ListRenderers\n | TextRenderer\n | HyperLinkRenderer\n | JoinMdRenderer;\n\n// type RenderMap = Record<RenderTypes, MdRenderers>;\n\nconst NormalTextMd: TextRenderer = ({ mdText }) => {\n return <DisplayURL text={mdText} />;\n};\n\nconst HyperLinkMd: HyperLinkRenderer = ({ mdText }) => (\n <a href={mdText.link}>\n <AssistantMd mdText={mdText.value} />\n </a>\n);\n\nconst JoinMd: JoinMdRenderer = ({ mdText: { lhs, rhs } }) => (\n <>\n <AssistantMd mdText={lhs} />\n <AssistantMd mdText={rhs} />\n </>\n);\n\nconst mdTypeRenderers = {\n normal_text: NormalTextMd,\n bold: normalWrapper(\"strong\"),\n italic: normalWrapper(\"em\"),\n underline: normalWrapper(\"u\"),\n hyperlink: HyperLinkMd,\n ordered_list: listWrapper(\"ol\"),\n unordered_list: listWrapper(\"ul\"),\n newline: () => <br />,\n join: JoinMd,\n};\n\nfunction exhaustiveCheck(param: never) {}\n\nexport default function AssistantMd({ mdText }: MdTextProp) {\n switch (mdText.markdown_text) {\n case \"bold\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"italic\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"normal_text\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"underline\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"hyperlink\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"ordered_list\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"unordered_list\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"join\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n let container = mdText[mdText.markdown_text];\n return <RendenMDElement mdText={container} />;\n }\n case \"newline\": {\n let RendenMDElement = mdTypeRenderers[mdText.markdown_text];\n return <RendenMDElement />;\n }\n }\n exhaustiveCheck(mdText);\n}\n"],"names":[],"version":3,"file":"assistant_md.js.map"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@skitter/assistant_md",
3
+ "version": "1.0.0-alpha.0",
4
+ "description": "",
5
+ "source": "src/assistant_md.tsx",
6
+ "main": "dist/assistant_md.js",
7
+ "types": "dist/assistant_md.d.ts",
8
+ "scripts": {
9
+ "watch": "parcel watch",
10
+ "build": "parcel build"
11
+ },
12
+ "keywords": [],
13
+ "author": "",
14
+ "license": "ISC",
15
+ "peerDependencies": {
16
+ "react": "^16.8.2"
17
+ },
18
+ "volta": {
19
+ "node": "14.19.3"
20
+ },
21
+ "devDependencies": {
22
+ "@parcel/packager-ts": "^2.6.0",
23
+ "@parcel/transformer-typescript-types": "^2.6.0",
24
+ "@types/react": "^18.0.12",
25
+ "parcel": "^2.6.0",
26
+ "typescript": "^4.7.3"
27
+ }
28
+ }
@@ -0,0 +1,289 @@
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
+ function exhaustiveCheck(param: never) {}
240
+
241
+ export default function AssistantMd({ mdText }: MdTextProp) {
242
+ switch (mdText.markdown_text) {
243
+ case "bold": {
244
+ let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
245
+ let container = mdText[mdText.markdown_text];
246
+ return <RendenMDElement mdText={container} />;
247
+ }
248
+ case "italic": {
249
+ let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
250
+ let container = mdText[mdText.markdown_text];
251
+ return <RendenMDElement mdText={container} />;
252
+ }
253
+ case "normal_text": {
254
+ let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
255
+ let container = mdText[mdText.markdown_text];
256
+ return <RendenMDElement mdText={container} />;
257
+ }
258
+ case "underline": {
259
+ let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
260
+ let container = mdText[mdText.markdown_text];
261
+ return <RendenMDElement mdText={container} />;
262
+ }
263
+ case "hyperlink": {
264
+ let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
265
+ let container = mdText[mdText.markdown_text];
266
+ return <RendenMDElement mdText={container} />;
267
+ }
268
+ case "ordered_list": {
269
+ let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
270
+ let container = mdText[mdText.markdown_text];
271
+ return <RendenMDElement mdText={container} />;
272
+ }
273
+ case "unordered_list": {
274
+ let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
275
+ let container = mdText[mdText.markdown_text];
276
+ return <RendenMDElement mdText={container} />;
277
+ }
278
+ case "join": {
279
+ let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
280
+ let container = mdText[mdText.markdown_text];
281
+ return <RendenMDElement mdText={container} />;
282
+ }
283
+ case "newline": {
284
+ let RendenMDElement = mdTypeRenderers[mdText.markdown_text];
285
+ return <RendenMDElement />;
286
+ }
287
+ }
288
+ exhaustiveCheck(mdText);
289
+ }