@digitalwalletcorp/utils 0.2.0 → 0.4.1
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/README.md +13 -13
- package/lib/crypto-util-DFJqfmuw.js +46 -0
- package/lib/crypto-util-DFJqfmuw.js.map +1 -0
- package/lib/crypto-util-DeZSGetI.cjs +2 -0
- package/lib/crypto-util-DeZSGetI.cjs.map +1 -0
- package/lib/crypto-util.cjs +2 -0
- package/lib/crypto-util.cjs.map +1 -0
- package/lib/crypto-util.d.cts +28 -0
- package/lib/crypto-util.d.ts +28 -0
- package/lib/crypto-util.js +7 -0
- package/lib/crypto-util.js.map +1 -0
- package/lib/date-util-CG7L8nSP.js +184 -0
- package/lib/date-util-CG7L8nSP.js.map +1 -0
- package/lib/date-util-DopNKy3u.cjs +2 -0
- package/lib/date-util-DopNKy3u.cjs.map +1 -0
- package/lib/date-util.cjs +2 -0
- package/lib/date-util.cjs.map +1 -0
- package/lib/date-util.d.cts +231 -0
- package/lib/date-util.d.ts +231 -0
- package/lib/date-util.js +23 -0
- package/lib/date-util.js.map +1 -0
- package/lib/decimal.cjs +2 -0
- package/lib/decimal.cjs.map +1 -0
- package/lib/decimal.d.cts +197 -0
- package/lib/decimal.d.ts +197 -0
- package/lib/decimal.js +227 -0
- package/lib/decimal.js.map +1 -0
- package/lib/file-util-D09BvDYY.cjs +2 -0
- package/lib/file-util-D09BvDYY.cjs.map +1 -0
- package/lib/file-util-H-c_eQcd.js +140 -0
- package/lib/file-util-H-c_eQcd.js.map +1 -0
- package/lib/file-util.cjs +2 -0
- package/lib/file-util.cjs.map +1 -0
- package/lib/file-util.d.cts +119 -0
- package/lib/file-util.d.ts +119 -0
- package/lib/file-util.js +18 -0
- package/lib/file-util.js.map +1 -0
- package/lib/html-util-CcRJtzod.js +56 -0
- package/lib/html-util-CcRJtzod.js.map +1 -0
- package/lib/html-util-ClGIpzW1.cjs +2 -0
- package/lib/html-util-ClGIpzW1.cjs.map +1 -0
- package/lib/html-util.cjs +2 -0
- package/lib/html-util.cjs.map +1 -0
- package/lib/html-util.d.cts +84 -0
- package/lib/html-util.d.ts +84 -0
- package/lib/html-util.js +10 -0
- package/lib/html-util.js.map +1 -0
- package/lib/index.cjs +1 -1
- package/lib/index.d.cts +8 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +18 -2
- package/lib/index.js.map +1 -1
- package/lib/json-util-5mq7fsX_.cjs +4 -0
- package/lib/json-util-5mq7fsX_.cjs.map +1 -0
- package/lib/json-util-CF-O1b7m.js +149 -0
- package/lib/json-util-CF-O1b7m.js.map +1 -0
- package/lib/json-util.cjs +2 -0
- package/lib/json-util.cjs.map +1 -0
- package/lib/json-util.d.cts +58 -0
- package/lib/json-util.d.ts +58 -0
- package/lib/json-util.js +8 -0
- package/lib/json-util.js.map +1 -0
- package/lib/number-util-BA4KVFyF.js +198 -0
- package/lib/number-util-BA4KVFyF.js.map +1 -0
- package/lib/number-util-BaSf1wWH.cjs +2 -0
- package/lib/number-util-BaSf1wWH.cjs.map +1 -0
- package/lib/number-util.cjs +1 -1
- package/lib/number-util.d.cts +65 -51
- package/lib/number-util.d.ts +65 -51
- package/lib/number-util.js +19 -14
- package/lib/object-util-6uts5Xax.cjs +2 -0
- package/lib/object-util-6uts5Xax.cjs.map +1 -0
- package/lib/object-util-auzl09b5.js +204 -0
- package/lib/object-util-auzl09b5.js.map +1 -0
- package/lib/object-util.cjs +2 -0
- package/lib/object-util.cjs.map +1 -0
- package/lib/object-util.d.cts +157 -0
- package/lib/object-util.d.ts +157 -0
- package/lib/object-util.js +16 -0
- package/lib/object-util.js.map +1 -0
- package/lib/string-util-Cw0VgbIH.js +52 -0
- package/lib/string-util-Cw0VgbIH.js.map +1 -0
- package/lib/string-util-w2I5EYuY.cjs +2 -0
- package/lib/string-util-w2I5EYuY.cjs.map +1 -0
- package/lib/string-util.cjs +2 -0
- package/lib/string-util.cjs.map +1 -0
- package/lib/string-util.d.cts +51 -0
- package/lib/string-util.d.ts +51 -0
- package/lib/string-util.js +8 -0
- package/lib/string-util.js.map +1 -0
- package/package.json +26 -8
- package/src/crypto-util.ts +84 -0
- package/src/date-util.ts +448 -0
- package/src/decimal.ts +294 -0
- package/src/file-util.ts +281 -0
- package/src/html-util.ts +215 -0
- package/src/index.ts +8 -0
- package/src/json-util.ts +291 -0
- package/src/number-util.ts +141 -194
- package/src/object-util.ts +482 -0
- package/src/string-util.ts +115 -0
- package/lib/number-util-DHq-ux31.js +0 -253
- package/lib/number-util-DHq-ux31.js.map +0 -1
- package/lib/number-util-DiMi-j7B.cjs +0 -2
- package/lib/number-util-DiMi-j7B.cjs.map +0 -1
- package/lib/reg-exp-matcher.cjs +0 -2
- package/lib/reg-exp-matcher.cjs.map +0 -1
- package/lib/reg-exp-matcher.d.cts +0 -85
- package/lib/reg-exp-matcher.d.ts +0 -85
- package/lib/reg-exp-matcher.js +0 -94
- package/lib/reg-exp-matcher.js.map +0 -1
- package/src/reg-exp-matcher.ts +0 -154
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-util-D09BvDYY.cjs","sources":["../src/file-util.ts"],"sourcesContent":["/** 先頭バイトの署名から判定したファイルの種類 */\nexport interface FileType {\n /** 拡張子(ドットなし) */\n ext: string;\n /** MIMEタイプ */\n mime: string;\n}\n\n/** バイナリとして受け付ける値。Node.js の Buffer も ArrayBufferView として渡せる */\nexport type BinaryInput = ArrayBuffer | ArrayBufferView;\n\nconst DATA_URL_PATTERN = /^data:([^;,]+)?(?:;[^,]*)?;base64,(.*)$/s;\n\nconst DEFAULT_MIME_TYPE = 'application/octet-stream';\n\n/** 種類の判定に使う先頭の base64 の文字数。ZIP の中のエントリ名を探すため数KB分を見る */\nconst SIGNATURE_BASE64_LENGTH = 16384;\n\nconst SVG_PATTERN = /^\\ufeff?\\s*(?:<\\?xml[^>]*>\\s*)?(?:<!--[\\s\\S]*?-->\\s*)*(?:<!DOCTYPE[^>]*>\\s*)?<svg[\\s>]/i;\n\nconst OFFICE_FILE_TYPES: { entry: string; type: FileType; }[] = [\n { entry: 'word/', type: { ext: 'docx', mime: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' } },\n { entry: 'xl/', type: { ext: 'xlsx', mime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' } },\n { entry: 'ppt/', type: { ext: 'pptx', mime: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' } }\n];\n\nconst toBytes = (data: BinaryInput): Uint8Array => {\n return data instanceof ArrayBuffer ? new Uint8Array(data) : new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n};\n\nconst toArrayBuffer = (data: BinaryInput): ArrayBuffer => toBytes(data).slice().buffer as ArrayBuffer;\n\nconst startsWith = (bytes: Uint8Array, signature: number[] | string, offset: number = 0): boolean => {\n const expected = typeof signature === 'string' ? Array.from(signature, c => c.charCodeAt(0)) : signature;\n if (bytes.length < offset + expected.length) {\n return false;\n }\n return expected.every((value, i) => bytes[offset + i] === value);\n};\n\nconst detectFileType = (bytes: Uint8Array): FileType | null => {\n if (startsWith(bytes, [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) {\n return { ext: 'png', mime: 'image/png' };\n }\n if (startsWith(bytes, [0xFF, 0xD8, 0xFF])) {\n return { ext: 'jpg', mime: 'image/jpeg' };\n }\n if (startsWith(bytes, 'GIF87a') || startsWith(bytes, 'GIF89a')) {\n return { ext: 'gif', mime: 'image/gif' };\n }\n if (startsWith(bytes, 'RIFF') && startsWith(bytes, 'WEBP', 8)) {\n return { ext: 'webp', mime: 'image/webp' };\n }\n if (startsWith(bytes, 'BM')) {\n return { ext: 'bmp', mime: 'image/bmp' };\n }\n if (startsWith(bytes, [0x49, 0x49, 0x2A, 0x00]) || startsWith(bytes, [0x4D, 0x4D, 0x00, 0x2A])) {\n return { ext: 'tif', mime: 'image/tiff' };\n }\n if (startsWith(bytes, '%PDF-')) {\n return { ext: 'pdf', mime: 'application/pdf' };\n }\n if (startsWith(bytes, [0x50, 0x4B, 0x03, 0x04]) || startsWith(bytes, [0x50, 0x4B, 0x05, 0x06]) || startsWith(bytes, [0x50, 0x4B, 0x07, 0x08])) {\n // Office Open XML も ZIP なので、ZIP に含まれるエントリ名で見分ける\n const text = new TextDecoder('latin1').decode(bytes);\n const office = OFFICE_FILE_TYPES.find(a => text.includes(a.entry));\n return office ? office.type : { ext: 'zip', mime: 'application/zip' };\n }\n if (SVG_PATTERN.test(new TextDecoder().decode(bytes))) {\n return { ext: 'svg', mime: 'image/svg+xml' };\n }\n return null;\n};\n\n/**\n * base64 データと MIME タイプから DataURL を生成する\n *\n * @param {string} base64\n * @param {string} [mimeType] 省略時は 'application/octet-stream'\n * @returns {string}\n */\nexport function createDataURL(base64: string, mimeType?: string): string {\n return `data:${mimeType || DEFAULT_MIME_TYPE};base64,${base64}`;\n}\n\n/**\n * DataURL を base64 データと MIME タイプに分解する\n * MIME タイプは DataURL に書かれた値ではなく、データの先頭バイトから判定した値を返す。判定できない場合は DataURL に書かれた値、それもなければ 'application/octet-stream'\n * DataURL 形式でない文字列は base64 データとみなす\n *\n * @param {string} dataURL\n * @returns {[string, string]} [base64, mimeType]\n */\nexport function parseDataURL(dataURL: string): [string, string] {\n const matcher = DATA_URL_PATTERN.exec(dataURL);\n const base64 = matcher ? matcher[2] : dataURL;\n return [base64, analyzeFileType(base64)?.mime ?? matcher?.[1] ?? DEFAULT_MIME_TYPE];\n}\n\n/**\n * データを読み込み DataURL を返す\n * 文字列は、DataURL 形式ならそのまま、そうでなければ base64 データとみなす\n * Blob は Blob の type を、それがなければ先頭バイトから判定した MIME タイプを使う\n *\n * @param {string | Blob | BinaryInput} data\n * @returns {Promise<string>}\n */\nexport async function readAsDataURL(data: string | Blob | BinaryInput): Promise<string> {\n if (typeof data === 'string') {\n return DATA_URL_PATTERN.test(data) ? data : base64ToDataURL(data);\n }\n if (data instanceof Blob) {\n const buffer = await data.arrayBuffer();\n return arrayBufferToDataURL(buffer, data.type || analyzeFileType(buffer)?.mime);\n }\n return arrayBufferToDataURL(data, analyzeFileType(data)?.mime);\n}\n\n/**\n * データを読み込み ArrayBuffer を返す\n * 文字列は、DataURL 形式ならその base64 部分を、そうでなければ base64 データとみなして変換する\n *\n * @param {string | Blob | BinaryInput} data\n * @returns {Promise<ArrayBuffer>}\n */\nexport async function readAsArrayBuffer(data: string | Blob | BinaryInput): Promise<ArrayBuffer> {\n if (typeof data === 'string') {\n return dataURLToArrayBuffer(data);\n }\n if (data instanceof Blob) {\n return data.arrayBuffer();\n }\n return toArrayBuffer(data);\n}\n\n/**\n * base64 データを DataURL に変換する\n * MIME タイプを省略した場合はデータの先頭バイトから判定する\n *\n * @param {string} base64\n * @param {string} [mimeType]\n * @returns {string} base64 が空の場合はそのまま返す\n */\nexport function base64ToDataURL(base64: string, mimeType?: string): string {\n if (!base64) {\n return base64;\n }\n return createDataURL(base64, mimeType || analyzeFileType(base64)?.mime);\n}\n\n/**\n * base64 データを ArrayBuffer に変換する\n *\n * @param {string} base64\n * @returns {ArrayBuffer}\n */\nexport function base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * DataURL から base64 データを取り出す\n *\n * @param {string} dataURL\n * @returns {string} DataURL 形式でない場合はそのまま返す\n */\nexport function dataURLToBase64(dataURL: string): string {\n return DATA_URL_PATTERN.exec(dataURL)?.[2] ?? dataURL;\n}\n\n/**\n * DataURL を ArrayBuffer に変換する\n *\n * @param {string} dataURL\n * @returns {ArrayBuffer}\n */\nexport function dataURLToArrayBuffer(dataURL: string): ArrayBuffer {\n return base64ToArrayBuffer(dataURLToBase64(dataURL));\n}\n\n/**\n * バイナリを base64 データに変換する\n *\n * @param {BinaryInput} data\n * @returns {string}\n */\nexport function arrayBufferToBase64(data: BinaryInput): string {\n const bytes = toBytes(data);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * バイナリを DataURL に変換する\n *\n * @param {BinaryInput} data\n * @param {string} [mimeType] 省略時は 'application/octet-stream'\n * @returns {string}\n */\nexport function arrayBufferToDataURL(data: BinaryInput, mimeType?: string): string {\n return createDataURL(arrayBufferToBase64(data), mimeType);\n}\n\n/**\n * base64 データまたは DataURL が表すデータのバイト数を返す\n *\n * @param {string} data\n * @returns {number}\n */\nexport function calcSize(data: string): number {\n return dataURLToArrayBuffer(data).byteLength;\n}\n\n/**\n * 文字列またはバイナリを、BOM 付き UTF-16 の CSV の Blob にする\n * バイナリはすでに UTF-16LE で符号化されているものとして BOM だけを付ける\n *\n * @param {string | BinaryInput} data\n * @returns {Blob}\n */\nexport function convertUTF16withBOM(data: string | BinaryInput): Blob {\n if (!data) {\n return new Blob([]);\n }\n let parts: BlobPart[];\n if (typeof data === 'string') {\n const text = `\\ufeff${data}`;\n const codes = new Uint16Array(text.length);\n for (let i = 0; i < text.length; i++) {\n codes[i] = text.charCodeAt(i);\n }\n parts = [codes];\n } else {\n // 文字列で BOM を渡すと Blob が UTF-8 で符号化してしまうため、UTF-16LE の BOM をバイト列で付ける\n parts = [new Uint8Array([0xFF, 0xFE]), toArrayBuffer(data)];\n }\n return new Blob(parts, { type: 'text/csv;charset=utf-16;' });\n}\n\n/**\n * データの先頭バイトの署名からファイルの種類を判定する\n * 判定できる種類: PNG / JPEG / GIF / WebP / BMP / TIFF / SVG / PDF / ZIP / XLSX / DOCX / PPTX\n * 文字列は、DataURL 形式ならその base64 部分を、そうでなければ base64 データとみなす\n *\n * @param {string | BinaryInput} data\n * @returns {FileType | null} 判定できない場合は null\n */\nexport function analyzeFileType(data: string | BinaryInput): FileType | null {\n let bytes: Uint8Array;\n if (typeof data === 'string') {\n const base64 = dataURLToBase64(data).slice(0, SIGNATURE_BASE64_LENGTH);\n try {\n // 判定に必要な先頭だけを復号する。4文字単位で切らないと末尾がパディング不正になる\n bytes = toBytes(base64ToArrayBuffer(base64.slice(0, base64.length - base64.length % 4)));\n } catch (error) {\n // base64 として復号できない文字列は判定できない\n return null;\n }\n } else {\n bytes = toBytes(data);\n }\n return detectFileType(bytes);\n}\n\n/**\n * ファイル名に使えない文字(\\ / : * ? \" < > |)を取り除く\n *\n * @param {string} name\n * @returns {string}\n */\nexport function sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, '');\n}\n"],"names":["DATA_URL_PATTERN","DEFAULT_MIME_TYPE","SVG_PATTERN","OFFICE_FILE_TYPES","toBytes","data","toArrayBuffer","startsWith","bytes","signature","offset","expected","c","value","i","detectFileType","text","office","a","createDataURL","base64","mimeType","parseDataURL","dataURL","matcher","analyzeFileType","readAsDataURL","base64ToDataURL","buffer","arrayBufferToDataURL","readAsArrayBuffer","dataURLToArrayBuffer","base64ToArrayBuffer","binary","dataURLToBase64","arrayBufferToBase64","calcSize","convertUTF16withBOM","parts","codes","sanitizeFileName","name"],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
const a = /^data:([^;,]+)?(?:;[^,]*)?;base64,(.*)$/s, g = "application/octet-stream";
|
|
2
|
+
const h = /^\ufeff?\s*(?:<\?xml[^>]*>\s*)?(?:<!--[\s\S]*?-->\s*)*(?:<!DOCTYPE[^>]*>\s*)?<svg[\s>]/i, B = [
|
|
3
|
+
{ entry: "word/", type: { ext: "docx", mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" } },
|
|
4
|
+
{ entry: "xl/", type: { ext: "xlsx", mime: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" } },
|
|
5
|
+
{ entry: "ppt/", type: { ext: "pptx", mime: "application/vnd.openxmlformats-officedocument.presentationml.presentation" } }
|
|
6
|
+
], c = (e) => e instanceof ArrayBuffer ? new Uint8Array(e) : new Uint8Array(e.buffer, e.byteOffset, e.byteLength), y = (e) => c(e).slice().buffer, i = (e, t, r = 0) => {
|
|
7
|
+
const n = typeof t == "string" ? Array.from(t, (o) => o.charCodeAt(0)) : t;
|
|
8
|
+
return e.length < r + n.length ? !1 : n.every((o, T) => e[r + T] === o);
|
|
9
|
+
}, E = (e) => {
|
|
10
|
+
if (i(e, [137, 80, 78, 71, 13, 10, 26, 10]))
|
|
11
|
+
return { ext: "png", mime: "image/png" };
|
|
12
|
+
if (i(e, [255, 216, 255]))
|
|
13
|
+
return { ext: "jpg", mime: "image/jpeg" };
|
|
14
|
+
if (i(e, "GIF87a") || i(e, "GIF89a"))
|
|
15
|
+
return { ext: "gif", mime: "image/gif" };
|
|
16
|
+
if (i(e, "RIFF") && i(e, "WEBP", 8))
|
|
17
|
+
return { ext: "webp", mime: "image/webp" };
|
|
18
|
+
if (i(e, "BM"))
|
|
19
|
+
return { ext: "bmp", mime: "image/bmp" };
|
|
20
|
+
if (i(e, [73, 73, 42, 0]) || i(e, [77, 77, 0, 42]))
|
|
21
|
+
return { ext: "tif", mime: "image/tiff" };
|
|
22
|
+
if (i(e, "%PDF-"))
|
|
23
|
+
return { ext: "pdf", mime: "application/pdf" };
|
|
24
|
+
if (i(e, [80, 75, 3, 4]) || i(e, [80, 75, 5, 6]) || i(e, [80, 75, 7, 8])) {
|
|
25
|
+
const t = new TextDecoder("latin1").decode(e), r = B.find((n) => t.includes(n.entry));
|
|
26
|
+
return r ? r.type : { ext: "zip", mime: "application/zip" };
|
|
27
|
+
}
|
|
28
|
+
return h.test(new TextDecoder().decode(e)) ? { ext: "svg", mime: "image/svg+xml" } : null;
|
|
29
|
+
};
|
|
30
|
+
function u(e, t) {
|
|
31
|
+
return `data:${t || g};base64,${e}`;
|
|
32
|
+
}
|
|
33
|
+
function F(e) {
|
|
34
|
+
const t = a.exec(e), r = t ? t[2] : e;
|
|
35
|
+
return [r, f(r)?.mime ?? t?.[1] ?? g];
|
|
36
|
+
}
|
|
37
|
+
async function U(e) {
|
|
38
|
+
if (typeof e == "string")
|
|
39
|
+
return a.test(e) ? e : x(e);
|
|
40
|
+
if (e instanceof Blob) {
|
|
41
|
+
const t = await e.arrayBuffer();
|
|
42
|
+
return s(t, e.type || f(t)?.mime);
|
|
43
|
+
}
|
|
44
|
+
return s(e, f(e)?.mime);
|
|
45
|
+
}
|
|
46
|
+
async function w(e) {
|
|
47
|
+
return typeof e == "string" ? p(e) : e instanceof Blob ? e.arrayBuffer() : y(e);
|
|
48
|
+
}
|
|
49
|
+
function x(e, t) {
|
|
50
|
+
return e && u(e, t || f(e)?.mime);
|
|
51
|
+
}
|
|
52
|
+
function m(e) {
|
|
53
|
+
const t = atob(e), r = new Uint8Array(t.length);
|
|
54
|
+
for (let n = 0; n < t.length; n++)
|
|
55
|
+
r[n] = t.charCodeAt(n);
|
|
56
|
+
return r.buffer;
|
|
57
|
+
}
|
|
58
|
+
function l(e) {
|
|
59
|
+
return a.exec(e)?.[2] ?? e;
|
|
60
|
+
}
|
|
61
|
+
function p(e) {
|
|
62
|
+
return m(l(e));
|
|
63
|
+
}
|
|
64
|
+
function A(e) {
|
|
65
|
+
const t = c(e);
|
|
66
|
+
let r = "";
|
|
67
|
+
for (let n = 0; n < t.length; n++)
|
|
68
|
+
r += String.fromCharCode(t[n]);
|
|
69
|
+
return btoa(r);
|
|
70
|
+
}
|
|
71
|
+
function s(e, t) {
|
|
72
|
+
return u(A(e), t);
|
|
73
|
+
}
|
|
74
|
+
function _(e) {
|
|
75
|
+
return p(e).byteLength;
|
|
76
|
+
}
|
|
77
|
+
function b(e) {
|
|
78
|
+
if (!e)
|
|
79
|
+
return new Blob([]);
|
|
80
|
+
let t;
|
|
81
|
+
if (typeof e == "string") {
|
|
82
|
+
const r = `\uFEFF${e}`, n = new Uint16Array(r.length);
|
|
83
|
+
for (let o = 0; o < r.length; o++)
|
|
84
|
+
n[o] = r.charCodeAt(o);
|
|
85
|
+
t = [n];
|
|
86
|
+
} else
|
|
87
|
+
t = [new Uint8Array([255, 254]), y(e)];
|
|
88
|
+
return new Blob(t, { type: "text/csv;charset=utf-16;" });
|
|
89
|
+
}
|
|
90
|
+
function f(e) {
|
|
91
|
+
let t;
|
|
92
|
+
if (typeof e == "string") {
|
|
93
|
+
const r = l(e).slice(0, 16384);
|
|
94
|
+
try {
|
|
95
|
+
t = c(m(r.slice(0, r.length - r.length % 4)));
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
} else
|
|
100
|
+
t = c(e);
|
|
101
|
+
return E(t);
|
|
102
|
+
}
|
|
103
|
+
function d(e) {
|
|
104
|
+
return e.replace(/[\\/:*?"<>|]/g, "");
|
|
105
|
+
}
|
|
106
|
+
const L = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
107
|
+
__proto__: null,
|
|
108
|
+
analyzeFileType: f,
|
|
109
|
+
arrayBufferToBase64: A,
|
|
110
|
+
arrayBufferToDataURL: s,
|
|
111
|
+
base64ToArrayBuffer: m,
|
|
112
|
+
base64ToDataURL: x,
|
|
113
|
+
calcSize: _,
|
|
114
|
+
convertUTF16withBOM: b,
|
|
115
|
+
createDataURL: u,
|
|
116
|
+
dataURLToArrayBuffer: p,
|
|
117
|
+
dataURLToBase64: l,
|
|
118
|
+
parseDataURL: F,
|
|
119
|
+
readAsArrayBuffer: w,
|
|
120
|
+
readAsDataURL: U,
|
|
121
|
+
sanitizeFileName: d
|
|
122
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
123
|
+
export {
|
|
124
|
+
f as a,
|
|
125
|
+
A as b,
|
|
126
|
+
s as c,
|
|
127
|
+
m as d,
|
|
128
|
+
x as e,
|
|
129
|
+
L as f,
|
|
130
|
+
_ as g,
|
|
131
|
+
b as h,
|
|
132
|
+
u as i,
|
|
133
|
+
p as j,
|
|
134
|
+
l as k,
|
|
135
|
+
U as l,
|
|
136
|
+
F as p,
|
|
137
|
+
w as r,
|
|
138
|
+
d as s
|
|
139
|
+
};
|
|
140
|
+
//# sourceMappingURL=file-util-H-c_eQcd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-util-H-c_eQcd.js","sources":["../src/file-util.ts"],"sourcesContent":["/** 先頭バイトの署名から判定したファイルの種類 */\nexport interface FileType {\n /** 拡張子(ドットなし) */\n ext: string;\n /** MIMEタイプ */\n mime: string;\n}\n\n/** バイナリとして受け付ける値。Node.js の Buffer も ArrayBufferView として渡せる */\nexport type BinaryInput = ArrayBuffer | ArrayBufferView;\n\nconst DATA_URL_PATTERN = /^data:([^;,]+)?(?:;[^,]*)?;base64,(.*)$/s;\n\nconst DEFAULT_MIME_TYPE = 'application/octet-stream';\n\n/** 種類の判定に使う先頭の base64 の文字数。ZIP の中のエントリ名を探すため数KB分を見る */\nconst SIGNATURE_BASE64_LENGTH = 16384;\n\nconst SVG_PATTERN = /^\\ufeff?\\s*(?:<\\?xml[^>]*>\\s*)?(?:<!--[\\s\\S]*?-->\\s*)*(?:<!DOCTYPE[^>]*>\\s*)?<svg[\\s>]/i;\n\nconst OFFICE_FILE_TYPES: { entry: string; type: FileType; }[] = [\n { entry: 'word/', type: { ext: 'docx', mime: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' } },\n { entry: 'xl/', type: { ext: 'xlsx', mime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' } },\n { entry: 'ppt/', type: { ext: 'pptx', mime: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' } }\n];\n\nconst toBytes = (data: BinaryInput): Uint8Array => {\n return data instanceof ArrayBuffer ? new Uint8Array(data) : new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n};\n\nconst toArrayBuffer = (data: BinaryInput): ArrayBuffer => toBytes(data).slice().buffer as ArrayBuffer;\n\nconst startsWith = (bytes: Uint8Array, signature: number[] | string, offset: number = 0): boolean => {\n const expected = typeof signature === 'string' ? Array.from(signature, c => c.charCodeAt(0)) : signature;\n if (bytes.length < offset + expected.length) {\n return false;\n }\n return expected.every((value, i) => bytes[offset + i] === value);\n};\n\nconst detectFileType = (bytes: Uint8Array): FileType | null => {\n if (startsWith(bytes, [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A])) {\n return { ext: 'png', mime: 'image/png' };\n }\n if (startsWith(bytes, [0xFF, 0xD8, 0xFF])) {\n return { ext: 'jpg', mime: 'image/jpeg' };\n }\n if (startsWith(bytes, 'GIF87a') || startsWith(bytes, 'GIF89a')) {\n return { ext: 'gif', mime: 'image/gif' };\n }\n if (startsWith(bytes, 'RIFF') && startsWith(bytes, 'WEBP', 8)) {\n return { ext: 'webp', mime: 'image/webp' };\n }\n if (startsWith(bytes, 'BM')) {\n return { ext: 'bmp', mime: 'image/bmp' };\n }\n if (startsWith(bytes, [0x49, 0x49, 0x2A, 0x00]) || startsWith(bytes, [0x4D, 0x4D, 0x00, 0x2A])) {\n return { ext: 'tif', mime: 'image/tiff' };\n }\n if (startsWith(bytes, '%PDF-')) {\n return { ext: 'pdf', mime: 'application/pdf' };\n }\n if (startsWith(bytes, [0x50, 0x4B, 0x03, 0x04]) || startsWith(bytes, [0x50, 0x4B, 0x05, 0x06]) || startsWith(bytes, [0x50, 0x4B, 0x07, 0x08])) {\n // Office Open XML も ZIP なので、ZIP に含まれるエントリ名で見分ける\n const text = new TextDecoder('latin1').decode(bytes);\n const office = OFFICE_FILE_TYPES.find(a => text.includes(a.entry));\n return office ? office.type : { ext: 'zip', mime: 'application/zip' };\n }\n if (SVG_PATTERN.test(new TextDecoder().decode(bytes))) {\n return { ext: 'svg', mime: 'image/svg+xml' };\n }\n return null;\n};\n\n/**\n * base64 データと MIME タイプから DataURL を生成する\n *\n * @param {string} base64\n * @param {string} [mimeType] 省略時は 'application/octet-stream'\n * @returns {string}\n */\nexport function createDataURL(base64: string, mimeType?: string): string {\n return `data:${mimeType || DEFAULT_MIME_TYPE};base64,${base64}`;\n}\n\n/**\n * DataURL を base64 データと MIME タイプに分解する\n * MIME タイプは DataURL に書かれた値ではなく、データの先頭バイトから判定した値を返す。判定できない場合は DataURL に書かれた値、それもなければ 'application/octet-stream'\n * DataURL 形式でない文字列は base64 データとみなす\n *\n * @param {string} dataURL\n * @returns {[string, string]} [base64, mimeType]\n */\nexport function parseDataURL(dataURL: string): [string, string] {\n const matcher = DATA_URL_PATTERN.exec(dataURL);\n const base64 = matcher ? matcher[2] : dataURL;\n return [base64, analyzeFileType(base64)?.mime ?? matcher?.[1] ?? DEFAULT_MIME_TYPE];\n}\n\n/**\n * データを読み込み DataURL を返す\n * 文字列は、DataURL 形式ならそのまま、そうでなければ base64 データとみなす\n * Blob は Blob の type を、それがなければ先頭バイトから判定した MIME タイプを使う\n *\n * @param {string | Blob | BinaryInput} data\n * @returns {Promise<string>}\n */\nexport async function readAsDataURL(data: string | Blob | BinaryInput): Promise<string> {\n if (typeof data === 'string') {\n return DATA_URL_PATTERN.test(data) ? data : base64ToDataURL(data);\n }\n if (data instanceof Blob) {\n const buffer = await data.arrayBuffer();\n return arrayBufferToDataURL(buffer, data.type || analyzeFileType(buffer)?.mime);\n }\n return arrayBufferToDataURL(data, analyzeFileType(data)?.mime);\n}\n\n/**\n * データを読み込み ArrayBuffer を返す\n * 文字列は、DataURL 形式ならその base64 部分を、そうでなければ base64 データとみなして変換する\n *\n * @param {string | Blob | BinaryInput} data\n * @returns {Promise<ArrayBuffer>}\n */\nexport async function readAsArrayBuffer(data: string | Blob | BinaryInput): Promise<ArrayBuffer> {\n if (typeof data === 'string') {\n return dataURLToArrayBuffer(data);\n }\n if (data instanceof Blob) {\n return data.arrayBuffer();\n }\n return toArrayBuffer(data);\n}\n\n/**\n * base64 データを DataURL に変換する\n * MIME タイプを省略した場合はデータの先頭バイトから判定する\n *\n * @param {string} base64\n * @param {string} [mimeType]\n * @returns {string} base64 が空の場合はそのまま返す\n */\nexport function base64ToDataURL(base64: string, mimeType?: string): string {\n if (!base64) {\n return base64;\n }\n return createDataURL(base64, mimeType || analyzeFileType(base64)?.mime);\n}\n\n/**\n * base64 データを ArrayBuffer に変換する\n *\n * @param {string} base64\n * @returns {ArrayBuffer}\n */\nexport function base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\n/**\n * DataURL から base64 データを取り出す\n *\n * @param {string} dataURL\n * @returns {string} DataURL 形式でない場合はそのまま返す\n */\nexport function dataURLToBase64(dataURL: string): string {\n return DATA_URL_PATTERN.exec(dataURL)?.[2] ?? dataURL;\n}\n\n/**\n * DataURL を ArrayBuffer に変換する\n *\n * @param {string} dataURL\n * @returns {ArrayBuffer}\n */\nexport function dataURLToArrayBuffer(dataURL: string): ArrayBuffer {\n return base64ToArrayBuffer(dataURLToBase64(dataURL));\n}\n\n/**\n * バイナリを base64 データに変換する\n *\n * @param {BinaryInput} data\n * @returns {string}\n */\nexport function arrayBufferToBase64(data: BinaryInput): string {\n const bytes = toBytes(data);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n/**\n * バイナリを DataURL に変換する\n *\n * @param {BinaryInput} data\n * @param {string} [mimeType] 省略時は 'application/octet-stream'\n * @returns {string}\n */\nexport function arrayBufferToDataURL(data: BinaryInput, mimeType?: string): string {\n return createDataURL(arrayBufferToBase64(data), mimeType);\n}\n\n/**\n * base64 データまたは DataURL が表すデータのバイト数を返す\n *\n * @param {string} data\n * @returns {number}\n */\nexport function calcSize(data: string): number {\n return dataURLToArrayBuffer(data).byteLength;\n}\n\n/**\n * 文字列またはバイナリを、BOM 付き UTF-16 の CSV の Blob にする\n * バイナリはすでに UTF-16LE で符号化されているものとして BOM だけを付ける\n *\n * @param {string | BinaryInput} data\n * @returns {Blob}\n */\nexport function convertUTF16withBOM(data: string | BinaryInput): Blob {\n if (!data) {\n return new Blob([]);\n }\n let parts: BlobPart[];\n if (typeof data === 'string') {\n const text = `\\ufeff${data}`;\n const codes = new Uint16Array(text.length);\n for (let i = 0; i < text.length; i++) {\n codes[i] = text.charCodeAt(i);\n }\n parts = [codes];\n } else {\n // 文字列で BOM を渡すと Blob が UTF-8 で符号化してしまうため、UTF-16LE の BOM をバイト列で付ける\n parts = [new Uint8Array([0xFF, 0xFE]), toArrayBuffer(data)];\n }\n return new Blob(parts, { type: 'text/csv;charset=utf-16;' });\n}\n\n/**\n * データの先頭バイトの署名からファイルの種類を判定する\n * 判定できる種類: PNG / JPEG / GIF / WebP / BMP / TIFF / SVG / PDF / ZIP / XLSX / DOCX / PPTX\n * 文字列は、DataURL 形式ならその base64 部分を、そうでなければ base64 データとみなす\n *\n * @param {string | BinaryInput} data\n * @returns {FileType | null} 判定できない場合は null\n */\nexport function analyzeFileType(data: string | BinaryInput): FileType | null {\n let bytes: Uint8Array;\n if (typeof data === 'string') {\n const base64 = dataURLToBase64(data).slice(0, SIGNATURE_BASE64_LENGTH);\n try {\n // 判定に必要な先頭だけを復号する。4文字単位で切らないと末尾がパディング不正になる\n bytes = toBytes(base64ToArrayBuffer(base64.slice(0, base64.length - base64.length % 4)));\n } catch (error) {\n // base64 として復号できない文字列は判定できない\n return null;\n }\n } else {\n bytes = toBytes(data);\n }\n return detectFileType(bytes);\n}\n\n/**\n * ファイル名に使えない文字(\\ / : * ? \" < > |)を取り除く\n *\n * @param {string} name\n * @returns {string}\n */\nexport function sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, '');\n}\n"],"names":["DATA_URL_PATTERN","DEFAULT_MIME_TYPE","SVG_PATTERN","OFFICE_FILE_TYPES","toBytes","data","toArrayBuffer","startsWith","bytes","signature","offset","expected","c","value","i","detectFileType","text","office","a","createDataURL","base64","mimeType","parseDataURL","dataURL","matcher","analyzeFileType","readAsDataURL","base64ToDataURL","buffer","arrayBufferToDataURL","readAsArrayBuffer","dataURLToArrayBuffer","base64ToArrayBuffer","binary","dataURLToBase64","arrayBufferToBase64","calcSize","convertUTF16withBOM","parts","codes","sanitizeFileName","name"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./file-util-D09BvDYY.cjs");exports.analyzeFileType=a.analyzeFileType;exports.arrayBufferToBase64=a.arrayBufferToBase64;exports.arrayBufferToDataURL=a.arrayBufferToDataURL;exports.base64ToArrayBuffer=a.base64ToArrayBuffer;exports.base64ToDataURL=a.base64ToDataURL;exports.calcSize=a.calcSize;exports.convertUTF16withBOM=a.convertUTF16withBOM;exports.createDataURL=a.createDataURL;exports.dataURLToArrayBuffer=a.dataURLToArrayBuffer;exports.dataURLToBase64=a.dataURLToBase64;exports.parseDataURL=a.parseDataURL;exports.readAsArrayBuffer=a.readAsArrayBuffer;exports.readAsDataURL=a.readAsDataURL;exports.sanitizeFileName=a.sanitizeFileName;
|
|
2
|
+
//# sourceMappingURL=file-util.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-util.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/** 先頭バイトの署名から判定したファイルの種類 */
|
|
2
|
+
export interface FileType {
|
|
3
|
+
/** 拡張子(ドットなし) */
|
|
4
|
+
ext: string;
|
|
5
|
+
/** MIMEタイプ */
|
|
6
|
+
mime: string;
|
|
7
|
+
}
|
|
8
|
+
/** バイナリとして受け付ける値。Node.js の Buffer も ArrayBufferView として渡せる */
|
|
9
|
+
export type BinaryInput = ArrayBuffer | ArrayBufferView;
|
|
10
|
+
/**
|
|
11
|
+
* base64 データと MIME タイプから DataURL を生成する
|
|
12
|
+
*
|
|
13
|
+
* @param {string} base64
|
|
14
|
+
* @param {string} [mimeType] 省略時は 'application/octet-stream'
|
|
15
|
+
* @returns {string}
|
|
16
|
+
*/
|
|
17
|
+
export declare function createDataURL(base64: string, mimeType?: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* DataURL を base64 データと MIME タイプに分解する
|
|
20
|
+
* MIME タイプは DataURL に書かれた値ではなく、データの先頭バイトから判定した値を返す。判定できない場合は DataURL に書かれた値、それもなければ 'application/octet-stream'
|
|
21
|
+
* DataURL 形式でない文字列は base64 データとみなす
|
|
22
|
+
*
|
|
23
|
+
* @param {string} dataURL
|
|
24
|
+
* @returns {[string, string]} [base64, mimeType]
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseDataURL(dataURL: string): [string, string];
|
|
27
|
+
/**
|
|
28
|
+
* データを読み込み DataURL を返す
|
|
29
|
+
* 文字列は、DataURL 形式ならそのまま、そうでなければ base64 データとみなす
|
|
30
|
+
* Blob は Blob の type を、それがなければ先頭バイトから判定した MIME タイプを使う
|
|
31
|
+
*
|
|
32
|
+
* @param {string | Blob | BinaryInput} data
|
|
33
|
+
* @returns {Promise<string>}
|
|
34
|
+
*/
|
|
35
|
+
export declare function readAsDataURL(data: string | Blob | BinaryInput): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* データを読み込み ArrayBuffer を返す
|
|
38
|
+
* 文字列は、DataURL 形式ならその base64 部分を、そうでなければ base64 データとみなして変換する
|
|
39
|
+
*
|
|
40
|
+
* @param {string | Blob | BinaryInput} data
|
|
41
|
+
* @returns {Promise<ArrayBuffer>}
|
|
42
|
+
*/
|
|
43
|
+
export declare function readAsArrayBuffer(data: string | Blob | BinaryInput): Promise<ArrayBuffer>;
|
|
44
|
+
/**
|
|
45
|
+
* base64 データを DataURL に変換する
|
|
46
|
+
* MIME タイプを省略した場合はデータの先頭バイトから判定する
|
|
47
|
+
*
|
|
48
|
+
* @param {string} base64
|
|
49
|
+
* @param {string} [mimeType]
|
|
50
|
+
* @returns {string} base64 が空の場合はそのまま返す
|
|
51
|
+
*/
|
|
52
|
+
export declare function base64ToDataURL(base64: string, mimeType?: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* base64 データを ArrayBuffer に変換する
|
|
55
|
+
*
|
|
56
|
+
* @param {string} base64
|
|
57
|
+
* @returns {ArrayBuffer}
|
|
58
|
+
*/
|
|
59
|
+
export declare function base64ToArrayBuffer(base64: string): ArrayBuffer;
|
|
60
|
+
/**
|
|
61
|
+
* DataURL から base64 データを取り出す
|
|
62
|
+
*
|
|
63
|
+
* @param {string} dataURL
|
|
64
|
+
* @returns {string} DataURL 形式でない場合はそのまま返す
|
|
65
|
+
*/
|
|
66
|
+
export declare function dataURLToBase64(dataURL: string): string;
|
|
67
|
+
/**
|
|
68
|
+
* DataURL を ArrayBuffer に変換する
|
|
69
|
+
*
|
|
70
|
+
* @param {string} dataURL
|
|
71
|
+
* @returns {ArrayBuffer}
|
|
72
|
+
*/
|
|
73
|
+
export declare function dataURLToArrayBuffer(dataURL: string): ArrayBuffer;
|
|
74
|
+
/**
|
|
75
|
+
* バイナリを base64 データに変換する
|
|
76
|
+
*
|
|
77
|
+
* @param {BinaryInput} data
|
|
78
|
+
* @returns {string}
|
|
79
|
+
*/
|
|
80
|
+
export declare function arrayBufferToBase64(data: BinaryInput): string;
|
|
81
|
+
/**
|
|
82
|
+
* バイナリを DataURL に変換する
|
|
83
|
+
*
|
|
84
|
+
* @param {BinaryInput} data
|
|
85
|
+
* @param {string} [mimeType] 省略時は 'application/octet-stream'
|
|
86
|
+
* @returns {string}
|
|
87
|
+
*/
|
|
88
|
+
export declare function arrayBufferToDataURL(data: BinaryInput, mimeType?: string): string;
|
|
89
|
+
/**
|
|
90
|
+
* base64 データまたは DataURL が表すデータのバイト数を返す
|
|
91
|
+
*
|
|
92
|
+
* @param {string} data
|
|
93
|
+
* @returns {number}
|
|
94
|
+
*/
|
|
95
|
+
export declare function calcSize(data: string): number;
|
|
96
|
+
/**
|
|
97
|
+
* 文字列またはバイナリを、BOM 付き UTF-16 の CSV の Blob にする
|
|
98
|
+
* バイナリはすでに UTF-16LE で符号化されているものとして BOM だけを付ける
|
|
99
|
+
*
|
|
100
|
+
* @param {string | BinaryInput} data
|
|
101
|
+
* @returns {Blob}
|
|
102
|
+
*/
|
|
103
|
+
export declare function convertUTF16withBOM(data: string | BinaryInput): Blob;
|
|
104
|
+
/**
|
|
105
|
+
* データの先頭バイトの署名からファイルの種類を判定する
|
|
106
|
+
* 判定できる種類: PNG / JPEG / GIF / WebP / BMP / TIFF / SVG / PDF / ZIP / XLSX / DOCX / PPTX
|
|
107
|
+
* 文字列は、DataURL 形式ならその base64 部分を、そうでなければ base64 データとみなす
|
|
108
|
+
*
|
|
109
|
+
* @param {string | BinaryInput} data
|
|
110
|
+
* @returns {FileType | null} 判定できない場合は null
|
|
111
|
+
*/
|
|
112
|
+
export declare function analyzeFileType(data: string | BinaryInput): FileType | null;
|
|
113
|
+
/**
|
|
114
|
+
* ファイル名に使えない文字(\ / : * ? " < > |)を取り除く
|
|
115
|
+
*
|
|
116
|
+
* @param {string} name
|
|
117
|
+
* @returns {string}
|
|
118
|
+
*/
|
|
119
|
+
export declare function sanitizeFileName(name: string): string;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/** 先頭バイトの署名から判定したファイルの種類 */
|
|
2
|
+
export interface FileType {
|
|
3
|
+
/** 拡張子(ドットなし) */
|
|
4
|
+
ext: string;
|
|
5
|
+
/** MIMEタイプ */
|
|
6
|
+
mime: string;
|
|
7
|
+
}
|
|
8
|
+
/** バイナリとして受け付ける値。Node.js の Buffer も ArrayBufferView として渡せる */
|
|
9
|
+
export type BinaryInput = ArrayBuffer | ArrayBufferView;
|
|
10
|
+
/**
|
|
11
|
+
* base64 データと MIME タイプから DataURL を生成する
|
|
12
|
+
*
|
|
13
|
+
* @param {string} base64
|
|
14
|
+
* @param {string} [mimeType] 省略時は 'application/octet-stream'
|
|
15
|
+
* @returns {string}
|
|
16
|
+
*/
|
|
17
|
+
export declare function createDataURL(base64: string, mimeType?: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* DataURL を base64 データと MIME タイプに分解する
|
|
20
|
+
* MIME タイプは DataURL に書かれた値ではなく、データの先頭バイトから判定した値を返す。判定できない場合は DataURL に書かれた値、それもなければ 'application/octet-stream'
|
|
21
|
+
* DataURL 形式でない文字列は base64 データとみなす
|
|
22
|
+
*
|
|
23
|
+
* @param {string} dataURL
|
|
24
|
+
* @returns {[string, string]} [base64, mimeType]
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseDataURL(dataURL: string): [string, string];
|
|
27
|
+
/**
|
|
28
|
+
* データを読み込み DataURL を返す
|
|
29
|
+
* 文字列は、DataURL 形式ならそのまま、そうでなければ base64 データとみなす
|
|
30
|
+
* Blob は Blob の type を、それがなければ先頭バイトから判定した MIME タイプを使う
|
|
31
|
+
*
|
|
32
|
+
* @param {string | Blob | BinaryInput} data
|
|
33
|
+
* @returns {Promise<string>}
|
|
34
|
+
*/
|
|
35
|
+
export declare function readAsDataURL(data: string | Blob | BinaryInput): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* データを読み込み ArrayBuffer を返す
|
|
38
|
+
* 文字列は、DataURL 形式ならその base64 部分を、そうでなければ base64 データとみなして変換する
|
|
39
|
+
*
|
|
40
|
+
* @param {string | Blob | BinaryInput} data
|
|
41
|
+
* @returns {Promise<ArrayBuffer>}
|
|
42
|
+
*/
|
|
43
|
+
export declare function readAsArrayBuffer(data: string | Blob | BinaryInput): Promise<ArrayBuffer>;
|
|
44
|
+
/**
|
|
45
|
+
* base64 データを DataURL に変換する
|
|
46
|
+
* MIME タイプを省略した場合はデータの先頭バイトから判定する
|
|
47
|
+
*
|
|
48
|
+
* @param {string} base64
|
|
49
|
+
* @param {string} [mimeType]
|
|
50
|
+
* @returns {string} base64 が空の場合はそのまま返す
|
|
51
|
+
*/
|
|
52
|
+
export declare function base64ToDataURL(base64: string, mimeType?: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* base64 データを ArrayBuffer に変換する
|
|
55
|
+
*
|
|
56
|
+
* @param {string} base64
|
|
57
|
+
* @returns {ArrayBuffer}
|
|
58
|
+
*/
|
|
59
|
+
export declare function base64ToArrayBuffer(base64: string): ArrayBuffer;
|
|
60
|
+
/**
|
|
61
|
+
* DataURL から base64 データを取り出す
|
|
62
|
+
*
|
|
63
|
+
* @param {string} dataURL
|
|
64
|
+
* @returns {string} DataURL 形式でない場合はそのまま返す
|
|
65
|
+
*/
|
|
66
|
+
export declare function dataURLToBase64(dataURL: string): string;
|
|
67
|
+
/**
|
|
68
|
+
* DataURL を ArrayBuffer に変換する
|
|
69
|
+
*
|
|
70
|
+
* @param {string} dataURL
|
|
71
|
+
* @returns {ArrayBuffer}
|
|
72
|
+
*/
|
|
73
|
+
export declare function dataURLToArrayBuffer(dataURL: string): ArrayBuffer;
|
|
74
|
+
/**
|
|
75
|
+
* バイナリを base64 データに変換する
|
|
76
|
+
*
|
|
77
|
+
* @param {BinaryInput} data
|
|
78
|
+
* @returns {string}
|
|
79
|
+
*/
|
|
80
|
+
export declare function arrayBufferToBase64(data: BinaryInput): string;
|
|
81
|
+
/**
|
|
82
|
+
* バイナリを DataURL に変換する
|
|
83
|
+
*
|
|
84
|
+
* @param {BinaryInput} data
|
|
85
|
+
* @param {string} [mimeType] 省略時は 'application/octet-stream'
|
|
86
|
+
* @returns {string}
|
|
87
|
+
*/
|
|
88
|
+
export declare function arrayBufferToDataURL(data: BinaryInput, mimeType?: string): string;
|
|
89
|
+
/**
|
|
90
|
+
* base64 データまたは DataURL が表すデータのバイト数を返す
|
|
91
|
+
*
|
|
92
|
+
* @param {string} data
|
|
93
|
+
* @returns {number}
|
|
94
|
+
*/
|
|
95
|
+
export declare function calcSize(data: string): number;
|
|
96
|
+
/**
|
|
97
|
+
* 文字列またはバイナリを、BOM 付き UTF-16 の CSV の Blob にする
|
|
98
|
+
* バイナリはすでに UTF-16LE で符号化されているものとして BOM だけを付ける
|
|
99
|
+
*
|
|
100
|
+
* @param {string | BinaryInput} data
|
|
101
|
+
* @returns {Blob}
|
|
102
|
+
*/
|
|
103
|
+
export declare function convertUTF16withBOM(data: string | BinaryInput): Blob;
|
|
104
|
+
/**
|
|
105
|
+
* データの先頭バイトの署名からファイルの種類を判定する
|
|
106
|
+
* 判定できる種類: PNG / JPEG / GIF / WebP / BMP / TIFF / SVG / PDF / ZIP / XLSX / DOCX / PPTX
|
|
107
|
+
* 文字列は、DataURL 形式ならその base64 部分を、そうでなければ base64 データとみなす
|
|
108
|
+
*
|
|
109
|
+
* @param {string | BinaryInput} data
|
|
110
|
+
* @returns {FileType | null} 判定できない場合は null
|
|
111
|
+
*/
|
|
112
|
+
export declare function analyzeFileType(data: string | BinaryInput): FileType | null;
|
|
113
|
+
/**
|
|
114
|
+
* ファイル名に使えない文字(\ / : * ? " < > |)を取り除く
|
|
115
|
+
*
|
|
116
|
+
* @param {string} name
|
|
117
|
+
* @returns {string}
|
|
118
|
+
*/
|
|
119
|
+
export declare function sanitizeFileName(name: string): string;
|
package/lib/file-util.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { a as r, b as s, c as t, d as f, e as o, g as B, h as T, i as U, j as i, k as y, p as L, r as R, l as c, s as d } from "./file-util-H-c_eQcd.js";
|
|
2
|
+
export {
|
|
3
|
+
r as analyzeFileType,
|
|
4
|
+
s as arrayBufferToBase64,
|
|
5
|
+
t as arrayBufferToDataURL,
|
|
6
|
+
f as base64ToArrayBuffer,
|
|
7
|
+
o as base64ToDataURL,
|
|
8
|
+
B as calcSize,
|
|
9
|
+
T as convertUTF16withBOM,
|
|
10
|
+
U as createDataURL,
|
|
11
|
+
i as dataURLToArrayBuffer,
|
|
12
|
+
y as dataURLToBase64,
|
|
13
|
+
L as parseDataURL,
|
|
14
|
+
R as readAsArrayBuffer,
|
|
15
|
+
c as readAsDataURL,
|
|
16
|
+
d as sanitizeFileName
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=file-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-util.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { diffChars as u } from "diff";
|
|
2
|
+
import { f as h } from "./json-util-CF-O1b7m.js";
|
|
3
|
+
const g = /(<!--[\s\S]*?-->|<[^>]*>|&(?:#\d+|#x[\da-f]+|\w+);)/i, d = {
|
|
4
|
+
'"': """,
|
|
5
|
+
"&": "&",
|
|
6
|
+
"'": "'",
|
|
7
|
+
"<": "<",
|
|
8
|
+
">": ">"
|
|
9
|
+
}, a = (t) => t.replace(/["&'<>]/g, (r) => d[r]), b = (t) => typeof t == "string" ? t : Array.isArray(t) ? t.filter(Boolean).join(" ") : Object.keys(t).filter((r) => t[r]).join(" "), S = (t) => typeof t == "string" ? t : Object.entries(t).map(([r, e]) => `${r.startsWith("--") ? r : r.replace(/[A-Z]/g, (n) => `-${n.toLowerCase()}`)}: ${e}`).join("; "), c = (t, r) => {
|
|
10
|
+
let e = "";
|
|
11
|
+
const s = r?.class == null ? "" : b(r.class);
|
|
12
|
+
s && (e += ` class="${a(s)}"`);
|
|
13
|
+
const n = r?.style == null ? "" : S(r.style);
|
|
14
|
+
return n && (e += ` style="${a(n)}"`), `<span${e}>${a(t)}</span>`;
|
|
15
|
+
};
|
|
16
|
+
function p(t, r) {
|
|
17
|
+
if (!t)
|
|
18
|
+
return "";
|
|
19
|
+
const e = (s) => s.replace(/\r\n|\r|\n/g, "<br>").replace(/\t/g, " ").replace(/ /g, " ");
|
|
20
|
+
return r?.html ? t.split(g).map((s, n) => n % 2 === 1 ? s : e(s)).join("") : e(a(t));
|
|
21
|
+
}
|
|
22
|
+
function y(t, r) {
|
|
23
|
+
const { html: e, ...s } = r ?? {}, n = h(t, s);
|
|
24
|
+
return n == null ? "" : p(String(n), { html: e });
|
|
25
|
+
}
|
|
26
|
+
function j(t, r, e) {
|
|
27
|
+
if (!t)
|
|
28
|
+
return "";
|
|
29
|
+
const s = (i) => e?.html ? i : a(i);
|
|
30
|
+
if (!r)
|
|
31
|
+
return s(t);
|
|
32
|
+
const n = r.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"), o = new RegExp(`(${n})`, e?.caseInsensitive ? "i" : ""), f = (i) => i.split(o).map((l, m) => m % 2 === 0 ? s(l) : c(l, e)).join("");
|
|
33
|
+
return e?.html ? t.split(g).map((i, l) => l % 2 === 1 ? i : f(i)).join("") : f(t);
|
|
34
|
+
}
|
|
35
|
+
function $(t, r, e) {
|
|
36
|
+
const s = u(t ?? "", r ?? "", { ignoreCase: e?.ignoreCase });
|
|
37
|
+
let n = "";
|
|
38
|
+
for (const o of s)
|
|
39
|
+
o.added ? n += c(o.value, e?.added) : o.removed ? n += c(o.value, e?.removed) : n += c(o.value, e?.same);
|
|
40
|
+
return n;
|
|
41
|
+
}
|
|
42
|
+
const O = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
43
|
+
__proto__: null,
|
|
44
|
+
diffForWeb: $,
|
|
45
|
+
formatJsonStringForWeb: y,
|
|
46
|
+
formatStringForWeb: p,
|
|
47
|
+
highlightWord: j
|
|
48
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
49
|
+
export {
|
|
50
|
+
p as a,
|
|
51
|
+
j as b,
|
|
52
|
+
$ as d,
|
|
53
|
+
y as f,
|
|
54
|
+
O as h
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=html-util-CcRJtzod.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-util-CcRJtzod.js","sources":["../src/html-util.ts"],"sourcesContent":["import { diffChars } from 'diff';\nimport { formatJsonString } from './json-util';\nimport type { FormatJsonStringOptions } from './json-util';\n\n/**\n * class属性に指定する値\n * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する\n */\nexport type HtmlClassValue = string | string[] | Record<string, boolean>;\n\n/**\n * style属性に指定する値\n * Recordのキーはキャメルケースをケバブケースに変換する。数値には単位を付けない\n */\nexport type HtmlStyleValue = string | Record<string, string | number>;\n\n/**\n * 生成するタグに付与する属性\n */\nexport interface HtmlTagOptions {\n class?: HtmlClassValue;\n style?: HtmlStyleValue;\n}\n\nconst HTML_TOKEN = /(<!--[\\s\\S]*?-->|<[^>]*>|&(?:#\\d+|#x[\\da-f]+|\\w+);)/i;\n\nconst HTML_ESCAPE_CHARS: Record<string, string> = {\n '\"': '"',\n '&': '&',\n '\\'': ''',\n '<': '<',\n '>': '>'\n};\n\nconst escapeHtml = (str: string): string => str.replace(/[\"&'<>]/g, (c) => HTML_ESCAPE_CHARS[c]);\n\nconst toClassString = (value: HtmlClassValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.filter(Boolean).join(' ');\n }\n return Object.keys(value).filter(key => value[key]).join(' ');\n};\n\nconst toStyleString = (value: HtmlStyleValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n return Object.entries(value)\n .map(([key, v]) => {\n // カスタムプロパティ(--xxx)は大文字小文字を区別するため変換しない\n const property = key.startsWith('--') ? key : key.replace(/[A-Z]/g, c => `-${c.toLowerCase()}`);\n return `${property}: ${v}`;\n })\n .join('; ');\n};\n\n/**\n * 値をエスケープしたspanタグを返す\n *\n * @param {string} value\n * @param {HtmlTagOptions} [options]\n * @returns {string}\n */\nconst toSpan = (value: string, options?: HtmlTagOptions): string => {\n let attributes = '';\n const className = options?.class == null ? '' : toClassString(options.class);\n if (className) {\n attributes += ` class=\"${escapeHtml(className)}\"`;\n }\n const style = options?.style == null ? '' : toStyleString(options.style);\n if (style) {\n attributes += ` style=\"${escapeHtml(style)}\"`;\n }\n return `<span${attributes}>${escapeHtml(value)}</span>`;\n};\n\n/**\n * 文字列をWEB表示用にフォーマットする\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * @param {string | null | undefined} str\n * @param {*} [options]\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatStringForWeb(str: string | null | undefined, options?: {\n html?: boolean;\n}): string {\n if (!str) {\n return '';\n }\n\n const formatText = (text: string): string => text\n .replace(/\\r\\n|\\r|\\n/g, '<br>')\n .replace(/\\t/g, ' ')\n .replace(/ /g, ' ');\n\n if (options?.html) {\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをフォーマットする\n return str\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : formatText(segment))\n .join('');\n }\n\n return formatText(escapeHtml(str));\n}\n\n/**\n * 値を整形したJSON文字列にしてWEB表示用にフォーマットする\n * formatJsonStringで整形した文字列をformatStringForWebで変換する\n *\n * @param {any} value\n * @param {*} [options] formatJsonStringのオプションに以下を加えたもの\n * ├ html boolean trueを指定した場合、文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {\n html?: boolean;\n}): string {\n const { html, ...formatOptions } = options ?? {};\n const json = formatJsonString(value, formatOptions);\n return json == null ? '' : formatStringForWeb(String(json), { html });\n}\n\n/**\n * 文字列の中で一致したワードをspanタグで囲んだHTML文字列を返す\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * 例)\n * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });\n * → 'This is a <span class=\"highlight\">test</span> message'\n *\n * @param {string | null | undefined} value\n * @param {string | null | undefined} word\n * @param {*} [options] spanタグに付与するclass, styleのほか、以下を指定できる\n * ├ class string | string[] | Record<string, boolean>\n * ├ style string | Record<string, string | number>\n * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function highlightWord(\n value: string | null | undefined,\n word: string | null | undefined,\n options?: HtmlTagOptions & {\n caseInsensitive?: boolean;\n html?: boolean;\n }\n): string {\n if (!value) {\n return '';\n }\n\n const toHtml = (text: string): string => options?.html ? text : escapeHtml(text);\n if (!word) {\n return toHtml(value);\n }\n\n const pattern = word.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n const regex = new RegExp(`(${pattern})`, options?.caseInsensitive ? 'i' : '');\n // キャプチャグループで分割すると、奇数番目の要素が一致した部分になる\n const highlight = (text: string): string => text\n .split(regex)\n .map((part, i) => i % 2 === 0 ? toHtml(part) : toSpan(part, options))\n .join('');\n\n if (!options?.html) {\n return highlight(value);\n }\n\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをハイライトする\n return value\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : highlight(segment))\n .join('');\n}\n\n/**\n * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す\n * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる\n * 入力文字列はプレーンなテキストであるとみなす\n * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる\n *\n * @param {string | null | undefined} text1 比較元の文字列\n * @param {string | null | undefined} text2 比較される文字列(通常、入力値はこちらに渡す)\n * @param {*} [options]\n * ├ ignoreCase boolean trueを指定した場合、大文字小文字を区別しない\n * ├ added HtmlTagOptions text2で追加された部分のspanタグに付与する属性\n * ├ removed HtmlTagOptions text2で削除された部分のspanタグに付与する属性\n * ├ same HtmlTagOptions 一致した部分のspanタグに付与する属性\n * @returns {string}\n */\nexport function diffForWeb(text1: string | null | undefined, text2: string | null | undefined, options?: {\n ignoreCase?: boolean;\n added?: HtmlTagOptions;\n removed?: HtmlTagOptions;\n same?: HtmlTagOptions;\n}): string {\n const changes = diffChars(text1 ?? '', text2 ?? '', { ignoreCase: options?.ignoreCase });\n let html = '';\n for (const change of changes) {\n if (change.added) {\n html += toSpan(change.value, options?.added);\n } else if (change.removed) {\n html += toSpan(change.value, options?.removed);\n } else {\n html += toSpan(change.value, options?.same);\n }\n }\n return html;\n}\n"],"names":["HTML_TOKEN","HTML_ESCAPE_CHARS","escapeHtml","str","c","toClassString","value","key","toStyleString","v","toSpan","options","attributes","className","style","formatStringForWeb","formatText","text","segment","i","formatJsonStringForWeb","html","formatOptions","json","formatJsonString","highlightWord","word","toHtml","pattern","regex","highlight","part","diffForWeb","text1","text2","changes","diffChars","change"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const b=require("diff"),S=require("./json-util-5mq7fsX_.cjs"),m=/(<!--[\s\S]*?-->|<[^>]*>|&(?:#\d+|#x[\da-f]+|\w+);)/i,j={'"':""","&":"&","'":"'","<":"<",">":">"},l=t=>t.replace(/["&'<>]/g,r=>j[r]),y=t=>typeof t=="string"?t:Array.isArray(t)?t.filter(Boolean).join(" "):Object.keys(t).filter(r=>t[r]).join(" "),$=t=>typeof t=="string"?t:Object.entries(t).map(([r,e])=>`${r.startsWith("--")?r:r.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`)}: ${e}`).join("; "),a=(t,r)=>{let e="";const s=r?.class==null?"":y(r.class);s&&(e+=` class="${l(s)}"`);const n=r?.style==null?"":$(r.style);return n&&(e+=` style="${l(n)}"`),`<span${e}>${l(t)}</span>`};function f(t,r){if(!t)return"";const e=s=>s.replace(/\r\n|\r|\n/g,"<br>").replace(/\t/g," ").replace(/ /g," ");return r?.html?t.split(m).map((s,n)=>n%2===1?s:e(s)).join(""):e(l(t))}function u(t,r){const{html:e,...s}=r??{},n=S.formatJsonString(t,s);return n==null?"":f(String(n),{html:e})}function p(t,r,e){if(!t)return"";const s=i=>e?.html?i:l(i);if(!r)return s(t);const n=r.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d"),o=new RegExp(`(${n})`,e?.caseInsensitive?"i":""),g=i=>i.split(o).map((c,d)=>d%2===0?s(c):a(c,e)).join("");return e?.html?t.split(m).map((i,c)=>c%2===1?i:g(i)).join(""):g(t)}function h(t,r,e){const s=b.diffChars(t??"",r??"",{ignoreCase:e?.ignoreCase});let n="";for(const o of s)o.added?n+=a(o.value,e?.added):o.removed?n+=a(o.value,e?.removed):n+=a(o.value,e?.same);return n}const W=Object.freeze(Object.defineProperty({__proto__:null,diffForWeb:h,formatJsonStringForWeb:u,formatStringForWeb:f,highlightWord:p},Symbol.toStringTag,{value:"Module"}));exports.diffForWeb=h;exports.formatJsonStringForWeb=u;exports.formatStringForWeb=f;exports.highlightWord=p;exports.htmlUtil=W;
|
|
2
|
+
//# sourceMappingURL=html-util-ClGIpzW1.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-util-ClGIpzW1.cjs","sources":["../src/html-util.ts"],"sourcesContent":["import { diffChars } from 'diff';\nimport { formatJsonString } from './json-util';\nimport type { FormatJsonStringOptions } from './json-util';\n\n/**\n * class属性に指定する値\n * 配列は要素を空白区切りで連結し、Recordは値がtrueのキーだけを連結する\n */\nexport type HtmlClassValue = string | string[] | Record<string, boolean>;\n\n/**\n * style属性に指定する値\n * Recordのキーはキャメルケースをケバブケースに変換する。数値には単位を付けない\n */\nexport type HtmlStyleValue = string | Record<string, string | number>;\n\n/**\n * 生成するタグに付与する属性\n */\nexport interface HtmlTagOptions {\n class?: HtmlClassValue;\n style?: HtmlStyleValue;\n}\n\nconst HTML_TOKEN = /(<!--[\\s\\S]*?-->|<[^>]*>|&(?:#\\d+|#x[\\da-f]+|\\w+);)/i;\n\nconst HTML_ESCAPE_CHARS: Record<string, string> = {\n '\"': '"',\n '&': '&',\n '\\'': ''',\n '<': '<',\n '>': '>'\n};\n\nconst escapeHtml = (str: string): string => str.replace(/[\"&'<>]/g, (c) => HTML_ESCAPE_CHARS[c]);\n\nconst toClassString = (value: HtmlClassValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n if (Array.isArray(value)) {\n return value.filter(Boolean).join(' ');\n }\n return Object.keys(value).filter(key => value[key]).join(' ');\n};\n\nconst toStyleString = (value: HtmlStyleValue): string => {\n if (typeof value === 'string') {\n return value;\n }\n return Object.entries(value)\n .map(([key, v]) => {\n // カスタムプロパティ(--xxx)は大文字小文字を区別するため変換しない\n const property = key.startsWith('--') ? key : key.replace(/[A-Z]/g, c => `-${c.toLowerCase()}`);\n return `${property}: ${v}`;\n })\n .join('; ');\n};\n\n/**\n * 値をエスケープしたspanタグを返す\n *\n * @param {string} value\n * @param {HtmlTagOptions} [options]\n * @returns {string}\n */\nconst toSpan = (value: string, options?: HtmlTagOptions): string => {\n let attributes = '';\n const className = options?.class == null ? '' : toClassString(options.class);\n if (className) {\n attributes += ` class=\"${escapeHtml(className)}\"`;\n }\n const style = options?.style == null ? '' : toStyleString(options.style);\n if (style) {\n attributes += ` style=\"${escapeHtml(style)}\"`;\n }\n return `<span${attributes}>${escapeHtml(value)}</span>`;\n};\n\n/**\n * 文字列をWEB表示用にフォーマットする\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * @param {string | null | undefined} str\n * @param {*} [options]\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatStringForWeb(str: string | null | undefined, options?: {\n html?: boolean;\n}): string {\n if (!str) {\n return '';\n }\n\n const formatText = (text: string): string => text\n .replace(/\\r\\n|\\r|\\n/g, '<br>')\n .replace(/\\t/g, ' ')\n .replace(/ /g, ' ');\n\n if (options?.html) {\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをフォーマットする\n return str\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : formatText(segment))\n .join('');\n }\n\n return formatText(escapeHtml(str));\n}\n\n/**\n * 値を整形したJSON文字列にしてWEB表示用にフォーマットする\n * formatJsonStringで整形した文字列をformatStringForWebで変換する\n *\n * @param {any} value\n * @param {*} [options] formatJsonStringのオプションに以下を加えたもの\n * ├ html boolean trueを指定した場合、文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function formatJsonStringForWeb(value: any, options?: FormatJsonStringOptions & {\n html?: boolean;\n}): string {\n const { html, ...formatOptions } = options ?? {};\n const json = formatJsonString(value, formatOptions);\n return json == null ? '' : formatStringForWeb(String(json), { html });\n}\n\n/**\n * 文字列の中で一致したワードをspanタグで囲んだHTML文字列を返す\n * オプションのhtmlにより、入力文字列がHTMLなのかプレーンテキストなのかを指定可能\n *\n * 例)\n * HtmlUtil.highlightWord('This is a test message', 'test', { class: 'highlight' });\n * → 'This is a <span class=\"highlight\">test</span> message'\n *\n * @param {string | null | undefined} value\n * @param {string | null | undefined} word\n * @param {*} [options] spanタグに付与するclass, styleのほか、以下を指定できる\n * ├ class string | string[] | Record<string, boolean>\n * ├ style string | Record<string, string | number>\n * ├ caseInsensitive boolean trueを指定した場合、大文字小文字を区別しない\n * ├ html boolean trueを指定した場合、入力された文字列をHTMLとして扱う\n * @returns {string}\n */\nexport function highlightWord(\n value: string | null | undefined,\n word: string | null | undefined,\n options?: HtmlTagOptions & {\n caseInsensitive?: boolean;\n html?: boolean;\n }\n): string {\n if (!value) {\n return '';\n }\n\n const toHtml = (text: string): string => options?.html ? text : escapeHtml(text);\n if (!word) {\n return toHtml(value);\n }\n\n const pattern = word.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n const regex = new RegExp(`(${pattern})`, options?.caseInsensitive ? 'i' : '');\n // キャプチャグループで分割すると、奇数番目の要素が一致した部分になる\n const highlight = (text: string): string => text\n .split(regex)\n .map((part, i) => i % 2 === 0 ? toHtml(part) : toSpan(part, options))\n .join('');\n\n if (!options?.html) {\n return highlight(value);\n }\n\n // 奇数番目がタグ・コメント・文字参照。偶数番目のテキスト部分だけをハイライトする\n return value\n .split(HTML_TOKEN)\n .map((segment, i) => i % 2 === 1 ? segment : highlight(segment))\n .join('');\n}\n\n/**\n * 文字列を1文字ずつ比較し、差分をspanタグで囲んだHTML文字列を返す\n * 追加・削除・一致の部分ごとに、spanタグに付与するclass, styleを指定できる\n * 入力文字列はプレーンなテキストであるとみなす\n * 出力される文字列は、diffで埋め込まれるHTMLタグ以外はHTMLエスケープされ、HTMLセーフな文字列となる\n *\n * @param {string | null | undefined} text1 比較元の文字列\n * @param {string | null | undefined} text2 比較される文字列(通常、入力値はこちらに渡す)\n * @param {*} [options]\n * ├ ignoreCase boolean trueを指定した場合、大文字小文字を区別しない\n * ├ added HtmlTagOptions text2で追加された部分のspanタグに付与する属性\n * ├ removed HtmlTagOptions text2で削除された部分のspanタグに付与する属性\n * ├ same HtmlTagOptions 一致した部分のspanタグに付与する属性\n * @returns {string}\n */\nexport function diffForWeb(text1: string | null | undefined, text2: string | null | undefined, options?: {\n ignoreCase?: boolean;\n added?: HtmlTagOptions;\n removed?: HtmlTagOptions;\n same?: HtmlTagOptions;\n}): string {\n const changes = diffChars(text1 ?? '', text2 ?? '', { ignoreCase: options?.ignoreCase });\n let html = '';\n for (const change of changes) {\n if (change.added) {\n html += toSpan(change.value, options?.added);\n } else if (change.removed) {\n html += toSpan(change.value, options?.removed);\n } else {\n html += toSpan(change.value, options?.same);\n }\n }\n return html;\n}\n"],"names":["HTML_TOKEN","HTML_ESCAPE_CHARS","escapeHtml","str","c","toClassString","value","key","toStyleString","v","toSpan","options","attributes","className","style","formatStringForWeb","formatText","text","segment","i","formatJsonStringForWeb","html","formatOptions","json","formatJsonString","highlightWord","word","toHtml","pattern","regex","highlight","part","diffForWeb","text1","text2","changes","diffChars","change"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("diff");require("./json-util-5mq7fsX_.cjs");const r=require("./html-util-ClGIpzW1.cjs");exports.diffForWeb=r.diffForWeb;exports.formatJsonStringForWeb=r.formatJsonStringForWeb;exports.formatStringForWeb=r.formatStringForWeb;exports.highlightWord=r.highlightWord;
|
|
2
|
+
//# sourceMappingURL=html-util.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-util.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|