@uniai-fe/util-react 0.1.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.
@@ -0,0 +1,55 @@
1
+ import React, { Fragment } from 'react';
2
+ import parse from 'html-react-parser';
3
+
4
+ // src/convert/index.tsx
5
+ var convertTextToHTML = (text, tagName, key) => {
6
+ if (!text.includes(`<${tagName}>`)) return text;
7
+ const HTML_KEY = key ? key : `util/convert/text-to-html/${tagName}`;
8
+ const parts = text.split(new RegExp(`(<${tagName}>|</${tagName}>)`, "g"));
9
+ let isTagContents = false;
10
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, parts.map((part, index) => {
11
+ if (part === `<${tagName}>`) {
12
+ isTagContents = true;
13
+ return null;
14
+ }
15
+ if (part === `</${tagName}>`) {
16
+ isTagContents = false;
17
+ return null;
18
+ }
19
+ if (isTagContents)
20
+ return /* @__PURE__ */ React.createElement("span", { key: `${HTML_KEY}/${index}`, className: tagName }, part);
21
+ return /* @__PURE__ */ React.createElement(Fragment, { key: `${HTML_KEY}/${index}` }, part);
22
+ }));
23
+ };
24
+ var convertTextToLineArray = (text) => {
25
+ if (text.includes("<br")) return text.split(/<br\s*\/?>|<br>/);
26
+ if (text.includes("\n")) return text.split("\n");
27
+ return [text];
28
+ };
29
+ var convertTextToJsx = ({
30
+ text,
31
+ key,
32
+ callback
33
+ }) => {
34
+ if (typeof text !== "string") return text;
35
+ if (/<[a-z][\s\S]*>/i.test(text)) {
36
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, parse(text));
37
+ }
38
+ const lines = convertTextToLineArray(text);
39
+ if (lines.length > 1) {
40
+ const LINE_KEY = "util/convert/text-to-jsx";
41
+ return lines.map((line, index) => /* @__PURE__ */ React.createElement(Fragment, { key: key ? `${key}/${index}` : `${LINE_KEY}/${line}/${index}` }, index !== 0 && /* @__PURE__ */ React.createElement("br", null), typeof callback === "function" ? callback(line) : line));
42
+ }
43
+ return text;
44
+ };
45
+ var convertArrayToJsx = (textArray, options) => {
46
+ if (typeof textArray === "string" || !Array.isArray(textArray))
47
+ return convertTextToJsx({ text: textArray });
48
+ const LINE_KEY = "util/convert/array-to-jsx";
49
+ const commonKey = (content, index, additionalKey) => options?.key ? `${options.key}${additionalKey ? `/${additionalKey}` : ""}/${index}` : `${LINE_KEY}/${String(content)}${additionalKey ? `/${additionalKey}` : ""}/${index}`;
50
+ return textArray.map((content, index) => /* @__PURE__ */ React.createElement(Fragment, { key: commonKey(content, index) }, index !== 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, new Array(options?.phraseGap || 1).fill({}).map((_, i) => /* @__PURE__ */ React.createElement("br", { key: commonKey(content, i, "br") }))), content));
51
+ };
52
+
53
+ export { convertArrayToJsx, convertTextToHTML, convertTextToJsx, convertTextToLineArray };
54
+ //# sourceMappingURL=index.mjs.map
55
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/convert/index.tsx"],"names":[],"mappings":";;;;AAOO,IAAM,iBAAA,GAAoB,CAC/B,IAAA,EACA,OAAA,EACA,GAAA,KACoB;AACpB,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA,CAAA,CAAG,GAAG,OAAO,IAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,GAAA,GAAM,GAAA,GAAM,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA;AACjE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,OAAO,CAAA,IAAA,EAAO,OAAO,CAAA,EAAA,CAAA,EAAM,GAAG,CAAC,CAAA;AAExE,EAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,EAAA,uBACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC1B,IAAA,IAAI,IAAA,KAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAA,EAAK;AAC3B,MAAA,aAAA,GAAgB,IAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,KAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA,EAAK;AAC5B,MAAA,aAAA,GAAgB,KAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,aAAA;AACF,MAAA,uBACE,KAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAK,CAAA,EAAG,QAAQ,IAAI,KAAK,CAAA,CAAA,EAAI,SAAA,EAAW,OAAA,EAAA,EAC3C,IACH,CAAA;AAEJ,IAAA,uBAAO,KAAA,CAAA,aAAA,CAAC,YAAS,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,MAAK,IAAK,CAAA;AAAA,EACtD,CAAC,CACH,CAAA;AAEJ;AAEO,IAAM,sBAAA,GAAyB,CAAC,IAAA,KAA2B;AAChE,EAAA,IAAI,KAAK,QAAA,CAAS,KAAK,GAAG,OAAO,IAAA,CAAK,MAAM,iBAAiB,CAAA;AAC7D,EAAA,IAAI,KAAK,QAAA,CAAS,IAAI,GAAG,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAC/C,EAAA,OAAO,CAAC,IAAI,CAAA;AACd;AAEO,IAAM,mBAAmB,CAAC;AAAA,EAC/B,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAA,KAAwD;AACtD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AAErC,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,IAAA,uBAAO,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAG,KAAA,CAAM,IAAI,CAAE,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,KAAA,GAAQ,uBAAuB,IAAI,CAAA;AAEzC,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,QAAA,GAAW,0BAAA;AACjB,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,0BACtB,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,GAAA,EAAK,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAA,EAClE,KAAA,KAAU,qBAAK,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,IAAG,CAAA,EACnB,OAAO,aAAa,UAAA,GAAa,QAAA,CAAS,IAAI,CAAA,GAAI,IACrD,CACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,iBAAA,GAAoB,CAC/B,SAAA,EACA,OAAA,KACoB;AACpB,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,SAAS,CAAA;AAC3D,IAAA,OAAO,gBAAA,CAAiB,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AAE7C,EAAA,MAAM,QAAA,GAAW,2BAAA;AACjB,EAAA,MAAM,SAAA,GAAY,CAChB,OAAA,EACA,KAAA,EACA,kBAEA,OAAA,EAAS,GAAA,GACL,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA,EAAG,aAAA,GAAgB,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAClE,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,OAAO,OAAO,CAAC,CAAA,EAAG,aAAA,GAAgB,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,GAAK,EAAE,IAAI,KAAK,CAAA,CAAA;AAExF,EAAA,OAAO,UAAU,GAAA,CAAI,CAAC,SAAS,KAAA,qBAC7B,KAAA,CAAA,aAAA,CAAC,YAAS,GAAA,EAAK,SAAA,CAAU,OAAA,EAAS,KAAK,KACpC,KAAA,KAAU,CAAA,8DAEN,IAAI,KAAA,CAAM,SAAS,SAAA,IAAa,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,sBACnD,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,KAAK,SAAA,CAAU,OAAA,EAAS,GAAG,IAAI,CAAA,EAAG,CACvC,CACH,CAAA,EAED,OACH,CACD,CAAA;AACH","file":"index.mjs","sourcesContent":["import React, { Fragment } from \"react\";\nimport parse from \"html-react-parser\";\nimport type {\n ConvertArrayToJsxOptions,\n ConvertTextToJsxParams,\n} from \"./types\";\n\nexport const convertTextToHTML = (\n text: string,\n tagName: string,\n key?: string,\n): React.ReactNode => {\n if (!text.includes(`<${tagName}>`)) return text;\n const HTML_KEY = key ? key : `util/convert/text-to-html/${tagName}`;\n const parts = text.split(new RegExp(`(<${tagName}>|</${tagName}>)`, \"g\"));\n\n let isTagContents = false;\n return (\n <>\n {parts.map((part, index) => {\n if (part === `<${tagName}>`) {\n isTagContents = true;\n return null;\n }\n if (part === `</${tagName}>`) {\n isTagContents = false;\n return null;\n }\n\n if (isTagContents)\n return (\n <span key={`${HTML_KEY}/${index}`} className={tagName}>\n {part}\n </span>\n );\n return <Fragment key={`${HTML_KEY}/${index}`}>{part}</Fragment>;\n })}\n </>\n );\n};\n\nexport const convertTextToLineArray = (text: string): string[] => {\n if (text.includes(\"<br\")) return text.split(/<br\\s*\\/?>|<br>/);\n if (text.includes(\"\\n\")) return text.split(\"\\n\");\n return [text];\n};\n\nexport const convertTextToJsx = ({\n text,\n key,\n callback,\n}: ConvertTextToJsxParams): string | React.ReactNode => {\n if (typeof text !== \"string\") return text;\n\n if (/<[a-z][\\s\\S]*>/i.test(text)) {\n return <>{parse(text)}</>;\n }\n\n const lines = convertTextToLineArray(text);\n\n if (lines.length > 1) {\n const LINE_KEY = \"util/convert/text-to-jsx\";\n return lines.map((line, index) => (\n <Fragment key={key ? `${key}/${index}` : `${LINE_KEY}/${line}/${index}`}>\n {index !== 0 && <br />}\n {typeof callback === \"function\" ? callback(line) : line}\n </Fragment>\n ));\n }\n\n return text;\n};\n\nexport const convertArrayToJsx = (\n textArray: React.ReactNode[] | string,\n options?: ConvertArrayToJsxOptions,\n): React.ReactNode => {\n if (typeof textArray === \"string\" || !Array.isArray(textArray))\n return convertTextToJsx({ text: textArray });\n\n const LINE_KEY = \"util/convert/array-to-jsx\";\n const commonKey = (\n content: React.ReactNode,\n index: number,\n additionalKey?: string,\n ) =>\n options?.key\n ? `${options.key}${additionalKey ? `/${additionalKey}` : \"\"}/${index}`\n : `${LINE_KEY}/${String(content)}${additionalKey ? `/${additionalKey}` : \"\"}/${index}`;\n\n return textArray.map((content, index) => (\n <Fragment key={commonKey(content, index)}>\n {index !== 0 && (\n <>\n {new Array(options?.phraseGap || 1).fill({}).map((_, i) => (\n <br key={commonKey(content, i, \"br\")} />\n ))}\n </>\n )}\n {content}\n </Fragment>\n ));\n};\n"]}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ var Decimal = require('decimal.js');
4
+
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var Decimal__default = /*#__PURE__*/_interopDefault(Decimal);
8
+
9
+ // src/file/index.tsx
10
+ var fileDownload = ({ url, name }) => fetch(url).then((res) => {
11
+ const contentType = res.headers.get("content-type") || "";
12
+ if (!res.ok || contentType.includes("text/html")) {
13
+ throw new Error("\uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uAC70\uB098 \uB2E4\uC6B4\uB85C\uB4DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
14
+ }
15
+ return res.blob();
16
+ }).then((blob) => {
17
+ const objectUrl = URL.createObjectURL(blob);
18
+ const anchor = document.createElement("a");
19
+ anchor.href = objectUrl;
20
+ anchor.download = String(name);
21
+ document.body.appendChild(anchor);
22
+ anchor.click();
23
+ document.body.removeChild(anchor);
24
+ URL.revokeObjectURL(objectUrl);
25
+ }).catch((err) => {
26
+ console.error("Download error:", err);
27
+ alert("\uB2E4\uC6B4\uB85C\uB4DC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.");
28
+ });
29
+ var fileSize = (size, unit = true) => {
30
+ if (typeof size !== "number" || size && isNaN(Number(size))) return "";
31
+ const AMOUNT = 1024;
32
+ const K_AMOUNT = AMOUNT * AMOUNT;
33
+ const M_AMOUNT = AMOUNT * AMOUNT * AMOUNT;
34
+ const byte = new Decimal__default.default(size);
35
+ const kb = byte.div(AMOUNT);
36
+ const mb = kb.div(AMOUNT);
37
+ const gb = mb.div(AMOUNT);
38
+ if (byte.toNumber() < AMOUNT) return `${byte.toFixed(0)}B`;
39
+ if (byte.toNumber() < K_AMOUNT) return `${kb.toFixed(0)}KB`;
40
+ if (byte.toNumber() < M_AMOUNT) return `${mb.toFixed(0)}MB`;
41
+ return unit ? `${gb.toFixed(0)}GB` : `${gb.toFixed(2)} GB`;
42
+ };
43
+
44
+ exports.fileDownload = fileDownload;
45
+ exports.fileSize = fileSize;
46
+ //# sourceMappingURL=index.cjs.map
47
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/file/index.tsx"],"names":["Decimal"],"mappings":";;;;;;;;;AAGO,IAAM,YAAA,GAAe,CAAC,EAAE,GAAA,EAAK,IAAA,OAClC,KAAA,CAAM,GAAG,CAAA,CACN,IAAA,CAAK,CAAA,GAAA,KAAO;AACX,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AACvD,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,MAAM,2HAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,IAAI,IAAA,EAAK;AAClB,CAAC,CAAA,CACA,KAAK,CAAA,IAAA,KAAQ;AACZ,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACzC,EAAA,MAAA,CAAO,IAAA,GAAO,SAAA;AACd,EAAA,MAAA,CAAO,QAAA,GAAW,OAAO,IAAI,CAAA;AAC7B,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,MAAA,CAAO,KAAA,EAAM;AACb,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,GAAA,CAAI,gBAAgB,SAAS,CAAA;AAC/B,CAAC,CAAA,CACA,MAAM,CAAA,GAAA,KAAO;AACZ,EAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AACpC,EAAA,KAAA,CAAM,0FAAoB,CAAA;AAC5B,CAAC;AAEE,IAAM,QAAA,GAAW,CAAC,IAAA,EAAe,IAAA,GAAgB,IAAA,KAAiB;AACvE,EAAA,IAAI,OAAO,SAAS,QAAA,IAAa,IAAA,IAAQ,MAAM,MAAA,CAAO,IAAI,CAAC,CAAA,EAAI,OAAO,EAAA;AAEtE,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,MAAM,WAAW,MAAA,GAAS,MAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,SAAS,MAAA,GAAS,MAAA;AAEnC,EAAA,MAAM,IAAA,GAAO,IAAIA,wBAAA,CAAQ,IAAI,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,GAAA,CAAI,MAAM,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,GAAA,CAAI,MAAM,CAAA;AAExB,EAAA,IAAI,IAAA,CAAK,UAAS,GAAI,MAAA,SAAe,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACvD,EAAA,IAAI,IAAA,CAAK,UAAS,GAAI,QAAA,SAAiB,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACvD,EAAA,IAAI,IAAA,CAAK,UAAS,GAAI,QAAA,SAAiB,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACvD,EAAA,OAAO,IAAA,GAAO,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA,GAAO,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AACvD","file":"index.cjs","sourcesContent":["import Decimal from \"decimal.js\";\nimport type { FileDownloadParams } from \"./types\";\n\nexport const fileDownload = ({ url, name }: FileDownloadParams) =>\n fetch(url)\n .then(res => {\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (!res.ok || contentType.includes(\"text/html\")) {\n throw new Error(\"파일을 찾을 수 없거나 다운로드할 수 없습니다.\");\n }\n return res.blob();\n })\n .then(blob => {\n const objectUrl = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = objectUrl;\n anchor.download = String(name);\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(objectUrl);\n })\n .catch(err => {\n console.error(\"Download error:\", err);\n alert(\"다운로드 중 오류가 발생했습니다.\");\n });\n\nexport const fileSize = (size: unknown, unit: boolean = true): string => {\n if (typeof size !== \"number\" || (size && isNaN(Number(size)))) return \"\";\n\n const AMOUNT = 1024;\n const K_AMOUNT = AMOUNT * AMOUNT;\n const M_AMOUNT = AMOUNT * AMOUNT * AMOUNT;\n\n const byte = new Decimal(size);\n const kb = byte.div(AMOUNT);\n const mb = kb.div(AMOUNT);\n const gb = mb.div(AMOUNT);\n\n if (byte.toNumber() < AMOUNT) return `${byte.toFixed(0)}B`;\n if (byte.toNumber() < K_AMOUNT) return `${kb.toFixed(0)}KB`;\n if (byte.toNumber() < M_AMOUNT) return `${mb.toFixed(0)}MB`;\n return unit ? `${gb.toFixed(0)}GB` : `${gb.toFixed(2)} GB`;\n};\n"]}
@@ -0,0 +1,9 @@
1
+ type FileDownloadParams = {
2
+ url: string;
3
+ name: string;
4
+ };
5
+
6
+ declare const fileDownload: ({ url, name }: FileDownloadParams) => Promise<void>;
7
+ declare const fileSize: (size: unknown, unit?: boolean) => string;
8
+
9
+ export { fileDownload, fileSize };
@@ -0,0 +1,9 @@
1
+ type FileDownloadParams = {
2
+ url: string;
3
+ name: string;
4
+ };
5
+
6
+ declare const fileDownload: ({ url, name }: FileDownloadParams) => Promise<void>;
7
+ declare const fileSize: (size: unknown, unit?: boolean) => string;
8
+
9
+ export { fileDownload, fileSize };
@@ -0,0 +1,40 @@
1
+ import Decimal from 'decimal.js';
2
+
3
+ // src/file/index.tsx
4
+ var fileDownload = ({ url, name }) => fetch(url).then((res) => {
5
+ const contentType = res.headers.get("content-type") || "";
6
+ if (!res.ok || contentType.includes("text/html")) {
7
+ throw new Error("\uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uAC70\uB098 \uB2E4\uC6B4\uB85C\uB4DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
8
+ }
9
+ return res.blob();
10
+ }).then((blob) => {
11
+ const objectUrl = URL.createObjectURL(blob);
12
+ const anchor = document.createElement("a");
13
+ anchor.href = objectUrl;
14
+ anchor.download = String(name);
15
+ document.body.appendChild(anchor);
16
+ anchor.click();
17
+ document.body.removeChild(anchor);
18
+ URL.revokeObjectURL(objectUrl);
19
+ }).catch((err) => {
20
+ console.error("Download error:", err);
21
+ alert("\uB2E4\uC6B4\uB85C\uB4DC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.");
22
+ });
23
+ var fileSize = (size, unit = true) => {
24
+ if (typeof size !== "number" || size && isNaN(Number(size))) return "";
25
+ const AMOUNT = 1024;
26
+ const K_AMOUNT = AMOUNT * AMOUNT;
27
+ const M_AMOUNT = AMOUNT * AMOUNT * AMOUNT;
28
+ const byte = new Decimal(size);
29
+ const kb = byte.div(AMOUNT);
30
+ const mb = kb.div(AMOUNT);
31
+ const gb = mb.div(AMOUNT);
32
+ if (byte.toNumber() < AMOUNT) return `${byte.toFixed(0)}B`;
33
+ if (byte.toNumber() < K_AMOUNT) return `${kb.toFixed(0)}KB`;
34
+ if (byte.toNumber() < M_AMOUNT) return `${mb.toFixed(0)}MB`;
35
+ return unit ? `${gb.toFixed(0)}GB` : `${gb.toFixed(2)} GB`;
36
+ };
37
+
38
+ export { fileDownload, fileSize };
39
+ //# sourceMappingURL=index.mjs.map
40
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/file/index.tsx"],"names":[],"mappings":";;;AAGO,IAAM,YAAA,GAAe,CAAC,EAAE,GAAA,EAAK,IAAA,OAClC,KAAA,CAAM,GAAG,CAAA,CACN,IAAA,CAAK,CAAA,GAAA,KAAO;AACX,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AACvD,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,WAAA,CAAY,QAAA,CAAS,WAAW,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,MAAM,2HAA4B,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,IAAI,IAAA,EAAK;AAClB,CAAC,CAAA,CACA,KAAK,CAAA,IAAA,KAAQ;AACZ,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACzC,EAAA,MAAA,CAAO,IAAA,GAAO,SAAA;AACd,EAAA,MAAA,CAAO,QAAA,GAAW,OAAO,IAAI,CAAA;AAC7B,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,MAAA,CAAO,KAAA,EAAM;AACb,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,GAAA,CAAI,gBAAgB,SAAS,CAAA;AAC/B,CAAC,CAAA,CACA,MAAM,CAAA,GAAA,KAAO;AACZ,EAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AACpC,EAAA,KAAA,CAAM,0FAAoB,CAAA;AAC5B,CAAC;AAEE,IAAM,QAAA,GAAW,CAAC,IAAA,EAAe,IAAA,GAAgB,IAAA,KAAiB;AACvE,EAAA,IAAI,OAAO,SAAS,QAAA,IAAa,IAAA,IAAQ,MAAM,MAAA,CAAO,IAAI,CAAC,CAAA,EAAI,OAAO,EAAA;AAEtE,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,MAAM,WAAW,MAAA,GAAS,MAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,SAAS,MAAA,GAAS,MAAA;AAEnC,EAAA,MAAM,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAI,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,GAAA,CAAI,MAAM,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,GAAA,CAAI,MAAM,CAAA;AAExB,EAAA,IAAI,IAAA,CAAK,UAAS,GAAI,MAAA,SAAe,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACvD,EAAA,IAAI,IAAA,CAAK,UAAS,GAAI,QAAA,SAAiB,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACvD,EAAA,IAAI,IAAA,CAAK,UAAS,GAAI,QAAA,SAAiB,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACvD,EAAA,OAAO,IAAA,GAAO,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA,GAAO,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AACvD","file":"index.mjs","sourcesContent":["import Decimal from \"decimal.js\";\nimport type { FileDownloadParams } from \"./types\";\n\nexport const fileDownload = ({ url, name }: FileDownloadParams) =>\n fetch(url)\n .then(res => {\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (!res.ok || contentType.includes(\"text/html\")) {\n throw new Error(\"파일을 찾을 수 없거나 다운로드할 수 없습니다.\");\n }\n return res.blob();\n })\n .then(blob => {\n const objectUrl = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = objectUrl;\n anchor.download = String(name);\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(objectUrl);\n })\n .catch(err => {\n console.error(\"Download error:\", err);\n alert(\"다운로드 중 오류가 발생했습니다.\");\n });\n\nexport const fileSize = (size: unknown, unit: boolean = true): string => {\n if (typeof size !== \"number\" || (size && isNaN(Number(size)))) return \"\";\n\n const AMOUNT = 1024;\n const K_AMOUNT = AMOUNT * AMOUNT;\n const M_AMOUNT = AMOUNT * AMOUNT * AMOUNT;\n\n const byte = new Decimal(size);\n const kb = byte.div(AMOUNT);\n const mb = kb.div(AMOUNT);\n const gb = mb.div(AMOUNT);\n\n if (byte.toNumber() < AMOUNT) return `${byte.toFixed(0)}B`;\n if (byte.toNumber() < K_AMOUNT) return `${kb.toFixed(0)}KB`;\n if (byte.toNumber() < M_AMOUNT) return `${mb.toFixed(0)}MB`;\n return unit ? `${gb.toFixed(0)}GB` : `${gb.toFixed(2)} GB`;\n};\n"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,280 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var parse = require('html-react-parser');
5
+ var Decimal = require('decimal.js');
6
+ var d3Array = require('d3-array');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var React__default = /*#__PURE__*/_interopDefault(React);
11
+ var parse__default = /*#__PURE__*/_interopDefault(parse);
12
+ var Decimal__default = /*#__PURE__*/_interopDefault(Decimal);
13
+
14
+ // src/convert/index.tsx
15
+ var convertTextToHTML = (text, tagName, key) => {
16
+ if (!text.includes(`<${tagName}>`)) return text;
17
+ const HTML_KEY = key ? key : `util/convert/text-to-html/${tagName}`;
18
+ const parts = text.split(new RegExp(`(<${tagName}>|</${tagName}>)`, "g"));
19
+ let isTagContents = false;
20
+ return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, parts.map((part, index) => {
21
+ if (part === `<${tagName}>`) {
22
+ isTagContents = true;
23
+ return null;
24
+ }
25
+ if (part === `</${tagName}>`) {
26
+ isTagContents = false;
27
+ return null;
28
+ }
29
+ if (isTagContents)
30
+ return /* @__PURE__ */ React__default.default.createElement("span", { key: `${HTML_KEY}/${index}`, className: tagName }, part);
31
+ return /* @__PURE__ */ React__default.default.createElement(React.Fragment, { key: `${HTML_KEY}/${index}` }, part);
32
+ }));
33
+ };
34
+ var convertTextToLineArray = (text) => {
35
+ if (text.includes("<br")) return text.split(/<br\s*\/?>|<br>/);
36
+ if (text.includes("\n")) return text.split("\n");
37
+ return [text];
38
+ };
39
+ var convertTextToJsx = ({
40
+ text,
41
+ key,
42
+ callback
43
+ }) => {
44
+ if (typeof text !== "string") return text;
45
+ if (/<[a-z][\s\S]*>/i.test(text)) {
46
+ return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, parse__default.default(text));
47
+ }
48
+ const lines = convertTextToLineArray(text);
49
+ if (lines.length > 1) {
50
+ const LINE_KEY = "util/convert/text-to-jsx";
51
+ return lines.map((line, index) => /* @__PURE__ */ React__default.default.createElement(React.Fragment, { key: key ? `${key}/${index}` : `${LINE_KEY}/${line}/${index}` }, index !== 0 && /* @__PURE__ */ React__default.default.createElement("br", null), typeof callback === "function" ? callback(line) : line));
52
+ }
53
+ return text;
54
+ };
55
+ var convertArrayToJsx = (textArray, options) => {
56
+ if (typeof textArray === "string" || !Array.isArray(textArray))
57
+ return convertTextToJsx({ text: textArray });
58
+ const LINE_KEY = "util/convert/array-to-jsx";
59
+ const commonKey = (content, index, additionalKey) => options?.key ? `${options.key}${additionalKey ? `/${additionalKey}` : ""}/${index}` : `${LINE_KEY}/${String(content)}${additionalKey ? `/${additionalKey}` : ""}/${index}`;
60
+ return textArray.map((content, index) => /* @__PURE__ */ React__default.default.createElement(React.Fragment, { key: commonKey(content, index) }, index !== 0 && /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, new Array(options?.phraseGap || 1).fill({}).map((_, i) => /* @__PURE__ */ React__default.default.createElement("br", { key: commonKey(content, i, "br") }))), content));
61
+ };
62
+ function matchKeyword(origin, exp, renderKey) {
63
+ const matches = Array.from(origin.matchAll(exp));
64
+ if (!matches.length) return origin;
65
+ const jsxArray = [];
66
+ for (let i = 0; i < matches.length; i++) {
67
+ const match = matches[i];
68
+ const prevMatch = i ? matches[i - 1] : void 0;
69
+ const offset = prevMatch ? prevMatch.index + prevMatch[0].length : 0;
70
+ jsxArray.push(origin.slice(offset, match.index));
71
+ jsxArray.push(
72
+ /* @__PURE__ */ React__default.default.createElement("i", { className: "matched", key: `${renderKey}/${match}/${i}` }, match[0])
73
+ );
74
+ const isLastMatch = i === matches.length - 1;
75
+ const hasTextAfterLastMatch = match.index + match[0].length < origin.length;
76
+ if (isLastMatch && hasTextAfterLastMatch) {
77
+ jsxArray.push(origin.slice(match.index + match[0].length));
78
+ }
79
+ }
80
+ return jsxArray.length ? jsxArray : origin;
81
+ }
82
+ var fileDownload = ({ url, name }) => fetch(url).then((res) => {
83
+ const contentType = res.headers.get("content-type") || "";
84
+ if (!res.ok || contentType.includes("text/html")) {
85
+ throw new Error("\uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uAC70\uB098 \uB2E4\uC6B4\uB85C\uB4DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
86
+ }
87
+ return res.blob();
88
+ }).then((blob) => {
89
+ const objectUrl = URL.createObjectURL(blob);
90
+ const anchor = document.createElement("a");
91
+ anchor.href = objectUrl;
92
+ anchor.download = String(name);
93
+ document.body.appendChild(anchor);
94
+ anchor.click();
95
+ document.body.removeChild(anchor);
96
+ URL.revokeObjectURL(objectUrl);
97
+ }).catch((err) => {
98
+ console.error("Download error:", err);
99
+ alert("\uB2E4\uC6B4\uB85C\uB4DC \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.");
100
+ });
101
+ var fileSize = (size, unit = true) => {
102
+ if (typeof size !== "number" || size && isNaN(Number(size))) return "";
103
+ const AMOUNT = 1024;
104
+ const K_AMOUNT = AMOUNT * AMOUNT;
105
+ const M_AMOUNT = AMOUNT * AMOUNT * AMOUNT;
106
+ const byte = new Decimal__default.default(size);
107
+ const kb = byte.div(AMOUNT);
108
+ const mb = kb.div(AMOUNT);
109
+ const gb = mb.div(AMOUNT);
110
+ if (byte.toNumber() < AMOUNT) return `${byte.toFixed(0)}B`;
111
+ if (byte.toNumber() < K_AMOUNT) return `${kb.toFixed(0)}KB`;
112
+ if (byte.toNumber() < M_AMOUNT) return `${mb.toFixed(0)}MB`;
113
+ return unit ? `${gb.toFixed(0)}GB` : `${gb.toFixed(2)} GB`;
114
+ };
115
+ var getChartYTicks = ({
116
+ data,
117
+ length,
118
+ pad = 0.5,
119
+ limitMin,
120
+ limitMax,
121
+ digit = 2,
122
+ outliers = false,
123
+ log
124
+ }) => {
125
+ if (data.length === 0 || length <= 1) return void 0;
126
+ if (typeof limitMin === "number" && typeof limitMax === "number")
127
+ return Array.from({ length: length + 1 }).map(
128
+ (_, index) => Math.round((limitMax - limitMin) / length * index + limitMin)
129
+ );
130
+ const dataSet = [];
131
+ data.forEach((d) => {
132
+ if (typeof d !== "number" && typeof d !== "string" && !(typeof d === "object" && d !== null && "value" in d))
133
+ return;
134
+ if (typeof d === "number") dataSet.push(d);
135
+ else if (typeof d === "string" && !isNaN(Number(d)))
136
+ dataSet.push(Number(d));
137
+ else if (typeof d === "object" && d !== null && "value" in d && typeof d.value === "number")
138
+ dataSet.push(d.value);
139
+ });
140
+ if (dataSet.length === 0) return void 0;
141
+ let domain = d3Array.extent(dataSet);
142
+ if (typeof limitMin === "number") domain = [limitMin, domain[1]];
143
+ if (typeof limitMax === "number") domain = [domain[0], limitMax];
144
+ if (typeof domain[0] === "undefined" || typeof domain[1] === "undefined")
145
+ return void 0;
146
+ const isAllDecimal = dataSet.every(
147
+ (v) => typeof digit === "number" && digit > 0 || String(v).split(".").filter((_, index) => index === 1).filter(Boolean).filter((f) => f.split("").some((s) => s !== "0")).length > 0
148
+ );
149
+ const DECIMAL_LIMIT = typeof digit === "number" ? digit : 2;
150
+ const floor = (domain[0] + 1e-3 * domain[0]) * Math.pow(10, DECIMAL_LIMIT);
151
+ const ceil = (domain[1] + 1e-3 * domain[1]) * Math.pow(10, DECIMAL_LIMIT);
152
+ const interval = (ceil - floor) / length;
153
+ const ticks = [];
154
+ for (let i = 0; i < length + 1; i++)
155
+ ticks.push((floor + i * interval) / Math.pow(10, DECIMAL_LIMIT));
156
+ const [firstTick] = ticks;
157
+ const lastTick = ticks[ticks.length - 1];
158
+ if (typeof firstTick === "undefined" || typeof lastTick === "undefined")
159
+ return void 0;
160
+ const gap = Math.abs(lastTick - firstTick);
161
+ const precision = typeof digit === "number" ? digit : gap < 1 ? 3 : gap < 10 && isAllDecimal ? 2 : gap < 25 ? 1 : 0;
162
+ const ticksArr = ticks.map(
163
+ (tick) => Number((tick + Number.EPSILON).toFixed(precision))
164
+ );
165
+ if (log) {
166
+ const MAX_LENGTH = 8;
167
+ const top = ticksArr[ticksArr.length - 1];
168
+ const bottom = ticksArr[0];
169
+ const domainRange = typeof top === "number" && typeof bottom === "number" ? top - bottom : 0;
170
+ const logScale = domainRange > 0 ? Math.round(Math.log2(domainRange)) : 0;
171
+ if (ticksArr.length > MAX_LENGTH) {
172
+ const step = Math.ceil(ticksArr.length / MAX_LENGTH);
173
+ return ticksArr.filter((_, index) => index % step === 0);
174
+ }
175
+ if (logScale > 0) {
176
+ const step = Math.max(1, Math.floor(MAX_LENGTH / logScale));
177
+ return ticksArr.filter((_, index) => index % step === 0);
178
+ }
179
+ }
180
+ if (pad === 0) return ticksArr;
181
+ const isPowTen = ticksArr.every((t) => {
182
+ const v = Math.abs(t);
183
+ return v === 0 || Number.isInteger(Math.log10(v));
184
+ });
185
+ const [tickMin] = ticksArr;
186
+ const tickMax = ticksArr[ticksArr.length - 1];
187
+ const quantiles = d3Array.extent(dataSet);
188
+ let [min, max] = quantiles;
189
+ if (typeof min === "undefined" || typeof max === "undefined")
190
+ return ticksArr;
191
+ if (outliers)
192
+ [min, max] = [
193
+ d3Array.quantile(dataSet, 0.4) ?? min,
194
+ d3Array.quantile(dataSet, 0.6) ?? max
195
+ ];
196
+ if (pad > 0) {
197
+ const SCALE = typeof max === "number" && typeof min === "number" ? Math.max(Math.abs(max), Math.abs(min)) : 0;
198
+ const OFFSET = SCALE < 10 && isPowTen ? 0.5 : SCALE < 100 && isPowTen ? 5 : SCALE < 1e3 && isPowTen ? 50 : Math.round((max - min) / ticksArr.length);
199
+ if (typeof tickMax === "number")
200
+ ticksArr[ticksArr.length - 1] = Math.round(
201
+ tickMax + OFFSET * pad + Number.EPSILON
202
+ );
203
+ if (typeof tickMin === "number")
204
+ ticksArr[0] = Math.round(tickMin - OFFSET * pad - Number.EPSILON);
205
+ }
206
+ const bad = ticksArr.some((tick, index) => {
207
+ if (index === 0) return false;
208
+ const prev = ticksArr[index - 1];
209
+ const d = Math.abs(tick - prev);
210
+ if (typeof digit === "number" && digit < 1 && String(d).includes("."))
211
+ return false;
212
+ return d !== 1 && d !== 5 && d !== 0;
213
+ });
214
+ if (bad && pad !== 0) {
215
+ return getChartYTicks({
216
+ data,
217
+ length,
218
+ pad: 0,
219
+ limitMin,
220
+ limitMax,
221
+ digit,
222
+ outliers,
223
+ log
224
+ });
225
+ }
226
+ return ticksArr;
227
+ };
228
+ var getDecimalIndex = (v) => !isNaN(Number(v)) && String(v).includes(".") ? String(v).split(".")[1].split("").findIndex((d) => Number(d) !== 0) + 1 : 0;
229
+ var getDomainLimit = ({
230
+ value,
231
+ gap,
232
+ min,
233
+ max
234
+ }) => {
235
+ if (typeof value === "number" && !isNaN(value)) {
236
+ const limit = value + gap;
237
+ if (typeof min === "number" && limit < min) return min;
238
+ if (typeof max === "number" && limit > max) return max;
239
+ return limit;
240
+ }
241
+ return value ?? "";
242
+ };
243
+ var getXAxisTextAttr = (props) => {
244
+ const {
245
+ width,
246
+ height,
247
+ x,
248
+ y,
249
+ stroke,
250
+ fill,
251
+ orientation,
252
+ textAnchor,
253
+ transform
254
+ } = props;
255
+ return {
256
+ width,
257
+ height,
258
+ x,
259
+ y,
260
+ stroke,
261
+ fill,
262
+ textAnchor,
263
+ orientation,
264
+ transform
265
+ };
266
+ };
267
+
268
+ exports.convertArrayToJsx = convertArrayToJsx;
269
+ exports.convertTextToHTML = convertTextToHTML;
270
+ exports.convertTextToJsx = convertTextToJsx;
271
+ exports.convertTextToLineArray = convertTextToLineArray;
272
+ exports.fileDownload = fileDownload;
273
+ exports.fileSize = fileSize;
274
+ exports.getChartYTicks = getChartYTicks;
275
+ exports.getDecimalIndex = getDecimalIndex;
276
+ exports.getDomainLimit = getDomainLimit;
277
+ exports.getXAxisTextAttr = getXAxisTextAttr;
278
+ exports.matchKeyword = matchKeyword;
279
+ //# sourceMappingURL=index.cjs.map
280
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/convert/index.tsx","../src/match/index.tsx","../src/file/index.tsx","../src/chart/index.tsx"],"names":["React","Fragment","parse","Decimal","extent","quantile"],"mappings":"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","file":"index.cjs","sourcesContent":["import React, { Fragment } from \"react\";\nimport parse from \"html-react-parser\";\nimport type {\n ConvertArrayToJsxOptions,\n ConvertTextToJsxParams,\n} from \"./types\";\n\nexport const convertTextToHTML = (\n text: string,\n tagName: string,\n key?: string,\n): React.ReactNode => {\n if (!text.includes(`<${tagName}>`)) return text;\n const HTML_KEY = key ? key : `util/convert/text-to-html/${tagName}`;\n const parts = text.split(new RegExp(`(<${tagName}>|</${tagName}>)`, \"g\"));\n\n let isTagContents = false;\n return (\n <>\n {parts.map((part, index) => {\n if (part === `<${tagName}>`) {\n isTagContents = true;\n return null;\n }\n if (part === `</${tagName}>`) {\n isTagContents = false;\n return null;\n }\n\n if (isTagContents)\n return (\n <span key={`${HTML_KEY}/${index}`} className={tagName}>\n {part}\n </span>\n );\n return <Fragment key={`${HTML_KEY}/${index}`}>{part}</Fragment>;\n })}\n </>\n );\n};\n\nexport const convertTextToLineArray = (text: string): string[] => {\n if (text.includes(\"<br\")) return text.split(/<br\\s*\\/?>|<br>/);\n if (text.includes(\"\\n\")) return text.split(\"\\n\");\n return [text];\n};\n\nexport const convertTextToJsx = ({\n text,\n key,\n callback,\n}: ConvertTextToJsxParams): string | React.ReactNode => {\n if (typeof text !== \"string\") return text;\n\n if (/<[a-z][\\s\\S]*>/i.test(text)) {\n return <>{parse(text)}</>;\n }\n\n const lines = convertTextToLineArray(text);\n\n if (lines.length > 1) {\n const LINE_KEY = \"util/convert/text-to-jsx\";\n return lines.map((line, index) => (\n <Fragment key={key ? `${key}/${index}` : `${LINE_KEY}/${line}/${index}`}>\n {index !== 0 && <br />}\n {typeof callback === \"function\" ? callback(line) : line}\n </Fragment>\n ));\n }\n\n return text;\n};\n\nexport const convertArrayToJsx = (\n textArray: React.ReactNode[] | string,\n options?: ConvertArrayToJsxOptions,\n): React.ReactNode => {\n if (typeof textArray === \"string\" || !Array.isArray(textArray))\n return convertTextToJsx({ text: textArray });\n\n const LINE_KEY = \"util/convert/array-to-jsx\";\n const commonKey = (\n content: React.ReactNode,\n index: number,\n additionalKey?: string,\n ) =>\n options?.key\n ? `${options.key}${additionalKey ? `/${additionalKey}` : \"\"}/${index}`\n : `${LINE_KEY}/${String(content)}${additionalKey ? `/${additionalKey}` : \"\"}/${index}`;\n\n return textArray.map((content, index) => (\n <Fragment key={commonKey(content, index)}>\n {index !== 0 && (\n <>\n {new Array(options?.phraseGap || 1).fill({}).map((_, i) => (\n <br key={commonKey(content, i, \"br\")} />\n ))}\n </>\n )}\n {content}\n </Fragment>\n ));\n};\n","import React from \"react\";\nimport type { MatchKeywordResult } from \"./types\";\n\n/**\n * 일치 텍스트를 컴포넌트로 교체\n */\nexport function matchKeyword(\n origin: string,\n exp: RegExp,\n renderKey: string,\n): MatchKeywordResult {\n const matches = Array.from(origin.matchAll(exp));\n if (!matches.length) return origin;\n\n const jsxArray: React.ReactNode[] = [];\n for (let i = 0; i < matches.length; i++) {\n const match = matches[i];\n const prevMatch = i ? matches[i - 1] : undefined;\n const offset = prevMatch ? prevMatch.index! + prevMatch[0].length : 0;\n\n jsxArray.push(origin.slice(offset, match.index));\n jsxArray.push(\n <i className=\"matched\" key={`${renderKey}/${match}/${i}`}>\n {match[0]}\n </i>,\n );\n\n const isLastMatch = i === matches.length - 1;\n const hasTextAfterLastMatch =\n match.index! + match[0].length < origin.length;\n\n if (isLastMatch && hasTextAfterLastMatch) {\n jsxArray.push(origin.slice(match.index! + match[0].length));\n }\n }\n\n return jsxArray.length ? jsxArray : origin;\n}\n","import Decimal from \"decimal.js\";\nimport type { FileDownloadParams } from \"./types\";\n\nexport const fileDownload = ({ url, name }: FileDownloadParams) =>\n fetch(url)\n .then(res => {\n const contentType = res.headers.get(\"content-type\") || \"\";\n if (!res.ok || contentType.includes(\"text/html\")) {\n throw new Error(\"파일을 찾을 수 없거나 다운로드할 수 없습니다.\");\n }\n return res.blob();\n })\n .then(blob => {\n const objectUrl = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = objectUrl;\n anchor.download = String(name);\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(objectUrl);\n })\n .catch(err => {\n console.error(\"Download error:\", err);\n alert(\"다운로드 중 오류가 발생했습니다.\");\n });\n\nexport const fileSize = (size: unknown, unit: boolean = true): string => {\n if (typeof size !== \"number\" || (size && isNaN(Number(size)))) return \"\";\n\n const AMOUNT = 1024;\n const K_AMOUNT = AMOUNT * AMOUNT;\n const M_AMOUNT = AMOUNT * AMOUNT * AMOUNT;\n\n const byte = new Decimal(size);\n const kb = byte.div(AMOUNT);\n const mb = kb.div(AMOUNT);\n const gb = mb.div(AMOUNT);\n\n if (byte.toNumber() < AMOUNT) return `${byte.toFixed(0)}B`;\n if (byte.toNumber() < K_AMOUNT) return `${kb.toFixed(0)}KB`;\n if (byte.toNumber() < M_AMOUNT) return `${mb.toFixed(0)}MB`;\n return unit ? `${gb.toFixed(0)}GB` : `${gb.toFixed(2)} GB`;\n};\n","import type { SVGAttributes } from \"react\";\nimport { extent, quantile } from \"d3-array\";\nimport type {\n GetChartYTicksProps,\n RechartsXAxisTickPayload,\n RechartsXAxisTickProps,\n} from \"./types\";\n\nexport const getChartYTicks = ({\n data,\n length,\n pad = 0.5,\n limitMin,\n limitMax,\n digit = 2,\n outliers = false,\n log,\n}: GetChartYTicksProps): number[] | undefined => {\n if (data.length === 0 || length <= 1) return undefined;\n if (typeof limitMin === \"number\" && typeof limitMax === \"number\")\n return Array.from({ length: length + 1 }).map((_, index) =>\n Math.round(((limitMax - limitMin) / length) * index + limitMin),\n );\n\n const dataSet: number[] = [];\n\n data.forEach(d => {\n if (\n typeof d !== \"number\" &&\n typeof d !== \"string\" &&\n !(typeof d === \"object\" && d !== null && \"value\" in d)\n )\n return;\n\n if (typeof d === \"number\") dataSet.push(d);\n else if (typeof d === \"string\" && !isNaN(Number(d)))\n dataSet.push(Number(d));\n else if (\n typeof d === \"object\" &&\n d !== null &&\n \"value\" in d &&\n typeof (d as { value: unknown }).value === \"number\"\n )\n dataSet.push((d as { value: number }).value);\n });\n\n if (dataSet.length === 0) return undefined;\n\n let domain = extent(dataSet) as [number | undefined, number | undefined];\n if (typeof limitMin === \"number\") domain = [limitMin, domain[1]];\n if (typeof limitMax === \"number\") domain = [domain[0], limitMax];\n\n if (typeof domain[0] === \"undefined\" || typeof domain[1] === \"undefined\")\n return undefined;\n\n const isAllDecimal = dataSet.every(\n v =>\n (typeof digit === \"number\" && digit > 0) ||\n String(v)\n .split(\".\")\n .filter((_, index) => index === 1)\n .filter(Boolean)\n .filter(f => f.split(\"\").some(s => s !== \"0\")).length > 0,\n );\n\n const DECIMAL_LIMIT = typeof digit === \"number\" ? digit : 2;\n\n const floor = (domain[0] + 0.001 * domain[0]) * Math.pow(10, DECIMAL_LIMIT);\n const ceil = (domain[1] + 0.001 * domain[1]) * Math.pow(10, DECIMAL_LIMIT);\n const interval = (ceil - floor) / length;\n\n const ticks: number[] = [];\n for (let i = 0; i < length + 1; i++)\n ticks.push((floor + i * interval) / Math.pow(10, DECIMAL_LIMIT));\n\n const [firstTick] = ticks;\n const lastTick = ticks[ticks.length - 1];\n if (typeof firstTick === \"undefined\" || typeof lastTick === \"undefined\")\n return undefined;\n\n const gap = Math.abs(lastTick - firstTick);\n const precision =\n typeof digit === \"number\"\n ? digit\n : gap < 1\n ? 3\n : gap < 10 && isAllDecimal\n ? 2\n : gap < 25\n ? 1\n : 0;\n\n const ticksArr = ticks.map(tick =>\n Number((tick + Number.EPSILON).toFixed(precision)),\n );\n\n if (log) {\n const MAX_LENGTH = 8;\n const top = ticksArr[ticksArr.length - 1];\n const bottom = ticksArr[0];\n const domainRange =\n typeof top === \"number\" && typeof bottom === \"number\"\n ? top - bottom\n : 0;\n const logScale =\n domainRange > 0 ? Math.round(Math.log2(domainRange)) : 0;\n\n if (ticksArr.length > MAX_LENGTH) {\n const step = Math.ceil(ticksArr.length / MAX_LENGTH);\n return ticksArr.filter((_, index) => index % step === 0);\n }\n\n if (logScale > 0) {\n const step = Math.max(1, Math.floor(MAX_LENGTH / logScale));\n return ticksArr.filter((_, index) => index % step === 0);\n }\n }\n\n if (pad === 0) return ticksArr;\n\n const isPowTen = ticksArr.every(t => {\n const v = Math.abs(t);\n return v === 0 || Number.isInteger(Math.log10(v));\n });\n\n const [tickMin] = ticksArr;\n const tickMax = ticksArr[ticksArr.length - 1];\n\n const quantiles = extent(dataSet);\n let [min, max] = quantiles;\n if (typeof min === \"undefined\" || typeof max === \"undefined\")\n return ticksArr;\n\n if (outliers)\n [min, max] = [\n quantile(dataSet, 0.4) ?? min,\n quantile(dataSet, 0.6) ?? max,\n ];\n\n if (pad > 0) {\n const SCALE =\n typeof max === \"number\" && typeof min === \"number\"\n ? Math.max(Math.abs(max), Math.abs(min))\n : 0;\n const OFFSET =\n SCALE < 10 && isPowTen\n ? 0.5\n : SCALE < 100 && isPowTen\n ? 5\n : SCALE < 1000 && isPowTen\n ? 50\n : Math.round((max - min) / ticksArr.length);\n\n if (typeof tickMax === \"number\")\n ticksArr[ticksArr.length - 1] = Math.round(\n tickMax + OFFSET * pad + Number.EPSILON,\n );\n if (typeof tickMin === \"number\")\n ticksArr[0] = Math.round(tickMin - OFFSET * pad - Number.EPSILON);\n }\n\n const bad = ticksArr.some((tick, index) => {\n if (index === 0) return false;\n const prev = ticksArr[index - 1];\n const d = Math.abs(tick - prev);\n if (\n typeof digit === \"number\" &&\n digit < 1 &&\n String(d).includes(\".\")\n )\n return false;\n\n return d !== 1 && d !== 5 && d !== 0;\n });\n\n if (bad && pad !== 0) {\n return getChartYTicks({\n data,\n length,\n pad: 0,\n limitMin,\n limitMax,\n digit,\n outliers,\n log,\n });\n }\n\n return ticksArr;\n};\n\nexport const getDecimalIndex = (v: unknown): number =>\n !isNaN(Number(v)) && String(v).includes(\".\")\n ? String(v)\n .split(\".\")[1]\n .split(\"\")\n .findIndex(d => Number(d) !== 0) + 1\n : 0;\n\nexport const getDomainLimit = ({\n value,\n gap,\n min,\n max,\n}: {\n value: number | null;\n gap: number;\n min?: number;\n max?: number;\n}): number | string => {\n if (typeof value === \"number\" && !isNaN(value)) {\n const limit = value + gap;\n if (typeof min === \"number\" && limit < min) return min;\n if (typeof max === \"number\" && limit > max) return max;\n return limit;\n }\n return value ?? \"\";\n};\n\nexport const getXAxisTextAttr = (\n props: RechartsXAxisTickProps,\n): SVGAttributes<SVGTextElement> => {\n const {\n width,\n height,\n x,\n y,\n stroke,\n fill,\n orientation,\n textAnchor,\n transform,\n } = props;\n\n return {\n width,\n height,\n x,\n y,\n stroke,\n fill,\n textAnchor,\n orientation,\n transform,\n };\n};\n"]}
@@ -0,0 +1,6 @@
1
+ export { convertArrayToJsx, convertTextToHTML, convertTextToJsx, convertTextToLineArray } from './convert/index.cjs';
2
+ export { matchKeyword } from './match/index.cjs';
3
+ export { fileDownload, fileSize } from './file/index.cjs';
4
+ export { getChartYTicks, getDecimalIndex, getDomainLimit, getXAxisTextAttr } from './chart/index.cjs';
5
+ import 'react';
6
+ import 'recharts';
@@ -0,0 +1,6 @@
1
+ export { convertArrayToJsx, convertTextToHTML, convertTextToJsx, convertTextToLineArray } from './convert/index.js';
2
+ export { matchKeyword } from './match/index.js';
3
+ export { fileDownload, fileSize } from './file/index.js';
4
+ export { getChartYTicks, getDecimalIndex, getDomainLimit, getXAxisTextAttr } from './chart/index.js';
5
+ import 'react';
6
+ import 'recharts';