@zyzgroup/core-web 0.0.4 → 0.0.5
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/dist/zyzgroup_core_web.iife.js +2 -2
- package/dist/zyzgroup_core_web.iife.js.map +1 -1
- package/dist/zyzgroup_core_web.js +177 -159
- package/dist/zyzgroup_core_web.js.map +1 -1
- package/dist/zyzgroup_core_web.umd.cjs +2 -2
- package/dist/zyzgroup_core_web.umd.cjs.map +1 -1
- package/package.json +6 -5
- package/types/env.d.ts +3 -0
- package/types/env.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zyzgroup_core_web.umd.cjs","sources":["../src/error.ts","../src/file.ts","../src/onDocumentReady.ts","../src/microTask.ts","../src/patchDOM.ts","../src/cookie.js","../src/websocket.js","../src/position.ts","../src/mouse.js","../src/env.js","../src/rem.js","../src/url.js","../src/theme.ts","../src/DOMKeyboardKeyCode.ts","../src/dom.js","../src/canvas.js","../src/image.js","../src/Canvas2Image.ts","../src/fetch.js"],"sourcesContent":["export class BaseError extends Error {\n cause?: Error;\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = this.constructor.name;\n }\n}\n\nexport class EnvironmentError extends BaseError {\n constructor() {\n super(\"This is not a browser environment\");\n }\n}\n\nexport class FileSelectCancelError extends BaseError {\n constructor() {\n super(\"Cancel select\");\n }\n}\n\nexport class IllegalFileError extends BaseError {\n accepts: string[];\n\n constructor(accepts: string[]) {\n super(`Please select files in ${accepts} format`);\n this.accepts = accepts;\n }\n}\n","import {\n EnvironmentError,\n FileSelectCancelError,\n IllegalFileError\n} from \"./error\";\n\n// <input type=\"file\" id=\"input\">\n// <input type=\"file\" id=\"input\" multiple accept=\"image/*\" style=\"display:none\" name=\"photos[]\">\n// <label for=\"input\">Select some files</label>\n// input css :focus :focus-within\nexport function handleInputFiles(\n el: HTMLInputElement,\n cb: (files: FileList | null) => any\n) {\n el.addEventListener(\n \"change\",\n function () {\n cb(el.files);\n },\n false\n );\n}\n\nexport function handleDragAndDropFiles(\n dropZoneEl: HTMLElement,\n cb: (files: FileList | null) => any\n) {\n // dragover dragenter dragend drop\n dropZoneEl.addEventListener(\n \"dragover\",\n function (e) {\n e.stopPropagation();\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"copy\";\n },\n false\n );\n dropZoneEl.addEventListener(\n \"drop\",\n function (e) {\n e.stopPropagation();\n e.preventDefault();\n if (e.dataTransfer) cb(e.dataTransfer.files);\n },\n false\n );\n}\n\n/**\n * 选择系统文件\n *\n * @param accepts 可选文件后缀\n * @param multiple 是否多选\n * @returns\n */\nexport const selectFile = (\n accepts: string[] = [\"*\"],\n multiple?: boolean\n): Promise<File[]> => {\n if (!globalThis.document || !(globalThis.document instanceof Document)) {\n throw new EnvironmentError();\n }\n const inputElement = globalThis.document.createElement(\"input\");\n inputElement.setAttribute(\"type\", \"file\");\n inputElement.setAttribute(\"visibility\", \"hidden\");\n if (Array.isArray(accepts) && accepts.length > 0) {\n inputElement.setAttribute(\"accept\", accepts.join(\",\"));\n }\n if (multiple) {\n inputElement.setAttribute(\"multiple\", \"true\");\n }\n inputElement.click();\n\n return new Promise((resolve, reject) => {\n globalThis.addEventListener(\n \"focus\",\n () => {\n setTimeout(() => {\n if (!inputElement.files || inputElement.files?.length === 0) {\n reject(new FileSelectCancelError());\n }\n }, 1000);\n },\n { once: true }\n );\n inputElement.addEventListener(\"change\", () => {\n if (!inputElement.files || inputElement.files?.length === 0) {\n reject(new FileSelectCancelError());\n } else {\n const files = Array.from(inputElement.files);\n if (illegalFiles(files)) {\n reject(new IllegalFileError(accepts));\n }\n resolve(files);\n }\n });\n });\n\n function illegalFiles(files: File[]): boolean {\n return (\n !accepts.includes(\"*\") &&\n files.some((file) => !accepts.includes(`.${getFileExtension(file)}`))\n );\n }\n};\n\nexport interface FileHandler {\n (fileRender: FileReader): void;\n}\n\nexport const readeFile = <T extends string | ArrayBuffer | null>(\n fileHandler: FileHandler\n): Promise<T> => {\n const reader = new FileReader();\n return new Promise((resolve, reject) => {\n reader.addEventListener(\n \"progress\",\n (event: FileReaderEventMap[\"progress\"]) => {\n const size = \"(\" + Math.floor(event.total / 1000) + \" KB)\";\n const progress = Math.floor((event.loaded / event.total) * 100) + \"%\";\n console.log(`Loading size: ${size} progress: ${progress}`);\n }\n );\n reader.addEventListener(\"load\", (event: FileReaderEventMap[\"load\"]) => {\n resolve(event.target?.result as T);\n });\n reader.addEventListener(\"error\", (event: FileReaderEventMap[\"error\"]) => {\n reject(event);\n });\n fileHandler(reader);\n // reader.readAsDataURL(file);\n // reader.readAsBinaryString(file);\n });\n};\n\n/**\n * 获取文件后缀\n *\n * @param file 文件或文件名\n * @returns\n */\nexport const getFileExtension = (file: File | string): string => {\n let fileName: string;\n if (file instanceof File) {\n fileName = file.name;\n } else {\n fileName = file;\n }\n return fileName.match(/\\.([0-9a-z]+)(?:[\\\\?#]|$)/i)![1] ?? \"\";\n};\n\nexport const isImage = (file: File): boolean => {\n return /^image\\//.test(file.type);\n};\n\nexport const isVideo = (file: File): boolean => {\n return /^video\\//.test(file.type);\n};\n\nexport const isAudio = (file: File): boolean => {\n return /^audio\\//.test(file.type);\n};\n\nexport const isWordDocument = (file: File): boolean => {\n return /^application\\/(?:vnd\\.openxmlformats-officedocument\\.wordprocessingml\\.document|msword|vnd\\.ms-word\\.document\\.macroenabled\\.12|vnd\\.openxmlformats-officedocument\\.wordprocessingml\\.template|vnd\\.ms-word\\.template\\.macroenabled\\.12)$/.test(\n file.type\n );\n};\n\nexport const isExcelDocument = (file: File): boolean => {\n return /^application\\/(?:vnd\\.openxmlformats-officedocument\\.spreadsheetml\\.sheet|vnd\\.ms-excel|vnd\\.ms-excel\\.sheet\\.macroenabled\\.12|vnd\\.openxmlformats-officedocument\\.spreadsheetml\\.template|vnd\\.ms-excel\\.template\\.macroenabled\\.12)$/.test(\n file.type\n );\n};\n\nexport const isPowerPointDocument = (file: File): boolean => {\n return /^application\\/(?:vnd\\.ms-powerpoint|vnd\\.openxmlformats-officedocument\\.presentationml\\.presentation|vnd\\.ms-powerpoint\\.presentation\\.macroenabled\\.12|vnd\\.openxmlformats-officedocument\\.presentationml\\.template|vnd\\.ms-powerpoint\\.template\\.macroenabled\\.12)$/.test(\n file.type\n );\n};\n\nexport const isJsonDocument = (file: File): boolean => {\n return /^application\\/json$/.test(file.type);\n};\n\nexport const isXmlDocument = (file: File): boolean => {\n return /^(?:application|text)\\/(?:xml|xhtml\\+xml)$/.test(file.type);\n};\n\n/**\n * 判断文件类型\n * @example <input type=\"file\" onchange=\"getFileType(this.files[0])\"></input>\n */\nexport function getFileType(file: File) {\n // 文件开头的四个字节,生成一个 Blob 对象\n const slice = file.slice(0, 4);\n const reader = new FileReader();\n let verified_type: string;\n return new Promise((resolve, reject) => {\n reader.onload = function () {\n const buffer = reader.result as ArrayBuffer;\n // 将这四个字节的内容,视作一个32位整数\n const view = new DataView(buffer);\n const magic = view.getUint32(0, false);\n // 根据文件的前四个字节,判断它的类型\n switch (magic) {\n case 0x89504e47:\n verified_type = \"image/png\";\n break;\n case 0x47494638:\n verified_type = \"image/gif\";\n break;\n case 0x25504446:\n verified_type = \"application/pdf\";\n break;\n case 0x504b0304:\n verified_type = \"application/zip\";\n break;\n }\n return resolve(verified_type);\n };\n // 读取这四个字节\n reader.readAsArrayBuffer(slice);\n });\n}\n\n/**\n * 将一个函数转换为 blob,然后为这个 blob 生成 URL 对象\n */\nexport function fn2ObjectURL(fn: (...args: any[]) => any) {\n const blob = new Blob([\"(\" + fn.toString() + \")()\"], {\n type: \"application/javascript\"\n });\n return URL.createObjectURL(blob);\n // URL.revokeObjectURL(URL.createObjectURL(blob))\n}\n\nexport function file2Image(\n file: File,\n options?: {\n width?: number;\n height?: number;\n }\n) {\n if (!file.type.startsWith(\"image/\")) {\n return;\n }\n const img: HTMLImageElement = document.createElement(\"img\");\n img.src = URL.createObjectURL(file);\n img.width = options?.width ?? 60;\n img.height = options?.height ?? 60;\n img.onload = function () {\n // URL.revokeObjectURL(img.src);\n };\n return img;\n}\n","export function onDocumentReady(cb: () => void) {\n function check() {\n if (document.readyState === \"loading\") return;\n cb();\n document.removeEventListener(\"DOMContentLoaded\", check);\n }\n\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n document.addEventListener(\"DOMContentLoaded\", check);\n check();\n }\n}\n","// Polyfill\nexport function microTask(cb: () => void) {\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(cb);\n } else {\n Promise.resolve()\n .then(cb)\n .catch((e) =>\n setTimeout(() => {\n throw e;\n })\n );\n }\n}\n","export function patchDOM(\n oldNode: HTMLElement,\n newNode: HTMLElement,\n parent: HTMLElement\n) {\n if (!oldNode) {\n if (parent && newNode) {\n parent.appendChild(newNode);\n }\n return;\n }\n\n if (oldNode.isEqualNode(newNode)) return;\n\n if (oldNode.nodeName !== newNode.nodeName) {\n parent.replaceChild(newNode, oldNode);\n return;\n }\n\n if (oldNode.nodeType === Node.TEXT_NODE) {\n if (oldNode.textContent !== newNode.textContent) {\n oldNode.textContent = newNode.textContent;\n }\n return;\n }\n\n for (let i = oldNode.attributes.length - 1; i >= 0; i--) {\n const attrName = oldNode.attributes[i].name;\n if (!newNode.hasAttribute(attrName) && attrName !== \"open\") {\n oldNode.removeAttribute(attrName);\n }\n }\n\n for (let i = 0; i < newNode.attributes.length; i++) {\n const attrName = newNode.attributes[i].name;\n const attrValue = newNode.attributes[i].value;\n oldNode.setAttribute(attrName, attrValue);\n }\n\n for (let i = 0; i < newNode.childNodes.length; i++) {\n if (oldNode.childNodes[i]) {\n patchDOM(\n oldNode.childNodes[i] as HTMLElement,\n newNode.childNodes[i] as HTMLElement,\n oldNode\n );\n } else {\n oldNode.appendChild(newNode.childNodes[i].cloneNode(true));\n }\n }\n\n while (oldNode.childNodes.length > newNode.childNodes.length) {\n if (oldNode.lastChild) oldNode.removeChild(oldNode.lastChild);\n }\n}\n","export function setCookie(cname, cvalue, exdays) {\n var d = new Date();\n d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);\n var expires = \"expires=\" + d.toGMTString();\n document.cookie = cname + \"=\" + cvalue + \"; \" + expires;\n}\n\nexport function getCookie(cname) {\n var name = cname + \"=\";\n var ca = document.cookie.split(\";\");\n for (var i = 0; i < ca.length; i++) {\n var c = ca[i].trim();\n if (c.indexOf(name) == 0) return c.substring(name.length, c.length);\n }\n return \"\";\n // return `; ${document.cookie}`.split(`; ${cname}=`).pop().split(\";\").shift();\n}\n\n// Convert cookie to object\nexport const getCookieObject = () =>\n document.cookie\n .split(\";\")\n .map((item) => item.split(\"=\"))\n .reduce((acc, [k, v]) => (acc[k.trim().replace('\"', \"\")] = v) && acc, {});\n\n// Clear all cookies\nexport const clearCookies = () =>\n document.cookie\n .split(\";\")\n .forEach(\n (c) =>\n (document.cookie = c\n .replace(/^ +/, \"\")\n .replace(/=.*/, `=;expires=${new Date().toUTCString()};path=/`))\n );\n","/// wss://echo.websocket.org\n\nexport class WebSocket {\n constructor(url) {\n // Here we create an empty array [] which we will add to later\n // Note that we can use {} also, which is for empty objects\n // (arrays are objects)\n this.waitingResponse = [];\n\n // Here we create an empty array [] that represents the queue of\n // messages that didn't send because the socket was closed and\n // are queued up to be sent during the onopen handler (which iterates\n // through this array)\n this.messageQueue = [];\n\n this.url = url;\n\n // We separate out the socket initialisation into its own function\n // as we will also call it during a reconnect attempt\n this.createSocket();\n }\n\n // The reconnection logic is that whenever a message fails to send, the\n // message is added to messageQueue and a reconnection attempt is made.\n // So, when a connection is lost, it is reconnected to after a certain\n // time, but rather only when the user initiates an action that must\n // message (i.e.) interact with the WebSocket\n createSocket() {\n this.socket = new WebSocket(this.url);\n\n // Iterate through the queue of messages that haven't been sent\n // If this queue is empty then no messages are sent\n\n // All messages in the message queue arise from a previous\n // sendPayload event, thus are parsed in the correct JSON form\n // and have an associated request object in waitingResponse\n this.socket.onopen = () => {\n this.messageQueue.forEach((item) => this.socket.send(item));\n this.messageQueue = [];\n };\n\n this.socket.onclose = (e) => {\n const { code, reason, wasClean } = e;\n console.log(`ws closed : ${code} ${reason} ${wasClean}`);\n };\n\n this.socket.onerror = (e) => {\n console.log(`ws error : ${e}`);\n };\n\n this.socket.onmessage = (e) => {\n this.processMessage(e);\n };\n }\n\n // Creates a new socket and adds any unsent\n // messages onto the message queue\n recreateSocket(message) {\n console.log(\"Reconnection Attempted\");\n this.messageQueue.push(message);\n this.createSocket();\n }\n\n // Closes a socket, which can take a bit\n // of time (few seconds) since a roundtrip to\n // the server is done\n closeSocket() {\n this.socket.close();\n console.log(\"Socket closed manually.\");\n }\n\n // Exposes a function for users to start a new\n // socket - there is no way to 'reconnect' to\n // a socket, a new websocket needs to be created\n openSocket() {\n this.createSocket();\n console.log(\"Socket opened manually.\");\n }\n\n async sendPayload(details) {\n // Create a request where request = { sent: + new Date()} and this.waiting... = request\n // this means both request and waitingResponse[details.requestid] point to the same thing\n // so that changing request.test will also result in waitingResponse[details.requestid].test\n // having the same value\n\n // Note that details.requestid here is an index = the timestamp. Later when we process\n // messages received, we will check the timestamp of the requestid of the message received\n // against this waitingResponse array and resolve the request if a match is found\n\n let requestid = +new Date();\n const request = (this.waitingResponse[requestid] = { sent: requestid });\n\n // Here we combine the request (which at this point is just { sent: ...} with the\n // actual data to be sent to form the final message to send\n const message = { ...request, ...details };\n\n // If Socket open then send the details (message) in String Format\n try {\n // WebSocket.CONNECTING WebSocket.OPEN WebSocket.CLOSING WebSocket.CLOSED\n if (this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify(message));\n } else {\n // Otherwise we try to recreate the socket and send the message\n // after recreating the socket\n this.recreateSocket(JSON.stringify(message));\n }\n\n // Here we create a new promise function\n // We set the resolve property of request [which is also referenced\n // by waitingResponse[details.requestid] to the Promise's resolve function\n\n // Thus we can resolve the promise from processMessage (refer below)\n\n // We reject after 5 seconds of not receiving the associated message\n // with the same requestid\n const result = await new Promise(function (resolve, reject) {\n // This will automatically run, allowing us to access\n // the resolve function from outside this function\n request.resolve = resolve;\n\n console.log(request);\n // This will take 5 seconds to run, which becomes the lifecycle\n // of this Promise function - the resolve function must be\n // called before this point\n setTimeout(() => {\n reject(\"Timeout\"); // or resolve({action: \"to\"}), or whatever\n }, 5000);\n });\n\n console.info(\"Time took\", (+new Date() - request.sent) / 1000);\n\n // function returns result\n return result; // or {...request, ...result} if you care\n } finally {\n // code to run regardless of whether try worked or error thrown\n console.log(\"Exit code ran successfully\");\n\n delete this.waitingResponse[requestid];\n }\n }\n\n // Message Receiver, we attach this to the onmessage handler\n // Expects message to be in JSON format, otherwise throws\n // an error and simply logs the message to console\n\n // The message must also have a requestid property (we\n // use lowercase \"i\" here because Common Lisp's JZON library\n // lowercases property names in JSON messages\n\n // Test if the requestid passed in has an entry in the waitingResponse\n // queue (data.requestid is the array index and the sendPayload function\n // sets a value in this array for various id indexes to { sent: .. }\n // This index also has a reference to the resolve function for the\n // associated promise for that request id\n\n // If that is true ('truthy' via if (request)), then resolve the\n // associated promise via request.resolve(data), where data is\n // the value resolved by the promise\n\n // Otherwise pass a variety of console warnings / logs - the message\n // will not be handled and disappear from the future (i.e. every\n // message needs a requestid set in waitingResponse to be caught\n\n // We could probably add in a router for server initiated messages\n // to be handled (under the second warning below)\n async processMessage(msg) {\n try {\n let data = JSON.parse(msg.data);\n\n if (Object.prototype.hasOwnProperty.call(data, \"requestid\")) {\n const request = this.waitingResponse[data.requestid];\n if (request) request.resolve(data);\n else\n console.warn(\n \"Got data but found no associated request, already timed out?\",\n data\n );\n } else {\n // Add handlers here for messages without request ID\n console.warn(\"Got data without request id\", data);\n }\n } catch {\n console.log(msg.data);\n }\n }\n\n // Main entry point for calling functions with a simple\n // callback to action to perform on the received data\n // Exists here to reduce boilerplate for the calling function\n async sendRequest(\n details,\n resolution,\n rejection = (error) => {\n console.log(error);\n }\n ) {\n this.sendPayload(details).then(\n function (value) {\n resolution(value);\n },\n function (error) {\n rejection(error);\n }\n );\n }\n\n // Second entry point for one direction messages\n // i.e. not expecting any responses. This bypasses\n // the request-response promise functions above\n\n // Attempts to JSON.stringify the object first,\n // and just sends the object if cannot be made\n // into a JSON string\n\n sendMessage(details) {\n // Example of an Immediately-Invoked Function Expression\n const message = (() => {\n try {\n return JSON.stringify(details);\n } catch (e) {\n return details;\n }\n })();\n\n if (this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(message);\n } else {\n // Otherwise we try to recreate the socket and send the message\n // after recreating the socket\n this.recreateSocket(message);\n }\n }\n}\n","export function getDocumentElement() {\n if (document.compatMode == \"BackCompat\") {\n return document.body;\n } else {\n return document.documentElement;\n }\n}\n\n// 获取可视区域大小\nexport function getViewportSize() {\n const documentElement = getDocumentElement();\n return {\n width: documentElement.clientWidth || window.innerWidth,\n height: documentElement.clientHeight || window.innerHeight\n };\n}\n\n// 获取页面整体大小\nexport function getPageSize() {\n const documentElement = getDocumentElement();\n const viewport = getViewportSize();\n return {\n width: Math.max(documentElement.scrollWidth, viewport.width),\n height: Math.max(documentElement.scrollHeight, viewport.height)\n };\n}\n\n/**\n * 判断元素是否在可视区域\n *\n * DOMRect 对象包含了一组用于描述边框的只读属性——top,lef,right,bottom,width,height,单位为像素。\n * 除了 width 和 height 外的属性都是相对于浏览器可视范围的左上角位置而言的。\n * right是指元素右边界距窗口最左边的距离,bottom是指元素下边界距窗口最上面的距离。\n * 兼容所有浏览器写法:\n * var ro = object.getBoundingClientRect();\n * var Top = ro.top;\n * var Bottom = ro.bottom;\n * var Left = ro.left;\n * var Right = ro.right;\n * var Width = ro.width || Right - Left;\n * var Height = ro.height || Bottom - Top;\n */\nexport function isElementInViewport(el: HTMLElement) {\n const viewport = getViewportSize();\n const rect = el.getBoundingClientRect();\n return (\n rect.bottom > 0 &&\n rect.top < viewport.height &&\n rect.right > 0 &&\n rect.left < viewport.width\n );\n}\n\n//scrollTop和scrollLeft属性是可以赋值的,并且会立即自动滚动网页到相应位置,因此可以利用它们改变网页元素的相对位置\nexport function getPageScroll() {\n const documentElement = getDocumentElement();\n return {\n scrollLeft: documentElement.scrollLeft,\n scrollTop: documentElement.scrollTop\n };\n}\n\nexport function getPageClient() {\n const documentElement = getDocumentElement();\n return {\n clientLeft: documentElement.clientLeft,\n clientTop: documentElement.clientTop\n };\n}\n\nexport function getElementLeftInPage(element: HTMLElement) {\n let actualLeft = element.offsetLeft;\n let current = element.offsetParent as HTMLElement;\n while (current !== null) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent as HTMLElement;\n }\n return actualLeft;\n}\n\nexport function getElementTopInPage(element: HTMLElement) {\n let actualTop = element.offsetTop;\n let current = element.offsetParent as HTMLElement;\n while (current !== null) {\n actualTop += current.offsetTop;\n current = current.offsetParent as HTMLElement;\n }\n return actualTop;\n}\n\nexport function getElementPositionInPage2(element: HTMLElement) {\n return {\n x: getElementLeftInPage(element),\n y: getElementTopInPage(element)\n };\n}\nexport function getElementPositionInPage(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n const scroll = getPageScroll();\n const pageClient = getPageClient();\n return {\n x: rect.left + scroll.scrollLeft - pageClient.clientLeft,\n y: rect.top + scroll.scrollTop - pageClient.clientTop\n };\n}\n\nexport function getElementPositionInViewport(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n return {\n x: rect.left,\n y: rect.top\n };\n}\n\n// horizontal scroll indicator\n// window.onscroll = () => getPageVerticalScrollPercent();\nexport function getPageVerticalScrollPercent() {\n const documentElement = getDocumentElement();\n // https://www.w3schools.com/howto/howto_js_scroll_indicator.asp\n const height = documentElement.scrollHeight - documentElement.clientHeight;\n return height <= 0 ? 0 : (documentElement.scrollTop / height) * 100;\n}\n\n//////////////////////////////// 鼠标 ////////////////////////////////\nexport function getMousePositionInPage(ev: MouseEvent) {\n if (ev.pageX && ev.pageY) {\n return { x: ev.pageX, y: ev.pageY };\n }\n const pageScroll = getPageScroll();\n const pageClient = getPageClient();\n return {\n x: ev.clientX + pageScroll.scrollLeft - pageClient.clientLeft,\n y: ev.clientY + pageScroll.scrollTop - pageClient.clientTop\n };\n}\n\nexport function getMousePositionInViewport(ev: MouseEvent) {\n return {\n x: ev.clientX,\n y: ev.clientY\n };\n}\n","/**\n * 鼠标按键\n * @returns 0 左键 1 中键 2 右键\n */\nexport function getMouseButton(event) {\n if (document.implementation.hasFeature(\"MouseEvents\", \"2.0\")) {\n return event.button;\n } else {\n switch (event.button) {\n case 0:\n case 1:\n case 3:\n case 5:\n case 7:\n return 0; //左键\n case 2:\n case 6:\n return 2; //右键\n case 4:\n return 1; //中键\n }\n }\n}\n","export function getBrowserUserAgent() {\n // Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Mobile Safari/537.36\n let u = navigator.userAgent;\n return {\n trident: u.indexOf(\"Trident\") > -1, //IE内核\n presto: u.indexOf(\"Presto\") > -1, //opera内核\n webKit: u.indexOf(\"AppleWebKit\") > -1, //苹果、谷歌内核\n gecko: u.indexOf(\"Gecko\") > -1 && u.indexOf(\"KHTML\") == -1, //火狐内核\n mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端\n ios: !!u.match(/\\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端\n android: u.indexOf(\"Android\") > -1 || u.indexOf(\"Linux\") > -1, //android终端或uc浏览器\n iPhone: u.indexOf(\"iPhone\") > -1, //是否为iPhone或者QQHD浏览器\n iPad: u.indexOf(\"iPad\") > -1, //是否iPad\n webApp: u.indexOf(\"Safari\") == -1 //是否web应该程序,没有头部与底部\n };\n}\n\nexport function getBrowserLanguage() {\n return (navigator.browserLanguage || navigator.language).toLowerCase();\n}\n","import { getBrowserUserAgent } from \"./env\";\n\nexport function setRem(designWidth) {\n // 修正页面高度100%的渲染错误\n // document.documentElement.style.height = window.innerHeight + \"px\";\n\n var docEl = document.documentElement;\n\n // const ua = getBrowserUserAgent();\n // var dpr = ua.android\n // ? 1\n // : window.top === window.self\n // ? window.devicePixelRatio\n // : 1;\n var dpr = window.devicePixelRatio;\n docEl.dataset.dpr = dpr;\n\n // 设置viewport,进行缩放,达到高清效果\n // var metaEl = document.querySelector('meta[name=\"viewport\"]');\n // var scale = 1 / dpr;\n // metaEl.setAttribute(\n // \"content\",\n // \"width=device-width\" +\n // \",initial-scale=\" +\n // scale +\n // \",maximum-scale=\" +\n // scale +\n // \", minimum-scale=\" +\n // scale +\n // \",user-scalable=no, viewport-fit=cover, shrink-to-fit=no\"\n // );\n\n // default: 1rem = 100px\n var rem = 100;\n var recalc = function () {\n // var clientWidth = docEl.clientWidth;\n // // 限制最大rem\n // if (clientWidth > maxWidth) {\n // clientWidth = maxWidth;\n // }\n // // 限制最小rem\n // if (clientWidth < minWidth) {\n // clientWidth = minWidth;\n // }\n var clientWidth = Math.min(docEl.clientWidth, designWidth);\n docEl.dataset.width = clientWidth;\n docEl.dataset.rem = rem = Math.round(100 * (clientWidth / designWidth));\n // 配合:设置viewport,进行缩放,达到高清效果\n // docEl.dataset.rem = rem =\n // Math.round(100 * (clientWidth / designWidth)) * dpr;\n docEl.style.fontSize = rem + \"px\";\n };\n\n recalc();\n\n // 给js调用的,某一dpr下rem和px之间的转换函数\n window.rem2px = function (v) {\n v = parseFloat(v);\n return v * rem;\n };\n window.px2rem = function (v) {\n v = parseFloat(v);\n return v / rem;\n };\n\n if (!window.addEventListener) return;\n window.addEventListener(\n \"orientationchange\" in window ? \"orientationchange\" : \"resize\",\n recalc,\n false\n );\n}\n","const path = require(\"path\"); // 路径模块\nconst qs = require(\"querystring\"); // 地址参数解析模块\nconst util = require(\"util\"); // 常用工具方法模块\nconst url = require(\"url\"); // URL 解析模块\n\n// // 新定义的内置对象\n// new Promise();\n// // 原有内置对象新添加的静态方法\n// Array.from();\n// // 原有内置对象新添加的实例方法\n// Array.prototype.includes();\n\n// 编码\nexport function urlsafe_b64encode(str) {\n return btoa(encodeURIComponent(str))\n .replaceAll(\"+\", \"*\")\n .replaceAll(\"/\", \"-\")\n .replaceAll(\"=\", \"\");\n}\n\n// 解码\nexport function urlsafe_b64decode(base64UrlStr) {\n let data = base64UrlStr.replaceAll(\"*\", \"+\").replaceAll(\"-\", \"/\");\n let mod4 = data.length % 4;\n if (mod4) {\n data = data.padEnd(data.length + (4 - mod4), \"=\");\n }\n return decodeURIComponent(atob(data));\n}\n\nexport const isURLRelative = (path) => !/^([a-z]+:)?[\\\\/]/i.test(path);\n\nexport function checkHttpUrl(string) {\n let givenURL;\n try {\n givenURL = new URL(string);\n } catch (error) {\n console.log(error);\n return false;\n }\n // let host = givenURL.host;\n // let path = givenURL.pathname;\n return givenURL.protocol === \"http:\" || givenURL.protocol === \"https:\";\n}\n\n/**\n * 获取地址栏get数据\n * - 有值的时候返回一个包含所有参数的对象\n * - 无值的时候,返回 `false`\n *\n * @returns\n */\nexport function getSearchData() {\n let searchString = location.search;\n if (searchString) {\n let obj = {};\n searchString = searchString.substring(1, searchString.length);\n let tempArray = searchString.split(\"&\");\n tempArray.forEach((item) => {\n obj[item.split(\"=\")[0]] = decodeURIComponent(item.split(\"=\")[1]);\n });\n return obj;\n } else {\n return false;\n }\n}\n\nexport const getUrlParams = (query) =>\n Array.from(new URLSearchParams(query)).reduce(\n (p, [k, v]) =>\n Object.assign({}, p, {\n [k]: p[k] ? (Array.isArray(p[k]) ? p[k] : [p[k]]).concat(v) : v\n }),\n {}\n );\n\n/***\n * * 监听 hash 变化\n * */\n// window.addEventListener(\"hashchange\", function onHashChange() {\n// // 去除 # 号\n// let hash = location.hash.replace(/^#/, \"\");\n// // 简单解析示例\n// const parsed = hash.split(\"?\");\n// const pathname = parsed[0];\n// const search = parsed[1];\n// // 切换页面内容\n// switch (pathname) {\n// case \"/home\":\n// document.body.innerHTML = `Hello ${search}`;\n// return;\n// default:\n// return;\n// }\n// });\n\n/***\n * * 监听 history 变化\n * */\nfunction onHistoryChange() {\n // 解析 location\n const { pathname, search } = location;\n\n // 根据页面不同执行不同内容\n switch (pathname) {\n case \"/home\":\n document.body.innerHTML = `Hello ${search.replace(/^\\?/, \"\")}`;\n return;\n default:\n document.body.innerHTML = `Hello World`;\n return;\n }\n}\n/***\n * * 页面跳转\n * pushState(\"/home?name=xxx\");\n * */\nfunction pushState(target) {\n history.pushState(null, \"\", target);\n // window.dispatchEvent(new PopStateEvent(\"popstate\"));\n onHistoryChange();\n}\n// window.addEventListener(\"popstate\", onHistoryChange);\n","export function setTheme(theme?: string) {\n theme = theme || localStorage.theme;\n if (!theme) {\n theme = window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n localStorage.theme = theme;\n }\n document.documentElement.classList.toggle(\"dark\", theme === \"dark\");\n}\n","export class DOMKeyboardKeyCode {\n public static getEvent(event: KeyboardEvent): { code: number; key: string } {\n // const key = event.code;\n const code = event.keyCode || event.charCode;\n return {\n code: code,\n key: DOMKeyboardKeyCode.codeToKey(code)\n };\n }\n\n /**\n * keyToCode(keyName: string)\n *\n * @param keyName {string} - The keyName of the key you wish to get the code for.\n *\n * @return {number} - Will be the keycode of the given keyName, or -1 if it does not exist in\n * the set of known keys.\n */\n public static keyToCode(keyName: string): number {\n if (\n Object.prototype.hasOwnProperty.call(\n DOMKeyboardKeyCode.keyToCodes,\n keyName\n )\n ) {\n return DOMKeyboardKeyCode.keyToCodes[keyName];\n } else {\n return -1;\n }\n }\n\n /**\n * codeToKey(code: string)\n *\n * @param code {string} - The key code to lookup the keyname for\n *\n * @reaturn {string} - Will be the keyname of the given Code or '' if it does not\n * exist on the set of known codes.\n */\n public static codeToKey(code: number): string {\n if (\n Object.prototype.hasOwnProperty.call(\n DOMKeyboardKeyCode.codeToKeys,\n code.toString()\n )\n ) {\n return DOMKeyboardKeyCode.codeToKeys[code.toString()];\n } else {\n return \"\";\n }\n }\n\n private static keyToCodes: { [index: string]: number } = {\n \"0\": 48,\n \"1\": 49,\n \"2\": 50,\n \"3\": 51,\n \"4\": 52,\n \"5\": 53,\n \"6\": 54,\n \"7\": 55,\n \"8\": 56,\n \"9\": 57,\n spacebar: 32,\n backspace: 8,\n tab: 9,\n enter: 13,\n shift: 16,\n ctrl: 17,\n alt: 18,\n pause_break: 19,\n caps_lock: 20,\n escape: 27,\n page_up: 33,\n page_down: 34,\n end: 35,\n home: 36,\n left_arrow: 37,\n up_arrow: 38,\n right_arrow: 39,\n down_arrow: 40,\n insert: 45,\n delete: 46,\n a: 65,\n b: 66,\n c: 67,\n d: 68,\n e: 69,\n f: 70,\n g: 71,\n h: 72,\n i: 73,\n j: 74,\n k: 75,\n l: 76,\n m: 77,\n n: 78,\n o: 79,\n p: 80,\n q: 81,\n r: 82,\n s: 83,\n t: 84,\n u: 85,\n v: 86,\n w: 87,\n x: 88,\n y: 89,\n z: 90,\n left_window_key: 91,\n right_window_key: 92,\n select_key: 93,\n numpad_0: 96,\n numpad_1: 97,\n numpad_2: 98,\n numpad_3: 99,\n numpad_4: 100,\n numpad_5: 101,\n numpad_6: 102,\n numpad_7: 103,\n numpad_8: 104,\n numpad_9: 105,\n multiply: 106,\n add: 107,\n subtract: 109,\n decimal_point: 110,\n divide: 111,\n f1: 112,\n f2: 113,\n f3: 114,\n f4: 115,\n f5: 116,\n f6: 117,\n f7: 118,\n f8: 119,\n f9: 120,\n f10: 121,\n f11: 122,\n f12: 123,\n num_lock: 144,\n scroll_lock: 145,\n semi_colon: 186,\n equal_sign: 187,\n comma: 188,\n dash: 189,\n period: 190,\n forward_slash: 191,\n grave_accent: 192,\n open_bracket: 219,\n back_slash: 220,\n close_braket: 221,\n single_quote: 222\n };\n\n private static codeToKeys: { [index: string]: string } = {\n \"8\": \"backspace\",\n \"9\": \"tab\",\n \"13\": \"enter\",\n \"16\": \"shift\",\n \"17\": \"ctrl\",\n \"18\": \"alt\",\n \"19\": \"pause_break\",\n \"20\": \"caps_lock\",\n \"27\": \"escape\",\n \"32\": \"spacebar\",\n \"33\": \"page_up\",\n \"34\": \"page_down\",\n \"35\": \"end\",\n \"36\": \"home\",\n \"37\": \"left_arrow\",\n \"38\": \"up_arrow\",\n \"39\": \"right_arrow\",\n \"40\": \"down_arrow\",\n \"45\": \"insert\",\n \"46\": \"delete\",\n \"48\": \"0\",\n \"49\": \"1\",\n \"50\": \"2\",\n \"51\": \"3\",\n \"52\": \"4\",\n \"53\": \"5\",\n \"54\": \"6\",\n \"55\": \"7\",\n \"56\": \"8\",\n \"57\": \"9\",\n \"65\": \"a\",\n \"66\": \"b\",\n \"67\": \"c\",\n \"68\": \"d\",\n \"69\": \"e\",\n \"70\": \"f\",\n \"71\": \"g\",\n \"72\": \"h\",\n \"73\": \"i\",\n \"74\": \"j\",\n \"75\": \"k\",\n \"76\": \"l\",\n \"77\": \"m\",\n \"78\": \"n\",\n \"79\": \"o\",\n \"80\": \"p\",\n \"81\": \"q\",\n \"82\": \"r\",\n \"83\": \"s\",\n \"84\": \"t\",\n \"85\": \"u\",\n \"86\": \"v\",\n \"87\": \"w\",\n \"88\": \"x\",\n \"89\": \"y\",\n \"90\": \"z\",\n \"91\": \"left_window_key\",\n \"92\": \"right_window_key\",\n \"93\": \"select_key\",\n \"96\": \"numpad_0\",\n \"97\": \"numpad_1\",\n \"98\": \"numpad_2\",\n \"99\": \"numpad_3\",\n \"100\": \"numpad_4\",\n \"101\": \"numpad_5\",\n \"102\": \"numpad_6\",\n \"103\": \"numpad_7\",\n \"104\": \"numpad_8\",\n \"105\": \"numpad_9\",\n \"106\": \"multiply\",\n \"107\": \"add\",\n \"109\": \"subtract\",\n \"110\": \"decimal_point\",\n \"111\": \"divide\",\n \"112\": \"f1\",\n \"113\": \"f2\",\n \"114\": \"f3\",\n \"115\": \"f4\",\n \"116\": \"f5\",\n \"117\": \"f6\",\n \"118\": \"f7\",\n \"119\": \"f8\",\n \"120\": \"f9\",\n \"121\": \"f10\",\n \"122\": \"f11\",\n \"123\": \"f12\",\n \"144\": \"num_lock\",\n \"145\": \"scroll_lock\",\n \"186\": \"semi_colon\",\n \"187\": \"equal_sign\",\n \"188\": \"comma\",\n \"189\": \"dash\",\n \"190\": \"period\",\n \"191\": \"forward_slash\",\n \"192\": \"grave_accent\",\n \"219\": \"open_bracket\",\n \"220\": \"back_slash\",\n \"221\": \"close_braket\",\n \"222\": \"single_quote\"\n };\n}\n","export const copyToClipboard = (text) => navigator.clipboard.writeText(text);\n\nexport const getSelectedText = () => window.getSelection().toString();\n\n// Check if an element is focused\nexport const isFocus = (ele) => ele === document.activeElement;\n\n// Get all siblings of an element\nexport const siblings = (ele) =>\n [].slice.call(ele.parentNode.children).filter((child) => child !== ele);\n\n// Scroll to the top of the page\nexport const scrollToTop = () => window.scrollTo(0, 0);\n\n// Check if the current tab is in view/focus\nexport const isTabInView = () => !document.hidden;\n\nexport const navigateBack = () => history.back();\nexport const navigateBack2 = () => history.go(-1);\n\nexport function loadScript(src) {\n let script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = src;\n script.async = false;\n document.body.appendChild(script);\n script.onload = () => {};\n script.onerror = () => {};\n}\n\n/**\n * let sender = '<script>alert(\"abc\")</script>'; // 恶意代码\n let safer = saferHTML`<p>${sender} has sent you a message.</p>`;\n expect(safer).toBe(\n '<p><script>alert(\"abc\")</script> has sent you a message.</p>'\n );\n\n [Arguments] {\n '0': [ '<p>', ' has sent you a message.</p>' ],\n '1': '<script>alert(\"abc\")</script>'\n }\n*/\nexport function saferHTML(templateData) {\n let s = templateData[0];\n for (let i = 1; i < arguments.length; i++) {\n let arg = String(arguments[i]);\n\n // Escape special characters in the substitution.\n s += arg.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n\n // Don't escape special characters in the template.\n s += templateData[i];\n }\n return s;\n}\n\nexport function templateCompile(template) {\n const evalExpr = /<%=(.+?)%>/g;\n const expr = /<%([\\s\\S]+?)%>/g;\n\n template = template\n .replace(evalExpr, \"`); \\n echo( $1 ); \\n echo(`\")\n .replace(expr, \"`); \\n $1 \\n echo(`\");\n\n template = \"echo(`\" + template + \"`);\";\n\n let script = `(function parse(data){\n let output = \"\";\n\n function echo(html){\n output += html;\n }\n\n ${template}\n\n return output;\n })`;\n\n return script;\n}\n\n/**\n * 添加事件\n */\nexport function addEventListener(element, type, handler) {\n // DOM2级事件\n if (element.addEventListener) {\n //true 捕获阶段 false 冒泡阶段\n element.addEventListener(type, handler, false);\n } else if (element.attachEvent) {\n //IE\n element.attachEvent(\"on\" + type, handler);\n } else {\n element[\"on\" + type] = handler;\n }\n}\n\n/**\n * 取消事件\n */\nexport function removeEventListener(element, type, handler) {\n if (element.removeEventListener) {\n element.removeEventListener(type, handler, false);\n } else if (element.detachEvent) {\n element.detachEvent(\"on\" + type, handler);\n } else {\n element[\"on\" + type] = null;\n }\n}\n\n/**\n * 阻止冒泡\n */\nexport function stopPropagation(event) {\n if (event.stopPropagation) {\n event.stopPropagation();\n } else {\n event.cancelBubble = true;\n }\n}\n\n/**\n * 阻止默认行为\n */\nexport function preventDefault(event) {\n if (event.preventDefault) {\n event.preventDefault;\n } else {\n event.returnValue = false;\n }\n}\n\n/**\n * 获取事件对象\n */\nexport function getEvent(event) {\n // event.type 事件类型\n return event ? event : window.event;\n}\n\n/**\n * 获取事件目标\n */\nexport function getTarget(event) {\n return event.target || event.srcElement;\n}\n\nexport function getRelatedTarget(event) {\n if (event.relatedTarget) {\n return event.relatedTarget;\n } else if (event.toElement) {\n return event.toElement;\n } else if (event.fromElement) {\n return event.fromElement;\n } else {\n return null;\n }\n}\n\nexport function isBrowserSupportFileAPI() {\n if (window.File && window.FileReader && window.FileList && window.Blob) {\n return true;\n } else {\n // console.log(\"The File APIs are not fully supported in this browser.\");\n return false;\n }\n}\n","/**\n * Provides requestAnimationFrame in a cross browser way.\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\nif (!window.requestAnimationFrame) {\n window.requestAnimationFrame = (function () {\n return (\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function (callback) {\n window.setTimeout(callback, 1000 / 60);\n }\n );\n })();\n}\n\nexport const drawCanvasInWeb = (canvasID, cb) => {\n var canvas = document.getElementById(canvasID);\n var ctx = canvas.getContext(\"2d\");\n // var mouse = utils.captureMouse(canvas);\n // var touch = utils.captureTouch(canvas);\n (function drawFrame() {\n window.requestAnimationFrame(drawFrame);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n cb(ctx);\n })();\n};\n","import { getViewportSize } from \"./position\";\n\nexport function loadImageAsync(url) {\n return new Promise(function (resolve, reject) {\n const image = new Image();\n image.onload = function () {\n resolve(image);\n };\n image.onerror = function () {\n reject(new Error(\"Could not load image at \" + url));\n };\n image.src = url;\n });\n}\n\n/**\n * 懒加载图片\n * document.addEventListener(\"scroll\", throttle(lazyloadImages, 300));\n */\nexport function lazyloadImages() {\n // 获取所有的图片标签\n const imgs = document.getElementsByTagName(\"img\");\n // 获取可视区域的高度\n const viewHeight = getViewportSize().height;\n // num用于统计当前显示到了哪一张图片,避免每次都从第一张图片开始检查是否露出\n let num = 0;\n for (let i = num; i < imgs.length; i++) {\n // 如果可视区域高度大于等于元素顶部距离可视区域顶部的高度,说明元素露出\n if (imgs[i].getBoundingClientRect().top < viewHeight) {\n // 给元素写入真实的src,展示图片\n imgs[i].src = imgs[i].getAttribute(\"data-src\");\n // 前i张图片已经加载完毕,下次从第i+1张开始检查是否露出\n num = i + 1;\n }\n }\n}\n\n/*\n *@method getImageColor 该方法用于获取传入图片链接的这个图片的主要颜色值 返回表示颜色值的字符串,如rgb(red,green,blue)\n *@prams imgsrc 图片链接\n */\nexport function getImageColor(imgsrc) {\n var arrR = [],\n arrG = [],\n arrB = [],\n R,\n G,\n B,\n rgb,\n j = 0;\n var canvas = document.createElement(\"canvas\");\n var ctx = canvas.getContext(\"2d\");\n var img = document.createElement(\"image\");\n img.src = imgsrc;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n var imageData = ctx.getImageData(0, 0, img.width, img.height).data;\n for (var i = 0; i < imageData.length; i += 4) {\n arrR[j] = imageData[i];\n arrG[j] = imageData[i + 1];\n arrB[j] = imageData[i + 2];\n j += 1;\n }\n R = _getArryWeightValue(arrR);\n G = _getArryWeightValue(arrG);\n B = _getArryWeightValue(arrB);\n rgb = \"rgb(\" + R + \",\" + G + \",\" + B + \")\";\n return rgb;\n}\n/*\n *@method _getArryWeightValue 该方法用于获取数组中的最高权重值 返回数组的最高权重值\n *@prams arr 数组\n */\nfunction _getArryWeightValue(arr) {\n var existArr = {},\n duplicationArr = [],\n duplicationCount = [],\n k = 0;\n for (let i = 0; i < arr.length; i++) {\n if (!existArr[arr[i]]) {\n existArr[arr[i]] = 1;\n } else {\n duplicationArr.push(arr[i]); //newArr数组中为arr中出现重复的元素,即把arr数组中不重复的元素去除掉\n }\n }\n for (let i = 0; i < duplicationArr.length; i++) {\n k = 0;\n for (var j = 0; j < duplicationArr.length; j++) {\n if (duplicationArr[i] === duplicationArr[j]) {\n k += 1;\n }\n duplicationCount[i] = k; //把NewArr中每个值重复出现的次数依次放入\n }\n }\n //获取resultArr数组中出现重复值最多的那个值的索引值\n var max = Math.max.apply(null, duplicationCount);\n var maxIndex = 0;\n for (; maxIndex < duplicationCount.length; maxIndex++) {\n if (duplicationCount[maxIndex] === max) {\n return;\n }\n }\n return duplicationArr[maxIndex]; //返回权重最高的值\n}\n","/**\n * covert canvas to image\n * and save the image file\n */\nexport const Canvas2Image = function (contextType: string) {\n if (!contextType) contextType = \"2d\";\n\n // check if support sth.\n const $support = (function () {\n const canvas = document.createElement(\"canvas\"),\n ctx: CanvasRenderingContext2D = canvas.getContext(\n contextType\n ) as CanvasRenderingContext2D;\n const ctxBool = !!ctx;\n\n return {\n canvas: ctxBool,\n imageData: ctxBool && !!ctx.getImageData,\n dataURL: !!canvas.toDataURL,\n btoa: !!window.btoa\n };\n })();\n\n const downloadMime = \"image/octet-stream\";\n\n function scaleCanvas(\n canvas: HTMLCanvasElement,\n width: number,\n height: number\n ) {\n const w = canvas.width;\n const h = canvas.height;\n if (width === undefined) {\n width = w;\n }\n if (height === undefined) {\n height = h;\n }\n\n const retCanvas = document.createElement(\"canvas\");\n const retCtx = retCanvas.getContext(\n contextType\n ) as CanvasRenderingContext2D;\n retCanvas.width = width;\n retCanvas.height = height;\n retCtx.drawImage(canvas, 0, 0, w, h, 0, 0, width, height);\n return retCanvas;\n }\n\n function getDataURL(\n canvas: HTMLCanvasElement,\n type: string,\n width: number,\n height: number\n ) {\n if (contextType == \"2d\") canvas = scaleCanvas(canvas, width, height);\n return canvas.toDataURL(type);\n }\n\n // save file to local with file name and file type\n function saveFile(strData: string, fileType: string, fileName = \"name\") {\n // document.location.href = strData;\n const saveLink = document.createElement(\"a\");\n // download file name\n saveLink.download = fileName + \".\" + fileType;\n // download file data\n saveLink.href = strData;\n // start download\n saveLink.click();\n }\n\n function genImage(strData: string) {\n const img = document.createElement(\"img\");\n img.src = strData;\n return img;\n }\n\n function fixType(type: string) {\n type = type.toLowerCase().replace(/jpg/i, \"jpeg\");\n const r = type.match(/png|jpeg|bmp|gif/)?.[0];\n return \"image/\" + r;\n }\n\n function encodeData(data: string | any[]) {\n if (!window.btoa) {\n throw \"btoa undefined\";\n }\n let str = \"\";\n if (typeof data == \"string\") {\n str = data;\n } else {\n for (let i = 0; i < data.length; i++) {\n str += String.fromCharCode(data[i]);\n }\n }\n return btoa(str);\n }\n\n function getContext(canvas: HTMLCanvasElement) {\n const attributes =\n contextType == \"2d\" ? undefined : { preserveDrawingBuffer: true };\n return canvas.getContext(contextType, attributes);\n }\n\n function getImageData(canvas: HTMLCanvasElement) {\n const w = canvas.width,\n h = canvas.height;\n const context = getContext(canvas) as CanvasRenderingContext2D;\n return context.getImageData(0, 0, w, h);\n }\n\n function makeURI(strData: string, type: string) {\n return \"data:\" + type + \";base64,\" + strData;\n }\n\n /**\n * create bitmap image\n * 按照规则生成图片响应头和响应体\n */\n const genBitmapImage = function (oData: ImageData) {\n //\n // BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx\n // BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx\n //\n\n const biWidth = oData.width;\n const biHeight = oData.height;\n const biSizeImage = biWidth * biHeight * 3;\n const bfSize = biSizeImage + 54; // total header size = 54 bytes\n\n //\n // typedef struct tagBITMAPFILEHEADER {\n // \tWORD bfType;\n // \tDWORD bfSize;\n // \tWORD bfReserved1;\n // \tWORD bfReserved2;\n // \tDWORD bfOffBits;\n // } BITMAPFILEHEADER;\n //\n const BITMAPFILEHEADER = [\n // WORD bfType -- The file type signature; must be \"BM\"\n 0x42,\n 0x4d,\n // DWORD bfSize -- The size, in bytes, of the bitmap file\n bfSize & 0xff,\n (bfSize >> 8) & 0xff,\n (bfSize >> 16) & 0xff,\n (bfSize >> 24) & 0xff,\n // WORD bfReserved1 -- Reserved; must be zero\n 0,\n 0,\n // WORD bfReserved2 -- Reserved; must be zero\n 0,\n 0,\n // DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.\n 54,\n 0,\n 0,\n 0\n ];\n\n //\n // typedef struct tagBITMAPINFOHEADER {\n // \tDWORD biSize;\n // \tLONG biWidth;\n // \tLONG biHeight;\n // \tWORD biPlanes;\n // \tWORD biBitCount;\n // \tDWORD biCompression;\n // \tDWORD biSizeImage;\n // \tLONG biXPelsPerMeter;\n // \tLONG biYPelsPerMeter;\n // \tDWORD biClrUsed;\n // \tDWORD biClrImportant;\n // } BITMAPINFOHEADER, *PBITMAPINFOHEADER;\n //\n const BITMAPINFOHEADER = [\n // DWORD biSize -- The number of bytes required by the structure\n 40,\n 0,\n 0,\n 0,\n // LONG biWidth -- The width of the bitmap, in pixels\n biWidth & 0xff,\n (biWidth >> 8) & 0xff,\n (biWidth >> 16) & 0xff,\n (biWidth >> 24) & 0xff,\n // LONG biHeight -- The height of the bitmap, in pixels\n biHeight & 0xff,\n (biHeight >> 8) & 0xff,\n (biHeight >> 16) & 0xff,\n (biHeight >> 24) & 0xff,\n // WORD biPlanes -- The number of planes for the target device. This value must be set to 1\n 1,\n 0,\n // WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap\n // has a maximum of 2^24 colors (16777216, Truecolor)\n 24,\n 0,\n // DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed\n 0,\n 0,\n 0,\n 0,\n // DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps\n biSizeImage & 0xff,\n (biSizeImage >> 8) & 0xff,\n (biSizeImage >> 16) & 0xff,\n (biSizeImage >> 24) & 0xff,\n // LONG biXPelsPerMeter, unused\n 0,\n 0,\n 0,\n 0,\n // LONG biYPelsPerMeter, unused\n 0,\n 0,\n 0,\n 0,\n // DWORD biClrUsed, the number of color indexes of palette, unused\n 0,\n 0,\n 0,\n 0,\n // DWORD biClrImportant, unused\n 0,\n 0,\n 0,\n 0\n ];\n\n const iPadding = (4 - ((biWidth * 3) % 4)) % 4;\n\n const aImgData = oData.data;\n\n let strPixelData = \"\";\n const biWidth4 = biWidth << 2;\n let y = biHeight;\n const fromCharCode = String.fromCharCode;\n\n do {\n const iOffsetY = biWidth4 * (y - 1);\n let strPixelRow = \"\";\n for (let x = 0; x < biWidth; x++) {\n const iOffsetX = x << 2;\n strPixelRow +=\n fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) +\n fromCharCode(aImgData[iOffsetY + iOffsetX + 1]) +\n fromCharCode(aImgData[iOffsetY + iOffsetX]);\n }\n\n for (let c = 0; c < iPadding; c++) {\n strPixelRow += String.fromCharCode(0);\n }\n\n strPixelData += strPixelRow;\n } while (--y);\n\n return (\n encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) +\n encodeData(strPixelData)\n );\n };\n\n /**\n * saveAsImage\n * @param canvas canvasElement\n * @param width {String} image type\n * @param height {Number} [optional] png width\n * @param type {string} [optional] png height\n * @param fileName {String} image name\n */\n const saveAsImage = function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n type: string,\n fileName: string\n ) {\n // save file type\n const fileType = type;\n if ($support.canvas && $support.dataURL) {\n if (typeof canvas == \"string\") {\n canvas = document.getElementById(canvas) as HTMLCanvasElement;\n }\n if (type === undefined) {\n type = \"png\";\n }\n type = fixType(type);\n if (/bmp/.test(type)) {\n const data = getImageData(scaleCanvas(canvas, width, height));\n const strData = genBitmapImage(data);\n // use new parameter: fileType\n saveFile(makeURI(strData, downloadMime), fileType, fileName);\n } else {\n const strData = getDataURL(canvas, type, width, height);\n // use new parameter: fileType\n saveFile(strData.replace(type, downloadMime), fileType, fileName);\n }\n }\n };\n\n const convertToImage = function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n type: string\n ) {\n if ($support.canvas && $support.dataURL) {\n if (typeof canvas == \"string\") {\n canvas = document.getElementById(canvas) as HTMLCanvasElement;\n }\n if (type === undefined) {\n type = \"png\";\n }\n type = fixType(type);\n\n if (/bmp/.test(type)) {\n const data = getImageData(scaleCanvas(canvas, width, height));\n const strData = genBitmapImage(data);\n return genImage(makeURI(strData, \"image/bmp\"));\n } else {\n const strData = getDataURL(canvas, type, width, height);\n return genImage(strData);\n }\n }\n };\n\n return {\n saveAsImage: saveAsImage,\n saveAsPNG: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n fileName: string\n ) {\n return saveAsImage(canvas, width, height, \"png\", fileName);\n },\n saveAsJPEG: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n fileName: string\n ) {\n return saveAsImage(canvas, width, height, \"jpeg\", fileName);\n },\n saveAsGIF: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n fileName: string\n ) {\n return saveAsImage(canvas, width, height, \"gif\", fileName);\n },\n saveAsBMP: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n fileName: string\n ) {\n return saveAsImage(canvas, width, height, \"bmp\", fileName);\n },\n\n convertToImage: convertToImage,\n convertToPNG: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number\n ) {\n return convertToImage(canvas, width, height, \"png\");\n },\n convertToJPEG: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number\n ) {\n return convertToImage(canvas, width, height, \"jpeg\");\n },\n convertToGIF: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number\n ) {\n return convertToImage(canvas, width, height, \"gif\");\n },\n convertToBMP: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number\n ) {\n return convertToImage(canvas, width, height, \"bmp\");\n }\n };\n};\n","export function createXMLHttpRequest() {\n var xhr = null;\n\n if (window.ActiveXObject) {\n var versions = [\n \"Microsoft.XMLHTTP\",\n \"MSXML6.XMLHTTP\",\n \"MSXML5.XMLHTTP\",\n \"MSXML4.XMLHTTP\",\n \"MSXML3.XMLHTTP\",\n \"MSXML2.XMLHTTP\",\n \"MSXML.XMLHTTP\"\n ];\n\n for (var i = 0; i < versions.length; i++) {\n try {\n xhr = new window.ActiveXObject(versions[i]);\n break;\n } catch (ex) {\n continue;\n }\n }\n } else {\n xhr = new XMLHttpRequest();\n }\n return xhr;\n}\n\nexport function getFormElementData(oFormElement) {\n if (!oFormElement.action) {\n return;\n }\n if (oFormElement.method.toLowerCase() === \"post\") {\n /* enctype is multipart/form-data */\n // segments.push(\n // 'Content-Disposition: form-data; name=\"' +\n // fd.name +\n // '\"; filename=\"' +\n // fd.name +\n // '\"\\r\\nContent-Type: ' +\n // fd.type +\n // \"\\r\\n\\r\\n\"\n // );\n // segments.push(\n // 'Content-Disposition: form-data; name=\"' +\n // input.name +\n // '\"\\r\\n\\r\\n' +\n // input.value +\n // \"\\r\\n\"\n // );\n // var sBoundary = \"---------------------------\" + Date.now().toString(16);\n // xhr.setRequestHeader(\n // \"Content-Type\",\n // \"multipart/form-data; boundary=\" + sBoundary\n // );\n // xhr.sendAsBinary(\n // \"--\" +\n // sBoundary +\n // \"\\r\\n\" +\n // segments.join(\"--\" + sBoundary + \"\\r\\n\") +\n // \"--\" +\n // sBoundary +\n // \"--\\r\\n\"\n // );\n /* enctype is application/x-www-form-urlencoded or text/plain */\n // segments.push(escape(input.name) + \"=\" + escape(input.value));\n return {\n url: oFormElement.action,\n data: new FormData(oFormElement)\n };\n } else {\n var sSearch = \"\";\n for (var nItem = 0; nItem < oFormElement.elements.length; nItem++) {\n var oField = oFormElement.elements[nItem];\n if (!oField.hasAttribute(\"name\")) {\n continue;\n }\n var sFieldType =\n oField.nodeName.toUpperCase() === \"INPUT\"\n ? oField.getAttribute(\"type\").toUpperCase()\n : \"TEXT\";\n if (sFieldType === \"FILE\") {\n for (\n var nFile = 0;\n nFile < oField.files.length;\n sSearch +=\n \"&\" + escape(oField.name) + \"=\" + escape(oField.files[nFile++].name)\n );\n } else if (\n (sFieldType !== \"RADIO\" && sFieldType !== \"CHECKBOX\") ||\n oField.checked\n ) {\n sSearch += \"&\" + escape(oField.name) + \"=\" + escape(oField.value);\n }\n }\n return {\n url: oFormElement.action.replace(\n /(?:\\?.*)?$/,\n sSearch.replace(/^&/, \"?\")\n ),\n data: null\n };\n }\n}\n\nexport function fetchUseXMLHttpRequest(url, timeout) {\n return new Promise((resolve, reject) => {\n var xhr = new XMLHttpRequest();\n var timeoutHandler = function () {\n reject(\"The request for \" + url + \" is timed out for \" + timeout + \".\");\n };\n var handler = function (e) {\n // - 0 代理被创建,但尚未调用 open()方法\n // - 1 open() 方法已经被调用\n // - 2 send()方法已经被调用,并且头部和状态已经可获得\n // - 3 下载中, responseText`属性已经包含部分数据\n // - 4 下载操作已完成\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n resolve(xhr.response); // xhr.responseText\n // var arrayBuffer = xhr.response;\n // if (arrayBuffer) {\n // var byteArray = new Uint8Array(arrayBuffer);\n // for (var i = 0; i < byteArray.byteLength; i++) {\n // // do something with each byte in the array\n // }\n // }\n } else {\n reject(xhr.statusText);\n }\n }\n };\n\n xhr.open(\"GET\", url);\n // xhr.open(\"GET\", url, true);\n // xhr.open(\"POST\", url);\n\n xhr.onload = handler;\n // xhr.onreadystatechange = handler;\n xhr.timeout = timeout;\n xhr.ontimeout = timeoutHandler;\n\n xhr.upload.addEventListener(\n \"progress\",\n function (e) {\n if (e.lengthComputable) {\n const percentage = Math.round((e.loaded * 100) / e.total);\n console.log(percentage + \"%\");\n }\n },\n false\n );\n xhr.upload.addEventListener(\"load\", function (e) {}, false);\n // xhr.overrideMimeType(\"text/plain; charset=x-user-defined-binary\");\n\n // empty string (default), \"arraybuffer\", \"blob\", \"document\", \"json\", and \"text\"\n // xhr.responseType = \"json\";\n // xhr.setRequestHeader(\"Accept\", \"application/json\");\n\n // The send method of the XMLHttpRequest has been extended to enable easy transmission of binary data by accepting an ArrayBuffer or Blob or File object.\n xhr.send(null);\n\n // // multipart/form-data upload\n // const fd = new FormData();\n // fd.append(\"avatar\", file);\n // fd.append(\"photos\", photos.files[0]);\n // fd.append(\"photos\", photos.files[1]);\n // fd.append(\"username\", \"abc123\");\n // xhr.send(fd);\n });\n}\n\nexport function fetchUseFetch(url, options, data) {\n return fetch(\n url,\n Object.assign(\n {\n method: \"POST\", // GET, POST, PUT, DELETE\n headers: {\n // \"Content-Type\": \"application/json\"\n // \"Content-Type\": \"application/x-www-form-urlencoded\"\n }, // 请求的头信息,形式为 Headers 对象或 ByteString\n body: {}, // JSON.stringify(data) 请求发送的数据 blob、BufferSource、FormData、URLSearchParams(get 或head 方法中不能包含 body)\n mode: \"\", //请求的模式,是否跨域等,如 cors、 no-cors 或 same-origin\n credentials: \"\", //cookie 的跨域策略,如 omit、same-origin 或 include\n cache: \"\", //请求的 cache 模式: default、no-store、reload、no-cache、 force-cache 或 only-if-cached\n redirect: \"follow\", // manual, *follow, error\n referrerPolicy: \"no-referrer\" // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url\n },\n options\n )\n ).then((response) => response.json());\n}\n\n/**\n * ifWebFileHasChanged(\"yourpage.html\", function (nModif, nVisit) {\n console.log(\n \"The page '\" +\n this.filepath +\n \"' has been changed on \" +\n new Date(nModif).toLocaleString() +\n \"!\"\n );\n });\n */\nexport function ifWebFileHasChanged(sURL, fCallback) {\n var xhr = new XMLHttpRequest();\n xhr.open(\"HEAD\" /* use HEAD - we only need the headers! */, sURL);\n xhr.filepath = sURL;\n xhr.callback = fCallback;\n xhr.onload = function () {\n var nLastVisit = parseFloat(\n window.localStorage.getItem(\"lm_\" + this.filepath)\n );\n var nLastModif = Date.parse(this.getResponseHeader(\"Last-Modified\"));\n if (isNaN(nLastVisit) || nLastModif > nLastVisit) {\n window.localStorage.setItem(\"lm_\" + this.filepath, Date.now());\n isFinite(nLastVisit) && this.callback(nLastModif, nLastVisit);\n }\n };\n xhr.send();\n}\n"],"names":["BaseError","message","options","EnvironmentError","FileSelectCancelError","IllegalFileError","accepts","handleInputFiles","el","cb","handleDragAndDropFiles","dropZoneEl","e","selectFile","multiple","inputElement","resolve","reject","files","illegalFiles","file","getFileExtension","readeFile","fileHandler","reader","event","size","progress","fileName","isImage","isVideo","isAudio","isWordDocument","isExcelDocument","isPowerPointDocument","isJsonDocument","isXmlDocument","getFileType","slice","verified_type","buffer","fn2ObjectURL","fn","blob","file2Image","img","onDocumentReady","check","microTask","patchDOM","oldNode","newNode","parent","i","attrName","attrValue","setCookie","cname","cvalue","exdays","d","expires","getCookie","name","ca","c","getCookieObject","item","acc","k","v","clearCookies","WebSocket","url","code","reason","wasClean","details","requestid","request","result","msg","data","resolution","rejection","error","value","getDocumentElement","getViewportSize","documentElement","getPageSize","viewport","isElementInViewport","rect","getPageScroll","getPageClient","getElementLeftInPage","element","actualLeft","current","getElementTopInPage","actualTop","getElementPositionInPage2","getElementPositionInPage","scroll","pageClient","getElementPositionInViewport","getPageVerticalScrollPercent","height","getMousePositionInPage","ev","pageScroll","getMousePositionInViewport","getMouseButton","getBrowserUserAgent","u","getBrowserLanguage","setRem","designWidth","docEl","dpr","rem","recalc","clientWidth","urlsafe_b64encode","str","urlsafe_b64decode","base64UrlStr","mod4","isURLRelative","path","checkHttpUrl","string","givenURL","getSearchData","searchString","obj","getUrlParams","query","p","setTheme","theme","DOMKeyboardKeyCode","keyName","copyToClipboard","text","getSelectedText","isFocus","ele","siblings","child","scrollToTop","isTabInView","navigateBack","navigateBack2","loadScript","src","script","saferHTML","templateData","s","arg","templateCompile","template","evalExpr","expr","addEventListener","type","handler","removeEventListener","stopPropagation","preventDefault","getEvent","getTarget","getRelatedTarget","isBrowserSupportFileAPI","callback","drawCanvasInWeb","canvasID","canvas","ctx","drawFrame","loadImageAsync","image","lazyloadImages","imgs","viewHeight","num","getImageColor","imgsrc","arrR","arrG","arrB","R","G","B","rgb","j","imageData","_getArryWeightValue","arr","existArr","duplicationArr","duplicationCount","max","maxIndex","Canvas2Image","contextType","$support","ctxBool","downloadMime","scaleCanvas","width","w","h","retCanvas","retCtx","getDataURL","saveFile","strData","fileType","saveLink","genImage","fixType","encodeData","getContext","attributes","getImageData","makeURI","genBitmapImage","oData","biWidth","biHeight","biSizeImage","bfSize","BITMAPFILEHEADER","BITMAPINFOHEADER","iPadding","aImgData","strPixelData","biWidth4","y","fromCharCode","iOffsetY","strPixelRow","x","iOffsetX","saveAsImage","convertToImage","createXMLHttpRequest","xhr","versions","getFormElementData","oFormElement","sSearch","nItem","oField","sFieldType","nFile","fetchUseXMLHttpRequest","timeout","timeoutHandler","percentage","fetchUseFetch","response","ifWebFileHasChanged","sURL","fCallback","nLastVisit","nLastModif"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"zyzgroup_core_web.umd.cjs","sources":["../src/error.ts","../src/file.ts","../src/onDocumentReady.ts","../src/microTask.ts","../src/patchDOM.ts","../src/cookie.js","../src/websocket.js","../src/position.ts","../src/mouse.js","../src/env.js","../src/rem.js","../src/url.js","../src/theme.ts","../src/DOMKeyboardKeyCode.ts","../src/dom.js","../src/canvas.js","../src/image.js","../src/Canvas2Image.ts","../src/fetch.js"],"sourcesContent":["export class BaseError extends Error {\n cause?: Error;\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = this.constructor.name;\n }\n}\n\nexport class EnvironmentError extends BaseError {\n constructor() {\n super(\"This is not a browser environment\");\n }\n}\n\nexport class FileSelectCancelError extends BaseError {\n constructor() {\n super(\"Cancel select\");\n }\n}\n\nexport class IllegalFileError extends BaseError {\n accepts: string[];\n\n constructor(accepts: string[]) {\n super(`Please select files in ${accepts} format`);\n this.accepts = accepts;\n }\n}\n","import {\n EnvironmentError,\n FileSelectCancelError,\n IllegalFileError\n} from \"./error\";\n\n// <input type=\"file\" id=\"input\">\n// <input type=\"file\" id=\"input\" multiple accept=\"image/*\" style=\"display:none\" name=\"photos[]\">\n// <label for=\"input\">Select some files</label>\n// input css :focus :focus-within\nexport function handleInputFiles(\n el: HTMLInputElement,\n cb: (files: FileList | null) => any\n) {\n el.addEventListener(\n \"change\",\n function () {\n cb(el.files);\n },\n false\n );\n}\n\nexport function handleDragAndDropFiles(\n dropZoneEl: HTMLElement,\n cb: (files: FileList | null) => any\n) {\n // dragover dragenter dragend drop\n dropZoneEl.addEventListener(\n \"dragover\",\n function (e) {\n e.stopPropagation();\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"copy\";\n },\n false\n );\n dropZoneEl.addEventListener(\n \"drop\",\n function (e) {\n e.stopPropagation();\n e.preventDefault();\n if (e.dataTransfer) cb(e.dataTransfer.files);\n },\n false\n );\n}\n\n/**\n * 选择系统文件\n *\n * @param accepts 可选文件后缀\n * @param multiple 是否多选\n * @returns\n */\nexport const selectFile = (\n accepts: string[] = [\"*\"],\n multiple?: boolean\n): Promise<File[]> => {\n if (!globalThis.document || !(globalThis.document instanceof Document)) {\n throw new EnvironmentError();\n }\n const inputElement = globalThis.document.createElement(\"input\");\n inputElement.setAttribute(\"type\", \"file\");\n inputElement.setAttribute(\"visibility\", \"hidden\");\n if (Array.isArray(accepts) && accepts.length > 0) {\n inputElement.setAttribute(\"accept\", accepts.join(\",\"));\n }\n if (multiple) {\n inputElement.setAttribute(\"multiple\", \"true\");\n }\n inputElement.click();\n\n return new Promise((resolve, reject) => {\n globalThis.addEventListener(\n \"focus\",\n () => {\n setTimeout(() => {\n if (!inputElement.files || inputElement.files?.length === 0) {\n reject(new FileSelectCancelError());\n }\n }, 1000);\n },\n { once: true }\n );\n inputElement.addEventListener(\"change\", () => {\n if (!inputElement.files || inputElement.files?.length === 0) {\n reject(new FileSelectCancelError());\n } else {\n const files = Array.from(inputElement.files);\n if (illegalFiles(files)) {\n reject(new IllegalFileError(accepts));\n }\n resolve(files);\n }\n });\n });\n\n function illegalFiles(files: File[]): boolean {\n return (\n !accepts.includes(\"*\") &&\n files.some((file) => !accepts.includes(`.${getFileExtension(file)}`))\n );\n }\n};\n\nexport interface FileHandler {\n (fileRender: FileReader): void;\n}\n\nexport const readeFile = <T extends string | ArrayBuffer | null>(\n fileHandler: FileHandler\n): Promise<T> => {\n const reader = new FileReader();\n return new Promise((resolve, reject) => {\n reader.addEventListener(\n \"progress\",\n (event: FileReaderEventMap[\"progress\"]) => {\n const size = \"(\" + Math.floor(event.total / 1000) + \" KB)\";\n const progress = Math.floor((event.loaded / event.total) * 100) + \"%\";\n console.log(`Loading size: ${size} progress: ${progress}`);\n }\n );\n reader.addEventListener(\"load\", (event: FileReaderEventMap[\"load\"]) => {\n resolve(event.target?.result as T);\n });\n reader.addEventListener(\"error\", (event: FileReaderEventMap[\"error\"]) => {\n reject(event);\n });\n fileHandler(reader);\n // reader.readAsDataURL(file);\n // reader.readAsBinaryString(file);\n });\n};\n\n/**\n * 获取文件后缀\n *\n * @param file 文件或文件名\n * @returns\n */\nexport const getFileExtension = (file: File | string): string => {\n let fileName: string;\n if (file instanceof File) {\n fileName = file.name;\n } else {\n fileName = file;\n }\n return fileName.match(/\\.([0-9a-z]+)(?:[\\\\?#]|$)/i)![1] ?? \"\";\n};\n\nexport const isImage = (file: File): boolean => {\n return /^image\\//.test(file.type);\n};\n\nexport const isVideo = (file: File): boolean => {\n return /^video\\//.test(file.type);\n};\n\nexport const isAudio = (file: File): boolean => {\n return /^audio\\//.test(file.type);\n};\n\nexport const isWordDocument = (file: File): boolean => {\n return /^application\\/(?:vnd\\.openxmlformats-officedocument\\.wordprocessingml\\.document|msword|vnd\\.ms-word\\.document\\.macroenabled\\.12|vnd\\.openxmlformats-officedocument\\.wordprocessingml\\.template|vnd\\.ms-word\\.template\\.macroenabled\\.12)$/.test(\n file.type\n );\n};\n\nexport const isExcelDocument = (file: File): boolean => {\n return /^application\\/(?:vnd\\.openxmlformats-officedocument\\.spreadsheetml\\.sheet|vnd\\.ms-excel|vnd\\.ms-excel\\.sheet\\.macroenabled\\.12|vnd\\.openxmlformats-officedocument\\.spreadsheetml\\.template|vnd\\.ms-excel\\.template\\.macroenabled\\.12)$/.test(\n file.type\n );\n};\n\nexport const isPowerPointDocument = (file: File): boolean => {\n return /^application\\/(?:vnd\\.ms-powerpoint|vnd\\.openxmlformats-officedocument\\.presentationml\\.presentation|vnd\\.ms-powerpoint\\.presentation\\.macroenabled\\.12|vnd\\.openxmlformats-officedocument\\.presentationml\\.template|vnd\\.ms-powerpoint\\.template\\.macroenabled\\.12)$/.test(\n file.type\n );\n};\n\nexport const isJsonDocument = (file: File): boolean => {\n return /^application\\/json$/.test(file.type);\n};\n\nexport const isXmlDocument = (file: File): boolean => {\n return /^(?:application|text)\\/(?:xml|xhtml\\+xml)$/.test(file.type);\n};\n\n/**\n * 判断文件类型\n * @example <input type=\"file\" onchange=\"getFileType(this.files[0])\"></input>\n */\nexport function getFileType(file: File) {\n // 文件开头的四个字节,生成一个 Blob 对象\n const slice = file.slice(0, 4);\n const reader = new FileReader();\n let verified_type: string;\n return new Promise((resolve, reject) => {\n reader.onload = function () {\n const buffer = reader.result as ArrayBuffer;\n // 将这四个字节的内容,视作一个32位整数\n const view = new DataView(buffer);\n const magic = view.getUint32(0, false);\n // 根据文件的前四个字节,判断它的类型\n switch (magic) {\n case 0x89504e47:\n verified_type = \"image/png\";\n break;\n case 0x47494638:\n verified_type = \"image/gif\";\n break;\n case 0x25504446:\n verified_type = \"application/pdf\";\n break;\n case 0x504b0304:\n verified_type = \"application/zip\";\n break;\n }\n return resolve(verified_type);\n };\n // 读取这四个字节\n reader.readAsArrayBuffer(slice);\n });\n}\n\n/**\n * 将一个函数转换为 blob,然后为这个 blob 生成 URL 对象\n */\nexport function fn2ObjectURL(fn: (...args: any[]) => any) {\n const blob = new Blob([\"(\" + fn.toString() + \")()\"], {\n type: \"application/javascript\"\n });\n return URL.createObjectURL(blob);\n // URL.revokeObjectURL(URL.createObjectURL(blob))\n}\n\nexport function file2Image(\n file: File,\n options?: {\n width?: number;\n height?: number;\n }\n) {\n if (!file.type.startsWith(\"image/\")) {\n return;\n }\n const img: HTMLImageElement = document.createElement(\"img\");\n img.src = URL.createObjectURL(file);\n img.width = options?.width ?? 60;\n img.height = options?.height ?? 60;\n img.onload = function () {\n // URL.revokeObjectURL(img.src);\n };\n return img;\n}\n","export function onDocumentReady(cb: () => void) {\n function check() {\n if (document.readyState === \"loading\") return;\n cb();\n document.removeEventListener(\"DOMContentLoaded\", check);\n }\n\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n document.addEventListener(\"DOMContentLoaded\", check);\n check();\n }\n}\n","// Polyfill\nexport function microTask(cb: () => void) {\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(cb);\n } else {\n Promise.resolve()\n .then(cb)\n .catch((e) =>\n setTimeout(() => {\n throw e;\n })\n );\n }\n}\n","export function patchDOM(\n oldNode: HTMLElement,\n newNode: HTMLElement,\n parent: HTMLElement\n) {\n if (!oldNode) {\n if (parent && newNode) {\n parent.appendChild(newNode);\n }\n return;\n }\n\n if (oldNode.isEqualNode(newNode)) return;\n\n if (oldNode.nodeName !== newNode.nodeName) {\n parent.replaceChild(newNode, oldNode);\n return;\n }\n\n if (oldNode.nodeType === Node.TEXT_NODE) {\n if (oldNode.textContent !== newNode.textContent) {\n oldNode.textContent = newNode.textContent;\n }\n return;\n }\n\n for (let i = oldNode.attributes.length - 1; i >= 0; i--) {\n const attrName = oldNode.attributes[i].name;\n if (!newNode.hasAttribute(attrName) && attrName !== \"open\") {\n oldNode.removeAttribute(attrName);\n }\n }\n\n for (let i = 0; i < newNode.attributes.length; i++) {\n const attrName = newNode.attributes[i].name;\n const attrValue = newNode.attributes[i].value;\n oldNode.setAttribute(attrName, attrValue);\n }\n\n for (let i = 0; i < newNode.childNodes.length; i++) {\n if (oldNode.childNodes[i]) {\n patchDOM(\n oldNode.childNodes[i] as HTMLElement,\n newNode.childNodes[i] as HTMLElement,\n oldNode\n );\n } else {\n oldNode.appendChild(newNode.childNodes[i].cloneNode(true));\n }\n }\n\n while (oldNode.childNodes.length > newNode.childNodes.length) {\n if (oldNode.lastChild) oldNode.removeChild(oldNode.lastChild);\n }\n}\n","export function setCookie(cname, cvalue, exdays) {\n var d = new Date();\n d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);\n var expires = \"expires=\" + d.toGMTString();\n document.cookie = cname + \"=\" + cvalue + \"; \" + expires;\n}\n\nexport function getCookie(cname) {\n var name = cname + \"=\";\n var ca = document.cookie.split(\";\");\n for (var i = 0; i < ca.length; i++) {\n var c = ca[i].trim();\n if (c.indexOf(name) == 0) return c.substring(name.length, c.length);\n }\n return \"\";\n // return `; ${document.cookie}`.split(`; ${cname}=`).pop().split(\";\").shift();\n}\n\n// Convert cookie to object\nexport const getCookieObject = () =>\n document.cookie\n .split(\";\")\n .map((item) => item.split(\"=\"))\n .reduce((acc, [k, v]) => (acc[k.trim().replace('\"', \"\")] = v) && acc, {});\n\n// Clear all cookies\nexport const clearCookies = () =>\n document.cookie\n .split(\";\")\n .forEach(\n (c) =>\n (document.cookie = c\n .replace(/^ +/, \"\")\n .replace(/=.*/, `=;expires=${new Date().toUTCString()};path=/`))\n );\n","/// wss://echo.websocket.org\n\nexport class WebSocket {\n constructor(url) {\n // Here we create an empty array [] which we will add to later\n // Note that we can use {} also, which is for empty objects\n // (arrays are objects)\n this.waitingResponse = [];\n\n // Here we create an empty array [] that represents the queue of\n // messages that didn't send because the socket was closed and\n // are queued up to be sent during the onopen handler (which iterates\n // through this array)\n this.messageQueue = [];\n\n this.url = url;\n\n // We separate out the socket initialisation into its own function\n // as we will also call it during a reconnect attempt\n this.createSocket();\n }\n\n // The reconnection logic is that whenever a message fails to send, the\n // message is added to messageQueue and a reconnection attempt is made.\n // So, when a connection is lost, it is reconnected to after a certain\n // time, but rather only when the user initiates an action that must\n // message (i.e.) interact with the WebSocket\n createSocket() {\n this.socket = new WebSocket(this.url);\n\n // Iterate through the queue of messages that haven't been sent\n // If this queue is empty then no messages are sent\n\n // All messages in the message queue arise from a previous\n // sendPayload event, thus are parsed in the correct JSON form\n // and have an associated request object in waitingResponse\n this.socket.onopen = () => {\n this.messageQueue.forEach((item) => this.socket.send(item));\n this.messageQueue = [];\n };\n\n this.socket.onclose = (e) => {\n const { code, reason, wasClean } = e;\n console.log(`ws closed : ${code} ${reason} ${wasClean}`);\n };\n\n this.socket.onerror = (e) => {\n console.log(`ws error : ${e}`);\n };\n\n this.socket.onmessage = (e) => {\n this.processMessage(e);\n };\n }\n\n // Creates a new socket and adds any unsent\n // messages onto the message queue\n recreateSocket(message) {\n console.log(\"Reconnection Attempted\");\n this.messageQueue.push(message);\n this.createSocket();\n }\n\n // Closes a socket, which can take a bit\n // of time (few seconds) since a roundtrip to\n // the server is done\n closeSocket() {\n this.socket.close();\n console.log(\"Socket closed manually.\");\n }\n\n // Exposes a function for users to start a new\n // socket - there is no way to 'reconnect' to\n // a socket, a new websocket needs to be created\n openSocket() {\n this.createSocket();\n console.log(\"Socket opened manually.\");\n }\n\n async sendPayload(details) {\n // Create a request where request = { sent: + new Date()} and this.waiting... = request\n // this means both request and waitingResponse[details.requestid] point to the same thing\n // so that changing request.test will also result in waitingResponse[details.requestid].test\n // having the same value\n\n // Note that details.requestid here is an index = the timestamp. Later when we process\n // messages received, we will check the timestamp of the requestid of the message received\n // against this waitingResponse array and resolve the request if a match is found\n\n let requestid = +new Date();\n const request = (this.waitingResponse[requestid] = { sent: requestid });\n\n // Here we combine the request (which at this point is just { sent: ...} with the\n // actual data to be sent to form the final message to send\n const message = { ...request, ...details };\n\n // If Socket open then send the details (message) in String Format\n try {\n // WebSocket.CONNECTING WebSocket.OPEN WebSocket.CLOSING WebSocket.CLOSED\n if (this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify(message));\n } else {\n // Otherwise we try to recreate the socket and send the message\n // after recreating the socket\n this.recreateSocket(JSON.stringify(message));\n }\n\n // Here we create a new promise function\n // We set the resolve property of request [which is also referenced\n // by waitingResponse[details.requestid] to the Promise's resolve function\n\n // Thus we can resolve the promise from processMessage (refer below)\n\n // We reject after 5 seconds of not receiving the associated message\n // with the same requestid\n const result = await new Promise(function (resolve, reject) {\n // This will automatically run, allowing us to access\n // the resolve function from outside this function\n request.resolve = resolve;\n\n console.log(request);\n // This will take 5 seconds to run, which becomes the lifecycle\n // of this Promise function - the resolve function must be\n // called before this point\n setTimeout(() => {\n reject(\"Timeout\"); // or resolve({action: \"to\"}), or whatever\n }, 5000);\n });\n\n console.info(\"Time took\", (+new Date() - request.sent) / 1000);\n\n // function returns result\n return result; // or {...request, ...result} if you care\n } finally {\n // code to run regardless of whether try worked or error thrown\n console.log(\"Exit code ran successfully\");\n\n delete this.waitingResponse[requestid];\n }\n }\n\n // Message Receiver, we attach this to the onmessage handler\n // Expects message to be in JSON format, otherwise throws\n // an error and simply logs the message to console\n\n // The message must also have a requestid property (we\n // use lowercase \"i\" here because Common Lisp's JZON library\n // lowercases property names in JSON messages\n\n // Test if the requestid passed in has an entry in the waitingResponse\n // queue (data.requestid is the array index and the sendPayload function\n // sets a value in this array for various id indexes to { sent: .. }\n // This index also has a reference to the resolve function for the\n // associated promise for that request id\n\n // If that is true ('truthy' via if (request)), then resolve the\n // associated promise via request.resolve(data), where data is\n // the value resolved by the promise\n\n // Otherwise pass a variety of console warnings / logs - the message\n // will not be handled and disappear from the future (i.e. every\n // message needs a requestid set in waitingResponse to be caught\n\n // We could probably add in a router for server initiated messages\n // to be handled (under the second warning below)\n async processMessage(msg) {\n try {\n let data = JSON.parse(msg.data);\n\n if (Object.prototype.hasOwnProperty.call(data, \"requestid\")) {\n const request = this.waitingResponse[data.requestid];\n if (request) request.resolve(data);\n else\n console.warn(\n \"Got data but found no associated request, already timed out?\",\n data\n );\n } else {\n // Add handlers here for messages without request ID\n console.warn(\"Got data without request id\", data);\n }\n } catch {\n console.log(msg.data);\n }\n }\n\n // Main entry point for calling functions with a simple\n // callback to action to perform on the received data\n // Exists here to reduce boilerplate for the calling function\n async sendRequest(\n details,\n resolution,\n rejection = (error) => {\n console.log(error);\n }\n ) {\n this.sendPayload(details).then(\n function (value) {\n resolution(value);\n },\n function (error) {\n rejection(error);\n }\n );\n }\n\n // Second entry point for one direction messages\n // i.e. not expecting any responses. This bypasses\n // the request-response promise functions above\n\n // Attempts to JSON.stringify the object first,\n // and just sends the object if cannot be made\n // into a JSON string\n\n sendMessage(details) {\n // Example of an Immediately-Invoked Function Expression\n const message = (() => {\n try {\n return JSON.stringify(details);\n } catch (e) {\n return details;\n }\n })();\n\n if (this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(message);\n } else {\n // Otherwise we try to recreate the socket and send the message\n // after recreating the socket\n this.recreateSocket(message);\n }\n }\n}\n","export function getDocumentElement() {\n if (document.compatMode == \"BackCompat\") {\n return document.body;\n } else {\n return document.documentElement;\n }\n}\n\n// 获取可视区域大小\nexport function getViewportSize() {\n const documentElement = getDocumentElement();\n return {\n width: documentElement.clientWidth || window.innerWidth,\n height: documentElement.clientHeight || window.innerHeight\n };\n}\n\n// 获取页面整体大小\nexport function getPageSize() {\n const documentElement = getDocumentElement();\n const viewport = getViewportSize();\n return {\n width: Math.max(documentElement.scrollWidth, viewport.width),\n height: Math.max(documentElement.scrollHeight, viewport.height)\n };\n}\n\n/**\n * 判断元素是否在可视区域\n *\n * DOMRect 对象包含了一组用于描述边框的只读属性——top,lef,right,bottom,width,height,单位为像素。\n * 除了 width 和 height 外的属性都是相对于浏览器可视范围的左上角位置而言的。\n * right是指元素右边界距窗口最左边的距离,bottom是指元素下边界距窗口最上面的距离。\n * 兼容所有浏览器写法:\n * var ro = object.getBoundingClientRect();\n * var Top = ro.top;\n * var Bottom = ro.bottom;\n * var Left = ro.left;\n * var Right = ro.right;\n * var Width = ro.width || Right - Left;\n * var Height = ro.height || Bottom - Top;\n */\nexport function isElementInViewport(el: HTMLElement) {\n const viewport = getViewportSize();\n const rect = el.getBoundingClientRect();\n return (\n rect.bottom > 0 &&\n rect.top < viewport.height &&\n rect.right > 0 &&\n rect.left < viewport.width\n );\n}\n\n//scrollTop和scrollLeft属性是可以赋值的,并且会立即自动滚动网页到相应位置,因此可以利用它们改变网页元素的相对位置\nexport function getPageScroll() {\n const documentElement = getDocumentElement();\n return {\n scrollLeft: documentElement.scrollLeft,\n scrollTop: documentElement.scrollTop\n };\n}\n\nexport function getPageClient() {\n const documentElement = getDocumentElement();\n return {\n clientLeft: documentElement.clientLeft,\n clientTop: documentElement.clientTop\n };\n}\n\nexport function getElementLeftInPage(element: HTMLElement) {\n let actualLeft = element.offsetLeft;\n let current = element.offsetParent as HTMLElement;\n while (current !== null) {\n actualLeft += current.offsetLeft;\n current = current.offsetParent as HTMLElement;\n }\n return actualLeft;\n}\n\nexport function getElementTopInPage(element: HTMLElement) {\n let actualTop = element.offsetTop;\n let current = element.offsetParent as HTMLElement;\n while (current !== null) {\n actualTop += current.offsetTop;\n current = current.offsetParent as HTMLElement;\n }\n return actualTop;\n}\n\nexport function getElementPositionInPage2(element: HTMLElement) {\n return {\n x: getElementLeftInPage(element),\n y: getElementTopInPage(element)\n };\n}\nexport function getElementPositionInPage(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n const scroll = getPageScroll();\n const pageClient = getPageClient();\n return {\n x: rect.left + scroll.scrollLeft - pageClient.clientLeft,\n y: rect.top + scroll.scrollTop - pageClient.clientTop\n };\n}\n\nexport function getElementPositionInViewport(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n return {\n x: rect.left,\n y: rect.top\n };\n}\n\n// horizontal scroll indicator\n// window.onscroll = () => getPageVerticalScrollPercent();\nexport function getPageVerticalScrollPercent() {\n const documentElement = getDocumentElement();\n // https://www.w3schools.com/howto/howto_js_scroll_indicator.asp\n const height = documentElement.scrollHeight - documentElement.clientHeight;\n return height <= 0 ? 0 : (documentElement.scrollTop / height) * 100;\n}\n\n//////////////////////////////// 鼠标 ////////////////////////////////\nexport function getMousePositionInPage(ev: MouseEvent) {\n if (ev.pageX && ev.pageY) {\n return { x: ev.pageX, y: ev.pageY };\n }\n const pageScroll = getPageScroll();\n const pageClient = getPageClient();\n return {\n x: ev.clientX + pageScroll.scrollLeft - pageClient.clientLeft,\n y: ev.clientY + pageScroll.scrollTop - pageClient.clientTop\n };\n}\n\nexport function getMousePositionInViewport(ev: MouseEvent) {\n return {\n x: ev.clientX,\n y: ev.clientY\n };\n}\n","/**\n * 鼠标按键\n * @returns 0 左键 1 中键 2 右键\n */\nexport function getMouseButton(event) {\n if (document.implementation.hasFeature(\"MouseEvents\", \"2.0\")) {\n return event.button;\n } else {\n switch (event.button) {\n case 0:\n case 1:\n case 3:\n case 5:\n case 7:\n return 0; //左键\n case 2:\n case 6:\n return 2; //右键\n case 4:\n return 1; //中键\n }\n }\n}\n","export function getBrowserUserAgent() {\n // Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Mobile Safari/537.36\n let u = navigator.userAgent;\n return {\n trident: u.indexOf(\"Trident\") > -1, //IE内核\n presto: u.indexOf(\"Presto\") > -1, //opera内核\n webKit: u.indexOf(\"AppleWebKit\") > -1, //苹果、谷歌内核\n gecko: u.indexOf(\"Gecko\") > -1 && u.indexOf(\"KHTML\") == -1, //火狐内核\n mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端\n ios: !!u.match(/\\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端\n android: u.indexOf(\"Android\") > -1 || u.indexOf(\"Linux\") > -1, //android终端或uc浏览器\n iPhone: u.indexOf(\"iPhone\") > -1, //是否为iPhone或者QQHD浏览器\n iPad: u.indexOf(\"iPad\") > -1, //是否iPad\n webApp: u.indexOf(\"Safari\") == -1 //是否web应该程序,没有头部与底部\n };\n}\n\nexport function getBrowserLanguage() {\n return (navigator.browserLanguage || navigator.language).toLowerCase();\n}\n\nexport function isIOS() {\n // TODO: This is not a great way to detect iOS, but it's the best I can do for now.\n // - `window.platform` is deprecated\n // - `window.userAgentData.platform` is still experimental (https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/platform)\n // - `window.userAgent` also doesn't contain the required information\n return (\n // Check if it is an iPhone\n /iPhone/gi.test(window.navigator.platform) ||\n // Check if it is an iPad. iPad reports itself as \"MacIntel\", but we can check if it is a touch\n // screen. Let's hope that Apple doesn't release a touch screen Mac (or maybe this would then\n // work as expected 🤔).\n (/Mac/gi.test(window.navigator.platform) &&\n window.navigator.maxTouchPoints > 0)\n );\n}\n\nexport function isAndroid() {\n return /Android/gi.test(window.navigator.userAgent);\n}\n\nexport function isMobile() {\n return isIOS() || isAndroid();\n}\n","import { getBrowserUserAgent } from \"./env\";\n\nexport function setRem(designWidth) {\n // 修正页面高度100%的渲染错误\n // document.documentElement.style.height = window.innerHeight + \"px\";\n\n var docEl = document.documentElement;\n\n // const ua = getBrowserUserAgent();\n // var dpr = ua.android\n // ? 1\n // : window.top === window.self\n // ? window.devicePixelRatio\n // : 1;\n var dpr = window.devicePixelRatio;\n docEl.dataset.dpr = dpr;\n\n // 设置viewport,进行缩放,达到高清效果\n // var metaEl = document.querySelector('meta[name=\"viewport\"]');\n // var scale = 1 / dpr;\n // metaEl.setAttribute(\n // \"content\",\n // \"width=device-width\" +\n // \",initial-scale=\" +\n // scale +\n // \",maximum-scale=\" +\n // scale +\n // \", minimum-scale=\" +\n // scale +\n // \",user-scalable=no, viewport-fit=cover, shrink-to-fit=no\"\n // );\n\n // default: 1rem = 100px\n var rem = 100;\n var recalc = function () {\n // var clientWidth = docEl.clientWidth;\n // // 限制最大rem\n // if (clientWidth > maxWidth) {\n // clientWidth = maxWidth;\n // }\n // // 限制最小rem\n // if (clientWidth < minWidth) {\n // clientWidth = minWidth;\n // }\n var clientWidth = Math.min(docEl.clientWidth, designWidth);\n docEl.dataset.width = clientWidth;\n docEl.dataset.rem = rem = Math.round(100 * (clientWidth / designWidth));\n // 配合:设置viewport,进行缩放,达到高清效果\n // docEl.dataset.rem = rem =\n // Math.round(100 * (clientWidth / designWidth)) * dpr;\n docEl.style.fontSize = rem + \"px\";\n };\n\n recalc();\n\n // 给js调用的,某一dpr下rem和px之间的转换函数\n window.rem2px = function (v) {\n v = parseFloat(v);\n return v * rem;\n };\n window.px2rem = function (v) {\n v = parseFloat(v);\n return v / rem;\n };\n\n if (!window.addEventListener) return;\n window.addEventListener(\n \"orientationchange\" in window ? \"orientationchange\" : \"resize\",\n recalc,\n false\n );\n}\n","const path = require(\"path\"); // 路径模块\nconst qs = require(\"querystring\"); // 地址参数解析模块\nconst util = require(\"util\"); // 常用工具方法模块\nconst url = require(\"url\"); // URL 解析模块\n\n// // 新定义的内置对象\n// new Promise();\n// // 原有内置对象新添加的静态方法\n// Array.from();\n// // 原有内置对象新添加的实例方法\n// Array.prototype.includes();\n\n// 编码\nexport function urlsafe_b64encode(str) {\n return btoa(encodeURIComponent(str))\n .replaceAll(\"+\", \"*\")\n .replaceAll(\"/\", \"-\")\n .replaceAll(\"=\", \"\");\n}\n\n// 解码\nexport function urlsafe_b64decode(base64UrlStr) {\n let data = base64UrlStr.replaceAll(\"*\", \"+\").replaceAll(\"-\", \"/\");\n let mod4 = data.length % 4;\n if (mod4) {\n data = data.padEnd(data.length + (4 - mod4), \"=\");\n }\n return decodeURIComponent(atob(data));\n}\n\nexport const isURLRelative = (path) => !/^([a-z]+:)?[\\\\/]/i.test(path);\n\nexport function checkHttpUrl(string) {\n let givenURL;\n try {\n givenURL = new URL(string);\n } catch (error) {\n console.log(error);\n return false;\n }\n // let host = givenURL.host;\n // let path = givenURL.pathname;\n return givenURL.protocol === \"http:\" || givenURL.protocol === \"https:\";\n}\n\n/**\n * 获取地址栏get数据\n * - 有值的时候返回一个包含所有参数的对象\n * - 无值的时候,返回 `false`\n *\n * @returns\n */\nexport function getSearchData() {\n let searchString = location.search;\n if (searchString) {\n let obj = {};\n searchString = searchString.substring(1, searchString.length);\n let tempArray = searchString.split(\"&\");\n tempArray.forEach((item) => {\n obj[item.split(\"=\")[0]] = decodeURIComponent(item.split(\"=\")[1]);\n });\n return obj;\n } else {\n return false;\n }\n}\n\nexport const getUrlParams = (query) =>\n Array.from(new URLSearchParams(query)).reduce(\n (p, [k, v]) =>\n Object.assign({}, p, {\n [k]: p[k] ? (Array.isArray(p[k]) ? p[k] : [p[k]]).concat(v) : v\n }),\n {}\n );\n\n/***\n * * 监听 hash 变化\n * */\n// window.addEventListener(\"hashchange\", function onHashChange() {\n// // 去除 # 号\n// let hash = location.hash.replace(/^#/, \"\");\n// // 简单解析示例\n// const parsed = hash.split(\"?\");\n// const pathname = parsed[0];\n// const search = parsed[1];\n// // 切换页面内容\n// switch (pathname) {\n// case \"/home\":\n// document.body.innerHTML = `Hello ${search}`;\n// return;\n// default:\n// return;\n// }\n// });\n\n/***\n * * 监听 history 变化\n * */\nfunction onHistoryChange() {\n // 解析 location\n const { pathname, search } = location;\n\n // 根据页面不同执行不同内容\n switch (pathname) {\n case \"/home\":\n document.body.innerHTML = `Hello ${search.replace(/^\\?/, \"\")}`;\n return;\n default:\n document.body.innerHTML = `Hello World`;\n return;\n }\n}\n/***\n * * 页面跳转\n * pushState(\"/home?name=xxx\");\n * */\nfunction pushState(target) {\n history.pushState(null, \"\", target);\n // window.dispatchEvent(new PopStateEvent(\"popstate\"));\n onHistoryChange();\n}\n// window.addEventListener(\"popstate\", onHistoryChange);\n","export function setTheme(theme?: string) {\n theme = theme || localStorage.theme;\n if (!theme) {\n theme = window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n localStorage.theme = theme;\n }\n document.documentElement.classList.toggle(\"dark\", theme === \"dark\");\n}\n","export class DOMKeyboardKeyCode {\n public static getEvent(event: KeyboardEvent): { code: number; key: string } {\n // const key = event.code;\n const code = event.keyCode || event.charCode;\n return {\n code: code,\n key: DOMKeyboardKeyCode.codeToKey(code)\n };\n }\n\n /**\n * keyToCode(keyName: string)\n *\n * @param keyName {string} - The keyName of the key you wish to get the code for.\n *\n * @return {number} - Will be the keycode of the given keyName, or -1 if it does not exist in\n * the set of known keys.\n */\n public static keyToCode(keyName: string): number {\n if (\n Object.prototype.hasOwnProperty.call(\n DOMKeyboardKeyCode.keyToCodes,\n keyName\n )\n ) {\n return DOMKeyboardKeyCode.keyToCodes[keyName];\n } else {\n return -1;\n }\n }\n\n /**\n * codeToKey(code: string)\n *\n * @param code {string} - The key code to lookup the keyname for\n *\n * @reaturn {string} - Will be the keyname of the given Code or '' if it does not\n * exist on the set of known codes.\n */\n public static codeToKey(code: number): string {\n if (\n Object.prototype.hasOwnProperty.call(\n DOMKeyboardKeyCode.codeToKeys,\n code.toString()\n )\n ) {\n return DOMKeyboardKeyCode.codeToKeys[code.toString()];\n } else {\n return \"\";\n }\n }\n\n private static keyToCodes: { [index: string]: number } = {\n \"0\": 48,\n \"1\": 49,\n \"2\": 50,\n \"3\": 51,\n \"4\": 52,\n \"5\": 53,\n \"6\": 54,\n \"7\": 55,\n \"8\": 56,\n \"9\": 57,\n spacebar: 32,\n backspace: 8,\n tab: 9,\n enter: 13,\n shift: 16,\n ctrl: 17,\n alt: 18,\n pause_break: 19,\n caps_lock: 20,\n escape: 27,\n page_up: 33,\n page_down: 34,\n end: 35,\n home: 36,\n left_arrow: 37,\n up_arrow: 38,\n right_arrow: 39,\n down_arrow: 40,\n insert: 45,\n delete: 46,\n a: 65,\n b: 66,\n c: 67,\n d: 68,\n e: 69,\n f: 70,\n g: 71,\n h: 72,\n i: 73,\n j: 74,\n k: 75,\n l: 76,\n m: 77,\n n: 78,\n o: 79,\n p: 80,\n q: 81,\n r: 82,\n s: 83,\n t: 84,\n u: 85,\n v: 86,\n w: 87,\n x: 88,\n y: 89,\n z: 90,\n left_window_key: 91,\n right_window_key: 92,\n select_key: 93,\n numpad_0: 96,\n numpad_1: 97,\n numpad_2: 98,\n numpad_3: 99,\n numpad_4: 100,\n numpad_5: 101,\n numpad_6: 102,\n numpad_7: 103,\n numpad_8: 104,\n numpad_9: 105,\n multiply: 106,\n add: 107,\n subtract: 109,\n decimal_point: 110,\n divide: 111,\n f1: 112,\n f2: 113,\n f3: 114,\n f4: 115,\n f5: 116,\n f6: 117,\n f7: 118,\n f8: 119,\n f9: 120,\n f10: 121,\n f11: 122,\n f12: 123,\n num_lock: 144,\n scroll_lock: 145,\n semi_colon: 186,\n equal_sign: 187,\n comma: 188,\n dash: 189,\n period: 190,\n forward_slash: 191,\n grave_accent: 192,\n open_bracket: 219,\n back_slash: 220,\n close_braket: 221,\n single_quote: 222\n };\n\n private static codeToKeys: { [index: string]: string } = {\n \"8\": \"backspace\",\n \"9\": \"tab\",\n \"13\": \"enter\",\n \"16\": \"shift\",\n \"17\": \"ctrl\",\n \"18\": \"alt\",\n \"19\": \"pause_break\",\n \"20\": \"caps_lock\",\n \"27\": \"escape\",\n \"32\": \"spacebar\",\n \"33\": \"page_up\",\n \"34\": \"page_down\",\n \"35\": \"end\",\n \"36\": \"home\",\n \"37\": \"left_arrow\",\n \"38\": \"up_arrow\",\n \"39\": \"right_arrow\",\n \"40\": \"down_arrow\",\n \"45\": \"insert\",\n \"46\": \"delete\",\n \"48\": \"0\",\n \"49\": \"1\",\n \"50\": \"2\",\n \"51\": \"3\",\n \"52\": \"4\",\n \"53\": \"5\",\n \"54\": \"6\",\n \"55\": \"7\",\n \"56\": \"8\",\n \"57\": \"9\",\n \"65\": \"a\",\n \"66\": \"b\",\n \"67\": \"c\",\n \"68\": \"d\",\n \"69\": \"e\",\n \"70\": \"f\",\n \"71\": \"g\",\n \"72\": \"h\",\n \"73\": \"i\",\n \"74\": \"j\",\n \"75\": \"k\",\n \"76\": \"l\",\n \"77\": \"m\",\n \"78\": \"n\",\n \"79\": \"o\",\n \"80\": \"p\",\n \"81\": \"q\",\n \"82\": \"r\",\n \"83\": \"s\",\n \"84\": \"t\",\n \"85\": \"u\",\n \"86\": \"v\",\n \"87\": \"w\",\n \"88\": \"x\",\n \"89\": \"y\",\n \"90\": \"z\",\n \"91\": \"left_window_key\",\n \"92\": \"right_window_key\",\n \"93\": \"select_key\",\n \"96\": \"numpad_0\",\n \"97\": \"numpad_1\",\n \"98\": \"numpad_2\",\n \"99\": \"numpad_3\",\n \"100\": \"numpad_4\",\n \"101\": \"numpad_5\",\n \"102\": \"numpad_6\",\n \"103\": \"numpad_7\",\n \"104\": \"numpad_8\",\n \"105\": \"numpad_9\",\n \"106\": \"multiply\",\n \"107\": \"add\",\n \"109\": \"subtract\",\n \"110\": \"decimal_point\",\n \"111\": \"divide\",\n \"112\": \"f1\",\n \"113\": \"f2\",\n \"114\": \"f3\",\n \"115\": \"f4\",\n \"116\": \"f5\",\n \"117\": \"f6\",\n \"118\": \"f7\",\n \"119\": \"f8\",\n \"120\": \"f9\",\n \"121\": \"f10\",\n \"122\": \"f11\",\n \"123\": \"f12\",\n \"144\": \"num_lock\",\n \"145\": \"scroll_lock\",\n \"186\": \"semi_colon\",\n \"187\": \"equal_sign\",\n \"188\": \"comma\",\n \"189\": \"dash\",\n \"190\": \"period\",\n \"191\": \"forward_slash\",\n \"192\": \"grave_accent\",\n \"219\": \"open_bracket\",\n \"220\": \"back_slash\",\n \"221\": \"close_braket\",\n \"222\": \"single_quote\"\n };\n}\n","export const copyToClipboard = (text) => navigator.clipboard.writeText(text);\n\nexport const getSelectedText = () => window.getSelection().toString();\n\n// Check if an element is focused\nexport const isFocus = (ele) => ele === document.activeElement;\n\n// Get all siblings of an element\nexport const siblings = (ele) =>\n [].slice.call(ele.parentNode.children).filter((child) => child !== ele);\n\n// Scroll to the top of the page\nexport const scrollToTop = () => window.scrollTo(0, 0);\n\n// Check if the current tab is in view/focus\nexport const isTabInView = () => !document.hidden;\n\nexport const navigateBack = () => history.back();\nexport const navigateBack2 = () => history.go(-1);\n\nexport function loadScript(src) {\n let script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = src;\n script.async = false;\n document.body.appendChild(script);\n script.onload = () => {};\n script.onerror = () => {};\n}\n\n/**\n * let sender = '<script>alert(\"abc\")</script>'; // 恶意代码\n let safer = saferHTML`<p>${sender} has sent you a message.</p>`;\n expect(safer).toBe(\n '<p><script>alert(\"abc\")</script> has sent you a message.</p>'\n );\n\n [Arguments] {\n '0': [ '<p>', ' has sent you a message.</p>' ],\n '1': '<script>alert(\"abc\")</script>'\n }\n*/\nexport function saferHTML(templateData) {\n let s = templateData[0];\n for (let i = 1; i < arguments.length; i++) {\n let arg = String(arguments[i]);\n\n // Escape special characters in the substitution.\n s += arg.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n\n // Don't escape special characters in the template.\n s += templateData[i];\n }\n return s;\n}\n\nexport function templateCompile(template) {\n const evalExpr = /<%=(.+?)%>/g;\n const expr = /<%([\\s\\S]+?)%>/g;\n\n template = template\n .replace(evalExpr, \"`); \\n echo( $1 ); \\n echo(`\")\n .replace(expr, \"`); \\n $1 \\n echo(`\");\n\n template = \"echo(`\" + template + \"`);\";\n\n let script = `(function parse(data){\n let output = \"\";\n\n function echo(html){\n output += html;\n }\n\n ${template}\n\n return output;\n })`;\n\n return script;\n}\n\n/**\n * 添加事件\n */\nexport function addEventListener(element, type, handler) {\n // DOM2级事件\n if (element.addEventListener) {\n //true 捕获阶段 false 冒泡阶段\n element.addEventListener(type, handler, false);\n } else if (element.attachEvent) {\n //IE\n element.attachEvent(\"on\" + type, handler);\n } else {\n element[\"on\" + type] = handler;\n }\n}\n\n/**\n * 取消事件\n */\nexport function removeEventListener(element, type, handler) {\n if (element.removeEventListener) {\n element.removeEventListener(type, handler, false);\n } else if (element.detachEvent) {\n element.detachEvent(\"on\" + type, handler);\n } else {\n element[\"on\" + type] = null;\n }\n}\n\n/**\n * 阻止冒泡\n */\nexport function stopPropagation(event) {\n if (event.stopPropagation) {\n event.stopPropagation();\n } else {\n event.cancelBubble = true;\n }\n}\n\n/**\n * 阻止默认行为\n */\nexport function preventDefault(event) {\n if (event.preventDefault) {\n event.preventDefault;\n } else {\n event.returnValue = false;\n }\n}\n\n/**\n * 获取事件对象\n */\nexport function getEvent(event) {\n // event.type 事件类型\n return event ? event : window.event;\n}\n\n/**\n * 获取事件目标\n */\nexport function getTarget(event) {\n return event.target || event.srcElement;\n}\n\nexport function getRelatedTarget(event) {\n if (event.relatedTarget) {\n return event.relatedTarget;\n } else if (event.toElement) {\n return event.toElement;\n } else if (event.fromElement) {\n return event.fromElement;\n } else {\n return null;\n }\n}\n\nexport function isBrowserSupportFileAPI() {\n if (window.File && window.FileReader && window.FileList && window.Blob) {\n return true;\n } else {\n // console.log(\"The File APIs are not fully supported in this browser.\");\n return false;\n }\n}\n","/**\n * Provides requestAnimationFrame in a cross browser way.\n * http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n */\nif (!window.requestAnimationFrame) {\n window.requestAnimationFrame = (function () {\n return (\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function (callback) {\n window.setTimeout(callback, 1000 / 60);\n }\n );\n })();\n}\n\nexport const drawCanvasInWeb = (canvasID, cb) => {\n var canvas = document.getElementById(canvasID);\n var ctx = canvas.getContext(\"2d\");\n // var mouse = utils.captureMouse(canvas);\n // var touch = utils.captureTouch(canvas);\n (function drawFrame() {\n window.requestAnimationFrame(drawFrame);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n cb(ctx);\n })();\n};\n","import { getViewportSize } from \"./position\";\n\nexport function loadImageAsync(url) {\n return new Promise(function (resolve, reject) {\n const image = new Image();\n image.onload = function () {\n resolve(image);\n };\n image.onerror = function () {\n reject(new Error(\"Could not load image at \" + url));\n };\n image.src = url;\n });\n}\n\n/**\n * 懒加载图片\n * document.addEventListener(\"scroll\", throttle(lazyloadImages, 300));\n */\nexport function lazyloadImages() {\n // 获取所有的图片标签\n const imgs = document.getElementsByTagName(\"img\");\n // 获取可视区域的高度\n const viewHeight = getViewportSize().height;\n // num用于统计当前显示到了哪一张图片,避免每次都从第一张图片开始检查是否露出\n let num = 0;\n for (let i = num; i < imgs.length; i++) {\n // 如果可视区域高度大于等于元素顶部距离可视区域顶部的高度,说明元素露出\n if (imgs[i].getBoundingClientRect().top < viewHeight) {\n // 给元素写入真实的src,展示图片\n imgs[i].src = imgs[i].getAttribute(\"data-src\");\n // 前i张图片已经加载完毕,下次从第i+1张开始检查是否露出\n num = i + 1;\n }\n }\n}\n\n/*\n *@method getImageColor 该方法用于获取传入图片链接的这个图片的主要颜色值 返回表示颜色值的字符串,如rgb(red,green,blue)\n *@prams imgsrc 图片链接\n */\nexport function getImageColor(imgsrc) {\n var arrR = [],\n arrG = [],\n arrB = [],\n R,\n G,\n B,\n rgb,\n j = 0;\n var canvas = document.createElement(\"canvas\");\n var ctx = canvas.getContext(\"2d\");\n var img = document.createElement(\"image\");\n img.src = imgsrc;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n var imageData = ctx.getImageData(0, 0, img.width, img.height).data;\n for (var i = 0; i < imageData.length; i += 4) {\n arrR[j] = imageData[i];\n arrG[j] = imageData[i + 1];\n arrB[j] = imageData[i + 2];\n j += 1;\n }\n R = _getArryWeightValue(arrR);\n G = _getArryWeightValue(arrG);\n B = _getArryWeightValue(arrB);\n rgb = \"rgb(\" + R + \",\" + G + \",\" + B + \")\";\n return rgb;\n}\n/*\n *@method _getArryWeightValue 该方法用于获取数组中的最高权重值 返回数组的最高权重值\n *@prams arr 数组\n */\nfunction _getArryWeightValue(arr) {\n var existArr = {},\n duplicationArr = [],\n duplicationCount = [],\n k = 0;\n for (let i = 0; i < arr.length; i++) {\n if (!existArr[arr[i]]) {\n existArr[arr[i]] = 1;\n } else {\n duplicationArr.push(arr[i]); //newArr数组中为arr中出现重复的元素,即把arr数组中不重复的元素去除掉\n }\n }\n for (let i = 0; i < duplicationArr.length; i++) {\n k = 0;\n for (var j = 0; j < duplicationArr.length; j++) {\n if (duplicationArr[i] === duplicationArr[j]) {\n k += 1;\n }\n duplicationCount[i] = k; //把NewArr中每个值重复出现的次数依次放入\n }\n }\n //获取resultArr数组中出现重复值最多的那个值的索引值\n var max = Math.max.apply(null, duplicationCount);\n var maxIndex = 0;\n for (; maxIndex < duplicationCount.length; maxIndex++) {\n if (duplicationCount[maxIndex] === max) {\n return;\n }\n }\n return duplicationArr[maxIndex]; //返回权重最高的值\n}\n","/**\n * covert canvas to image\n * and save the image file\n */\nexport const Canvas2Image = function (contextType: string) {\n if (!contextType) contextType = \"2d\";\n\n // check if support sth.\n const $support = (function () {\n const canvas = document.createElement(\"canvas\"),\n ctx: CanvasRenderingContext2D = canvas.getContext(\n contextType\n ) as CanvasRenderingContext2D;\n const ctxBool = !!ctx;\n\n return {\n canvas: ctxBool,\n imageData: ctxBool && !!ctx.getImageData,\n dataURL: !!canvas.toDataURL,\n btoa: !!window.btoa\n };\n })();\n\n const downloadMime = \"image/octet-stream\";\n\n function scaleCanvas(\n canvas: HTMLCanvasElement,\n width: number,\n height: number\n ) {\n const w = canvas.width;\n const h = canvas.height;\n if (width === undefined) {\n width = w;\n }\n if (height === undefined) {\n height = h;\n }\n\n const retCanvas = document.createElement(\"canvas\");\n const retCtx = retCanvas.getContext(\n contextType\n ) as CanvasRenderingContext2D;\n retCanvas.width = width;\n retCanvas.height = height;\n retCtx.drawImage(canvas, 0, 0, w, h, 0, 0, width, height);\n return retCanvas;\n }\n\n function getDataURL(\n canvas: HTMLCanvasElement,\n type: string,\n width: number,\n height: number\n ) {\n if (contextType == \"2d\") canvas = scaleCanvas(canvas, width, height);\n return canvas.toDataURL(type);\n }\n\n // save file to local with file name and file type\n function saveFile(strData: string, fileType: string, fileName = \"name\") {\n // document.location.href = strData;\n const saveLink = document.createElement(\"a\");\n // download file name\n saveLink.download = fileName + \".\" + fileType;\n // download file data\n saveLink.href = strData;\n // start download\n saveLink.click();\n }\n\n function genImage(strData: string) {\n const img = document.createElement(\"img\");\n img.src = strData;\n return img;\n }\n\n function fixType(type: string) {\n type = type.toLowerCase().replace(/jpg/i, \"jpeg\");\n const r = type.match(/png|jpeg|bmp|gif/)?.[0];\n return \"image/\" + r;\n }\n\n function encodeData(data: string | any[]) {\n if (!window.btoa) {\n throw \"btoa undefined\";\n }\n let str = \"\";\n if (typeof data == \"string\") {\n str = data;\n } else {\n for (let i = 0; i < data.length; i++) {\n str += String.fromCharCode(data[i]);\n }\n }\n return btoa(str);\n }\n\n function getContext(canvas: HTMLCanvasElement) {\n const attributes =\n contextType == \"2d\" ? undefined : { preserveDrawingBuffer: true };\n return canvas.getContext(contextType, attributes);\n }\n\n function getImageData(canvas: HTMLCanvasElement) {\n const w = canvas.width,\n h = canvas.height;\n const context = getContext(canvas) as CanvasRenderingContext2D;\n return context.getImageData(0, 0, w, h);\n }\n\n function makeURI(strData: string, type: string) {\n return \"data:\" + type + \";base64,\" + strData;\n }\n\n /**\n * create bitmap image\n * 按照规则生成图片响应头和响应体\n */\n const genBitmapImage = function (oData: ImageData) {\n //\n // BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx\n // BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx\n //\n\n const biWidth = oData.width;\n const biHeight = oData.height;\n const biSizeImage = biWidth * biHeight * 3;\n const bfSize = biSizeImage + 54; // total header size = 54 bytes\n\n //\n // typedef struct tagBITMAPFILEHEADER {\n // \tWORD bfType;\n // \tDWORD bfSize;\n // \tWORD bfReserved1;\n // \tWORD bfReserved2;\n // \tDWORD bfOffBits;\n // } BITMAPFILEHEADER;\n //\n const BITMAPFILEHEADER = [\n // WORD bfType -- The file type signature; must be \"BM\"\n 0x42,\n 0x4d,\n // DWORD bfSize -- The size, in bytes, of the bitmap file\n bfSize & 0xff,\n (bfSize >> 8) & 0xff,\n (bfSize >> 16) & 0xff,\n (bfSize >> 24) & 0xff,\n // WORD bfReserved1 -- Reserved; must be zero\n 0,\n 0,\n // WORD bfReserved2 -- Reserved; must be zero\n 0,\n 0,\n // DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.\n 54,\n 0,\n 0,\n 0\n ];\n\n //\n // typedef struct tagBITMAPINFOHEADER {\n // \tDWORD biSize;\n // \tLONG biWidth;\n // \tLONG biHeight;\n // \tWORD biPlanes;\n // \tWORD biBitCount;\n // \tDWORD biCompression;\n // \tDWORD biSizeImage;\n // \tLONG biXPelsPerMeter;\n // \tLONG biYPelsPerMeter;\n // \tDWORD biClrUsed;\n // \tDWORD biClrImportant;\n // } BITMAPINFOHEADER, *PBITMAPINFOHEADER;\n //\n const BITMAPINFOHEADER = [\n // DWORD biSize -- The number of bytes required by the structure\n 40,\n 0,\n 0,\n 0,\n // LONG biWidth -- The width of the bitmap, in pixels\n biWidth & 0xff,\n (biWidth >> 8) & 0xff,\n (biWidth >> 16) & 0xff,\n (biWidth >> 24) & 0xff,\n // LONG biHeight -- The height of the bitmap, in pixels\n biHeight & 0xff,\n (biHeight >> 8) & 0xff,\n (biHeight >> 16) & 0xff,\n (biHeight >> 24) & 0xff,\n // WORD biPlanes -- The number of planes for the target device. This value must be set to 1\n 1,\n 0,\n // WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap\n // has a maximum of 2^24 colors (16777216, Truecolor)\n 24,\n 0,\n // DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed\n 0,\n 0,\n 0,\n 0,\n // DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps\n biSizeImage & 0xff,\n (biSizeImage >> 8) & 0xff,\n (biSizeImage >> 16) & 0xff,\n (biSizeImage >> 24) & 0xff,\n // LONG biXPelsPerMeter, unused\n 0,\n 0,\n 0,\n 0,\n // LONG biYPelsPerMeter, unused\n 0,\n 0,\n 0,\n 0,\n // DWORD biClrUsed, the number of color indexes of palette, unused\n 0,\n 0,\n 0,\n 0,\n // DWORD biClrImportant, unused\n 0,\n 0,\n 0,\n 0\n ];\n\n const iPadding = (4 - ((biWidth * 3) % 4)) % 4;\n\n const aImgData = oData.data;\n\n let strPixelData = \"\";\n const biWidth4 = biWidth << 2;\n let y = biHeight;\n const fromCharCode = String.fromCharCode;\n\n do {\n const iOffsetY = biWidth4 * (y - 1);\n let strPixelRow = \"\";\n for (let x = 0; x < biWidth; x++) {\n const iOffsetX = x << 2;\n strPixelRow +=\n fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) +\n fromCharCode(aImgData[iOffsetY + iOffsetX + 1]) +\n fromCharCode(aImgData[iOffsetY + iOffsetX]);\n }\n\n for (let c = 0; c < iPadding; c++) {\n strPixelRow += String.fromCharCode(0);\n }\n\n strPixelData += strPixelRow;\n } while (--y);\n\n return (\n encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) +\n encodeData(strPixelData)\n );\n };\n\n /**\n * saveAsImage\n * @param canvas canvasElement\n * @param width {String} image type\n * @param height {Number} [optional] png width\n * @param type {string} [optional] png height\n * @param fileName {String} image name\n */\n const saveAsImage = function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n type: string,\n fileName: string\n ) {\n // save file type\n const fileType = type;\n if ($support.canvas && $support.dataURL) {\n if (typeof canvas == \"string\") {\n canvas = document.getElementById(canvas) as HTMLCanvasElement;\n }\n if (type === undefined) {\n type = \"png\";\n }\n type = fixType(type);\n if (/bmp/.test(type)) {\n const data = getImageData(scaleCanvas(canvas, width, height));\n const strData = genBitmapImage(data);\n // use new parameter: fileType\n saveFile(makeURI(strData, downloadMime), fileType, fileName);\n } else {\n const strData = getDataURL(canvas, type, width, height);\n // use new parameter: fileType\n saveFile(strData.replace(type, downloadMime), fileType, fileName);\n }\n }\n };\n\n const convertToImage = function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n type: string\n ) {\n if ($support.canvas && $support.dataURL) {\n if (typeof canvas == \"string\") {\n canvas = document.getElementById(canvas) as HTMLCanvasElement;\n }\n if (type === undefined) {\n type = \"png\";\n }\n type = fixType(type);\n\n if (/bmp/.test(type)) {\n const data = getImageData(scaleCanvas(canvas, width, height));\n const strData = genBitmapImage(data);\n return genImage(makeURI(strData, \"image/bmp\"));\n } else {\n const strData = getDataURL(canvas, type, width, height);\n return genImage(strData);\n }\n }\n };\n\n return {\n saveAsImage: saveAsImage,\n saveAsPNG: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n fileName: string\n ) {\n return saveAsImage(canvas, width, height, \"png\", fileName);\n },\n saveAsJPEG: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n fileName: string\n ) {\n return saveAsImage(canvas, width, height, \"jpeg\", fileName);\n },\n saveAsGIF: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n fileName: string\n ) {\n return saveAsImage(canvas, width, height, \"gif\", fileName);\n },\n saveAsBMP: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number,\n fileName: string\n ) {\n return saveAsImage(canvas, width, height, \"bmp\", fileName);\n },\n\n convertToImage: convertToImage,\n convertToPNG: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number\n ) {\n return convertToImage(canvas, width, height, \"png\");\n },\n convertToJPEG: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number\n ) {\n return convertToImage(canvas, width, height, \"jpeg\");\n },\n convertToGIF: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number\n ) {\n return convertToImage(canvas, width, height, \"gif\");\n },\n convertToBMP: function (\n canvas: HTMLCanvasElement,\n width: number,\n height: number\n ) {\n return convertToImage(canvas, width, height, \"bmp\");\n }\n };\n};\n","export function createXMLHttpRequest() {\n var xhr = null;\n\n if (window.ActiveXObject) {\n var versions = [\n \"Microsoft.XMLHTTP\",\n \"MSXML6.XMLHTTP\",\n \"MSXML5.XMLHTTP\",\n \"MSXML4.XMLHTTP\",\n \"MSXML3.XMLHTTP\",\n \"MSXML2.XMLHTTP\",\n \"MSXML.XMLHTTP\"\n ];\n\n for (var i = 0; i < versions.length; i++) {\n try {\n xhr = new window.ActiveXObject(versions[i]);\n break;\n } catch (ex) {\n continue;\n }\n }\n } else {\n xhr = new XMLHttpRequest();\n }\n return xhr;\n}\n\nexport function getFormElementData(oFormElement) {\n if (!oFormElement.action) {\n return;\n }\n if (oFormElement.method.toLowerCase() === \"post\") {\n /* enctype is multipart/form-data */\n // segments.push(\n // 'Content-Disposition: form-data; name=\"' +\n // fd.name +\n // '\"; filename=\"' +\n // fd.name +\n // '\"\\r\\nContent-Type: ' +\n // fd.type +\n // \"\\r\\n\\r\\n\"\n // );\n // segments.push(\n // 'Content-Disposition: form-data; name=\"' +\n // input.name +\n // '\"\\r\\n\\r\\n' +\n // input.value +\n // \"\\r\\n\"\n // );\n // var sBoundary = \"---------------------------\" + Date.now().toString(16);\n // xhr.setRequestHeader(\n // \"Content-Type\",\n // \"multipart/form-data; boundary=\" + sBoundary\n // );\n // xhr.sendAsBinary(\n // \"--\" +\n // sBoundary +\n // \"\\r\\n\" +\n // segments.join(\"--\" + sBoundary + \"\\r\\n\") +\n // \"--\" +\n // sBoundary +\n // \"--\\r\\n\"\n // );\n /* enctype is application/x-www-form-urlencoded or text/plain */\n // segments.push(escape(input.name) + \"=\" + escape(input.value));\n return {\n url: oFormElement.action,\n data: new FormData(oFormElement)\n };\n } else {\n var sSearch = \"\";\n for (var nItem = 0; nItem < oFormElement.elements.length; nItem++) {\n var oField = oFormElement.elements[nItem];\n if (!oField.hasAttribute(\"name\")) {\n continue;\n }\n var sFieldType =\n oField.nodeName.toUpperCase() === \"INPUT\"\n ? oField.getAttribute(\"type\").toUpperCase()\n : \"TEXT\";\n if (sFieldType === \"FILE\") {\n for (\n var nFile = 0;\n nFile < oField.files.length;\n sSearch +=\n \"&\" + escape(oField.name) + \"=\" + escape(oField.files[nFile++].name)\n );\n } else if (\n (sFieldType !== \"RADIO\" && sFieldType !== \"CHECKBOX\") ||\n oField.checked\n ) {\n sSearch += \"&\" + escape(oField.name) + \"=\" + escape(oField.value);\n }\n }\n return {\n url: oFormElement.action.replace(\n /(?:\\?.*)?$/,\n sSearch.replace(/^&/, \"?\")\n ),\n data: null\n };\n }\n}\n\nexport function fetchUseXMLHttpRequest(url, timeout) {\n return new Promise((resolve, reject) => {\n var xhr = new XMLHttpRequest();\n var timeoutHandler = function () {\n reject(\"The request for \" + url + \" is timed out for \" + timeout + \".\");\n };\n var handler = function (e) {\n // - 0 代理被创建,但尚未调用 open()方法\n // - 1 open() 方法已经被调用\n // - 2 send()方法已经被调用,并且头部和状态已经可获得\n // - 3 下载中, responseText`属性已经包含部分数据\n // - 4 下载操作已完成\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n resolve(xhr.response); // xhr.responseText\n // var arrayBuffer = xhr.response;\n // if (arrayBuffer) {\n // var byteArray = new Uint8Array(arrayBuffer);\n // for (var i = 0; i < byteArray.byteLength; i++) {\n // // do something with each byte in the array\n // }\n // }\n } else {\n reject(xhr.statusText);\n }\n }\n };\n\n xhr.open(\"GET\", url);\n // xhr.open(\"GET\", url, true);\n // xhr.open(\"POST\", url);\n\n xhr.onload = handler;\n // xhr.onreadystatechange = handler;\n xhr.timeout = timeout;\n xhr.ontimeout = timeoutHandler;\n\n xhr.upload.addEventListener(\n \"progress\",\n function (e) {\n if (e.lengthComputable) {\n const percentage = Math.round((e.loaded * 100) / e.total);\n console.log(percentage + \"%\");\n }\n },\n false\n );\n xhr.upload.addEventListener(\"load\", function (e) {}, false);\n // xhr.overrideMimeType(\"text/plain; charset=x-user-defined-binary\");\n\n // empty string (default), \"arraybuffer\", \"blob\", \"document\", \"json\", and \"text\"\n // xhr.responseType = \"json\";\n // xhr.setRequestHeader(\"Accept\", \"application/json\");\n\n // The send method of the XMLHttpRequest has been extended to enable easy transmission of binary data by accepting an ArrayBuffer or Blob or File object.\n xhr.send(null);\n\n // // multipart/form-data upload\n // const fd = new FormData();\n // fd.append(\"avatar\", file);\n // fd.append(\"photos\", photos.files[0]);\n // fd.append(\"photos\", photos.files[1]);\n // fd.append(\"username\", \"abc123\");\n // xhr.send(fd);\n });\n}\n\nexport function fetchUseFetch(url, options, data) {\n return fetch(\n url,\n Object.assign(\n {\n method: \"POST\", // GET, POST, PUT, DELETE\n headers: {\n // \"Content-Type\": \"application/json\"\n // \"Content-Type\": \"application/x-www-form-urlencoded\"\n }, // 请求的头信息,形式为 Headers 对象或 ByteString\n body: {}, // JSON.stringify(data) 请求发送的数据 blob、BufferSource、FormData、URLSearchParams(get 或head 方法中不能包含 body)\n mode: \"\", //请求的模式,是否跨域等,如 cors、 no-cors 或 same-origin\n credentials: \"\", //cookie 的跨域策略,如 omit、same-origin 或 include\n cache: \"\", //请求的 cache 模式: default、no-store、reload、no-cache、 force-cache 或 only-if-cached\n redirect: \"follow\", // manual, *follow, error\n referrerPolicy: \"no-referrer\" // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url\n },\n options\n )\n ).then((response) => response.json());\n}\n\n/**\n * ifWebFileHasChanged(\"yourpage.html\", function (nModif, nVisit) {\n console.log(\n \"The page '\" +\n this.filepath +\n \"' has been changed on \" +\n new Date(nModif).toLocaleString() +\n \"!\"\n );\n });\n */\nexport function ifWebFileHasChanged(sURL, fCallback) {\n var xhr = new XMLHttpRequest();\n xhr.open(\"HEAD\" /* use HEAD - we only need the headers! */, sURL);\n xhr.filepath = sURL;\n xhr.callback = fCallback;\n xhr.onload = function () {\n var nLastVisit = parseFloat(\n window.localStorage.getItem(\"lm_\" + this.filepath)\n );\n var nLastModif = Date.parse(this.getResponseHeader(\"Last-Modified\"));\n if (isNaN(nLastVisit) || nLastModif > nLastVisit) {\n window.localStorage.setItem(\"lm_\" + this.filepath, Date.now());\n isFinite(nLastVisit) && this.callback(nLastModif, nLastVisit);\n }\n };\n xhr.send();\n}\n"],"names":["BaseError","message","options","EnvironmentError","FileSelectCancelError","IllegalFileError","accepts","handleInputFiles","el","cb","handleDragAndDropFiles","dropZoneEl","e","selectFile","multiple","inputElement","resolve","reject","files","illegalFiles","file","getFileExtension","readeFile","fileHandler","reader","event","size","progress","fileName","isImage","isVideo","isAudio","isWordDocument","isExcelDocument","isPowerPointDocument","isJsonDocument","isXmlDocument","getFileType","slice","verified_type","buffer","fn2ObjectURL","fn","blob","file2Image","img","onDocumentReady","check","microTask","patchDOM","oldNode","newNode","parent","i","attrName","attrValue","setCookie","cname","cvalue","exdays","d","expires","getCookie","name","ca","c","getCookieObject","item","acc","k","v","clearCookies","WebSocket","url","code","reason","wasClean","details","requestid","request","result","msg","data","resolution","rejection","error","value","getDocumentElement","getViewportSize","documentElement","getPageSize","viewport","isElementInViewport","rect","getPageScroll","getPageClient","getElementLeftInPage","element","actualLeft","current","getElementTopInPage","actualTop","getElementPositionInPage2","getElementPositionInPage","scroll","pageClient","getElementPositionInViewport","getPageVerticalScrollPercent","height","getMousePositionInPage","ev","pageScroll","getMousePositionInViewport","getMouseButton","getBrowserUserAgent","u","getBrowserLanguage","isIOS","isAndroid","isMobile","setRem","designWidth","docEl","dpr","rem","recalc","clientWidth","urlsafe_b64encode","str","urlsafe_b64decode","base64UrlStr","mod4","isURLRelative","path","checkHttpUrl","string","givenURL","getSearchData","searchString","obj","getUrlParams","query","p","setTheme","theme","DOMKeyboardKeyCode","keyName","copyToClipboard","text","getSelectedText","isFocus","ele","siblings","child","scrollToTop","isTabInView","navigateBack","navigateBack2","loadScript","src","script","saferHTML","templateData","s","arg","templateCompile","template","evalExpr","expr","addEventListener","type","handler","removeEventListener","stopPropagation","preventDefault","getEvent","getTarget","getRelatedTarget","isBrowserSupportFileAPI","callback","drawCanvasInWeb","canvasID","canvas","ctx","drawFrame","loadImageAsync","image","lazyloadImages","imgs","viewHeight","num","getImageColor","imgsrc","arrR","arrG","arrB","R","G","B","rgb","j","imageData","_getArryWeightValue","arr","existArr","duplicationArr","duplicationCount","max","maxIndex","Canvas2Image","contextType","$support","ctxBool","downloadMime","scaleCanvas","width","w","h","retCanvas","retCtx","getDataURL","saveFile","strData","fileType","saveLink","genImage","fixType","encodeData","getContext","attributes","getImageData","makeURI","genBitmapImage","oData","biWidth","biHeight","biSizeImage","bfSize","BITMAPFILEHEADER","BITMAPINFOHEADER","iPadding","aImgData","strPixelData","biWidth4","y","fromCharCode","iOffsetY","strPixelRow","x","iOffsetX","saveAsImage","convertToImage","createXMLHttpRequest","xhr","versions","getFormElementData","oFormElement","sSearch","nItem","oField","sFieldType","nFile","fetchUseXMLHttpRequest","timeout","timeoutHandler","percentage","fetchUseFetch","response","ifWebFileHasChanged","sURL","fCallback","nLastVisit","nLastModif"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zyzgroup/core-web",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.5",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "dist/
|
|
7
|
-
"module": "dist/
|
|
6
|
+
"main": "dist/zyzgroup_core_web.umd.cjs",
|
|
7
|
+
"module": "dist/zyzgroup_core_web.js",
|
|
8
|
+
"browser": "dist/zyzgroup_core_web.iife.js",
|
|
8
9
|
"types": "types/index.d.ts",
|
|
9
10
|
"exports": {
|
|
10
11
|
".": {
|
|
11
|
-
"require": "./dist/
|
|
12
|
-
"import": "./dist/
|
|
12
|
+
"require": "./dist/zyzgroup_core_web.umd.cjs",
|
|
13
|
+
"import": "./dist/zyzgroup_core_web.js"
|
|
13
14
|
}
|
|
14
15
|
},
|
|
15
16
|
"files": [
|
package/types/env.d.ts
CHANGED
|
@@ -11,4 +11,7 @@ export function getBrowserUserAgent(): {
|
|
|
11
11
|
webApp: boolean;
|
|
12
12
|
};
|
|
13
13
|
export function getBrowserLanguage(): any;
|
|
14
|
+
export function isIOS(): boolean;
|
|
15
|
+
export function isAndroid(): boolean;
|
|
16
|
+
export function isMobile(): boolean;
|
|
14
17
|
//# sourceMappingURL=env.d.ts.map
|
package/types/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAeC;AAED,0CAEC"}
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;EAeC;AAED,0CAEC;AAED,iCAcC;AAED,qCAEC;AAED,oCAEC"}
|