diff --git a/App.vue b/App.vue index 50fca5f..f7422a3 100644 --- a/App.vue +++ b/App.vue @@ -14,5 +14,5 @@ diff --git a/main.js b/main.js index f61b3c6..6b40832 100644 --- a/main.js +++ b/main.js @@ -1,11 +1,11 @@ import App from './App' -import uView from 'uview-ui-next' +import uViewNext from '@/uni_modules/uview-next'; // #ifndef VUE3 import Vue from 'vue' import './uni.promisify.adaptor' Vue.config.productionTip = false -Vue.use(uView) +Vue.use(uViewNext) App.mpType = 'app' const app = new Vue({ ...App @@ -17,7 +17,7 @@ app.$mount() import { createSSRApp } from 'vue' export function createApp() { const app = createSSRApp(App) - app.use(uView) + app.use(uViewNext) return { app } diff --git a/package-lock.json b/package-lock.json index f1da83b..d2def6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,436 @@ "dependencies": { "mitt": "^3.0.1", "uview-ui-next": "^0.0.1" + }, + "devDependencies": { + "sass": "^1.90.0", + "sass-loader": "^16.0.5" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, "node_modules/mitt": { @@ -19,6 +449,135 @@ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass": { + "version": "1.90.0", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/uview-ui-next": { "version": "0.0.1", "resolved": "https://registry.npmmirror.com/uview-ui-next/-/uview-ui-next-0.0.1.tgz", diff --git a/package.json b/package.json index 1505158..ef55d77 100644 --- a/package.json +++ b/package.json @@ -12,5 +12,9 @@ "dependencies": { "mitt": "^3.0.1", "uview-ui-next": "^0.0.1" + }, + "devDependencies": { + "sass": "^1.90.0", + "sass-loader": "^16.0.5" } } diff --git a/pages/adoption/adoption.vue b/pages/adoption/adoption.vue index 18b7d57..bf18915 100644 --- a/pages/adoption/adoption.vue +++ b/pages/adoption/adoption.vue @@ -146,7 +146,7 @@ export default { display: flex; gap: 20rpx; - /deep/ .u-button { + :deep(.u-button) { margin: 0; } } @@ -168,7 +168,7 @@ export default { margin-top: 10rpx; } - /deep/ .u-text { + :deep(.u-text) { margin-bottom: 8rpx; } } diff --git a/pages/assistant/assistant.vue b/pages/assistant/assistant.vue index 1a74fee..997dd16 100644 --- a/pages/assistant/assistant.vue +++ b/pages/assistant/assistant.vue @@ -252,7 +252,7 @@ export default { flex-wrap: wrap; gap: 20rpx; - /deep/ .u-button { + :deep(.u-button) { margin: 0; } } @@ -277,7 +277,7 @@ export default { margin-right: 20rpx; border-radius: 20rpx 20rpx 8rpx 20rpx; - /deep/ .u-text { + :deep(.u-text) { color: white !important; } } @@ -304,7 +304,7 @@ export default { max-width: 70%; padding: 20rpx; - /deep/ .u-text { + :deep(.u-text) { line-height: 1.5; word-break: break-word; white-space: pre-wrap; @@ -321,7 +321,7 @@ export default { align-items: center; gap: 20rpx; - /deep/ .u-input { + :deep(.u-input) { flex: 1; } } diff --git a/pages/pets/add-pet.vue b/pages/pets/add-pet.vue index 2e973c3..f152b59 100644 --- a/pages/pets/add-pet.vue +++ b/pages/pets/add-pet.vue @@ -203,7 +203,7 @@ export default { padding: 40rpx 30rpx; } -/deep/ .u-form-item { +:deep(.u-form-item) { margin-bottom: 30rpx; } diff --git a/pages/pets/add-record.vue b/pages/pets/add-record.vue index 17cedfa..c5547d0 100644 --- a/pages/pets/add-record.vue +++ b/pages/pets/add-record.vue @@ -208,7 +208,7 @@ export default { border-radius: 10rpx; } - /deep/ .u-icon { + :deep(.u-icon) { position: absolute; top: -8rpx; right: -8rpx; @@ -238,7 +238,7 @@ export default { padding: 40rpx 30rpx; } -/deep/ .u-form-item { +:deep(.u-form-item) { margin-bottom: 30rpx; } diff --git a/pages/pets/pet-detail.vue b/pages/pets/pet-detail.vue index f7198b3..64f672f 100644 --- a/pages/pets/pet-detail.vue +++ b/pages/pets/pet-detail.vue @@ -155,7 +155,7 @@ export default { margin-left: 30rpx; flex: 1; - /deep/ .u-text { + :deep(.u-text) { margin-bottom: 8rpx; } } @@ -170,7 +170,7 @@ export default { display: flex; flex-direction: column; - /deep/ .u-text:first-child { + :deep(.u-text:first-child) { margin-bottom: 8rpx; } } @@ -203,7 +203,7 @@ export default { display: flex; gap: 20rpx; - /deep/ .u-button { + :deep(.u-button) { flex: 1; } } diff --git a/pages/pets/pets.vue b/pages/pets/pets.vue index b29b09e..adb2093 100644 --- a/pages/pets/pets.vue +++ b/pages/pets/pets.vue @@ -83,7 +83,7 @@ export default { flex: 1; margin-left: 20rpx; - /deep/ .u-text { + :deep(.u-text) { margin-bottom: 8rpx; } } diff --git a/uni.scss b/uni.scss index 85e17f3..0c5e263 100644 --- a/uni.scss +++ b/uni.scss @@ -77,3 +77,4 @@ $uni-font-size-paragraph:15px; /* uView UI主题变量 */ @import "uview-ui-next/theme.scss"; +@import '@/uni_modules/uview-next/theme.scss'; diff --git a/uni_modules/uview-next/LICENSE b/uni_modules/uview-next/LICENSE new file mode 100644 index 0000000..4db40ef --- /dev/null +++ b/uni_modules/uview-next/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 www.uviewui.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/uni_modules/uview-next/README.md b/uni_modules/uview-next/README.md new file mode 100644 index 0000000..89fdc33 --- /dev/null +++ b/uni_modules/uview-next/README.md @@ -0,0 +1,76 @@ +
+ logo +

uView Next

+

企业级、高质量、更贴近业务场景的UI框架

+
+ + +[![stars](http://gitee.com/wakge/uview-next/badge/star.svg?theme=dark)](http://gitee.com/wakge/uview-next) +[![forks](http://gitee.com/wakge/uview-next/badge/fork.svg?theme=dark)](wakge/uview-next) +[![Stars](https://img.shields.io/github/stars/Yeloa/uview-next?logo=github&label=Stars&color=BA2127&labelColor=3E444F&style=flat&logoColor=white)](https://github.com/Yeloa/uview-next) +[![Forks](https://img.shields.io/github/forks/Yeloa/uview-next?logo=github&label=Forks&color=BA2127&labelColor=3E444F&style=flat&logoColor=white)](https://github.com/Yeloa/uview-next/fork) +[![Issues](https://img.shields.io/github/issues/Yeloa/uview-next?logo=github&label=Issues&color=BA2127&labelColor=3E444F&style=flat&logoColor=white)](https://github.com/Yeloa/uview-next/issues) +[![license](http://img.shields.io/badge/license-mit-red)](http://en.wikipedia.org/wiki/MIT_License) + +## 📖 简介 + +uView Next 支持 Vue2 和 Vue3,支持国际化,是[uni-app](http://uniapp.dcloud.io/)全面兼容 nvue 的 uni-app 生态框架,提供了更丰富的组件和便捷的工具,让开发更得心应手。 + +## 📚 文档 + +- [🌐 **官方文档** https://uview-next.netlify.app](https://uview-next.netlify.app) +- [📄 **备用文档** https://uview.d3u.cn](https://uview.d3u.cn) + + +## 💬 交流反馈 + +欢迎加入交流群反馈:[点此跳转](https://uview.d3u.cn/components/addQQGroup.html) + +## ✨ 特性 + +- 🌍 **全端兼容**:完美支持安卓、iOS、微信/QQ/百度/支付宝/头条小程序及H5 +- 🚀 **原生渲染**:全面兼容nvue,性能媲美原生应用,流畅体验 +- 🧩 **组件丰富**:80+ 高质量组件,覆盖各类业务场景,开箱即用 +- 🔧 **工具集合**:实用JS工具库,简化开发流程,大幅提升开发效率 +- 📖 **详尽文档**:清晰教程 + 交互演示,显著降低学习成本 +- 📦 **按需引入**:智能按需加载,有效减小打包体积,优化性能 + +## 📱 预览 + +您可以通过**微信**扫码,查看最佳的演示效果。 +
+
+ + +## 🔗 重要链接 + +- [🌐 官方文档](https://uview.d3u.cn/) +- [📝 更新日志](https://uview.d3u.cn/components/changelog.html) +- [👥 关于我们](https://uview.d3u.cn/cooperation/about.html) + +## 🛠️ 关于 PR + +> 我们非常乐意接受各位的优质 PR,但在此之前我希望您了解 uView Next是一个需要兼容多个平台的(小程序、h5、ios app、android app)包括 nvue 页面、vue 页面。 +> 所以希望在您修复 bug 并提交之前尽可能的去这些平台测试一下兼容性。最好能携带测试截图以方便审核。非常感谢! + +### 📦 快速安装 + +请通过[官网安装文档](https://uview.d3u.cn/components/downloadSetting.html)了解更详细的内容 + +### 🚀 快速上手 + +请通过[快速上手](https://uview.d3u.cn/components/quickstart.html)了解更详细的内容 + +## 💡 使用方法 + +配置 easycom 规则后,自动按需引入,无需`import`组件,直接引用即可。 + +```html + +``` + +## 📄 版权信息 + +uView Next遵循[MIT](http://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将 uView 应用到您的产品中。 diff --git a/uni_modules/uview-next/changelog.md b/uni_modules/uview-next/changelog.md new file mode 100644 index 0000000..1362658 --- /dev/null +++ b/uni_modules/uview-next/changelog.md @@ -0,0 +1,675 @@ + +## 3.4.8(2025-08-12) +1. 新增`subsection`组件`disabled`,`disabledBgColor `,`disabledColor `属性,优化组件 +## 3.4.7(2025-08-11) +1. 修复一些已知问题 +## 3.4.6(2025-08-11) +1. 修复`form`组件校验为空的问题 + +## 3.4.5(2025-08-11) +1. 新增`sidebar`侧边栏组件 + +## 3.4.4(2025-08-10) +1. 修复`form`组件`resetFields`方法vue2无效 + +## 3.4.3(2025-08-09) +1. 修复`barcode`组件异常报错 + +## 3.4.2(2025-08-09) +1. 新增`actionSheet`组件`height`属性,超出高度自动滚动 +2. 新增`dateStrip`组件`padZero`,`disabledFun`属性,优化组件 + +## 3.4.1(2025-08-08) +1. 优化`dateStrip`日期横条组件 + +## 3.4.0(2025-08-08) +1. 新增`dateStrip`日期横条组件 +2. 优化`dropdown`组件 +3. 优化`table`组件 + +## 3.3.9(2025-08-07) +1. 新增`pdf`组件可预览pdf文件 +2. 新增`table`组件`headerAlign`,`headerEllipsis`等属性 +3. 新增`upload`组件`extension`属性 + +## 3.3.8(2025-08-05) +1. 新增`select`下拉列表组件`keyName`和`valueName`属性 + +## 3.3.7(2025-08-05) +1. 优化控制台输出 + +## 3.3.6(2025-08-04) +1. 全面适配鸿蒙系统 +2. 其他一些细节优化 + +## 3.3.5(2025-08-04) +1. 新增`barcode`条码组件 +2. 导出http等方法 + +## 3.3.4(2025-08-02) +1. 新增`select`下拉列表组件 + +## 3.3.3(2025-08-01) +1. 优化`signature`组件 + +## 3.3.2(2025-07-29) +1. 修复`icon`组件使用图片时支付宝显示不全 +2. 修复`picker`组件支付宝传递this引发的报错 +3. 修复一些组件由于`canvas`问题引起的支付宝报错 +4. 修复`calendar`组件, `swipe-action-item`组件抖音小程序报错 +5. 修复`swipe-action-item`组件不支持支付宝小程序的问题 +6. 其他一些细节优化 + +## 3.3.1(2025-07-28) +1. 新增`u-divider` 组件插槽模式 +2. 新增`form-item`组件`rules`属性 +3. 修复`form`组件异步校验异常等问题 +4. 优化`number-box`组件 +5. 其他一些细节优化 + +## 3.3.0(2025-07-25) +1. 新增`button`组件新增`iconPosition`属性 + +## 3.2.9(2025-07-24) +1. 修复`I18n国际化`语言包 + +## 3.2.8(2025-07-24) +1. 优化`$u.os()`方法,去除小程序下的警告 +2. 优化`areaPicker`组件input相关属性 +3. 优化`datetimePicker`组件input相关属性,以及小程序new Date()再ios设备无效的警告 +4. 优化一些组件在小程序下各种警告 +5. 修复`overlay`由组件引发的一些异常 +6. 修复`cropper`组件方法报错,以及缺失showGrid属性 +7. 其他一些细节优化 + +## 3.2.7(2025-07-21) +1. 新增`draggable`拖拽排序组件 +2. 修复`popover`组件边界计算不准确的问题 +3. 修复几处语法错误导致的小程序无法上传 +4. 优化`pagination`组件 +5. 优化`card`组件 + +## 3.2.6(2025-07-18) +1. 新增`I18n国际化`功能,内置8种语言切换 +2. 其他一些细节优化 + +## 3.2.5(2025-07-17) +1. 新增`datetimePicker`组件新增showInput属性 +2. 新增`areaPicker`组件新增showInput属性 +3. 修复`calendar`组件`readonly`属性错误 + +## 3.2.4(2025-07-16) +1. 新增`Ellipsis 文本省略`组件 +2. 修复`Button`组件主题色问题 + +## 3.2.3(2025-07-15) +1. 新增`Fab 悬浮按钮`组件 +2. 新增`upload`组件 `round` 属性,可设置圆角数值 +3. 其他一些细节优化 + +## 3.2.2(2025-07-14) +更新文档 + +## 3.2.1(2025-07-14) +1. 新增`Cascader 级联选择器`组件 +2. 新增`Tabs`组件使用`u-tab-item`子组件定义方式 +3. 新增`Radio`组件value支持布尔值 +## 3.2.0(2025-07-12) +1. 修复微信小程序 `{"es6" : false} ` 引发的报错 + +## 3.1.9(2025-07-11) +1. 优化示例 + +## 3.1.8(2025-07-11) +1. 新增`pagination`组件 + +## 3.1.7(2025-07-10) +1. 新增`popover`组件 + +## 3.1.6(2025-07-08) +1. 修复`scroll-list`组件微信小程序编译后会有警告 +2. 修复`cell`组件required属性不生效的问题 +3. 修复`tabs`组件index小于0时自动设置为0 +4. 修复`keyboard`组件名称冲突的问题 +5. 修复`datetime-picker`组件日期判断不准确的问题 +6. 删除`theme.scss`中的flex +7. 其他一些修复 + +## 3.1.5(2025-07-07) +1. 新增`button`组件 `round` 属性,可设置圆角数值 +2. 新增`modal`组件 `buttonModel` 属性,可以设置按钮样式 + +## 3.1.4(2025-07-06) +1. 修复vue2和vue3兼容性 +2. 其他一些修复 + +## 3.1.3(2025-07-02) +1. 修复 vue2 引入报错 +2. 新增`tag`组件增加默认 slot +3. 其他一些修复 + +## 3.1.2(2025-07-01) + +1. 修复`tab`组件文字换行 +2. 修复`readMore`组件兼容性 +3. 其他一些修复 + +## 3.1.1(2025-07-01) + +1. 新增`calendar`组件新增 shape 属性 + +## 3.1.0(2025-06-30) + +1. 新增`calendar`组件新增日期是否被禁用的属性 +2. 其他一些修复 + +## 3.0.9(2025-06-30) + +1. 优化`$u.toast`支持关闭后回调 + +## 3.0.8(2025-06-30) + +1. 优化`parse`组件支持解析音频 +2. 新增`calendar`组件新增插入模式 +3. 新增`markdown`组件用于 markdown 文档 +4. 其他一些修复 + +## 3.0.7(2025-06-29) + +1. 修改`keyboard`组件键盘自定义样式无效的问题 +2. 修复`number-box`组件解决输入数字的问题,同时解决小数无法输入的问题 +3. 修复`claendar`组件选择相同日期重新打开滚动定位错误问题 +4. 修复`form-item`组件 marginBottom 取值问题 +5. 修复`textarea`组件字数统计不限制时,会出现/-1 +6. 修复`input`组件在 h5 平台设置 readonly 时 click 事件失效的问题 +7. 新增`swiper-action-item`组件的 name 属性可以支持传递对象 +8. 新增`input`组件增加 always-embed 属性 +9. 新增`code-input`组件输入框新增 type 属性 +10. 新增 test.image 函数支持判断 base64 格式的图片 + +## 3.0.6(2025-06-28) + +1. 修复`search`在 h5 环境下的点击失效 +2. 修复`number-box` focus 问题 +3. 修复倒计时组件样例代码的运行错误 +4. 修复`index-list`设置 customNavHeight 值问题 +5. 修复`upload`组件视频无法预览问题 +6. 修复`datetime-picker` 首次点击 confirm 回调无法获取最新值的问题,新增年,月选择 +7. 修复`textarea`安卓微信实际输入字数超过限制问题,placeholderClass 和 placeholderStyle 不生效 + +## 3.0.5(2025-06-27) + +1. search 组件新增右侧插槽 + +## 3.0.4(2025-06-27) + +1. 优化 cell 组件示例 + +## 3.0.3(2025-06-26) + +1. 优化懒加载 + +## 3.0.0 + +1. 兼容 vue3 +2. 新增组件 +3. 修改官方 github 大量 bug + +## 2.0.38(2024-10-29) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复`picker`组件和`datetime-picker`组件的头条小程序循环引用问题 +2. 修复`image`组件的`bgColor`属性不生效问题 +3. 修复`textarea`组件部分回调事件参数丢失问题 +4. 修复`input`组件部分回调事件参数丢失问题 +5. `datetime-picker`组件支持`immediateChange`属性 +6. 修复`datetime-picker`组件`v-model`绑定异步设置无效问题 +7. 修复`popup`组件设置`duration`属性为字符串值时,遮罩的打开、关闭很缓慢问题 +8. 修复`radio`参数`iconColor`属性不生效问题 +9. 修复`tooltip`组件`size`属性不生效的问题 +10. 修复`image`组件当`src`为空时,loading 状态问题 +11. 其他一些修复 + +## 2.0.37(2024-03-17) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复表单校验`trigger`触发器参数无效问题 +2. 修复`u-input`组件的`password`属性在动态切换为`false`时失效的问题 +3. 添加微信小程序用户同意隐私协议事件回调 +4. 修复支付宝小程序 picker 样式问题 +5. `u-modal`添加`duration`字段控制动画过度时间 +6. 修复`picker` `lastIndex`异常导致的`column`异常问题 +7. `tabs`增加长按事件支持 +8. 修复`u-avatar` `square`属性在小程序`open-data`下无效问题 +9. 其他一些修复 + +## 2.0.36(2023-03-27) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 重构`deepClone` & `deepMerge`方法 +2. 其他优化 + +## 2.0.34(2022-09-24) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. `u-input`、`u-textarea`增加`ignoreCompositionEvent`属性 +2. 修复`route`方法调用可能报错的问题 +3. 修复`u-no-network`组件`z-index`无效的问题 +4. 修复`textarea`组件在 h5 上 confirmType=""报错的问题 +5. `u-rate`适配`nvue` +6. 优化验证手机号码的正则表达式(根据工信部发布的《电信网编号计划(2017 年版)》进行修改。) +7. `form-item`添加`labelPosition`属性 +8. `u-calendar`修复`maxDate`设置为当前日期,并且当前时间大于 08:00 时无法显示日期列表的问题 (#724) +9. `u-radio`增加一个默认插槽用于自定义修改 label 内容 (#680) +10. 修复`timeFormat`函数在 safari 重的兼容性问题 (#664) + +## 2.0.33(2022-06-17) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复`loadmore`组件`lineColor`类型错误问题 +2. 修复`u-parse`组件`imgtap`、`linktap`不生效问题 + +## 2.0.32(2022-06-16) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. `u-loadmore`新增自定义颜色、虚/实线 +2. 修复`u-swiper-action`组件部分平台不能上下滑动的问题 +3. 修复`u-list`回弹问题 +4. 修复`notice-bar`组件动画在低端安卓机可能会抖动的问题 +5. `u-loading-page`添加控制图标大小的属性`iconSize` +6. 修复`u-tooltip`组件`color`参数不生效的问题 +7. 修复`u--input`组件使用`blur`事件输出为`undefined`的 bug +8. `u-code-input`组件新增键盘弹起时,是否自动上推页面参数`adjustPosition` +9. 修复`image`组件`load`事件无回调对象问题 +10. 修复`button`组件`loadingSize`设置无效问题 +11. 其他修复 + +## 2.0.31(2022-04-19) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复`upload`在`vue`页面上传成功后没有成功标志的问题 +2. 解决演示项目中微信小程序模拟上传图片一直出于上传中问题 +3. 修复`u-code-input`组件在`nvue`页面编译到`app`平台上光标异常问题(`app`去除此功能) +4. 修复`actionSheet`组件标题关闭按钮点击事件名称错误的问题 +5. 其他修复 + +## 2.0.30(2022-04-04) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. `u-rate`增加`readonly`属性 +2. `tabs`滑块支持设置背景图片 +3. 修复`u-subsection` `mode`为`subsection`时,滑块样式不正确的问题 +4. `u-code-input`添加光标效果动画 +5. 修复`popup`的`open`事件不触发 +6. 修复`u-flex-column`无效的问题 +7. 修复`u-datetime-picker`索引在特定场合异常问题 +8. 修复`u-datetime-picker`最小时间字符串模板错误问题 +9. `u-swiper`添加`m3u8`验证 +10. `u-swiper`修改判断 image 和 video 逻辑 +11. 修复`swiper`无法使用本地图片问题,增加`type`参数 +12. 修复`u-row-notice`格式错误问题 +13. 修复`u-switch`组件当`unit`为`rpx`时,`nodeStyle`消失的问题 +14. 修复`datetime-picker`组件`showToolbar`与`visibleItemCount`属性无效的问题 +15. 修复`upload`组件条件编译位置判断错误,导致`previewImage`属性设置为`false`时,整个组件都会被隐藏的问题 +16. 修复`u-checkbox-group`设置`shape`属性无效的问题 +17. 修复`u-upload`的`capture`传入字符串的时候不生效的问题 +18. 修复`u-action-sheet`组件,关闭事件逻辑错误的问题 +19. 修复`u-list`触顶事件的触发错误的问题 +20. 修复`u-text`只有手机号可拨打的问题 +21. 修复`u-textarea`不能换行的问题 +22. 其他修复 + +## 2.0.29(2022-03-13) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复`u--text`组件设置`decoration`属性未生效的问题 +2. 修复`u-datetime-picker`使用`formatter`后返回值不正确 +3. 修复`u-datetime-picker` `intercept` 可能为 undefined +4. 修复已设置单位 uni..config.unit = 'rpx'时,线型指示器 `transform` 的位置翻倍,导致指示器超出宽度 +5. 修复 mixin 中 bem 方法生成的类名在支付宝和字节小程序中失效 +6. 修复默认值传值为空的时候,打开`u-datetime-picker`报错,不能选中第一列时间的 bug +7. 修复`u-datetime-picker`使用`formatter`后返回值不正确 +8. 修复`u-image`组件`loading`无效果的问题 +9. 修复`config.unit`属性设为`rpx`时,导航栏占用高度不足导致塌陷的问题 +10. 修复`u-datetime-picker`组件`itemHeight`无效问题 +11. 其他修复 + +## 2.0.28(2022-02-22) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. search 组件新增 searchIconSize 属性 +2. 兼容 Safari/Webkit 中传入时间格式如 2022-02-17 12:00:56 +3. 修复 text value.js 判断日期出 format 错误问题 +4. priceFormat 格式化金额出现精度错误 +5. priceFormat 在部分情况下出现精度损失问题 +6. 优化表单 rules 提示 +7. 修复 avatar 组件 src 为空时,展示状态不对 +8. 其他修复 + +## 2.0.27(2022-01-28) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1.样式修复 + +## 2.0.26(2022-01-28) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1.样式修复 + +## 2.0.25(2022-01-27) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复 text 组件 mode=price 时,可能会导致精度错误的问题 +2. 添加$u.setConfig()方法,可设置 uView 内置的 config, props, zIndex, color 属性,详见:[修改 uView 内置配置方案](https://uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE) +3. 优化 form 组件在 errorType=toast 时,如果输入错误页面会有抖动的问题 +4. 修复$u.addUnit()对配置默认单位可能无效的问题 + +## 2.0.24(2022-01-25) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复 swiper 在 current 指定非 0 时缩放有误 +2. 修复 u-icon 添加 stop 属性的时候报错 +3. 优化遗留的通过正则判断 rpx 单位的问题 +4. 优化 Layout 布局 vue 使用 gutter 时,会超出固定区域 +5. 优化 search 组件高度单位问题(rpx -> px) +6. 修复 u-image slot 加载和错误的图片失去了高度 +7. 修复 u-index-list 中 footer 插槽与 header 插槽存在性判断错误 +8. 修复部分机型下 u-popup 关闭时会闪烁 +9. 修复 u-image 在 nvue-app 下失去宽高 +10. 修复 u-popup 运行报错 +11. 修复 u-tooltip 报错 +12. 修复 box-sizing 在 app 下的警告 +13. 修复 u-navbar 在小程序中报运行时错误 +14. 其他修复 + +## 2.0.23(2022-01-24) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复 image 组件在 hx3.3.9 的 nvue 下可能会显示异常的问题 +2. 修复 col 组件 gutter 参数带 rpx 单位处理不正确的问题 +3. 修复 text 组件单行时无法显示省略号的问题 +4. navbar 添加 titleStyle 参数 +5. 升级到 hx3.3.9 可消除 nvue 下控制台样式警告的问题 + +## 2.0.22(2022-01-19) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. $u.page()方法优化,避免在特殊场景可能报错的问题 +2. picker 组件添加 immediateChange 参数 +3. 新增$u.pages()方法 + +## 2.0.21(2022-01-19) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 优化:form 组件在用户设置 rules 的时候提示用户 model 必传 +2. 优化遗留的通过正则判断 rpx 单位的问题 +3. 修复微信小程序环境中 tabbar 组件开启 safeAreaInsetBottom 属性后,placeholder 高度填充不正确 +4. 修复 swiper 在 current 指定非 0 时缩放有误 +5. 修复 u-icon 添加 stop 属性的时候报错 +6. 修复 upload 组件在 accept=all 的时候没有作用 +7. 修复在 text 组件 mode 为 phone 时 call 属性无效的问题 +8. 处理 u-form clearValidate 方法 +9. 其他修复 + +## 2.0.20(2022-01-14) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复 calendar 默认会选择一个日期,如果直接点确定的话,无法取到值的问题 +2. 修复 Slider 缺少 disabled props 还有注释 +3. 修复 u-notice-bar 点击事件无法拿到 index 索引值的问题 +4. 修复 u-collapse-item 在 vue 文件下,app 端自定义插槽不生效的问题 +5. 优化头像为空时显示默认头像 +6. 修复图片地址赋值后判断加载状态为完成问题 +7. 修复日历滚动到默认日期月份区域 +8. search 组件暴露点击左边 icon 事件 +9. 修复 u-form clearValidate 方法不生效 +10. upload h5 端增加返回文件参数(文件的 name 参数) +11. 处理 upload 选择文件后 url 为 blob 类型无法预览的问题 +12. u-code-input 修复输入框没有往左移出一半屏幕 +13. 修复 Upload 上传 disabled 为 true 时,控制台报 hoverClass 类型错误 +14. 临时处理 ios app 下 grid 点击坍塌问题 +15. 其他修复 + +## 2.0.19(2021-12-29) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 优化微信小程序包体积可在微信中预览,请升级 HbuilderX3.3.4,同时在“运行->运行到小程序模拟器”中勾选“运行时是否压缩代码” +2. 优化微信小程序 setData 性能,处理某些方法如$u.route()无法在模板中使用的问题 +3. navbar 添加 autoBack 参数 +4. 允许 avatar 组件的事件冒泡 +5. 修复 cell 组件报错问题 +6. 其他修复 + +## 2.0.18(2021-12-28) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复 app 端编译报错问题 +2. 重新处理微信小程序端 setData 过大的性能问题 +3. 修复边框问题 +4. 修复最大最小月份不大于 0 则没有数据出现的问题 +5. 修复 SwipeAction 微信小程序端无法上下滑动问题 +6. 修复 input 的 placeholder 在小程序端默认显示为 true 问题 +7. 修复 divider 组件 click 事件无效问题 +8. 修复 u-code-input maxlength 属性值为 String 类型时显示异常 +9. 修复当 grid 只有 1 到 2 时 在小程序端 algin 设置无效的问题 +10. 处理 form-item 的 label 为 top 时,取消错误提示的左边距 +11. 其他修复 + +## 2.0.17(2021-12-26) + +## uView 正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助 uView](https://www.oschina.net/project/top_cn_2021/?id=583) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 解决 HBuilderX3.3.3.20211225 版本导致的样式问题 +2. calendar 日历添加 monthNum 参数 +3. navbar 添加 center slot + +## 2.0.16(2021-12-25) + +## uView 正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助 uView](https://www.oschina.net/project/top_cn_2021/?id=583) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 解决微信小程序 setData 性能问题 +2. 修复 count-down 组件 change 事件不触发问题 + +## 2.0.15(2021-12-21) + +## uView 正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助 uView](https://www.oschina.net/project/top_cn_2021/?id=583) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复 Cell 单元格 titleWidth 无效 +2. 修复 cheakbox 组件 ischecked 不更新 +3. 修复 keyboard 是否显示"."按键默认值问题 +4. 修复 number-keyboard 是否显示键盘的"."符号问题 +5. 修复 Input 输入框 readonly 无效 +6. 修复 u-avatar 导致打包 app、H5 时候报错问题 +7. 修复 Upload 上传 deletable 无效 +8. 修复 upload 当设置 maxSize 时无效的问题 +9. 修复 tabs lineWidth 传入带单位的字符串的时候偏移量计算错误问题 +10. 修复 rate 组件在有 padding 的 view 内,显示的星星位置和可触摸区域不匹配,无法正常选中星星 + +## 2.0.13(2021-12-14) + +## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复配置默认单位为 rpx 可能会导致自定义导航栏高度异常的问题 + +## 2.0.12(2021-12-14) + +## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复 tabs 组件在 vue 环境下划线消失的问题 +2. 修复 upload 组件在安卓小程序无法选择视频的问题 +3. 添加 uni.$u.config.unit 配置,用于配置参数默认单位,详见:[默认单位配置](https://uview.d3u.cn/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE) +4. 修复 textarea 组件在没绑定 v-model 时,字符统计不生效问题 +5. 修复 nvue 下控制是否出现滚动条失效问题 + +## 2.0.11(2021-12-13) + +## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. text 组件 align 参数无效的问题 +2. subsection 组件添加 keyName 参数 +3. upload 组件无法判断[Object file]类型的问题 +4. 处理 notify 层级过低问题 +5. codeInput 组件添加 disabledDot 参数 +6. 处理 actionSheet 组件 round 参数无效的问题 +7. calendar 组件添加 round 参数用于控制圆角值 +8. 处理 swipeAction 组件在 vue 环境下默认被打开的问题 +9. button 组件的 throttleTime 节流参数无效的问题 +10. 解决 u-notify 手动关闭方法 close()无效的问题 +11. input 组件 readonly 不生效问题 +12. tag 组件 type 参数为 info 不生效问题 + +## 2.0.10(2021-12-08) + +## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复 button sendMessagePath 属性不生效 +2. 修复 DatetimePicker 选择器 title 无效 +3. 修复 u-toast 设置 loading=true 不生效 +4. 修复 u-text 金额模式传 0 报错 +5. 修复 u-toast 组件的 icon 属性配置不生效 +6. button 的 icon 在特殊场景下的颜色优化 +7. IndexList 优化,增加# + +## 2.0.9(2021-12-01) + +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 优化 swiper 的 height 支持 100%值(仅 vue 有效),修复嵌入视频时 click 事件无法触发的问题 +2. 优化 tabs 组件对 list 值为空的判断,或者动态变化 list 时重新计算相关尺寸的问题 +3. 优化 datetime-picker 组件逻辑,让其后续打开的默认值为上一次的选中值,需要通过 v-model 绑定值才有效 +4. 修复 upload 内嵌在其他组件中,选择图片可能不会换行的问题 + +## 2.0.8(2021-12-01) + +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复 toast 的 position 参数无效问题 +2. 处理 input 在 ios nvue 上无法获得焦点的问题 +3. avatar-group 组件添加 extraValue 参数,让剩余展示数量可手动控制 +4. tabs 组件添加 keyName 参数用于配置从对象中读取的键名 +5. 处理 text 组件名字脱敏默认配置无效的问题 +6. 处理 picker 组件 item 文本太长换行问题 + +## 2.0.7(2021-11-30) + +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 修复 radio 和 checkbox 动态改变 v-model 无效的问题。 +2. 优化 form 规则 validator 在微信小程序用法 +3. 修复 backtop 组件 mode 参数在微信小程序无效的问题 +4. 处理 Album 的 previewFullImage 属性无效的问题 +5. 处理 u-datetime-picker 组件 mode='time'在选择改变时间时,控制台报错的问题 + +## 2.0.6(2021-11-27) + +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. 处理 tag 组件在 vue 下边框无效的问题。 +2. 处理 popup 组件圆角参数可能无效的问题。 +3. 处理 tabs 组件 lineColor 参数可能无效的问题。 +4. propgress 组件在值很小时,显示异常的问题。 + +## 2.0.5(2021-11-25) + +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. calendar 在 vue 下显示异常问题。 +2. form 组件 labelPosition 和 errorType 参数无效的问题 +3. input 组件 inputAlign 无效的问题 +4. 其他一些修复 + +## 2.0.4(2021-11-23) + +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +0. input 组件缺失@confirm 事件,以及 subfix 和 prefix 无效问题 +1. component.scss 文件样式在 vue 下干扰全局布局问题 +2. 修复 subsection 在 vue 环境下表现异常的问题 +3. tag 组件的 bgColor 等参数无效的问题 +4. upload 组件不换行的问题 +5. 其他的一些修复处理 + +## 2.0.3(2021-11-16) + +## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. uView2.0 已实现全面兼容 nvue +2. uView2.0 对 1.x 进行了架构重构,细节和性能都有极大提升 +3. 目前 uView2.0 为公测阶段,相关细节可能会有变动 +4. 我们写了一份与 1.x 的对比指南,详见[对比 1.x](https://uview.d3u.cn/components/diff1.x.html) +5. 处理 modal 的 confirm 回调事件拼写错误问题 +6. 处理 input 组件@input 事件参数错误问题 +7. 其他一些修复 + +## 2.0.2(2021-11-16) + +## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. uView2.0 已实现全面兼容 nvue +2. uView2.0 对 1.x 进行了架构重构,细节和性能都有极大提升 +3. 目前 uView2.0 为公测阶段,相关细节可能会有变动 +4. 我们写了一份与 1.x 的对比指南,详见[对比 1.x](https://uview.d3u.cn/components/diff1.x.html) +5. 修复 input 组件 formatter 参数缺失问题 +6. 优化 loading-icon 组件的 scss 写法问题,防止不兼容新版本 scss + +## 2.0.0(2020-11-15) + +## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0 重磅发布,利剑出鞘,一统江湖 + +1. uView2.0 已实现全面兼容 nvue +2. uView2.0 对 1.x 进行了架构重构,细节和性能都有极大提升 +3. 目前 uView2.0 为公测阶段,相关细节可能会有变动 +4. 我们写了一份与 1.x 的对比指南,详见[对比 1.x](https://uview.d3u.cn/components/diff1.x.html) +5. 修复 input 组件 formatter 参数缺失问题 diff --git a/uni_modules/uview-next/components/u--form/u--form.vue b/uni_modules/uview-next/components/u--form/u--form.vue new file mode 100644 index 0000000..b210600 --- /dev/null +++ b/uni_modules/uview-next/components/u--form/u--form.vue @@ -0,0 +1,95 @@ + + + diff --git a/uni_modules/uview-next/components/u--image/u--image.vue b/uni_modules/uview-next/components/u--image/u--image.vue new file mode 100644 index 0000000..1090286 --- /dev/null +++ b/uni_modules/uview-next/components/u--image/u--image.vue @@ -0,0 +1,75 @@ + + + diff --git a/uni_modules/uview-next/components/u--input/u--input.vue b/uni_modules/uview-next/components/u--input/u--input.vue new file mode 100644 index 0000000..b199909 --- /dev/null +++ b/uni_modules/uview-next/components/u--input/u--input.vue @@ -0,0 +1,125 @@ + + + diff --git a/uni_modules/uview-next/components/u--text/u--text.vue b/uni_modules/uview-next/components/u--text/u--text.vue new file mode 100644 index 0000000..8f4dcf0 --- /dev/null +++ b/uni_modules/uview-next/components/u--text/u--text.vue @@ -0,0 +1,74 @@ + + + diff --git a/uni_modules/uview-next/components/u--textarea/u--textarea.vue b/uni_modules/uview-next/components/u--textarea/u--textarea.vue new file mode 100644 index 0000000..164e43a --- /dev/null +++ b/uni_modules/uview-next/components/u--textarea/u--textarea.vue @@ -0,0 +1,102 @@ + + + diff --git a/uni_modules/uview-next/components/u-action-sheet/props.js b/uni_modules/uview-next/components/u-action-sheet/props.js new file mode 100644 index 0000000..13aca69 --- /dev/null +++ b/uni_modules/uview-next/components/u-action-sheet/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 操作菜单是否展示 (默认false) + show: { + type: Boolean, + default: ()=> uni.$u.props.actionSheet.show + }, + // 标题 + title: { + type: String, + default: ()=> uni.$u.props.actionSheet.title + }, + // 选项上方的描述信息 + description: { + type: String, + default: ()=> uni.$u.props.actionSheet.description + }, + // 数据 + actions: { + type: Array, + default: ()=> uni.$u.props.actionSheet.actions + }, + // 取消按钮的文字,不为空时显示按钮 + cancelText: { + type: String, + default: ()=> uni.$u.props.actionSheet.cancelText + }, + // 点击某个菜单项时是否关闭弹窗 + closeOnClickAction: { + type: Boolean, + default: ()=> uni.$u.props.actionSheet.closeOnClickAction + }, + // 处理底部安全区(默认true) + safeAreaInsetBottom: { + type: Boolean, + default: ()=> uni.$u.props.actionSheet.safeAreaInsetBottom + }, + // 小程序的打开方式 + openType: { + type: String, + default: ()=> uni.$u.props.actionSheet.openType + }, + // 点击遮罩是否允许关闭 (默认true) + closeOnClickOverlay: { + type: Boolean, + default: ()=> uni.$u.props.actionSheet.closeOnClickOverlay + }, + // 圆角值 + round: { + type: [String, Number], + default: ()=> uni.$u.props.actionSheet.round + }, + // 高度 + height: { + type: [String, Number], + default: ()=> uni.$u.props.actionSheet.height + } + } +} diff --git a/uni_modules/uview-next/components/u-action-sheet/u-action-sheet.vue b/uni_modules/uview-next/components/u-action-sheet/u-action-sheet.vue new file mode 100644 index 0000000..32fe8b2 --- /dev/null +++ b/uni_modules/uview-next/components/u-action-sheet/u-action-sheet.vue @@ -0,0 +1,248 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-album/props.js b/uni_modules/uview-next/components/u-album/props.js new file mode 100644 index 0000000..579c477 --- /dev/null +++ b/uni_modules/uview-next/components/u-album/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 图片地址,Array|Array形式 + urls: { + type: Array, + default: ()=> uni.$u.props.album.urls + }, + // 指定从数组的对象元素中读取哪个属性作为图片地址 + keyName: { + type: String, + default: ()=> uni.$u.props.album.keyName + }, + // 单图时,图片长边的长度 + singleSize: { + type: [String, Number], + default: ()=> uni.$u.props.album.singleSize + }, + // 多图时,图片边长 + multipleSize: { + type: [String, Number], + default: ()=> uni.$u.props.album.multipleSize + }, + // 多图时,图片水平和垂直之间的间隔 + space: { + type: [String, Number], + default: ()=> uni.$u.props.album.space + }, + // 单图时,图片缩放裁剪的模式 + singleMode: { + type: String, + default: ()=> uni.$u.props.album.singleMode + }, + // 多图时,图片缩放裁剪的模式 + multipleMode: { + type: String, + default: ()=> uni.$u.props.album.multipleMode + }, + // 最多展示的图片数量,超出时最后一个位置将会显示剩余图片数量 + maxCount: { + type: [String, Number], + default: ()=> uni.$u.props.album.maxCount + }, + // 是否可以预览图片 + previewFullImage: { + type: Boolean, + default: ()=> uni.$u.props.album.previewFullImage + }, + // 每行展示图片数量,如设置,singleSize和multipleSize将会无效 + rowCount: { + type: [String, Number], + default: ()=> uni.$u.props.album.rowCount + }, + // 超出maxCount时是否显示查看更多的提示 + showMore: { + type: Boolean, + default: ()=> uni.$u.props.album.showMore + } + } +} diff --git a/uni_modules/uview-next/components/u-album/u-album.vue b/uni_modules/uview-next/components/u-album/u-album.vue new file mode 100644 index 0000000..000c7eb --- /dev/null +++ b/uni_modules/uview-next/components/u-album/u-album.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-alert/props.js b/uni_modules/uview-next/components/u-alert/props.js new file mode 100644 index 0000000..dbcd0d8 --- /dev/null +++ b/uni_modules/uview-next/components/u-alert/props.js @@ -0,0 +1,44 @@ +export default { + props: { + // 显示文字 + title: { + type: String, + default: ()=> uni.$u.props.alert.title + }, + // 主题,success/warning/info/error + type: { + type: String, + default: ()=> uni.$u.props.alert.type + }, + // 辅助性文字 + description: { + type: String, + default: ()=> uni.$u.props.alert.description + }, + // 是否可关闭 + closable: { + type: Boolean, + default: ()=> uni.$u.props.alert.closable + }, + // 是否显示图标 + showIcon: { + type: Boolean, + default: ()=> uni.$u.props.alert.showIcon + }, + // 浅或深色调,light-浅色,dark-深色 + effect: { + type: String, + default: ()=> uni.$u.props.alert.effect + }, + // 文字是否居中 + center: { + type: Boolean, + default: ()=> uni.$u.props.alert.center + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: ()=> uni.$u.props.alert.fontSize + } + } +} diff --git a/uni_modules/uview-next/components/u-alert/u-alert.vue b/uni_modules/uview-next/components/u-alert/u-alert.vue new file mode 100644 index 0000000..9156318 --- /dev/null +++ b/uni_modules/uview-next/components/u-alert/u-alert.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-amount/props.js b/uni_modules/uview-next/components/u-amount/props.js new file mode 100644 index 0000000..1472d70 --- /dev/null +++ b/uni_modules/uview-next/components/u-amount/props.js @@ -0,0 +1,100 @@ +export default { + props: { + // 金额数值 + value: { + type: Number, + default: ()=> uni.$u.props.amount.value + }, + // #ifdef VUE3 + modelValue: { + type: Number, + default: ()=> uni.$u.props.amount.value + }, + // #endif + // 金融符号 + symbol: { + type: String, + default: ()=> uni.$u.props.amount.symbol + }, + // 是否置后金额符号位置 + reverse: { + type: Boolean, + default: ()=> uni.$u.props.amount.reverse + }, + // 数字精度,小数点后保留几位 + precision: { + type: Number, + default: ()=> uni.$u.props.amount.precision + }, + // 数字精度取舍是否四舍五入 + roundUp: { + type: Boolean, + default: ()=> uni.$u.props.amount.roundUp + }, + // 数字变化是否使用动画 + transition: { + type: Boolean, + default: ()=> uni.$u.props.amount.transition + }, + // 数字变化动画时长 + duration: { + type: Number, + default: ()=> uni.$u.props.amount.duration + }, + // 分隔符位置 (3为千分位,4为万分位) + separatorDigits: { + type: Number, + default: ()=> uni.$u.props.amount.separatorDigits + }, + // 分隔符 + separator: { + type: String, + default: ()=> uni.$u.props.amount.separator + }, + // 是否显示金融符号 + showSymbol: { + type: Boolean, + default: ()=> uni.$u.props.amount.showSymbol + }, + // 是否显示小数 + showDecimal: { + type: Boolean, + default: ()=> uni.$u.props.amount.showDecimal + }, + // 是否显示分隔符 + showSeparator: { + type: Boolean, + default: ()=> uni.$u.props.amount.showSeparator + }, + // 数字是否转换为大写中文 + capital: { + type: Boolean, + default: ()=> uni.$u.props.amount.capital + }, + // 整数字体大小 + fontSize: { + type: String, + default: ()=> uni.$u.props.amount.fontSize + }, + // 金融符号小数与整数的比例或字体大小 + fontSizeRatio: { + type: [String, Number], + default: ()=> uni.$u.props.amount.fontSizeRatio + }, + // 颜色 + color: { + type: String, + default: ()=> uni.$u.props.amount.color + }, + // 金融符号与小数字体颜色 + colorRatio: { + type: String, + default: ()=> uni.$u.props.amount.colorRatio + }, + // 自定义样式 + customStyle: { + type: Object, + default: ()=> uni.$u.props.amount.customStyle + } + } +} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-amount/u-amount.vue b/uni_modules/uview-next/components/u-amount/u-amount.vue new file mode 100644 index 0000000..ae3169b --- /dev/null +++ b/uni_modules/uview-next/components/u-amount/u-amount.vue @@ -0,0 +1,321 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-area-picker/props.js b/uni_modules/uview-next/components/u-area-picker/props.js new file mode 100644 index 0000000..3cc3f87 --- /dev/null +++ b/uni_modules/uview-next/components/u-area-picker/props.js @@ -0,0 +1,105 @@ +export default { + props: { + // 输入的值 + // #ifdef VUE2 + value: { + type: [Array, String, Number], + default: ()=> uni.$u.props.areaPicker.value + }, + // #endif + // #ifdef VUE3 + modelValue: { + type: [Array, String, Number], + default: ()=> uni.$u.props.areaPicker.value + }, + // #endif + // 是否展示picker弹窗 + show: { + type: Boolean, + default: ()=> uni.$u.props.areaPicker.show + }, + // 是否显示省份 + province: { + type: Boolean, + default: ()=> uni.$u.props.areaPicker.province + }, + // 是否显示城市 + city: { + type: Boolean, + default: ()=> uni.$u.props.areaPicker.city + }, + // 是否显示区县 + county: { + type: Boolean, + default: ()=> uni.$u.props.areaPicker.county + }, + // 是否展示顶部的操作栏 + showToolbar: { + type: Boolean, + default: ()=> uni.$u.props.areaPicker.showToolbar + }, + // 顶部标题 + title: { + type: String, + default: ()=> uni.$u.props.areaPicker.title + }, + // 是否显示加载中状态 + loading: { + type: Boolean, + default: ()=> uni.$u.props.areaPicker.loading + }, + // 各列中,单个选项的高度 + itemHeight: { + type: [String, Number], + default: ()=> uni.$u.props.areaPicker.itemHeight + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: ()=> uni.$u.$t('uAreaPicker.cancelText') + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: ()=> uni.$u.$t('uAreaPicker.confirmText') + }, + // 取消按钮的颜色 + cancelColor: { + type: String, + default: ()=> uni.$u.props.areaPicker.cancelColor + }, + // 确认按钮的颜色 + confirmColor: { + type: String, + default: ()=> uni.$u.props.areaPicker.confirmColor + }, + // 每列中可见选项的数量 + visibleItemCount: { + type: [String, Number], + default: ()=> uni.$u.props.areaPicker.visibleItemCount + }, + // 是否允许点击遮罩关闭选择器 + closeOnClickOverlay: { + type: Boolean, + default: ()=> uni.$u.props.areaPicker.closeOnClickOverlay + }, + // 是否在手指松开时立即触发 change 事件。若不开启则会在滚动动画结束后触发 change 事件,只在微信2.21.1及以上有效 + immediateChange: { + type: Boolean, + default: ()=> uni.$u.props.areaPicker.immediateChange + }, + // 设置圆角值 + round: { + type: String, + default: ()=> uni.$u.props.areaPicker.round + }, + showInput: { + type: Boolean, + default: ()=> uni.$u.props.areaPicker.showInput + }, + inputProps:{ + type: Object, + default: ()=> uni.$u.props.areaPicker.inputProps + } + } +} diff --git a/uni_modules/uview-next/components/u-area-picker/u-area-picker.vue b/uni_modules/uview-next/components/u-area-picker/u-area-picker.vue new file mode 100644 index 0000000..f89ee4c --- /dev/null +++ b/uni_modules/uview-next/components/u-area-picker/u-area-picker.vue @@ -0,0 +1,281 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-avatar-group/props.js b/uni_modules/uview-next/components/u-avatar-group/props.js new file mode 100644 index 0000000..5d83030 --- /dev/null +++ b/uni_modules/uview-next/components/u-avatar-group/props.js @@ -0,0 +1,52 @@ +export default { + props: { + // 头像图片组 + urls: { + type: Array, + default: ()=> uni.$u.props.avatarGroup.urls + }, + // 最多展示的头像数量 + maxCount: { + type: [String, Number], + default: ()=> uni.$u.props.avatarGroup.maxCount + }, + // 头像形状 + shape: { + type: String, + default: ()=> uni.$u.props.avatarGroup.shape + }, + // 图片裁剪模式 + mode: { + type: String, + default: ()=> uni.$u.props.avatarGroup.mode + }, + // 超出maxCount时是否显示查看更多的提示 + showMore: { + type: Boolean, + default: ()=> uni.$u.props.avatarGroup.showMore + }, + // 头像大小 + size: { + type: [String, Number], + default: ()=> uni.$u.props.avatarGroup.size + }, + // 指定从数组的对象元素中读取哪个属性作为图片地址 + keyName: { + type: String, + default: ()=> uni.$u.props.avatarGroup.keyName + }, + // 头像之间的遮挡比例 + gap: { + type: [String, Number], + validator(value) { + return value >= 0 && value <= 1 + }, + default: ()=> uni.$u.props.avatarGroup.gap + }, + // 需额外显示的值 + extraValue: { + type: [Number, String], + default: ()=> uni.$u.props.avatarGroup.extraValue + } + } +} diff --git a/uni_modules/uview-next/components/u-avatar-group/u-avatar-group.vue b/uni_modules/uview-next/components/u-avatar-group/u-avatar-group.vue new file mode 100644 index 0000000..aa6aa1b --- /dev/null +++ b/uni_modules/uview-next/components/u-avatar-group/u-avatar-group.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-avatar/props.js b/uni_modules/uview-next/components/u-avatar/props.js new file mode 100644 index 0000000..9b064a0 --- /dev/null +++ b/uni_modules/uview-next/components/u-avatar/props.js @@ -0,0 +1,78 @@ +export default { + props: { + // 头像图片路径(不能为相对路径) + src: { + type: String, + default: ()=> uni.$u.props.avatar.src + }, + // 头像形状,circle-圆形,square-方形 + shape: { + type: String, + default: ()=> uni.$u.props.avatar.shape + }, + // 头像尺寸 + size: { + type: [String, Number], + default: ()=> uni.$u.props.avatar.size + }, + // 裁剪模式 + mode: { + type: String, + default: ()=> uni.$u.props.avatar.mode + }, + // 显示的文字 + text: { + type: String, + default: ()=> uni.$u.props.avatar.text + }, + // 背景色 + bgColor: { + type: String, + default: ()=> uni.$u.props.avatar.bgColor + }, + // 文字颜色 + color: { + type: String, + default: ()=> uni.$u.props.avatar.color + }, + // 文字大小 + fontSize: { + type: [String, Number], + default: ()=> uni.$u.props.avatar.fontSize + }, + // 显示的图标 + icon: { + type: String, + default: ()=> uni.$u.props.avatar.icon + }, + // 显示小程序头像,只对百度,微信,QQ小程序有效 + mpAvatar: { + type: Boolean, + default: ()=> uni.$u.props.avatar.mpAvatar + }, + // 是否使用随机背景色 + randomBgColor: { + type: Boolean, + default: ()=> uni.$u.props.avatar.randomBgColor + }, + // 加载失败的默认头像(组件有内置默认图片) + defaultUrl: { + type: String, + default: ()=> uni.$u.props.avatar.defaultUrl + }, + // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间 + colorIndex: { + type: [String, Number], + // 校验参数规则,索引在0-19之间 + validator(n) { + return uni.$u.test.range(n, [0, 19]) || n === '' + }, + default: ()=> uni.$u.props.avatar.colorIndex + }, + // 组件标识符 + name: { + type: String, + default: ()=> uni.$u.props.avatar.name + } + } +} diff --git a/uni_modules/uview-next/components/u-avatar/u-avatar.vue b/uni_modules/uview-next/components/u-avatar/u-avatar.vue new file mode 100644 index 0000000..05fab7b --- /dev/null +++ b/uni_modules/uview-next/components/u-avatar/u-avatar.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-back-top/props.js b/uni_modules/uview-next/components/u-back-top/props.js new file mode 100644 index 0000000..68e46f5 --- /dev/null +++ b/uni_modules/uview-next/components/u-back-top/props.js @@ -0,0 +1,54 @@ +export default { + props: { + // 返回顶部的形状,circle-圆形,square-方形 + mode: { + type: String, + default: ()=> uni.$u.props.backtop.mode + }, + // 自定义图标 + icon: { + type: String, + default: ()=> uni.$u.props.backtop.icon + }, + // 提示文字 + text: { + type: String, + default: ()=> uni.$u.props.backtop.text + }, + // 返回顶部滚动时间 + duration: { + type: [String, Number], + default: ()=> uni.$u.props.backtop.duration + }, + // 滚动距离 + scrollTop: { + type: [String, Number], + default: ()=> uni.$u.props.backtop.scrollTop + }, + // 距离顶部多少距离显示,单位px + top: { + type: [String, Number], + default: ()=> uni.$u.props.backtop.top + }, + // 返回顶部按钮到底部的距离,单位px + bottom: { + type: [String, Number], + default: ()=> uni.$u.props.backtop.bottom + }, + // 返回顶部按钮到右边的距离,单位px + right: { + type: [String, Number], + default: ()=> uni.$u.props.backtop.right + }, + // 层级 + zIndex: { + type: [String, Number], + default: ()=> uni.$u.props.backtop.zIndex + }, + // 图标的样式,对象形式 + iconStyle: { + type: Object, + default: ()=> uni.$u.props.backtop.iconStyle + } + } +} diff --git a/uni_modules/uview-next/components/u-back-top/u-back-top.vue b/uni_modules/uview-next/components/u-back-top/u-back-top.vue new file mode 100644 index 0000000..6a25e8d --- /dev/null +++ b/uni_modules/uview-next/components/u-back-top/u-back-top.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-badge/props.js b/uni_modules/uview-next/components/u-badge/props.js new file mode 100644 index 0000000..5e5d186 --- /dev/null +++ b/uni_modules/uview-next/components/u-badge/props.js @@ -0,0 +1,78 @@ +export default { + props: { + // 是否显示圆点 + isDot: { + type: Boolean, + default: ()=> uni.$u.props.badge.isDot + }, + // 显示的内容 + value: { + type: [Number, String], + default: ()=> uni.$u.props.badge.value + }, + // #ifdef VUE3 + modelValue: { + type: [Number, String], + default: ()=> uni.$u.props.badge.value + }, + // #endif + // 是否显示 + show: { + type: Boolean, + default: ()=> uni.$u.props.badge.show + }, + // 最大值,超过最大值会显示 '{max}+' + max: { + type: [Number, String], + default: ()=> uni.$u.props.badge.max + }, + // 主题类型,error|warning|success|primary + type: { + type: String, + default: ()=> uni.$u.props.badge.type + }, + // 当数值为 0 时,是否展示 Badge + showZero: { + type: Boolean, + default: ()=> uni.$u.props.badge.showZero + }, + // 背景颜色,优先级比type高,如设置,type参数会失效 + bgColor: { + type: String, + default: ()=> uni.$u.props.badge.bgColor + }, + // 字体颜色 + color: { + type: String, + default: ()=> uni.$u.props.badge.color + }, + // 徽标形状,circle-四角均为圆角,horn-左下角为直角 + shape: { + type: String, + default: ()=> uni.$u.props.badge.shape + }, + // 设置数字的显示方式,overflow|ellipsis|limit + // overflow会根据max字段判断,超出显示`${max}+` + // ellipsis会根据max判断,超出显示`${max}...` + // limit会依据1000作为判断条件,超出1000,显示`${value/1000}K`,比如2.2k、3.34w,最多保留2位小数 + numberType: { + type: String, + default: ()=> uni.$u.props.badge.numberType + }, + // 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效 + offset: { + type: Array, + default: ()=> uni.$u.props.badge.offset + }, + // 是否反转背景和字体颜色 + inverted: { + type: Boolean, + default: ()=> uni.$u.props.badge.inverted + }, + // 是否绝对定位 + absolute: { + type: Boolean, + default: ()=> uni.$u.props.badge.absolute + } + } +} diff --git a/uni_modules/uview-next/components/u-badge/u-badge.vue b/uni_modules/uview-next/components/u-badge/u-badge.vue new file mode 100644 index 0000000..79f8048 --- /dev/null +++ b/uni_modules/uview-next/components/u-badge/u-badge.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/JsBarcode.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/JsBarcode.js new file mode 100644 index 0000000..0005ec4 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/JsBarcode.js @@ -0,0 +1,208 @@ +// Import all the barcodes +import barcodes from './barcodes/'; + +// Help functions +import merge from './help/merge.js'; +import linearizeEncodings from './help/linearizeEncodings.js'; +import fixOptions from './help/fixOptions.js'; +import getRenderProperties from './help/getRenderProperties.js'; +import optionsFromStrings from './help/optionsFromStrings.js'; + +// Exceptions +import ErrorHandler from './exceptions/ErrorHandler.js'; +import {InvalidInputException, NoElementException} from './exceptions/exceptions.js'; + +// Default values +import defaults from './options/defaults.js'; + +// The protype of the object returned from the JsBarcode() call +let API = function(){}; + +// The first call of the library API +// Will return an object with all barcodes calls and the data that is used +// by the renderers +let JsBarcode = function(element, text, options){ + var api = new API(); + + if(typeof element === "undefined"){ + throw Error("No element to render on was provided."); + } + + // Variables that will be pased through the API calls + api._renderProperties = getRenderProperties(element); + api._encodings = []; + api._options = defaults; + api._errorHandler = new ErrorHandler(api); + + // If text is set, use the simple syntax (render the barcode directly) + if(typeof text !== "undefined"){ + options = options || {}; + + if(!options.format){ + options.format = autoSelectBarcode(); + } + + api.options(options)[options.format](text, options).render(); + } + + return api; +}; + +// To make tests work TODO: remove +JsBarcode.getModule = function(name){ + return barcodes[name]; +}; + +// Register all barcodes +for(var name in barcodes){ + if(barcodes.hasOwnProperty(name)){ // Security check if the propery is a prototype property + registerBarcode(barcodes, name); + } +} +function registerBarcode(barcodes, name){ + API.prototype[name] = + API.prototype[name.toUpperCase()] = + API.prototype[name.toLowerCase()] = + function(text, options){ + var api = this; + return api._errorHandler.wrapBarcodeCall(function(){ + // Ensure text is options.text + options.text = typeof options.text === 'undefined' ? undefined : '' + options.text; + + var newOptions = merge(api._options, options); + newOptions = optionsFromStrings(newOptions); + var Encoder = barcodes[name]; + var encoded = encode(text, Encoder, newOptions); + api._encodings.push(encoded); + + return api; + }); + }; +} + +// encode() handles the Encoder call and builds the binary string to be rendered +function encode(text, Encoder, options){ + // Ensure that text is a string + text = "" + text; + + var encoder = new Encoder(text, options); + + // If the input is not valid for the encoder, throw error. + // If the valid callback option is set, call it instead of throwing error + if(!encoder.valid()){ + throw new InvalidInputException(encoder.constructor.name, text); + } + + // Make a request for the binary data (and other infromation) that should be rendered + var encoded = encoder.encode(); + + // Encodings can be nestled like [[1-1, 1-2], 2, [3-1, 3-2] + // Convert to [1-1, 1-2, 2, 3-1, 3-2] + encoded = linearizeEncodings(encoded); + + // Merge + for(let i = 0; i < encoded.length; i++){ + encoded[i].options = merge(options, encoded[i].options); + } + + return encoded; +} + +function autoSelectBarcode(){ + // If CODE128 exists. Use it + if(barcodes["CODE128"]){ + return "CODE128"; + } + + // Else, take the first (probably only) barcode + return Object.keys(barcodes)[0]; +} + +// Sets global encoder options +// Added to the api by the JsBarcode function +API.prototype.options = function(options){ + this._options = merge(this._options, options); + return this; +}; + +// Will create a blank space (usually in between barcodes) +API.prototype.blank = function(size){ + const zeroes = new Array(size + 1).join("0"); + this._encodings.push({data: zeroes}); + return this; +}; + +// Initialize JsBarcode on all HTML elements defined. +API.prototype.init = function(){ + // Should do nothing if no elements where found + if(!this._renderProperties){ + return; + } + + // Make sure renderProperies is an array + if(!Array.isArray(this._renderProperties)){ + this._renderProperties = [this._renderProperties]; + } + + var renderProperty; + for(let i in this._renderProperties){ + renderProperty = this._renderProperties[i]; + var options = merge(this._options, renderProperty.options); + + if(options.format == "auto"){ + options.format = autoSelectBarcode(); + } + + this._errorHandler.wrapBarcodeCall(function(){ + var text = options.value; + var Encoder = barcodes[options.format.toUpperCase()]; + var encoded = encode(text, Encoder, options); + + render(renderProperty, encoded, options); + }); + } +}; + + +// The render API call. Calls the real render function. +API.prototype.render = function(){ + if(!this._renderProperties){ + throw new NoElementException(); + } + + if(Array.isArray(this._renderProperties)){ + for(var i = 0; i < this._renderProperties.length; i++){ + render(this._renderProperties[i], this._encodings, this._options); + } + } + else{ + render(this._renderProperties, this._encodings, this._options); + } + + return this; +}; + +API.prototype._defaults = defaults; + +// Prepares the encodings and calls the renderer +function render(renderProperties, encodings, options){ + encodings = linearizeEncodings(encodings); + + for(let i = 0; i < encodings.length; i++){ + encodings[i].options = merge(options, encodings[i].options); + fixOptions(encodings[i].options); + } + + fixOptions(options); + + var Renderer = renderProperties.renderer; + var renderer = new Renderer(renderProperties.element, encodings, options); + renderer.render(); + + if(renderProperties.afterRender){ + renderProperties.afterRender(); + } +} + +// Export to commonJS +export default JsBarcode; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/Barcode.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/Barcode.js new file mode 100644 index 0000000..89a55e0 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/Barcode.js @@ -0,0 +1,9 @@ +class Barcode{ + constructor(data, options){ + this.data = data; + this.text = options.text || data; + this.options = options; + } +} + +export default Barcode; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128.js new file mode 100644 index 0000000..dfd929b --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128.js @@ -0,0 +1,127 @@ +import Barcode from "../Barcode.js"; +import { SHIFT, SET_A, SET_B, MODULO, STOP, FNC1, SET_BY_CODE, SWAP, BARS } from './constants'; + +// This is the master class, +// it does require the start code to be included in the string +class CODE128 extends Barcode { + constructor(data, options) { + super(data.substring(1), options); + + // Get array of ascii codes from data + this.bytes = data.split('') + .map(char => char.charCodeAt(0)); + } + + valid() { + // ASCII value ranges 0-127, 200-211 + return /^[\x00-\x7F\xC8-\xD3]+$/.test(this.data); + } + + // The public encoding function + encode() { + const bytes = this.bytes; + // Remove the start code from the bytes and set its index + const startIndex = bytes.shift() - 105; + // Get start set by index + const startSet = SET_BY_CODE[startIndex]; + + if (startSet === undefined) { + throw new RangeError('The encoding does not start with a start character.'); + } + + if (this.shouldEncodeAsEan128() === true) { + bytes.unshift(FNC1); + } + + // Start encode with the right type + const encodingResult = CODE128.next(bytes, 1, startSet); + + return { + text: + this.text === this.data + ? this.text.replace(/[^\x20-\x7E]/g, '') + : this.text, + data: + // Add the start bits + CODE128.getBar(startIndex) + + // Add the encoded bits + encodingResult.result + + // Add the checksum + CODE128.getBar((encodingResult.checksum + startIndex) % MODULO) + + // Add the end bits + CODE128.getBar(STOP) + }; + } + + // GS1-128/EAN-128 + shouldEncodeAsEan128() { + let isEAN128 = this.options.ean128 || false; + if (typeof isEAN128 === 'string') { + isEAN128 = isEAN128.toLowerCase() === 'true'; + } + return isEAN128; + } + + // Get a bar symbol by index + static getBar(index) { + return BARS[index] ? BARS[index].toString() : ''; + } + + // Correct an index by a set and shift it from the bytes array + static correctIndex(bytes, set) { + if (set === SET_A) { + const charCode = bytes.shift(); + return charCode < 32 ? charCode + 64 : charCode - 32; + } else if (set === SET_B) { + return bytes.shift() - 32; + } else { + return (bytes.shift() - 48) * 10 + bytes.shift() - 48; + } + } + + static next(bytes, pos, set) { + if (!bytes.length) { + return { result: '', checksum: 0 }; + } + + let nextCode, index; + + // Special characters + if (bytes[0] >= 200){ + index = bytes.shift() - 105; + const nextSet = SWAP[index]; + + // Swap to other set + if (nextSet !== undefined) { + nextCode = CODE128.next(bytes, pos + 1, nextSet); + } + // Continue on current set but encode a special character + else { + // Shift + if ((set === SET_A || set === SET_B) && index === SHIFT) { + // Convert the next character so that is encoded correctly + bytes[0] = (set === SET_A) + ? bytes[0] > 95 ? bytes[0] - 96 : bytes[0] + : bytes[0] < 32 ? bytes[0] + 96 : bytes[0]; + } + nextCode = CODE128.next(bytes, pos + 1, set); + } + } + // Continue encoding + else { + index = CODE128.correctIndex(bytes, set); + nextCode = CODE128.next(bytes, pos + 1, set); + } + + // Get the correct binary encoding and calculate the weight + const enc = CODE128.getBar(index); + const weight = index * pos; + + return { + result: enc + nextCode.result, + checksum: weight + nextCode.checksum + }; + } +} + +export default CODE128; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128A.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128A.js new file mode 100644 index 0000000..c8e9af5 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128A.js @@ -0,0 +1,14 @@ +import CODE128 from './CODE128.js'; +import { A_START_CHAR, A_CHARS } from './constants'; + +class CODE128A extends CODE128 { + constructor(string, options) { + super(A_START_CHAR + string, options); + } + + valid() { + return (new RegExp(`^${A_CHARS}+$`)).test(this.data); + } +} + +export default CODE128A; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128B.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128B.js new file mode 100644 index 0000000..0056315 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128B.js @@ -0,0 +1,14 @@ +import CODE128 from './CODE128.js'; +import { B_START_CHAR, B_CHARS } from './constants'; + +class CODE128B extends CODE128 { + constructor(string, options) { + super(B_START_CHAR + string, options); + } + + valid() { + return (new RegExp(`^${B_CHARS}+$`)).test(this.data); + } +} + +export default CODE128B; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128C.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128C.js new file mode 100644 index 0000000..db33269 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128C.js @@ -0,0 +1,14 @@ +import CODE128 from './CODE128.js'; +import { C_START_CHAR, C_CHARS } from './constants'; + +class CODE128C extends CODE128 { + constructor(string, options) { + super(C_START_CHAR + string, options); + } + + valid() { + return (new RegExp(`^${C_CHARS}+$`)).test(this.data); + } +} + +export default CODE128C; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128_AUTO.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128_AUTO.js new file mode 100644 index 0000000..6b00643 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/CODE128_AUTO.js @@ -0,0 +1,15 @@ +import CODE128 from './CODE128'; +import autoSelectModes from './auto'; + +class CODE128AUTO extends CODE128{ + constructor(data, options){ + // ASCII value ranges 0-127, 200-211 + if (/^[\x00-\x7F\xC8-\xD3]+$/.test(data)) { + super(autoSelectModes(data), options); + } else{ + super(data, options); + } + } +} + +export default CODE128AUTO; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/auto.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/auto.js new file mode 100644 index 0000000..5a88938 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/auto.js @@ -0,0 +1,68 @@ +import { A_START_CHAR, B_START_CHAR, C_START_CHAR, A_CHARS, B_CHARS, C_CHARS } from './constants'; + +// Match Set functions +const matchSetALength = (string) => string.match(new RegExp(`^${A_CHARS}*`))[0].length; +const matchSetBLength = (string) => string.match(new RegExp(`^${B_CHARS}*`))[0].length; +const matchSetC = (string) => string.match(new RegExp(`^${C_CHARS}*`))[0]; + +// CODE128A or CODE128B +function autoSelectFromAB(string, isA){ + const ranges = isA ? A_CHARS : B_CHARS; + const untilC = string.match(new RegExp(`^(${ranges}+?)(([0-9]{2}){2,})([^0-9]|$)`)); + + if (untilC) { + return ( + untilC[1] + + String.fromCharCode(204) + + autoSelectFromC(string.substring(untilC[1].length)) + ); + } + + const chars = string.match(new RegExp(`^${ranges}+`))[0]; + + if (chars.length === string.length) { + return string; + } + + return ( + chars + + String.fromCharCode(isA ? 205 : 206) + + autoSelectFromAB(string.substring(chars.length), !isA) + ); +} + +// CODE128C +function autoSelectFromC(string) { + const cMatch = matchSetC(string); + const length = cMatch.length; + + if (length === string.length) { + return string; + } + + string = string.substring(length); + + // Select A/B depending on the longest match + const isA = matchSetALength(string) >= matchSetBLength(string); + return cMatch + String.fromCharCode(isA ? 206 : 205) + autoSelectFromAB(string, isA); +} + +// Detect Code Set (A, B or C) and format the string +export default (string) => { + let newString; + const cLength = matchSetC(string).length; + + // Select 128C if the string start with enough digits + if (cLength >= 2) { + newString = C_START_CHAR + autoSelectFromC(string); + } else { + // Select A/B depending on the longest match + const isA = matchSetALength(string) > matchSetBLength(string); + newString = (isA ? A_START_CHAR : B_START_CHAR) + autoSelectFromAB(string, isA); + } + + return newString.replace( + /[\xCD\xCE]([^])[\xCD\xCE]/, // Any sequence between 205 and 206 characters + (match, char) => String.fromCharCode(203) + char + ); +}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/constants.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/constants.js new file mode 100644 index 0000000..10846ca --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/constants.js @@ -0,0 +1,71 @@ +// constants for internal usage +export const SET_A = 0; +export const SET_B = 1; +export const SET_C = 2; + +// Special characters +export const SHIFT = 98; +export const START_A = 103; +export const START_B = 104; +export const START_C = 105; +export const MODULO = 103; +export const STOP = 106; +export const FNC1 = 207; + +// Get set by start code +export const SET_BY_CODE = { + [START_A]: SET_A, + [START_B]: SET_B, + [START_C]: SET_C, +}; + +// Get next set by code +export const SWAP = { + 101: SET_A, + 100: SET_B, + 99: SET_C, +}; + +export const A_START_CHAR = String.fromCharCode(208); // START_A + 105 +export const B_START_CHAR = String.fromCharCode(209); // START_B + 105 +export const C_START_CHAR = String.fromCharCode(210); // START_C + 105 + +// 128A (Code Set A) +// ASCII characters 00 to 95 (0–9, A–Z and control codes), special characters, and FNC 1–4 +export const A_CHARS = "[\x00-\x5F\xC8-\xCF]"; + +// 128B (Code Set B) +// ASCII characters 32 to 127 (0–9, A–Z, a–z), special characters, and FNC 1–4 +export const B_CHARS = "[\x20-\x7F\xC8-\xCF]"; + +// 128C (Code Set C) +// 00–99 (encodes two digits with a single code point) and FNC1 +export const C_CHARS = "(\xCF*[0-9]{2}\xCF*)"; + +// CODE128 includes 107 symbols: +// 103 data symbols, 3 start symbols (A, B and C), and 1 stop symbol (the last one) +// Each symbol consist of three black bars (1) and three white spaces (0). +export const BARS = [ + 11011001100, 11001101100, 11001100110, 10010011000, 10010001100, + 10001001100, 10011001000, 10011000100, 10001100100, 11001001000, + 11001000100, 11000100100, 10110011100, 10011011100, 10011001110, + 10111001100, 10011101100, 10011100110, 11001110010, 11001011100, + 11001001110, 11011100100, 11001110100, 11101101110, 11101001100, + 11100101100, 11100100110, 11101100100, 11100110100, 11100110010, + 11011011000, 11011000110, 11000110110, 10100011000, 10001011000, + 10001000110, 10110001000, 10001101000, 10001100010, 11010001000, + 11000101000, 11000100010, 10110111000, 10110001110, 10001101110, + 10111011000, 10111000110, 10001110110, 11101110110, 11010001110, + 11000101110, 11011101000, 11011100010, 11011101110, 11101011000, + 11101000110, 11100010110, 11101101000, 11101100010, 11100011010, + 11101111010, 11001000010, 11110001010, 10100110000, 10100001100, + 10010110000, 10010000110, 10000101100, 10000100110, 10110010000, + 10110000100, 10011010000, 10011000010, 10000110100, 10000110010, + 11000010010, 11001010000, 11110111010, 11000010100, 10001111010, + 10100111100, 10010111100, 10010011110, 10111100100, 10011110100, + 10011110010, 11110100100, 11110010100, 11110010010, 11011011110, + 11011110110, 11110110110, 10101111000, 10100011110, 10001011110, + 10111101000, 10111100010, 11110101000, 11110100010, 10111011110, + 10111101110, 11101011110, 11110101110, 11010000100, 11010010000, + 11010011100, 1100011101011 +]; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/index.js new file mode 100644 index 0000000..e45411d --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE128/index.js @@ -0,0 +1,6 @@ +import CODE128 from './CODE128_AUTO.js'; +import CODE128A from './CODE128A.js'; +import CODE128B from './CODE128B.js'; +import CODE128C from './CODE128C.js'; + +export {CODE128, CODE128A, CODE128B, CODE128C}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE39/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE39/index.js new file mode 100644 index 0000000..e793a6a --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE39/index.js @@ -0,0 +1,105 @@ +// Encoding documentation: +// https://en.wikipedia.org/wiki/Code_39#Encoding + +import Barcode from "../Barcode.js"; + +class CODE39 extends Barcode { + constructor(data, options){ + data = data.toUpperCase(); + + // Calculate mod43 checksum if enabled + if(options.mod43){ + data += getCharacter(mod43checksum(data)); + } + + super(data, options); + } + + encode(){ + // First character is always a * + var result = getEncoding("*"); + + // Take every character and add the binary representation to the result + for(let i = 0; i < this.data.length; i++){ + result += getEncoding(this.data[i]) + "0"; + } + + // Last character is always a * + result += getEncoding("*"); + + return { + data: result, + text: this.text + }; + } + + valid(){ + return this.data.search(/^[0-9A-Z\-\.\ \$\/\+\%]+$/) !== -1; + } +} + + + + + + +// All characters. The position in the array is the (checksum) value +var characters = [ + "0", "1", "2", "3", + "4", "5", "6", "7", + "8", "9", "A", "B", + "C", "D", "E", "F", + "G", "H", "I", "J", + "K", "L", "M", "N", + "O", "P", "Q", "R", + "S", "T", "U", "V", + "W", "X", "Y", "Z", + "-", ".", " ", "$", + "/", "+", "%", "*" +]; + +// The decimal representation of the characters, is converted to the +// corresponding binary with the getEncoding function +var encodings = [ + 20957, 29783, 23639, 30485, + 20951, 29813, 23669, 20855, + 29789, 23645, 29975, 23831, + 30533, 22295, 30149, 24005, + 21623, 29981, 23837, 22301, + 30023, 23879, 30545, 22343, + 30161, 24017, 21959, 30065, + 23921, 22385, 29015, 18263, + 29141, 17879, 29045, 18293, + 17783, 29021, 18269, 17477, + 17489, 17681, 20753, 35770 +]; + +// Get the binary representation of a character by converting the encodings +// from decimal to binary +function getEncoding(character){ + return getBinary(characterValue(character)); +} + +function getBinary(characterValue){ + return encodings[characterValue].toString(2); +} + +function getCharacter(characterValue){ + return characters[characterValue]; +} + +function characterValue(character){ + return characters.indexOf(character); +} + +function mod43checksum(data){ + var checksum = 0; + for(let i = 0; i < data.length; i++){ + checksum += characterValue(data[i]); + } + + checksum = checksum % 43; + return checksum; +} + +export {CODE39}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/CODE93.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/CODE93.js new file mode 100644 index 0000000..1add7e5 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/CODE93.js @@ -0,0 +1,73 @@ +// Encoding documentation: +// https://en.wikipedia.org/wiki/Code_93#Detailed_outline + +import { SYMBOLS, BINARIES, MULTI_SYMBOLS } from './constants'; +import Barcode from "../Barcode.js"; + +class CODE93 extends Barcode { + constructor(data, options){ + super(data, options); + } + + valid(){ + return /^[0-9A-Z\-. $/+%]+$/.test(this.data); + } + + encode(){ + const symbols = this.data + .split('') + .flatMap(c => MULTI_SYMBOLS[c] || c); + const encoded = symbols + .map(s => CODE93.getEncoding(s)) + .join(''); + + // Compute checksum symbols + const csumC = CODE93.checksum(symbols, 20); + const csumK = CODE93.checksum(symbols.concat(csumC), 15); + + return { + text: this.text, + data: + // Add the start bits + CODE93.getEncoding('\xff') + + // Add the encoded bits + encoded + + // Add the checksum + CODE93.getEncoding(csumC) + CODE93.getEncoding(csumK) + + // Add the stop bits + CODE93.getEncoding('\xff') + + // Add the termination bit + '1' + }; + } + + // Get the binary encoding of a symbol + static getEncoding(symbol) { + return BINARIES[CODE93.symbolValue(symbol)]; + } + + // Get the symbol for a symbol value + static getSymbol(symbolValue) { + return SYMBOLS[symbolValue]; + } + + // Get the symbol value of a symbol + static symbolValue(symbol) { + return SYMBOLS.indexOf(symbol); + } + + // Calculate a checksum symbol + static checksum(symbols, maxWeight) { + const csum = symbols + .slice() + .reverse() + .reduce((sum, symbol, idx) => { + const weight = (idx % maxWeight) + 1; + return sum + (CODE93.symbolValue(symbol) * weight); + }, 0); + + return CODE93.getSymbol(csum % 47); + } +} + +export default CODE93; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/CODE93FullASCII.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/CODE93FullASCII.js new file mode 100644 index 0000000..0223a9a --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/CODE93FullASCII.js @@ -0,0 +1,16 @@ +// Encoding documentation +// https://en.wikipedia.org/wiki/Code_93#Full_ASCII_Code_93 + +import CODE93 from './CODE93.js'; + +class CODE93FullASCII extends CODE93 { + constructor(data, options) { + super(data, options); + } + + valid() { + return /^[\x00-\x7f]+$/.test(this.data); + } +} + +export default CODE93FullASCII; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/constants.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/constants.js new file mode 100644 index 0000000..bf68354 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/constants.js @@ -0,0 +1,123 @@ +// The position in the array is the (checksum) value +export const SYMBOLS = [ + '0', '1', '2', '3', + '4', '5', '6', '7', + '8', '9', 'A', 'B', + 'C', 'D', 'E', 'F', + 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', + 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z', + '-', '.', ' ', '$', + '/', '+', '%', + // Only used for csum and multi-symbols character encodings + '($)', '(%)', '(/)', '(+)', + // Start/Stop + '\xff', +]; + +// Order matches SYMBOLS array +export const BINARIES = [ + '100010100', '101001000', '101000100', '101000010', + '100101000', '100100100', '100100010', '101010000', + '100010010', '100001010', '110101000', '110100100', + '110100010', '110010100', '110010010', '110001010', + '101101000', '101100100', '101100010', '100110100', + '100011010', '101011000', '101001100', '101000110', + '100101100', '100010110', '110110100', '110110010', + '110101100', '110100110', '110010110', '110011010', + '101101100', '101100110', '100110110', '100111010', + '100101110', '111010100', '111010010', '111001010', + '101101110', '101110110', '110101110', '100100110', + '111011010', '111010110', '100110010', '101011110', +]; + +// Multi-symbol characters (Full ASCII Code 93) +export const MULTI_SYMBOLS = { + '\x00': ['(%)', 'U'], + '\x01': ['($)', 'A'], + '\x02': ['($)', 'B'], + '\x03': ['($)', 'C'], + '\x04': ['($)', 'D'], + '\x05': ['($)', 'E'], + '\x06': ['($)', 'F'], + '\x07': ['($)', 'G'], + '\x08': ['($)', 'H'], + '\x09': ['($)', 'I'], + '\x0a': ['($)', 'J'], + '\x0b': ['($)', 'K'], + '\x0c': ['($)', 'L'], + '\x0d': ['($)', 'M'], + '\x0e': ['($)', 'N'], + '\x0f': ['($)', 'O'], + '\x10': ['($)', 'P'], + '\x11': ['($)', 'Q'], + '\x12': ['($)', 'R'], + '\x13': ['($)', 'S'], + '\x14': ['($)', 'T'], + '\x15': ['($)', 'U'], + '\x16': ['($)', 'V'], + '\x17': ['($)', 'W'], + '\x18': ['($)', 'X'], + '\x19': ['($)', 'Y'], + '\x1a': ['($)', 'Z'], + '\x1b': ['(%)', 'A'], + '\x1c': ['(%)', 'B'], + '\x1d': ['(%)', 'C'], + '\x1e': ['(%)', 'D'], + '\x1f': ['(%)', 'E'], + '!': ['(/)', 'A'], + '"': ['(/)', 'B'], + '#': ['(/)', 'C'], + '&': ['(/)', 'F'], + '\'': ['(/)', 'G'], + '(': ['(/)', 'H'], + ')': ['(/)', 'I'], + '*': ['(/)', 'J'], + ',': ['(/)', 'L'], + ':': ['(/)', 'Z'], + ';': ['(%)', 'F'], + '<': ['(%)', 'G'], + '=': ['(%)', 'H'], + '>': ['(%)', 'I'], + '?': ['(%)', 'J'], + '@': ['(%)', 'V'], + '[': ['(%)', 'K'], + '\\': ['(%)', 'L'], + ']': ['(%)', 'M'], + '^': ['(%)', 'N'], + '_': ['(%)', 'O'], + '`': ['(%)', 'W'], + 'a': ['(+)', 'A'], + 'b': ['(+)', 'B'], + 'c': ['(+)', 'C'], + 'd': ['(+)', 'D'], + 'e': ['(+)', 'E'], + 'f': ['(+)', 'F'], + 'g': ['(+)', 'G'], + 'h': ['(+)', 'H'], + 'i': ['(+)', 'I'], + 'j': ['(+)', 'J'], + 'k': ['(+)', 'K'], + 'l': ['(+)', 'L'], + 'm': ['(+)', 'M'], + 'n': ['(+)', 'N'], + 'o': ['(+)', 'O'], + 'p': ['(+)', 'P'], + 'q': ['(+)', 'Q'], + 'r': ['(+)', 'R'], + 's': ['(+)', 'S'], + 't': ['(+)', 'T'], + 'u': ['(+)', 'U'], + 'v': ['(+)', 'V'], + 'w': ['(+)', 'W'], + 'x': ['(+)', 'X'], + 'y': ['(+)', 'Y'], + 'z': ['(+)', 'Z'], + '{': ['(%)', 'P'], + '|': ['(%)', 'Q'], + '}': ['(%)', 'R'], + '~': ['(%)', 'S'], + '\x7f': ['(%)', 'T'], +}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/index.js new file mode 100644 index 0000000..6a0b801 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/CODE93/index.js @@ -0,0 +1,4 @@ +import CODE93 from './CODE93.js'; +import CODE93FullASCII from './CODE93FullASCII.js'; + +export {CODE93, CODE93FullASCII}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN.js new file mode 100644 index 0000000..b6260cf --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN.js @@ -0,0 +1,72 @@ +import { SIDE_BIN, MIDDLE_BIN } from './constants'; +import encode from './encoder'; +import Barcode from '../Barcode'; + +// Base class for EAN8 & EAN13 +class EAN extends Barcode { + + constructor(data, options) { + super(data, options); + + // Make sure the font is not bigger than the space between the guard bars + this.fontSize = !options.flat && options.fontSize > options.width * 10 + ? options.width * 10 + : options.fontSize; + + // Make the guard bars go down half the way of the text + this.guardHeight = options.height + this.fontSize / 2 + options.textMargin; + } + + encode() { + return this.options.flat + ? this.encodeFlat() + : this.encodeGuarded(); + } + + leftText(from, to) { + return this.text.substr(from, to); + } + + leftEncode(data, structure) { + return encode(data, structure); + } + + rightText(from, to) { + return this.text.substr(from, to); + } + + rightEncode(data, structure) { + return encode(data, structure); + } + + encodeGuarded() { + const textOptions = { fontSize: this.fontSize }; + const guardOptions = { height: this.guardHeight }; + + return [ + { data: SIDE_BIN, options: guardOptions }, + { data: this.leftEncode(), text: this.leftText(), options: textOptions }, + { data: MIDDLE_BIN, options: guardOptions }, + { data: this.rightEncode(), text: this.rightText(), options: textOptions }, + { data: SIDE_BIN, options: guardOptions }, + ]; + } + + encodeFlat() { + const data = [ + SIDE_BIN, + this.leftEncode(), + MIDDLE_BIN, + this.rightEncode(), + SIDE_BIN + ]; + + return { + data: data.join(''), + text: this.text + }; + } + +} + +export default EAN; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN13.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN13.js new file mode 100644 index 0000000..dc82dd9 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN13.js @@ -0,0 +1,90 @@ +// Encoding documentation: +// https://en.wikipedia.org/wiki/International_Article_Number_(EAN)#Binary_encoding_of_data_digits_into_EAN-13_barcode + +import { EAN13_STRUCTURE } from './constants'; +import EAN from './EAN'; + +// Calculate the checksum digit +// https://en.wikipedia.org/wiki/International_Article_Number_(EAN)#Calculation_of_checksum_digit +const checksum = (number) => { + const res = number + .substr(0, 12) + .split('') + .map((n) => +n) + .reduce((sum, a, idx) => ( + idx % 2 ? sum + a * 3 : sum + a + ), 0); + + return (10 - (res % 10)) % 10; +}; + +class EAN13 extends EAN { + + constructor(data, options) { + // Add checksum if it does not exist + if (data.search(/^[0-9]{12}$/) !== -1) { + data += checksum(data); + } + + super(data, options); + + // Adds a last character to the end of the barcode + this.lastChar = options.lastChar; + } + + valid() { + return ( + this.data.search(/^[0-9]{13}$/) !== -1 && + +this.data[12] === checksum(this.data) + ); + } + + leftText() { + return super.leftText(1, 6); + } + + leftEncode() { + const data = this.data.substr(1, 6); + const structure = EAN13_STRUCTURE[this.data[0]]; + return super.leftEncode(data, structure); + } + + rightText() { + return super.rightText(7, 6); + } + + rightEncode() { + const data = this.data.substr(7, 6); + return super.rightEncode(data, 'RRRRRR'); + } + + // The "standard" way of printing EAN13 barcodes with guard bars + encodeGuarded() { + const data = super.encodeGuarded(); + + // Extend data with left digit & last character + if (this.options.displayValue) { + data.unshift({ + data: '000000000000', + text: this.text.substr(0, 1), + options: { textAlign: 'left', fontSize: this.fontSize } + }); + + if (this.options.lastChar) { + data.push({ + data: '00' + }); + data.push({ + data: '00000', + text: this.options.lastChar, + options: { fontSize: this.fontSize } + }); + } + } + + return data; + } + +} + +export default EAN13; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN2.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN2.js new file mode 100644 index 0000000..672ee8e --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN2.js @@ -0,0 +1,30 @@ +// Encoding documentation: +// https://en.wikipedia.org/wiki/EAN_2#Encoding + +import { EAN2_STRUCTURE } from './constants'; +import encode from './encoder'; +import Barcode from '../Barcode'; + +class EAN2 extends Barcode { + + constructor(data, options) { + super(data, options); + } + + valid() { + return this.data.search(/^[0-9]{2}$/) !== -1; + } + + encode(){ + // Choose the structure based on the number mod 4 + const structure = EAN2_STRUCTURE[parseInt(this.data) % 4]; + return { + // Start bits + Encode the two digits with 01 in between + data: '1011' + encode(this.data, structure, '01'), + text: this.text + }; + } + +} + +export default EAN2; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN5.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN5.js new file mode 100644 index 0000000..79b89e5 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN5.js @@ -0,0 +1,40 @@ +// Encoding documentation: +// https://en.wikipedia.org/wiki/EAN_5#Encoding + +import { EAN5_STRUCTURE } from './constants'; +import encode from './encoder'; +import Barcode from '../Barcode'; + +const checksum = (data) => { + const result = data + .split('') + .map(n => +n) + .reduce((sum, a, idx) => { + return idx % 2 + ? sum + a * 9 + : sum + a * 3; + }, 0); + return result % 10; +}; + +class EAN5 extends Barcode { + + constructor(data, options) { + super(data, options); + } + + valid() { + return this.data.search(/^[0-9]{5}$/) !== -1; + } + + encode() { + const structure = EAN5_STRUCTURE[checksum(this.data)]; + return { + data: '1011' + encode(this.data, structure, '01'), + text: this.text + }; + } + +} + +export default EAN5; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN8.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN8.js new file mode 100644 index 0000000..adf608c --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/EAN8.js @@ -0,0 +1,57 @@ +// Encoding documentation: +// http://www.barcodeisland.com/ean8.phtml + +import EAN from './EAN'; + +// Calculate the checksum digit +const checksum = (number) => { + const res = number + .substr(0, 7) + .split('') + .map((n) => +n) + .reduce((sum, a, idx) => ( + idx % 2 ? sum + a : sum + a * 3 + ), 0); + + return (10 - (res % 10)) % 10; +}; + +class EAN8 extends EAN { + + constructor(data, options) { + // Add checksum if it does not exist + if (data.search(/^[0-9]{7}$/) !== -1) { + data += checksum(data); + } + + super(data, options); + } + + valid() { + return ( + this.data.search(/^[0-9]{8}$/) !== -1 && + +this.data[7] === checksum(this.data) + ); + } + + leftText() { + return super.leftText(0, 4); + } + + leftEncode() { + const data = this.data.substr(0, 4); + return super.leftEncode(data, 'LLLL'); + } + + rightText() { + return super.rightText(4, 4); + } + + rightEncode() { + const data = this.data.substr(4, 4); + return super.rightEncode(data, 'RRRR'); + } + +} + +export default EAN8; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/UPC.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/UPC.js new file mode 100644 index 0000000..8e36bcb --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/UPC.js @@ -0,0 +1,132 @@ +// Encoding documentation: +// https://en.wikipedia.org/wiki/Universal_Product_Code#Encoding + +import encode from './encoder'; +import Barcode from "../Barcode.js"; + +class UPC extends Barcode{ + constructor(data, options){ + // Add checksum if it does not exist + if(data.search(/^[0-9]{11}$/) !== -1){ + data += checksum(data); + } + + super(data, options); + + this.displayValue = options.displayValue; + + // Make sure the font is not bigger than the space between the guard bars + if(options.fontSize > options.width * 10){ + this.fontSize = options.width * 10; + } + else{ + this.fontSize = options.fontSize; + } + + // Make the guard bars go down half the way of the text + this.guardHeight = options.height + this.fontSize / 2 + options.textMargin; + } + + valid(){ + return this.data.search(/^[0-9]{12}$/) !== -1 && + this.data[11] == checksum(this.data); + } + + encode(){ + if(this.options.flat){ + return this.flatEncoding(); + } + else{ + return this.guardedEncoding(); + } + } + + flatEncoding(){ + var result = ""; + + result += "101"; + result += encode(this.data.substr(0, 6), "LLLLLL"); + result += "01010"; + result += encode(this.data.substr(6, 6), "RRRRRR"); + result += "101"; + + return { + data: result, + text: this.text + }; + } + + guardedEncoding(){ + var result = []; + + // Add the first digit + if(this.displayValue){ + result.push({ + data: "00000000", + text: this.text.substr(0, 1), + options: {textAlign: "left", fontSize: this.fontSize} + }); + } + + // Add the guard bars + result.push({ + data: "101" + encode(this.data[0], "L"), + options: {height: this.guardHeight} + }); + + // Add the left side + result.push({ + data: encode(this.data.substr(1, 5), "LLLLL"), + text: this.text.substr(1, 5), + options: {fontSize: this.fontSize} + }); + + // Add the middle bits + result.push({ + data: "01010", + options: {height: this.guardHeight} + }); + + // Add the right side + result.push({ + data: encode(this.data.substr(6, 5), "RRRRR"), + text: this.text.substr(6, 5), + options: {fontSize: this.fontSize} + }); + + // Add the end bits + result.push({ + data: encode(this.data[11], "R") + "101", + options: {height: this.guardHeight} + }); + + // Add the last digit + if(this.displayValue){ + result.push({ + data: "00000000", + text: this.text.substr(11, 1), + options: {textAlign: "right", fontSize: this.fontSize} + }); + } + + return result; + } +} + +// Calulate the checksum digit +// https://en.wikipedia.org/wiki/International_Article_Number_(EAN)#Calculation_of_checksum_digit +export function checksum(number){ + var result = 0; + + var i; + for(i = 1; i < 11; i += 2){ + result += parseInt(number[i]); + } + for(i = 0; i < 11; i += 2){ + result += parseInt(number[i]) * 3; + } + + return (10 - (result % 10)) % 10; +} + +export default UPC; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/UPCE.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/UPCE.js new file mode 100644 index 0000000..3b9b360 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/UPCE.js @@ -0,0 +1,177 @@ +// Encoding documentation: +// https://en.wikipedia.org/wiki/Universal_Product_Code#Encoding +// +// UPC-E documentation: +// https://en.wikipedia.org/wiki/Universal_Product_Code#UPC-E + +import encode from './encoder'; +import Barcode from "../Barcode.js"; +import { checksum } from './UPC.js'; + +const EXPANSIONS = [ + "XX00000XXX", + "XX10000XXX", + "XX20000XXX", + "XXX00000XX", + "XXXX00000X", + "XXXXX00005", + "XXXXX00006", + "XXXXX00007", + "XXXXX00008", + "XXXXX00009" +]; + +const PARITIES = [ + ["EEEOOO", "OOOEEE"], + ["EEOEOO", "OOEOEE"], + ["EEOOEO", "OOEEOE"], + ["EEOOOE", "OOEEEO"], + ["EOEEOO", "OEOOEE"], + ["EOOEEO", "OEEOOE"], + ["EOOOEE", "OEEEOO"], + ["EOEOEO", "OEOEOE"], + ["EOEOOE", "OEOEEO"], + ["EOOEOE", "OEEOEO"] +]; + +class UPCE extends Barcode{ + constructor(data, options){ + // Code may be 6 or 8 digits; + // A 7 digit code is ambiguous as to whether the extra digit + // is a UPC-A check or number system digit. + super(data, options); + this.isValid = false; + if(data.search(/^[0-9]{6}$/) !== -1){ + this.middleDigits = data; + this.upcA = expandToUPCA(data, "0"); + this.text = options.text || + `${this.upcA[0]}${data}${this.upcA[this.upcA.length - 1]}`; + this.isValid = true; + } + else if(data.search(/^[01][0-9]{7}$/) !== -1){ + this.middleDigits = data.substring(1, data.length - 1); + this.upcA = expandToUPCA(this.middleDigits, data[0]); + + if(this.upcA[this.upcA.length - 1] === data[data.length - 1]){ + this.isValid = true; + } + else{ + // checksum mismatch + return; + } + } + else{ + return; + } + + this.displayValue = options.displayValue; + + // Make sure the font is not bigger than the space between the guard bars + if(options.fontSize > options.width * 10){ + this.fontSize = options.width * 10; + } + else{ + this.fontSize = options.fontSize; + } + + // Make the guard bars go down half the way of the text + this.guardHeight = options.height + this.fontSize / 2 + options.textMargin; + } + + valid(){ + return this.isValid; + } + + encode(){ + if(this.options.flat){ + return this.flatEncoding(); + } + else{ + return this.guardedEncoding(); + } + } + + flatEncoding(){ + var result = ""; + + result += "101"; + result += this.encodeMiddleDigits(); + result += "010101"; + + return { + data: result, + text: this.text + }; + } + + guardedEncoding(){ + var result = []; + + // Add the UPC-A number system digit beneath the quiet zone + if(this.displayValue){ + result.push({ + data: "00000000", + text: this.text[0], + options: {textAlign: "left", fontSize: this.fontSize} + }); + } + + // Add the guard bars + result.push({ + data: "101", + options: {height: this.guardHeight} + }); + + // Add the 6 UPC-E digits + result.push({ + data: this.encodeMiddleDigits(), + text: this.text.substring(1, 7), + options: {fontSize: this.fontSize} + }); + + // Add the end bits + result.push({ + data: "010101", + options: {height: this.guardHeight} + }); + + // Add the UPC-A check digit beneath the quiet zone + if(this.displayValue){ + result.push({ + data: "00000000", + text: this.text[7], + options: {textAlign: "right", fontSize: this.fontSize} + }); + } + + return result; + } + + encodeMiddleDigits() { + const numberSystem = this.upcA[0]; + const checkDigit = this.upcA[this.upcA.length - 1]; + const parity = PARITIES[parseInt(checkDigit)][parseInt(numberSystem)]; + return encode(this.middleDigits, parity); + } +} + +function expandToUPCA(middleDigits, numberSystem) { + const lastUpcE = parseInt(middleDigits[middleDigits.length - 1]); + const expansion = EXPANSIONS[lastUpcE]; + + let result = ""; + let digitIndex = 0; + for(let i = 0; i < expansion.length; i++) { + let c = expansion[i]; + if (c === 'X') { + result += middleDigits[digitIndex++]; + } else { + result += c; + } + } + + result = `${numberSystem}${result}`; + return `${result}${checksum(result)}`; +} + +export default UPCE; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/constants.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/constants.js new file mode 100644 index 0000000..abbe38f --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/constants.js @@ -0,0 +1,41 @@ +// Standard start end and middle bits +export const SIDE_BIN = '101'; +export const MIDDLE_BIN = '01010'; + +export const BINARIES = { + 'L': [ // The L (left) type of encoding + '0001101', '0011001', '0010011', '0111101', '0100011', + '0110001', '0101111', '0111011', '0110111', '0001011' + ], + 'G': [ // The G type of encoding + '0100111', '0110011', '0011011', '0100001', '0011101', + '0111001', '0000101', '0010001', '0001001', '0010111' + ], + 'R': [ // The R (right) type of encoding + '1110010', '1100110', '1101100', '1000010', '1011100', + '1001110', '1010000', '1000100', '1001000', '1110100' + ], + 'O': [ // The O (odd) encoding for UPC-E + '0001101', '0011001', '0010011', '0111101', '0100011', + '0110001', '0101111', '0111011', '0110111', '0001011' + ], + 'E': [ // The E (even) encoding for UPC-E + '0100111', '0110011', '0011011', '0100001', '0011101', + '0111001', '0000101', '0010001', '0001001', '0010111' + ] +}; + +// Define the EAN-2 structure +export const EAN2_STRUCTURE = ['LL', 'LG', 'GL', 'GG']; + +// Define the EAN-5 structure +export const EAN5_STRUCTURE = [ + 'GGLLL', 'GLGLL', 'GLLGL', 'GLLLG', 'LGGLL', + 'LLGGL', 'LLLGG', 'LGLGL', 'LGLLG', 'LLGLG' +]; + +// Define the EAN-13 structure +export const EAN13_STRUCTURE = [ + 'LLLLLL', 'LLGLGG', 'LLGGLG', 'LLGGGL', 'LGLLGG', + 'LGGLLG', 'LGGGLL', 'LGLGLG', 'LGLGGL', 'LGGLGL' +]; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/encoder.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/encoder.js new file mode 100644 index 0000000..e66a312 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/encoder.js @@ -0,0 +1,20 @@ +import { BINARIES } from './constants'; + +// Encode data string +const encode = (data, structure, separator) => { + let encoded = data + .split('') + .map((val, idx) => BINARIES[structure[idx]]) + .map((val, idx) => val ? val[data[idx]] : ''); + + if (separator) { + const last = data.length - 1; + encoded = encoded.map((val, idx) => ( + idx < last ? val + separator : val + )); + } + + return encoded.join(''); +}; + +export default encode; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/index.js new file mode 100644 index 0000000..34cad19 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/EAN_UPC/index.js @@ -0,0 +1,8 @@ +import EAN13 from './EAN13.js'; +import EAN8 from './EAN8.js'; +import EAN5 from './EAN5.js'; +import EAN2 from './EAN2.js'; +import UPC from './UPC.js'; +import UPCE from './UPCE.js'; + +export {EAN13, EAN8, EAN5, EAN2, UPC, UPCE}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/GenericBarcode/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/GenericBarcode/index.js new file mode 100644 index 0000000..c9c1f0e --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/GenericBarcode/index.js @@ -0,0 +1,22 @@ +import Barcode from "../Barcode.js"; + +class GenericBarcode extends Barcode{ + constructor(data, options){ + super(data, options); // Sets this.data and this.text + } + + // Return the corresponding binary numbers for the data provided + encode(){ + return { + data: "10101010101010101010101010101010101010101", + text: this.text + }; + } + + // Resturn true/false if the string provided is valid for this encoder + valid(){ + return true; + } +} + +export {GenericBarcode}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/ITF.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/ITF.js new file mode 100644 index 0000000..14a7cae --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/ITF.js @@ -0,0 +1,37 @@ +import { START_BIN, END_BIN, BINARIES } from './constants'; +import Barcode from '../Barcode'; + +class ITF extends Barcode { + + valid() { + return this.data.search(/^([0-9]{2})+$/) !== -1; + } + + encode() { + // Calculate all the digit pairs + const encoded = this.data + .match(/.{2}/g) + .map(pair => this.encodePair(pair)) + .join(''); + + return { + data: START_BIN + encoded + END_BIN, + text: this.text + }; + } + + // Calculate the data of a number pair + encodePair(pair) { + const second = BINARIES[pair[1]]; + + return BINARIES[pair[0]] + .split('') + .map((first, idx) => ( + (first === '1' ? '111' : '1') + + (second[idx] === '1' ? '000' : '0') + )) + .join(''); + } +} + +export default ITF; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/ITF14.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/ITF14.js new file mode 100644 index 0000000..3ff25ff --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/ITF14.js @@ -0,0 +1,33 @@ +import ITF from './ITF'; + +// Calculate the checksum digit +const checksum = (data) => { + const res = data + .substr(0, 13) + .split('') + .map(num => parseInt(num, 10)) + .reduce((sum, n, idx) => sum + (n * (3 - (idx % 2) * 2)), 0); + + return Math.ceil(res / 10) * 10 - res; +}; + +class ITF14 extends ITF { + + constructor(data, options) { + // Add checksum if it does not exist + if (data.search(/^[0-9]{13}$/) !== -1) { + data += checksum(data); + } + super(data, options); + } + + valid() { + return ( + this.data.search(/^[0-9]{14}$/) !== -1 && + +this.data[13] === checksum(this.data) + ); + } + +} + +export default ITF14; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/constants.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/constants.js new file mode 100644 index 0000000..2a941b0 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/constants.js @@ -0,0 +1,7 @@ +export const START_BIN = '1010'; +export const END_BIN = '11101'; + +export const BINARIES = [ + '00110', '10001', '01001', '11000', '00101', + '10100', '01100', '00011', '10010', '01010', +]; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/index.js new file mode 100644 index 0000000..c832dc2 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/ITF/index.js @@ -0,0 +1,4 @@ +import ITF from './ITF'; +import ITF14 from './ITF14'; + +export { ITF, ITF14 }; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI.js new file mode 100644 index 0000000..ba16909 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI.js @@ -0,0 +1,48 @@ +// Encoding documentation +// https://en.wikipedia.org/wiki/MSI_Barcode#Character_set_and_binary_lookup + +import Barcode from "../Barcode.js"; + +class MSI extends Barcode{ + constructor(data, options){ + super(data, options); + } + + encode(){ + // Start bits + var ret = "110"; + + for(var i = 0; i < this.data.length; i++){ + // Convert the character to binary (always 4 binary digits) + var digit = parseInt(this.data[i]); + var bin = digit.toString(2); + bin = addZeroes(bin, 4 - bin.length); + + // Add 100 for every zero and 110 for every 1 + for(var b = 0; b < bin.length; b++){ + ret += bin[b] == "0" ? "100" : "110"; + } + } + + // End bits + ret += "1001"; + + return { + data: ret, + text: this.text + }; + } + + valid(){ + return this.data.search(/^[0-9]+$/) !== -1; + } +} + +function addZeroes(number, n){ + for(var i = 0; i < n; i++){ + number = "0" + number; + } + return number; +} + +export default MSI; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI10.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI10.js new file mode 100644 index 0000000..a89bae8 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI10.js @@ -0,0 +1,10 @@ +import MSI from './MSI.js'; +import {mod10} from './checksums.js'; + +class MSI10 extends MSI{ + constructor(data, options){ + super(data + mod10(data), options); + } +} + +export default MSI10; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI1010.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI1010.js new file mode 100644 index 0000000..0337ec3 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI1010.js @@ -0,0 +1,12 @@ +import MSI from './MSI.js'; +import {mod10} from './checksums.js'; + +class MSI1010 extends MSI{ + constructor(data, options){ + data += mod10(data); + data += mod10(data); + super(data, options); + } +} + +export default MSI1010; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI11.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI11.js new file mode 100644 index 0000000..9038061 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI11.js @@ -0,0 +1,10 @@ +import MSI from './MSI.js'; +import {mod11} from './checksums.js'; + +class MSI11 extends MSI{ + constructor(data, options){ + super(data + mod11(data), options); + } +} + +export default MSI11; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI1110.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI1110.js new file mode 100644 index 0000000..6dac155 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/MSI1110.js @@ -0,0 +1,12 @@ +import MSI from './MSI.js'; +import {mod10, mod11} from './checksums.js'; + +class MSI1110 extends MSI{ + constructor(data, options){ + data += mod11(data); + data += mod10(data); + super(data, options); + } +} + +export default MSI1110; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/checksums.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/checksums.js new file mode 100644 index 0000000..8a02721 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/checksums.js @@ -0,0 +1,23 @@ +export function mod10(number){ + var sum = 0; + for(var i = 0; i < number.length; i++){ + var n = parseInt(number[i]); + if((i + number.length) % 2 === 0){ + sum += n; + } + else{ + sum += (n * 2) % 10 + Math.floor((n * 2) / 10); + } + } + return (10 - (sum % 10)) % 10; +} + +export function mod11(number){ + var sum = 0; + var weights = [2, 3, 4, 5, 6, 7]; + for(var i = 0; i < number.length; i++){ + var n = parseInt(number[number.length - 1 - i]); + sum += weights[i % weights.length] * n; + } + return (11 - (sum % 11)) % 11; +} diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/index.js new file mode 100644 index 0000000..2c20baf --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/MSI/index.js @@ -0,0 +1,7 @@ +import MSI from './MSI.js'; +import MSI10 from './MSI10.js'; +import MSI11 from './MSI11.js'; +import MSI1010 from './MSI1010.js'; +import MSI1110 from './MSI1110.js'; + +export {MSI, MSI10, MSI11, MSI1010, MSI1110}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/codabar/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/codabar/index.js new file mode 100644 index 0000000..ee2f803 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/codabar/index.js @@ -0,0 +1,63 @@ +// Encoding specification: +// http://www.barcodeisland.com/codabar.phtml + +import Barcode from "../Barcode.js"; + +class codabar extends Barcode{ + constructor(data, options){ + if (data.search(/^[0-9\-\$\:\.\+\/]+$/) === 0) { + data = "A" + data + "A"; + } + + super(data.toUpperCase(), options); + + this.text = this.options.text || this.text.replace(/[A-D]/g, ''); + } + + valid(){ + return this.data.search(/^[A-D][0-9\-\$\:\.\+\/]+[A-D]$/) !== -1; + } + + encode(){ + var result = []; + var encodings = this.getEncodings(); + for(var i = 0; i < this.data.length; i++){ + result.push(encodings[this.data.charAt(i)]); + // for all characters except the last, append a narrow-space ("0") + if (i !== this.data.length - 1) { + result.push("0"); + } + } + return { + text: this.text, + data: result.join('') + }; + } + + getEncodings(){ + return { + "0": "101010011", + "1": "101011001", + "2": "101001011", + "3": "110010101", + "4": "101101001", + "5": "110101001", + "6": "100101011", + "7": "100101101", + "8": "100110101", + "9": "110100101", + "-": "101001101", + "$": "101100101", + ":": "1101011011", + "/": "1101101011", + ".": "1101101101", + "+": "1011011011", + "A": "1011001001", + "B": "1001001011", + "C": "1010010011", + "D": "1010011001" + }; + } +} + +export {codabar}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/index.js new file mode 100644 index 0000000..48ce395 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/index.js @@ -0,0 +1,22 @@ +import {CODE39} from './CODE39/'; +import {CODE128, CODE128A, CODE128B, CODE128C} from './CODE128/'; +import {EAN13, EAN8, EAN5, EAN2, UPC, UPCE} from './EAN_UPC/'; +import {ITF, ITF14} from './ITF/'; +import {MSI, MSI10, MSI11, MSI1010, MSI1110} from './MSI/'; +import {pharmacode} from './pharmacode/'; +import {codabar} from './codabar'; +import {CODE93, CODE93FullASCII} from './CODE93/'; +import {GenericBarcode} from './GenericBarcode/'; + +export default { + CODE39, + CODE128, CODE128A, CODE128B, CODE128C, + EAN13, EAN8, EAN5, EAN2, UPC, UPCE, + ITF14, + ITF, + MSI, MSI10, MSI11, MSI1010, MSI1110, + pharmacode, + codabar, + CODE93, CODE93FullASCII, + GenericBarcode +}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/pharmacode/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/pharmacode/index.js new file mode 100644 index 0000000..2cde723 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/barcodes/pharmacode/index.js @@ -0,0 +1,43 @@ +// Encoding documentation +// http://www.gomaro.ch/ftproot/Laetus_PHARMA-CODE.pdf + +import Barcode from "../Barcode.js"; + +class pharmacode extends Barcode{ + constructor(data, options){ + super(data, options); + this.number = parseInt(data, 10); + } + + encode(){ + var z = this.number; + var result = ""; + + // http://i.imgur.com/RMm4UDJ.png + // (source: http://www.gomaro.ch/ftproot/Laetus_PHARMA-CODE.pdf, page: 34) + while(!isNaN(z) && z != 0){ + if(z % 2 === 0){ // Even + result = "11100" + result; + z = (z - 2) / 2; + } + else{ // Odd + result = "100" + result; + z = (z - 1) / 2; + } + } + + // Remove the two last zeroes + result = result.slice(0, -2); + + return { + data: result, + text: this.text + }; + } + + valid(){ + return this.number >= 3 && this.number <= 131070; + } +} + +export {pharmacode}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/exceptions/ErrorHandler.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/exceptions/ErrorHandler.js new file mode 100644 index 0000000..1a684fa --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/exceptions/ErrorHandler.js @@ -0,0 +1,39 @@ +/*eslint no-console: 0 */ + +class ErrorHandler{ + constructor(api){ + this.api = api; + } + + handleCatch(e){ + // If babel supported extending of Error in a correct way instanceof would be used here + if(e.name === "InvalidInputException"){ + if(this.api._options.valid !== this.api._defaults.valid){ + this.api._options.valid(false); + } + else{ + throw e.message; + } + } + else{ + throw e; + } + + this.api.render = function(){}; + } + + wrapBarcodeCall(func){ + try{ + var result = func(...arguments); + this.api._options.valid(true); + return result; + } + catch(e){ + this.handleCatch(e); + + return this.api; + } + } +} + +export default ErrorHandler; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/exceptions/exceptions.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/exceptions/exceptions.js new file mode 100644 index 0000000..4835435 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/exceptions/exceptions.js @@ -0,0 +1,29 @@ +class InvalidInputException extends Error{ + constructor(symbology, input) { + super(); + this.name = "InvalidInputException"; + + this.symbology = symbology; + this.input = input; + + this.message = '"' + this.input + '" is not a valid input for ' + this.symbology; + } +} + +class InvalidElementException extends Error{ + constructor() { + super(); + this.name = "InvalidElementException"; + this.message = "Not supported type to render on"; + } +} + +class NoElementException extends Error{ + constructor() { + super(); + this.name = "NoElementException"; + this.message = "No element to render on."; + } +} + +export {InvalidInputException, InvalidElementException, NoElementException}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/help/fixOptions.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/fixOptions.js new file mode 100644 index 0000000..0e1c082 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/fixOptions.js @@ -0,0 +1,11 @@ +export default fixOptions; + +function fixOptions(options){ + // Fix the margins + options.marginTop = options.marginTop || options.margin; + options.marginBottom = options.marginBottom || options.margin; + options.marginRight = options.marginRight || options.margin; + options.marginLeft = options.marginLeft || options.margin; + + return options; +} diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/help/getOptionsFromElement.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/getOptionsFromElement.js new file mode 100644 index 0000000..f24e187 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/getOptionsFromElement.js @@ -0,0 +1,28 @@ +import optionsFromStrings from "./optionsFromStrings.js"; +import defaults from "../options/defaults.js"; + +function getOptionsFromElement(element){ + var options = {}; + for(var property in defaults){ + if(defaults.hasOwnProperty(property)){ + // jsbarcode-* + if(element.hasAttribute("jsbarcode-" + property.toLowerCase())){ + options[property] = element.getAttribute("jsbarcode-" + property.toLowerCase()); + } + + // data-* + if(element.hasAttribute("data-" + property.toLowerCase())){ + options[property] = element.getAttribute("data-" + property.toLowerCase()); + } + } + } + + options["value"] = element.getAttribute("jsbarcode-value") || element.getAttribute("data-value"); + +// Since all atributes are string they need to be converted to integers + options = optionsFromStrings(options); + + return options; +} + +export default getOptionsFromElement; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/help/getRenderProperties.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/getRenderProperties.js new file mode 100644 index 0000000..3300cc0 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/getRenderProperties.js @@ -0,0 +1,103 @@ +/* global HTMLImageElement */ +/* global HTMLCanvasElement */ +/* global SVGElement */ + +import getOptionsFromElement from "./getOptionsFromElement.js"; +import renderers from "../renderers"; + +import {InvalidElementException} from "../exceptions/exceptions.js"; + +// Takes an element and returns an object with information about how +// it should be rendered +// This could also return an array with these objects +// { +// element: The element that the renderer should draw on +// renderer: The name of the renderer +// afterRender (optional): If something has to done after the renderer +// completed, calls afterRender (function) +// options (optional): Options that can be defined in the element +// } + +function getRenderProperties(element){ + // If the element is a string, query select call again + if(typeof element === "string"){ + return querySelectedRenderProperties(element); + } + // If element is array. Recursivly call with every object in the array + else if(Array.isArray(element)){ + var returnArray = []; + for(let i = 0; i < element.length; i++){ + returnArray.push(getRenderProperties(element[i])); + } + return returnArray; + } + // If element, render on canvas and set the uri as src + else if(typeof HTMLCanvasElement !== 'undefined' && element instanceof HTMLImageElement){ + return newCanvasRenderProperties(element); + } + // If SVG + else if( + (element && element.nodeName && element.nodeName.toLowerCase() === 'svg') || + (typeof SVGElement !== 'undefined' && element instanceof SVGElement) + ){ + return { + element: element, + options: getOptionsFromElement(element), + renderer: renderers.SVGRenderer + }; + } + // If canvas (in browser) + else if(typeof HTMLCanvasElement !== 'undefined' && element instanceof HTMLCanvasElement){ + return { + element: element, + options: getOptionsFromElement(element), + renderer: renderers.CanvasRenderer + }; + } + + // If canvas (in node) + else if(element && element.getContext){ + return { + element: element, + renderer: renderers.CanvasRenderer + }; + } + else if(element && typeof element === 'object' && !element.nodeName) { + return { + element: element, + renderer: renderers.ObjectRenderer + }; + } + else{ + throw new InvalidElementException(); + } +} + +function querySelectedRenderProperties(string){ + var selector = document.querySelectorAll(string); + if(selector.length === 0){ + return undefined; + } + else{ + let returnArray = []; + for(let i = 0; i < selector.length; i++){ + returnArray.push(getRenderProperties(selector[i])); + } + return returnArray; + } +} + + +function newCanvasRenderProperties(imgElement){ + var canvas = document.createElement('canvas'); + return { + element: canvas, + options: getOptionsFromElement(imgElement), + renderer: renderers.CanvasRenderer, + afterRender: function(){ + imgElement.setAttribute("src", canvas.toDataURL()); + } + }; +} + +export default getRenderProperties; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/help/linearizeEncodings.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/linearizeEncodings.js new file mode 100644 index 0000000..eb13a66 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/linearizeEncodings.js @@ -0,0 +1,22 @@ +export default linearizeEncodings; + +// Encodings can be nestled like [[1-1, 1-2], 2, [3-1, 3-2] +// Convert to [1-1, 1-2, 2, 3-1, 3-2] +function linearizeEncodings(encodings){ + var linearEncodings = []; + function nextLevel(encoded){ + if(Array.isArray(encoded)){ + for(let i = 0; i < encoded.length; i++){ + nextLevel(encoded[i]); + } + } + else{ + encoded.text = encoded.text || ""; + encoded.data = encoded.data || ""; + linearEncodings.push(encoded); + } + } + nextLevel(encodings); + + return linearEncodings; +} diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/help/merge.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/merge.js new file mode 100644 index 0000000..88eb19c --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/merge.js @@ -0,0 +1 @@ +export default (old, replaceObj) => ({ ...old, ...replaceObj }); diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/help/optionsFromStrings.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/optionsFromStrings.js new file mode 100644 index 0000000..a9adfda --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/help/optionsFromStrings.js @@ -0,0 +1,31 @@ +export default optionsFromStrings; + +// Convert string to integers/booleans where it should be +function optionsFromStrings(options){ + var intOptions = [ + "width", + "height", + "textMargin", + "fontSize", + "margin", + "marginTop", + "marginBottom", + "marginLeft", + "marginRight" + ]; + + for(var intOption in intOptions){ + if(intOptions.hasOwnProperty(intOption)){ + intOption = intOptions[intOption]; + if(typeof options[intOption] === "string"){ + options[intOption] = parseInt(options[intOption], 10); + } + } + } + + if(typeof options["displayValue"] === "string"){ + options["displayValue"] = (options["displayValue"] != "false"); + } + + return options; +} diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/options/defaults.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/options/defaults.js new file mode 100644 index 0000000..f2362ff --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/options/defaults.js @@ -0,0 +1,23 @@ +var defaults = { + width: 2, + height: 100, + format: "auto", + displayValue: true, + fontOptions: "", + font: "monospace", + text: undefined, + textAlign: "center", + textPosition: "bottom", + textMargin: 2, + fontSize: 20, + background: "#ffffff", + lineColor: "#000000", + margin: 10, + marginTop: undefined, + marginBottom: undefined, + marginLeft: undefined, + marginRight: undefined, + valid: function(){} +}; + +export default defaults; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/canvas.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/canvas.js new file mode 100644 index 0000000..bba16d4 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/canvas.js @@ -0,0 +1,137 @@ +import merge from "../help/merge.js"; +import {calculateEncodingAttributes, getTotalWidthOfEncodings, getMaximumHeightOfEncodings} from "./shared.js"; + +class CanvasRenderer{ + constructor(canvas, encodings, options){ + this.canvas = canvas; + this.encodings = encodings; + this.options = options; + } + + render(){ + // Abort if the browser does not support HTML5 canvas + if (!this.canvas.getContext) { + throw new Error('The browser does not support canvas.'); + } + + this.prepareCanvas(); + for(let i = 0; i < this.encodings.length; i++){ + var encodingOptions = merge(this.options, this.encodings[i].options); + + this.drawCanvasBarcode(encodingOptions, this.encodings[i]); + this.drawCanvasText(encodingOptions, this.encodings[i]); + + this.moveCanvasDrawing(this.encodings[i]); + } + + this.restoreCanvas(); + } + + prepareCanvas(){ + // Get the canvas context + var ctx = this.canvas.getContext("2d"); + + ctx.save(); + + calculateEncodingAttributes(this.encodings, this.options, ctx); + var totalWidth = getTotalWidthOfEncodings(this.encodings); + var maxHeight = getMaximumHeightOfEncodings(this.encodings); + + this.canvas.width = totalWidth + this.options.marginLeft + this.options.marginRight; + + this.canvas.height = maxHeight; + + // Paint the canvas + ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); + if(this.options.background){ + ctx.fillStyle = this.options.background; + ctx.fillRect(0, 0, this.canvas.width, this.canvas.height); + } + + ctx.translate(this.options.marginLeft, 0); + } + + drawCanvasBarcode(options, encoding){ + // Get the canvas context + var ctx = this.canvas.getContext("2d"); + + var binary = encoding.data; + + // Creates the barcode out of the encoded binary + var yFrom; + if(options.textPosition == "top"){ + yFrom = options.marginTop + options.fontSize + options.textMargin; + } + else{ + yFrom = options.marginTop; + } + + ctx.fillStyle = options.lineColor; + + for(var b = 0; b < binary.length; b++){ + var x = b * options.width + encoding.barcodePadding; + + if(binary[b] === "1"){ + ctx.fillRect(x, yFrom, options.width, options.height); + } + else if(binary[b]){ + ctx.fillRect(x, yFrom, options.width, options.height * binary[b]); + } + } + } + + drawCanvasText(options, encoding){ + // Get the canvas context + var ctx = this.canvas.getContext("2d"); + + var font = options.fontOptions + " " + options.fontSize + "px " + options.font; + + // Draw the text if displayValue is set + if(options.displayValue){ + var x, y; + + if(options.textPosition == "top"){ + y = options.marginTop + options.fontSize - options.textMargin; + } + else{ + y = options.height + options.textMargin + options.marginTop + options.fontSize; + } + + ctx.font = font; + + // Draw the text in the correct X depending on the textAlign option + if(options.textAlign == "left" || encoding.barcodePadding > 0){ + x = 0; + ctx.textAlign = 'left'; + } + else if(options.textAlign == "right"){ + x = encoding.width - 1; + ctx.textAlign = 'right'; + } + // In all other cases, center the text + else{ + x = encoding.width / 2; + ctx.textAlign = 'center'; + } + + ctx.fillText(encoding.text, x, y); + } + } + + + + moveCanvasDrawing(encoding){ + var ctx = this.canvas.getContext("2d"); + + ctx.translate(encoding.width, 0); + } + + restoreCanvas(){ + // Get the canvas context + var ctx = this.canvas.getContext("2d"); + + ctx.restore(); + } +} + +export default CanvasRenderer; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/index.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/index.js new file mode 100644 index 0000000..3797e01 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/index.js @@ -0,0 +1,5 @@ +import CanvasRenderer from './canvas.js'; +import SVGRenderer from './svg.js'; +import ObjectRenderer from './object.js'; + +export default {CanvasRenderer, SVGRenderer, ObjectRenderer}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/object.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/object.js new file mode 100644 index 0000000..fd0b7ca --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/object.js @@ -0,0 +1,14 @@ +class ObjectRenderer { + constructor(object, encodings, options) { + this.object = object; + this.encodings = encodings; + this.options = options; + } + + render() { + this.object.encodings = this.encodings; + } +} + + +export default ObjectRenderer; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/shared.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/shared.js new file mode 100644 index 0000000..243126e --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/shared.js @@ -0,0 +1,94 @@ +import merge from "../help/merge.js"; + +function getEncodingHeight(encoding, options){ + return options.height + + ((options.displayValue && encoding.text.length > 0) ? options.fontSize + options.textMargin : 0) + + options.marginTop + + options.marginBottom; +} + +function getBarcodePadding(textWidth, barcodeWidth, options){ + if(options.displayValue && barcodeWidth < textWidth){ + if(options.textAlign == "center"){ + return Math.floor((textWidth - barcodeWidth) / 2); + } + else if(options.textAlign == "left"){ + return 0; + } + else if(options.textAlign == "right"){ + return Math.floor(textWidth - barcodeWidth); + } + } + return 0; +} + +function calculateEncodingAttributes(encodings, barcodeOptions, context){ + for(let i = 0; i < encodings.length; i++){ + var encoding = encodings[i]; + var options = merge(barcodeOptions, encoding.options); + + // Calculate the width of the encoding + var textWidth; + if(options.displayValue){ + textWidth = messureText(encoding.text, options, context); + } + else{ + textWidth = 0; + } + + var barcodeWidth = encoding.data.length * options.width; + encoding.width = Math.ceil(Math.max(textWidth, barcodeWidth)); + + encoding.height = getEncodingHeight(encoding, options); + + encoding.barcodePadding = getBarcodePadding(textWidth, barcodeWidth, options); + } +} + +function getTotalWidthOfEncodings(encodings){ + var totalWidth = 0; + for(let i = 0; i < encodings.length; i++){ + totalWidth += encodings[i].width; + } + return totalWidth; +} + +function getMaximumHeightOfEncodings(encodings){ + var maxHeight = 0; + for(let i = 0; i < encodings.length; i++){ + if(encodings[i].height > maxHeight){ + maxHeight = encodings[i].height; + } + } + return maxHeight; +} + +function messureText(string, options, context){ + var ctx; + + if(context){ + ctx = context; + } + else if(typeof document !== "undefined"){ + ctx = document.createElement("canvas").getContext("2d"); + } + else{ + // If the text cannot be messured we will return 0. + // This will make some barcode with big text render incorrectly + return 0; + } + ctx.font = options.fontOptions + " " + options.fontSize + "px " + options.font; + + // Calculate the width of the encoding + var measureTextResult = ctx.measureText(string); + if (!measureTextResult) { + // Some implementations don't implement measureText and return undefined. + // If the text cannot be measured we will return 0. + // This will make some barcode with big text render incorrectly + return 0; + } + var size = measureTextResult.width; + return size; +} + +export {getMaximumHeightOfEncodings, getEncodingHeight, getBarcodePadding, calculateEncodingAttributes, getTotalWidthOfEncodings}; diff --git a/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/svg.js b/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/svg.js new file mode 100644 index 0000000..33d3b0b --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/JsBarcode/renderers/svg.js @@ -0,0 +1,171 @@ +import merge from "../help/merge.js"; +import {calculateEncodingAttributes, getTotalWidthOfEncodings, getMaximumHeightOfEncodings} from "./shared.js"; + +var svgns = "http://www.w3.org/2000/svg"; + +class SVGRenderer{ + constructor(svg, encodings, options){ + this.svg = svg; + this.encodings = encodings; + this.options = options; + this.document = options.xmlDocument || document; + } + + render(){ + var currentX = this.options.marginLeft; + + this.prepareSVG(); + for(let i = 0; i < this.encodings.length; i++){ + var encoding = this.encodings[i]; + var encodingOptions = merge(this.options, encoding.options); + + var group = this.createGroup(currentX, encodingOptions.marginTop, this.svg); + + this.setGroupOptions(group, encodingOptions); + + this.drawSvgBarcode(group, encodingOptions, encoding); + this.drawSVGText(group, encodingOptions, encoding); + + currentX += encoding.width; + } + } + + prepareSVG(){ + // Clear the SVG + while (this.svg.firstChild) { + this.svg.removeChild(this.svg.firstChild); + } + + calculateEncodingAttributes(this.encodings, this.options); + var totalWidth = getTotalWidthOfEncodings(this.encodings); + var maxHeight = getMaximumHeightOfEncodings(this.encodings); + + var width = totalWidth + this.options.marginLeft + this.options.marginRight; + this.setSvgAttributes(width, maxHeight); + + if(this.options.background){ + this.drawRect(0, 0, width, maxHeight, this.svg).setAttribute( + "style", "fill:" + this.options.background + ";" + ); + } + } + + drawSvgBarcode(parent, options, encoding){ + var binary = encoding.data; + + // Creates the barcode out of the encoded binary + var yFrom; + if(options.textPosition == "top"){ + yFrom = options.fontSize + options.textMargin; + } + else{ + yFrom = 0; + } + + var barWidth = 0; + var x = 0; + for(var b = 0; b < binary.length; b++){ + x = b * options.width + encoding.barcodePadding; + + if(binary[b] === "1"){ + barWidth++; + } + else if(barWidth > 0){ + this.drawRect(x - options.width * barWidth, yFrom, options.width * barWidth, options.height, parent); + barWidth = 0; + } + } + + // Last draw is needed since the barcode ends with 1 + if(barWidth > 0){ + this.drawRect(x - options.width * (barWidth - 1), yFrom, options.width * barWidth, options.height, parent); + } + } + + drawSVGText(parent, options, encoding){ + var textElem = this.document.createElementNS(svgns, 'text'); + + // Draw the text if displayValue is set + if(options.displayValue){ + var x, y; + + textElem.setAttribute("style", + "font:" + options.fontOptions + " " + options.fontSize + "px " + options.font + ); + + if(options.textPosition == "top"){ + y = options.fontSize - options.textMargin; + } + else{ + y = options.height + options.textMargin + options.fontSize; + } + + // Draw the text in the correct X depending on the textAlign option + if(options.textAlign == "left" || encoding.barcodePadding > 0){ + x = 0; + textElem.setAttribute("text-anchor", "start"); + } + else if(options.textAlign == "right"){ + x = encoding.width - 1; + textElem.setAttribute("text-anchor", "end"); + } + // In all other cases, center the text + else{ + x = encoding.width / 2; + textElem.setAttribute("text-anchor", "middle"); + } + + textElem.setAttribute("x", x); + textElem.setAttribute("y", y); + + textElem.appendChild(this.document.createTextNode(encoding.text)); + + parent.appendChild(textElem); + } + } + + + setSvgAttributes(width, height){ + var svg = this.svg; + svg.setAttribute("width", width + "px"); + svg.setAttribute("height", height + "px"); + svg.setAttribute("x", "0px"); + svg.setAttribute("y", "0px"); + svg.setAttribute("viewBox", "0 0 " + width + " " + height); + + svg.setAttribute("xmlns", svgns); + svg.setAttribute("version", "1.1"); + + svg.setAttribute("style", "transform: translate(0,0)"); + } + + createGroup(x, y, parent){ + var group = this.document.createElementNS(svgns, 'g'); + group.setAttribute("transform", "translate(" + x + ", " + y + ")"); + + parent.appendChild(group); + + return group; + } + + setGroupOptions(group, options){ + group.setAttribute("style", + "fill:" + options.lineColor + ";" + ); + } + + drawRect(x, y, width, height, parent){ + var rect = this.document.createElementNS(svgns, 'rect'); + + rect.setAttribute("x", x); + rect.setAttribute("y", y); + rect.setAttribute("width", width); + rect.setAttribute("height", height); + + parent.appendChild(rect); + + return rect; + } +} + +export default SVGRenderer; diff --git a/uni_modules/uview-next/components/u-barcode/props.js b/uni_modules/uview-next/components/u-barcode/props.js new file mode 100644 index 0000000..b68cd45 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/props.js @@ -0,0 +1,74 @@ +export default { + props: { + // 条形码内容 + value: { + type: String, + default: () => uni.$u.props.barcode.value + }, + // 条形码类型 + format: { + type: String, + default: () => uni.$u.props.barcode.format + }, + // 条形码宽度 + width: { + type: [String, Number], + default: () => uni.$u.props.barcode.width + }, + // 条形码高度 + height: { + type: [String, Number], + default: () => uni.$u.props.barcode.height + }, + // 条形码颜色 + color: { + type: String, + default: () => uni.$u.props.barcode.color + }, + // 背景颜色 + backgroundColor: { + type: String, + default: () => uni.$u.props.barcode.backgroundColor + }, + // 是否显示文本 + displayValue: { + type: Boolean, + default: () => uni.$u.props.barcode.displayValue + }, + // 文本位置 + textPosition: { + type: String, + default: () => uni.$u.props.barcode.textPosition + }, + // 画布类型 + canvasType: { + type: String, + default: () => uni.$u.props.barcode.canvasType + }, + // 字体选项 + fontOptions: { + type: String, + default: () => uni.$u.props.barcode.fontOptions + }, + // 字体 + font: { + type: String, + default: () => uni.$u.props.barcode.font + }, + // 文本对齐方式 + textAlign: { + type: String, + default: () => uni.$u.props.barcode.textAlign + }, + // 文本边距 + textMargin: { + type: Number, + default: () => uni.$u.props.barcode.textMargin + }, + // 字体大小 + fontSize: { + type: Number, + default: () => uni.$u.props.barcode.fontSize + } + } +} diff --git a/uni_modules/uview-next/components/u-barcode/u-barcode.vue b/uni_modules/uview-next/components/u-barcode/u-barcode.vue new file mode 100644 index 0000000..fe7c573 --- /dev/null +++ b/uni_modules/uview-next/components/u-barcode/u-barcode.vue @@ -0,0 +1,249 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-button/nvue.scss b/uni_modules/uview-next/components/u-button/nvue.scss new file mode 100644 index 0000000..490db7d --- /dev/null +++ b/uni_modules/uview-next/components/u-button/nvue.scss @@ -0,0 +1,46 @@ +$u-button-active-opacity:0.75 !default; +$u-button-loading-text-margin-left:4px !default; +$u-button-text-color: #FFFFFF !default; +$u-button-text-plain-error-color:$u-error !default; +$u-button-text-plain-warning-color:$u-warning !default; +$u-button-text-plain-success-color:$u-success !default; +$u-button-text-plain-info-color:$u-info !default; +$u-button-text-plain-primary-color:$u-primary !default; +.u-button { + &--active { + opacity: $u-button-active-opacity; + } + + &--active--plain { + background-color: rgb(217, 217, 217); + } + + &__loading-text { + margin-left:$u-button-loading-text-margin-left; + } + + &__text, + &__loading-text { + color:$u-button-text-color; + } + + &__text--plain--error { + color:$u-button-text-plain-error-color; + } + + &__text--plain--warning { + color:$u-button-text-plain-warning-color; + } + + &__text--plain--success{ + color:$u-button-text-plain-success-color; + } + + &__text--plain--info { + color:$u-button-text-plain-info-color; + } + + &__text--plain--primary { + color:$u-button-text-plain-primary-color; + } +} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-button/props.js b/uni_modules/uview-next/components/u-button/props.js new file mode 100644 index 0000000..ff86fec --- /dev/null +++ b/uni_modules/uview-next/components/u-button/props.js @@ -0,0 +1,171 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-16 10:04:04 + * @LastAuthor : LQ + * @lastTime : 2021-08-16 10:04:24 + * @FilePath : /u-view2.0/uview-ui/components/u-button/props.js + */ +export default { + props: { + // 是否细边框 + hairline: { + type: Boolean, + default: ()=> uni.$u.props.button.hairline + }, + // 按钮的预置样式,info,primary,error,warning,success + type: { + type: String, + default: ()=> uni.$u.props.button.type + }, + // 按钮类型,text,default + round: { + type: [String, Number], + default: ()=> uni.$u.props.button.round + }, + // 按钮尺寸,large,normal,small,mini + size: { + type: String, + default: ()=> uni.$u.props.button.size + }, + // 按钮形状,circle(两边为半圆),square(带圆角) + shape: { + type: String, + default: ()=> uni.$u.props.button.shape + }, + // 按钮是否镂空 + plain: { + type: Boolean, + default: ()=> uni.$u.props.button.plain + }, + // 是否禁止状态 + disabled: { + type: Boolean, + default: ()=> uni.$u.props.button.disabled + }, + // 是否加载中 + loading: { + type: Boolean, + default: ()=> uni.$u.props.button.loading + }, + // 加载中提示文字 + loadingText: { + type: [String, Number], + default: ()=> uni.$u.props.button.loadingText + }, + // 加载状态图标类型 + loadingMode: { + type: String, + default: ()=> uni.$u.props.button.loadingMode + }, + // 加载图标大小 + loadingSize: { + type: [String, Number], + default: ()=> uni.$u.props.button.loadingSize + }, + // 开放能力,具体请看uniapp稳定关于button组件部分说明 + // https://uniapp.dcloud.io/component/button + openType: { + type: String, + default: ()=> uni.$u.props.button.openType + }, + // 用于
组件,点击分别会触发 组件的 submit/reset 事件 + // 取值为submit(提交表单),reset(重置表单) + formType: { + type: String, + default: ()=> uni.$u.props.button.formType + }, + // 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效 + // 只微信小程序、QQ小程序有效 + appParameter: { + type: String, + default: ()=> uni.$u.props.button.appParameter + }, + // 指定是否阻止本节点的祖先节点出现点击态,微信小程序有效 + hoverStopPropagation: { + type: Boolean, + default: ()=> uni.$u.props.button.hoverStopPropagation + }, + // 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。只微信小程序有效 + lang: { + type: String, + default: ()=> uni.$u.props.button.lang + }, + // 会话来源,open-type="contact"时有效。只微信小程序有效 + sessionFrom: { + type: String, + default: ()=> uni.$u.props.button.sessionFrom + }, + // 会话内消息卡片标题,open-type="contact"时有效 + // 默认当前标题,只微信小程序有效 + sendMessageTitle: { + type: String, + default: ()=> uni.$u.props.button.sendMessageTitle + }, + // 会话内消息卡片点击跳转小程序路径,open-type="contact"时有效 + // 默认当前分享路径,只微信小程序有效 + sendMessagePath: { + type: String, + default: ()=> uni.$u.props.button.sendMessagePath + }, + // 会话内消息卡片图片,open-type="contact"时有效 + // 默认当前页面截图,只微信小程序有效 + sendMessageImg: { + type: String, + default: ()=> uni.$u.props.button.sendMessageImg + }, + // 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示, + // 用户点击后可以快速发送小程序消息,open-type="contact"时有效 + showMessageCard: { + type: Boolean, + default: ()=> uni.$u.props.button.showMessageCard + }, + // 额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取 + dataName: { + type: String, + default: ()=> uni.$u.props.button.dataName + }, + // 节流,一定时间内只能触发一次 + throttleTime: { + type: [String, Number], + default: ()=> uni.$u.props.button.throttleTime + }, + // 按住后多久出现点击态,单位毫秒 + hoverStartTime: { + type: [String, Number], + default: ()=> uni.$u.props.button.hoverStartTime + }, + // 手指松开后点击态保留时间,单位毫秒 + hoverStayTime: { + type: [String, Number], + default: ()=> uni.$u.props.button.hoverStayTime + }, + // 按钮文字,之所以通过props传入,是因为slot传入的话 + // nvue中无法控制文字的样式 + text: { + type: [String, Number], + default: ()=> uni.$u.props.button.text + }, + // 按钮图标 + icon: { + type: String, + default: ()=> uni.$u.props.button.icon + }, + // 按钮图标 + iconColor: { + type: String, + default: ()=> uni.$u.props.button.iconColor + }, + // 按钮图标位置:left, right + iconPosition: { + type: String, + default: ()=> uni.$u.props.button.iconPosition + }, + // 按钮颜色,支持传入linear-gradient渐变色 + color: { + type: String, + default: ()=> uni.$u.props.button.color + } + } +} diff --git a/uni_modules/uview-next/components/u-button/u-button.vue b/uni_modules/uview-next/components/u-button/u-button.vue new file mode 100644 index 0000000..26db815 --- /dev/null +++ b/uni_modules/uview-next/components/u-button/u-button.vue @@ -0,0 +1,497 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-button/vue.scss b/uni_modules/uview-next/components/u-button/vue.scss new file mode 100644 index 0000000..32019b2 --- /dev/null +++ b/uni_modules/uview-next/components/u-button/vue.scss @@ -0,0 +1,80 @@ +// nvue下hover-class无效 +$u-button-before-top:50% !default; +$u-button-before-left:50% !default; +$u-button-before-width:100% !default; +$u-button-before-height:100% !default; +$u-button-before-transform:translate(-50%, -50%) !default; +$u-button-before-opacity:0 !default; +$u-button-before-background-color:#000 !default; +$u-button-before-border-color:#000 !default; +$u-button-active-before-opacity:.15 !default; +$u-button-icon-margin-left:4px !default; +$u-button-plain-u-button-info-color:$u-info; +$u-button-plain-u-button-success-color:$u-success; +$u-button-plain-u-button-error-color:$u-error; +$u-button-plain-u-button-warning-color:$u-error; + +.u-button { + width: 100%; + + &__text { + white-space: nowrap; + line-height: 1; + } + + &:before { + position: absolute; + top:$u-button-before-top; + left:$u-button-before-left; + width:$u-button-before-width; + height:$u-button-before-height; + border: inherit; + border-radius: inherit; + transform:$u-button-before-transform; + opacity:$u-button-before-opacity; + content: " "; + background-color:$u-button-before-background-color; + border-color:$u-button-before-border-color; + } + + &--active { + &:before { + opacity: .15 + } + } + + &__icon+&__text:not(:empty), + &__loading-text { + margin-left:$u-button-icon-margin-left; + } + + &--plain { + &.u-button--primary { + color: $u-primary; + } + } + + &--plain { + &.u-button--info { + color:$u-button-plain-u-button-info-color; + } + } + + &--plain { + &.u-button--success { + color:$u-button-plain-u-button-success-color; + } + } + + &--plain { + &.u-button--error { + color:$u-button-plain-u-button-error-color; + } + } + + &--plain { + &.u-button--warning { + color:$u-button-plain-u-button-warning-color; + } + } +} diff --git a/uni_modules/uview-next/components/u-calendar/header.vue b/uni_modules/uview-next/components/u-calendar/header.vue new file mode 100644 index 0000000..323662d --- /dev/null +++ b/uni_modules/uview-next/components/u-calendar/header.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-calendar/month.vue b/uni_modules/uview-next/components/u-calendar/month.vue new file mode 100644 index 0000000..a9984e4 --- /dev/null +++ b/uni_modules/uview-next/components/u-calendar/month.vue @@ -0,0 +1,591 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-calendar/props.js b/uni_modules/uview-next/components/u-calendar/props.js new file mode 100644 index 0000000..ffe5842 --- /dev/null +++ b/uni_modules/uview-next/components/u-calendar/props.js @@ -0,0 +1,169 @@ +export default { + props: { + // 日历顶部标题 + title: { + type: String, + default: ()=> uni.$u.$t('uCalendar.title') + }, + // 是否显示标题 + showTitle: { + type: Boolean, + default: ()=> uni.$u.props.calendar.showTitle + }, + // 是否显示副标题 + showSubtitle: { + type: Boolean, + default: ()=> uni.$u.props.calendar.showSubtitle + }, + // 选中的日期的形状,circle(圆形),square(带圆角) (默认 'square' ) + shape: { + type: String, + default: ()=> uni.$u.props.calendar.shape + }, + // 日期类型选择,single-选择单个日期,multiple-可以选择多个日期,range-选择日期范围 + mode: { + type: String, + default: ()=> uni.$u.props.calendar.mode + }, + // mode=range时,第一个日期底部的提示文字 + startText: { + type: String, + default: ()=> uni.$u.$t('uCalendar.startText') + }, + // mode=range时,最后一个日期底部的提示文字 + endText: { + type: String, + default: ()=> uni.$u.$t('uCalendar.endText') + }, + // 自定义列表 + customList: { + type: Array, + default: ()=> uni.$u.props.calendar.customList + }, + // 主题色,对底部按钮和选中日期有效 + color: { + type: String, + default: ()=> uni.$u.props.calendar.color + }, + // 最小的可选日期 + minDate: { + type: [String, Number], + default: ()=> uni.$u.props.calendar.minDate + }, + // 最大可选日期 + maxDate: { + type: [String, Number], + default: ()=> uni.$u.props.calendar.maxDate + }, + // 默认选中的日期,mode为multiple或range是必须为数组格式 + defaultDate: { + type: [Array, String, Date, null], + default: ()=> uni.$u.props.calendar.defaultDate + }, + // mode=multiple时,最多可选多少个日期 + maxCount: { + type: [String, Number], + default: ()=> uni.$u.props.calendar.maxCount + }, + // 日期行高 + rowHeight: { + type: [String, Number], + default: ()=> uni.$u.props.calendar.rowHeight + }, + // 日期格式化函数 + formatter: { + type: [Function, null], + default: null + }, + // 是否显示农历 + showLunar: { + type: Boolean, + default: ()=> uni.$u.props.calendar.showLunar + }, + // 是否显示月份背景色 + showMark: { + type: Boolean, + default: ()=> uni.$u.props.calendar.showMark + }, + // 确定按钮的文字 + confirmText: { + type: String, + default: ()=> uni.$u.$t('uCalendar.confirmText') + }, + // 确认按钮处于禁用状态时的文字 + confirmDisabledText: { + type: String, + default: ()=> uni.$u.$t('uCalendar.confirmDisabledText') + }, + // 星期几 + weekdays: { + type: String, + default: ()=> uni.$u.$t('uCalendar.weekdays') + }, + // 是否显示日历弹窗 + show: { + type: Boolean, + default: ()=> uni.$u.props.calendar.show + }, + // 是否允许点击遮罩关闭日历 + closeOnClickOverlay: { + type: Boolean, + default: ()=> uni.$u.props.calendar.closeOnClickOverlay + }, + // 是否为只读状态,只读状态下禁止选择日期 + readonly: { + type: Boolean, + default: ()=> uni.$u.props.calendar.readonly + }, + // 是否展示确认按钮 + showConfirm: { + type: Boolean, + default: ()=> uni.$u.props.calendar.showConfirm + }, + // 日期区间最多可选天数,默认无限制,mode = range时有效 + maxRange: { + type: [Number, String], + default: ()=> uni.$u.props.calendar.maxRange + }, + // 范围选择超过最多可选天数时的提示文案,mode = range时有效 + rangePrompt: { + type: String, + default: ()=> uni.$u.props.calendar.rangePrompt + }, + // 范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效 + showRangePrompt: { + type: Boolean, + default: ()=> uni.$u.props.calendar.showRangePrompt + }, + // 是否允许日期范围的起止时间为同一天,mode = range时有效 + allowSameDay: { + type: Boolean, + default: ()=> uni.$u.props.calendar.allowSameDay + }, + // 圆角值 + round: { + type: [Boolean, String, Number], + default: ()=> uni.$u.props.calendar.round + }, + // 最多展示月份数量 + monthNum: { + type: [Number, String], + default: ()=> uni.$u.props.calendar.monthNum + }, + // 禁止选择的日期 + disabledDate: { + type: [Array, String, null], + default: ()=> uni.$u.props.calendar.disabledDate + }, + // 禁止选择的日期函数 + disabledFun: { + type: [Function, null], + default: null + }, + // 是否插入模式 + insert: { + type: Boolean, + default: ()=> uni.$u.props.calendar.insert + } + } +} diff --git a/uni_modules/uview-next/components/u-calendar/u-calendar.vue b/uni_modules/uview-next/components/u-calendar/u-calendar.vue new file mode 100644 index 0000000..e94f7d3 --- /dev/null +++ b/uni_modules/uview-next/components/u-calendar/u-calendar.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-calendar/util.js b/uni_modules/uview-next/components/u-calendar/util.js new file mode 100644 index 0000000..ca4736b --- /dev/null +++ b/uni_modules/uview-next/components/u-calendar/util.js @@ -0,0 +1,85 @@ +export default { + methods: { + // 设置月份数据 + setMonth() { + // 月初是周几 + const day = dayjs(this.date).date(1).day() + const start = day == 0 ? 6 : day - 1 + + // 本月天数 + const days = dayjs(this.date).endOf('month').format('D') + + // 上个月天数 + const prevDays = dayjs(this.date).endOf('month').subtract(1, 'month').format('D') + + // 日期数据 + const arr = [] + // 清空表格 + this.month = [] + + // 添加上月数据 + arr.push( + ...new Array(start).fill(1).map((e, i) => { + const day = prevDays - start + i + 1 + + return { + value: day, + disabled: true, + date: dayjs(this.date).subtract(1, 'month').date(day).format('YYYY-MM-DD') + } + }) + ) + + // 添加本月数据 + arr.push( + ...new Array(days - 0).fill(1).map((e, i) => { + const day = i + 1 + + return { + value: day, + date: dayjs(this.date).date(day).format('YYYY-MM-DD') + } + }) + ) + + // 添加下个月 + arr.push( + ...new Array(42 - days - start).fill(1).map((e, i) => { + const day = i + 1 + + return { + value: day, + disabled: true, + date: dayjs(this.date).add(1, 'month').date(day).format('YYYY-MM-DD') + } + }) + ) + + // 分割数组 + for (let n = 0; n < arr.length; n += 7) { + this.month.push( + arr.slice(n, n + 7).map((e, i) => { + e.index = i + n + + // 自定义信息 + const custom = this.customList.find((c) => c.date == e.date) + + // 农历 + if (this.lunar) { + const { + IDayCn, + IMonthCn + } = this.getLunar(e.date) + e.lunar = IDayCn == '初一' ? IMonthCn : IDayCn + } + + return { + ...e, + ...custom + } + }) + ) + } + } + } +} diff --git a/uni_modules/uview-next/components/u-calendar/view.vue b/uni_modules/uview-next/components/u-calendar/view.vue new file mode 100644 index 0000000..3619fe4 --- /dev/null +++ b/uni_modules/uview-next/components/u-calendar/view.vue @@ -0,0 +1,486 @@ + + + diff --git a/uni_modules/uview-next/components/u-car-keyboard/props.js b/uni_modules/uview-next/components/u-car-keyboard/props.js new file mode 100644 index 0000000..4525a8a --- /dev/null +++ b/uni_modules/uview-next/components/u-car-keyboard/props.js @@ -0,0 +1,14 @@ +export default { + props: { + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: ()=> uni.$u.props.carKeyboard.random + }, + // 输入一个中文后,是否自动切换到英文 + autoChange: { + type: Boolean, + default: ()=> uni.$u.props.carKeyboard.autoChange + } + } +} diff --git a/uni_modules/uview-next/components/u-car-keyboard/u-car-keyboard.vue b/uni_modules/uview-next/components/u-car-keyboard/u-car-keyboard.vue new file mode 100644 index 0000000..b9355a5 --- /dev/null +++ b/uni_modules/uview-next/components/u-car-keyboard/u-car-keyboard.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-card/props.js b/uni_modules/uview-next/components/u-card/props.js new file mode 100644 index 0000000..19dc187 --- /dev/null +++ b/uni_modules/uview-next/components/u-card/props.js @@ -0,0 +1,124 @@ +export default { + props: { + // 与屏幕两侧是否留空隙 + full: { + type: Boolean, + default: ()=> uni.$u.props.card.full + }, + // 标题 + title: { + type: String, + default: ()=> uni.$u.props.card.title + }, + // 标题颜色 + titleColor: { + type: String, + default: ()=> uni.$u.props.card.titleColor + }, + // 标题字体大小,单位rpx + titleSize: { + type: [Number, String], + default: ()=> uni.$u.props.card.titleSize + }, + // 副标题 + subTitle: { + type: String, + default: ()=> uni.$u.props.card.subTitle + }, + // 副标题颜色 + subTitleColor: { + type: String, + default: ()=> uni.$u.props.card.subTitleColor + }, + // 副标题字体大小,单位rpx + subTitleSize: { + type: [Number, String], + default: ()=> uni.$u.props.card.subTitleSize + }, + // 是否显示外部边框,只对full=false时有效(卡片与边框有空隙时) + border: { + type: Boolean, + default: ()=> uni.$u.props.card.border + }, + // 用于标识点击了第几个 + index: { + type: [Number, String, Object], + default: ()=> uni.$u.props.card.index + }, + // 用于隔开上下左右的边距,带单位的写法,如:"30rpx 30rpx","20rpx 20rpx 30rpx 30rpx" + margin: { + type: String, + default: ()=> uni.$u.props.card.margin + }, + // card卡片的圆角 + round: { + type: [Number, String], + default: ()=> uni.$u.props.card.round + }, + // 头部自定义样式,对象形式 + headStyle: { + type: Object, + default: ()=> uni.$u.props.card.headStyle + }, + // 主体自定义样式,对象形式 + bodyStyle: { + type: Object, + default: ()=> uni.$u.props.card.bodyStyle + }, + // 底部自定义样式,对象形式 + footStyle: { + type: Object, + default: ()=> uni.$u.props.card.footStyle + }, + // 头部是否下边框 + headBorderBottom: { + type: Boolean, + default: ()=> uni.$u.props.card.headBorderBottom + }, + // 底部是否有上边框 + footBorderTop: { + type: Boolean, + default: ()=> uni.$u.props.card.footBorderTop + }, + // 标题左边的缩略图 + thumb: { + type: String, + default: ()=> uni.$u.props.card.thumb + }, + // 缩略图宽高,单位rpx + thumbWidth: { + type: [String, Number], + default: ()=> uni.$u.props.card.thumbWidth + }, + // 缩略图是否为圆形 + thumbCircle: { + type: Boolean, + default: ()=> uni.$u.props.card.thumbCircle + }, + // 缩略图圆角值 + thumbRadius: { + type: [String, Number], + default: ()=> uni.$u.props.card.thumbRadius + }, + // 给head,body,foot的内边距 + padding: { + type: [String, Number], + default: ()=> uni.$u.props.card.padding + }, + // 是否显示头部 + showHead: { + type: Boolean, + default: ()=> uni.$u.props.card.showHead + }, + // 是否显示尾部 + showFoot: { + type: Boolean, + default: ()=> uni.$u.props.card.showFoot + }, + // 卡片外围阴影,字符串形式 + boxShadow: { + type: String, + default: ()=> uni.$u.props.card.boxShadow + } + } +} diff --git a/uni_modules/uview-next/components/u-card/u-card.vue b/uni_modules/uview-next/components/u-card/u-card.vue new file mode 100644 index 0000000..152c000 --- /dev/null +++ b/uni_modules/uview-next/components/u-card/u-card.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-cascader/props.js b/uni_modules/uview-next/components/u-cascader/props.js new file mode 100644 index 0000000..30ffb06 --- /dev/null +++ b/uni_modules/uview-next/components/u-cascader/props.js @@ -0,0 +1,116 @@ +export default { + props: { + // 是否显示级联选择器 + show: { + type: Boolean, + default: ()=> uni.$u.props.cascader.show + }, + // 选择器标题 + title: { + type: String, + default: ()=> uni.$u.$t('uCascader.title') + }, + // 选项数据 + options: { + type: Array, + default: ()=> uni.$u.props.cascader.options + }, + // #ifdef VUE3 + // 当前选中值 + modelValue: { + type: [String, Number, Array], + default: ()=> uni.$u.props.cascader.modelValue + }, + // #endif + // v-model 的别名 + value: { + type: [String, Number, Array], + default: ()=> uni.$u.props.cascader.value + }, + // 占位符文本 + placeholder: { + type: String, + default: ()=> uni.$u.$t('uCascader.placeholder') + }, + // 自定义字段名 + field: { + type: Object, + default: ()=> uni.$u.props.cascader.field + }, + // 是否显示关闭按钮 + closeable: { + type: Boolean, + default: ()=> uni.$u.props.cascader.closeable + }, + // 是否点击遮罩关闭 + closeOnClickOverlay: { + type: Boolean, + default: ()=> uni.$u.props.cascader.closeOnClickOverlay + }, + // 背景色 + bgColor: { + type: String, + default: ()=> uni.$u.props.cascader.bgColor + }, + // 主题色 + activeColor: { + type: String, + default: ()=> uni.$u.props.cascader.activeColor + }, + // 选中背景色 + activeBgColor: { + type: String, + default: ()=> uni.$u.props.cascader.activeBgColor + }, + // 选中文本加粗 + activeBold: { + type: Boolean, + default: ()=> uni.$u.props.cascader.activeBold + }, + // 图标颜色 + iconColor: { + type: String, + default: ()=> uni.$u.props.cascader.iconColor + }, + // 文本色 + color: { + type: String, + default: ()=> uni.$u.props.cascader.color + }, + // 字体大小 + fontSize: { + type: String, + default: ()=> uni.$u.props.cascader.fontSize + }, + // 标题字体大小 + titleFontSize: { + type: String, + default: ()=> uni.$u.props.cascader.titleFontSize + }, + // 标题颜色 + titleColor: { + type: String, + default: ()=> uni.$u.props.cascader.titleColor + }, + // 圆角 + round: { + type: [String, Number], + default: ()=> uni.$u.props.cascader.round + }, + // 层级 + zIndex: { + type: [String, Number], + default: ()=> uni.$u.props.cascader.zIndex + }, + // 是否安全区域 + safeAreaInsetBottom: { + type: Boolean, + default: ()=> uni.$u.props.cascader.safeAreaInsetBottom + }, + // 选项高度 + itemHeight: { + type: String, + default: ()=> uni.$u.props.cascader.itemHeight + } + } +} diff --git a/uni_modules/uview-next/components/u-cascader/u-cascader.vue b/uni_modules/uview-next/components/u-cascader/u-cascader.vue new file mode 100644 index 0000000..52c56b0 --- /dev/null +++ b/uni_modules/uview-next/components/u-cascader/u-cascader.vue @@ -0,0 +1,433 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-cell-group/props.js b/uni_modules/uview-next/components/u-cell-group/props.js new file mode 100644 index 0000000..ae8faeb --- /dev/null +++ b/uni_modules/uview-next/components/u-cell-group/props.js @@ -0,0 +1,29 @@ +export default { + props: { + // 分组标题 + title: { + type: String, + default: ()=> uni.$u.props.cellGroup.title + }, + // 是否显示外边框 + border: { + type: Boolean, + default: ()=> uni.$u.props.cellGroup.border + }, + // 背景颜色 + backgroundColor: { + type: String, + default: ()=> uni.$u.props.cellGroup.backgroundColor + }, + // 边框圆角 + round: { + type: String, + default: ()=> uni.$u.props.cellGroup.round + }, + // 边框颜色 + borderColor: { + type: String, + default: ()=> uni.$u.props.cellGroup.borderColor + } + } +} diff --git a/uni_modules/uview-next/components/u-cell-group/u-cell-group.vue b/uni_modules/uview-next/components/u-cell-group/u-cell-group.vue new file mode 100644 index 0000000..306986d --- /dev/null +++ b/uni_modules/uview-next/components/u-cell-group/u-cell-group.vue @@ -0,0 +1,91 @@ + + + + + + diff --git a/uni_modules/uview-next/components/u-cell/props.js b/uni_modules/uview-next/components/u-cell/props.js new file mode 100644 index 0000000..e1b5139 --- /dev/null +++ b/uni_modules/uview-next/components/u-cell/props.js @@ -0,0 +1,109 @@ +export default { + props: { + // 标题 + title: { + type: [String, Number], + default: ()=> uni.$u.props.cell.title + }, + // 标题下方的描述信息 + label: { + type: [String, Number], + default: ()=> uni.$u.props.cell.label + }, + // 右侧的内容 + value: { + type: [String, Number], + default: ()=> uni.$u.props.cell.value + }, + // 左侧图标名称,或者图片链接(本地文件建议使用绝对地址) + icon: { + type: String, + default: ()=> uni.$u.props.cell.icon + }, + // 是否禁用cell + disabled: { + type: Boolean, + default: ()=> uni.$u.props.cell.disabled + }, + // 是否显示下边框 + border: { + type: Boolean, + default: ()=> uni.$u.props.cell.border + }, + // 边框颜色 + borderColor: { + type: String, + default: ()=> uni.$u.props.cell.borderColor + }, + // 内容是否垂直居中(主要是针对右侧的value部分) + center: { + type: Boolean, + default: ()=> uni.$u.props.cell.center + }, + // 点击后跳转的URL地址 + url: { + type: String, + default: ()=> uni.$u.props.cell.url + }, + // 链接跳转的方式,内部使用的是uView封装的route方法,可能会进行拦截操作 + linkType: { + type: String, + default: ()=> uni.$u.props.cell.linkType + }, + // 是否开启点击反馈(表现为点击时加上灰色背景) + clickable: { + type: Boolean, + default: ()=> uni.$u.props.cell.clickable + }, + // 是否展示右侧箭头并开启点击反馈 + isLink: { + type: Boolean, + default: ()=> uni.$u.props.cell.isLink + }, + // 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件) + required: { + type: Boolean, + default: ()=> uni.$u.props.cell.required + }, + // 右侧的图标箭头 + rightIcon: { + type: String, + default: ()=> uni.$u.props.cell.rightIcon + }, + // 右侧箭头的方向,可选值为:left,up,down + arrowDirection: { + type: String, + default: ()=> uni.$u.props.cell.arrowDirection + }, + // 左侧图标样式 + iconStyle: { + type: [Object, String], + default: ()=> uni.$u.props.cell.iconStyle + }, + // 右侧箭头图标的样式 + rightIconStyle: { + type: [Object, String], + default: ()=> uni.$u.props.cell.rightIconStyle + }, + // 标题的样式 + titleStyle: { + type: [Object, String], + default: ()=> uni.$u.props.cell.titleStyle + }, + // 单位元的大小,可选值为large + size: { + type: String, + default: ()=> uni.$u.props.cell.size + }, + // 点击cell是否阻止事件传播 + stop: { + type: Boolean, + default: ()=> uni.$u.props.cell.stop + }, + // 标识符,cell被点击时返回 + name: { + type: [Number, String], + default: ()=> uni.$u.props.cell.name + } + } +} diff --git a/uni_modules/uview-next/components/u-cell/u-cell.vue b/uni_modules/uview-next/components/u-cell/u-cell.vue new file mode 100644 index 0000000..31d1c69 --- /dev/null +++ b/uni_modules/uview-next/components/u-cell/u-cell.vue @@ -0,0 +1,274 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-checkbox-group/props.js b/uni_modules/uview-next/components/u-checkbox-group/props.js new file mode 100644 index 0000000..d81ff50 --- /dev/null +++ b/uni_modules/uview-next/components/u-checkbox-group/props.js @@ -0,0 +1,92 @@ +export default { + props: { + // 标识符 + name: { + type: String, + default: ()=> uni.$u.props.checkboxGroup.name + }, + // 绑定的值 + value: { + type: Array, + default: ()=> uni.$u.props.checkboxGroup.value + }, + // #ifdef VUE3 + modelValue: { + type: Array, + default: ()=> uni.$u.props.checkboxGroup.value + }, + // #endif + // 形状,circle-圆形,square-方形 + shape: { + type: String, + default: ()=> uni.$u.props.checkboxGroup.shape + }, + // 是否禁用全部checkbox + disabled: { + type: Boolean, + default: ()=> uni.$u.props.checkboxGroup.disabled + }, + + // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 + activeColor: { + type: String, + default: ()=> uni.$u.props.checkboxGroup.activeColor + }, + // 未选中的颜色 + inactiveColor: { + type: String, + default: ()=> uni.$u.props.checkboxGroup.inactiveColor + }, + + // 整个组件的尺寸,默认px + size: { + type: [String, Number], + default: ()=> uni.$u.props.checkboxGroup.size + }, + // 布局方式,row-横向,column-纵向 + placement: { + type: String, + default: ()=> uni.$u.props.checkboxGroup.placement + }, + // label的字体大小,px单位 + labelSize: { + type: [String, Number], + default: ()=> uni.$u.props.checkboxGroup.labelSize + }, + // label的字体颜色 + labelColor: { + type: [String], + default: ()=> uni.$u.props.checkboxGroup.labelColor + }, + // 是否禁止点击文本操作 + labelDisabled: { + type: Boolean, + default: ()=> uni.$u.props.checkboxGroup.labelDisabled + }, + // 图标颜色 + iconColor: { + type: String, + default: ()=> uni.$u.props.checkboxGroup.iconColor + }, + // 图标的大小,单位px + iconSize: { + type: [String, Number], + default: ()=> uni.$u.props.checkboxGroup.iconSize + }, + // 勾选图标的对齐方式,left-左边,right-右边 + iconPlacement: { + type: String, + default: ()=> uni.$u.props.checkboxGroup.iconPlacement + }, + // 竖向配列时,是否显示下划线 + borderBottom: { + type: Boolean, + default: ()=> uni.$u.props.checkboxGroup.borderBottom + }, + // 选中状态下的label颜色 + activeLabelColor: { + type: String, + default: ()=> uni.$u.props.checkboxGroup.activeLabelColor + } + } +} diff --git a/uni_modules/uview-next/components/u-checkbox-group/u-checkbox-group.vue b/uni_modules/uview-next/components/u-checkbox-group/u-checkbox-group.vue new file mode 100644 index 0000000..44a71ac --- /dev/null +++ b/uni_modules/uview-next/components/u-checkbox-group/u-checkbox-group.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-checkbox/props.js b/uni_modules/uview-next/components/u-checkbox/props.js new file mode 100644 index 0000000..be0c78d --- /dev/null +++ b/uni_modules/uview-next/components/u-checkbox/props.js @@ -0,0 +1,83 @@ +export default { + props: { + // checkbox的名称 + name: { + type: [String, Number, Boolean], + default: ()=> uni.$u.props.checkbox.name + }, + // 形状,square为方形,circle为圆型 + shape: { + type: String, + default: ()=> uni.$u.props.checkbox.shape + }, + // 整体的大小 + size: { + type: [String, Number], + default: ()=> uni.$u.props.checkbox.size + }, + // 是否默认选中 + checked: { + type: Boolean, + default: ()=> uni.$u.props.checkbox.checked + }, + // 是否为中间状态 + indeterminate: { + type: Boolean, + default: ()=> uni.$u.props.checkbox.indeterminate + }, + // 是否禁用 + disabled: { + type: [String, Boolean], + default: ()=> uni.$u.props.checkbox.disabled + }, + // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 + activeColor: { + type: String, + default: ()=> uni.$u.props.checkbox.activeColor + }, + // 未选中的颜色 + inactiveColor: { + type: String, + default: ()=> uni.$u.props.checkbox.inactiveColor + }, + icon: { + type: String, + default: ()=> uni.$u.props.checkbox.icon + }, + // 图标的大小,单位px + iconSize: { + type: [String, Number], + default: ()=> uni.$u.props.checkbox.iconSize + }, + // 图标颜色 + iconColor: { + type: String, + default: ()=> uni.$u.props.checkbox.iconColor + }, + // label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式 + label: { + type: [String, Number], + default: ()=> uni.$u.props.checkbox.label + }, + // label的字体大小,px单位 + labelSize: { + type: [String, Number], + default: ()=> uni.$u.props.checkbox.labelSize + }, + // label的颜色 + labelColor: { + type: String, + default: ()=> uni.$u.props.checkbox.labelColor + }, + // label的颜色 + activeLabelColor: { + type: String, + default: ()=> uni.$u.props.checkbox.activeLabelColor + }, + // 是否禁止点击提示语选中复选框 + labelDisabled: { + type: [String, Boolean], + default: ()=> uni.$u.props.checkbox.labelDisabled + } + } +} diff --git a/uni_modules/uview-next/components/u-checkbox/u-checkbox.vue b/uni_modules/uview-next/components/u-checkbox/u-checkbox.vue new file mode 100644 index 0000000..6753b07 --- /dev/null +++ b/uni_modules/uview-next/components/u-checkbox/u-checkbox.vue @@ -0,0 +1,465 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-circle-progress/props.js b/uni_modules/uview-next/components/u-circle-progress/props.js new file mode 100644 index 0000000..08a69bf --- /dev/null +++ b/uni_modules/uview-next/components/u-circle-progress/props.js @@ -0,0 +1,48 @@ +export default { + props: { + // 圆环进度百分比值 + percent: { + type: Number, + default: ()=> uni.$u.props.circleProgress.percent, + // 限制值在0到100之间 + validator: val => { + return val >= 0 && val <= 100; + } + }, + // 底部圆环的颜色(灰色的圆环) + inactiveColor: { + type: String, + default: ()=> uni.$u.props.circleProgress.inactiveColor, + }, + // 圆环激活部分的颜色 + activeColor: { + type: String, + default: ()=> uni.$u.props.circleProgress.activeColor, + }, + // 圆环线条的宽度,单位rpx + borderWidth: { + type: [Number, String], + default: ()=> uni.$u.props.circleProgress.borderWidth + }, + // 整个圆形的宽度,单位rpx + width: { + type: [Number, String], + default: ()=> uni.$u.props.circleProgress.width + }, + // 整个圆环执行一圈的时间,单位ms + duration: { + type: [Number, String], + default: ()=> uni.$u.props.circleProgress.duration + }, + // 主题类型 + type: { + type: String, + default: ()=> uni.$u.props.circleProgress.type + }, + // 整个圆环进度区域的背景色 + bgColor: { + type: String, + default: ()=> uni.$u.props.circleProgress.bgColor + } + } +} diff --git a/uni_modules/uview-next/components/u-circle-progress/u-circle-progress.vue b/uni_modules/uview-next/components/u-circle-progress/u-circle-progress.vue new file mode 100644 index 0000000..13c044b --- /dev/null +++ b/uni_modules/uview-next/components/u-circle-progress/u-circle-progress.vue @@ -0,0 +1,216 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-code-input/props.js b/uni_modules/uview-next/components/u-code-input/props.js new file mode 100644 index 0000000..ef27296 --- /dev/null +++ b/uni_modules/uview-next/components/u-code-input/props.js @@ -0,0 +1,114 @@ +export default { + props: { + // 输入框类型 + type: { + type: String, + default: ()=> uni.$u.props.codeInput.type + }, + // 设置右下角按钮的文字,有效值:send|search|next|go|done,兼容性详见uni-app文档 + // https://uniapp.dcloud.io/component/input + // https://uniapp.dcloud.io/component/textarea + confirmType: { + type: String, + default: ()=> uni.$u.props.codeInput.confirmType + }, + // 点击键盘右下角按钮时是否保持键盘不收起,H5无效 + confirmHold: { + type: Boolean, + default: ()=> uni.$u.props.codeInput.confirmHold + }, + // 键盘弹起时,是否自动上推页面 + adjustPosition: { + type: Boolean, + default: ()=> uni.$u.props.codeInput.adjustPosition + }, + // 最大输入长度 + maxlength: { + type: [String, Number], + default: ()=> uni.$u.props.codeInput.maxlength + }, + // 是否用圆点填充 + dot: { + type: Boolean, + default: ()=> uni.$u.props.codeInput.dot + }, + // 显示模式,box-盒子模式,line-底部横线模式 + mode: { + type: String, + default: ()=> uni.$u.props.codeInput.mode + }, + // 是否细边框 + hairline: { + type: Boolean, + default: ()=> uni.$u.props.codeInput.hairline + }, + // 字符间的距离 + space: { + type: [String, Number], + default: ()=> uni.$u.props.codeInput.space + }, + // 预置值 + // #ifdef VUE2 + value: { + type: [String, Number], + default: ()=> uni.$u.props.codeInput.value + }, + // #endif + // #ifdef VUE3 + modelValue: { + type: [String, Number], + default: ()=> uni.$u.props.codeInput.modelValue + }, + // #endif + // 是否自动获取焦点 + focus: { + type: Boolean, + default: ()=> uni.$u.props.codeInput.focus + }, + // 字体是否加粗 + bold: { + type: Boolean, + default: ()=> uni.$u.props.codeInput.bold + }, + // 字体颜色 + color: { + type: String, + default: ()=> uni.$u.props.codeInput.color + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: ()=> uni.$u.props.codeInput.fontSize + }, + // 输入框的大小,宽等于高 + size: { + type: [String, Number], + default: ()=> uni.$u.props.codeInput.size + }, + // 是否隐藏原生键盘,如果想用自定义键盘的话,需设置此参数为true + disabledKeyboard: { + type: Boolean, + default: ()=> uni.$u.props.codeInput.disabledKeyboard + }, + // 边框和线条颜色 + borderColor: { + type: String, + default: ()=> uni.$u.props.codeInput.borderColor + }, + // 是否禁止输入"."符号 + disabledDot: { + type: Boolean, + default: ()=> uni.$u.props.codeInput.disabledDot + }, + // 背景颜色 + bgColor: { + type: String, + default: ()=> uni.$u.props.codeInput.bgColor + }, + //设置圆角值 + round: { + type: [String, Number], + default: ()=> uni.$u.props.codeInput.round + } + } +} diff --git a/uni_modules/uview-next/components/u-code-input/u-code-input.vue b/uni_modules/uview-next/components/u-code-input/u-code-input.vue new file mode 100644 index 0000000..d539472 --- /dev/null +++ b/uni_modules/uview-next/components/u-code-input/u-code-input.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-code/props.js b/uni_modules/uview-next/components/u-code/props.js new file mode 100644 index 0000000..3fedcde --- /dev/null +++ b/uni_modules/uview-next/components/u-code/props.js @@ -0,0 +1,34 @@ +export default { + props: { + // 倒计时总秒数 + seconds: { + type: [String, Number], + default: ()=> uni.$u.props.code.seconds + }, + // 尚未开始时提示 + startText: { + type: String, + default: ()=> uni.$u.$t('uCode.startText') + }, + // 正在倒计时中的提示 + changeText: { + type: String, + default: ()=> uni.$u.$t('uCode.changeText') + }, + // 倒计时结束时的提示 + endText: { + type: String, + default: ()=> uni.$u.$t('uCode.endText') + }, + // 是否在H5刷新或各端返回再进入时继续倒计时 + keepRunning: { + type: Boolean, + default: ()=> uni.$u.props.code.keepRunning + }, + // 为了区分多个页面,或者一个页面多个倒计时组件本地存储的继续倒计时变了 + uniqueKey: { + type: String, + default: ()=> uni.$u.props.code.uniqueKey + } + } +} diff --git a/uni_modules/uview-next/components/u-code/u-code.vue b/uni_modules/uview-next/components/u-code/u-code.vue new file mode 100644 index 0000000..1bdac8d --- /dev/null +++ b/uni_modules/uview-next/components/u-code/u-code.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-col/props.js b/uni_modules/uview-next/components/u-col/props.js new file mode 100644 index 0000000..f8b7d45 --- /dev/null +++ b/uni_modules/uview-next/components/u-col/props.js @@ -0,0 +1,29 @@ +export default { + props: { + // 占父容器宽度的多少等分,总分为12份 + span: { + type: [String, Number], + default: ()=> uni.$u.props.col.span + }, + // 指定栅格左侧的间隔数(总12栏) + offset: { + type: [String, Number], + default: ()=> uni.$u.props.col.offset + }, + // 水平排列方式,可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`) + justify: { + type: String, + default: ()=> uni.$u.props.col.justify + }, + // 垂直对齐方式,可选值为top、center、bottom、stretch + align: { + type: String, + default: ()=> uni.$u.props.col.align + }, + // 文字对齐方式 + textAlign: { + type: String, + default: ()=> uni.$u.props.col.textAlign + } + } +} diff --git a/uni_modules/uview-next/components/u-col/u-col.vue b/uni_modules/uview-next/components/u-col/u-col.vue new file mode 100644 index 0000000..339e686 --- /dev/null +++ b/uni_modules/uview-next/components/u-col/u-col.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-collapse-item/props.js b/uni_modules/uview-next/components/u-collapse-item/props.js new file mode 100644 index 0000000..366e052 --- /dev/null +++ b/uni_modules/uview-next/components/u-collapse-item/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 标题 + title: { + type: String, + default: ()=> uni.$u.props.collapseItem.title + }, + // 标题右侧内容 + value: { + type: String, + default: ()=> uni.$u.props.collapseItem.value + }, + // 标题下方的描述信息 + label: { + type: String, + default: ()=> uni.$u.props.collapseItem.label + }, + // 是否禁用折叠面板 + disabled: { + type: Boolean, + default: ()=> uni.$u.props.collapseItem.disabled + }, + // 是否展示右侧箭头并开启点击反馈 + isLink: { + type: Boolean, + default: ()=> uni.$u.props.collapseItem.isLink + }, + // 是否开启点击反馈 + clickable: { + type: Boolean, + default: ()=> uni.$u.props.collapseItem.clickable + }, + // 是否显示内边框 + border: { + type: Boolean, + default: ()=> uni.$u.props.collapseItem.border + }, + // 标题的对齐方式 + align: { + type: String, + default: ()=> uni.$u.props.collapseItem.align + }, + // 唯一标识符 + name: { + type: [String, Number], + default: ()=> uni.$u.props.collapseItem.name + }, + // 标题左侧图片,可为绝对路径的图片或内置图标 + icon: { + type: String, + default: ()=> uni.$u.props.collapseItem.icon + }, + // 面板展开收起的过渡时间,单位ms + duration: { + type: Number, + default: ()=> uni.$u.props.collapseItem.duration + } + } +} diff --git a/uni_modules/uview-next/components/u-collapse-item/u-collapse-item.vue b/uni_modules/uview-next/components/u-collapse-item/u-collapse-item.vue new file mode 100644 index 0000000..228a1a5 --- /dev/null +++ b/uni_modules/uview-next/components/u-collapse-item/u-collapse-item.vue @@ -0,0 +1,230 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-collapse/props.js b/uni_modules/uview-next/components/u-collapse/props.js new file mode 100644 index 0000000..247909f --- /dev/null +++ b/uni_modules/uview-next/components/u-collapse/props.js @@ -0,0 +1,19 @@ +export default { + props: { + // 当前展开面板的name,非手风琴模式:[],手风琴模式:string | number + value: { + type: [String, Number, Array, null], + default: ()=> uni.$u.props.collapse.value + }, + // 是否手风琴模式 + accordion: { + type: Boolean, + default: ()=> uni.$u.props.collapse.accordion + }, + // 是否显示外边框 + border: { + type: Boolean, + default: ()=> uni.$u.props.collapse.border + } + } +} diff --git a/uni_modules/uview-next/components/u-collapse/u-collapse.vue b/uni_modules/uview-next/components/u-collapse/u-collapse.vue new file mode 100644 index 0000000..ee953f0 --- /dev/null +++ b/uni_modules/uview-next/components/u-collapse/u-collapse.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-column-notice/props.js b/uni_modules/uview-next/components/u-column-notice/props.js new file mode 100644 index 0000000..2d9bdf4 --- /dev/null +++ b/uni_modules/uview-next/components/u-column-notice/props.js @@ -0,0 +1,55 @@ +export default { + props: { + // 显示的内容,字符串 + text: { + type: [Array], + default: ()=> uni.$u.props.columnNotice.text + }, + // 是否显示左侧的音量图标 + icon: { + type: String, + default: ()=> uni.$u.props.columnNotice.icon + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: ()=> uni.$u.props.columnNotice.mode + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: ()=> uni.$u.props.columnNotice.color + }, + // 背景颜色 + bgColor: { + type: String, + default: ()=> uni.$u.props.columnNotice.bgColor + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: ()=> uni.$u.props.columnNotice.fontSize + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: ()=> uni.$u.props.columnNotice.speed + }, + // direction = row时,是否使用步进形式滚动 + step: { + type: Boolean, + default: ()=> uni.$u.props.columnNotice.step + }, + // 滚动一个周期的时间长,单位ms + duration: { + type: [String, Number], + default: ()=> uni.$u.props.columnNotice.duration + }, + // 是否禁止用手滑动切换 + // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 + disableTouch: { + type: Boolean, + default: ()=> uni.$u.props.columnNotice.disableTouch + } + } +} diff --git a/uni_modules/uview-next/components/u-column-notice/u-column-notice.vue b/uni_modules/uview-next/components/u-column-notice/u-column-notice.vue new file mode 100644 index 0000000..793c67b --- /dev/null +++ b/uni_modules/uview-next/components/u-column-notice/u-column-notice.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-count-down/props.js b/uni_modules/uview-next/components/u-count-down/props.js new file mode 100644 index 0000000..53fb76b --- /dev/null +++ b/uni_modules/uview-next/components/u-count-down/props.js @@ -0,0 +1,24 @@ +export default { + props: { + // 倒计时时长,单位ms + time: { + type: [String, Number], + default: ()=> uni.$u.props.countDown.time + }, + // 时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒 + format: { + type: String, + default: ()=> uni.$u.props.countDown.format + }, + // 是否自动开始倒计时 + autoStart: { + type: Boolean, + default: ()=> uni.$u.props.countDown.autoStart + }, + // 是否展示毫秒倒计时 + millisecond: { + type: Boolean, + default: ()=> uni.$u.props.countDown.millisecond + } + } +} diff --git a/uni_modules/uview-next/components/u-count-down/u-count-down.vue b/uni_modules/uview-next/components/u-count-down/u-count-down.vue new file mode 100644 index 0000000..e7006fe --- /dev/null +++ b/uni_modules/uview-next/components/u-count-down/u-count-down.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-count-down/utils.js b/uni_modules/uview-next/components/u-count-down/utils.js new file mode 100644 index 0000000..8c75005 --- /dev/null +++ b/uni_modules/uview-next/components/u-count-down/utils.js @@ -0,0 +1,62 @@ +// 补0,如1 -> 01 +function padZero(num, targetLength = 2) { + let str = `${num}` + while (str.length < targetLength) { + str = `0${str}` + } + return str +} +const SECOND = 1000 +const MINUTE = 60 * SECOND +const HOUR = 60 * MINUTE +const DAY = 24 * HOUR +export function parseTimeData(time) { + const days = Math.floor(time / DAY) + const hours = Math.floor((time % DAY) / HOUR) + const minutes = Math.floor((time % HOUR) / MINUTE) + const seconds = Math.floor((time % MINUTE) / SECOND) + const milliseconds = Math.floor(time % SECOND) + return { + days, + hours, + minutes, + seconds, + milliseconds + } +} +export function parseFormat(format, timeData) { + let { + days, + hours, + minutes, + seconds, + milliseconds + } = timeData + // 如果格式化字符串中不存在DD(天),则将天的时间转为小时中去 + if (format.indexOf('DD') === -1) { + hours += days * 24 + } else { + // 对天补0 + format = format.replace('DD', padZero(days)) + } + // 其他同理于DD的格式化处理方式 + if (format.indexOf('HH') === -1) { + minutes += hours * 60 + } else { + format = format.replace('HH', padZero(hours)) + } + if (format.indexOf('mm') === -1) { + seconds += minutes * 60 + } else { + format = format.replace('mm', padZero(minutes)) + } + if (format.indexOf('ss') === -1) { + milliseconds += seconds * 1000 + } else { + format = format.replace('ss', padZero(seconds)) + } + return format.replace('SSS', padZero(milliseconds, 3)) +} +export function isSameSecond(time1, time2) { + return Math.floor(time1 / 1000) === Math.floor(time2 / 1000) +} diff --git a/uni_modules/uview-next/components/u-count-to/props.js b/uni_modules/uview-next/components/u-count-to/props.js new file mode 100644 index 0000000..f4dc868 --- /dev/null +++ b/uni_modules/uview-next/components/u-count-to/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 开始的数值,默认从0增长到某一个数 + startVal: { + type: [String, Number], + default: ()=> uni.$u.props.countTo.startVal + }, + // 要滚动的目标数值,必须 + endVal: { + type: [String, Number], + default: ()=> uni.$u.props.countTo.endVal + }, + // 滚动到目标数值的动画持续时间,单位为毫秒(ms) + duration: { + type: [String, Number], + default: ()=> uni.$u.props.countTo.duration + }, + // 设置数值后是否自动开始滚动 + autoplay: { + type: Boolean, + default: ()=> uni.$u.props.countTo.autoplay + }, + // 要显示的小数位数 + decimals: { + type: [String, Number], + default: ()=> uni.$u.props.countTo.decimals + }, + // 是否在即将到达目标数值的时候,使用缓慢滚动的效果 + useEasing: { + type: Boolean, + default: ()=> uni.$u.props.countTo.useEasing + }, + // 十进制分割 + decimal: { + type: [String, Number], + default: ()=> uni.$u.props.countTo.decimal + }, + // 字体颜色 + color: { + type: String, + default: ()=> uni.$u.props.countTo.color + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: ()=> uni.$u.props.countTo.fontSize + }, + // 是否加粗字体 + bold: { + type: Boolean, + default: ()=> uni.$u.props.countTo.bold + }, + // 千位分隔符,类似金额的分割(¥23,321.05中的",") + separator: { + type: String, + default: ()=> uni.$u.props.countTo.separator + } + } +} diff --git a/uni_modules/uview-next/components/u-count-to/u-count-to.vue b/uni_modules/uview-next/components/u-count-to/u-count-to.vue new file mode 100644 index 0000000..21df980 --- /dev/null +++ b/uni_modules/uview-next/components/u-count-to/u-count-to.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-cropper/cropper.js b/uni_modules/uview-next/components/u-cropper/cropper.js new file mode 100644 index 0000000..767e5f6 --- /dev/null +++ b/uni_modules/uview-next/components/u-cropper/cropper.js @@ -0,0 +1,446 @@ +/** + * 图片裁剪核心库 - View显示版本 + * 使用view和image显示界面,只在导出时使用canvas + * 支持H5、App、微信小程序、支付宝小程序、抖音小程序 + */ + +export default class ImageCropper { + constructor(context,options) { + + this.context = context; + this.options = options || {}; + + this.canvasId = options.canvasId; + this.fileType = options.fileType || 'jpg'; + this.quality = options.quality || 0.8; + + const { windowWidth, windowHeight } = uni.$u.window(); + + // 画布尺寸(显示区域) + this.canvasWidth = options.canvasWidth || windowWidth; + this.canvasHeight = options.canvasHeight || windowHeight; + + // 输出图片配置 + this.width = options.width || 400; + this.height = options.height || 400; + + // 裁剪框配置 + this.rectWidth = options.rectWidth || 400; + this.rectHeight = options.rectHeight || 400; + + // 图片数据 + this.imgData = { + x: 0, + y: 0, + width: 0, + height: 0, + scale: 1, + angle: 0, + originalWidth: 0, + originalHeight: 0, + src: '' + }; + + // 触摸数据 + this.touch = { + startX: 0, + startY: 0, + isTouch: false, + isMove: false + }; + + // 图片加载状态 + this.imageLoaded = false; + + // 回调函数 + this.onUpdate = options.onUpdate || (() => {}); + this.triggerUpdate(); + } + + // 设置图片源 + setImage(src) { + return new Promise((resolve, reject) => { + if (!src) { + reject(new Error('图片路径不能为空')); + return; + } + + uni.getImageInfo({ + src: src, + success: (res) => { + this.imgData.src = src; + this.imgData.originalWidth = res.width; + this.imgData.originalHeight = res.height; + this.imageLoaded = true; + this.resetImageData(); + this.triggerUpdate(); + resolve(res); + }, + fail: () => reject(new Error('图片信息获取失败')) + }); + }); + } + + // 重置图片数据 + resetImageData() { + if (!this.imageLoaded) return; + + const imgWidth = this.imgData.originalWidth; + const imgHeight = this.imgData.originalHeight; + + // 计算让图片宽度或高度等于裁剪框尺寸的缩放比例 + const scaleX = this.rectWidth / imgWidth; + const scaleY = this.rectHeight / imgHeight; + // 使用较大的缩放比例,确保图片至少有一边等于裁剪框尺寸 + const scale = Math.max(scaleX, scaleY); + + // 计算裁剪框在画布中的居中位置 + const rectX = (this.canvasWidth - this.rectWidth) / 2; + const rectY = (this.canvasHeight - this.rectHeight) / 2; + + // 保持当前的旋转角度 + const currentAngle = this.imgData.angle || 0; + + this.imgData = { + ...this.imgData, + x: rectX + (this.rectWidth - imgWidth * scale) / 2, + y: rectY + (this.rectHeight - imgHeight * scale) / 2, + width: imgWidth * scale, + height: imgHeight * scale, + scale: scale, + angle: currentAngle + }; + + // 如果图片有旋转,需要重新计算边界限制 + if (currentAngle !== 0) { + this.applyBoundaryConstraints(); + } + } + + // 应用边界约束 + applyBoundaryConstraints() { + // 计算裁剪框在画布中的居中位置 + const rectX = (this.canvasWidth - this.rectWidth) / 2; + const rectY = (this.canvasHeight - this.rectHeight) / 2; + + // 获取旋转后的边界框 + const rotatedBounds = this.getRotatedBounds(); + + // 计算图片中心点相对于裁剪框的偏移范围 + const maxOffsetX = Math.max(0, (rotatedBounds.width - this.rectWidth) / 2); + const maxOffsetY = Math.max(0, (rotatedBounds.height - this.rectHeight) / 2); + + // 裁剪框中心点 + const rectCenterX = rectX + this.rectWidth / 2; + const rectCenterY = rectY + this.rectHeight / 2; + + // 当前图片中心点 + const imgCenterX = this.imgData.x + this.imgData.width / 2; + const imgCenterY = this.imgData.y + this.imgData.height / 2; + + // 限制图片中心点的移动范围 + const limitedCenterX = Math.max(rectCenterX - maxOffsetX, Math.min(rectCenterX + maxOffsetX, imgCenterX)); + const limitedCenterY = Math.max(rectCenterY - maxOffsetY, Math.min(rectCenterY + maxOffsetY, imgCenterY)); + + // 重新计算图片位置 + this.imgData.x = limitedCenterX - this.imgData.width / 2; + this.imgData.y = limitedCenterY - this.imgData.height / 2; + } + + // 计算旋转后图片的边界框 + getRotatedBounds() { + const { width, height, angle } = this.imgData; + + if (angle === 0 || angle % 360 === 0) { + return { width, height }; + } + + // 将角度转换为弧度 + const rad = (angle * Math.PI) / 180; + + // 计算旋转后的边界框 + const cos = Math.abs(Math.cos(rad)); + const sin = Math.abs(Math.sin(rad)); + + const rotatedWidth = width * cos + height * sin; + const rotatedHeight = width * sin + height * cos; + + return { + width: rotatedWidth, + height: rotatedHeight + }; + } + + // 触摸开始 + touchStart(e) { + if (!this.imageLoaded) return; + + const x = e.touches ? e.touches[0].clientX : e.clientX; + const y = e.touches ? e.touches[0].clientY : e.clientY; + + this.touch.startX = x; + this.touch.startY = y; + this.touch.isTouch = true; + this.touch.isMove = false; + } + + // 触摸移动 + touchMove(e) { + if (!this.touch.isTouch || !this.imageLoaded) return; + + e.preventDefault && e.preventDefault(); + + const x = e.touches ? e.touches[0].clientX : e.clientX; + const y = e.touches ? e.touches[0].clientY : e.clientY; + + // 单点拖拽 + const deltaX = x - this.touch.startX; + const deltaY = y - this.touch.startY; + + // 计算新的图片位置 + let newX = this.imgData.x + deltaX; + let newY = this.imgData.y + deltaY; + + // 计算裁剪框在画布中的居中位置 + const rectX = (this.canvasWidth - this.rectWidth) / 2; + const rectY = (this.canvasHeight - this.rectHeight) / 2; + + // 获取旋转后的边界框 + const rotatedBounds = this.getRotatedBounds(); + + // 计算图片中心点相对于裁剪框的偏移范围 + const maxOffsetX = Math.max(0, (rotatedBounds.width - this.rectWidth) / 2); + const maxOffsetY = Math.max(0, (rotatedBounds.height - this.rectHeight) / 2); + + // 裁剪框中心点 + const rectCenterX = rectX + this.rectWidth / 2; + const rectCenterY = rectY + this.rectHeight / 2; + + // 限制图片中心点的移动范围 + const imgCenterX = newX + this.imgData.width / 2; + const imgCenterY = newY + this.imgData.height / 2; + + const limitedCenterX = Math.max(rectCenterX - maxOffsetX, Math.min(rectCenterX + maxOffsetX, imgCenterX)); + const limitedCenterY = Math.max(rectCenterY - maxOffsetY, Math.min(rectCenterY + maxOffsetY, imgCenterY)); + + // 重新计算图片位置 + newX = limitedCenterX - this.imgData.width / 2; + newY = limitedCenterY - this.imgData.height / 2; + + this.imgData.x = newX; + this.imgData.y = newY; + + this.touch.startX = x; + this.touch.startY = y; + this.touch.isMove = true; + + this.triggerUpdate(); + } + + // 触摸结束 + touchEnd(e) { + this.touch.isTouch = false; + this.touch.isMove = false; + } + + // 缩放图片 + scaleImage(ratio) { + if (!this.imageLoaded) return; + + const newScale = this.imgData.scale * ratio; + + // 计算新的尺寸 + const newWidth = this.imgData.originalWidth * newScale; + const newHeight = this.imgData.originalHeight * newScale; + + // 限制最小缩放,确保图片至少有一边等于或大于裁剪框 + const minScaleX = this.rectWidth / this.imgData.originalWidth; + const minScaleY = this.rectHeight / this.imgData.originalHeight; + const minScale = Math.max(minScaleX, minScaleY); + + // 限制缩放范围 + if (newScale < minScale || newScale > 3) return; + + // 保存当前中心点 + const centerX = this.imgData.x + this.imgData.width / 2; + const centerY = this.imgData.y + this.imgData.height / 2; + + // 更新图片数据 + this.imgData.scale = newScale; + this.imgData.width = newWidth; + this.imgData.height = newHeight; + + // 重新计算位置,保持中心点不变 + this.imgData.x = centerX - this.imgData.width / 2; + this.imgData.y = centerY - this.imgData.height / 2; + + // 应用边界约束 + this.applyBoundaryConstraints(); + this.triggerUpdate(); + } + + // 旋转图片 + rotate(angle = 90) { + if (!this.imageLoaded) return; + + this.imgData.angle += angle; + this.imgData.angle = this.imgData.angle % 360; + + // 旋转后应用边界约束 + this.applyBoundaryConstraints(); + this.triggerUpdate(); + } + + // 重置图片 + reset() { + this.resetImageData(); + this.triggerUpdate(); + } + + loadImage(canvas,src) { + return new Promise( (resolve, reject) => { + if (this.options.type == '2d') { + var img = canvas.createImage(); + img.onload = () => { + resolve(img); + }; + img.onerror = (e) => { + reject(e); + }; + img.src = src; + } else { + resolve(src); + } + }) + } + + canvasToTempFilePath(resolve, reject, canvas) { + let params = { + canvas: canvas, + canvasId: this.canvasId, + fileType: this.fileType, + quality: this.quality, + width: this.width, + height: this.height, + success: (res) => { + resolve(res.tempFilePath) + }, + fail: (err) => { + console.error('导出图片失败:', err); + reject(err); + } + }; + // #ifdef MP-ALIPAY + uni.canvasToTempFilePath(params); + // #endif + // #ifndef MP-ALIPAY + uni.canvasToTempFilePath(params, this.context); + // #endif + } + + // 导出裁剪图片 + getCropperImage() { + + return new Promise(async (resolve, reject) => { + if (!this.imageLoaded) { + reject(new Error('图片未加载')); + return; + } + + // 计算裁剪框在画布中的居中位置 + const rectX = (this.canvasWidth - this.rectWidth) / 2; + const rectY = (this.canvasHeight - this.rectHeight) / 2; + + // 计算图片在裁剪框中的相对位置 + const imgX = this.imgData.x - rectX; + const imgY = this.imgData.y - rectY; + + // 计算缩放比例 - 导出图片尺寸 vs 裁剪框尺寸 + const scaleX = this.width / this.rectWidth; + const scaleY = this.height / this.rectHeight; + + let canvas = null; + // #ifdef MP-ALIPAY + let ctx = uni.createCanvasContext(this.canvasId); + // #endif + // #ifndef MP-ALIPAY + let ctx = uni.createCanvasContext(this.canvasId, this.context); + // #endif + + if(this.options.type == '2d'){ + canvas = await new Promise(resolve => { + uni.createSelectorQuery() + .in(this.context) + .select(`#${this.canvasId}`) + .fields({ + node: true, + size: true + }) + .exec(res => { + resolve(res[0].node); + }); + }); + + canvas.width = this.width; + canvas.height = this.height; + + ctx = canvas.getContext('2d'); + ctx.fillStyle = '#FFFFFF'; + ctx.fillRect(0, 0, this.width, this.height); + + }else{ + // 清空画布 + ctx.clearRect(0, 0, this.width, this.height); + } + + const image = await this.loadImage(canvas,this.imgData.src); + + // 计算缩放后的图片位置和尺寸 + const scaledImgX = imgX * scaleX; + const scaledImgY = imgY * scaleY; + const scaledImgWidth = this.imgData.width * scaleX; + const scaledImgHeight = this.imgData.height * scaleY; + + // 绘制图片 + if (this.imgData.angle == 0) { + ctx.drawImage(image, scaledImgX, scaledImgY, scaledImgWidth, scaledImgHeight); + } else { + ctx.save(); + ctx.translate(scaledImgX + scaledImgWidth / 2, scaledImgY + scaledImgHeight / 2); + ctx.rotate((this.imgData.angle * Math.PI) / 180); + ctx.drawImage(image, -scaledImgWidth / 2, -scaledImgHeight / 2, scaledImgWidth, scaledImgHeight); + ctx.restore(); + } + + if(this.options.type == '2d') { + this.canvasToTempFilePath(resolve, reject, canvas); + }else{ + ctx.draw(false, ()=>{ + this.canvasToTempFilePath(resolve, reject); + }); + } + }); + } + + // 触发更新回调 + triggerUpdate() { + this.onUpdate({ + imageLoaded: this.imageLoaded, + imageSrc: this.imgData.src, + imageData: { ...this.imgData }, + canvasWidth: this.canvasWidth, + canvasHeight: this.canvasHeight, + rectWidth: this.rectWidth, + rectHeight: this.rectHeight + }); + } + + // 销毁实例 + destroy() { + this.imageLoaded = false; + this.imgData = {}; + this.touch = {}; + this.options = null; + this.onUpdate = null; + } +} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-cropper/props.js b/uni_modules/uview-next/components/u-cropper/props.js new file mode 100644 index 0000000..11a59c6 --- /dev/null +++ b/uni_modules/uview-next/components/u-cropper/props.js @@ -0,0 +1,49 @@ +export default { + props: { + // 是否显示 + show: { + type: Boolean, + default: ()=> uni.$u.props.cropper.show + }, + // 裁剪框形状,circle-圆形,square-方形 + shape: { + type: String, + default: ()=> uni.$u.props.cropper.shape + }, + // 每次显示时是否自动打开选择图片 + autoChoose: { + type: Boolean, + default: ()=> uni.$u.props.cropper.autoChoose + }, + // 裁剪框宽度,单位px + rectWidth: { + type: [String, Number], + default: ()=> uni.$u.props.cropper.rectWidth + }, + // 裁剪框高度,单位px + rectHeight: { + type: [String, Number], + default: ()=> uni.$u.props.cropper.rectHeight + }, + // 输出图片宽度,单位px + width: { + type: [String, Number], + default: ()=> uni.$u.props.cropper.width + }, + // 输出图片高度,单位px + height: { + type: [String, Number], + default: ()=> uni.$u.props.cropper.height + }, + // 输出的图片类型,如果发现裁剪的图片很大,可能是因为设置为了"png",改成"jpg"即可 + fileType: { + type: String, + default: ()=> uni.$u.props.cropper.fileType + }, + // 是否显示网格线 + showGrid: { + type: Boolean, + default: ()=> uni.$u.props.cropper.showGrid + } + }, +} diff --git a/uni_modules/uview-next/components/u-cropper/u-cropper.vue b/uni_modules/uview-next/components/u-cropper/u-cropper.vue new file mode 100644 index 0000000..e60793e --- /dev/null +++ b/uni_modules/uview-next/components/u-cropper/u-cropper.vue @@ -0,0 +1,553 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-date-strip/props.js b/uni_modules/uview-next/components/u-date-strip/props.js new file mode 100644 index 0000000..4f3d89a --- /dev/null +++ b/uni_modules/uview-next/components/u-date-strip/props.js @@ -0,0 +1,122 @@ +export default { + props: { + // #ifdef VUE2 + value: { + type: Number, + default: () => uni.$u.props.dateStrip.value, + }, + // #endif + // #ifdef VUE3 + modelValue: { + type: Number, + default: () => uni.$u.props.dateStrip.modelValue, + }, + // #endif + // 默认选中的日期 + defaultDate: { + type: [String, Number], + default: () => uni.$u.props.dateStrip.defaultDate, + }, + // 切换模式:none 平铺展示所有日期,不展示切换按钮,week 按周方式切换 + mode: { + type: String, + default: () => uni.$u.props.dateStrip.mode, + }, + + // 可选择的最小日期 + minDate: { + type: Number, + default: () => uni.$u.props.dateStrip.minDate, + }, + // 可选择的最大日期 + maxDate: { + type: Number, + default: () => uni.$u.props.dateStrip.maxDate, + }, + // 插件高度 + height: { + type: String, + default: () => uni.$u.props.dateStrip.height, + }, + // 每格日期宽度, + itemWidth: { + type: String, + default: () => uni.$u.props.dateStrip.itemWidth, + }, + // 每格日期圆角, + itemRound: { + type: String, + default: () => uni.$u.props.dateStrip.itemRound, + }, + // 选中框背景色 + activeBgColor: { + type: String, + default: () => uni.$u.props.dateStrip.activeBgColor, + }, + // 选中框文本色 + activeColor: { + type: String, + default: () => uni.$u.props.dateStrip.activeColor, + }, + // 选中框样式 + activeStyle: { + type: Object, + default: () => uni.$u.props.dateStrip.activeStyle, + }, + // 横条背景色 + bgColor: { + type: String, + default: () => uni.$u.props.dateStrip.bgColor, + }, + // 选中框圆角 + round: { + type: String, + default: () => uni.$u.props.dateStrip.round, + }, + // 第一天从星期几开始,默认 0 = 周日 + firstDayOfWeek: { + type: Number, + default: () => uni.$u.props.dateStrip.firstDayOfWeek, + }, + // 高亮模式:'both' 同时高亮星期和日期,'date' 只高亮日期,'text' 只高亮文本 + activeMode: { + type: String, + default: () => uni.$u.props.dateStrip.activeMode, + }, + // 日期格式化函数 + formatter: { + type: [Function, null], + default: null, + }, + // 最多展示月份数量 + monthNum: { + type: [Number, String], + default: ()=> uni.$u.props.dateStrip.monthNum + }, + // 禁止选择的日期函数 + disabledFun: { + type: [Function, null], + default: null + }, + // 禁止选择的日期 + disabledDate: { + type: [Array, String, null], + default: ()=> uni.$u.props.dateStrip.disabledDate + }, + // 禁用日期的文字颜色 + disabledColor: { + type: String, + default: ()=> uni.$u.props.dateStrip.disabledColor + }, + // 是否显示农历 + showLunar: { + type: Boolean, + default: ()=> uni.$u.props.dateStrip.showLunar + }, + // 是否对小于10的数字补0 + padZero: { + type: Boolean, + default: ()=> uni.$u.props.dateStrip.padZero + } + }, +}; diff --git a/uni_modules/uview-next/components/u-date-strip/u-date-strip.vue b/uni_modules/uview-next/components/u-date-strip/u-date-strip.vue new file mode 100644 index 0000000..a8272b8 --- /dev/null +++ b/uni_modules/uview-next/components/u-date-strip/u-date-strip.vue @@ -0,0 +1,465 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-datetime-picker/props.js b/uni_modules/uview-next/components/u-datetime-picker/props.js new file mode 100644 index 0000000..5f19446 --- /dev/null +++ b/uni_modules/uview-next/components/u-datetime-picker/props.js @@ -0,0 +1,148 @@ +export default { + props: { + // 是否打开组件 + show: { + type: Boolean, + default: ()=> uni.$u.props.datetimePicker.show + }, + // 是否展示顶部的操作栏 + showToolbar: { + type: Boolean, + default: ()=> uni.$u.props.datetimePicker.showToolbar + }, + // 绑定值 + // #ifdef VUE2 + value: { + type: [String, Number], + default: ()=> uni.$u.props.datetimePicker.value + }, + // #endif + // #ifdef VUE3 + modelValue: { + type: [String, Number], + default: ()=> uni.$u.props.datetimePicker.value + }, + // #endif + // 顶部标题 + title: { + type: String, + default: ()=> uni.$u.props.datetimePicker.title + }, + // 展示格式,mode=date为日期选择,mode=time为时间选择,mode=year-month为年月选择,mode=datetime为日期时间选择 + mode: { + type: String, + default: ()=> uni.$u.props.datetimePicker.mode + }, + // 可选的最大时间 + maxDate: { + type: Number, + // 最大默认值为后10年 + default: ()=> uni.$u.props.datetimePicker.maxDate + }, + // 可选的最小时间 + minDate: { + type: Number, + // 最小默认值为前10年 + default: ()=> uni.$u.props.datetimePicker.minDate + }, + // 可选的最小小时,仅mode=time有效 + minHour: { + type: Number, + default: ()=> uni.$u.props.datetimePicker.minHour + }, + // 可选的最大小时,仅mode=time有效 + maxHour: { + type: Number, + default: ()=> uni.$u.props.datetimePicker.maxHour + }, + // 可选的最小分钟,仅mode=time有效 + minMinute: { + type: Number, + default: ()=> uni.$u.props.datetimePicker.minMinute + }, + // 可选的最大分钟,仅mode=time有效 + maxMinute: { + type: Number, + default: ()=> uni.$u.props.datetimePicker.maxMinute + }, + // 选项过滤函数 + filter: { + type: [Function, null], + default: null + }, + // 选项格式化函数 + formatter: { + type: [Function, null], + default: null + }, + // 是否显示加载中状态 + loading: { + type: Boolean, + default: ()=> uni.$u.props.datetimePicker.loading + }, + // 各列中,单个选项的高度 + itemHeight: { + type: [String, Number], + default: ()=> uni.$u.props.datetimePicker.itemHeight + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: ()=> uni.$u.$t('uDatetimePicker.cancelText') + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: ()=> uni.$u.$t('uDatetimePicker.confirmText') + }, + // 取消按钮的颜色 + cancelColor: { + type: String, + default: ()=> uni.$u.props.datetimePicker.cancelColor + }, + // 确认按钮的颜色 + confirmColor: { + type: String, + default: ()=> uni.$u.props.datetimePicker.confirmColor + }, + // 每列中可见选项的数量 + visibleItemCount: { + type: [String, Number], + default: ()=> uni.$u.props.datetimePicker.visibleItemCount + }, + // 是否允许点击遮罩关闭选择器 + closeOnClickOverlay: { + type: Boolean, + default: ()=> uni.$u.props.datetimePicker.closeOnClickOverlay + }, + // 各列的默认索引 + defaultIndex: { + type: Array, + default: ()=> uni.$u.props.datetimePicker.defaultIndex + }, + immediateChange: { + type: Boolean, + default: ()=> uni.$u.props.datetimePicker.immediateChange + }, + round: { + type: [String, Number], + default: ()=> uni.$u.props.datetimePicker.round + }, + format: { + type: String, + default: ()=> uni.$u.props.datetimePicker.format + }, + valueFormat: { + type: String, + default: ()=> uni.$u.props.datetimePicker.valueFormat + }, + showInput: { + type: Boolean, + default: ()=> uni.$u.props.datetimePicker.showInput + }, + inputProps:{ + type: Object, + default: ()=> uni.$u.props.datetimePicker.inputProps + } + } +} diff --git a/uni_modules/uview-next/components/u-datetime-picker/u-datetime-picker.vue b/uni_modules/uview-next/components/u-datetime-picker/u-datetime-picker.vue new file mode 100644 index 0000000..72efa98 --- /dev/null +++ b/uni_modules/uview-next/components/u-datetime-picker/u-datetime-picker.vue @@ -0,0 +1,504 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-divider/props.js b/uni_modules/uview-next/components/u-divider/props.js new file mode 100644 index 0000000..53348dc --- /dev/null +++ b/uni_modules/uview-next/components/u-divider/props.js @@ -0,0 +1,49 @@ +export default { + props: { + // 是否虚线 + dashed: { + type: Boolean, + default: ()=> uni.$u.props.divider.dashed + }, + // 是否细线 + hairline: { + type: Boolean, + default: ()=> uni.$u.props.divider.hairline + }, + // 是否以点替代文字,优先于text字段起作用 + dot: { + type: Boolean, + default: ()=> uni.$u.props.divider.dot + }, + // 内容文本的位置,left-左边,center-中间,right-右边 + position: { + type: String, + default: ()=> uni.$u.props.divider.position + }, + // 文本内容 + text: { + type: [String, Number], + default: ()=> uni.$u.props.divider.text + }, + // 文本大小 + size: { + type: [String, Number], + default: ()=> uni.$u.props.divider.size + }, + // 文本颜色 + color: { + type: String, + default: ()=> uni.$u.props.divider.color + }, + // 是否加粗 + bold: { + type: Boolean, + default: ()=> uni.$u.props.divider.bold + }, + // 线条颜色 + lineColor: { + type: String, + default: ()=> uni.$u.props.divider.lineColor + } + } +} diff --git a/uni_modules/uview-next/components/u-divider/u-divider.vue b/uni_modules/uview-next/components/u-divider/u-divider.vue new file mode 100644 index 0000000..ccd914b --- /dev/null +++ b/uni_modules/uview-next/components/u-divider/u-divider.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-draggable/props.js b/uni_modules/uview-next/components/u-draggable/props.js new file mode 100644 index 0000000..11a700a --- /dev/null +++ b/uni_modules/uview-next/components/u-draggable/props.js @@ -0,0 +1,54 @@ +export default { + props: { + // 数据列表 + list: { + type: Array, + default: ()=> uni.$u.props.draggable.list + }, + // 列数 + column: { + type: Number, + default: ()=> uni.$u.props.draggable.column + }, + // 宽高比,填写这项时gridHeight失效 + aspectRatio: { + type: Number, + default: ()=> uni.$u.props.draggable.aspectRatio + }, + // 项目高度 + itemHeight: { + type: [Number, String], + default: ()=> uni.$u.props.draggable.itemHeight + }, + // 阻尼系数 + damping: { + type: Number, + default: ()=> uni.$u.props.draggable.damping + }, + // 摩擦系数 + friction: { + type: Number, + default: ()=> uni.$u.props.draggable.friction + }, + // 是否使用手柄拖拽 + handle: { + type: Boolean, + default: ()=> uni.$u.props.draggable.handle + }, + // 是否禁用 + disabled: { + type: Boolean, + default: ()=> uni.$u.props.draggable.disabled + }, + // 是否长按拖拽 + longpress: { + type: Boolean, + default: ()=> uni.$u.props.draggable.longpress + }, + // 是否显示关闭按钮 + closeable: { + type: Boolean, + default: ()=> uni.$u.props.draggable.closeable + } + }, +} diff --git a/uni_modules/uview-next/components/u-draggable/u-draggable.vue b/uni_modules/uview-next/components/u-draggable/u-draggable.vue new file mode 100644 index 0000000..9eddb89 --- /dev/null +++ b/uni_modules/uview-next/components/u-draggable/u-draggable.vue @@ -0,0 +1,591 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-dropdown-item/props.js b/uni_modules/uview-next/components/u-dropdown-item/props.js new file mode 100644 index 0000000..bbe41bb --- /dev/null +++ b/uni_modules/uview-next/components/u-dropdown-item/props.js @@ -0,0 +1,37 @@ +export default { + props: { + // 当前选中项的value值 + // #ifdef VUE2 + value: { + type: [Number, String, Array], + default: ()=> uni.$u.props.dropdownItem.value + }, + // #endif + // #ifdef VUE3 + modelValue: { + type: [Number, String, Array], + default: ()=> uni.$u.props.dropdownItem.value + }, + // #endif + // 菜单项标题 + title: { + type: [String, Number], + default: ()=> uni.$u.props.dropdownItem.title + }, + // 选项数据,如果传入了默认slot,此参数无效 + options: { + type: Array, + default: ()=> uni.$u.props.dropdownItem.options + }, + // 是否禁用此菜单项 + disabled: { + type: Boolean, + default: ()=> uni.$u.props.dropdownItem.disabled + }, + // 下拉弹窗的高度 + height: { + type: [Number, String], + default: ()=> uni.$u.props.dropdownItem.height + } + } +} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-dropdown-item/u-dropdown-item.vue b/uni_modules/uview-next/components/u-dropdown-item/u-dropdown-item.vue new file mode 100644 index 0000000..e866ea8 --- /dev/null +++ b/uni_modules/uview-next/components/u-dropdown-item/u-dropdown-item.vue @@ -0,0 +1,139 @@ + + + + \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-dropdown/props.js b/uni_modules/uview-next/components/u-dropdown/props.js new file mode 100644 index 0000000..e8238de --- /dev/null +++ b/uni_modules/uview-next/components/u-dropdown/props.js @@ -0,0 +1,69 @@ +export default { + props: { + // 未激活时的颜色 + inactiveColor: { + type: String, + default: ()=> uni.$u.props.dropdown.inactiveColor + }, + // 激活时的颜色 + activeColor: { + type: String, + default: ()=> uni.$u.props.dropdown.activeColor + }, + // 菜单的背景颜色 + bgColor: { + type: String, + default: ()=> uni.$u.props.dropdown.bgColor + }, + // 菜单的圆角值 + round: { + type: [Number, String], + default: ()=> uni.$u.props.dropdown.round + }, + // 点击遮罩是否关闭菜单 + closeOnClickMask: { + type: Boolean, + default: ()=> uni.$u.props.dropdown.closeOnClickMask + }, + // 点击当前激活项标题是否关闭菜单 + closeOnClickSelf: { + type: Boolean, + default: ()=> uni.$u.props.dropdown.closeOnClickSelf + }, + // 过渡时间 + duration: { + type: [Number, String], + default: ()=> uni.$u.props.dropdown.duration + }, + // 标题菜单的高度 + height: { + type: [Number, String], + default: ()=> uni.$u.props.dropdown.height + }, + // 是否显示下边框 + borderBottom: { + type: Boolean, + default: ()=> uni.$u.props.dropdown.borderBottom + }, + // 标题的字体大小 + titleSize: { + type: [Number, String], + default: ()=> uni.$u.props.dropdown.titleSize + }, + // 下拉出来的内容部分的圆角值 + borderRadius: { + type: [Number, String], + default: ()=> uni.$u.props.dropdown.borderRadius + }, + // 菜单右侧的icon图标 + menuIcon: { + type: String, + default: ()=> uni.$u.props.dropdown.menuIcon + }, + // 菜单右侧图标的大小 + menuIconSize: { + type: [Number, String], + default: ()=> uni.$u.props.dropdown.menuIconSize + } + } +} diff --git a/uni_modules/uview-next/components/u-dropdown/u-dropdown.vue b/uni_modules/uview-next/components/u-dropdown/u-dropdown.vue new file mode 100644 index 0000000..d37909a --- /dev/null +++ b/uni_modules/uview-next/components/u-dropdown/u-dropdown.vue @@ -0,0 +1,291 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-ellipsis/props.js b/uni_modules/uview-next/components/u-ellipsis/props.js new file mode 100644 index 0000000..d688f1b --- /dev/null +++ b/uni_modules/uview-next/components/u-ellipsis/props.js @@ -0,0 +1,53 @@ +export default { + props: { + // 文本内容 + content: { + type: String, + default: ()=> uni.$u.props.ellipsis.content + }, + // 省略位置:start, end, middle + position: { + type: String, + default: ()=> uni.$u.props.ellipsis.position + }, + lineHeight: { + type: [Number, String], + default: ()=> uni.$u.props.ellipsis.lineHeight + }, + // 行数 + rows: { + type: [Number, String], + default: ()=> uni.$u.props.ellipsis.rows + }, + // 展开文本 + expandText: { + type: String, + default: ()=> uni.$u.props.ellipsis.expandText + }, + // 收起文本 + collapseText: { + type: String, + default: ()=> uni.$u.props.ellipsis.collapseText + }, + // 省略符号 + symbol: { + type: String, + default: ()=> uni.$u.props.ellipsis.symbol + }, + // 文本颜色 + color: { + type: String, + default: ()=> uni.$u.props.ellipsis.color + }, + // 文本大小 + fontSize: { + type: [String, Number], + default: ()=> uni.$u.props.ellipsis.fontSize + }, + // 展开/收起按钮颜色 + actionColor: { + type: String, + default: ()=> uni.$u.props.ellipsis.actionColor + } + } +} diff --git a/uni_modules/uview-next/components/u-ellipsis/u-ellipsis.vue b/uni_modules/uview-next/components/u-ellipsis/u-ellipsis.vue new file mode 100644 index 0000000..ed0af85 --- /dev/null +++ b/uni_modules/uview-next/components/u-ellipsis/u-ellipsis.vue @@ -0,0 +1,271 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-empty/props.js b/uni_modules/uview-next/components/u-empty/props.js new file mode 100644 index 0000000..49bcce3 --- /dev/null +++ b/uni_modules/uview-next/components/u-empty/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 内置图标名称,或图片路径,建议绝对路径 + icon: { + type: String, + default: ()=> uni.$u.props.empty.icon + }, + // 提示文字 + text: { + type: String, + default: ()=> uni.$u.props.empty.text + }, + // 文字颜色 + textColor: { + type: String, + default: ()=> uni.$u.props.empty.textColor + }, + // 文字大小 + textSize: { + type: [String, Number], + default: ()=> uni.$u.props.empty.textSize + }, + // 图标的颜色 + iconColor: { + type: String, + default: ()=> uni.$u.props.empty.iconColor + }, + // 图标的大小 + iconSize: { + type: [String, Number], + default: ()=> uni.$u.props.empty.iconSize + }, + // 选择预置的图标类型 + mode: { + type: String, + default: ()=> uni.$u.props.empty.mode + }, + // 图标宽度,单位px + width: { + type: [String, Number], + default: ()=> uni.$u.props.empty.width + }, + // 图标高度,单位px + height: { + type: [String, Number], + default: ()=> uni.$u.props.empty.height + }, + // 是否显示组件 + show: { + type: Boolean, + default: ()=> uni.$u.props.empty.show + }, + // 组件距离上一个元素之间的距离,默认px单位 + marginTop: { + type: [String, Number], + default: ()=> uni.$u.props.empty.marginTop + } + } +} diff --git a/uni_modules/uview-next/components/u-empty/u-empty.vue b/uni_modules/uview-next/components/u-empty/u-empty.vue new file mode 100644 index 0000000..15782de --- /dev/null +++ b/uni_modules/uview-next/components/u-empty/u-empty.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-fab/props.js b/uni_modules/uview-next/components/u-fab/props.js new file mode 100644 index 0000000..1d74406 --- /dev/null +++ b/uni_modules/uview-next/components/u-fab/props.js @@ -0,0 +1,64 @@ +export default { + props: { + // 是否激活 + active: { + type: Boolean, + default: ()=> uni.$u.props.fab.active + }, + // 类型 + type: { + type: String, + default: ()=> uni.$u.props.fab.type + }, + // 悬浮按钮位置 + position: { + type: String, + default: ()=> uni.$u.props.fab.position + }, + // 按钮拖动模式:'auto'(自动吸附)、'free'(自由拖动)、'none'(不可拖动) + draggable: { + type: String, + default: ()=> uni.$u.props.fab.draggable + }, + // 悬浮按钮菜单弹出方向 + direction: { + type: String, + default: ()=> uni.$u.props.fab.direction + }, + // 是否禁用 + disabled: { + type: Boolean, + default: ()=> uni.$u.props.fab.disabled + }, + // 悬浮按钮未展开时的图标 + inactiveIcon: { + type: String, + default: ()=> uni.$u.props.fab.inactiveIcon + }, + // 悬浮按钮展开时的图标 + activeIcon: { + type: String, + default: ()=> uni.$u.props.fab.activeIcon + }, + // 悬浮按钮大小 + size: { + type: [String, Number], + default: ()=> uni.$u.props.fab.size + }, + // 自定义悬浮按钮层级 + zIndex: { + type: [String, Number], + default: ()=> uni.$u.props.fab.zIndex + }, + // 自定义悬浮按钮与可视区域边缘的间距 + gap: { + type: Object, + default: ()=> uni.$u.props.fab.gap + }, + // 用于控制点击时是否展开菜单 + expandable: { + type: Boolean, + default: ()=> uni.$u.props.fab.expandable + } + } +} diff --git a/uni_modules/uview-next/components/u-fab/u-fab.vue b/uni_modules/uview-next/components/u-fab/u-fab.vue new file mode 100644 index 0000000..0111693 --- /dev/null +++ b/uni_modules/uview-next/components/u-fab/u-fab.vue @@ -0,0 +1,458 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-form-item/props.js b/uni_modules/uview-next/components/u-form-item/props.js new file mode 100644 index 0000000..a8eab4e --- /dev/null +++ b/uni_modules/uview-next/components/u-form-item/props.js @@ -0,0 +1,53 @@ +export default { + props: { + // input的label提示语 + label: { + type: String, + default: ()=> uni.$u.props.formItem.label + }, + // 绑定的值 + prop: { + type: String, + default: ()=> uni.$u.props.formItem.prop + }, + // 是否显示表单域的下划线边框 + borderBottom: { + type: [String, Boolean], + default: ()=> uni.$u.props.formItem.borderBottom + }, + // label的位置,left-左边,top-上边 + labelPosition: { + type: String, + default: ()=> uni.$u.props.formItem.labelPosition + }, + // label的宽度,单位px + labelWidth: { + type: [String, Number], + default: ()=> uni.$u.props.formItem.labelWidth + }, + // 右侧图标 + rightIcon: { + type: String, + default: ()=> uni.$u.props.formItem.rightIcon + }, + // 左侧图标 + leftIcon: { + type: String, + default: ()=> uni.$u.props.formItem.leftIcon + }, + // 是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置 + required: { + type: Boolean, + default: ()=> uni.$u.props.formItem.required + }, + leftIconStyle: { + type: [String, Object], + default: ()=> uni.$u.props.formItem.leftIconStyle + }, + // 验证规则 + rules: { + type: [Object, Function, Array], + default: ()=> uni.$u.props.formItem.rules + } + } +} diff --git a/uni_modules/uview-next/components/u-form-item/u-form-item.vue b/uni_modules/uview-next/components/u-form-item/u-form-item.vue new file mode 100644 index 0000000..bbe7e5e --- /dev/null +++ b/uni_modules/uview-next/components/u-form-item/u-form-item.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-form/props.js b/uni_modules/uview-next/components/u-form/props.js new file mode 100644 index 0000000..f30c41c --- /dev/null +++ b/uni_modules/uview-next/components/u-form/props.js @@ -0,0 +1,45 @@ +export default { + props: { + // 当前form的需要验证字段的集合 + model: { + type: Object, + default: ()=> uni.$u.props.form.model + }, + // 验证规则 + rules: { + type: [Object, Function, Array], + default: ()=> uni.$u.props.form.rules + }, + // 有错误时的提示方式,message-提示信息,toast-进行toast提示 + // border-bottom-下边框呈现红色,none-无提示 + errorType: { + type: String, + default: ()=> uni.$u.props.form.errorType + }, + // 是否显示表单域的下划线边框 + borderBottom: { + type: Boolean, + default: ()=> uni.$u.props.form.borderBottom + }, + // label的位置,left-左边,top-上边 + labelPosition: { + type: String, + default: ()=> uni.$u.props.form.labelPosition + }, + // label的宽度,单位px + labelWidth: { + type: [String, Number], + default: ()=> uni.$u.props.form.labelWidth + }, + // lable字体的对齐方式 + labelAlign: { + type: String, + default: ()=> uni.$u.props.form.labelAlign + }, + // lable的样式,对象形式 + labelStyle: { + type: Object, + default: ()=> uni.$u.props.form.labelStyle + } + } +} diff --git a/uni_modules/uview-next/components/u-form/u-form.vue b/uni_modules/uview-next/components/u-form/u-form.vue new file mode 100644 index 0000000..94a1732 --- /dev/null +++ b/uni_modules/uview-next/components/u-form/u-form.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-gap/props.js b/uni_modules/uview-next/components/u-gap/props.js new file mode 100644 index 0000000..f2d5a19 --- /dev/null +++ b/uni_modules/uview-next/components/u-gap/props.js @@ -0,0 +1,24 @@ +export default { + props: { + // 背景颜色(默认transparent) + bgColor: { + type: String, + default: ()=> uni.$u.props.gap.bgColor + }, + // 分割槽高度,单位px(默认30) + height: { + type: [String, Number], + default: ()=> uni.$u.props.gap.height + }, + // 与上一个组件的距离 + marginTop: { + type: [String, Number], + default: ()=> uni.$u.props.gap.marginTop + }, + // 与下一个组件的距离 + marginBottom: { + type: [String, Number], + default: ()=> uni.$u.props.gap.marginBottom + } + } +} diff --git a/uni_modules/uview-next/components/u-gap/u-gap.vue b/uni_modules/uview-next/components/u-gap/u-gap.vue new file mode 100644 index 0000000..13a23c3 --- /dev/null +++ b/uni_modules/uview-next/components/u-gap/u-gap.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-grid-item/props.js b/uni_modules/uview-next/components/u-grid-item/props.js new file mode 100644 index 0000000..e226f19 --- /dev/null +++ b/uni_modules/uview-next/components/u-grid-item/props.js @@ -0,0 +1,14 @@ +export default { + props: { + // 宫格的name + name: { + type: [String, Number, null], + default: ()=> uni.$u.props.gridItem.name + }, + // 背景颜色 + bgColor: { + type: String, + default: ()=> uni.$u.props.gridItem.bgColor + } + } +} diff --git a/uni_modules/uview-next/components/u-grid-item/u-grid-item.vue b/uni_modules/uview-next/components/u-grid-item/u-grid-item.vue new file mode 100644 index 0000000..e59c4db --- /dev/null +++ b/uni_modules/uview-next/components/u-grid-item/u-grid-item.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-grid/props.js b/uni_modules/uview-next/components/u-grid/props.js new file mode 100644 index 0000000..cbdac8b --- /dev/null +++ b/uni_modules/uview-next/components/u-grid/props.js @@ -0,0 +1,19 @@ +export default { + props: { + // 分成几列 + col: { + type: [String, Number], + default: ()=> uni.$u.props.grid.col + }, + // 是否显示边框 + border: { + type: Boolean, + default: ()=> uni.$u.props.grid.border + }, + // 宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右 + align: { + type: String, + default: ()=> uni.$u.props.grid.align + } + } +} diff --git a/uni_modules/uview-next/components/u-grid/u-grid.vue b/uni_modules/uview-next/components/u-grid/u-grid.vue new file mode 100644 index 0000000..e4f236d --- /dev/null +++ b/uni_modules/uview-next/components/u-grid/u-grid.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-icon/icons.js b/uni_modules/uview-next/components/u-icon/icons.js new file mode 100644 index 0000000..4d90f88 --- /dev/null +++ b/uni_modules/uview-next/components/u-icon/icons.js @@ -0,0 +1,221 @@ +export default { + 'uicon-arrow-upward': '\ue6cc', + 'uicon-arrow-rightward': '\ue6cd', + 'uicon-android-circle-fill': '\ue6ce', + 'uicon-apple-fill': '\ue6cf', + 'uicon-arrow-downward': '\ue6d0', + 'uicon-arrow-down': '\ue6d1', + 'uicon-android-fill': '\ue6d2', + 'uicon-account': '\ue6d3', + 'uicon-edit-pen': '\ue6ba', + 'uicon-car': '\ue6bb', + 'uicon-edit-pen-fill': '\ue6bc', + 'uicon-backspace': '\ue6bd', + 'uicon-calendar': '\ue6be', + 'uicon-arrow-right-double': '\ue6bf', + 'uicon-baidu': '\ue6c0', + 'uicon-checkmark-circle-fill': '\ue6c1', + 'uicon-bookmark-fill': '\ue6c2', + 'uicon-bookmark': '\ue6c3', + 'uicon-calendar-fill': '\ue6c4', + 'uicon-camera-fill': '\ue6c5', + 'uicon-arrow-leftward': '\ue6c6', + 'uicon-bag': '\ue6c7', + 'uicon-account-fill': '\ue6c8', + 'uicon-bag-fill': '\ue6c9', + 'uicon-arrow-left-double': '\ue6ca', + 'uicon-arrow-up': '\ue6cb', + 'uicon-empty-news': '\ue6a9', + 'uicon-column-line': '\ue6aa', + 'uicon-empty-coupon': '\ue6ab', + 'uicon-empty-list': '\ue6ac', + 'uicon-checkbox-mark': '\ue6ad', + 'uicon-close-circle': '\ue6ae', + 'uicon-chat-fill': '\ue6af', + 'uicon-email-fill': '\ue6b0', + 'uicon-close-circle-fill': '\ue6b1', + 'uicon-checkmark': '\ue6b2', + 'uicon-cut': '\ue6b3', + 'uicon-clock-fill': '\ue6b4', + 'uicon-chat': '\ue6b5', + 'uicon-empty-data': '\ue6b6', + 'uicon-chrome-circle-fill': '\ue6b7', + 'uicon-arrow-up-fill': '\ue6b8', + 'uicon-coupon-fill': '\ue6b9', + 'uicon-hourglass-half-fill': '\ue697', + 'uicon-heart-fill': '\ue698', + 'uicon-file-text': '\ue699', + 'uicon-file-text-fill': '\ue69a', + 'uicon-eye': '\ue69b', + 'uicon-empty-car': '\ue69c', + 'uicon-info-circle': '\ue69d', + 'uicon-facebook-circle-fill': '\ue69e', + 'uicon-home': '\ue69f', + 'uicon-gift': '\ue6a0', + 'uicon-gift-fill': '\ue6a1', + 'uicon-eye-off': '\ue6a2', + 'uicon-coupon': '\ue6a3', + 'uicon-error-circle-fill': '\ue6a4', + 'uicon-error-circle': '\ue6a5', + 'uicon-empty-permission': '\ue6a6', + 'uicon-empty-search': '\ue6a7', + 'uicon-empty-order': '\ue6a8', + 'uicon-grid-fill': '\ue686', + 'uicon-map-fill': '\ue687', + 'uicon-map': '\ue688', + 'uicon-man-add-fill': '\ue689', + 'uicon-integral-fill': '\ue68a', + 'uicon-hourglass': '\ue68b', + 'uicon-info-circle-fill': '\ue68c', + 'uicon-integral': '\ue68d', + 'uicon-level': '\ue68e', + 'uicon-eye-fill': '\ue68f', + 'uicon-empty-favor': '\ue690', + 'uicon-heart': '\ue691', + 'uicon-kefu-ermai': '\ue692', + 'uicon-grid': '\ue693', + 'uicon-home-fill': '\ue694', + 'uicon-github-circle-fill': '\ue695', + 'uicon-fingerprint': '\ue696', + 'uicon-minus-square-fill': '\ue67b', + 'uicon-google': '\ue67c', + 'uicon-moments': '\ue67d', + 'uicon-lock-fill': '\ue67e', + 'uicon-man': '\ue67f', + 'uicon-minus': '\ue680', + 'uicon-list': '\ue681', + 'uicon-pause': '\ue682', + 'uicon-IE-circle-fill': '\ue683', + 'uicon-more-dot-fill': '\ue684', + 'uicon-lock': '\ue685', + 'uicon-movie': '\ue674', + 'uicon-play-circle-fill': '\ue675', + 'uicon-man-add': '\ue676', + 'uicon-minus-people-fill': '\ue677', + 'uicon-mic-off': '\ue678', + 'uicon-minus-circle-fill': '\ue679', + 'uicon-list-dot': '\ue67a', + 'uicon-question-circle-fill': '\ue664', + 'uicon-pushpin-fill': '\ue665', + 'uicon-question-circle': '\ue666', + 'uicon-pause-circle-fill': '\ue667', + 'uicon-phone': '\ue668', + 'uicon-play-left': '\ue669', + 'uicon-play-circle': '\ue66a', + 'uicon-photo': '\ue66b', + 'uicon-moments-circel-fill': '\ue66c', + 'uicon-order': '\ue66d', + 'uicon-lock-open': '\ue66e', + 'uicon-plus-people-fill': '\ue66f', + 'uicon-more-circle': '\ue670', + 'uicon-phone-fill': '\ue671', + 'uicon-person-delete-fill': '\ue672', + 'uicon-man-delete': '\ue673', + 'uicon-qq-fill': '\ue651', + 'uicon-share-square': '\ue652', + 'uicon-server-man': '\ue653', + 'uicon-share-fill': '\ue654', + 'uicon-shopping-cart': '\ue655', + 'uicon-rewind-left': '\ue656', + 'uicon-rmb-circle': '\ue657', + 'uicon-play-right': '\ue658', + 'uicon-qzone-circle-fill': '\ue659', + 'uicon-scan': '\ue65a', + 'uicon-server-fill': '\ue65b', + 'uicon-plus-circle-fill': '\ue65c', + 'uicon-plus-circle': '\ue65d', + 'uicon-pushpin': '\ue65e', + 'uicon-rmb-circle-fill': '\ue65f', + 'uicon-reload': '\ue660', + 'uicon-red-packet-fill': '\ue661', + 'uicon-plus-square-fill': '\ue662', + 'uicon-photo-fill': '\ue663', + 'uicon-warning': '\ue63c', + 'uicon-zhifubao-circle-fill': '\ue63d', + 'uicon-twitter': '\uee49', + 'uicon-twitter-circle-fill': '\ue63e', + 'uicon-warning-fill': '\ue63f', + 'uicon-volume-off': '\ue640', + 'uicon-thumb-down-fill': '\ue641', + 'uicon-tags-fill': '\ue642', + 'uicon-star-fill': '\ue643', + 'uicon-weibo': '\ue644', + 'uicon-weibo-circle-fill': '\ue645', + 'uicon-taobao-circle-fill': '\ue646', + 'uicon-twitte': '\ue647', + 'uicon-shopping-cart-fill': '\ue648', + 'uicon-rewind-right-fill': '\ue649', + 'uicon-thumb-up': '\ue64a', + 'uicon-thumb-down': '\ue64b', + 'uicon-tags': '\ue64c', + 'uicon-setting-fill': '\ue64d', + 'uicon-thumb-up-fill': '\ue64e', + 'uicon-rewind-left-fill': '\ue64f', + 'uicon-skip-back-left': '\ue650', + 'uicon-zhihu': '\ue635', + 'uicon-trash': '\ue636', + 'uicon-zhihu-circle-fill': '\ue637', + 'uicon-woman': '\ue638', + 'uicon-wifi': '\ue639', + 'uicon-zh': '\ue63a', + 'uicon-zhifubao': '\ue63b', + 'uicon-arrow-left': '\ue634', + 'uicon-error': '\ue623', + 'uicon-eye-off-outline': '\ue624', + 'uicon-empty-page': '\ue625', + 'uicon-empty-history': '\ue626', + 'uicon-close': '\ue627', + 'uicon-download': '\ue628', + 'uicon-email': '\ue629', + 'uicon-clock': '\ue62a', + 'uicon-checkmark-circle': '\ue62b', + 'uicon-camera': '\ue62c', + 'uicon-car-fill': '\ue62d', + 'uicon-attach': '\ue62e', + 'uicon-bell': '\ue62f', + 'uicon-baidu-circle-fill': '\ue630', + 'uicon-bell-fill': '\ue631', + 'uicon-arrow-down-fill': '\ue632', + 'uicon-arrow-right': '\ue633', + 'uicon-google-circle-fill': '\ue612', + 'uicon-question': '\ue613', + 'uicon-qq-circle-fill': '\ue614', + 'uicon-plus': '\ue615', + 'uicon-play-left-fill': '\ue616', + 'uicon-play-right-fill': '\ue617', + 'uicon-lock-opened-fill': '\ue618', + 'uicon-pause-circle': '\ue619', + 'uicon-more-circle-fill': '\ue61a', + 'uicon-mic': '\ue61b', + 'uicon-minus-circle': '\ue61c', + 'uicon-info': '\ue61d', + 'uicon-ie': '\ue61e', + 'uicon-folder': '\ue61f', + 'uicon-facebook': '\ue620', + 'uicon-empty-address': '\ue621', + 'uicon-en': '\ue622', + 'uicon-taobao': '\ue600', + 'uicon-volume-off-fill': '\ue601', + 'uicon-weixin-fill': '\ue602', + 'uicon-weixin-circle-fill': '\ue603', + 'uicon-wifi-off': '\ue604', + 'uicon-volume-fill': '\ue605', + 'uicon-trash-fill': '\ue606', + 'uicon-search': '\ue607', + 'uicon-volume': '\ue608', + 'uicon-skip-forward-right': '\ue609', + 'uicon-star': '\ue60a', + 'uicon-qzone': '\ue60b', + 'uicon-red-packet': '\ue60c', + 'uicon-setting': '\ue60d', + 'uicon-share': '\ue60e', + 'uicon-row-line': '\ue60f', + 'uicon-rewind-right': '\ue610', + 'uicon-rmb': '\ue611', + 'uicon-douyin': '\ue6d7', + 'uicon-douyin-circle-fill': '\ue6d4', + 'uicon-rotate': '\ue6d6', + 'uicon-back': '\ue6d5', + 'uicon-revoke': '\ue6d8' +} + diff --git a/uni_modules/uview-next/components/u-icon/props.js b/uni_modules/uview-next/components/u-icon/props.js new file mode 100644 index 0000000..5d4fd52 --- /dev/null +++ b/uni_modules/uview-next/components/u-icon/props.js @@ -0,0 +1,89 @@ +export default { + props: { + // 图标类名 + name: { + type: String, + default: ()=> uni.$u.props.icon.name + }, + // 图标颜色,可接受主题色 + color: { + type: String, + default: ()=> uni.$u.props.icon.color + }, + // 字体大小,单位px + size: { + type: [String, Number], + default: ()=> uni.$u.props.icon.size + }, + // 是否显示粗体 + bold: { + type: Boolean, + default: ()=> uni.$u.props.icon.bold + }, + // 点击图标的时候传递事件出去的index(用于区分点击了哪一个) + index: { + type: [String, Number], + default: ()=> uni.$u.props.icon.index + }, + // 触摸图标时的类名 + hoverClass: { + type: String, + default: ()=> uni.$u.props.icon.hoverClass + }, + // 自定义扩展前缀,方便用户扩展自己的图标库 + customPrefix: { + type: String, + default: ()=> uni.$u.props.icon.customPrefix + }, + // 图标右边或者下面的文字 + label: { + type: [String, Number], + default: ()=> uni.$u.props.icon.label + }, + // label的位置,只能右边或者下边 + labelPos: { + type: String, + default: ()=> uni.$u.props.icon.labelPos + }, + // label的大小 + labelSize: { + type: [String, Number], + default: ()=> uni.$u.props.icon.labelSize + }, + // label的颜色 + labelColor: { + type: String, + default: ()=> uni.$u.props.icon.labelColor + }, + // label与图标的距离 + space: { + type: [String, Number], + default: ()=> uni.$u.props.icon.space + }, + // 图片的mode + imgMode: { + type: String, + default: ()=> uni.$u.props.icon.imgMode + }, + // 用于显示图片小图标时,图片的宽度 + width: { + type: [String, Number], + default: ()=> uni.$u.props.icon.width + }, + // 用于显示图片小图标时,图片的高度 + height: { + type: [String, Number], + default: ()=> uni.$u.props.icon.height + }, + // 用于解决某些情况下,让图标垂直居中的用途 + top: { + type: [String, Number], + default: ()=> uni.$u.props.icon.top + }, + // 是否阻止事件传播 + stop: { + type: Boolean, + default: ()=> uni.$u.props.icon.stop + } + } +} diff --git a/uni_modules/uview-next/components/u-icon/u-icon.vue b/uni_modules/uview-next/components/u-icon/u-icon.vue new file mode 100644 index 0000000..b7aae07 --- /dev/null +++ b/uni_modules/uview-next/components/u-icon/u-icon.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-image/props.js b/uni_modules/uview-next/components/u-image/props.js new file mode 100644 index 0000000..6099b81 --- /dev/null +++ b/uni_modules/uview-next/components/u-image/props.js @@ -0,0 +1,84 @@ +export default { + props: { + // 图片地址 + src: { + type: String, + default: ()=> uni.$u.props.image.src + }, + // 裁剪模式 + mode: { + type: String, + default: ()=> uni.$u.props.image.mode + }, + // 宽度,单位任意 + width: { + type: [String, Number], + default: ()=> uni.$u.props.image.width + }, + // 高度,单位任意 + height: { + type: [String, Number], + default: ()=> uni.$u.props.image.height + }, + // 图片形状,circle-圆形,square-方形 + shape: { + type: String, + default: ()=> uni.$u.props.image.shape + }, + // 圆角,单位任意 + round: { + type: [String, Number], + default: ()=> uni.$u.props.image.round + }, + // 是否懒加载,微信小程序、App、百度小程序、字节跳动小程序 + lazyLoad: { + type: Boolean, + default: ()=> uni.$u.props.image.lazyLoad + }, + // 开启长按图片显示识别微信小程序码菜单 + showMenuByLongpress: { + type: Boolean, + default: ()=> uni.$u.props.image.showMenuByLongpress + }, + // 加载中的图标,或者小图片 + loadingIcon: { + type: String, + default: ()=> uni.$u.props.image.loadingIcon + }, + // 加载失败的图标,或者小图片 + errorIcon: { + type: String, + default: ()=> uni.$u.props.image.errorIcon + }, + // 是否显示加载中的图标或者自定义的slot + showLoading: { + type: Boolean, + default: ()=> uni.$u.props.image.showLoading + }, + // 是否显示加载错误的图标或者自定义的slot + showError: { + type: Boolean, + default: ()=> uni.$u.props.image.showError + }, + // 是否需要淡入效果 + fade: { + type: Boolean, + default: ()=> uni.$u.props.image.fade + }, + // 只支持网络资源,只对微信小程序有效 + webp: { + type: Boolean, + default: ()=> uni.$u.props.image.webp + }, + // 过渡时间,单位ms + duration: { + type: [String, Number], + default: ()=> uni.$u.props.image.duration + }, + // 背景颜色,用于深色页面加载图片时,为了和背景色融合 + bgColor: { + type: String, + default: ()=> uni.$u.props.image.bgColor + } + } +} diff --git a/uni_modules/uview-next/components/u-image/u-image.vue b/uni_modules/uview-next/components/u-image/u-image.vue new file mode 100644 index 0000000..9af0a76 --- /dev/null +++ b/uni_modules/uview-next/components/u-image/u-image.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-index-anchor/props.js b/uni_modules/uview-next/components/u-index-anchor/props.js new file mode 100644 index 0000000..2f79035 --- /dev/null +++ b/uni_modules/uview-next/components/u-index-anchor/props.js @@ -0,0 +1,29 @@ +export default { + props: { + // 列表锚点文本内容 + text: { + type: [String, Number], + default: ()=> uni.$u.props.indexAnchor.text + }, + // 列表锚点文字颜色 + color: { + type: String, + default: ()=> uni.$u.props.indexAnchor.color + }, + // 列表锚点文字大小,单位默认px + size: { + type: [String, Number], + default: ()=> uni.$u.props.indexAnchor.size + }, + // 列表锚点背景颜色 + bgColor: { + type: String, + default: ()=> uni.$u.props.indexAnchor.bgColor + }, + // 列表锚点高度,单位默认px + height: { + type: [String, Number], + default: ()=> uni.$u.props.indexAnchor.height + } + } +} diff --git a/uni_modules/uview-next/components/u-index-anchor/u-index-anchor.vue b/uni_modules/uview-next/components/u-index-anchor/u-index-anchor.vue new file mode 100644 index 0000000..965e27a --- /dev/null +++ b/uni_modules/uview-next/components/u-index-anchor/u-index-anchor.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-index-item/props.js b/uni_modules/uview-next/components/u-index-item/props.js new file mode 100644 index 0000000..7c11331 --- /dev/null +++ b/uni_modules/uview-next/components/u-index-item/props.js @@ -0,0 +1,5 @@ +export default { + props: { + + } +} diff --git a/uni_modules/uview-next/components/u-index-item/u-index-item.vue b/uni_modules/uview-next/components/u-index-item/u-index-item.vue new file mode 100644 index 0000000..3c9de17 --- /dev/null +++ b/uni_modules/uview-next/components/u-index-item/u-index-item.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-index-list/props.js b/uni_modules/uview-next/components/u-index-list/props.js new file mode 100644 index 0000000..3cc71e4 --- /dev/null +++ b/uni_modules/uview-next/components/u-index-list/props.js @@ -0,0 +1,39 @@ +export default { + props: { + // 右边锚点非激活的颜色 + inactiveColor: { + type: String, + default() { + return uni.$u.props.indexList.inactiveColor + } + }, + // 右边锚点激活的颜色 + activeColor: { + type: String, + default() { + return uni.$u.props.indexList.activeColor + } + }, + // 索引字符列表,数组形式 + indexList: { + type: Array, + default() { + return uni.$u.props.indexList.indexList + } + }, + // 是否开启锚点自动吸顶 + sticky: { + type: Boolean, + default() { + return uni.$u.props.indexList.sticky + } + }, + // 自定义导航栏的高度 + customNavHeight: { + type: [String, Number], + default() { + return uni.$u.props.indexList.customNavHeight + } + } + } +} diff --git a/uni_modules/uview-next/components/u-index-list/u-index-list.vue b/uni_modules/uview-next/components/u-index-list/u-index-list.vue new file mode 100644 index 0000000..b8faea7 --- /dev/null +++ b/uni_modules/uview-next/components/u-index-list/u-index-list.vue @@ -0,0 +1,449 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-input/props.js b/uni_modules/uview-next/components/u-input/props.js new file mode 100644 index 0000000..e048100 --- /dev/null +++ b/uni_modules/uview-next/components/u-input/props.js @@ -0,0 +1,213 @@ +export default { + props: { + // 输入的值 + value: { + type: [String, Number], + default: ()=> uni.$u.props.input.value + }, + // #ifdef VUE3 + modelValue: { + type: [String, Number], + default: ()=> uni.$u.props.input.value + }, + // #endif + // 输入框类型 + // number-数字输入键盘,app-vue下可以输入浮点数,app-nvue和小程序平台下只能输入整数 + // idcard-身份证输入键盘,微信、支付宝、百度、QQ小程序 + // digit-带小数点的数字键盘,App的nvue页面、微信、支付宝、百度、头条、QQ小程序 + // text-文本输入键盘 + type: { + type: String, + default: ()=> uni.$u.props.input.type + }, + // 如果 textarea 是在一个 position:fixed 的区域,需要显示指定属性 fixed 为 true, + // 兼容性:微信小程序、百度小程序、字节跳动小程序、QQ小程序 + fixed: { + type: Boolean, + default: ()=> uni.$u.props.input.fixed + }, + // 是否禁用输入框 + disabled: { + type: Boolean, + default: ()=> uni.$u.props.input.disabled + }, + // 禁用状态时的背景色 + disabledColor: { + type: String, + default: ()=> uni.$u.props.input.disabledColor + }, + // 是否显示清除控件 + clearable: { + type: Boolean, + default: ()=> uni.$u.props.input.clearable + }, + // 是否密码类型 + password: { + type: Boolean, + default: ()=> uni.$u.props.input.password + }, + // 最大输入长度,设置为 -1 的时候不限制最大长度 + maxlength: { + type: [String, Number], + default: ()=> uni.$u.props.input.maxlength + }, + // 输入框为空时的占位符 + placeholder: { + type: String, + default: ()=> uni.$u.props.input.placeholder + }, + // 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/ + placeholderClass: { + type: String, + default: ()=> uni.$u.props.input.placeholderClass + }, + // 指定placeholder的样式 + placeholderStyle: { + type: [String, Object], + default: ()=> uni.$u.props.input.placeholderStyle + }, + // 设置右下角按钮的文字,有效值:send|search|next|go|done,兼容性详见uni-app文档 + // https://uniapp.dcloud.io/component/input + // https://uniapp.dcloud.io/component/textarea + confirmType: { + type: String, + default: ()=> uni.$u.props.input.confirmType + }, + // 点击键盘右下角按钮时是否保持键盘不收起,H5无效 + confirmHold: { + type: Boolean, + default: ()=> uni.$u.props.input.confirmHold + }, + // focus时,点击页面的时候不收起键盘,微信小程序有效 + holdKeyboard: { + type: Boolean, + default: ()=> uni.$u.props.input.holdKeyboard + }, + // 自动获取焦点 + // 在 H5 平台能否聚焦以及软键盘是否跟随弹出,取决于当前浏览器本身的实现。nvue 页面不支持,需使用组件的 focus()、blur() 方法控制焦点 + focus: { + type: Boolean, + default: ()=> uni.$u.props.input.focus + }, + // 键盘收起时,是否自动失去焦点,目前仅App3.0.0+有效 + autoBlur: { + type: Boolean, + default: ()=> uni.$u.props.input.autoBlur + }, + // 是否去掉 iOS 下的默认内边距,仅微信小程序,且type=textarea时有效 + disableDefaultPadding: { + type: Boolean, + default: ()=> uni.$u.props.input.disableDefaultPadding + }, + // 强制 input 处于同层状态,默认 focus 时 input 会切到非同层状态 ( 默认 false ) + alwaysEmbed: { + type: [Boolean], + default: ()=> uni.$u.props.input.alwaysEmbed + }, + // 指定focus时光标的位置 + cursor: { + type: [String, Number], + default: ()=> uni.$u.props.input.cursor + }, + // 输入框聚焦时底部与键盘的距离 + cursorSpacing: { + type: [String, Number], + default: ()=> uni.$u.props.input.cursorSpacing + }, + // 光标起始位置,自动聚集时有效,需与selection-end搭配使用 + selectionStart: { + type: [String, Number], + default: ()=> uni.$u.props.input.selectionStart + }, + // 光标结束位置,自动聚集时有效,需与selection-start搭配使用 + selectionEnd: { + type: [String, Number], + default: ()=> uni.$u.props.input.selectionEnd + }, + // 键盘弹起时,是否自动上推页面 + adjustPosition: { + type: Boolean, + default: ()=> uni.$u.props.input.adjustPosition + }, + // 输入框内容对齐方式,可选值为:left|center|right + inputAlign: { + type: String, + default: ()=> uni.$u.props.input.inputAlign + }, + // 输入框字体的大小 + fontSize: { + type: [String, Number], + default: ()=> uni.$u.props.input.fontSize + }, + // 输入框字体颜色 + color: { + type: String, + default: ()=> uni.$u.props.input.color + }, + // 输入框前置图标 + prefixIcon: { + type: String, + default: ()=> uni.$u.props.input.prefixIcon + }, + // 前置图标样式,对象或字符串 + prefixIconStyle: { + type: [String, Object], + default: ()=> uni.$u.props.input.prefixIconStyle + }, + // 输入框后置图标 + suffixIcon: { + type: String, + default: ()=> uni.$u.props.input.suffixIcon + }, + // 后置图标样式,对象或字符串 + suffixIconStyle: { + type: [String, Object], + default: ()=> uni.$u.props.input.suffixIconStyle + }, + // 边框类型,surround-四周边框,bottom-底部边框,none-无边框 + border: { + type: String, + default: ()=> uni.$u.props.input.border + }, + // 是否只读,与disabled不同之处在于disabled会置灰组件,而readonly则不会 + readonly: { + type: Boolean, + default: ()=> uni.$u.props.input.readonly + }, + // 输入框形状,circle-圆形,square-方形 + shape: { + type: String, + default: ()=> uni.$u.props.input.shape + }, + // 用于处理或者过滤输入框内容的方法 + formatter: { + type: [Function, null], + default: null + }, + // 是否忽略组件内对文本合成系统事件的处理 + ignoreCompositionEvent: { + type: Boolean, + default: ()=> uni.$u.props.input.ignoreCompositionEvent + }, + // 背景颜色 + backgroundColor: { + type: String, + default: ()=> uni.$u.props.input.backgroundColor + }, + // 边框圆角 + round: { + type: String, + default: ()=> uni.$u.props.input.round + }, + // 边框颜色 + borderColor: { + type: String, + default: ()=> uni.$u.props.input.borderColor + }, + // 指定focus时光标颜色 + cursorColor: { + type: String, + default: ()=> uni.$u.props.input.cursorColor + } + } +} diff --git a/uni_modules/uview-next/components/u-input/u-input.vue b/uni_modules/uview-next/components/u-input/u-input.vue new file mode 100644 index 0000000..978767d --- /dev/null +++ b/uni_modules/uview-next/components/u-input/u-input.vue @@ -0,0 +1,406 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-keyboard/props.js b/uni_modules/uview-next/components/u-keyboard/props.js new file mode 100644 index 0000000..a59aa3c --- /dev/null +++ b/uni_modules/uview-next/components/u-keyboard/props.js @@ -0,0 +1,89 @@ +export default { + props: { + // 键盘的类型,number-数字键盘,card-身份证键盘,car-车牌号键盘 + mode: { + type: String, + default: ()=> uni.$u.props.keyboard.mode + }, + // 是否显示键盘的"."符号 + dotDisabled: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.dotDisabled + }, + // 是否显示顶部工具条 + tooltip: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.tooltip + }, + // 是否显示工具条中间的提示 + showTips: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.showTips + }, + // 工具条中间的提示文字 + tips: { + type: String, + default: ()=> uni.$u.props.keyboard.tips + }, + // 是否显示工具条左边的"取消"按钮 + showCancel: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.showCancel + }, + // 是否显示工具条右边的"完成"按钮 + showConfirm: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.showConfirm + }, + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.random + }, + // 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距 + safeAreaInsetBottom: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.safeAreaInsetBottom + }, + // 是否允许通过点击遮罩关闭键盘 + closeOnClickOverlay: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.closeOnClickOverlay + }, + // 控制键盘的弹出与收起 + show: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.show + }, + // 是否显示遮罩,某些时候数字键盘时,用户希望看到自己的数值,所以可能不想要遮罩 + overlay: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.overlay + }, + // z-index值 + zIndex: { + type: [String, Number], + default: ()=> uni.$u.props.keyboard.zIndex + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: ()=> uni.$u.$t('uKeyboard.cancelText') + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: ()=> uni.$u.$t('uKeyboard.confirmText') + }, + // 输入一个中文后,是否自动切换到英文 + autoChange: { + type: Boolean, + default: ()=> uni.$u.props.keyboard.autoChange + }, + // 自定义样式,对象形式 + customStyle: { + type: Object, + default: ()=> uni.$u.props.keyboard.customStyle + } + } +} diff --git a/uni_modules/uview-next/components/u-keyboard/u-keyboard.vue b/uni_modules/uview-next/components/u-keyboard/u-keyboard.vue new file mode 100644 index 0000000..01abb45 --- /dev/null +++ b/uni_modules/uview-next/components/u-keyboard/u-keyboard.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-lazy-load/props.js b/uni_modules/uview-next/components/u-lazy-load/props.js new file mode 100644 index 0000000..88b05f1 --- /dev/null +++ b/uni_modules/uview-next/components/u-lazy-load/props.js @@ -0,0 +1,60 @@ +export default { + props: { + index: { + type: [Number, String], + default: ()=> uni.$u.props.lazyLoad.index + }, + // 要显示的图片 + image: { + type: String, + default: ()=> uni.$u.props.lazyLoad.image + }, + // 图片裁剪模式 + mode: { + type: String, + default: ()=> uni.$u.props.lazyLoad.mode + }, + // 占位图片路径 + loadingImg: { + type: String, + default: ()=> uni.$u.props.lazyLoad.loadingImg + }, + // 加载失败的错误占位图 + errorImg: { + type: String, + default: ()=> uni.$u.props.lazyLoad.errorImg + }, + // 图片进入可见区域前多少像素时,单位rpx,开始加载图片 + // 负数为图片超出屏幕底部多少距离后触发懒加载,正数为图片顶部距离屏幕底部多少距离时触发(图片还没出现在屏幕上) + threshold: { + type: [Number, String], + default: ()=> uni.$u.props.lazyLoad.threshold + }, + // 淡入淡出动画的过渡时间 + duration: { + type: [Number, String], + default: ()=> uni.$u.props.lazyLoad.duration + }, + // 渡效果的速度曲线,各个之间差别不大,因为这是淡入淡出,且时间很短,不是那些变形或者移动的情况,会明显 + // linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n); + effect: { + type: String, + default: ()=> uni.$u.props.lazyLoad.effect + }, + // 是否使用过渡效果 + isEffect: { + type: Boolean, + default: ()=> uni.$u.props.lazyLoad.isEffect + }, + // 圆角值 + round: { + type: [Number, String], + default: ()=> uni.$u.props.lazyLoad.round + }, + // 图片高度,单位rpx + height: { + type: [Number, String], + default: ()=> uni.$u.props.lazyLoad.height + } + } +} diff --git a/uni_modules/uview-next/components/u-lazy-load/u-lazy-load.vue b/uni_modules/uview-next/components/u-lazy-load/u-lazy-load.vue new file mode 100644 index 0000000..5ab38d5 --- /dev/null +++ b/uni_modules/uview-next/components/u-lazy-load/u-lazy-load.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-line-progress/props.js b/uni_modules/uview-next/components/u-line-progress/props.js new file mode 100644 index 0000000..9f20dcd --- /dev/null +++ b/uni_modules/uview-next/components/u-line-progress/props.js @@ -0,0 +1,28 @@ +export default { + props: { + // 激活部分的颜色 + activeColor: { + type: String, + default: ()=> uni.$u.props.lineProgress.activeColor + }, + inactiveColor: { + type: String, + default: ()=> uni.$u.props.lineProgress.color + }, + // 进度百分比,数值 + percentage: { + type: [String, Number], + default: ()=> uni.$u.props.lineProgress.inactiveColor + }, + // 是否在进度条内部显示百分比的值 + showText: { + type: Boolean, + default: ()=> uni.$u.props.lineProgress.showText + }, + // 进度条的高度,单位px + height: { + type: [String, Number], + default: ()=> uni.$u.props.lineProgress.height + } + } +} diff --git a/uni_modules/uview-next/components/u-line-progress/u-line-progress.vue b/uni_modules/uview-next/components/u-line-progress/u-line-progress.vue new file mode 100644 index 0000000..9e5229e --- /dev/null +++ b/uni_modules/uview-next/components/u-line-progress/u-line-progress.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-line/props.js b/uni_modules/uview-next/components/u-line/props.js new file mode 100644 index 0000000..9f57036 --- /dev/null +++ b/uni_modules/uview-next/components/u-line/props.js @@ -0,0 +1,33 @@ +export default { + props: { + color: { + type: [String, null], + default: ()=> uni.$u.props.line.color + }, + // 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带px单位的值等 + length: { + type: [String, Number], + default: ()=> uni.$u.props.line.length + }, + // 线条方向,col-竖向,row-横向 + direction: { + type: String, + default: ()=> uni.$u.props.line.direction + }, + // 是否显示细边框 + hairline: { + type: Boolean, + default: ()=> uni.$u.props.line.hairline + }, + // 线条与上下左右元素的间距,字符串形式,如"30px"、"20px 30px" + margin: { + type: [String, Number], + default: ()=> uni.$u.props.line.margin + }, + // 是否虚线,true-虚线,false-实线 + dashed: { + type: Boolean, + default: ()=> uni.$u.props.line.dashed + } + } +} diff --git a/uni_modules/uview-next/components/u-line/u-line.vue b/uni_modules/uview-next/components/u-line/u-line.vue new file mode 100644 index 0000000..61d2f76 --- /dev/null +++ b/uni_modules/uview-next/components/u-line/u-line.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-link/props.js b/uni_modules/uview-next/components/u-link/props.js new file mode 100644 index 0000000..a4b74c2 --- /dev/null +++ b/uni_modules/uview-next/components/u-link/props.js @@ -0,0 +1,39 @@ +export default { + props: { + // 文字颜色 + color: { + type: String, + default: ()=> uni.$u.props.link.color + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: ()=> uni.$u.props.link.fontSize + }, + // 是否显示下划线 + underLine: { + type: Boolean, + default: ()=> uni.$u.props.link.underLine + }, + // 要跳转的链接 + href: { + type: String, + default: ()=> uni.$u.props.link.href + }, + // 小程序中复制到粘贴板的提示语 + mpTips: { + type: String, + default: ()=> uni.$u.$t('uLink.mpTips') + }, + // 下划线颜色 + lineColor: { + type: String, + default: ()=> uni.$u.props.link.lineColor + }, + // 超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色 + text: { + type: [String, null], + default: ()=> uni.$u.props.link.text + } + } +} diff --git a/uni_modules/uview-next/components/u-link/u-link.vue b/uni_modules/uview-next/components/u-link/u-link.vue new file mode 100644 index 0000000..caca01b --- /dev/null +++ b/uni_modules/uview-next/components/u-link/u-link.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-list-item/props.js b/uni_modules/uview-next/components/u-list-item/props.js new file mode 100644 index 0000000..8fb9211 --- /dev/null +++ b/uni_modules/uview-next/components/u-list-item/props.js @@ -0,0 +1,9 @@ +export default { + props: { + // 用于滚动到指定item + anchor: { + type: [String, Number], + default: ()=> uni.$u.props.listItem.anchor + } + } +} diff --git a/uni_modules/uview-next/components/u-list-item/u-list-item.vue b/uni_modules/uview-next/components/u-list-item/u-list-item.vue new file mode 100644 index 0000000..7f38aa7 --- /dev/null +++ b/uni_modules/uview-next/components/u-list-item/u-list-item.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-list/props.js b/uni_modules/uview-next/components/u-list/props.js new file mode 100644 index 0000000..f87d8d5 --- /dev/null +++ b/uni_modules/uview-next/components/u-list/props.js @@ -0,0 +1,74 @@ +export default { + props: { + // 控制是否出现滚动条,仅nvue有效 + showScrollbar: { + type: Boolean, + default: ()=> uni.$u.props.list.showScrollbar + }, + // 距底部多少时触发scrolltolower事件 + lowerThreshold: { + type: [String, Number], + default: ()=> uni.$u.props.list.lowerThreshold + }, + // 距顶部多少时触发scrolltoupper事件,非nvue有效 + upperThreshold: { + type: [String, Number], + default: ()=> uni.$u.props.list.upperThreshold + }, + // 设置竖向滚动条位置 + scrollTop: { + type: [String, Number], + default: ()=> uni.$u.props.list.scrollTop + }, + // 控制 onscroll 事件触发的频率,仅nvue有效 + offsetAccuracy: { + type: [String, Number], + default: ()=> uni.$u.props.list.offsetAccuracy + }, + // 启用 flexbox 布局。开启后,当前节点声明了display: flex就会成为flex container,并作用于其孩子节点,仅微信小程序有效 + enableFlex: { + type: Boolean, + default: ()=> uni.$u.props.list.enableFlex + }, + // 是否按分页模式显示List,默认值false + pagingEnabled: { + type: Boolean, + default: ()=> uni.$u.props.list.pagingEnabled + }, + // 是否允许List滚动 + scrollable: { + type: Boolean, + default: ()=> uni.$u.props.list.scrollable + }, + // 值应为某子元素id(id不能以数字开头) + scrollIntoView: { + type: String, + default: ()=> uni.$u.props.list.scrollIntoView + }, + // 在设置滚动条位置时使用动画过渡 + scrollWithAnimation: { + type: Boolean, + default: ()=> uni.$u.props.list.scrollWithAnimation + }, + // iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只对微信小程序有效 + enableBackToTop: { + type: Boolean, + default: ()=> uni.$u.props.list.enableBackToTop + }, + // 列表的高度 + height: { + type: [String, Number], + default: ()=> uni.$u.props.list.height + }, + // 列表宽度 + width: { + type: [String, Number], + default: ()=> uni.$u.props.list.width + }, + // 列表前后预渲染的屏数,1代表一个屏幕的高度,1.5代表1个半屏幕高度 + preLoadScreen: { + type: [String, Number], + default: ()=> uni.$u.props.list.preLoadScreen + } + } +} diff --git a/uni_modules/uview-next/components/u-list/u-list.vue b/uni_modules/uview-next/components/u-list/u-list.vue new file mode 100644 index 0000000..5bd9bfa --- /dev/null +++ b/uni_modules/uview-next/components/u-list/u-list.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-loading-icon/props.js b/uni_modules/uview-next/components/u-loading-icon/props.js new file mode 100644 index 0000000..79c5011 --- /dev/null +++ b/uni_modules/uview-next/components/u-loading-icon/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 是否显示组件 + show: { + type: Boolean, + default: () => uni.$u.props.loadingIcon.show + }, + // 颜色 + color: { + type: String, + default: () => uni.$u.props.loadingIcon.color + }, + // 提示文字颜色 + textColor: { + type: String, + default: () => uni.$u.props.loadingIcon.textColor + }, + // 文字和图标是否垂直排列 + vertical: { + type: Boolean, + default: () => uni.$u.props.loadingIcon.vertical + }, + // 模式选择,circle-圆形,spinner-花朵形,semicircle-半圆形 + mode: { + type: String, + default: () => uni.$u.props.loadingIcon.mode + }, + // 图标大小,单位默认px + size: { + type: [String, Number], + default: () => uni.$u.props.loadingIcon.size + }, + // 文字大小 + textSize: { + type: [String, Number], + default: () => uni.$u.props.loadingIcon.textSize + }, + // 文字内容 + text: { + type: [String, Number], + default: () => uni.$u.props.loadingIcon.text + }, + // 动画模式 + timingFunction: { + type: String, + default: () => uni.$u.props.loadingIcon.timingFunction + }, + // 动画执行周期时间 + duration: { + type: [String, Number], + default: () => uni.$u.props.loadingIcon.duration + }, + // mode=circle时的暗边颜色 + inactiveColor: { + type: String, + default: () => uni.$u.props.loadingIcon.inactiveColor + } + } +} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-loading-icon/u-loading-icon.vue b/uni_modules/uview-next/components/u-loading-icon/u-loading-icon.vue new file mode 100644 index 0000000..2b9fa9f --- /dev/null +++ b/uni_modules/uview-next/components/u-loading-icon/u-loading-icon.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-loading-page/props.js b/uni_modules/uview-next/components/u-loading-page/props.js new file mode 100644 index 0000000..eff7026 --- /dev/null +++ b/uni_modules/uview-next/components/u-loading-page/props.js @@ -0,0 +1,49 @@ +export default { + props: { + // 提示内容 + loadingText: { + type: [String, Number], + default: () => uni.$u.$t('uLoadingPage.loadingText') + }, + // 文字上方用于替换loading动画的图片 + image: { + type: String, + default: () => uni.$u.props.loadingPage.image + }, + // 加载动画的模式,circle-圆形,spinner-花朵形,semicircle-半圆形 + loadingMode: { + type: String, + default: () => uni.$u.props.loadingPage.loadingMode + }, + // 是否加载中 + loading: { + type: Boolean, + default: () => uni.$u.props.loadingPage.loading + }, + // 背景色 + bgColor: { + type: String, + default: () => uni.$u.props.loadingPage.bgColor + }, + // 文字颜色 + color: { + type: String, + default: () => uni.$u.props.loadingPage.color + }, + // 文字大小 + fontSize: { + type: [String, Number], + default: () => uni.$u.props.loadingPage.fontSize + }, + // 图标大小 + iconSize: { + type: [String, Number], + default: () => uni.$u.props.loadingPage.fontSize + }, + // 加载中图标的颜色,只能rgb或者十六进制颜色值 + loadingColor: { + type: [String, null], + default: () => uni.$u.props.loadingPage.loadingColor + } + } +} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-loading-page/u-loading-page.vue b/uni_modules/uview-next/components/u-loading-page/u-loading-page.vue new file mode 100644 index 0000000..22fb187 --- /dev/null +++ b/uni_modules/uview-next/components/u-loading-page/u-loading-page.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-loadmore/props.js b/uni_modules/uview-next/components/u-loadmore/props.js new file mode 100644 index 0000000..c57ebd2 --- /dev/null +++ b/uni_modules/uview-next/components/u-loadmore/props.js @@ -0,0 +1,94 @@ +export default { + props: { + // 组件状态,loadmore-加载前的状态,loading-加载中的状态,nomore-没有更多的状态 + status: { + type: String, + default: ()=> uni.$u.props.loadmore.status + }, + // 组件背景色 + bgColor: { + type: String, + default: ()=> uni.$u.props.loadmore.bgColor + }, + // 是否显示加载中的图标 + icon: { + type: Boolean, + default: ()=> uni.$u.props.loadmore.icon + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: ()=> uni.$u.props.loadmore.fontSize + }, + // 图标大小 + iconSize: { + type: [String, Number], + default: ()=> uni.$u.props.loadmore.iconSize + }, + // 字体颜色 + color: { + type: String, + default: ()=> uni.$u.props.loadmore.color + }, + // 加载中状态的图标,spinner-花朵状图标,circle-圆圈状,semicircle-半圆 + loadingIcon: { + type: String, + default: ()=> uni.$u.props.loadmore.loadingIcon + }, + // 加载前的提示语 + loadmoreText: { + type: String, + default: ()=> uni.$u.$t('uLoadmore.loadmoreText') + }, + // 加载中提示语 + loadingText: { + type: String, + default: ()=> uni.$u.$t('uLoadmore.loadingText') + }, + // 没有更多的提示语 + nomoreText: { + type: String, + default: ()=> uni.$u.$t('uLoadmore.nomoreText') + }, + // 在“没有更多”状态下,是否显示粗点 + isDot: { + type: Boolean, + default: ()=> uni.$u.props.loadmore.isDot + }, + // 加载中图标的颜色 + iconColor: { + type: String, + default: ()=> uni.$u.props.loadmore.iconColor + }, + // 上边距 + marginTop: { + type: [String, Number], + default: ()=> uni.$u.props.loadmore.marginTop + }, + // 下边距 + marginBottom: { + type: [String, Number], + default: ()=> uni.$u.props.loadmore.marginBottom + }, + // 高度,单位px + height: { + type: [String, Number], + default: ()=> uni.$u.props.loadmore.height + }, + // 是否显示左边分割线 + line: { + type: Boolean, + default: ()=> uni.$u.props.loadmore.line + }, + // 线条颜色 + lineColor: { + type: String, + default: ()=> uni.$u.props.loadmore.lineColor + }, + // 是否虚线,true-虚线,false-实线 + dashed: { + type: Boolean, + default: ()=> uni.$u.props.loadmore.dashed + } + } +} diff --git a/uni_modules/uview-next/components/u-loadmore/u-loadmore.vue b/uni_modules/uview-next/components/u-loadmore/u-loadmore.vue new file mode 100644 index 0000000..21d2b58 --- /dev/null +++ b/uni_modules/uview-next/components/u-loadmore/u-loadmore.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-markdown/highlight/atom-one-dark.css b/uni_modules/uview-next/components/u-markdown/highlight/atom-one-dark.css new file mode 100644 index 0000000..5344ee3 --- /dev/null +++ b/uni_modules/uview-next/components/u-markdown/highlight/atom-one-dark.css @@ -0,0 +1 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#c678dd}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#98c379}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#d19a66}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-markdown/highlight/atom-one-light.css b/uni_modules/uview-next/components/u-markdown/highlight/atom-one-light.css new file mode 100644 index 0000000..df0268a --- /dev/null +++ b/uni_modules/uview-next/components/u-markdown/highlight/atom-one-light.css @@ -0,0 +1 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#c18401}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-markdown/highlight/github-dark.min.css b/uni_modules/uview-next/components/u-markdown/highlight/github-dark.min.css new file mode 100644 index 0000000..03b6da8 --- /dev/null +++ b/uni_modules/uview-next/components/u-markdown/highlight/github-dark.min.css @@ -0,0 +1,10 @@ +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! + Theme: GitHub Dark + Description: Dark theme as seen on github.com + Author: github.com + Maintainer: @Hirse + Updated: 2021-05-15 + + Outdated base version: https://github.com/primer/github-syntax-dark + Current colors taken from GitHub's CSS +*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-markdown/highlight/uni-highlight.min.js b/uni_modules/uview-next/components/u-markdown/highlight/uni-highlight.min.js new file mode 100644 index 0000000..2f341fa --- /dev/null +++ b/uni_modules/uview-next/components/u-markdown/highlight/uni-highlight.min.js @@ -0,0 +1,5254 @@ +/* + Highlight.js v11.7.0 + (c) 2006-2022 undefined and other contributors + License: BSD-3-Clause + */ +var e = { + exports: {} +}; +function n(e) { + return e instanceof Map ? e.clear = e.delete = e.set = () => { + throw Error("map is read-only") + } : e instanceof Set && (e.add = e.clear = e.delete = () => { + throw Error("set is read-only") + }), Object.freeze(e), Object.getOwnPropertyNames(e).forEach((t => { + var a = e[t]; + "object" != typeof a || Object.isFrozen(a) || n(a) + })), e +} +e.exports = n, e.exports.default = n; +class t { + constructor(e) { + void 0 === e.data && (e.data = {}), this.data = e.data, this.isMatchIgnored = !1 + } + ignoreMatch() { + this.isMatchIgnored = !0 + } +} + +function a(e) { + return e.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, + "'") +} + +function i(e, ...n) { + const t = Object.create(null); + for (const n in e) t[n] = e[n]; + return n.forEach((e => { + for (const n in e) t[n] = e[n] + })), t +} +const r = e => !!e.scope || e.sublanguage && e.language; +class s { + constructor(e, n) { + this.buffer = "", this.classPrefix = n.classPrefix, e.walk(this) + } + addText(e) { + this.buffer += a(e) + } + openNode(e) { + if (!r(e)) return; + let n = ""; + n = e.sublanguage ? "language-" + e.language : ((e, { + prefix: n + }) => { + if (e.includes(".")) { + const t = e.split("."); + return [`${n}${t.shift()}`, ...t.map(((e, n) => `${e}${"_".repeat(n+1)}`))].join(" ") + } + return `${n}${e}` + })(e.scope, { + prefix: this.classPrefix + }), this.span(n) + } + closeNode(e) { + r(e) && (this.buffer += "") + } + value() { + return this.buffer + } + span(e) { + this.buffer += `` + } +} +const o = (e = {}) => { + const n = { + children: [] + }; + return Object.assign(n, e), n +}; +class l { + constructor() { + this.rootNode = o(), this.stack = [this.rootNode] + } + get top() { + return this.stack[this.stack.length - 1] + } + get root() { + return this.rootNode + } + add(e) { + this.top.children.push(e) + } + openNode(e) { + const n = o({ + scope: e + }); + this.add(n), this.stack.push(n) + } + closeNode() { + if (this.stack.length > 1) return this.stack.pop() + } + closeAllNodes() { + for (; this.closeNode();); + } + toJSON() { + return JSON.stringify(this.rootNode, null, 4) + } + walk(e) { + return this.constructor._walk(e, this.rootNode) + } + static _walk(e, n) { + return "string" == typeof n ? e.addText(n) : n.children && (e.openNode(n), + n.children.forEach((n => this._walk(e, n))), e.closeNode(n)), e + } + static _collapse(e) { + "string" != typeof e && e.children && (e.children.every((e => "string" == typeof e)) ? e.children = [e.children + .join("") + ] : e.children.forEach((e => { + l._collapse(e) + }))) + } +} +class c extends l { + constructor(e) { + super(), this.options = e + } + addKeyword(e, n) { + "" !== e && (this.openNode(n), this.addText(e), this.closeNode()) + } + addText(e) { + "" !== e && this.add(e) + } + addSublanguage(e, n) { + const t = e.root; + t.sublanguage = !0, t.language = n, this.add(t) + } + toHTML() { + return new s(this, this.options).value() + } + finalize() { + return !0 + } +} + +function d(e) { + return e ? "string" == typeof e ? e : e.source : null +} + +function g(e) { + return m("(?=", e, ")") +} + +function u(e) { + return m("(?:", e, ")*") +} + +function b(e) { + return m("(?:", e, ")?") +} + +function m(...e) { + return e.map((e => d(e))).join("") +} + +function p(...e) { + const n = (e => { + const n = e[e.length - 1]; + return "object" == typeof n && n.constructor === Object ? (e.splice(e.length - 1, 1), n) : {} + })(e); + return "(" + (n.capture ? "" : "?:") + e.map((e => d(e))).join("|") + ")" +} + +function _(e) { + return RegExp(e.toString() + "|").exec("").length - 1 +} +const h = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; + +function f(e, { + joinWith: n +}) { + let t = 0; + return e.map((e => { + t += 1; + const n = t; + let a = d(e), + i = ""; + for (; a.length > 0;) { + const e = h.exec(a); + if (!e) { + i += a; + break + } + i += a.substring(0, e.index), + a = a.substring(e.index + e[0].length), "\\" === e[0][0] && e[1] ? i += "\\" + (Number(e[1]) + n) : (i += + e[0], + "(" === e[0] && t++) + } + return i + })).map((e => `(${e})`)).join(n) +} +const E = "(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)", + y = { + begin: "\\\\[\\s\\S]", + relevance: 0 + }, + w = { + scope: "string", + begin: "'", + end: "'", + illegal: "\\n", + contains: [y] + }, + N = { + scope: "string", + begin: '"', + end: '"', + illegal: "\\n", + contains: [y] + }, + v = (e, n, t = {}) => { + const a = i({ + scope: "comment", + begin: e, + end: n, + contains: [] + }, t); + a.contains.push({ + scope: "doctag", + begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", + end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, + excludeBegin: !0, + relevance: 0 + }); + const r = p("I", "a", "is", "so", "us", "to", "at", "if", "in", "it", "on", /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, + /[A-Za-z]+[-][a-z]+/, /[A-Za-z][a-z]{2,}/); + return a.contains.push({ + begin: m(/[ ]+/, "(", r, /[.]?[:]?([.][ ]|[ ])/, "){3}") + }), a + }, + O = v("//", "$"), + k = v("/\\*", "\\*/"), + x = v("#", "$"); +var M = Object.freeze({ + __proto__: null, + MATCH_NOTHING_RE: /\b\B/, + IDENT_RE: "[a-zA-Z]\\w*", + UNDERSCORE_IDENT_RE: "[a-zA-Z_]\\w*", + NUMBER_RE: "\\b\\d+(\\.\\d+)?", + C_NUMBER_RE: E, + BINARY_NUMBER_RE: "\\b(0b[01]+)", + RE_STARTERS_RE: "!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", + SHEBANG: (e = {}) => { + const n = /^#![ ]*\//; + return e.binary && (e.begin = m(n, /.*\b/, e.binary, /\b.*/)), i({ + scope: "meta", + begin: n, + end: /$/, + relevance: 0, + "on:begin": (e, n) => { + 0 !== e.index && n.ignoreMatch() + } + }, e) + }, + BACKSLASH_ESCAPE: y, + APOS_STRING_MODE: w, + QUOTE_STRING_MODE: N, + PHRASAL_WORDS_MODE: { + begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ + }, + COMMENT: v, + C_LINE_COMMENT_MODE: O, + C_BLOCK_COMMENT_MODE: k, + HASH_COMMENT_MODE: x, + NUMBER_MODE: { + scope: "number", + begin: "\\b\\d+(\\.\\d+)?", + relevance: 0 + }, + C_NUMBER_MODE: { + scope: "number", + begin: E, + relevance: 0 + }, + BINARY_NUMBER_MODE: { + scope: "number", + begin: "\\b(0b[01]+)", + relevance: 0 + }, + REGEXP_MODE: { + begin: /(?=\/[^/\n]*\/)/, + contains: [{ + scope: "regexp", + begin: /\//, + end: /\/[gimuy]*/, + illegal: /\n/, + contains: [y, { + begin: /\[/, + end: /\]/, + relevance: 0, + contains: [y] + }] + }] + }, + TITLE_MODE: { + scope: "title", + begin: "[a-zA-Z]\\w*", + relevance: 0 + }, + UNDERSCORE_TITLE_MODE: { + scope: "title", + begin: "[a-zA-Z_]\\w*", + relevance: 0 + }, + METHOD_GUARD: { + begin: "\\.\\s*[a-zA-Z_]\\w*", + relevance: 0 + }, + END_SAME_AS_BEGIN: e => Object.assign(e, { + "on:begin": (e, n) => { + n.data._beginMatch = e[1] + }, + "on:end": (e, n) => { + n.data._beginMatch !== e[1] && n.ignoreMatch() + } + }) +}); + +function S(e, n) { + "." === e.input[e.index - 1] && n.ignoreMatch() +} + +function A(e, n) { + void 0 !== e.className && (e.scope = e.className, delete e.className) +} + +function C(e, n) { + n && e.beginKeywords && (e.begin = "\\b(" + e.beginKeywords.split(" ").join("|") + ")(?!\\.)(?=\\b|\\s)", + e.__beforeBegin = S, e.keywords = e.keywords || e.beginKeywords, delete e.beginKeywords, + void 0 === e.relevance && (e.relevance = 0)) +} + +function T(e, n) { + Array.isArray(e.illegal) && (e.illegal = p(...e.illegal)) +} + +function R(e, n) { + if (e.match) { + if (e.begin || e.end) throw Error("begin & end are not supported with match"); + e.begin = e.match, delete e.match + } +} + +function D(e, n) { + void 0 === e.relevance && (e.relevance = 1) +} +const I = (e, n) => { + if (!e.beforeMatch) return; + if (e.starts) throw Error("beforeMatch cannot be used with starts"); + const t = Object.assign({}, e); + Object.keys(e).forEach((n => { + delete e[n] + })), e.keywords = t.keywords, e.begin = m(t.beforeMatch, g(t.begin)), e.starts = { + relevance: 0, + contains: [Object.assign(t, { + endsParent: !0 + })] + }, e.relevance = 0, delete t.beforeMatch + }, + L = ["of", "and", "for", "in", "not", "or", "if", "then", "parent", "list", "value"]; + +function B(e, n, t = "keyword") { + const a = Object.create(null); + return "string" == typeof e ? i(t, e.split(" ")) : Array.isArray(e) ? i(t, e) : Object.keys(e).forEach((t => { + Object.assign(a, B(e[t], n, t)) + })), a; + + function i(e, t) { + n && (t = t.map((e => e.toLowerCase()))), t.forEach((n => { + const t = n.split("|"); + a[t[0]] = [e, $(t[0], t[1])] + })) + } +} + +function $(e, n) { + return n ? Number(n) : (e => L.includes(e.toLowerCase()))(e) ? 0 : 1 +} +const z = {}, + F = e => { + console.error(e) + }, + U = (e, ...n) => { + console.log("WARN: " + e, ...n) + }, + j = (e, n) => { + z[`${e}/${n}`] || (console.log(`Deprecated as of ${e}. ${n}`), z[`${e}/${n}`] = !0) + }, + P = Error(); + +function K(e, n, { + key: t +}) { + let a = 0; + const i = e[t], + r = {}, + s = {}; + for (let e = 1; e <= n.length; e++) s[e + a] = i[e], r[e + a] = !0, a += _(n[e - 1]); + e[t] = s, e[t]._emit = r, e[t]._multi = !0 +} + +function H(e) { + (e => { + e.scope && "object" == typeof e.scope && null !== e.scope && (e.beginScope = e.scope, + delete e.scope) + })(e), "string" == typeof e.beginScope && (e.beginScope = { + _wrap: e.beginScope + }), "string" == typeof e.endScope && (e.endScope = { + _wrap: e.endScope + }), (e => { + if (Array.isArray(e.begin)) { + if (e.skip || e.excludeBegin || e.returnBegin) throw F( + "skip, excludeBegin, returnBegin not compatible with beginScope: {}"), + P; + if ("object" != typeof e.beginScope || null === e.beginScope) throw F("beginScope must be object"), + P; + K(e, e.begin, { + key: "beginScope" + }), e.begin = f(e.begin, { + joinWith: "" + }) + } + })(e), (e => { + if (Array.isArray(e.end)) { + if (e.skip || e.excludeEnd || e.returnEnd) throw F( + "skip, excludeEnd, returnEnd not compatible with endScope: {}"), + P; + if ("object" != typeof e.endScope || null === e.endScope) throw F("endScope must be object"), + P; + K(e, e.end, { + key: "endScope" + }), e.end = f(e.end, { + joinWith: "" + }) + } + })(e) +} + +function q(e) { + function n(n, t) { + return RegExp(d(n), "m" + (e.case_insensitive ? "i" : "") + (e.unicodeRegex ? "u" : "") + (t ? "g" : "")) + } + class t { + constructor() { + this.matchIndexes = {}, this.regexes = [], this.matchAt = 1, this.position = 0 + } + addRule(e, n) { + n.position = this.position++, this.matchIndexes[this.matchAt] = n, this.regexes.push([n, e]), + this.matchAt += _(e) + 1 + } + compile() { + 0 === this.regexes.length && (this.exec = () => null); + const e = this.regexes.map((e => e[1])); + this.matcherRe = n(f(e, { + joinWith: "|" + }), !0), this.lastIndex = 0 + } + exec(e) { + this.matcherRe.lastIndex = this.lastIndex; + const n = this.matcherRe.exec(e); + if (!n) return null; + const t = n.findIndex(((e, n) => n > 0 && void 0 !== e)), + a = this.matchIndexes[t]; + return n.splice(0, t), Object.assign(n, a) + } + } + class a { + constructor() { + this.rules = [], this.multiRegexes = [], + this.count = 0, this.lastIndex = 0, this.regexIndex = 0 + } + getMatcher(e) { + if (this.multiRegexes[e]) return this.multiRegexes[e]; + const n = new t; + return this.rules.slice(e).forEach((([e, t]) => n.addRule(e, t))), + n.compile(), this.multiRegexes[e] = n, n + } + resumingScanAtSamePosition() { + return 0 !== this.regexIndex + } + considerAll() { + this.regexIndex = 0 + } + addRule(e, n) { + this.rules.push([e, n]), "begin" === n.type && this.count++ + } + exec(e) { + const n = this.getMatcher(this.regexIndex); + n.lastIndex = this.lastIndex; + let t = n.exec(e); + if (this.resumingScanAtSamePosition()) + if (t && t.index === this.lastIndex); + else { + const n = this.getMatcher(0); + n.lastIndex = this.lastIndex + 1, t = n.exec(e) + } + return t && (this.regexIndex += t.position + 1, + this.regexIndex === this.count && this.considerAll()), t + } + } + if (e.compilerExtensions || (e.compilerExtensions = []), + e.contains && e.contains.includes("self")) throw Error( + "ERR: contains `self` is not supported at the top-level of a language. See documentation."); + return e.classNameAliases = i(e.classNameAliases || {}), + function t(r, s) { + const o = r; + if (r.isCompiled) return o; + [A, R, H, I].forEach((e => e(r, s))), e.compilerExtensions.forEach((e => e(r, s))), + r.__beforeBegin = null, [C, T, D].forEach((e => e(r, s))), r.isCompiled = !0; + let l = null; + return "object" == typeof r.keywords && r.keywords.$pattern && (r.keywords = Object.assign({}, r.keywords), + l = r.keywords.$pattern, + delete r.keywords.$pattern), l = l || /\w+/, r.keywords && (r.keywords = B(r.keywords, e.case_insensitive)), + o.keywordPatternRe = n(l, !0), + s && (r.begin || (r.begin = /\B|\b/), o.beginRe = n(o.begin), r.end || r.endsWithParent || (r.end = /\B|\b/), + r.end && (o.endRe = n(o.end)), + o.terminatorEnd = d(o.end) || "", r.endsWithParent && s.terminatorEnd && (o.terminatorEnd += (r.end ? "|" : + "") + s.terminatorEnd)), + r.illegal && (o.illegalRe = n(r.illegal)), + r.contains || (r.contains = []), r.contains = [].concat(...r.contains.map((e => (e => (e.variants && !e + .cachedVariants && (e.cachedVariants = e.variants.map((n => i(e, { + variants: null + }, n)))), e.cachedVariants ? e.cachedVariants : Z(e) ? i(e, { + starts: e.starts ? i(e.starts) : null + }) : Object.isFrozen(e) ? i(e) : e))("self" === e ? r : e)))), r.contains.forEach((e => { + t(e, o) + })), r.starts && t(r.starts, s), o.matcher = (e => { + const n = new a; + return e.contains.forEach((e => n.addRule(e.begin, { + rule: e, + type: "begin" + }))), e.terminatorEnd && n.addRule(e.terminatorEnd, { + type: "end" + }), e.illegal && n.addRule(e.illegal, { + type: "illegal" + }), n + })(o), o + }(e) +} + +function Z(e) { + return !!e && (e.endsWithParent || Z(e.starts)) +} +class G extends Error { + constructor(e, n) { + super(e), this.name = "HTMLInjectionError", this.html = n + } +} +const W = a, + Q = i, + X = Symbol("nomatch"); +var V = (n => { + const a = Object.create(null), + i = Object.create(null), + r = []; + let s = !0; + const o = "Could not find the language '{}', did you forget to load/include a language module?", + l = { + disableAutodetect: !0, + name: "Plain text", + contains: [] + }; + let d = { + ignoreUnescapedHTML: !1, + throwUnescapedHTML: !1, + noHighlightRe: /^(no-?highlight)$/i, + languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, + classPrefix: "hljs-", + cssSelector: "pre code", + languages: null, + __emitter: c + }; + + function _(e) { + return d.noHighlightRe.test(e) + } + + function h(e, n, t) { + let a = "", + i = ""; + "object" == typeof n ? (a = e, + t = n.ignoreIllegals, i = n.language) : (j("10.7.0", "highlight(lang, code, ...args) has been deprecated."), + j("10.7.0", + "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), + i = e, a = n), void 0 === t && (t = !0); + const r = { + code: a, + language: i + }; + x("before:highlight", r); + const s = r.result ? r.result : f(r.language, r.code, t); + return s.code = r.code, x("after:highlight", s), s + } + + function f(e, n, i, r) { + const l = Object.create(null); + + function c() { + if (!k.keywords) return void M.addText(S); + let e = 0; + k.keywordPatternRe.lastIndex = 0; + let n = k.keywordPatternRe.exec(S), + t = ""; + for (; n;) { + t += S.substring(e, n.index); + const i = w.case_insensitive ? n[0].toLowerCase() : n[0], + r = (a = i, k.keywords[a]); + if (r) { + const [e, a] = r + ; + if (M.addText(t), t = "", l[i] = (l[i] || 0) + 1, l[i] <= 7 && (A += a), e.startsWith("_")) t += n[0]; + else { + const t = w.classNameAliases[e] || e; + M.addKeyword(n[0], t) + } + } else t += n[0]; + e = k.keywordPatternRe.lastIndex, n = k.keywordPatternRe.exec(S) + } + var a; + t += S.substring(e), M.addText(t) + } + + function g() { + null != k.subLanguage ? (() => { + if ("" === S) return; + let e = null; + if ("string" == typeof k.subLanguage) { + if (!a[k.subLanguage]) return void M.addText(S); + e = f(k.subLanguage, S, !0, x[k.subLanguage]), x[k.subLanguage] = e._top + } else e = E(S, k.subLanguage.length ? k.subLanguage : null); + k.relevance > 0 && (A += e.relevance), M.addSublanguage(e._emitter, e.language) + })() : c(), S = "" + } + + function u(e, n) { + let t = 1; + const a = n.length - 1; + for (; t <= a;) { + if (!e._emit[t]) { + t++; + continue + } + const a = w.classNameAliases[e[t]] || e[t], + i = n[t]; + a ? M.addKeyword(i, a) : (S = i, c(), S = ""), t++ + } + } + + function b(e, n) { + return e.scope && "string" == typeof e.scope && M.openNode(w.classNameAliases[e.scope] || e.scope), + e.beginScope && (e.beginScope._wrap ? (M.addKeyword(S, w.classNameAliases[e.beginScope._wrap] || e + .beginScope._wrap), + S = "") : e.beginScope._multi && (u(e.beginScope, n), S = "")), k = Object.create(e, { + parent: { + value: k + } + }), k + } + + function m(e, n, a) { + let i = ((e, n) => { + const t = e && e.exec(n); + return t && 0 === t.index + })(e.endRe, a); + if (i) { + if (e["on:end"]) { + const a = new t(e); + e["on:end"](n, a), a.isMatchIgnored && (i = !1) + } + if (i) { + for (; e.endsParent && e.parent;) e = e.parent; + return e + } + } + if (e.endsWithParent) return m(e.parent, n, a) + } + + function p(e) { + return 0 === k.matcher.regexIndex ? (S += e[0], 1) : (R = !0, 0) + } + + function _(e) { + const t = e[0], + a = n.substring(e.index), + i = m(k, e, a); + if (!i) return X; + const r = k; + k.endScope && k.endScope._wrap ? (g(), + M.addKeyword(t, k.endScope._wrap)) : k.endScope && k.endScope._multi ? (g(), + u(k.endScope, e)) : r.skip ? S += t : (r.returnEnd || r.excludeEnd || (S += t), + g(), r.excludeEnd && (S = t)); + do { + k.scope && M.closeNode(), k.skip || k.subLanguage || (A += k.relevance), k = k.parent + } while (k !== i.parent); + return i.starts && b(i.starts, e), r.returnEnd ? 0 : t.length + } + let h = {}; + + function y(a, r) { + const o = r && r[0]; + if (S += a, null == o) return g(), 0; + if ("begin" === h.type && "end" === r.type && h.index === r.index && "" === o) { + if (S += n.slice(r.index, r.index + 1), !s) { + const n = Error(`0 width match regex (${e})`); + throw n.languageName = e, n.badRule = h.rule, n + } + return 1 + } + if (h = r, "begin" === r.type) return (e => { + const n = e[0], + a = e.rule, + i = new t(a), + r = [a.__beforeBegin, a["on:begin"]]; + for (const t of r) + if (t && (t(e, i), i.isMatchIgnored)) return p(n); + return a.skip ? S += n : (a.excludeBegin && (S += n), + g(), a.returnBegin || a.excludeBegin || (S = n)), b(a, e), a.returnBegin ? 0 : n.length + })(r); + if ("illegal" === r.type && !i) { + const e = Error('Illegal lexeme "' + o + '" for mode "' + (k.scope || "") + '"'); + throw e.mode = k, e + } + if ("end" === r.type) { + const e = _(r); + if (e !== X) return e + } + if ("illegal" === r.type && "" === o) return 1; + if (T > 1e5 && T > 3 * r.index) throw Error("potential infinite loop, way more iterations than matches"); + return S += o, o.length + } + const w = v(e); + if (!w) throw F(o.replace("{}", e)), Error('Unknown language: "' + e + '"'); + const N = q(w); + let O = "", + k = r || N; + const x = {}, + M = new d.__emitter(d); + (() => { + const e = []; + for (let n = k; n !== w; n = n.parent) n.scope && e.unshift(n.scope); + e.forEach((e => M.openNode(e))) + })(); + let S = "", + A = 0, + C = 0, + T = 0, + R = !1; + try { + for (k.matcher.considerAll();;) { + T++, R ? R = !1 : k.matcher.considerAll(), k.matcher.lastIndex = C; + const e = k.matcher.exec(n); + if (!e) break; + const t = y(n.substring(C, e.index), e); + C = e.index + t + } + return y(n.substring(C)), M.closeAllNodes(), M.finalize(), O = M.toHTML(), { + language: e, + value: O, + relevance: A, + illegal: !1, + _emitter: M, + _top: k + } + } catch (t) { + if (t.message && t.message.includes("Illegal")) return { + language: e, + value: W(n), + illegal: !0, + relevance: 0, + _illegalBy: { + message: t.message, + index: C, + context: n.slice(C - 100, C + 100), + mode: t.mode, + resultSoFar: O + }, + _emitter: M + }; + if (s) return { + language: e, + value: W(n), + illegal: !1, + relevance: 0, + errorRaised: t, + _emitter: M, + _top: k + }; + throw t + } + } + + function E(e, n) { + n = n || d.languages || Object.keys(a); + const t = (e => { + const n = { + value: W(e), + illegal: !1, + relevance: 0, + _top: l, + _emitter: new d.__emitter(d) + }; + return n._emitter.addText(e), n + })(e), + i = n.filter(v).filter(k).map((n => f(n, e, !1))); + i.unshift(t); + const r = i.sort(((e, n) => { + if (e.relevance !== n.relevance) return n.relevance - e.relevance; + if (e.language && n.language) { + if (v(e.language).supersetOf === n.language) return 1; + if (v(n.language).supersetOf === e.language) return -1 + } + return 0 + })), + [s, o] = r, + c = s; + return c.secondBest = o, c + } + + function y(e) { + let n = null; + const t = (e => { + let n = e.className + " "; + n += e.parentNode ? e.parentNode.className : ""; + const t = d.languageDetectRe.exec(n); + if (t) { + const n = v(t[1]); + return n || (U(o.replace("{}", t[1])), + U("Falling back to no-highlight mode for this block.", e)), n ? t[1] : "no-highlight" + } + return n.split(/\s+/).find((e => _(e) || v(e))) + })(e); + if (_(t)) return; + if (x("before:highlightElement", { + el: e, + language: t + }), e.children.length > 0 && (d.ignoreUnescapedHTML || (console.warn( + "One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), + console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), + console.warn("The element with unescaped HTML:"), + console.warn(e)), d.throwUnescapedHTML)) throw new G("One of your code blocks includes unescaped HTML.", e + .innerHTML); + n = e; + const a = n.textContent, + r = t ? h(a, { + language: t, + ignoreIllegals: !0 + }) : E(a); + e.innerHTML = r.value, ((e, n, t) => { + const a = n && i[n] || t; + e.classList.add("hljs"), e.classList.add("language-" + a) + })(e, t, r.language), e.result = { + language: r.language, + re: r.relevance, + relevance: r.relevance + }, r.secondBest && (e.secondBest = { + language: r.secondBest.language, + relevance: r.secondBest.relevance + }), x("after:highlightElement", { + el: e, + result: r, + text: a + }) + } + let w = !1; + + function N() { + "loading" !== document.readyState ? document.querySelectorAll(d.cssSelector).forEach(y) : w = !0 + } + + function v(e) { + return e = (e || "").toLowerCase(), a[e] || a[i[e]] + } + + function O(e, { + languageName: n + }) { + "string" == typeof e && (e = [e]), e.forEach((e => { + i[e.toLowerCase()] = n + })) + } + + function k(e) { + const n = v(e); + return n && !n.disableAutodetect + } + + function x(e, n) { + const t = e; + r.forEach((e => { + e[t] && e[t](n) + })) + } + "undefined" != typeof window && window.addEventListener && window.addEventListener("DOMContentLoaded", (() => { + w && N() + }), !1), Object.assign(n, { + highlight: h, + highlightAuto: E, + highlightAll: N, + highlightElement: y, + highlightBlock: e => (j("10.7.0", "highlightBlock will be removed entirely in v12.0"), + j("10.7.0", "Please use highlightElement now."), y(e)), + configure: e => { + d = Q(d, e) + }, + initHighlighting: () => { + N(), j("10.6.0", "initHighlighting() deprecated. Use highlightAll() now.") + }, + initHighlightingOnLoad: () => { + N(), j("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now.") + }, + registerLanguage: (e, t) => { + let i = null; + try { + i = t(n) + } catch (n) { + if (F("Language definition for '{}' could not be registered.".replace("{}", e)), + !s) throw n; + F(n), i = l + } + i.name || (i.name = e), a[e] = i, i.rawDefinition = t.bind(null, n), i.aliases && O(i.aliases, { + languageName: e + }) + }, + unregisterLanguage: e => { + delete a[e]; + for (const n of Object.keys(i)) i[n] === e && delete i[n] + }, + listLanguages: () => Object.keys(a), + getLanguage: v, + registerAliases: O, + autoDetection: k, + inherit: Q, + addPlugin: e => { + (e => { + e["before:highlightBlock"] && !e["before:highlightElement"] && (e["before:highlightElement"] = + n => { + e["before:highlightBlock"](Object.assign({ + block: n.el + }, n)) + }), e["after:highlightBlock"] && !e["after:highlightElement"] && (e["after:highlightElement"] = + n => { + e["after:highlightBlock"](Object.assign({ + block: n.el + }, n)) + }) + })(e), r.push(e) + } + }), n.debugMode = () => { + s = !1 + }, n.safeMode = () => { + s = !0 + }, n.versionString = "11.7.0", n.regex = { + concat: m, + lookahead: g, + either: p, + optional: b, + anyNumberOfTimes: u + }; + for (const n in M) "object" == typeof M[n] && e.exports(M[n]); + return Object.assign(n, M), n +})({}); +const J = e => ({ + IMPORTANT: { + scope: "meta", + begin: "!important" + }, + BLOCK_COMMENT: e.C_BLOCK_COMMENT_MODE, + HEXCOLOR: { + scope: "number", + begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/ + }, + FUNCTION_DISPATCH: { + className: "built_in", + begin: /[\w-]+(?=\()/ + }, + ATTRIBUTE_SELECTOR_MODE: { + scope: "selector-attr", + begin: /\[/, + end: /\]/, + illegal: "$", + contains: [e.APOS_STRING_MODE, e.QUOTE_STRING_MODE] + }, + CSS_NUMBER_MODE: { + scope: "number", + begin: e.NUMBER_RE + + "(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", + relevance: 0 + }, + CSS_VARIABLE: { + className: "attr", + begin: /--[A-Za-z][A-Za-z0-9_-]*/ + } + }), + Y = ["a", "abbr", "address", "article", "aside", "audio", "b", "blockquote", "body", "button", "canvas", "caption", + "cite", "code", "dd", "del", "details", "dfn", "div", "dl", "dt", "em", "fieldset", "figcaption", "figure", + "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hgroup", "html", "i", "iframe", "img", "input", + "ins", "kbd", "label", "legend", "li", "main", "mark", "menu", "nav", "object", "ol", "p", "q", "quote", "samp", + "section", "span", "strong", "summary", "sup", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "time", + "tr", "ul", "var", "video" + ], + ee = ["any-hover", "any-pointer", "aspect-ratio", "color", "color-gamut", "color-index", "device-aspect-ratio", + "device-height", "device-width", "display-mode", "forced-colors", "grid", "height", "hover", "inverted-colors", + "monochrome", "orientation", "overflow-block", "overflow-inline", "pointer", "prefers-color-scheme", + "prefers-contrast", "prefers-reduced-motion", "prefers-reduced-transparency", "resolution", "scan", "scripting", + "update", "width", "min-width", "max-width", "min-height", "max-height" + ], + ne = ["active", "any-link", "blank", "checked", "current", "default", "defined", "dir", "disabled", "drop", "empty", + "enabled", "first", "first-child", "first-of-type", "fullscreen", "future", "focus", "focus-visible", + "focus-within", "has", "host", "host-context", "hover", "indeterminate", "in-range", "invalid", "is", "lang", + "last-child", "last-of-type", "left", "link", "local-link", "not", "nth-child", "nth-col", "nth-last-child", + "nth-last-col", "nth-last-of-type", "nth-of-type", "only-child", "only-of-type", "optional", "out-of-range", "past", + "placeholder-shown", "read-only", "read-write", "required", "right", "root", "scope", "target", "target-within", + "user-invalid", "valid", "visited", "where" + ], + te = ["after", "backdrop", "before", "cue", "cue-region", "first-letter", "first-line", "grammar-error", "marker", + "part", "placeholder", "selection", "slotted", "spelling-error" + ], + ae = ["align-content", "align-items", "align-self", "all", "animation", "animation-delay", "animation-direction", + "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", + "animation-timing-function", "backface-visibility", "background", "background-attachment", "background-blend-mode", + "background-clip", "background-color", "background-image", "background-origin", "background-position", + "background-repeat", "background-size", "block-size", "border", "border-block", "border-block-color", + "border-block-end", "border-block-end-color", "border-block-end-style", "border-block-end-width", + "border-block-start", "border-block-start-color", "border-block-start-style", "border-block-start-width", + "border-block-style", "border-block-width", "border-bottom", "border-bottom-color", "border-bottom-left-radius", + "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-color", + "border-image", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", + "border-image-width", "border-inline", "border-inline-color", "border-inline-end", "border-inline-end-color", + "border-inline-end-style", "border-inline-end-width", "border-inline-start", "border-inline-start-color", + "border-inline-start-style", "border-inline-start-width", "border-inline-style", "border-inline-width", + "border-left", "border-left-color", "border-left-style", "border-left-width", "border-radius", "border-right", + "border-right-color", "border-right-style", "border-right-width", "border-spacing", "border-style", "border-top", + "border-top-color", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", + "border-width", "bottom", "box-decoration-break", "box-shadow", "box-sizing", "break-after", "break-before", + "break-inside", "caption-side", "caret-color", "clear", "clip", "clip-path", "clip-rule", "color", "column-count", + "column-fill", "column-gap", "column-rule", "column-rule-color", "column-rule-style", "column-rule-width", + "column-span", "column-width", "columns", "contain", "content", "content-visibility", "counter-increment", + "counter-reset", "cue", "cue-after", "cue-before", "cursor", "direction", "display", "empty-cells", "filter", + "flex", "flex-basis", "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", "float", "flow", + "font", "font-display", "font-family", "font-feature-settings", "font-kerning", "font-language-override", + "font-size", "font-size-adjust", "font-smoothing", "font-stretch", "font-style", "font-synthesis", "font-variant", + "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", + "font-variant-position", "font-variation-settings", "font-weight", "gap", "glyph-orientation-vertical", "grid", + "grid-area", "grid-auto-columns", "grid-auto-flow", "grid-auto-rows", "grid-column", "grid-column-end", + "grid-column-start", "grid-gap", "grid-row", "grid-row-end", "grid-row-start", "grid-template", + "grid-template-areas", "grid-template-columns", "grid-template-rows", "hanging-punctuation", "height", "hyphens", + "icon", "image-orientation", "image-rendering", "image-resolution", "ime-mode", "inline-size", "isolation", + "justify-content", "left", "letter-spacing", "line-break", "line-height", "list-style", "list-style-image", + "list-style-position", "list-style-type", "margin", "margin-block", "margin-block-end", "margin-block-start", + "margin-bottom", "margin-inline", "margin-inline-end", "margin-inline-start", "margin-left", "margin-right", + "margin-top", "marks", "mask", "mask-border", "mask-border-mode", "mask-border-outset", "mask-border-repeat", + "mask-border-slice", "mask-border-source", "mask-border-width", "mask-clip", "mask-composite", "mask-image", + "mask-mode", "mask-origin", "mask-position", "mask-repeat", "mask-size", "mask-type", "max-block-size", + "max-height", "max-inline-size", "max-width", "min-block-size", "min-height", "min-inline-size", "min-width", + "mix-blend-mode", "nav-down", "nav-index", "nav-left", "nav-right", "nav-up", "none", "normal", "object-fit", + "object-position", "opacity", "order", "orphans", "outline", "outline-color", "outline-offset", "outline-style", + "outline-width", "overflow", "overflow-wrap", "overflow-x", "overflow-y", "padding", "padding-block", + "padding-block-end", "padding-block-start", "padding-bottom", "padding-inline", "padding-inline-end", + "padding-inline-start", "padding-left", "padding-right", "padding-top", "page-break-after", "page-break-before", + "page-break-inside", "pause", "pause-after", "pause-before", "perspective", "perspective-origin", "pointer-events", + "position", "quotes", "resize", "rest", "rest-after", "rest-before", "right", "row-gap", "scroll-margin", + "scroll-margin-block", "scroll-margin-block-end", "scroll-margin-block-start", "scroll-margin-bottom", + "scroll-margin-inline", "scroll-margin-inline-end", "scroll-margin-inline-start", "scroll-margin-left", + "scroll-margin-right", "scroll-margin-top", "scroll-padding", "scroll-padding-block", "scroll-padding-block-end", + "scroll-padding-block-start", "scroll-padding-bottom", "scroll-padding-inline", "scroll-padding-inline-end", + "scroll-padding-inline-start", "scroll-padding-left", "scroll-padding-right", "scroll-padding-top", + "scroll-snap-align", "scroll-snap-stop", "scroll-snap-type", "scrollbar-color", "scrollbar-gutter", + "scrollbar-width", "shape-image-threshold", "shape-margin", "shape-outside", "speak", "speak-as", "src", "tab-size", + "table-layout", "text-align", "text-align-all", "text-align-last", "text-combine-upright", "text-decoration", + "text-decoration-color", "text-decoration-line", "text-decoration-style", "text-emphasis", "text-emphasis-color", + "text-emphasis-position", "text-emphasis-style", "text-indent", "text-justify", "text-orientation", "text-overflow", + "text-rendering", "text-shadow", "text-transform", "text-underline-position", "top", "transform", "transform-box", + "transform-origin", "transform-style", "transition", "transition-delay", "transition-duration", + "transition-property", "transition-timing-function", "unicode-bidi", "vertical-align", "visibility", + "voice-balance", "voice-duration", "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", + "voice-volume", "white-space", "widows", "width", "will-change", "word-break", "word-spacing", "word-wrap", + "writing-mode", "z-index" + ].reverse(), + ie = ne.concat(te); +var re = "\\.([0-9](_*[0-9])*)", + se = "[0-9a-fA-F](_*[0-9a-fA-F])*", + oe = { + className: "number", + variants: [{ + begin: `(\\b([0-9](_*[0-9])*)((${re})|\\.)?|(${re}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` + }, { + begin: `\\b([0-9](_*[0-9])*)((${re})[fFdD]?\\b|\\.([fFdD]\\b)?)` + }, { + begin: `(${re})[fFdD]?\\b` + }, { + begin: "\\b([0-9](_*[0-9])*)[fFdD]\\b" + }, { + begin: `\\b0[xX]((${se})\\.?|(${se})?\\.(${se}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` + }, { + begin: "\\b(0|[1-9](_*[0-9])*)[lL]?\\b" + }, { + begin: `\\b0[xX](${se})[lL]?\\b` + }, { + begin: "\\b0(_*[0-7])*[lL]?\\b" + }, { + begin: "\\b0[bB][01](_*[01])*[lL]?\\b" + }], + relevance: 0 + }; + +function le(e, n, t) { + return -1 === t ? "" : e.replace(n, (a => le(e, n, t - 1))) +} +const ce = "[A-Za-z$_][0-9A-Za-z$_]*", + de = ["as", "in", "of", "if", "for", "while", "finally", "var", "new", "function", "do", "return", "void", "else", + "break", "catch", "instanceof", "with", "throw", "case", "default", "try", "switch", "continue", "typeof", "delete", + "let", "yield", "const", "class", "debugger", "async", "await", "static", "import", "from", "export", "extends" + ], + ge = ["true", "false", "null", "undefined", "NaN", "Infinity"], + ue = ["Object", "Function", "Boolean", "Symbol", "Math", "Date", "Number", "BigInt", "String", "RegExp", "Array", + "Float32Array", "Float64Array", "Int8Array", "Uint8Array", "Uint8ClampedArray", "Int16Array", "Int32Array", + "Uint16Array", "Uint32Array", "BigInt64Array", "BigUint64Array", "Set", "Map", "WeakSet", "WeakMap", "ArrayBuffer", + "SharedArrayBuffer", "Atomics", "DataView", "JSON", "Promise", "Generator", "GeneratorFunction", "AsyncFunction", + "Reflect", "Proxy", "Intl", "WebAssembly" + ], + be = ["Error", "EvalError", "InternalError", "RangeError", "ReferenceError", "SyntaxError", "TypeError", "URIError"], + me = ["setInterval", "setTimeout", "clearInterval", "clearTimeout", "require", "exports", "eval", "isFinite", "isNaN", + "parseFloat", "parseInt", "decodeURI", "decodeURIComponent", "encodeURI", "encodeURIComponent", "escape", "unescape" + ], + pe = ["arguments", "this", "super", "console", "window", "document", "localStorage", "module", "global"], + _e = [].concat(me, ue, be); + +function he(e) { + const n = e.regex, + t = ce, + a = { + begin: /<[A-Za-z0-9\\._:-]+/, + end: /\/[A-Za-z0-9\\._:-]+>|\/>/, + isTrulyOpeningTag: (e, n) => { + const t = e[0].length + e.index, + a = e.input[t]; + if ("<" === a || "," === a) return void n.ignoreMatch(); + let i; + ">" === a && (((e, { + after: n + }) => { + const t = "", + k = { + match: [/const|var|let/, /\s+/, t, /\s*/, /=\s*/, /(async\s*)?/, n.lookahead(O)], + keywords: "async", + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [_] + }; + return { + name: "Javascript", + aliases: ["js", "jsx", "mjs", "cjs"], + keywords: i, + exports: { + PARAMS_CONTAINS: p, + CLASS_REFERENCE: f + }, + illegal: /#(?![$_A-z])/, + contains: [e.SHEBANG({ + label: "shebang", + binary: "node", + relevance: 5 + }), { + label: "use_strict", + className: "meta", + relevance: 10, + begin: /^\s*['"]use (strict|asm)['"]/ + }, e.APOS_STRING_MODE, e.QUOTE_STRING_MODE, c, d, g, u, { + match: /\$\d+/ + }, o, f, { + className: "attr", + begin: t + n.lookahead(":"), + relevance: 0 + }, k, { + begin: "(" + e.RE_STARTERS_RE + "|\\b(case|return|throw)\\b)\\s*", + keywords: "return throw case", + relevance: 0, + contains: [u, e.REGEXP_MODE, { + className: "function", + begin: O, + returnBegin: !0, + end: "\\s*=>", + contains: [{ + className: "params", + variants: [{ + begin: e.UNDERSCORE_IDENT_RE, + relevance: 0 + }, { + className: null, + begin: /\(\s*\)/, + skip: !0 + }, { + begin: /\(/, + end: /\)/, + excludeBegin: !0, + excludeEnd: !0, + keywords: i, + contains: p + }] + }] + }, { + begin: /,/, + relevance: 0 + }, { + match: /\s+/, + relevance: 0 + }, { + variants: [{ + begin: "<>", + end: "" + }, { + match: /<[A-Za-z0-9\\._:-]+\s*\/>/ + }, { + begin: a.begin, + "on:begin": a.isTrulyOpeningTag, + end: a.end + }], + subLanguage: "xml", + contains: [{ + begin: a.begin, + end: a.end, + skip: !0, + contains: ["self"] + }] + }] + }, E, { + beginKeywords: "while if switch catch for" + }, { + begin: "\\b(?!function)" + e.UNDERSCORE_IDENT_RE + + "\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", + returnBegin: !0, + label: "func.def", + contains: [_, e.inherit(e.TITLE_MODE, { + begin: t, + className: "title.function" + })] + }, { + match: /\.\.\./, + relevance: 0 + }, N, { + match: "\\$" + t, + relevance: 0 + }, { + match: [/\bconstructor(?=\s*\()/], + className: { + 1: "title.function" + }, + contains: [_] + }, y, { + relevance: 0, + match: /\b[A-Z][A-Z_0-9]+\b/, + className: "variable.constant" + }, h, v, { + match: /\$[(.]/ + }] + } +} +const fe = e => m(/\b/, e, /\w$/.test(e) ? /\b/ : /\B/), + Ee = ["Protocol", "Type"].map(fe), + ye = ["init", "self"].map(fe), + we = ["Any", "Self"], + Ne = ["actor", "any", "associatedtype", "async", "await", /as\?/, /as!/, "as", "break", "case", "catch", "class", + "continue", "convenience", "default", "defer", "deinit", "didSet", "distributed", "do", "dynamic", "else", "enum", + "extension", "fallthrough", /fileprivate\(set\)/, "fileprivate", "final", "for", "func", "get", "guard", "if", + "import", "indirect", "infix", /init\?/, /init!/, "inout", /internal\(set\)/, "internal", "in", "is", "isolated", + "nonisolated", "lazy", "let", "mutating", "nonmutating", /open\(set\)/, "open", "operator", "optional", "override", + "postfix", "precedencegroup", "prefix", /private\(set\)/, "private", "protocol", /public\(set\)/, "public", + "repeat", "required", "rethrows", "return", "set", "some", "static", "struct", "subscript", "super", "switch", + "throws", "throw", /try\?/, /try!/, "try", "typealias", /unowned\(safe\)/, /unowned\(unsafe\)/, "unowned", "var", + "weak", "where", "while", "willSet" + ], + ve = ["false", "nil", "true"], + Oe = ["assignment", "associativity", "higherThan", "left", "lowerThan", "none", "right"], + ke = ["#colorLiteral", "#column", "#dsohandle", "#else", "#elseif", "#endif", "#error", "#file", "#fileID", + "#fileLiteral", "#filePath", "#function", "#if", "#imageLiteral", "#keyPath", "#line", "#selector", + "#sourceLocation", "#warn_unqualified_access", "#warning" + ], + xe = ["abs", "all", "any", "assert", "assertionFailure", "debugPrint", "dump", "fatalError", "getVaList", + "isKnownUniquelyReferenced", "max", "min", "numericCast", "pointwiseMax", "pointwiseMin", "precondition", + "preconditionFailure", "print", "readLine", "repeatElement", "sequence", "stride", "swap", + "swift_unboxFromSwiftValueWithType", "transcode", "type", "unsafeBitCast", "unsafeDowncast", "withExtendedLifetime", + "withUnsafeMutablePointer", "withUnsafePointer", "withVaList", "withoutActuallyEscaping", "zip" + ], + Me = p(/[/=\-+!*%<>&|^~?]/, /[\u00A1-\u00A7]/, /[\u00A9\u00AB]/, /[\u00AC\u00AE]/, /[\u00B0\u00B1]/, + /[\u00B6\u00BB\u00BF\u00D7\u00F7]/, /[\u2016-\u2017]/, /[\u2020-\u2027]/, /[\u2030-\u203E]/, /[\u2041-\u2053]/, + /[\u2055-\u205E]/, /[\u2190-\u23FF]/, /[\u2500-\u2775]/, /[\u2794-\u2BFF]/, /[\u2E00-\u2E7F]/, /[\u3001-\u3003]/, + /[\u3008-\u3020]/, /[\u3030]/), + Se = p(Me, /[\u0300-\u036F]/, /[\u1DC0-\u1DFF]/, /[\u20D0-\u20FF]/, /[\uFE00-\uFE0F]/, /[\uFE20-\uFE2F]/), + Ae = m(Me, Se, "*"), + Ce = p(/[a-zA-Z_]/, /[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/, + /[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/, /[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/, + /[\u1E00-\u1FFF]/, /[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/, + /[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/, /[\u2C00-\u2DFF\u2E80-\u2FFF]/, + /[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/, /[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/, + /[\uFE47-\uFEFE\uFF00-\uFFFD]/), + Te = p(Ce, /\d/, /[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/), + Re = m(Ce, Te, "*"), + De = m(/[A-Z]/, Te, "*"), + Ie = ["autoclosure", m(/convention\(/, p("swift", "block", "c"), /\)/), "discardableResult", "dynamicCallable", + "dynamicMemberLookup", "escaping", "frozen", "GKInspectable", "IBAction", "IBDesignable", "IBInspectable", + "IBOutlet", "IBSegueAction", "inlinable", "main", "nonobjc", "NSApplicationMain", "NSCopying", "NSManaged", m( + /objc\(/, Re, /\)/), "objc", "objcMembers", "propertyWrapper", "requires_stored_property_inits", "resultBuilder", + "testable", "UIApplicationMain", "unknown", "usableFromInline" + ], + Le = ["iOS", "iOSApplicationExtension", "macOS", "macOSApplicationExtension", "macCatalyst", + "macCatalystApplicationExtension", "watchOS", "watchOSApplicationExtension", "tvOS", "tvOSApplicationExtension", + "swift" + ]; +var Be = Object.freeze({ + __proto__: null, + grmr_bash: e => { + const n = e.regex, + t = {}, + a = { + begin: /\$\{/, + end: /\}/, + contains: ["self", { + begin: /:-/, + contains: [t] + }] + }; + Object.assign(t, { + className: "variable", + variants: [{ + begin: n.concat(/\$[\w\d#@][\w\d_]*/, "(?![\\w\\d])(?![$])") + }, a] + }); + const i = { + className: "subst", + begin: /\$\(/, + end: /\)/, + contains: [e.BACKSLASH_ESCAPE] + }, + r = { + begin: /<<-?\s*(?=\w+)/, + starts: { + contains: [e.END_SAME_AS_BEGIN({ + begin: /(\w+)/, + end: /(\w+)/, + className: "string" + })] + } + }, + s = { + className: "string", + begin: /"/, + end: /"/, + contains: [e.BACKSLASH_ESCAPE, t, i] + }; + i.contains.push(s); + const o = { + begin: /\$?\(\(/, + end: /\)\)/, + contains: [{ + begin: /\d+#[0-9a-f]+/, + className: "number" + }, e.NUMBER_MODE, t] + }, + l = e.SHEBANG({ + binary: "(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)", + relevance: 10 + }), + c = { + className: "function", + begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/, + returnBegin: !0, + contains: [e.inherit(e.TITLE_MODE, { + begin: /\w[\w\d_]*/ + })], + relevance: 0 + }; + return { + name: "Bash", + aliases: ["sh"], + keywords: { + $pattern: /\b[a-z][a-z0-9._-]+\b/, + keyword: ["if", "then", "else", "elif", "fi", "for", "while", "in", "do", "done", "case", "esac", + "function" + ], + literal: ["true", "false"], + built_in: ["break", "cd", "continue", "eval", "exec", "exit", "export", "getopts", "hash", "pwd", + "readonly", "return", "shift", "test", "times", "trap", "umask", "unset", "alias", "bind", "builtin", + "caller", "command", "declare", "echo", "enable", "help", "let", "local", "logout", "mapfile", + "printf", "read", "readarray", "source", "type", "typeset", "ulimit", "unalias", "set", "shopt", + "autoload", "bg", "bindkey", "bye", "cap", "chdir", "clone", "comparguments", "compcall", "compctl", + "compdescribe", "compfiles", "compgroups", "compquote", "comptags", "comptry", "compvalues", "dirs", + "disable", "disown", "echotc", "echoti", "emulate", "fc", "fg", "float", "functions", "getcap", + "getln", "history", "integer", "jobs", "kill", "limit", "log", "noglob", "popd", "print", "pushd", + "pushln", "rehash", "sched", "setcap", "setopt", "stat", "suspend", "ttyctl", "unfunction", "unhash", + "unlimit", "unsetopt", "vared", "wait", "whence", "where", "which", "zcompile", "zformat", "zftp", + "zle", "zmodload", "zparseopts", "zprof", "zpty", "zregexparse", "zsocket", "zstyle", "ztcp", "chcon", + "chgrp", "chown", "chmod", "cp", "dd", "df", "dir", "dircolors", "ln", "ls", "mkdir", "mkfifo", + "mknod", "mktemp", "mv", "realpath", "rm", "rmdir", "shred", "sync", "touch", "truncate", "vdir", + "b2sum", "base32", "base64", "cat", "cksum", "comm", "csplit", "cut", "expand", "fmt", "fold", "head", + "join", "md5sum", "nl", "numfmt", "od", "paste", "ptx", "pr", "sha1sum", "sha224sum", "sha256sum", + "sha384sum", "sha512sum", "shuf", "sort", "split", "sum", "tac", "tail", "tr", "tsort", "unexpand", + "uniq", "wc", "arch", "basename", "chroot", "date", "dirname", "du", "echo", "env", "expr", "factor", + "groups", "hostid", "id", "link", "logname", "nice", "nohup", "nproc", "pathchk", "pinky", "printenv", + "printf", "pwd", "readlink", "runcon", "seq", "sleep", "stat", "stdbuf", "stty", "tee", "test", + "timeout", "tty", "uname", "unlink", "uptime", "users", "who", "whoami", "yes" + ] + }, + contains: [l, e.SHEBANG(), c, o, e.HASH_COMMENT_MODE, r, { + match: /(\/[a-z._-]+)+/ + }, s, { + className: "", + begin: /\\"/ + }, { + className: "string", + begin: /'/, + end: /'/ + }, t] + } + }, + grmr_c: e => { + const n = e.regex, + t = e.COMMENT("//", "$", { + contains: [{ + begin: /\\\n/ + }] + }), + a = "[a-zA-Z_]\\w*::", + i = "(decltype\\(auto\\)|" + n.optional(a) + "[a-zA-Z_]\\w*" + n.optional("<[^<>]+>") + ")", + r = { + className: "type", + variants: [{ + begin: "\\b[a-z\\d_]*_t\\b" + }, { + match: /\batomic_[a-z]{3,6}\b/ + }] + }, + s = { + className: "string", + variants: [{ + begin: '(u8?|U|L)?"', + end: '"', + illegal: "\\n", + contains: [e.BACKSLASH_ESCAPE] + }, { + begin: "(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", + end: "'", + illegal: "." + }, e.END_SAME_AS_BEGIN({ + begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, + end: /\)([^()\\ ]{0,16})"/ + })] + }, + o = { + className: "number", + variants: [{ + begin: "\\b(0b[01']+)" + }, { + begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" + }, { + begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" + }], + relevance: 0 + }, + l = { + className: "meta", + begin: /#\s*[a-z]+\b/, + end: /$/, + keywords: { + keyword: "if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" + }, + contains: [{ + begin: /\\\n/, + relevance: 0 + }, e.inherit(s, { + className: "string" + }), { + className: "string", + begin: /<.*?>/ + }, t, e.C_BLOCK_COMMENT_MODE] + }, + c = { + className: "title", + begin: n.optional(a) + e.IDENT_RE, + relevance: 0 + }, + d = n.optional(a) + e.IDENT_RE + "\\s*\\(", + g = { + keyword: ["asm", "auto", "break", "case", "continue", "default", "do", "else", "enum", "extern", "for", + "fortran", "goto", "if", "inline", "register", "restrict", "return", "sizeof", "struct", "switch", + "typedef", "union", "volatile", "while", "_Alignas", "_Alignof", "_Atomic", "_Generic", "_Noreturn", + "_Static_assert", "_Thread_local", "alignas", "alignof", "noreturn", "static_assert", "thread_local", + "_Pragma" + ], + type: ["float", "double", "signed", "unsigned", "int", "short", "long", "char", "void", "_Bool", + "_Complex", "_Imaginary", "_Decimal32", "_Decimal64", "_Decimal128", "const", "static", "complex", + "bool", "imaginary" + ], + literal: "true false NULL", + built_in: "std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" + }, + u = [l, r, t, e.C_BLOCK_COMMENT_MODE, o, s], + b = { + variants: [{ + begin: /=/, + end: /;/ + }, { + begin: /\(/, + end: /\)/ + }, { + beginKeywords: "new throw return else", + end: /;/ + }], + keywords: g, + contains: u.concat([{ + begin: /\(/, + end: /\)/, + keywords: g, + contains: u.concat(["self"]), + relevance: 0 + }]), + relevance: 0 + }, + m = { + begin: "(" + i + "[\\*&\\s]+)+" + d, + returnBegin: !0, + end: /[{;=]/, + excludeEnd: !0, + keywords: g, + illegal: /[^\w\s\*&:<>.]/, + contains: [{ + begin: "decltype\\(auto\\)", + keywords: g, + relevance: 0 + }, { + begin: d, + returnBegin: !0, + contains: [e.inherit(c, { + className: "title.function" + })], + relevance: 0 + }, { + relevance: 0, + match: /,/ + }, { + className: "params", + begin: /\(/, + end: /\)/, + keywords: g, + relevance: 0, + contains: [t, e.C_BLOCK_COMMENT_MODE, s, o, r, { + begin: /\(/, + end: /\)/, + keywords: g, + relevance: 0, + contains: ["self", t, e.C_BLOCK_COMMENT_MODE, s, o, r] + }] + }, r, t, e.C_BLOCK_COMMENT_MODE, l] + }; + return { + name: "C", + aliases: ["h"], + keywords: g, + disableAutodetect: !0, + illegal: "=]/, + contains: [{ + beginKeywords: "final class struct" + }, e.TITLE_MODE] + }]), + exports: { + preprocessor: l, + strings: s, + keywords: g + } + } + }, + grmr_cpp: e => { + const n = e.regex, + t = e.COMMENT("//", "$", { + contains: [{ + begin: /\\\n/ + }] + }), + a = "[a-zA-Z_]\\w*::", + i = "(?!struct)(decltype\\(auto\\)|" + n.optional(a) + "[a-zA-Z_]\\w*" + n.optional("<[^<>]+>") + ")", + r = { + className: "type", + begin: "\\b[a-z\\d_]*_t\\b" + }, + s = { + className: "string", + variants: [{ + begin: '(u8?|U|L)?"', + end: '"', + illegal: "\\n", + contains: [e.BACKSLASH_ESCAPE] + }, { + begin: "(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", + end: "'", + illegal: "." + }, e.END_SAME_AS_BEGIN({ + begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, + end: /\)([^()\\ ]{0,16})"/ + })] + }, + o = { + className: "number", + variants: [{ + begin: "\\b(0b[01']+)" + }, { + begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" + }, { + begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" + }], + relevance: 0 + }, + l = { + className: "meta", + begin: /#\s*[a-z]+\b/, + end: /$/, + keywords: { + keyword: "if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" + }, + contains: [{ + begin: /\\\n/, + relevance: 0 + }, e.inherit(s, { + className: "string" + }), { + className: "string", + begin: /<.*?>/ + }, t, e.C_BLOCK_COMMENT_MODE] + }, + c = { + className: "title", + begin: n.optional(a) + e.IDENT_RE, + relevance: 0 + }, + d = n.optional(a) + e.IDENT_RE + "\\s*\\(", + g = { + type: ["bool", "char", "char16_t", "char32_t", "char8_t", "double", "float", "int", "long", "short", + "void", "wchar_t", "unsigned", "signed", "const", "static" + ], + keyword: ["alignas", "alignof", "and", "and_eq", "asm", "atomic_cancel", "atomic_commit", + "atomic_noexcept", "auto", "bitand", "bitor", "break", "case", "catch", "class", "co_await", + "co_return", "co_yield", "compl", "concept", "const_cast|10", "consteval", "constexpr", "constinit", + "continue", "decltype", "default", "delete", "do", "dynamic_cast|10", "else", "enum", "explicit", + "export", "extern", "false", "final", "for", "friend", "goto", "if", "import", "inline", "module", + "mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr", "operator", "or", "or_eq", + "override", "private", "protected", "public", "reflexpr", "register", "reinterpret_cast|10", + "requires", "return", "sizeof", "static_assert", "static_cast|10", "struct", "switch", "synchronized", + "template", "this", "thread_local", "throw", "transaction_safe", "transaction_safe_dynamic", "true", + "try", "typedef", "typeid", "typename", "union", "using", "virtual", "volatile", "while", "xor", + "xor_eq" + ], + literal: ["NULL", "false", "nullopt", "nullptr", "true"], + built_in: ["_Pragma"], + _type_hints: ["any", "auto_ptr", "barrier", "binary_semaphore", "bitset", "complex", "condition_variable", + "condition_variable_any", "counting_semaphore", "deque", "false_type", "future", "imaginary", + "initializer_list", "istringstream", "jthread", "latch", "lock_guard", "multimap", "multiset", + "mutex", "optional", "ostringstream", "packaged_task", "pair", "promise", "priority_queue", "queue", + "recursive_mutex", "recursive_timed_mutex", "scoped_lock", "set", "shared_future", "shared_lock", + "shared_mutex", "shared_timed_mutex", "shared_ptr", "stack", "string_view", "stringstream", + "timed_mutex", "thread", "true_type", "tuple", "unique_lock", "unique_ptr", "unordered_map", + "unordered_multimap", "unordered_multiset", "unordered_set", "variant", "vector", "weak_ptr", + "wstring", "wstring_view" + ] + }, + u = { + className: "function.dispatch", + relevance: 0, + keywords: { + _hint: ["abort", "abs", "acos", "apply", "as_const", "asin", "atan", "atan2", "calloc", "ceil", "cerr", + "cin", "clog", "cos", "cosh", "cout", "declval", "endl", "exchange", "exit", "exp", "fabs", "floor", + "fmod", "forward", "fprintf", "fputs", "free", "frexp", "fscanf", "future", "invoke", "isalnum", + "isalpha", "iscntrl", "isdigit", "isgraph", "islower", "isprint", "ispunct", "isspace", "isupper", + "isxdigit", "labs", "launder", "ldexp", "log", "log10", "make_pair", "make_shared", + "make_shared_for_overwrite", "make_tuple", "make_unique", "malloc", "memchr", "memcmp", "memcpy", + "memset", "modf", "move", "pow", "printf", "putchar", "puts", "realloc", "scanf", "sin", "sinh", + "snprintf", "sprintf", "sqrt", "sscanf", "std", "stderr", "stdin", "stdout", "strcat", "strchr", + "strcmp", "strcpy", "strcspn", "strlen", "strncat", "strncmp", "strncpy", "strpbrk", "strrchr", + "strspn", "strstr", "swap", "tan", "tanh", "terminate", "to_underlying", "tolower", "toupper", + "vfprintf", "visit", "vprintf", "vsprintf" + ] + }, + begin: n.concat(/\b/, /(?!decltype)/, /(?!if)/, /(?!for)/, /(?!switch)/, /(?!while)/, e.IDENT_RE, n + .lookahead(/(<[^<>]+>|)\s*\(/)) + }, + b = [u, l, r, t, e.C_BLOCK_COMMENT_MODE, o, s], + m = { + variants: [{ + begin: /=/, + end: /;/ + }, { + begin: /\(/, + end: /\)/ + }, { + beginKeywords: "new throw return else", + end: /;/ + }], + keywords: g, + contains: b.concat([{ + begin: /\(/, + end: /\)/, + keywords: g, + contains: b.concat(["self"]), + relevance: 0 + }]), + relevance: 0 + }, + p = { + className: "function", + begin: "(" + i + "[\\*&\\s]+)+" + d, + returnBegin: !0, + end: /[{;=]/, + excludeEnd: !0, + keywords: g, + illegal: /[^\w\s\*&:<>.]/, + contains: [{ + begin: "decltype\\(auto\\)", + keywords: g, + relevance: 0 + }, { + begin: d, + returnBegin: !0, + contains: [c], + relevance: 0 + }, { + begin: /::/, + relevance: 0 + }, { + begin: /:/, + endsWithParent: !0, + contains: [s, o] + }, { + relevance: 0, + match: /,/ + }, { + className: "params", + begin: /\(/, + end: /\)/, + keywords: g, + relevance: 0, + contains: [t, e.C_BLOCK_COMMENT_MODE, s, o, r, { + begin: /\(/, + end: /\)/, + keywords: g, + relevance: 0, + contains: ["self", t, e.C_BLOCK_COMMENT_MODE, s, o, r] + }] + }, r, t, e.C_BLOCK_COMMENT_MODE, l] + }; + return { + name: "C++", + aliases: ["cc", "c++", "h++", "hpp", "hh", "hxx", "cxx"], + keywords: g, + illegal: "", + keywords: g, + contains: ["self", r] + }, { + begin: e.IDENT_RE + "::", + keywords: g + }, { + match: [/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/, /\s+/, /\w+/], + className: { + 1: "keyword", + 3: "title.class" + } + }]) + } + }, + grmr_csharp: e => { + const n = { + keyword: ["abstract", "as", "base", "break", "case", "catch", "class", "const", "continue", "do", "else", + "event", "explicit", "extern", "finally", "fixed", "for", "foreach", "goto", "if", "implicit", "in", + "interface", "internal", "is", "lock", "namespace", "new", "operator", "out", "override", "params", + "private", "protected", "public", "readonly", "record", "ref", "return", "scoped", "sealed", "sizeof", + "stackalloc", "static", "struct", "switch", "this", "throw", "try", "typeof", "unchecked", "unsafe", + "using", "virtual", "void", "volatile", "while" + ].concat(["add", "alias", "and", "ascending", "async", "await", "by", "descending", "equals", "from", + "get", "global", "group", "init", "into", "join", "let", "nameof", "not", "notnull", "on", "or", + "orderby", "partial", "remove", "select", "set", "unmanaged", "value|0", "var", "when", "where", + "with", "yield" + ]), + built_in: ["bool", "byte", "char", "decimal", "delegate", "double", "dynamic", "enum", "float", "int", + "long", "nint", "nuint", "object", "sbyte", "short", "string", "ulong", "uint", "ushort" + ], + literal: ["default", "false", "null", "true"] + }, + t = e.inherit(e.TITLE_MODE, { + begin: "[a-zA-Z](\\.?\\w)*" + }), + a = { + className: "number", + variants: [{ + begin: "\\b(0b[01']+)" + }, { + begin: "(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)" + }, { + begin: "(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" + }], + relevance: 0 + }, + i = { + className: "string", + begin: '@"', + end: '"', + contains: [{ + begin: '""' + }] + }, + r = e.inherit(i, { + illegal: /\n/ + }), + s = { + className: "subst", + begin: /\{/, + end: /\}/, + keywords: n + }, + o = e.inherit(s, { + illegal: /\n/ + }), + l = { + className: "string", + begin: /\$"/, + end: '"', + illegal: /\n/, + contains: [{ + begin: /\{\{/ + }, { + begin: /\}\}/ + }, e.BACKSLASH_ESCAPE, o] + }, + c = { + className: "string", + begin: /\$@"/, + end: '"', + contains: [{ + begin: /\{\{/ + }, { + begin: /\}\}/ + }, { + begin: '""' + }, s] + }, + d = e.inherit(c, { + illegal: /\n/, + contains: [{ + begin: /\{\{/ + }, { + begin: /\}\}/ + }, { + begin: '""' + }, o] + }); + s.contains = [c, l, i, e.APOS_STRING_MODE, e.QUOTE_STRING_MODE, a, e.C_BLOCK_COMMENT_MODE], + o.contains = [d, l, r, e.APOS_STRING_MODE, e.QUOTE_STRING_MODE, a, e.inherit(e.C_BLOCK_COMMENT_MODE, { + illegal: /\n/ + })]; + const g = { + variants: [c, l, i, e.APOS_STRING_MODE, e.QUOTE_STRING_MODE] + }, + u = { + begin: "<", + end: ">", + contains: [{ + beginKeywords: "in out" + }, t] + }, + b = e.IDENT_RE + "(<" + e.IDENT_RE + "(\\s*,\\s*" + e.IDENT_RE + ")*>)?(\\[\\])?", + m = { + begin: "@" + e.IDENT_RE, + relevance: 0 + }; + return { + name: "C#", + aliases: ["cs", "c#"], + keywords: n, + illegal: /::/, + contains: [e.COMMENT("///", "$", { + returnBegin: !0, + contains: [{ + className: "doctag", + variants: [{ + begin: "///", + relevance: 0 + }, { + begin: "\x3c!--|--\x3e" + }, { + begin: "" + }] + }] + }), e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE, { + className: "meta", + begin: "#", + end: "$", + keywords: { + keyword: "if else elif endif define undef warning error line region endregion pragma checksum" + } + }, g, a, { + beginKeywords: "class interface", + relevance: 0, + end: /[{;=]/, + illegal: /[^\s:,]/, + contains: [{ + beginKeywords: "where class" + }, t, u, e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE] + }, { + beginKeywords: "namespace", + relevance: 0, + end: /[{;=]/, + illegal: /[^\s:]/, + contains: [t, e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE] + }, { + beginKeywords: "record", + relevance: 0, + end: /[{;=]/, + illegal: /[^\s:]/, + contains: [t, u, e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE] + }, { + className: "meta", + begin: "^\\s*\\[(?=[\\w])", + excludeBegin: !0, + end: "\\]", + excludeEnd: !0, + contains: [{ + className: "string", + begin: /"/, + end: /"/ + }] + }, { + beginKeywords: "new return throw await else", + relevance: 0 + }, { + className: "function", + begin: "(" + b + "\\s+)+" + e.IDENT_RE + "\\s*(<[^=]+>\\s*)?\\(", + returnBegin: !0, + end: /\s*[{;=]/, + excludeEnd: !0, + keywords: n, + contains: [{ + beginKeywords: "public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", + relevance: 0 + }, { + begin: e.IDENT_RE + "\\s*(<[^=]+>\\s*)?\\(", + returnBegin: !0, + contains: [e.TITLE_MODE, u], + relevance: 0 + }, { + match: /\(\)/ + }, { + className: "params", + begin: /\(/, + end: /\)/, + excludeBegin: !0, + excludeEnd: !0, + keywords: n, + relevance: 0, + contains: [g, a, e.C_BLOCK_COMMENT_MODE] + }, e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE] + }, m] + } + }, + grmr_css: e => { + const n = e.regex, + t = J(e), + a = [e.APOS_STRING_MODE, e.QUOTE_STRING_MODE]; + return { + name: "CSS", + case_insensitive: !0, + illegal: /[=|'\$]/, + keywords: { + keyframePosition: "from to" + }, + classNameAliases: { + keyframePosition: "selector-tag" + }, + contains: [t.BLOCK_COMMENT, { + begin: /-(webkit|moz|ms|o)-(?=[a-z])/ + }, t.CSS_NUMBER_MODE, { + className: "selector-id", + begin: /#[A-Za-z0-9_-]+/, + relevance: 0 + }, { + className: "selector-class", + begin: "\\.[a-zA-Z-][a-zA-Z0-9_-]*", + relevance: 0 + }, t.ATTRIBUTE_SELECTOR_MODE, { + className: "selector-pseudo", + variants: [{ + begin: ":(" + ne.join("|") + ")" + }, { + begin: ":(:)?(" + te.join("|") + ")" + }] + }, t.CSS_VARIABLE, { + className: "attribute", + begin: "\\b(" + ae.join("|") + ")\\b" + }, { + begin: /:/, + end: /[;}{]/, + contains: [t.BLOCK_COMMENT, t.HEXCOLOR, t.IMPORTANT, t.CSS_NUMBER_MODE, ...a, { + begin: /(url|data-uri)\(/, + end: /\)/, + relevance: 0, + keywords: { + built_in: "url data-uri" + }, + contains: [...a, { + className: "string", + begin: /[^)]/, + endsWithParent: !0, + excludeEnd: !0 + }] + }, t.FUNCTION_DISPATCH] + }, { + begin: n.lookahead(/@/), + end: "[{;]", + relevance: 0, + illegal: /:/, + contains: [{ + className: "keyword", + begin: /@-?\w[\w]*(-\w+)*/ + }, { + begin: /\s/, + endsWithParent: !0, + excludeEnd: !0, + relevance: 0, + keywords: { + $pattern: /[a-z-]+/, + keyword: "and or not only", + attribute: ee.join(" ") + }, + contains: [{ + begin: /[a-z-]+(?=:)/, + className: "attribute" + }, ...a, t.CSS_NUMBER_MODE] + }] + }, { + className: "selector-tag", + begin: "\\b(" + Y.join("|") + ")\\b" + }] + } + }, + grmr_diff: e => { + const n = e.regex; + return { + name: "Diff", + aliases: ["patch"], + contains: [{ + className: "meta", + relevance: 10, + match: n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/, /^\*\*\* +\d+,\d+ +\*\*\*\*$/, /^--- +\d+,\d+ +----$/) + }, { + className: "comment", + variants: [{ + begin: n.either(/Index: /, /^index/, /={3,}/, /^-{3}/, /^\*{3} /, /^\+{3}/, /^diff --git/), + end: /$/ + }, { + match: /^\*{15}$/ + }] + }, { + className: "addition", + begin: /^\+/, + end: /$/ + }, { + className: "deletion", + begin: /^-/, + end: /$/ + }, { + className: "addition", + begin: /^!/, + end: /$/ + }] + } + }, + grmr_go: e => { + const n = { + keyword: ["break", "case", "chan", "const", "continue", "default", "defer", "else", "fallthrough", "for", + "func", "go", "goto", "if", "import", "interface", "map", "package", "range", "return", "select", + "struct", "switch", "type", "var" + ], + type: ["bool", "byte", "complex64", "complex128", "error", "float32", "float64", "int8", "int16", "int32", + "int64", "string", "uint8", "uint16", "uint32", "uint64", "int", "uint", "uintptr", "rune" + ], + literal: ["true", "false", "iota", "nil"], + built_in: ["append", "cap", "close", "complex", "copy", "imag", "len", "make", "new", "panic", "print", + "println", "real", "recover", "delete" + ] + }; + return { + name: "Go", + aliases: ["golang"], + keywords: n, + illegal: " { + const n = e.regex; + return { + name: "GraphQL", + aliases: ["gql"], + case_insensitive: !0, + disableAutodetect: !1, + keywords: { + keyword: ["query", "mutation", "subscription", "type", "input", "schema", "directive", "interface", + "union", "scalar", "fragment", "enum", "on" + ], + literal: ["true", "false", "null"] + }, + contains: [e.HASH_COMMENT_MODE, e.QUOTE_STRING_MODE, e.NUMBER_MODE, { + scope: "punctuation", + match: /[.]{3}/, + relevance: 0 + }, { + scope: "punctuation", + begin: /[\!\(\)\:\=\[\]\{\|\}]{1}/, + relevance: 0 + }, { + scope: "variable", + begin: /\$/, + end: /\W/, + excludeEnd: !0, + relevance: 0 + }, { + scope: "meta", + match: /@\w+/, + excludeEnd: !0 + }, { + scope: "symbol", + begin: n.concat(/[_A-Za-z][_0-9A-Za-z]*/, n.lookahead(/\s*:/)), + relevance: 0 + }], + illegal: [/[;<']/, /BEGIN/] + } + }, + grmr_ini: e => { + const n = e.regex, + t = { + className: "number", + relevance: 0, + variants: [{ + begin: /([+-]+)?[\d]+_[\d_]+/ + }, { + begin: e.NUMBER_RE + }] + }, + a = e.COMMENT(); + a.variants = [{ + begin: /;/, + end: /$/ + }, { + begin: /#/, + end: /$/ + }]; + const i = { + className: "variable", + variants: [{ + begin: /\$[\w\d"][\w\d_]*/ + }, { + begin: /\$\{(.*?)\}/ + }] + }, + r = { + className: "literal", + begin: /\bon|off|true|false|yes|no\b/ + }, + s = { + className: "string", + contains: [e.BACKSLASH_ESCAPE], + variants: [{ + begin: "'''", + end: "'''", + relevance: 10 + }, { + begin: '"""', + end: '"""', + relevance: 10 + }, { + begin: '"', + end: '"' + }, { + begin: "'", + end: "'" + }] + }, + o = { + begin: /\[/, + end: /\]/, + contains: [a, r, i, s, t, "self"], + relevance: 0 + }, + l = n.either(/[A-Za-z0-9_-]+/, /"(\\"|[^"])*"/, /'[^']*'/); + return { + name: "TOML, also INI", + aliases: ["toml"], + case_insensitive: !0, + illegal: /\S/, + contains: [a, { + className: "section", + begin: /\[+/, + end: /\]+/ + }, { + begin: n.concat(l, "(\\s*\\.\\s*", l, ")*", n.lookahead(/\s*=\s*[^#\s]/)), + className: "attr", + starts: { + end: /$/, + contains: [a, o, r, i, s, t] + } + }] + } + }, + grmr_java: e => { + const n = e.regex, + t = "[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*", + a = t + le("(?:<" + t + "~~~(?:\\s*,\\s*" + t + "~~~)*>)?", /~~~/g, 2), + i = { + keyword: ["synchronized", "abstract", "private", "var", "static", "if", "const ", "for", "while", + "strictfp", "finally", "protected", "import", "native", "final", "void", "enum", "else", "break", + "transient", "catch", "instanceof", "volatile", "case", "assert", "package", "default", "public", + "try", "switch", "continue", "throws", "protected", "public", "private", "module", "requires", + "exports", "do", "sealed", "yield", "permits" + ], + literal: ["false", "true", "null"], + type: ["char", "boolean", "long", "float", "int", "byte", "short", "double"], + built_in: ["super", "this"] + }, + r = { + className: "meta", + begin: "@" + t, + contains: [{ + begin: /\(/, + end: /\)/, + contains: ["self"] + }] + }, + s = { + className: "params", + begin: /\(/, + end: /\)/, + keywords: i, + relevance: 0, + contains: [e.C_BLOCK_COMMENT_MODE], + endsParent: !0 + }; + return { + name: "Java", + aliases: ["jsp"], + keywords: i, + illegal: /<\/|#/, + contains: [e.COMMENT("/\\*\\*", "\\*/", { + relevance: 0, + contains: [{ + begin: /\w+@/, + relevance: 0 + }, { + className: "doctag", + begin: "@[A-Za-z]+" + }] + }), { + begin: /import java\.[a-z]+\./, + keywords: "import", + relevance: 2 + }, e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE, { + begin: /"""/, + end: /"""/, + className: "string", + contains: [e.BACKSLASH_ESCAPE] + }, e.APOS_STRING_MODE, e.QUOTE_STRING_MODE, { + match: [/\b(?:class|interface|enum|extends|implements|new)/, /\s+/, t], + className: { + 1: "keyword", + 3: "title.class" + } + }, { + match: /non-sealed/, + scope: "keyword" + }, { + begin: [n.concat(/(?!else)/, t), /\s+/, t, /\s+/, /=(?!=)/], + className: { + 1: "type", + 3: "variable", + 5: "operator" + } + }, { + begin: [/record/, /\s+/, t], + className: { + 1: "keyword", + 3: "title.class" + }, + contains: [s, e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE] + }, { + beginKeywords: "new throw return else", + relevance: 0 + }, { + begin: ["(?:" + a + "\\s+)", e.UNDERSCORE_IDENT_RE, /\s*(?=\()/], + className: { + 2: "title.function" + }, + keywords: i, + contains: [{ + className: "params", + begin: /\(/, + end: /\)/, + keywords: i, + relevance: 0, + contains: [r, e.APOS_STRING_MODE, e.QUOTE_STRING_MODE, oe, e.C_BLOCK_COMMENT_MODE] + }, e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE] + }, oe, r] + } + }, + grmr_javascript: he, + grmr_json: e => { + const n = ["true", "false", "null"], + t = { + scope: "literal", + beginKeywords: n.join(" ") + }; + return { + name: "JSON", + keywords: { + literal: n + }, + contains: [{ + className: "attr", + begin: /"(\\.|[^\\"\r\n])*"(?=\s*:)/, + relevance: 1.01 + }, { + match: /[{}[\],:]/, + className: "punctuation", + relevance: 0 + }, e.QUOTE_STRING_MODE, t, e.C_NUMBER_MODE, e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE], + illegal: "\\S" + } + }, + grmr_kotlin: e => { + const n = { + keyword: "abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", + built_in: "Byte Short Char Int Long Boolean Float Double Void Unit Nothing", + literal: "true false null" + }, + t = { + className: "symbol", + begin: e.UNDERSCORE_IDENT_RE + "@" + }, + a = { + className: "subst", + begin: /\$\{/, + end: /\}/, + contains: [e.C_NUMBER_MODE] + }, + i = { + className: "variable", + begin: "\\$" + e.UNDERSCORE_IDENT_RE + }, + r = { + className: "string", + variants: [{ + begin: '"""', + end: '"""(?=[^"])', + contains: [i, a] + }, { + begin: "'", + end: "'", + illegal: /\n/, + contains: [e.BACKSLASH_ESCAPE] + }, { + begin: '"', + end: '"', + illegal: /\n/, + contains: [e.BACKSLASH_ESCAPE, i, a] + }] + }; + a.contains.push(r); + const s = { + className: "meta", + begin: "@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*" + e + .UNDERSCORE_IDENT_RE + ")?" + }, + o = { + className: "meta", + begin: "@" + e.UNDERSCORE_IDENT_RE, + contains: [{ + begin: /\(/, + end: /\)/, + contains: [e.inherit(r, { + className: "string" + }), "self"] + }] + }, + l = oe, + c = e.COMMENT("/\\*", "\\*/", { + contains: [e.C_BLOCK_COMMENT_MODE] + }), + d = { + variants: [{ + className: "type", + begin: e.UNDERSCORE_IDENT_RE + }, { + begin: /\(/, + end: /\)/, + contains: [] + }] + }, + g = d; + return g.variants[1].contains = [d], d.variants[1].contains = [g], { + name: "Kotlin", + aliases: ["kt", "kts"], + keywords: n, + contains: [e.COMMENT("/\\*\\*", "\\*/", { + relevance: 0, + contains: [{ + className: "doctag", + begin: "@[A-Za-z]+" + }] + }), e.C_LINE_COMMENT_MODE, c, { + className: "keyword", + begin: /\b(break|continue|return|this)\b/, + starts: { + contains: [{ + className: "symbol", + begin: /@\w+/ + }] + } + }, t, s, o, { + className: "function", + beginKeywords: "fun", + end: "[(]|$", + returnBegin: !0, + excludeEnd: !0, + keywords: n, + relevance: 5, + contains: [{ + begin: e.UNDERSCORE_IDENT_RE + "\\s*\\(", + returnBegin: !0, + relevance: 0, + contains: [e.UNDERSCORE_TITLE_MODE] + }, { + className: "type", + begin: //, + keywords: "reified", + relevance: 0 + }, { + className: "params", + begin: /\(/, + end: /\)/, + endsParent: !0, + keywords: n, + relevance: 0, + contains: [{ + begin: /:/, + end: /[=,\/]/, + endsWithParent: !0, + contains: [d, e.C_LINE_COMMENT_MODE, c], + relevance: 0 + }, e.C_LINE_COMMENT_MODE, c, s, o, r, e.C_NUMBER_MODE] + }, c] + }, { + begin: [/class|interface|trait/, /\s+/, e.UNDERSCORE_IDENT_RE], + beginScope: { + 3: "title.class" + }, + keywords: "class interface trait", + end: /[:\{(]|$/, + excludeEnd: !0, + illegal: "extends implements", + contains: [{ + beginKeywords: "public protected internal private constructor" + }, e.UNDERSCORE_TITLE_MODE, { + className: "type", + begin: //, + excludeBegin: !0, + excludeEnd: !0, + relevance: 0 + }, { + className: "type", + begin: /[,:]\s*/, + end: /[<\(,){\s]|$/, + excludeBegin: !0, + returnEnd: !0 + }, s, o] + }, r, { + className: "meta", + begin: "^#!/usr/bin/env", + end: "$", + illegal: "\n" + }, l] + } + }, + grmr_less: e => { + const n = J(e), + t = ie, + a = "([\\w-]+|@\\{[\\w-]+\\})", + i = [], + r = [], + s = e => ({ + className: "string", + begin: "~?" + e + ".*?" + e + }), + o = (e, n, t) => ({ + className: e, + begin: n, + relevance: t + }), + l = { + $pattern: /[a-z-]+/, + keyword: "and or not only", + attribute: ee.join(" ") + }, + c = { + begin: "\\(", + end: "\\)", + contains: r, + keywords: l, + relevance: 0 + }; + r.push(e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE, s("'"), s('"'), n.CSS_NUMBER_MODE, { + begin: "(url|data-uri)\\(", + starts: { + className: "string", + end: "[\\)\\n]", + excludeEnd: !0 + } + }, n.HEXCOLOR, c, o("variable", "@@?[\\w-]+", 10), o("variable", "@\\{[\\w-]+\\}"), o("built_in", + "~?`[^`]*?`"), { + className: "attribute", + begin: "[\\w-]+\\s*:", + end: ":", + returnBegin: !0, + excludeEnd: !0 + }, n.IMPORTANT, { + beginKeywords: "and not" + }, n.FUNCTION_DISPATCH); + const d = r.concat({ + begin: /\{/, + end: /\}/, + contains: i + }), + g = { + beginKeywords: "when", + endsWithParent: !0, + contains: [{ + beginKeywords: "and not" + }].concat(r) + }, + u = { + begin: a + "\\s*:", + returnBegin: !0, + end: /[;}]/, + relevance: 0, + contains: [{ + begin: /-(webkit|moz|ms|o)-/ + }, n.CSS_VARIABLE, { + className: "attribute", + begin: "\\b(" + ae.join("|") + ")\\b", + end: /(?=:)/, + starts: { + endsWithParent: !0, + illegal: "[<=$]", + relevance: 0, + contains: r + } + }] + }, + b = { + className: "keyword", + begin: "@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", + starts: { + end: "[;{}]", + keywords: l, + returnEnd: !0, + contains: r, + relevance: 0 + } + }, + m = { + className: "variable", + variants: [{ + begin: "@[\\w-]+\\s*:", + relevance: 15 + }, { + begin: "@[\\w-]+" + }], + starts: { + end: "[;}]", + returnEnd: !0, + contains: d + } + }, + p = { + variants: [{ + begin: "[\\.#:&\\[>]", + end: "[;{}]" + }, { + begin: a, + end: /\{/ + }], + returnBegin: !0, + returnEnd: !0, + illegal: "[<='$\"]", + relevance: 0, + contains: [e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE, g, o("keyword", "all\\b"), o("variable", + "@\\{[\\w-]+\\}"), { + begin: "\\b(" + Y.join("|") + ")\\b", + className: "selector-tag" + }, n.CSS_NUMBER_MODE, o("selector-tag", a, 0), o("selector-id", "#" + a), o("selector-class", "\\." + + a, 0), o("selector-tag", "&", 0), n.ATTRIBUTE_SELECTOR_MODE, { + className: "selector-pseudo", + begin: ":(" + ne.join("|") + ")" + }, { + className: "selector-pseudo", + begin: ":(:)?(" + te.join("|") + ")" + }, { + begin: /\(/, + end: /\)/, + relevance: 0, + contains: d + }, { + begin: "!important" + }, n.FUNCTION_DISPATCH] + }, + _ = { + begin: `[\\w-]+:(:)?(${t.join("|")})`, + returnBegin: !0, + contains: [p] + }; + return i.push(e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE, b, m, _, u, p, g, n.FUNCTION_DISPATCH), { + name: "Less", + case_insensitive: !0, + illegal: "[=>'/<($\"]", + contains: i + } + }, + grmr_lua: e => { + const n = "\\[=*\\[", + t = "\\]=*\\]", + a = { + begin: n, + end: t, + contains: ["self"] + }, + i = [e.COMMENT("--(?!\\[=*\\[)", "$"), e.COMMENT("--\\[=*\\[", t, { + contains: [a], + relevance: 10 + })]; + return { + name: "Lua", + keywords: { + $pattern: e.UNDERSCORE_IDENT_RE, + literal: "true false nil", + keyword: "and break do else elseif end for goto if in local not or repeat return then until while", + built_in: "_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" + }, + contains: i.concat([{ + className: "function", + beginKeywords: "function", + end: "\\)", + contains: [e.inherit(e.TITLE_MODE, { + begin: "([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*" + }), { + className: "params", + begin: "\\(", + endsWithParent: !0, + contains: i + }].concat(i) + }, e.C_NUMBER_MODE, e.APOS_STRING_MODE, e.QUOTE_STRING_MODE, { + className: "string", + begin: n, + end: t, + contains: [a], + relevance: 5 + }]) + } + }, + grmr_makefile: e => { + const n = { + className: "variable", + variants: [{ + begin: "\\$\\(" + e.UNDERSCORE_IDENT_RE + "\\)", + contains: [e.BACKSLASH_ESCAPE] + }, { + begin: /\$[@% { + const n = e.regex, + t = n.concat( + /(?:[A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])/, + n.optional( + /(?:[\x2D\.0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])*:/ + ), + /(?:[\x2D\.0-9A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])*/ + ), + a = { + className: "symbol", + begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/ + }, + i = { + begin: /\s/, + contains: [{ + className: "keyword", + begin: /#?[a-z_][a-z1-9_-]+/, + illegal: /\n/ + }] + }, + r = e.inherit(i, { + begin: /\(/, + end: /\)/ + }), + s = e.inherit(e.APOS_STRING_MODE, { + className: "string" + }), + o = e.inherit(e.QUOTE_STRING_MODE, { + className: "string" + }), + l = { + endsWithParent: !0, + illegal: /`]+/ + }] + }] + }] + }; + return { + name: "HTML, XML", + aliases: ["html", "xhtml", "rss", "atom", "xjb", "xsd", "xsl", "plist", "wsf", "svg"], + case_insensitive: !0, + unicodeRegex: !0, + contains: [{ + className: "meta", + begin: //, + relevance: 10, + contains: [i, o, s, r, { + begin: /\[/, + end: /\]/, + contains: [{ + className: "meta", + begin: //, + contains: [i, r, o, s] + }] + }] + }, e.COMMENT(//, { + relevance: 10 + }), { + begin: //, + relevance: 10 + }, a, { + className: "meta", + end: /\?>/, + variants: [{ + begin: /<\?xml/, + relevance: 10, + contains: [o] + }, { + begin: /<\?[a-z][a-z0-9]+/ + }] + }, { + className: "tag", + begin: /)/, + end: />/, + keywords: { + name: "style" + }, + contains: [l], + starts: { + end: /<\/style>/, + returnEnd: !0, + subLanguage: ["css", "xml"] + } + }, { + className: "tag", + begin: /)/, + end: />/, + keywords: { + name: "script" + }, + contains: [l], + starts: { + end: /<\/script>/, + returnEnd: !0, + subLanguage: ["javascript", "handlebars", "xml"] + } + }, { + className: "tag", + begin: /<>|<\/>/ + }, { + className: "tag", + begin: n.concat(//, />/, /\s/)))), + end: /\/?>/, + contains: [{ + className: "name", + begin: t, + relevance: 0, + starts: l + }] + }, { + className: "tag", + begin: n.concat(/<\//, n.lookahead(n.concat(t, />/))), + contains: [{ + className: "name", + begin: t, + relevance: 0 + }, { + begin: />/, + relevance: 0, + endsParent: !0 + }] + }] + } + }, + grmr_markdown: e => { + const n = { + begin: /<\/?[A-Za-z_]/, + end: ">", + subLanguage: "xml", + relevance: 0 + }, + t = { + variants: [{ + begin: /\[.+?\]\[.*?\]/, + relevance: 0 + }, { + begin: /\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, + relevance: 2 + }, { + begin: e.regex.concat(/\[.+?\]\(/, /[A-Za-z][A-Za-z0-9+.-]*/, /:\/\/.*?\)/), + relevance: 2 + }, { + begin: /\[.+?\]\([./?&#].*?\)/, + relevance: 1 + }, { + begin: /\[.*?\]\(.*?\)/, + relevance: 0 + }], + returnBegin: !0, + contains: [{ + match: /\[(?=\])/ + }, { + className: "string", + relevance: 0, + begin: "\\[", + end: "\\]", + excludeBegin: !0, + returnEnd: !0 + }, { + className: "link", + relevance: 0, + begin: "\\]\\(", + end: "\\)", + excludeBegin: !0, + excludeEnd: !0 + }, { + className: "symbol", + relevance: 0, + begin: "\\]\\[", + end: "\\]", + excludeBegin: !0, + excludeEnd: !0 + }] + }, + a = { + className: "strong", + contains: [], + variants: [{ + begin: /_{2}(?!\s)/, + end: /_{2}/ + }, { + begin: /\*{2}(?!\s)/, + end: /\*{2}/ + }] + }, + i = { + className: "emphasis", + contains: [], + variants: [{ + begin: /\*(?![*\s])/, + end: /\*/ + }, { + begin: /_(?![_\s])/, + end: /_/, + relevance: 0 + }] + }, + r = e.inherit(a, { + contains: [] + }), + s = e.inherit(i, { + contains: [] + }); + a.contains.push(s), i.contains.push(r); + let o = [n, t]; + return [a, i, r, s].forEach((e => { + e.contains = e.contains.concat(o) + })), o = o.concat(a, i), { + name: "Markdown", + aliases: ["md", "mkdown", "mkd"], + contains: [{ + className: "section", + variants: [{ + begin: "^#{1,6}", + end: "$", + contains: o + }, { + begin: "(?=^.+?\\n[=-]{2,}$)", + contains: [{ + begin: "^[=-]*$" + }, { + begin: "^", + end: "\\n", + contains: o + }] + }] + }, n, { + className: "bullet", + begin: "^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", + end: "\\s+", + excludeEnd: !0 + }, a, i, { + className: "quote", + begin: "^>\\s+", + contains: o, + end: "$" + }, { + className: "code", + variants: [{ + begin: "(`{3,})[^`](.|\\n)*?\\1`*[ ]*" + }, { + begin: "(~{3,})[^~](.|\\n)*?\\1~*[ ]*" + }, { + begin: "```", + end: "```+[ ]*$" + }, { + begin: "~~~", + end: "~~~+[ ]*$" + }, { + begin: "`.+?`" + }, { + begin: "(?=^( {4}|\\t))", + contains: [{ + begin: "^( {4}|\\t)", + end: "(\\n)$" + }], + relevance: 0 + }] + }, { + begin: "^[-\\*]{3,}", + end: "$" + }, t, { + begin: /^\[[^\n]+\]:/, + returnBegin: !0, + contains: [{ + className: "symbol", + begin: /\[/, + end: /\]/, + excludeBegin: !0, + excludeEnd: !0 + }, { + className: "link", + begin: /:\s*/, + end: /$/, + excludeBegin: !0 + }] + }] + } + }, + grmr_objectivec: e => { + const n = /[a-zA-Z@][a-zA-Z0-9_]*/, + t = { + $pattern: n, + keyword: ["@interface", "@class", "@protocol", "@implementation"] + }; + return { + name: "Objective-C", + aliases: ["mm", "objc", "obj-c", "obj-c++", "objective-c++"], + keywords: { + "variable.language": ["this", "super"], + $pattern: n, + keyword: ["while", "export", "sizeof", "typedef", "const", "struct", "for", "union", "volatile", "static", + "mutable", "if", "do", "return", "goto", "enum", "else", "break", "extern", "asm", "case", "default", + "register", "explicit", "typename", "switch", "continue", "inline", "readonly", "assign", "readwrite", + "self", "@synchronized", "id", "typeof", "nonatomic", "IBOutlet", "IBAction", "strong", "weak", + "copy", "in", "out", "inout", "bycopy", "byref", "oneway", "__strong", "__weak", "__block", + "__autoreleasing", "@private", "@protected", "@public", "@try", "@property", "@end", "@throw", + "@catch", "@finally", "@autoreleasepool", "@synthesize", "@dynamic", "@selector", "@optional", + "@required", "@encode", "@package", "@import", "@defs", "@compatibility_alias", "__bridge", + "__bridge_transfer", "__bridge_retained", "__bridge_retain", "__covariant", "__contravariant", + "__kindof", "_Nonnull", "_Nullable", "_Null_unspecified", "__FUNCTION__", "__PRETTY_FUNCTION__", + "__attribute__", "getter", "setter", "retain", "unsafe_unretained", "nonnull", "nullable", + "null_unspecified", "null_resettable", "class", "instancetype", "NS_DESIGNATED_INITIALIZER", + "NS_UNAVAILABLE", "NS_REQUIRES_SUPER", "NS_RETURNS_INNER_POINTER", "NS_INLINE", "NS_AVAILABLE", + "NS_DEPRECATED", "NS_ENUM", "NS_OPTIONS", "NS_SWIFT_UNAVAILABLE", "NS_ASSUME_NONNULL_BEGIN", + "NS_ASSUME_NONNULL_END", "NS_REFINED_FOR_SWIFT", "NS_SWIFT_NAME", "NS_SWIFT_NOTHROW", "NS_DURING", + "NS_HANDLER", "NS_ENDHANDLER", "NS_VALUERETURN", "NS_VOIDRETURN" + ], + literal: ["false", "true", "FALSE", "TRUE", "nil", "YES", "NO", "NULL"], + built_in: ["dispatch_once_t", "dispatch_queue_t", "dispatch_sync", "dispatch_async", "dispatch_once"], + type: ["int", "float", "char", "unsigned", "signed", "short", "long", "double", "wchar_t", "unichar", + "void", "bool", "BOOL", "id|0", "_Bool" + ] + }, + illegal: "/, + end: /$/, + illegal: "\\n" + }, e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE] + }, { + className: "class", + begin: "(" + t.keyword.join("|") + ")\\b", + end: /(\{|$)/, + excludeEnd: !0, + keywords: t, + contains: [e.UNDERSCORE_TITLE_MODE] + }, { + begin: "\\." + e.UNDERSCORE_IDENT_RE, + relevance: 0 + } + ] + } + }, + grmr_perl: e => { + const n = e.regex, + t = /[dualxmsipngr]{0,12}/, + a = { + $pattern: /[\w.]+/, + keyword: "abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" + }, + i = { + className: "subst", + begin: "[$@]\\{", + end: "\\}", + keywords: a + }, + r = { + begin: /->\{/, + end: /\}/ + }, + s = { + variants: [{ + begin: /\$\d/ + }, { + begin: n.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/, "(?![A-Za-z])(?![@$%])") + }, { + begin: /[$%@][^\s\w{]/, + relevance: 0 + }] + }, + o = [e.BACKSLASH_ESCAPE, i, s], + l = [/!/, /\//, /\|/, /\?/, /'/, /"/, /#/], + c = (e, a, i = "\\1") => { + const r = "\\1" === i ? i : n.concat(i, a); + return n.concat(n.concat("(?:", e, ")"), a, /(?:\\.|[^\\\/])*?/, r, /(?:\\.|[^\\\/])*?/, i, t) + }, + d = (e, a, i) => n.concat(n.concat("(?:", e, ")"), a, /(?:\\.|[^\\\/])*?/, i, t), + g = [s, e.HASH_COMMENT_MODE, e.COMMENT(/^=\w/, /=cut/, { + endsWithParent: !0 + }), r, { + className: "string", + contains: o, + variants: [{ + begin: "q[qwxr]?\\s*\\(", + end: "\\)", + relevance: 5 + }, { + begin: "q[qwxr]?\\s*\\[", + end: "\\]", + relevance: 5 + }, { + begin: "q[qwxr]?\\s*\\{", + end: "\\}", + relevance: 5 + }, { + begin: "q[qwxr]?\\s*\\|", + end: "\\|", + relevance: 5 + }, { + begin: "q[qwxr]?\\s*<", + end: ">", + relevance: 5 + }, { + begin: "qw\\s+q", + end: "q", + relevance: 5 + }, { + begin: "'", + end: "'", + contains: [e.BACKSLASH_ESCAPE] + }, { + begin: '"', + end: '"' + }, { + begin: "`", + end: "`", + contains: [e.BACKSLASH_ESCAPE] + }, { + begin: /\{\w+\}/, + relevance: 0 + }, { + begin: "-?\\w+\\s*=>", + relevance: 0 + }] + }, { + className: "number", + begin: "(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", + relevance: 0 + }, { + begin: "(\\/\\/|" + e.RE_STARTERS_RE + "|\\b(split|return|print|reverse|grep)\\b)\\s*", + keywords: "split return print reverse grep", + relevance: 0, + contains: [e.HASH_COMMENT_MODE, { + className: "regexp", + variants: [{ + begin: c("s|tr|y", n.either(...l, { + capture: !0 + })) + }, { + begin: c("s|tr|y", "\\(", "\\)") + }, { + begin: c("s|tr|y", "\\[", "\\]") + }, { + begin: c("s|tr|y", "\\{", "\\}") + }], + relevance: 2 + }, { + className: "regexp", + variants: [{ + begin: /(m|qr)\/\//, + relevance: 0 + }, { + begin: d("(?:m|qr)?", /\//, /\//) + }, { + begin: d("m|qr", n.either(...l, { + capture: !0 + }), /\1/) + }, { + begin: d("m|qr", /\(/, /\)/) + }, { + begin: d("m|qr", /\[/, /\]/) + }, { + begin: d("m|qr", /\{/, /\}/) + }] + }] + }, { + className: "function", + beginKeywords: "sub", + end: "(\\s*\\(.*?\\))?[;{]", + excludeEnd: !0, + relevance: 5, + contains: [e.TITLE_MODE] + }, { + begin: "-\\w\\b", + relevance: 0 + }, { + begin: "^__DATA__$", + end: "^__END__$", + subLanguage: "mojolicious", + contains: [{ + begin: "^@@.*", + end: "$", + className: "comment" + }] + }]; + return i.contains = g, r.contains = g, { + name: "Perl", + aliases: ["pl", "pm"], + keywords: a, + contains: g + } + }, + grmr_php: e => { + const n = e.regex, + t = /(?![A-Za-z0-9])(?![$])/, + a = n.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/, t), + i = n.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/, t), + r = { + scope: "variable", + match: "\\$+" + a + }, + s = { + scope: "subst", + variants: [{ + begin: /\$\w+/ + }, { + begin: /\{\$/, + end: /\}/ + }] + }, + o = e.inherit(e.APOS_STRING_MODE, { + illegal: null + }), + l = "[ \t\n]", + c = { + scope: "string", + variants: [e.inherit(e.QUOTE_STRING_MODE, { + illegal: null, + contains: e.QUOTE_STRING_MODE.contains.concat(s) + }), o, e.END_SAME_AS_BEGIN({ + begin: /<<<[ \t]*(\w+)\n/, + end: /[ \t]*(\w+)\b/, + contains: e.QUOTE_STRING_MODE.contains.concat(s) + })] + }, + d = { + scope: "number", + variants: [{ + begin: "\\b0[bB][01]+(?:_[01]+)*\\b" + }, { + begin: "\\b0[oO][0-7]+(?:_[0-7]+)*\\b" + }, { + begin: "\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b" + }, { + begin: "(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" + }], + relevance: 0 + }, + g = ["false", "null", "true"], + u = ["__CLASS__", "__DIR__", "__FILE__", "__FUNCTION__", "__COMPILER_HALT_OFFSET__", "__LINE__", + "__METHOD__", "__NAMESPACE__", "__TRAIT__", "die", "echo", "exit", "include", "include_once", "print", + "require", "require_once", "array", "abstract", "and", "as", "binary", "bool", "boolean", "break", + "callable", "case", "catch", "class", "clone", "const", "continue", "declare", "default", "do", "double", + "else", "elseif", "empty", "enddeclare", "endfor", "endforeach", "endif", "endswitch", "endwhile", "enum", + "eval", "extends", "final", "finally", "float", "for", "foreach", "from", "global", "goto", "if", + "implements", "instanceof", "insteadof", "int", "integer", "interface", "isset", "iterable", "list", + "match|0", "mixed", "new", "never", "object", "or", "private", "protected", "public", "readonly", "real", + "return", "string", "switch", "throw", "trait", "try", "unset", "use", "var", "void", "while", "xor", + "yield" + ], + b = ["Error|0", "AppendIterator", "ArgumentCountError", "ArithmeticError", "ArrayIterator", "ArrayObject", + "AssertionError", "BadFunctionCallException", "BadMethodCallException", "CachingIterator", + "CallbackFilterIterator", "CompileError", "Countable", "DirectoryIterator", "DivisionByZeroError", + "DomainException", "EmptyIterator", "ErrorException", "Exception", "FilesystemIterator", "FilterIterator", + "GlobIterator", "InfiniteIterator", "InvalidArgumentException", "IteratorIterator", "LengthException", + "LimitIterator", "LogicException", "MultipleIterator", "NoRewindIterator", "OutOfBoundsException", + "OutOfRangeException", "OuterIterator", "OverflowException", "ParentIterator", "ParseError", + "RangeException", "RecursiveArrayIterator", "RecursiveCachingIterator", "RecursiveCallbackFilterIterator", + "RecursiveDirectoryIterator", "RecursiveFilterIterator", "RecursiveIterator", "RecursiveIteratorIterator", + "RecursiveRegexIterator", "RecursiveTreeIterator", "RegexIterator", "RuntimeException", + "SeekableIterator", "SplDoublyLinkedList", "SplFileInfo", "SplFileObject", "SplFixedArray", "SplHeap", + "SplMaxHeap", "SplMinHeap", "SplObjectStorage", "SplObserver", "SplPriorityQueue", "SplQueue", "SplStack", + "SplSubject", "SplTempFileObject", "TypeError", "UnderflowException", "UnexpectedValueException", + "UnhandledMatchError", "ArrayAccess", "BackedEnum", "Closure", "Fiber", "Generator", "Iterator", + "IteratorAggregate", "Serializable", "Stringable", "Throwable", "Traversable", "UnitEnum", + "WeakReference", "WeakMap", "Directory", "__PHP_Incomplete_Class", "parent", "php_user_filter", "self", + "static", "stdClass" + ], + m = { + keyword: u, + literal: (e => { + const n = []; + return e.forEach((e => { + n.push(e), e.toLowerCase() === e ? n.push(e.toUpperCase()) : n.push(e.toLowerCase()) + })), n + })(g), + built_in: b + }, + p = e => e.map((e => e.replace(/\|\d+$/, ""))), + _ = { + variants: [{ + match: [/new/, n.concat(l, "+"), n.concat("(?!", p(b).join("\\b|"), "\\b)"), i], + scope: { + 1: "keyword", + 4: "title.class" + } + }] + }, + h = n.concat(a, "\\b(?!\\()"), + f = { + variants: [{ + match: [n.concat(/::/, n.lookahead(/(?!class\b)/)), h], + scope: { + 2: "variable.constant" + } + }, { + match: [/::/, /class/], + scope: { + 2: "variable.language" + } + }, { + match: [i, n.concat(/::/, n.lookahead(/(?!class\b)/)), h], + scope: { + 1: "title.class", + 3: "variable.constant" + } + }, { + match: [i, n.concat("::", n.lookahead(/(?!class\b)/))], + scope: { + 1: "title.class" + } + }, { + match: [i, /::/, /class/], + scope: { + 1: "title.class", + 3: "variable.language" + } + }] + }, + E = { + scope: "attr", + match: n.concat(a, n.lookahead(":"), n.lookahead(/(?!::)/)) + }, + y = { + relevance: 0, + begin: /\(/, + end: /\)/, + keywords: m, + contains: [E, r, f, e.C_BLOCK_COMMENT_MODE, c, d, _] + }, + w = { + relevance: 0, + match: [/\b/, n.concat("(?!fn\\b|function\\b|", p(u).join("\\b|"), "|", p(b).join("\\b|"), "\\b)"), a, n + .concat(l, "*"), n.lookahead(/(?=\()/) + ], + scope: { + 3: "title.function.invoke" + }, + contains: [y] + }; + y.contains.push(w); + const N = [E, f, e.C_BLOCK_COMMENT_MODE, c, d, _]; + return { + case_insensitive: !1, + keywords: m, + contains: [{ + begin: n.concat(/#\[\s*/, i), + beginScope: "meta", + end: /]/, + endScope: "meta", + keywords: { + literal: g, + keyword: ["new", "array"] + }, + contains: [{ + begin: /\[/, + end: /]/, + keywords: { + literal: g, + keyword: ["new", "array"] + }, + contains: ["self", ...N] + }, ...N, { + scope: "meta", + match: i + }] + }, e.HASH_COMMENT_MODE, e.COMMENT("//", "$"), e.COMMENT("/\\*", "\\*/", { + contains: [{ + scope: "doctag", + match: "@[A-Za-z]+" + }] + }), { + match: /__halt_compiler\(\);/, + keywords: "__halt_compiler", + starts: { + scope: "comment", + end: e.MATCH_NOTHING_RE, + contains: [{ + match: /\?>/, + scope: "meta", + endsParent: !0 + }] + } + }, { + scope: "meta", + variants: [{ + begin: /<\?php/, + relevance: 10 + }, { + begin: /<\?=/ + }, { + begin: /<\?/, + relevance: .1 + }, { + begin: /\?>/ + }] + }, { + scope: "variable.language", + match: /\$this\b/ + }, r, w, f, { + match: [/const/, /\s/, a], + scope: { + 1: "keyword", + 3: "variable.constant" + } + }, _, { + scope: "function", + relevance: 0, + beginKeywords: "fn function", + end: /[;{]/, + excludeEnd: !0, + illegal: "[$%\\[]", + contains: [{ + beginKeywords: "use" + }, e.UNDERSCORE_TITLE_MODE, { + begin: "=>", + endsParent: !0 + }, { + scope: "params", + begin: "\\(", + end: "\\)", + excludeBegin: !0, + excludeEnd: !0, + keywords: m, + contains: ["self", r, f, e.C_BLOCK_COMMENT_MODE, c, d] + }] + }, { + scope: "class", + variants: [{ + beginKeywords: "enum", + illegal: /[($"]/ + }, { + beginKeywords: "class interface trait", + illegal: /[:($"]/ + }], + relevance: 0, + end: /\{/, + excludeEnd: !0, + contains: [{ + beginKeywords: "extends implements" + }, e.UNDERSCORE_TITLE_MODE] + }, { + beginKeywords: "namespace", + relevance: 0, + end: ";", + illegal: /[.']/, + contains: [e.inherit(e.UNDERSCORE_TITLE_MODE, { + scope: "title.class" + })] + }, { + beginKeywords: "use", + relevance: 0, + end: ";", + contains: [{ + match: /\b(as|const|function)\b/, + scope: "keyword" + }, e.UNDERSCORE_TITLE_MODE] + }, c, d] + } + }, + grmr_php_template: e => ({ + name: "PHP template", + subLanguage: "xml", + contains: [{ + begin: /<\?(php|=)?/, + end: /\?>/, + subLanguage: "php", + contains: [{ + begin: "/\\*", + end: "\\*/", + skip: !0 + }, { + begin: 'b"', + end: '"', + skip: !0 + }, { + begin: "b'", + end: "'", + skip: !0 + }, e.inherit(e.APOS_STRING_MODE, { + illegal: null, + className: null, + contains: null, + skip: !0 + }), e.inherit(e.QUOTE_STRING_MODE, { + illegal: null, + className: null, + contains: null, + skip: !0 + })] + }] + }), + grmr_plaintext: e => ({ + name: "Plain text", + aliases: ["text", "txt"], + disableAutodetect: !0 + }), + grmr_python: e => { + const n = e.regex, + t = /(?:[A-Z_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037B-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])(?:[0-9A-Z_a-z\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037B-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u0870-\u0887\u0889-\u088E\u0898-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3C-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C5D\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDD\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1-\u0CF3\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECE\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1715\u171F-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B4C\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDEFD-\uDF1C\uDF27\uDF30-\uDF50\uDF70-\uDF85\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC75\uDC7F-\uDCBA\uDCC2\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E-\uDE41\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39\uDF40-\uDF46]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF6\uDF00-\uDF10\uDF12-\uDF3A\uDF3E-\uDF42\uDF50-\uDF59\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC40-\uDC55]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0\uDFF1]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD833[\uDF00-\uDF2D\uDF30-\uDF46]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDC30-\uDC6D\uDC8F\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAE\uDEC0-\uDEF9]|\uD839[\uDCD0-\uDCF9\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF]|\uDB40[\uDD00-\uDDEF])*/, + a = ["and", "as", "assert", "async", "await", "break", "case", "class", "continue", "def", "del", "elif", + "else", "except", "finally", "for", "from", "global", "if", "import", "in", "is", "lambda", "match", + "nonlocal|10", "not", "or", "pass", "raise", "return", "try", "while", "with", "yield" + ], + i = { + $pattern: /[A-Za-z]\w+|__\w+__/, + keyword: a, + built_in: ["__import__", "abs", "all", "any", "ascii", "bin", "bool", "breakpoint", "bytearray", "bytes", + "callable", "chr", "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", + "enumerate", "eval", "exec", "filter", "float", "format", "frozenset", "getattr", "globals", + "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", + "list", "locals", "map", "max", "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", + "print", "property", "range", "repr", "reversed", "round", "set", "setattr", "slice", "sorted", + "staticmethod", "str", "sum", "super", "tuple", "type", "vars", "zip" + ], + literal: ["__debug__", "Ellipsis", "False", "None", "NotImplemented", "True"], + type: ["Any", "Callable", "Coroutine", "Dict", "List", "Literal", "Generic", "Optional", "Sequence", + "Set", "Tuple", "Type", "Union" + ] + }, + r = { + className: "meta", + begin: /^(>>>|\.\.\.) / + }, + s = { + className: "subst", + begin: /\{/, + end: /\}/, + keywords: i, + illegal: /#/ + }, + o = { + begin: /\{\{/, + relevance: 0 + }, + l = { + className: "string", + contains: [e.BACKSLASH_ESCAPE], + variants: [{ + begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/, + end: /'''/, + contains: [e.BACKSLASH_ESCAPE, r], + relevance: 10 + }, { + begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/, + end: /"""/, + contains: [e.BACKSLASH_ESCAPE, r], + relevance: 10 + }, { + begin: /([fF][rR]|[rR][fF]|[fF])'''/, + end: /'''/, + contains: [e.BACKSLASH_ESCAPE, r, o, s] + }, { + begin: /([fF][rR]|[rR][fF]|[fF])"""/, + end: /"""/, + contains: [e.BACKSLASH_ESCAPE, r, o, s] + }, { + begin: /([uU]|[rR])'/, + end: /'/, + relevance: 10 + }, { + begin: /([uU]|[rR])"/, + end: /"/, + relevance: 10 + }, { + begin: /([bB]|[bB][rR]|[rR][bB])'/, + end: /'/ + }, { + begin: /([bB]|[bB][rR]|[rR][bB])"/, + end: /"/ + }, { + begin: /([fF][rR]|[rR][fF]|[fF])'/, + end: /'/, + contains: [e.BACKSLASH_ESCAPE, o, s] + }, { + begin: /([fF][rR]|[rR][fF]|[fF])"/, + end: /"/, + contains: [e.BACKSLASH_ESCAPE, o, s] + }, e.APOS_STRING_MODE, e.QUOTE_STRING_MODE] + }, + c = "[0-9](_?[0-9])*", + d = `(\\b(${c}))?\\.(${c})|\\b(${c})\\.`, + g = "\\b|" + a.join("|"), + u = { + className: "number", + relevance: 0, + variants: [{ + begin: `(\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${g})` + }, { + begin: `(${d})[jJ]?` + }, { + begin: `\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${g})` + }, { + begin: `\\b0[bB](_?[01])+[lL]?(?=${g})` + }, { + begin: `\\b0[oO](_?[0-7])+[lL]?(?=${g})` + }, { + begin: `\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${g})` + }, { + begin: `\\b(${c})[jJ](?=${g})` + }] + }, + b = { + className: "comment", + begin: n.lookahead(/# type:/), + end: /$/, + keywords: i, + contains: [{ + begin: /# type:/ + }, { + begin: /#/, + end: /\b\B/, + endsWithParent: !0 + }] + }, + m = { + className: "params", + variants: [{ + className: "", + begin: /\(\s*\)/, + skip: !0 + }, { + begin: /\(/, + end: /\)/, + excludeBegin: !0, + excludeEnd: !0, + keywords: i, + contains: ["self", r, u, l, e.HASH_COMMENT_MODE] + }] + }; + return s.contains = [l, u, r], { + name: "Python", + aliases: ["py", "gyp", "ipython"], + unicodeRegex: !0, + keywords: i, + illegal: /(<\/|->|\?)|=>/, + contains: [r, u, { + begin: /\bself\b/ + }, { + beginKeywords: "if", + relevance: 0 + }, l, b, e.HASH_COMMENT_MODE, { + match: [/\bdef/, /\s+/, t], + scope: { + 1: "keyword", + 3: "title.function" + }, + contains: [m] + }, { + variants: [{ + match: [/\bclass/, /\s+/, t, /\s*/, /\(\s*/, t, /\s*\)/] + }, { + match: [/\bclass/, /\s+/, t] + }], + scope: { + 1: "keyword", + 3: "title.class", + 6: "title.class.inherited" + } + }, { + className: "meta", + begin: /^[\t ]*@/, + end: /(?=#)|$/, + contains: [u, m, l] + }] + } + }, + grmr_python_repl: e => ({ + aliases: ["pycon"], + contains: [{ + className: "meta.prompt", + starts: { + end: / |$/, + starts: { + end: "$", + subLanguage: "python" + } + }, + variants: [{ + begin: /^>>>(?=[ ]|$)/ + }, { + begin: /^\.\.\.(?=[ ]|$)/ + }] + }] + }), + grmr_r: e => { + const n = e.regex, + t = /(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/, + a = n.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/, /0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/, + /(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/), + i = /[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/, + r = n.either(/[()]/, /[{}]/, /\[\[/, /[[\]]/, /\\/, /,/); + return { + name: "R", + keywords: { + $pattern: t, + keyword: "function if in break next repeat else for while", + literal: "NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", + built_in: "LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" + }, + contains: [e.COMMENT(/#'/, /$/, { + contains: [{ + scope: "doctag", + match: /@examples/, + starts: { + end: n.lookahead(n.either(/\n^#'\s*(?=@[a-zA-Z]+)/, /\n^(?!#')/)), + endsParent: !0 + } + }, { + scope: "doctag", + begin: "@param", + end: /$/, + contains: [{ + scope: "variable", + variants: [{ + match: t + }, { + match: /`(?:\\.|[^`\\])+`/ + }], + endsParent: !0 + }] + }, { + scope: "doctag", + match: /@[a-zA-Z]+/ + }, { + scope: "keyword", + match: /\\[a-zA-Z]+/ + }] + }), e.HASH_COMMENT_MODE, { + scope: "string", + contains: [e.BACKSLASH_ESCAPE], + variants: [e.END_SAME_AS_BEGIN({ + begin: /[rR]"(-*)\(/, + end: /\)(-*)"/ + }), e.END_SAME_AS_BEGIN({ + begin: /[rR]"(-*)\{/, + end: /\}(-*)"/ + }), e.END_SAME_AS_BEGIN({ + begin: /[rR]"(-*)\[/, + end: /\](-*)"/ + }), e.END_SAME_AS_BEGIN({ + begin: /[rR]'(-*)\(/, + end: /\)(-*)'/ + }), e.END_SAME_AS_BEGIN({ + begin: /[rR]'(-*)\{/, + end: /\}(-*)'/ + }), e.END_SAME_AS_BEGIN({ + begin: /[rR]'(-*)\[/, + end: /\](-*)'/ + }), { + begin: '"', + end: '"', + relevance: 0 + }, { + begin: "'", + end: "'", + relevance: 0 + }] + }, { + relevance: 0, + variants: [{ + scope: { + 1: "operator", + 2: "number" + }, + match: [i, a] + }, { + scope: { + 1: "operator", + 2: "number" + }, + match: [/%[^%]*%/, a] + }, { + scope: { + 1: "punctuation", + 2: "number" + }, + match: [r, a] + }, { + scope: { + 2: "number" + }, + match: [/[^a-zA-Z0-9._]|^/, a] + }] + }, { + scope: { + 3: "operator" + }, + match: [t, /\s+/, /<-/, /\s+/] + }, { + scope: "operator", + relevance: 0, + variants: [{ + match: i + }, { + match: /%[^%]*%/ + }] + }, { + scope: "punctuation", + relevance: 0, + match: r + }, { + begin: "`", + end: "`", + contains: [{ + begin: /\\./ + }] + }] + } + }, + grmr_ruby: e => { + const n = e.regex, + t = "([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)", + a = n.either(/\b([A-Z]+[a-z0-9]+)+/, /\b([A-Z]+[a-z0-9]+)+[A-Z]+/), + i = n.concat(a, /(::\w+)*/), + r = { + "variable.constant": ["__FILE__", "__LINE__", "__ENCODING__"], + "variable.language": ["self", "super"], + keyword: ["alias", "and", "begin", "BEGIN", "break", "case", "class", "defined", "do", "else", "elsif", + "end", "END", "ensure", "for", "if", "in", "module", "next", "not", "or", "redo", "require", "rescue", + "retry", "return", "then", "undef", "unless", "until", "when", "while", "yield", "include", "extend", + "prepend", "public", "private", "protected", "raise", "throw" + ], + built_in: ["proc", "lambda", "attr_accessor", "attr_reader", "attr_writer", "define_method", + "private_constant", "module_function" + ], + literal: ["true", "false", "nil"] + }, + s = { + className: "doctag", + begin: "@[A-Za-z]+" + }, + o = { + begin: "#<", + end: ">" + }, + l = [e.COMMENT("#", "$", { + contains: [s] + }), e.COMMENT("^=begin", "^=end", { + contains: [s], + relevance: 10 + }), e.COMMENT("^__END__", e.MATCH_NOTHING_RE)], + c = { + className: "subst", + begin: /#\{/, + end: /\}/, + keywords: r + }, + d = { + className: "string", + contains: [e.BACKSLASH_ESCAPE, c], + variants: [{ + begin: /'/, + end: /'/ + }, { + begin: /"/, + end: /"/ + }, { + begin: /`/, + end: /`/ + }, { + begin: /%[qQwWx]?\(/, + end: /\)/ + }, { + begin: /%[qQwWx]?\[/, + end: /\]/ + }, { + begin: /%[qQwWx]?\{/, + end: /\}/ + }, { + begin: /%[qQwWx]?/ + }, { + begin: /%[qQwWx]?\//, + end: /\// + }, { + begin: /%[qQwWx]?%/, + end: /%/ + }, { + begin: /%[qQwWx]?-/, + end: /-/ + }, { + begin: /%[qQwWx]?\|/, + end: /\|/ + }, { + begin: /\B\?(\\\d{1,3})/ + }, { + begin: /\B\?(\\x[A-Fa-f0-9]{1,2})/ + }, { + begin: /\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/ + }, { + begin: /\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/ + }, { + begin: /\B\?\\(c|C-)[\x20-\x7e]/ + }, { + begin: /\B\?\\?\S/ + }, { + begin: n.concat(/<<[-~]?'?/, n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), + contains: [e.END_SAME_AS_BEGIN({ + begin: /(\w+)/, + end: /(\w+)/, + contains: [e.BACKSLASH_ESCAPE, c] + })] + }] + }, + g = "[0-9](_?[0-9])*", + u = { + className: "number", + relevance: 0, + variants: [{ + begin: `\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b` + }, { + begin: "\\b0[dD][0-9](_?[0-9])*r?i?\\b" + }, { + begin: "\\b0[bB][0-1](_?[0-1])*r?i?\\b" + }, { + begin: "\\b0[oO][0-7](_?[0-7])*r?i?\\b" + }, { + begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b" + }, { + begin: "\\b0(_?[0-7])+r?i?\\b" + }] + }, + b = { + variants: [{ + match: /\(\)/ + }, { + className: "params", + begin: /\(/, + end: /(?=\))/, + excludeBegin: !0, + endsParent: !0, + keywords: r + }] + }, + m = [d, { + variants: [{ + match: [/class\s+/, i, /\s+<\s+/, i] + }, { + match: [/\b(class|module)\s+/, i] + }], + scope: { + 2: "title.class", + 4: "title.class.inherited" + }, + keywords: r + }, { + match: [/(include|extend)\s+/, i], + scope: { + 2: "title.class" + }, + keywords: r + }, { + relevance: 0, + match: [i, /\.new[. (]/], + scope: { + 1: "title.class" + } + }, { + relevance: 0, + match: /\b[A-Z][A-Z_0-9]+\b/, + className: "variable.constant" + }, { + relevance: 0, + match: a, + scope: "title.class" + }, { + match: [/def/, /\s+/, t], + scope: { + 1: "keyword", + 3: "title.function" + }, + contains: [b] + }, { + begin: e.IDENT_RE + "::" + }, { + className: "symbol", + begin: e.UNDERSCORE_IDENT_RE + "(!|\\?)?:", + relevance: 0 + }, { + className: "symbol", + begin: ":(?!\\s)", + contains: [d, { + begin: t + }], + relevance: 0 + }, u, { + className: "variable", + begin: "(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])" + }, { + className: "params", + begin: /\|/, + end: /\|/, + excludeBegin: !0, + excludeEnd: !0, + relevance: 0, + keywords: r + }, { + begin: "(" + e.RE_STARTERS_RE + "|unless)\\s*", + keywords: "unless", + contains: [{ + className: "regexp", + contains: [e.BACKSLASH_ESCAPE, c], + illegal: /\n/, + variants: [{ + begin: "/", + end: "/[a-z]*" + }, { + begin: /%r\{/, + end: /\}[a-z]*/ + }, { + begin: "%r\\(", + end: "\\)[a-z]*" + }, { + begin: "%r!", + end: "![a-z]*" + }, { + begin: "%r\\[", + end: "\\][a-z]*" + }] + }].concat(o, l), + relevance: 0 + }].concat(o, l); + c.contains = m, b.contains = m; + const p = [{ + begin: /^\s*=>/, + starts: { + end: "$", + contains: m + } + }, { + className: "meta.prompt", + begin: "^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", + starts: { + end: "$", + keywords: r, + contains: m + } + }]; + return l.unshift(o), { + name: "Ruby", + aliases: ["rb", "gemspec", "podspec", "thor", "irb"], + keywords: r, + illegal: /\/\*/, + contains: [e.SHEBANG({ + binary: "ruby" + })].concat(p).concat(l).concat(m) + } + }, + grmr_rust: e => { + const n = e.regex, + t = { + className: "title.function.invoke", + relevance: 0, + begin: n.concat(/\b/, /(?!let\b)/, e.IDENT_RE, n.lookahead(/\s*\(/)) + }, + a = "([ui](8|16|32|64|128|size)|f(32|64))?", + i = ["drop ", "Copy", "Send", "Sized", "Sync", "Drop", "Fn", "FnMut", "FnOnce", "ToOwned", "Clone", "Debug", + "PartialEq", "PartialOrd", "Eq", "Ord", "AsRef", "AsMut", "Into", "From", "Default", "Iterator", "Extend", + "IntoIterator", "DoubleEndedIterator", "ExactSizeIterator", "SliceConcatExt", "ToString", "assert!", + "assert_eq!", "bitflags!", "bytes!", "cfg!", "col!", "concat!", "concat_idents!", "debug_assert!", + "debug_assert_eq!", "env!", "panic!", "file!", "format!", "format_args!", "include_bytes!", + "include_str!", "line!", "local_data_key!", "module_path!", "option_env!", "print!", "println!", + "select!", "stringify!", "try!", "unimplemented!", "unreachable!", "vec!", "write!", "writeln!", + "macro_rules!", "assert_ne!", "debug_assert_ne!" + ], + r = ["i8", "i16", "i32", "i64", "i128", "isize", "u8", "u16", "u32", "u64", "u128", "usize", "f32", "f64", + "str", "char", "bool", "Box", "Option", "Result", "String", "Vec" + ]; + return { + name: "Rust", + aliases: ["rs"], + keywords: { + $pattern: e.IDENT_RE + "!?", + type: r, + keyword: ["abstract", "as", "async", "await", "become", "box", "break", "const", "continue", "crate", + "do", "dyn", "else", "enum", "extern", "false", "final", "fn", "for", "if", "impl", "in", "let", + "loop", "macro", "match", "mod", "move", "mut", "override", "priv", "pub", "ref", "return", "self", + "Self", "static", "struct", "super", "trait", "true", "try", "type", "typeof", "unsafe", "unsized", + "use", "virtual", "where", "while", "yield" + ], + literal: ["true", "false", "Some", "None", "Ok", "Err"], + built_in: i + }, + illegal: "" + }, t] + } + }, + grmr_scss: e => { + const n = J(e), + t = te, + a = ne, + i = "@[a-z-]+", + r = { + className: "variable", + begin: "(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b", + relevance: 0 + }; + return { + name: "SCSS", + case_insensitive: !0, + illegal: "[=/|']", + contains: [e.C_LINE_COMMENT_MODE, e.C_BLOCK_COMMENT_MODE, n.CSS_NUMBER_MODE, { + className: "selector-id", + begin: "#[A-Za-z0-9_-]+", + relevance: 0 + }, { + className: "selector-class", + begin: "\\.[A-Za-z0-9_-]+", + relevance: 0 + }, n.ATTRIBUTE_SELECTOR_MODE, { + className: "selector-tag", + begin: "\\b(" + Y.join("|") + ")\\b", + relevance: 0 + }, { + className: "selector-pseudo", + begin: ":(" + a.join("|") + ")" + }, { + className: "selector-pseudo", + begin: ":(:)?(" + t.join("|") + ")" + }, r, { + begin: /\(/, + end: /\)/, + contains: [n.CSS_NUMBER_MODE] + }, n.CSS_VARIABLE, { + className: "attribute", + begin: "\\b(" + ae.join("|") + ")\\b" + }, { + begin: "\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" + }, { + begin: /:/, + end: /[;}{]/, + relevance: 0, + contains: [n.BLOCK_COMMENT, r, n.HEXCOLOR, n.CSS_NUMBER_MODE, e.QUOTE_STRING_MODE, e.APOS_STRING_MODE, + n.IMPORTANT, n.FUNCTION_DISPATCH + ] + }, { + begin: "@(page|font-face)", + keywords: { + $pattern: i, + keyword: "@page @font-face" + } + }, { + begin: "@", + end: "[{;]", + returnBegin: !0, + keywords: { + $pattern: /[a-z-]+/, + keyword: "and or not only", + attribute: ee.join(" ") + }, + contains: [{ + begin: i, + className: "keyword" + }, { + begin: /[a-z-]+(?=:)/, + className: "attribute" + }, r, e.QUOTE_STRING_MODE, e.APOS_STRING_MODE, n.HEXCOLOR, n.CSS_NUMBER_MODE] + }, n.FUNCTION_DISPATCH] + } + }, + grmr_shell: e => ({ + name: "Shell Session", + aliases: ["console", "shellsession"], + contains: [{ + className: "meta.prompt", + begin: /^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/, + starts: { + end: /[^\\](?=\s*$)/, + subLanguage: "bash" + } + }] + }), + grmr_sql: e => { + const n = e.regex, + t = e.COMMENT("--", "$"), + a = ["true", "false", "unknown"], + i = ["bigint", "binary", "blob", "boolean", "char", "character", "clob", "date", "dec", "decfloat", + "decimal", "float", "int", "integer", "interval", "nchar", "nclob", "national", "numeric", "real", "row", + "smallint", "time", "timestamp", "varchar", "varying", "varbinary" + ], + r = ["abs", "acos", "array_agg", "asin", "atan", "avg", "cast", "ceil", "ceiling", "coalesce", "corr", + "cos", "cosh", "count", "covar_pop", "covar_samp", "cume_dist", "dense_rank", "deref", "element", "exp", + "extract", "first_value", "floor", "json_array", "json_arrayagg", "json_exists", "json_object", + "json_objectagg", "json_query", "json_table", "json_table_primitive", "json_value", "lag", "last_value", + "lead", "listagg", "ln", "log", "log10", "lower", "max", "min", "mod", "nth_value", "ntile", "nullif", + "percent_rank", "percentile_cont", "percentile_disc", "position", "position_regex", "power", "rank", + "regr_avgx", "regr_avgy", "regr_count", "regr_intercept", "regr_r2", "regr_slope", "regr_sxx", "regr_sxy", + "regr_syy", "row_number", "sin", "sinh", "sqrt", "stddev_pop", "stddev_samp", "substring", + "substring_regex", "sum", "tan", "tanh", "translate", "translate_regex", "treat", "trim", "trim_array", + "unnest", "upper", "value_of", "var_pop", "var_samp", "width_bucket" + ], + s = ["create table", "insert into", "primary key", "foreign key", "not null", "alter table", + "add constraint", "grouping sets", "on overflow", "character set", "respect nulls", "ignore nulls", + "nulls first", "nulls last", "depth first", "breadth first" + ], + o = r, + l = ["abs", "acos", "all", "allocate", "alter", "and", "any", "are", "array", "array_agg", + "array_max_cardinality", "as", "asensitive", "asin", "asymmetric", "at", "atan", "atomic", + "authorization", "avg", "begin", "begin_frame", "begin_partition", "between", "bigint", "binary", "blob", + "boolean", "both", "by", "call", "called", "cardinality", "cascaded", "case", "cast", "ceil", "ceiling", + "char", "char_length", "character", "character_length", "check", "classifier", "clob", "close", + "coalesce", "collate", "collect", "column", "commit", "condition", "connect", "constraint", "contains", + "convert", "copy", "corr", "corresponding", "cos", "cosh", "count", "covar_pop", "covar_samp", "create", + "cross", "cube", "cume_dist", "current", "current_catalog", "current_date", + "current_default_transform_group", "current_path", "current_role", "current_row", "current_schema", + "current_time", "current_timestamp", "current_path", "current_role", "current_transform_group_for_type", + "current_user", "cursor", "cycle", "date", "day", "deallocate", "dec", "decimal", "decfloat", "declare", + "default", "define", "delete", "dense_rank", "deref", "describe", "deterministic", "disconnect", + "distinct", "double", "drop", "dynamic", "each", "element", "else", "empty", "end", "end_frame", + "end_partition", "end-exec", "equals", "escape", "every", "except", "exec", "execute", "exists", "exp", + "external", "extract", "false", "fetch", "filter", "first_value", "float", "floor", "for", "foreign", + "frame_row", "free", "from", "full", "function", "fusion", "get", "global", "grant", "group", "grouping", + "groups", "having", "hold", "hour", "identity", "in", "indicator", "initial", "inner", "inout", + "insensitive", "insert", "int", "integer", "intersect", "intersection", "interval", "into", "is", "join", + "json_array", "json_arrayagg", "json_exists", "json_object", "json_objectagg", "json_query", "json_table", + "json_table_primitive", "json_value", "lag", "language", "large", "last_value", "lateral", "lead", + "leading", "left", "like", "like_regex", "listagg", "ln", "local", "localtime", "localtimestamp", "log", + "log10", "lower", "match", "match_number", "match_recognize", "matches", "max", "member", "merge", + "method", "min", "minute", "mod", "modifies", "module", "month", "multiset", "national", "natural", + "nchar", "nclob", "new", "no", "none", "normalize", "not", "nth_value", "ntile", "null", "nullif", + "numeric", "octet_length", "occurrences_regex", "of", "offset", "old", "omit", "on", "one", "only", + "open", "or", "order", "out", "outer", "over", "overlaps", "overlay", "parameter", "partition", "pattern", + "per", "percent", "percent_rank", "percentile_cont", "percentile_disc", "period", "portion", "position", + "position_regex", "power", "precedes", "precision", "prepare", "primary", "procedure", "ptf", "range", + "rank", "reads", "real", "recursive", "ref", "references", "referencing", "regr_avgx", "regr_avgy", + "regr_count", "regr_intercept", "regr_r2", "regr_slope", "regr_sxx", "regr_sxy", "regr_syy", "release", + "result", "return", "returns", "revoke", "right", "rollback", "rollup", "row", "row_number", "rows", + "running", "savepoint", "scope", "scroll", "search", "second", "seek", "select", "sensitive", + "session_user", "set", "show", "similar", "sin", "sinh", "skip", "smallint", "some", "specific", + "specifictype", "sql", "sqlexception", "sqlstate", "sqlwarning", "sqrt", "start", "static", "stddev_pop", + "stddev_samp", "submultiset", "subset", "substring", "substring_regex", "succeeds", "sum", "symmetric", + "system", "system_time", "system_user", "table", "tablesample", "tan", "tanh", "then", "time", + "timestamp", "timezone_hour", "timezone_minute", "to", "trailing", "translate", "translate_regex", + "translation", "treat", "trigger", "trim", "trim_array", "true", "truncate", "uescape", "union", "unique", + "unknown", "unnest", "update", "upper", "user", "using", "value", "values", "value_of", "var_pop", + "var_samp", "varbinary", "varchar", "varying", "versioning", "when", "whenever", "where", "width_bucket", + "window", "with", "within", "without", "year", "add", "asc", "collation", "desc", "final", "first", + "last", "view" + ].filter((e => !r.includes(e))), + c = { + begin: n.concat(/\b/, n.either(...o), /\s*\(/), + relevance: 0, + keywords: { + built_in: o + } + }; + return { + name: "SQL", + case_insensitive: !0, + illegal: /[{}]|<\//, + keywords: { + $pattern: /\b[\w\.]+/, + keyword: ((e, { + exceptions: n, + when: t + } = {}) => { + const a = t; + return n = n || [], e.map((e => e.match(/\|\d+$/) || n.includes(e) ? e : a(e) ? e + "|0" : e)) + })(l, { + when: e => e.length < 3 + }), + literal: a, + type: i, + built_in: ["current_catalog", "current_date", "current_default_transform_group", "current_path", + "current_role", "current_schema", "current_transform_group_for_type", "current_user", "session_user", + "system_time", "system_user", "current_time", "localtime", "current_timestamp", "localtimestamp" + ] + }, + contains: [{ + begin: n.either(...s), + relevance: 0, + keywords: { + $pattern: /[\w\.]+/, + keyword: l.concat(s), + literal: a, + type: i + } + }, { + className: "type", + begin: n.either("double precision", "large object", "with timezone", "without timezone") + }, c, { + className: "variable", + begin: /@[a-z0-9]+/ + }, { + className: "string", + variants: [{ + begin: /'/, + end: /'/, + contains: [{ + begin: /''/ + }] + }] + }, { + begin: /"/, + end: /"/, + contains: [{ + begin: /""/ + }] + }, e.C_NUMBER_MODE, e.C_BLOCK_COMMENT_MODE, t, { + className: "operator", + begin: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, + relevance: 0 + }] + } + }, + grmr_swift: e => { + const n = { + match: /\s+/, + relevance: 0 + }, + t = e.COMMENT("/\\*", "\\*/", { + contains: ["self"] + }), + a = [e.C_LINE_COMMENT_MODE, t], + i = { + match: [/\./, p(...Ee, ...ye)], + className: { + 2: "keyword" + } + }, + r = { + match: m(/\./, p(...Ne)), + relevance: 0 + }, + s = Ne.filter((e => "string" == typeof e)).concat(["_|0"]), + o = { + variants: [{ + className: "keyword", + match: p(...Ne.filter((e => "string" != typeof e)).concat(we).map(fe), ...ye) + }] + }, + l = { + $pattern: p(/\b\w+/, /#\w+/), + keyword: s.concat(ke), + literal: ve + }, + c = [i, r, o], + d = [{ + match: m(/\./, p(...xe)), + relevance: 0 + }, { + className: "built_in", + match: m(/\b/, p(...xe), /(?=\()/) + }], + u = { + match: /->/, + relevance: 0 + }, + b = [u, { + className: "operator", + relevance: 0, + variants: [{ + match: Ae + }, { + match: `\\.(\\.|${Se})+` + }] + }], + _ = "([0-9a-fA-F]_*)+", + h = { + className: "number", + relevance: 0, + variants: [{ + match: "\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b" + }, { + match: `\\b0x(${_})(\\.(${_}))?([pP][+-]?(([0-9]_*)+))?\\b` + }, { + match: /\b0o([0-7]_*)+\b/ + }, { + match: /\b0b([01]_*)+\b/ + }] + }, + f = (e = "") => ({ + className: "subst", + variants: [{ + match: m(/\\/, e, /[0\\tnr"']/) + }, { + match: m(/\\/, e, /u\{[0-9a-fA-F]{1,8}\}/) + }] + }), + E = (e = "") => ({ + className: "subst", + match: m(/\\/, e, /[\t ]*(?:[\r\n]|\r\n)/) + }), + y = (e = "") => ({ + className: "subst", + label: "interpol", + begin: m(/\\/, e, /\(/), + end: /\)/ + }), + w = (e = "") => ({ + begin: m(e, /"""/), + end: m(/"""/, e), + contains: [f(e), E(e), y(e)] + }), + N = (e = "") => ({ + begin: m(e, /"/), + end: m(/"/, e), + contains: [f(e), y(e)] + }), + v = { + className: "string", + variants: [w(), w("#"), w("##"), w("###"), N(), N("#"), N("##"), N("###")] + }, + O = { + match: m(/`/, Re, /`/) + }, + k = [O, { + className: "variable", + match: /\$\d+/ + }, { + className: "variable", + match: `\\$${Te}+` + }], + x = [{ + match: /(@|#(un)?)available/, + className: "keyword", + starts: { + contains: [{ + begin: /\(/, + end: /\)/, + keywords: Le, + contains: [...b, h, v] + }] + } + }, { + className: "keyword", + match: m(/@/, p(...Ie)) + }, { + className: "meta", + match: m(/@/, Re) + }], + M = { + match: g(/\b[A-Z]/), + relevance: 0, + contains: [{ + className: "type", + match: m(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/, Te, "+") + }, { + className: "type", + match: De, + relevance: 0 + }, { + match: /[?!]+/, + relevance: 0 + }, { + match: /\.\.\./, + relevance: 0 + }, { + match: m(/\s+&\s+/, g(De)), + relevance: 0 + }] + }, + S = { + begin: //, + keywords: l, + contains: [...a, ...c, ...x, u, M] + }; + M.contains.push(S); + const A = { + begin: /\(/, + end: /\)/, + relevance: 0, + keywords: l, + contains: ["self", { + match: m(Re, /\s*:/), + keywords: "_|0", + relevance: 0 + }, ...a, ...c, ...d, ...b, h, v, ...k, ...x, M] + }, + C = { + begin: //, + contains: [...a, M] + }, + T = { + begin: /\(/, + end: /\)/, + keywords: l, + contains: [{ + begin: p(g(m(Re, /\s*:/)), g(m(Re, /\s+/, Re, /\s*:/))), + end: /:/, + relevance: 0, + contains: [{ + className: "keyword", + match: /\b_\b/ + }, { + className: "params", + match: Re + }] + }, ...a, ...c, ...b, h, v, ...x, M, A], + endsParent: !0, + illegal: /["']/ + }, + R = { + match: [/func/, /\s+/, p(O.match, Re, Ae)], + className: { + 1: "keyword", + 3: "title.function" + }, + contains: [C, T, n], + illegal: [/\[/, /%/] + }, + D = { + match: [/\b(?:subscript|init[?!]?)/, /\s*(?=[<(])/], + className: { + 1: "keyword" + }, + contains: [C, T, n], + illegal: /\[|%/ + }, + I = { + match: [/operator/, /\s+/, Ae], + className: { + 1: "keyword", + 3: "title" + } + }, + L = { + begin: [/precedencegroup/, /\s+/, De], + className: { + 1: "keyword", + 3: "title" + }, + contains: [M], + keywords: [...Oe, ...ve], + end: /}/ + }; + for (const e of v.variants) { + const n = e.contains.find((e => "interpol" === e.label)); + n.keywords = l; + const t = [...c, ...d, ...b, h, v, ...k]; + n.contains = [...t, { + begin: /\(/, + end: /\)/, + contains: ["self", ...t] + }] + } + return { + name: "Swift", + keywords: l, + contains: [...a, R, D, { + beginKeywords: "struct protocol class extension enum actor", + end: "\\{", + excludeEnd: !0, + keywords: l, + contains: [e.inherit(e.TITLE_MODE, { + className: "title.class", + begin: /[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/ + }), ...c] + }, I, L, { + beginKeywords: "import", + end: /$/, + contains: [...a], + relevance: 0 + }, ...c, ...d, ...b, h, v, ...k, ...x, M, A] + } + }, + grmr_typescript: e => { + const n = he(e), + t = ["any", "void", "number", "boolean", "string", "object", "never", "symbol", "bigint", "unknown"], + a = { + beginKeywords: "namespace", + end: /\{/, + excludeEnd: !0, + contains: [n.exports.CLASS_REFERENCE] + }, + i = { + beginKeywords: "interface", + end: /\{/, + excludeEnd: !0, + keywords: { + keyword: "interface extends", + built_in: t + }, + contains: [n.exports.CLASS_REFERENCE] + }, + r = { + $pattern: ce, + keyword: de.concat(["type", "namespace", "interface", "public", "private", "protected", "implements", + "declare", "abstract", "readonly", "enum", "override" + ]), + literal: ge, + built_in: _e.concat(t), + "variable.language": pe + }, + s = { + className: "meta", + begin: "@[A-Za-z$_][0-9A-Za-z$_]*" + }, + o = (e, n, t) => { + const a = e.contains.findIndex((e => e.label === n)); + if (-1 === a) throw Error("can not find mode to replace"); + e.contains.splice(a, 1, t) + }; + return Object.assign(n.keywords, r), + n.exports.PARAMS_CONTAINS.push(s), n.contains = n.contains.concat([s, a, i]), + o(n, "shebang", e.SHEBANG()), o(n, "use_strict", { + className: "meta", + relevance: 10, + begin: /^\s*['"]use strict['"]/ + }), n.contains.find((e => "func.def" === e.label)).relevance = 0, Object.assign(n, { + name: "TypeScript", + aliases: ["ts", "tsx"] + }), n + }, + grmr_vbnet: e => { + const n = e.regex, + t = /\d{1,2}\/\d{1,2}\/\d{4}/, + a = /\d{4}-\d{1,2}-\d{1,2}/, + i = /(\d|1[012])(:\d+){0,2} *(AM|PM)/, + r = /\d{1,2}(:\d{1,2}){1,2}/, + s = { + className: "literal", + variants: [{ + begin: n.concat(/# */, n.either(a, t), / *#/) + }, { + begin: n.concat(/# */, r, / *#/) + }, { + begin: n.concat(/# */, i, / *#/) + }, { + begin: n.concat(/# */, n.either(a, t), / +/, n.either(i, r), / *#/) + }] + }, + o = e.COMMENT(/'''/, /$/, { + contains: [{ + className: "doctag", + begin: /<\/?/, + end: />/ + }] + }), + l = e.COMMENT(null, /$/, { + variants: [{ + begin: /'/ + }, { + begin: /([\t ]|^)REM(?=\s)/ + }] + }); + return { + name: "Visual Basic .NET", + aliases: ["vb"], + case_insensitive: !0, + classNameAliases: { + label: "symbol" + }, + keywords: { + keyword: "addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", + built_in: "addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", + type: "boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", + literal: "true false nothing" + }, + illegal: "//|\\{|\\}|endif|gosub|variant|wend|^\\$ ", + contains: [{ + className: "string", + begin: /"(""|[^/n])"C\b/ + }, { + className: "string", + begin: /"/, + end: /"/, + illegal: /\n/, + contains: [{ + begin: /""/ + }] + }, s, { + className: "number", + relevance: 0, + variants: [{ + begin: /\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ + }, { + begin: /\b\d[\d_]*((U?[SIL])|[%&])?/ + }, { + begin: /&H[\dA-F_]+((U?[SIL])|[%&])?/ + }, { + begin: /&O[0-7_]+((U?[SIL])|[%&])?/ + }, { + begin: /&B[01_]+((U?[SIL])|[%&])?/ + }] + }, { + className: "label", + begin: /^\w+:/ + }, o, l, { + className: "meta", + begin: /[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, + end: /$/, + keywords: { + keyword: "const disable else elseif enable end externalsource if region then" + }, + contains: [l] + }] + } + }, + grmr_wasm: e => { + e.regex; + const n = e.COMMENT(/\(;/, /;\)/); + return n.contains.push("self"), { + name: "WebAssembly", + keywords: { + $pattern: /[\w.]+/, + keyword: ["anyfunc", "block", "br", "br_if", "br_table", "call", "call_indirect", "data", "drop", + "elem", "else", "end", "export", "func", "global.get", "global.set", "local.get", "local.set", + "local.tee", "get_global", "get_local", "global", "if", "import", "local", "loop", "memory", + "memory.grow", "memory.size", "module", "mut", "nop", "offset", "param", "result", "return", + "select", "set_global", "set_local", "start", "table", "tee_local", "then", "type", "unreachable" + ] + }, + contains: [e.COMMENT(/;;/, /$/), n, { + match: [/(?:offset|align)/, /\s*/, /=/], + className: { + 1: "keyword", + 3: "operator" + } + }, { + className: "variable", + begin: /\$[\w_]+/ + }, { + match: /(\((?!;)|\))+/, + className: "punctuation", + relevance: 0 + }, { + begin: [/(?:func|call|call_indirect)/, /\s+/, /\$[^\s)]+/], + className: { + 1: "keyword", + 3: "title.function" + } + }, e.QUOTE_STRING_MODE, { + match: /(i32|i64|f32|f64)(?!\.)/, + className: "type" + }, { + className: "keyword", + match: /\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ + }, { + className: "number", + relevance: 0, + match: /[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ + }] + } + }, + grmr_yaml: e => { + const n = "true false yes no null", + t = "[\\w#;/?:@&=+$,.~*'()[\\]]+", + a = { + className: "string", + relevance: 0, + variants: [{ + begin: /'/, + end: /'/ + }, { + begin: /"/, + end: /"/ + }, { + begin: /\S+/ + }], + contains: [e.BACKSLASH_ESCAPE, { + className: "template-variable", + variants: [{ + begin: /\{\{/, + end: /\}\}/ + }, { + begin: /%\{/, + end: /\}/ + }] + }] + }, + i = e.inherit(a, { + variants: [{ + begin: /'/, + end: /'/ + }, { + begin: /"/, + end: /"/ + }, { + begin: /[^\s,{}[\]]+/ + }] + }), + r = { + end: ",", + endsWithParent: !0, + excludeEnd: !0, + keywords: n, + relevance: 0 + }, + s = { + begin: /\{/, + end: /\}/, + contains: [r], + illegal: "\\n", + relevance: 0 + }, + o = { + begin: "\\[", + end: "\\]", + contains: [r], + illegal: "\\n", + relevance: 0 + }, + l = [{ + className: "attr", + variants: [{ + begin: "\\w[\\w :\\/.-]*:(?=[ \t]|$)" + }, { + begin: '"\\w[\\w :\\/.-]*":(?=[ \t]|$)' + }, { + begin: "'\\w[\\w :\\/.-]*':(?=[ \t]|$)" + }] + }, { + className: "meta", + begin: "^---\\s*$", + relevance: 10 + }, { + className: "string", + begin: "[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*" + }, { + begin: "<%[%=-]?", + end: "[%-]?%>", + subLanguage: "ruby", + excludeBegin: !0, + excludeEnd: !0, + relevance: 0 + }, { + className: "type", + begin: "!\\w+!" + t + }, { + className: "type", + begin: "!<" + t + ">" + }, { + className: "type", + begin: "!" + t + }, { + className: "type", + begin: "!!" + t + }, { + className: "meta", + begin: "&" + e.UNDERSCORE_IDENT_RE + "$" + }, { + className: "meta", + begin: "\\*" + e.UNDERSCORE_IDENT_RE + "$" + }, { + className: "bullet", + begin: "-(?=[ ]|$)", + relevance: 0 + }, e.HASH_COMMENT_MODE, { + beginKeywords: n, + keywords: { + literal: n + } + }, { + className: "number", + begin: "\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" + }, { + className: "number", + begin: e.C_NUMBER_RE + "\\b", + relevance: 0 + }, s, o, a], + c = [...l]; + return c.pop(), c.push(i), r.contains = c, { + name: "YAML", + case_insensitive: !0, + aliases: ["yml"], + contains: l + } + } +}); +const $e = V; +for (const e of Object.keys(Be)) { + const n = e.replace("grmr_", "").replace("_", "-"); + $e.registerLanguage(n, Be[e]) +} +export { + $e as + default +}; \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-markdown/markdown/markdown-it.min.js b/uni_modules/uview-next/components/u-markdown/markdown/markdown-it.min.js new file mode 100644 index 0000000..ab490d7 --- /dev/null +++ b/uni_modules/uview-next/components/u-markdown/markdown/markdown-it.min.js @@ -0,0 +1,2 @@ +function e(e){if(e.__esModule)return e;var r=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})})),r}var r={},t={Aacute:"Á",aacute:"á",Abreve:"Ă",abreve:"ă",ac:"∾",acd:"∿",acE:"∾̳",Acirc:"Â",acirc:"â",acute:"´",Acy:"А",acy:"а",AElig:"Æ",aelig:"æ",af:"⁡",Afr:"𝔄",afr:"𝔞",Agrave:"À",agrave:"à",alefsym:"ℵ",aleph:"ℵ",Alpha:"Α",alpha:"α",Amacr:"Ā",amacr:"ā",amalg:"⨿",amp:"&",AMP:"&",andand:"⩕",And:"⩓",and:"∧",andd:"⩜",andslope:"⩘",andv:"⩚",ang:"∠",ange:"⦤",angle:"∠",angmsdaa:"⦨",angmsdab:"⦩",angmsdac:"⦪",angmsdad:"⦫",angmsdae:"⦬",angmsdaf:"⦭",angmsdag:"⦮",angmsdah:"⦯",angmsd:"∡",angrt:"∟",angrtvb:"⊾",angrtvbd:"⦝",angsph:"∢",angst:"Å",angzarr:"⍼",Aogon:"Ą",aogon:"ą",Aopf:"𝔸",aopf:"𝕒",apacir:"⩯",ap:"≈",apE:"⩰",ape:"≊",apid:"≋",apos:"'",ApplyFunction:"⁡",approx:"≈",approxeq:"≊",Aring:"Å",aring:"å",Ascr:"𝒜",ascr:"𝒶",Assign:"≔",ast:"*",asymp:"≈",asympeq:"≍",Atilde:"Ã",atilde:"ã",Auml:"Ä",auml:"ä",awconint:"∳",awint:"⨑",backcong:"≌",backepsilon:"϶",backprime:"‵",backsim:"∽",backsimeq:"⋍",Backslash:"∖",Barv:"⫧",barvee:"⊽",barwed:"⌅",Barwed:"⌆",barwedge:"⌅",bbrk:"⎵",bbrktbrk:"⎶",bcong:"≌",Bcy:"Б",bcy:"б",bdquo:"„",becaus:"∵",because:"∵",Because:"∵",bemptyv:"⦰",bepsi:"϶",bernou:"ℬ",Bernoullis:"ℬ",Beta:"Β",beta:"β",beth:"ℶ",between:"≬",Bfr:"𝔅",bfr:"𝔟",bigcap:"⋂",bigcirc:"◯",bigcup:"⋃",bigodot:"⨀",bigoplus:"⨁",bigotimes:"⨂",bigsqcup:"⨆",bigstar:"★",bigtriangledown:"▽",bigtriangleup:"△",biguplus:"⨄",bigvee:"⋁",bigwedge:"⋀",bkarow:"⤍",blacklozenge:"⧫",blacksquare:"▪",blacktriangle:"▴",blacktriangledown:"▾",blacktriangleleft:"◂",blacktriangleright:"▸",blank:"␣",blk12:"▒",blk14:"░",blk34:"▓",block:"█",bne:"=⃥",bnequiv:"≡⃥",bNot:"⫭",bnot:"⌐",Bopf:"𝔹",bopf:"𝕓",bot:"⊥",bottom:"⊥",bowtie:"⋈",boxbox:"⧉",boxdl:"┐",boxdL:"╕",boxDl:"╖",boxDL:"╗",boxdr:"┌",boxdR:"╒",boxDr:"╓",boxDR:"╔",boxh:"─",boxH:"═",boxhd:"┬",boxHd:"╤",boxhD:"╥",boxHD:"╦",boxhu:"┴",boxHu:"╧",boxhU:"╨",boxHU:"╩",boxminus:"⊟",boxplus:"⊞",boxtimes:"⊠",boxul:"┘",boxuL:"╛",boxUl:"╜",boxUL:"╝",boxur:"└",boxuR:"╘",boxUr:"╙",boxUR:"╚",boxv:"│",boxV:"║",boxvh:"┼",boxvH:"╪",boxVh:"╫",boxVH:"╬",boxvl:"┤",boxvL:"╡",boxVl:"╢",boxVL:"╣",boxvr:"├",boxvR:"╞",boxVr:"╟",boxVR:"╠",bprime:"‵",breve:"˘",Breve:"˘",brvbar:"¦",bscr:"𝒷",Bscr:"ℬ",bsemi:"⁏",bsim:"∽",bsime:"⋍",bsolb:"⧅",bsol:"\\",bsolhsub:"⟈",bull:"•",bullet:"•",bump:"≎",bumpE:"⪮",bumpe:"≏",Bumpeq:"≎",bumpeq:"≏",Cacute:"Ć",cacute:"ć",capand:"⩄",capbrcup:"⩉",capcap:"⩋",cap:"∩",Cap:"⋒",capcup:"⩇",capdot:"⩀",CapitalDifferentialD:"ⅅ",caps:"∩︀",caret:"⁁",caron:"ˇ",Cayleys:"ℭ",ccaps:"⩍",Ccaron:"Č",ccaron:"č",Ccedil:"Ç",ccedil:"ç",Ccirc:"Ĉ",ccirc:"ĉ",Cconint:"∰",ccups:"⩌",ccupssm:"⩐",Cdot:"Ċ",cdot:"ċ",cedil:"¸",Cedilla:"¸",cemptyv:"⦲",cent:"¢",centerdot:"·",CenterDot:"·",cfr:"𝔠",Cfr:"ℭ",CHcy:"Ч",chcy:"ч",check:"✓",checkmark:"✓",Chi:"Χ",chi:"χ",circ:"ˆ",circeq:"≗",circlearrowleft:"↺",circlearrowright:"↻",circledast:"⊛",circledcirc:"⊚",circleddash:"⊝",CircleDot:"⊙",circledR:"®",circledS:"Ⓢ",CircleMinus:"⊖",CirclePlus:"⊕",CircleTimes:"⊗",cir:"○",cirE:"⧃",cire:"≗",cirfnint:"⨐",cirmid:"⫯",cirscir:"⧂",ClockwiseContourIntegral:"∲",CloseCurlyDoubleQuote:"”",CloseCurlyQuote:"’",clubs:"♣",clubsuit:"♣",colon:":",Colon:"∷",Colone:"⩴",colone:"≔",coloneq:"≔",comma:",",commat:"@",comp:"∁",compfn:"∘",complement:"∁",complexes:"ℂ",cong:"≅",congdot:"⩭",Congruent:"≡",conint:"∮",Conint:"∯",ContourIntegral:"∮",copf:"𝕔",Copf:"ℂ",coprod:"∐",Coproduct:"∐",copy:"©",COPY:"©",copysr:"℗",CounterClockwiseContourIntegral:"∳",crarr:"↵",cross:"✗",Cross:"⨯",Cscr:"𝒞",cscr:"𝒸",csub:"⫏",csube:"⫑",csup:"⫐",csupe:"⫒",ctdot:"⋯",cudarrl:"⤸",cudarrr:"⤵",cuepr:"⋞",cuesc:"⋟",cularr:"↶",cularrp:"⤽",cupbrcap:"⩈",cupcap:"⩆",CupCap:"≍",cup:"∪",Cup:"⋓",cupcup:"⩊",cupdot:"⊍",cupor:"⩅",cups:"∪︀",curarr:"↷",curarrm:"⤼",curlyeqprec:"⋞",curlyeqsucc:"⋟",curlyvee:"⋎",curlywedge:"⋏",curren:"¤",curvearrowleft:"↶",curvearrowright:"↷",cuvee:"⋎",cuwed:"⋏",cwconint:"∲",cwint:"∱",cylcty:"⌭",dagger:"†",Dagger:"‡",daleth:"ℸ",darr:"↓",Darr:"↡",dArr:"⇓",dash:"‐",Dashv:"⫤",dashv:"⊣",dbkarow:"⤏",dblac:"˝",Dcaron:"Ď",dcaron:"ď",Dcy:"Д",dcy:"д",ddagger:"‡",ddarr:"⇊",DD:"ⅅ",dd:"ⅆ",DDotrahd:"⤑",ddotseq:"⩷",deg:"°",Del:"∇",Delta:"Δ",delta:"δ",demptyv:"⦱",dfisht:"⥿",Dfr:"𝔇",dfr:"𝔡",dHar:"⥥",dharl:"⇃",dharr:"⇂",DiacriticalAcute:"´",DiacriticalDot:"˙",DiacriticalDoubleAcute:"˝",DiacriticalGrave:"`",DiacriticalTilde:"˜",diam:"⋄",diamond:"⋄",Diamond:"⋄",diamondsuit:"♦",diams:"♦",die:"¨",DifferentialD:"ⅆ",digamma:"ϝ",disin:"⋲",div:"÷",divide:"÷",divideontimes:"⋇",divonx:"⋇",DJcy:"Ђ",djcy:"ђ",dlcorn:"⌞",dlcrop:"⌍",dollar:"$",Dopf:"𝔻",dopf:"𝕕",Dot:"¨",dot:"˙",DotDot:"⃜",doteq:"≐",doteqdot:"≑",DotEqual:"≐",dotminus:"∸",dotplus:"∔",dotsquare:"⊡",doublebarwedge:"⌆",DoubleContourIntegral:"∯",DoubleDot:"¨",DoubleDownArrow:"⇓",DoubleLeftArrow:"⇐",DoubleLeftRightArrow:"⇔",DoubleLeftTee:"⫤",DoubleLongLeftArrow:"⟸",DoubleLongLeftRightArrow:"⟺",DoubleLongRightArrow:"⟹",DoubleRightArrow:"⇒",DoubleRightTee:"⊨",DoubleUpArrow:"⇑",DoubleUpDownArrow:"⇕",DoubleVerticalBar:"∥",DownArrowBar:"⤓",downarrow:"↓",DownArrow:"↓",Downarrow:"⇓",DownArrowUpArrow:"⇵",DownBreve:"̑",downdownarrows:"⇊",downharpoonleft:"⇃",downharpoonright:"⇂",DownLeftRightVector:"⥐",DownLeftTeeVector:"⥞",DownLeftVectorBar:"⥖",DownLeftVector:"↽",DownRightTeeVector:"⥟",DownRightVectorBar:"⥗",DownRightVector:"⇁",DownTeeArrow:"↧",DownTee:"⊤",drbkarow:"⤐",drcorn:"⌟",drcrop:"⌌",Dscr:"𝒟",dscr:"𝒹",DScy:"Ѕ",dscy:"ѕ",dsol:"⧶",Dstrok:"Đ",dstrok:"đ",dtdot:"⋱",dtri:"▿",dtrif:"▾",duarr:"⇵",duhar:"⥯",dwangle:"⦦",DZcy:"Џ",dzcy:"џ",dzigrarr:"⟿",Eacute:"É",eacute:"é",easter:"⩮",Ecaron:"Ě",ecaron:"ě",Ecirc:"Ê",ecirc:"ê",ecir:"≖",ecolon:"≕",Ecy:"Э",ecy:"э",eDDot:"⩷",Edot:"Ė",edot:"ė",eDot:"≑",ee:"ⅇ",efDot:"≒",Efr:"𝔈",efr:"𝔢",eg:"⪚",Egrave:"È",egrave:"è",egs:"⪖",egsdot:"⪘",el:"⪙",Element:"∈",elinters:"⏧",ell:"ℓ",els:"⪕",elsdot:"⪗",Emacr:"Ē",emacr:"ē",empty:"∅",emptyset:"∅",EmptySmallSquare:"◻",emptyv:"∅",EmptyVerySmallSquare:"▫",emsp13:" ",emsp14:" ",emsp:" ",ENG:"Ŋ",eng:"ŋ",ensp:" ",Eogon:"Ę",eogon:"ę",Eopf:"𝔼",eopf:"𝕖",epar:"⋕",eparsl:"⧣",eplus:"⩱",epsi:"ε",Epsilon:"Ε",epsilon:"ε",epsiv:"ϵ",eqcirc:"≖",eqcolon:"≕",eqsim:"≂",eqslantgtr:"⪖",eqslantless:"⪕",Equal:"⩵",equals:"=",EqualTilde:"≂",equest:"≟",Equilibrium:"⇌",equiv:"≡",equivDD:"⩸",eqvparsl:"⧥",erarr:"⥱",erDot:"≓",escr:"ℯ",Escr:"ℰ",esdot:"≐",Esim:"⩳",esim:"≂",Eta:"Η",eta:"η",ETH:"Ð",eth:"ð",Euml:"Ë",euml:"ë",euro:"€",excl:"!",exist:"∃",Exists:"∃",expectation:"ℰ",exponentiale:"ⅇ",ExponentialE:"ⅇ",fallingdotseq:"≒",Fcy:"Ф",fcy:"ф",female:"♀",ffilig:"ffi",fflig:"ff",ffllig:"ffl",Ffr:"𝔉",ffr:"𝔣",filig:"fi",FilledSmallSquare:"◼",FilledVerySmallSquare:"▪",fjlig:"fj",flat:"♭",fllig:"fl",fltns:"▱",fnof:"ƒ",Fopf:"𝔽",fopf:"𝕗",forall:"∀",ForAll:"∀",fork:"⋔",forkv:"⫙",Fouriertrf:"ℱ",fpartint:"⨍",frac12:"½",frac13:"⅓",frac14:"¼",frac15:"⅕",frac16:"⅙",frac18:"⅛",frac23:"⅔",frac25:"⅖",frac34:"¾",frac35:"⅗",frac38:"⅜",frac45:"⅘",frac56:"⅚",frac58:"⅝",frac78:"⅞",frasl:"⁄",frown:"⌢",fscr:"𝒻",Fscr:"ℱ",gacute:"ǵ",Gamma:"Γ",gamma:"γ",Gammad:"Ϝ",gammad:"ϝ",gap:"⪆",Gbreve:"Ğ",gbreve:"ğ",Gcedil:"Ģ",Gcirc:"Ĝ",gcirc:"ĝ",Gcy:"Г",gcy:"г",Gdot:"Ġ",gdot:"ġ",ge:"≥",gE:"≧",gEl:"⪌",gel:"⋛",geq:"≥",geqq:"≧",geqslant:"⩾",gescc:"⪩",ges:"⩾",gesdot:"⪀",gesdoto:"⪂",gesdotol:"⪄",gesl:"⋛︀",gesles:"⪔",Gfr:"𝔊",gfr:"𝔤",gg:"≫",Gg:"⋙",ggg:"⋙",gimel:"ℷ",GJcy:"Ѓ",gjcy:"ѓ",gla:"⪥",gl:"≷",glE:"⪒",glj:"⪤",gnap:"⪊",gnapprox:"⪊",gne:"⪈",gnE:"≩",gneq:"⪈",gneqq:"≩",gnsim:"⋧",Gopf:"𝔾",gopf:"𝕘",grave:"`",GreaterEqual:"≥",GreaterEqualLess:"⋛",GreaterFullEqual:"≧",GreaterGreater:"⪢",GreaterLess:"≷",GreaterSlantEqual:"⩾",GreaterTilde:"≳",Gscr:"𝒢",gscr:"ℊ",gsim:"≳",gsime:"⪎",gsiml:"⪐",gtcc:"⪧",gtcir:"⩺",gt:">",GT:">",Gt:"≫",gtdot:"⋗",gtlPar:"⦕",gtquest:"⩼",gtrapprox:"⪆",gtrarr:"⥸",gtrdot:"⋗",gtreqless:"⋛",gtreqqless:"⪌",gtrless:"≷",gtrsim:"≳",gvertneqq:"≩︀",gvnE:"≩︀",Hacek:"ˇ",hairsp:" ",half:"½",hamilt:"ℋ",HARDcy:"Ъ",hardcy:"ъ",harrcir:"⥈",harr:"↔",hArr:"⇔",harrw:"↭",Hat:"^",hbar:"ℏ",Hcirc:"Ĥ",hcirc:"ĥ",hearts:"♥",heartsuit:"♥",hellip:"…",hercon:"⊹",hfr:"𝔥",Hfr:"ℌ",HilbertSpace:"ℋ",hksearow:"⤥",hkswarow:"⤦",hoarr:"⇿",homtht:"∻",hookleftarrow:"↩",hookrightarrow:"↪",hopf:"𝕙",Hopf:"ℍ",horbar:"―",HorizontalLine:"─",hscr:"𝒽",Hscr:"ℋ",hslash:"ℏ",Hstrok:"Ħ",hstrok:"ħ",HumpDownHump:"≎",HumpEqual:"≏",hybull:"⁃",hyphen:"‐",Iacute:"Í",iacute:"í",ic:"⁣",Icirc:"Î",icirc:"î",Icy:"И",icy:"и",Idot:"İ",IEcy:"Е",iecy:"е",iexcl:"¡",iff:"⇔",ifr:"𝔦",Ifr:"ℑ",Igrave:"Ì",igrave:"ì",ii:"ⅈ",iiiint:"⨌",iiint:"∭",iinfin:"⧜",iiota:"℩",IJlig:"IJ",ijlig:"ij",Imacr:"Ī",imacr:"ī",image:"ℑ",ImaginaryI:"ⅈ",imagline:"ℐ",imagpart:"ℑ",imath:"ı",Im:"ℑ",imof:"⊷",imped:"Ƶ",Implies:"⇒",incare:"℅",in:"∈",infin:"∞",infintie:"⧝",inodot:"ı",intcal:"⊺",int:"∫",Int:"∬",integers:"ℤ",Integral:"∫",intercal:"⊺",Intersection:"⋂",intlarhk:"⨗",intprod:"⨼",InvisibleComma:"⁣",InvisibleTimes:"⁢",IOcy:"Ё",iocy:"ё",Iogon:"Į",iogon:"į",Iopf:"𝕀",iopf:"𝕚",Iota:"Ι",iota:"ι",iprod:"⨼",iquest:"¿",iscr:"𝒾",Iscr:"ℐ",isin:"∈",isindot:"⋵",isinE:"⋹",isins:"⋴",isinsv:"⋳",isinv:"∈",it:"⁢",Itilde:"Ĩ",itilde:"ĩ",Iukcy:"І",iukcy:"і",Iuml:"Ï",iuml:"ï",Jcirc:"Ĵ",jcirc:"ĵ",Jcy:"Й",jcy:"й",Jfr:"𝔍",jfr:"𝔧",jmath:"ȷ",Jopf:"𝕁",jopf:"𝕛",Jscr:"𝒥",jscr:"𝒿",Jsercy:"Ј",jsercy:"ј",Jukcy:"Є",jukcy:"є",Kappa:"Κ",kappa:"κ",kappav:"ϰ",Kcedil:"Ķ",kcedil:"ķ",Kcy:"К",kcy:"к",Kfr:"𝔎",kfr:"𝔨",kgreen:"ĸ",KHcy:"Х",khcy:"х",KJcy:"Ќ",kjcy:"ќ",Kopf:"𝕂",kopf:"𝕜",Kscr:"𝒦",kscr:"𝓀",lAarr:"⇚",Lacute:"Ĺ",lacute:"ĺ",laemptyv:"⦴",lagran:"ℒ",Lambda:"Λ",lambda:"λ",lang:"⟨",Lang:"⟪",langd:"⦑",langle:"⟨",lap:"⪅",Laplacetrf:"ℒ",laquo:"«",larrb:"⇤",larrbfs:"⤟",larr:"←",Larr:"↞",lArr:"⇐",larrfs:"⤝",larrhk:"↩",larrlp:"↫",larrpl:"⤹",larrsim:"⥳",larrtl:"↢",latail:"⤙",lAtail:"⤛",lat:"⪫",late:"⪭",lates:"⪭︀",lbarr:"⤌",lBarr:"⤎",lbbrk:"❲",lbrace:"{",lbrack:"[",lbrke:"⦋",lbrksld:"⦏",lbrkslu:"⦍",Lcaron:"Ľ",lcaron:"ľ",Lcedil:"Ļ",lcedil:"ļ",lceil:"⌈",lcub:"{",Lcy:"Л",lcy:"л",ldca:"⤶",ldquo:"“",ldquor:"„",ldrdhar:"⥧",ldrushar:"⥋",ldsh:"↲",le:"≤",lE:"≦",LeftAngleBracket:"⟨",LeftArrowBar:"⇤",leftarrow:"←",LeftArrow:"←",Leftarrow:"⇐",LeftArrowRightArrow:"⇆",leftarrowtail:"↢",LeftCeiling:"⌈",LeftDoubleBracket:"⟦",LeftDownTeeVector:"⥡",LeftDownVectorBar:"⥙",LeftDownVector:"⇃",LeftFloor:"⌊",leftharpoondown:"↽",leftharpoonup:"↼",leftleftarrows:"⇇",leftrightarrow:"↔",LeftRightArrow:"↔",Leftrightarrow:"⇔",leftrightarrows:"⇆",leftrightharpoons:"⇋",leftrightsquigarrow:"↭",LeftRightVector:"⥎",LeftTeeArrow:"↤",LeftTee:"⊣",LeftTeeVector:"⥚",leftthreetimes:"⋋",LeftTriangleBar:"⧏",LeftTriangle:"⊲",LeftTriangleEqual:"⊴",LeftUpDownVector:"⥑",LeftUpTeeVector:"⥠",LeftUpVectorBar:"⥘",LeftUpVector:"↿",LeftVectorBar:"⥒",LeftVector:"↼",lEg:"⪋",leg:"⋚",leq:"≤",leqq:"≦",leqslant:"⩽",lescc:"⪨",les:"⩽",lesdot:"⩿",lesdoto:"⪁",lesdotor:"⪃",lesg:"⋚︀",lesges:"⪓",lessapprox:"⪅",lessdot:"⋖",lesseqgtr:"⋚",lesseqqgtr:"⪋",LessEqualGreater:"⋚",LessFullEqual:"≦",LessGreater:"≶",lessgtr:"≶",LessLess:"⪡",lesssim:"≲",LessSlantEqual:"⩽",LessTilde:"≲",lfisht:"⥼",lfloor:"⌊",Lfr:"𝔏",lfr:"𝔩",lg:"≶",lgE:"⪑",lHar:"⥢",lhard:"↽",lharu:"↼",lharul:"⥪",lhblk:"▄",LJcy:"Љ",ljcy:"љ",llarr:"⇇",ll:"≪",Ll:"⋘",llcorner:"⌞",Lleftarrow:"⇚",llhard:"⥫",lltri:"◺",Lmidot:"Ŀ",lmidot:"ŀ",lmoustache:"⎰",lmoust:"⎰",lnap:"⪉",lnapprox:"⪉",lne:"⪇",lnE:"≨",lneq:"⪇",lneqq:"≨",lnsim:"⋦",loang:"⟬",loarr:"⇽",lobrk:"⟦",longleftarrow:"⟵",LongLeftArrow:"⟵",Longleftarrow:"⟸",longleftrightarrow:"⟷",LongLeftRightArrow:"⟷",Longleftrightarrow:"⟺",longmapsto:"⟼",longrightarrow:"⟶",LongRightArrow:"⟶",Longrightarrow:"⟹",looparrowleft:"↫",looparrowright:"↬",lopar:"⦅",Lopf:"𝕃",lopf:"𝕝",loplus:"⨭",lotimes:"⨴",lowast:"∗",lowbar:"_",LowerLeftArrow:"↙",LowerRightArrow:"↘",loz:"◊",lozenge:"◊",lozf:"⧫",lpar:"(",lparlt:"⦓",lrarr:"⇆",lrcorner:"⌟",lrhar:"⇋",lrhard:"⥭",lrm:"‎",lrtri:"⊿",lsaquo:"‹",lscr:"𝓁",Lscr:"ℒ",lsh:"↰",Lsh:"↰",lsim:"≲",lsime:"⪍",lsimg:"⪏",lsqb:"[",lsquo:"‘",lsquor:"‚",Lstrok:"Ł",lstrok:"ł",ltcc:"⪦",ltcir:"⩹",lt:"<",LT:"<",Lt:"≪",ltdot:"⋖",lthree:"⋋",ltimes:"⋉",ltlarr:"⥶",ltquest:"⩻",ltri:"◃",ltrie:"⊴",ltrif:"◂",ltrPar:"⦖",lurdshar:"⥊",luruhar:"⥦",lvertneqq:"≨︀",lvnE:"≨︀",macr:"¯",male:"♂",malt:"✠",maltese:"✠",Map:"⤅",map:"↦",mapsto:"↦",mapstodown:"↧",mapstoleft:"↤",mapstoup:"↥",marker:"▮",mcomma:"⨩",Mcy:"М",mcy:"м",mdash:"—",mDDot:"∺",measuredangle:"∡",MediumSpace:" ",Mellintrf:"ℳ",Mfr:"𝔐",mfr:"𝔪",mho:"℧",micro:"µ",midast:"*",midcir:"⫰",mid:"∣",middot:"·",minusb:"⊟",minus:"−",minusd:"∸",minusdu:"⨪",MinusPlus:"∓",mlcp:"⫛",mldr:"…",mnplus:"∓",models:"⊧",Mopf:"𝕄",mopf:"𝕞",mp:"∓",mscr:"𝓂",Mscr:"ℳ",mstpos:"∾",Mu:"Μ",mu:"μ",multimap:"⊸",mumap:"⊸",nabla:"∇",Nacute:"Ń",nacute:"ń",nang:"∠⃒",nap:"≉",napE:"⩰̸",napid:"≋̸",napos:"ʼn",napprox:"≉",natural:"♮",naturals:"ℕ",natur:"♮",nbsp:" ",nbump:"≎̸",nbumpe:"≏̸",ncap:"⩃",Ncaron:"Ň",ncaron:"ň",Ncedil:"Ņ",ncedil:"ņ",ncong:"≇",ncongdot:"⩭̸",ncup:"⩂",Ncy:"Н",ncy:"н",ndash:"–",nearhk:"⤤",nearr:"↗",neArr:"⇗",nearrow:"↗",ne:"≠",nedot:"≐̸",NegativeMediumSpace:"​",NegativeThickSpace:"​",NegativeThinSpace:"​",NegativeVeryThinSpace:"​",nequiv:"≢",nesear:"⤨",nesim:"≂̸",NestedGreaterGreater:"≫",NestedLessLess:"≪",NewLine:"\n",nexist:"∄",nexists:"∄",Nfr:"𝔑",nfr:"𝔫",ngE:"≧̸",nge:"≱",ngeq:"≱",ngeqq:"≧̸",ngeqslant:"⩾̸",nges:"⩾̸",nGg:"⋙̸",ngsim:"≵",nGt:"≫⃒",ngt:"≯",ngtr:"≯",nGtv:"≫̸",nharr:"↮",nhArr:"⇎",nhpar:"⫲",ni:"∋",nis:"⋼",nisd:"⋺",niv:"∋",NJcy:"Њ",njcy:"њ",nlarr:"↚",nlArr:"⇍",nldr:"‥",nlE:"≦̸",nle:"≰",nleftarrow:"↚",nLeftarrow:"⇍",nleftrightarrow:"↮",nLeftrightarrow:"⇎",nleq:"≰",nleqq:"≦̸",nleqslant:"⩽̸",nles:"⩽̸",nless:"≮",nLl:"⋘̸",nlsim:"≴",nLt:"≪⃒",nlt:"≮",nltri:"⋪",nltrie:"⋬",nLtv:"≪̸",nmid:"∤",NoBreak:"⁠",NonBreakingSpace:" ",nopf:"𝕟",Nopf:"ℕ",Not:"⫬",not:"¬",NotCongruent:"≢",NotCupCap:"≭",NotDoubleVerticalBar:"∦",NotElement:"∉",NotEqual:"≠",NotEqualTilde:"≂̸",NotExists:"∄",NotGreater:"≯",NotGreaterEqual:"≱",NotGreaterFullEqual:"≧̸",NotGreaterGreater:"≫̸",NotGreaterLess:"≹",NotGreaterSlantEqual:"⩾̸",NotGreaterTilde:"≵",NotHumpDownHump:"≎̸",NotHumpEqual:"≏̸",notin:"∉",notindot:"⋵̸",notinE:"⋹̸",notinva:"∉",notinvb:"⋷",notinvc:"⋶",NotLeftTriangleBar:"⧏̸",NotLeftTriangle:"⋪",NotLeftTriangleEqual:"⋬",NotLess:"≮",NotLessEqual:"≰",NotLessGreater:"≸",NotLessLess:"≪̸",NotLessSlantEqual:"⩽̸",NotLessTilde:"≴",NotNestedGreaterGreater:"⪢̸",NotNestedLessLess:"⪡̸",notni:"∌",notniva:"∌",notnivb:"⋾",notnivc:"⋽",NotPrecedes:"⊀",NotPrecedesEqual:"⪯̸",NotPrecedesSlantEqual:"⋠",NotReverseElement:"∌",NotRightTriangleBar:"⧐̸",NotRightTriangle:"⋫",NotRightTriangleEqual:"⋭",NotSquareSubset:"⊏̸",NotSquareSubsetEqual:"⋢",NotSquareSuperset:"⊐̸",NotSquareSupersetEqual:"⋣",NotSubset:"⊂⃒",NotSubsetEqual:"⊈",NotSucceeds:"⊁",NotSucceedsEqual:"⪰̸",NotSucceedsSlantEqual:"⋡",NotSucceedsTilde:"≿̸",NotSuperset:"⊃⃒",NotSupersetEqual:"⊉",NotTilde:"≁",NotTildeEqual:"≄",NotTildeFullEqual:"≇",NotTildeTilde:"≉",NotVerticalBar:"∤",nparallel:"∦",npar:"∦",nparsl:"⫽⃥",npart:"∂̸",npolint:"⨔",npr:"⊀",nprcue:"⋠",nprec:"⊀",npreceq:"⪯̸",npre:"⪯̸",nrarrc:"⤳̸",nrarr:"↛",nrArr:"⇏",nrarrw:"↝̸",nrightarrow:"↛",nRightarrow:"⇏",nrtri:"⋫",nrtrie:"⋭",nsc:"⊁",nsccue:"⋡",nsce:"⪰̸",Nscr:"𝒩",nscr:"𝓃",nshortmid:"∤",nshortparallel:"∦",nsim:"≁",nsime:"≄",nsimeq:"≄",nsmid:"∤",nspar:"∦",nsqsube:"⋢",nsqsupe:"⋣",nsub:"⊄",nsubE:"⫅̸",nsube:"⊈",nsubset:"⊂⃒",nsubseteq:"⊈",nsubseteqq:"⫅̸",nsucc:"⊁",nsucceq:"⪰̸",nsup:"⊅",nsupE:"⫆̸",nsupe:"⊉",nsupset:"⊃⃒",nsupseteq:"⊉",nsupseteqq:"⫆̸",ntgl:"≹",Ntilde:"Ñ",ntilde:"ñ",ntlg:"≸",ntriangleleft:"⋪",ntrianglelefteq:"⋬",ntriangleright:"⋫",ntrianglerighteq:"⋭",Nu:"Ν",nu:"ν",num:"#",numero:"№",numsp:" ",nvap:"≍⃒",nvdash:"⊬",nvDash:"⊭",nVdash:"⊮",nVDash:"⊯",nvge:"≥⃒",nvgt:">⃒",nvHarr:"⤄",nvinfin:"⧞",nvlArr:"⤂",nvle:"≤⃒",nvlt:"<⃒",nvltrie:"⊴⃒",nvrArr:"⤃",nvrtrie:"⊵⃒",nvsim:"∼⃒",nwarhk:"⤣",nwarr:"↖",nwArr:"⇖",nwarrow:"↖",nwnear:"⤧",Oacute:"Ó",oacute:"ó",oast:"⊛",Ocirc:"Ô",ocirc:"ô",ocir:"⊚",Ocy:"О",ocy:"о",odash:"⊝",Odblac:"Ő",odblac:"ő",odiv:"⨸",odot:"⊙",odsold:"⦼",OElig:"Œ",oelig:"œ",ofcir:"⦿",Ofr:"𝔒",ofr:"𝔬",ogon:"˛",Ograve:"Ò",ograve:"ò",ogt:"⧁",ohbar:"⦵",ohm:"Ω",oint:"∮",olarr:"↺",olcir:"⦾",olcross:"⦻",oline:"‾",olt:"⧀",Omacr:"Ō",omacr:"ō",Omega:"Ω",omega:"ω",Omicron:"Ο",omicron:"ο",omid:"⦶",ominus:"⊖",Oopf:"𝕆",oopf:"𝕠",opar:"⦷",OpenCurlyDoubleQuote:"“",OpenCurlyQuote:"‘",operp:"⦹",oplus:"⊕",orarr:"↻",Or:"⩔",or:"∨",ord:"⩝",order:"ℴ",orderof:"ℴ",ordf:"ª",ordm:"º",origof:"⊶",oror:"⩖",orslope:"⩗",orv:"⩛",oS:"Ⓢ",Oscr:"𝒪",oscr:"ℴ",Oslash:"Ø",oslash:"ø",osol:"⊘",Otilde:"Õ",otilde:"õ",otimesas:"⨶",Otimes:"⨷",otimes:"⊗",Ouml:"Ö",ouml:"ö",ovbar:"⌽",OverBar:"‾",OverBrace:"⏞",OverBracket:"⎴",OverParenthesis:"⏜",para:"¶",parallel:"∥",par:"∥",parsim:"⫳",parsl:"⫽",part:"∂",PartialD:"∂",Pcy:"П",pcy:"п",percnt:"%",period:".",permil:"‰",perp:"⊥",pertenk:"‱",Pfr:"𝔓",pfr:"𝔭",Phi:"Φ",phi:"φ",phiv:"ϕ",phmmat:"ℳ",phone:"☎",Pi:"Π",pi:"π",pitchfork:"⋔",piv:"ϖ",planck:"ℏ",planckh:"ℎ",plankv:"ℏ",plusacir:"⨣",plusb:"⊞",pluscir:"⨢",plus:"+",plusdo:"∔",plusdu:"⨥",pluse:"⩲",PlusMinus:"±",plusmn:"±",plussim:"⨦",plustwo:"⨧",pm:"±",Poincareplane:"ℌ",pointint:"⨕",popf:"𝕡",Popf:"ℙ",pound:"£",prap:"⪷",Pr:"⪻",pr:"≺",prcue:"≼",precapprox:"⪷",prec:"≺",preccurlyeq:"≼",Precedes:"≺",PrecedesEqual:"⪯",PrecedesSlantEqual:"≼",PrecedesTilde:"≾",preceq:"⪯",precnapprox:"⪹",precneqq:"⪵",precnsim:"⋨",pre:"⪯",prE:"⪳",precsim:"≾",prime:"′",Prime:"″",primes:"ℙ",prnap:"⪹",prnE:"⪵",prnsim:"⋨",prod:"∏",Product:"∏",profalar:"⌮",profline:"⌒",profsurf:"⌓",prop:"∝",Proportional:"∝",Proportion:"∷",propto:"∝",prsim:"≾",prurel:"⊰",Pscr:"𝒫",pscr:"𝓅",Psi:"Ψ",psi:"ψ",puncsp:" ",Qfr:"𝔔",qfr:"𝔮",qint:"⨌",qopf:"𝕢",Qopf:"ℚ",qprime:"⁗",Qscr:"𝒬",qscr:"𝓆",quaternions:"ℍ",quatint:"⨖",quest:"?",questeq:"≟",quot:'"',QUOT:'"',rAarr:"⇛",race:"∽̱",Racute:"Ŕ",racute:"ŕ",radic:"√",raemptyv:"⦳",rang:"⟩",Rang:"⟫",rangd:"⦒",range:"⦥",rangle:"⟩",raquo:"»",rarrap:"⥵",rarrb:"⇥",rarrbfs:"⤠",rarrc:"⤳",rarr:"→",Rarr:"↠",rArr:"⇒",rarrfs:"⤞",rarrhk:"↪",rarrlp:"↬",rarrpl:"⥅",rarrsim:"⥴",Rarrtl:"⤖",rarrtl:"↣",rarrw:"↝",ratail:"⤚",rAtail:"⤜",ratio:"∶",rationals:"ℚ",rbarr:"⤍",rBarr:"⤏",RBarr:"⤐",rbbrk:"❳",rbrace:"}",rbrack:"]",rbrke:"⦌",rbrksld:"⦎",rbrkslu:"⦐",Rcaron:"Ř",rcaron:"ř",Rcedil:"Ŗ",rcedil:"ŗ",rceil:"⌉",rcub:"}",Rcy:"Р",rcy:"р",rdca:"⤷",rdldhar:"⥩",rdquo:"”",rdquor:"”",rdsh:"↳",real:"ℜ",realine:"ℛ",realpart:"ℜ",reals:"ℝ",Re:"ℜ",rect:"▭",reg:"®",REG:"®",ReverseElement:"∋",ReverseEquilibrium:"⇋",ReverseUpEquilibrium:"⥯",rfisht:"⥽",rfloor:"⌋",rfr:"𝔯",Rfr:"ℜ",rHar:"⥤",rhard:"⇁",rharu:"⇀",rharul:"⥬",Rho:"Ρ",rho:"ρ",rhov:"ϱ",RightAngleBracket:"⟩",RightArrowBar:"⇥",rightarrow:"→",RightArrow:"→",Rightarrow:"⇒",RightArrowLeftArrow:"⇄",rightarrowtail:"↣",RightCeiling:"⌉",RightDoubleBracket:"⟧",RightDownTeeVector:"⥝",RightDownVectorBar:"⥕",RightDownVector:"⇂",RightFloor:"⌋",rightharpoondown:"⇁",rightharpoonup:"⇀",rightleftarrows:"⇄",rightleftharpoons:"⇌",rightrightarrows:"⇉",rightsquigarrow:"↝",RightTeeArrow:"↦",RightTee:"⊢",RightTeeVector:"⥛",rightthreetimes:"⋌",RightTriangleBar:"⧐",RightTriangle:"⊳",RightTriangleEqual:"⊵",RightUpDownVector:"⥏",RightUpTeeVector:"⥜",RightUpVectorBar:"⥔",RightUpVector:"↾",RightVectorBar:"⥓",RightVector:"⇀",ring:"˚",risingdotseq:"≓",rlarr:"⇄",rlhar:"⇌",rlm:"‏",rmoustache:"⎱",rmoust:"⎱",rnmid:"⫮",roang:"⟭",roarr:"⇾",robrk:"⟧",ropar:"⦆",ropf:"𝕣",Ropf:"ℝ",roplus:"⨮",rotimes:"⨵",RoundImplies:"⥰",rpar:")",rpargt:"⦔",rppolint:"⨒",rrarr:"⇉",Rrightarrow:"⇛",rsaquo:"›",rscr:"𝓇",Rscr:"ℛ",rsh:"↱",Rsh:"↱",rsqb:"]",rsquo:"’",rsquor:"’",rthree:"⋌",rtimes:"⋊",rtri:"▹",rtrie:"⊵",rtrif:"▸",rtriltri:"⧎",RuleDelayed:"⧴",ruluhar:"⥨",rx:"℞",Sacute:"Ś",sacute:"ś",sbquo:"‚",scap:"⪸",Scaron:"Š",scaron:"š",Sc:"⪼",sc:"≻",sccue:"≽",sce:"⪰",scE:"⪴",Scedil:"Ş",scedil:"ş",Scirc:"Ŝ",scirc:"ŝ",scnap:"⪺",scnE:"⪶",scnsim:"⋩",scpolint:"⨓",scsim:"≿",Scy:"С",scy:"с",sdotb:"⊡",sdot:"⋅",sdote:"⩦",searhk:"⤥",searr:"↘",seArr:"⇘",searrow:"↘",sect:"§",semi:";",seswar:"⤩",setminus:"∖",setmn:"∖",sext:"✶",Sfr:"𝔖",sfr:"𝔰",sfrown:"⌢",sharp:"♯",SHCHcy:"Щ",shchcy:"щ",SHcy:"Ш",shcy:"ш",ShortDownArrow:"↓",ShortLeftArrow:"←",shortmid:"∣",shortparallel:"∥",ShortRightArrow:"→",ShortUpArrow:"↑",shy:"­",Sigma:"Σ",sigma:"σ",sigmaf:"ς",sigmav:"ς",sim:"∼",simdot:"⩪",sime:"≃",simeq:"≃",simg:"⪞",simgE:"⪠",siml:"⪝",simlE:"⪟",simne:"≆",simplus:"⨤",simrarr:"⥲",slarr:"←",SmallCircle:"∘",smallsetminus:"∖",smashp:"⨳",smeparsl:"⧤",smid:"∣",smile:"⌣",smt:"⪪",smte:"⪬",smtes:"⪬︀",SOFTcy:"Ь",softcy:"ь",solbar:"⌿",solb:"⧄",sol:"/",Sopf:"𝕊",sopf:"𝕤",spades:"♠",spadesuit:"♠",spar:"∥",sqcap:"⊓",sqcaps:"⊓︀",sqcup:"⊔",sqcups:"⊔︀",Sqrt:"√",sqsub:"⊏",sqsube:"⊑",sqsubset:"⊏",sqsubseteq:"⊑",sqsup:"⊐",sqsupe:"⊒",sqsupset:"⊐",sqsupseteq:"⊒",square:"□",Square:"□",SquareIntersection:"⊓",SquareSubset:"⊏",SquareSubsetEqual:"⊑",SquareSuperset:"⊐",SquareSupersetEqual:"⊒",SquareUnion:"⊔",squarf:"▪",squ:"□",squf:"▪",srarr:"→",Sscr:"𝒮",sscr:"𝓈",ssetmn:"∖",ssmile:"⌣",sstarf:"⋆",Star:"⋆",star:"☆",starf:"★",straightepsilon:"ϵ",straightphi:"ϕ",strns:"¯",sub:"⊂",Sub:"⋐",subdot:"⪽",subE:"⫅",sube:"⊆",subedot:"⫃",submult:"⫁",subnE:"⫋",subne:"⊊",subplus:"⪿",subrarr:"⥹",subset:"⊂",Subset:"⋐",subseteq:"⊆",subseteqq:"⫅",SubsetEqual:"⊆",subsetneq:"⊊",subsetneqq:"⫋",subsim:"⫇",subsub:"⫕",subsup:"⫓",succapprox:"⪸",succ:"≻",succcurlyeq:"≽",Succeeds:"≻",SucceedsEqual:"⪰",SucceedsSlantEqual:"≽",SucceedsTilde:"≿",succeq:"⪰",succnapprox:"⪺",succneqq:"⪶",succnsim:"⋩",succsim:"≿",SuchThat:"∋",sum:"∑",Sum:"∑",sung:"♪",sup1:"¹",sup2:"²",sup3:"³",sup:"⊃",Sup:"⋑",supdot:"⪾",supdsub:"⫘",supE:"⫆",supe:"⊇",supedot:"⫄",Superset:"⊃",SupersetEqual:"⊇",suphsol:"⟉",suphsub:"⫗",suplarr:"⥻",supmult:"⫂",supnE:"⫌",supne:"⊋",supplus:"⫀",supset:"⊃",Supset:"⋑",supseteq:"⊇",supseteqq:"⫆",supsetneq:"⊋",supsetneqq:"⫌",supsim:"⫈",supsub:"⫔",supsup:"⫖",swarhk:"⤦",swarr:"↙",swArr:"⇙",swarrow:"↙",swnwar:"⤪",szlig:"ß",Tab:"\t",target:"⌖",Tau:"Τ",tau:"τ",tbrk:"⎴",Tcaron:"Ť",tcaron:"ť",Tcedil:"Ţ",tcedil:"ţ",Tcy:"Т",tcy:"т",tdot:"⃛",telrec:"⌕",Tfr:"𝔗",tfr:"𝔱",there4:"∴",therefore:"∴",Therefore:"∴",Theta:"Θ",theta:"θ",thetasym:"ϑ",thetav:"ϑ",thickapprox:"≈",thicksim:"∼",ThickSpace:"  ",ThinSpace:" ",thinsp:" ",thkap:"≈",thksim:"∼",THORN:"Þ",thorn:"þ",tilde:"˜",Tilde:"∼",TildeEqual:"≃",TildeFullEqual:"≅",TildeTilde:"≈",timesbar:"⨱",timesb:"⊠",times:"×",timesd:"⨰",tint:"∭",toea:"⤨",topbot:"⌶",topcir:"⫱",top:"⊤",Topf:"𝕋",topf:"𝕥",topfork:"⫚",tosa:"⤩",tprime:"‴",trade:"™",TRADE:"™",triangle:"▵",triangledown:"▿",triangleleft:"◃",trianglelefteq:"⊴",triangleq:"≜",triangleright:"▹",trianglerighteq:"⊵",tridot:"◬",trie:"≜",triminus:"⨺",TripleDot:"⃛",triplus:"⨹",trisb:"⧍",tritime:"⨻",trpezium:"⏢",Tscr:"𝒯",tscr:"𝓉",TScy:"Ц",tscy:"ц",TSHcy:"Ћ",tshcy:"ћ",Tstrok:"Ŧ",tstrok:"ŧ",twixt:"≬",twoheadleftarrow:"↞",twoheadrightarrow:"↠",Uacute:"Ú",uacute:"ú",uarr:"↑",Uarr:"↟",uArr:"⇑",Uarrocir:"⥉",Ubrcy:"Ў",ubrcy:"ў",Ubreve:"Ŭ",ubreve:"ŭ",Ucirc:"Û",ucirc:"û",Ucy:"У",ucy:"у",udarr:"⇅",Udblac:"Ű",udblac:"ű",udhar:"⥮",ufisht:"⥾",Ufr:"𝔘",ufr:"𝔲",Ugrave:"Ù",ugrave:"ù",uHar:"⥣",uharl:"↿",uharr:"↾",uhblk:"▀",ulcorn:"⌜",ulcorner:"⌜",ulcrop:"⌏",ultri:"◸",Umacr:"Ū",umacr:"ū",uml:"¨",UnderBar:"_",UnderBrace:"⏟",UnderBracket:"⎵",UnderParenthesis:"⏝",Union:"⋃",UnionPlus:"⊎",Uogon:"Ų",uogon:"ų",Uopf:"𝕌",uopf:"𝕦",UpArrowBar:"⤒",uparrow:"↑",UpArrow:"↑",Uparrow:"⇑",UpArrowDownArrow:"⇅",updownarrow:"↕",UpDownArrow:"↕",Updownarrow:"⇕",UpEquilibrium:"⥮",upharpoonleft:"↿",upharpoonright:"↾",uplus:"⊎",UpperLeftArrow:"↖",UpperRightArrow:"↗",upsi:"υ",Upsi:"ϒ",upsih:"ϒ",Upsilon:"Υ",upsilon:"υ",UpTeeArrow:"↥",UpTee:"⊥",upuparrows:"⇈",urcorn:"⌝",urcorner:"⌝",urcrop:"⌎",Uring:"Ů",uring:"ů",urtri:"◹",Uscr:"𝒰",uscr:"𝓊",utdot:"⋰",Utilde:"Ũ",utilde:"ũ",utri:"▵",utrif:"▴",uuarr:"⇈",Uuml:"Ü",uuml:"ü",uwangle:"⦧",vangrt:"⦜",varepsilon:"ϵ",varkappa:"ϰ",varnothing:"∅",varphi:"ϕ",varpi:"ϖ",varpropto:"∝",varr:"↕",vArr:"⇕",varrho:"ϱ",varsigma:"ς",varsubsetneq:"⊊︀",varsubsetneqq:"⫋︀",varsupsetneq:"⊋︀",varsupsetneqq:"⫌︀",vartheta:"ϑ",vartriangleleft:"⊲",vartriangleright:"⊳",vBar:"⫨",Vbar:"⫫",vBarv:"⫩",Vcy:"В",vcy:"в",vdash:"⊢",vDash:"⊨",Vdash:"⊩",VDash:"⊫",Vdashl:"⫦",veebar:"⊻",vee:"∨",Vee:"⋁",veeeq:"≚",vellip:"⋮",verbar:"|",Verbar:"‖",vert:"|",Vert:"‖",VerticalBar:"∣",VerticalLine:"|",VerticalSeparator:"❘",VerticalTilde:"≀",VeryThinSpace:" ",Vfr:"𝔙",vfr:"𝔳",vltri:"⊲",vnsub:"⊂⃒",vnsup:"⊃⃒",Vopf:"𝕍",vopf:"𝕧",vprop:"∝",vrtri:"⊳",Vscr:"𝒱",vscr:"𝓋",vsubnE:"⫋︀",vsubne:"⊊︀",vsupnE:"⫌︀",vsupne:"⊋︀",Vvdash:"⊪",vzigzag:"⦚",Wcirc:"Ŵ",wcirc:"ŵ",wedbar:"⩟",wedge:"∧",Wedge:"⋀",wedgeq:"≙",weierp:"℘",Wfr:"𝔚",wfr:"𝔴",Wopf:"𝕎",wopf:"𝕨",wp:"℘",wr:"≀",wreath:"≀",Wscr:"𝒲",wscr:"𝓌",xcap:"⋂",xcirc:"◯",xcup:"⋃",xdtri:"▽",Xfr:"𝔛",xfr:"𝔵",xharr:"⟷",xhArr:"⟺",Xi:"Ξ",xi:"ξ",xlarr:"⟵",xlArr:"⟸",xmap:"⟼",xnis:"⋻",xodot:"⨀",Xopf:"𝕏",xopf:"𝕩",xoplus:"⨁",xotime:"⨂",xrarr:"⟶",xrArr:"⟹",Xscr:"𝒳",xscr:"𝓍",xsqcup:"⨆",xuplus:"⨄",xutri:"△",xvee:"⋁",xwedge:"⋀",Yacute:"Ý",yacute:"ý",YAcy:"Я",yacy:"я",Ycirc:"Ŷ",ycirc:"ŷ",Ycy:"Ы",ycy:"ы",yen:"¥",Yfr:"𝔜",yfr:"𝔶",YIcy:"Ї",yicy:"ї",Yopf:"𝕐",yopf:"𝕪",Yscr:"𝒴",yscr:"𝓎",YUcy:"Ю",yucy:"ю",yuml:"ÿ",Yuml:"Ÿ",Zacute:"Ź",zacute:"ź",Zcaron:"Ž",zcaron:"ž",Zcy:"З",zcy:"з",Zdot:"Ż",zdot:"ż",zeetrf:"ℨ",ZeroWidthSpace:"​",Zeta:"Ζ",zeta:"ζ",zfr:"𝔷",Zfr:"ℨ",ZHcy:"Ж",zhcy:"ж",zigrarr:"⇝",zopf:"𝕫",Zopf:"ℤ",Zscr:"𝒵",zscr:"𝓏",zwj:"‍",zwnj:"‌"},n=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/,s={},o={};function i(e,r,t){var n,s,a,c,l,u="";for("string"!=typeof r&&(t=r,r=i.defaultChars),void 0===t&&(t=!0),l=function(e){var r,t,n=o[e];if(n)return n;for(n=o[e]=[],r=0;r<128;r++)t=String.fromCharCode(r),/^[0-9a-z]$/i.test(t)?n.push(t):n.push("%"+("0"+r.toString(16).toUpperCase()).slice(-2));for(r=0;r=55296&&a<=57343){if(a>=55296&&a<=56319&&n+1=56320&&c<=57343){u+=encodeURIComponent(e[n]+e[n+1]),n++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(e[n]);return u}i.defaultChars=";/?:@&=+$,-_.!~*'()#",i.componentChars="-_.!~*'()";var a=i,c={};function l(e,r){var t;return"string"!=typeof r&&(r=l.defaultChars),t=function(e){var r,t,n=c[e];if(n)return n;for(n=c[e]=[],r=0;r<128;r++)t=String.fromCharCode(r),n.push(t);for(r=0;r=55296&&c<=57343?"���":String.fromCharCode(c),r+=6):240==(248&s)&&r+91114111?l+="����":(c-=65536,l+=String.fromCharCode(55296+(c>>10),56320+(1023&c))),r+=9):l+="�";return l}))}l.defaultChars=";/?:@&=+$,#",l.componentChars="";var u=l;function p(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var h=/^([a-z0-9.+-]+:)/i,f=/:[0-9]*$/,d=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,m=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),g=["'"].concat(m),_=["%","/","?",";","#"].concat(g),k=["/","?","#"],b=/^[+a-z0-9A-Z_-]{0,63}$/,v=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,C={javascript:!0,"javascript:":!0},y={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};p.prototype.parse=function(e,r){var t,n,s,o,i,a=e;if(a=a.trim(),!r&&1===e.split("#").length){var c=d.exec(a);if(c)return this.pathname=c[1],c[2]&&(this.search=c[2]),this}var l=h.exec(a);if(l&&(s=(l=l[0]).toLowerCase(),this.protocol=l,a=a.substr(l.length)),(r||l||a.match(/^\/\/[^@\/]+@[^@\/]+/))&&(!(i="//"===a.substr(0,2))||l&&C[l]||(a=a.substr(2),this.slashes=!0)),!C[l]&&(i||l&&!y[l])){var u,p,f=-1;for(t=0;t127?D+="x":D+=x[w];if(!D.match(b)){var q=A.slice(0,t),S=A.slice(t+1),F=x.match(v);F&&(q.push(F[1]),S.unshift(F[2])),S.length&&(a=S.join(".")+a),this.hostname=q.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),g&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var L=a.indexOf("#");-1!==L&&(this.hash=a.substr(L),a=a.slice(0,L));var z=a.indexOf("?");return-1!==z&&(this.search=a.substr(z),a=a.slice(0,z)),a&&(this.pathname=a),y[s]&&this.hostname&&!this.pathname&&(this.pathname=""),this},p.prototype.parseHost=function(e){var r=f.exec(e);r&&(":"!==(r=r[0])&&(this.port=r.substr(1)),e=e.substr(0,e.length-r.length)),e&&(this.hostname=e)};var A=function(e,r){if(e&&e instanceof p)return e;var t=new p;return t.parse(e,r),t};s.encode=a,s.decode=u,s.format=function(e){var r="";return r+=e.protocol||"",r+=e.slashes?"//":"",r+=e.auth?e.auth+"@":"",e.hostname&&-1!==e.hostname.indexOf(":")?r+="["+e.hostname+"]":r+=e.hostname||"",r+=e.port?":"+e.port:"",r+=e.pathname||"",r+=e.search||"",r+=e.hash||""},s.parse=A;var x={},D=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,w=/[\0-\x1F\x7F-\x9F]/,E=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/;x.Any=D,x.Cc=w,x.Cf=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/,x.P=n,x.Z=E,function(e){var r=Object.prototype.hasOwnProperty;function o(e,t){return r.call(e,t)}function i(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function a(e){if(e>65535){var r=55296+((e-=65536)>>10),t=56320+(1023&e);return String.fromCharCode(r,t)}return String.fromCharCode(e)}var c=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,l=new RegExp(c.source+"|"+/&([a-z#][a-z0-9]{1,31});/gi.source,"gi"),u=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,p=t;var h=/[&<>"]/,f=/[&<>"]/g,d={"&":"&","<":"<",">":">",'"':"""};function m(e){return d[e]}var g=/[.?*+^$[\]\\(){}|-]/g;var _=n;e.lib={},e.lib.mdurl=s,e.lib.ucmicro=x,e.assign=function(e){var r=Array.prototype.slice.call(arguments,1);return r.forEach((function(r){if(r){if("object"!=typeof r)throw new TypeError(r+"must be object");Object.keys(r).forEach((function(t){e[t]=r[t]}))}})),e},e.isString=function(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)},e.has=o,e.unescapeMd=function(e){return e.indexOf("\\")<0?e:e.replace(c,"$1")},e.unescapeAll=function(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(l,(function(e,r,t){return r||function(e,r){var t=0;return o(p,r)?p[r]:35===r.charCodeAt(0)&&u.test(r)&&i(t="x"===r[1].toLowerCase()?parseInt(r.slice(2),16):parseInt(r.slice(1),10))?a(t):e}(e,t)}))},e.isValidEntityCode=i,e.fromCodePoint=a,e.escapeHtml=function(e){return h.test(e)?e.replace(f,m):e},e.arrayReplaceAt=function(e,r,t){return[].concat(e.slice(0,r),t,e.slice(r+1))},e.isSpace=function(e){switch(e){case 9:case 32:return!0}return!1},e.isWhiteSpace=function(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1},e.isMdAsciiPunct=function(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}},e.isPunctChar=function(e){return _.test(e)},e.escapeRE=function(e){return e.replace(g,"\\$&")},e.normalizeReference=function(e){return e=e.trim().replace(/\s+/g," "),"Ṿ"==="ẞ".toLowerCase()&&(e=e.replace(/ẞ/g,"ß")),e.toLowerCase().toUpperCase()}}(r);var q={},S=r.unescapeAll,F=r.unescapeAll;q.parseLinkLabel=function(e,r,t){var n,s,o,i,a=-1,c=e.posMax,l=e.pos;for(e.pos=r+1,n=1;e.pos32)return i;if(41===n){if(0===s)break;s--}r++}return o===r||0!==s||(i.str=S(e.slice(o,r)),i.lines=0,i.pos=r,i.ok=!0),i},q.parseLinkTitle=function(e,r,t){var n,s,o=0,i=r,a={ok:!1,pos:0,lines:0,str:""};if(r>=t)return a;if(34!==(s=e.charCodeAt(r))&&39!==s&&40!==s)return a;for(r++,40===s&&(s=41);r"+T(e[r].content)+""},I.code_block=function(e,r,t,n,s){var o=e[r];return""+T(e[r].content)+"\n"},I.fence=function(e,r,t,n,s){var o,i,a,c,l,u=e[r],p=u.info?z(u.info).trim():"",h="",f="";return p&&(h=(a=p.split(/(\s+)/g))[0],f=a.slice(2).join("")),0===(o=t.highlight&&t.highlight(u.content,h,f)||T(u.content)).indexOf(""+o+"\n"):"
"+o+"
\n"},I.image=function(e,r,t,n,s){var o=e[r];return o.attrs[o.attrIndex("alt")][1]=s.renderInlineAsText(o.children,t,n),s.renderToken(e,r,t)},I.hardbreak=function(e,r,t){return t.xhtmlOut?"
\n":"
\n"},I.softbreak=function(e,r,t){return t.breaks?t.xhtmlOut?"
\n":"
\n":"\n"},I.text=function(e,r){return T(e[r].content)},I.html_block=function(e,r){return e[r].content},I.html_inline=function(e,r){return e[r].content},M.prototype.renderAttrs=function(e){var r,t,n;if(!e.attrs)return"";for(n="",r=0,t=e.attrs.length;r\n":">")},M.prototype.renderInline=function(e,r,t){for(var n,s="",o=this.rules,i=0,a=e.length;i/i.test(e)}var V=/\+-|\.\.|\?\?\?\?|!!!!|,,|--/,Z=/\((c|tm|r)\)/i,$=/\((c|tm|r)\)/gi,G={c:"©",r:"®",tm:"™"};function H(e,r){return G[r.toLowerCase()]}function J(e){var r,t,n=0;for(r=e.length-1;r>=0;r--)"text"!==(t=e[r]).type||n||(t.content=t.content.replace($,H)),"link_open"===t.type&&"auto"===t.info&&n--,"link_close"===t.type&&"auto"===t.info&&n++}function W(e){var r,t,n=0;for(r=e.length-1;r>=0;r--)"text"!==(t=e[r]).type||n||V.test(t.content)&&(t.content=t.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/gm,"$1—").replace(/(^|\s)--(?=\s|$)/gm,"$1–").replace(/(^|[^-\s])--(?=[^-\s]|$)/gm,"$1–")),"link_open"===t.type&&"auto"===t.info&&n--,"link_close"===t.type&&"auto"===t.info&&n++}var Y=r.isWhiteSpace,K=r.isPunctChar,Q=r.isMdAsciiPunct,X=/['"]/,ee=/['"]/g;function re(e,r,t){return e.slice(0,r)+t+e.slice(r+1)}function te(e,r){var t,n,s,o,i,a,c,l,u,p,h,f,d,m,g,_,k,b,v,C,y;for(v=[],t=0;t=0&&!(v[k].level<=c);k--);if(v.length=k+1,"text"===n.type){i=0,a=(s=n.content).length;e:for(;i=0)u=s.charCodeAt(o.index-1);else for(k=t-1;k>=0&&("softbreak"!==e[k].type&&"hardbreak"!==e[k].type);k--)if(e[k].content){u=e[k].content.charCodeAt(e[k].content.length-1);break}if(p=32,i=48&&u<=57&&(_=g=!1),g&&_&&(g=h,_=f),g||_){if(_)for(k=v.length-1;k>=0&&(l=v[k],!(v[k].level=0&&(t=this.attrs[r][1]),t},ne.prototype.attrJoin=function(e,r){var t=this.attrIndex(e);t<0?this.attrPush([e,r]):this.attrs[t][1]=this.attrs[t][1]+" "+r};var se=ne,oe=se;function ie(e,r,t){this.src=e,this.env=t,this.tokens=[],this.inlineMode=!1,this.md=r}ie.prototype.Token=oe;var ae=ie,ce=N,le=[["normalize",function(e){var r;r=(r=e.src.replace(O,"\n")).replace(P,"�"),e.src=r}],["block",function(e){var r;e.inlineMode?((r=new e.Token("inline","",0)).content=e.src,r.map=[0,1],r.children=[],e.tokens.push(r)):e.md.block.parse(e.src,e.md,e.env,e.tokens)}],["inline",function(e){var r,t,n,s=e.tokens;for(t=0,n=s.length;t=0;r--)if("link_close"!==(i=s[r]).type){if("html_inline"===i.type&&(k=i.content,/^\s]/i.test(k)&&f>0&&f--,U(i.content)&&f++),!(f>0)&&"text"===i.type&&e.md.linkify.test(i.content)){for(l=i.content,_=e.md.linkify.match(l),a=[],h=i.level,p=0,_.length>0&&0===_[0].index&&r>0&&"text_special"===s[r-1].type&&(_=_.slice(1)),c=0;c<_.length;c++)d=_[c].url,m=e.md.normalizeLink(d),e.md.validateLink(m)&&(g=_[c].text,g=_[c].schema?"mailto:"!==_[c].schema||/^mailto:/i.test(g)?e.md.normalizeLinkText(g):e.md.normalizeLinkText("mailto:"+g).replace(/^mailto:/,""):e.md.normalizeLinkText("http://"+g).replace(/^http:\/\//,""),(u=_[c].index)>p&&((o=new e.Token("text","",0)).content=l.slice(p,u),o.level=h,a.push(o)),(o=new e.Token("link_open","a",1)).attrs=[["href",m]],o.level=h++,o.markup="linkify",o.info="auto",a.push(o),(o=new e.Token("text","",0)).content=g,o.level=h,a.push(o),(o=new e.Token("link_close","a",-1)).level=--h,o.markup="linkify",o.info="auto",a.push(o),p=_[c].lastIndex);p=0;r--)"inline"===e.tokens[r].type&&(Z.test(e.tokens[r].content)&&J(e.tokens[r].children),V.test(e.tokens[r].content)&&W(e.tokens[r].children))}],["smartquotes",function(e){var r;if(e.md.options.typographer)for(r=e.tokens.length-1;r>=0;r--)"inline"===e.tokens[r].type&&X.test(e.tokens[r].content)&&te(e.tokens[r].children,e)}],["text_join",function(e){var r,t,n,s,o,i,a=e.tokens;for(r=0,t=a.length;r=o)return-1;if((t=e.src.charCodeAt(s++))<48||t>57)return-1;for(;;){if(s>=o)return-1;if(!((t=e.src.charCodeAt(s++))>=48&&t<=57)){if(41===t||46===t)break;return-1}if(s-n>=10)return-1}return s`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",xe="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",De=new RegExp("^(?:"+Ae+"|"+xe+"|\x3c!----\x3e|\x3c!--(?:-?[^>-])(?:-?[^-])*--\x3e|<[?][\\s\\S]*?[?]>|]*>|)"),we=new RegExp("^(?:"+Ae+"|"+xe+")");ye.HTML_TAG_RE=De,ye.HTML_OPEN_CLOSE_TAG_RE=we;var Ee=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","section","source","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],qe=ye.HTML_OPEN_CLOSE_TAG_RE,Se=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(qe.source+"\\s*$"),/^$/,!1]],Fe=r.isSpace,Le=se,ze=r.isSpace;function Te(e,r,t,n){var s,o,i,a,c,l,u,p;for(this.src=e,this.md=r,this.env=t,this.tokens=n,this.bMarks=[],this.eMarks=[],this.tShift=[],this.sCount=[],this.bsCount=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.ddIndent=-1,this.listIndent=-1,this.parentType="root",this.level=0,this.result="",p=!1,i=a=l=u=0,c=(o=this.src).length;a0&&this.level++,this.tokens.push(n),n},Te.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},Te.prototype.skipEmptyLines=function(e){for(var r=this.lineMax;er;)if(!ze(this.src.charCodeAt(--e)))return e+1;return e},Te.prototype.skipChars=function(e,r){for(var t=this.src.length;et;)if(r!==this.src.charCodeAt(--e))return e+1;return e},Te.prototype.getLines=function(e,r,t,n){var s,o,i,a,c,l,u,p=e;if(e>=r)return"";for(l=new Array(r-e),s=0;pt?new Array(o-t+1).join(" ")+this.src.slice(a,c):this.src.slice(a,c)}return l.join("")},Te.prototype.Token=Le;var Ie=Te,Me=N,Re=[["table",function(e,r,t,n){var s,o,i,a,c,l,u,p,h,f,d,m,g,_,k,b,v,C;if(r+2>t)return!1;if(l=r+1,e.sCount[l]=4)return!1;if((i=e.bMarks[l]+e.tShift[l])>=e.eMarks[l])return!1;if(124!==(v=e.src.charCodeAt(i++))&&45!==v&&58!==v)return!1;if(i>=e.eMarks[l])return!1;if(124!==(C=e.src.charCodeAt(i++))&&45!==C&&58!==C&&!he(C))return!1;if(45===v&&he(C))return!1;for(;i=4)return!1;if((u=de(o)).length&&""===u[0]&&u.shift(),u.length&&""===u[u.length-1]&&u.pop(),0===(p=u.length)||p!==f.length)return!1;if(n)return!0;for(_=e.parentType,e.parentType="table",b=e.md.block.ruler.getRules("blockquote"),(h=e.push("table_open","table",1)).map=m=[r,0],(h=e.push("thead_open","thead",1)).map=[r,r+1],(h=e.push("tr_open","tr",1)).map=[r,r+1],a=0;a=4)break;for((u=de(o)).length&&""===u[0]&&u.shift(),u.length&&""===u[u.length-1]&&u.pop(),l===r+2&&((h=e.push("tbody_open","tbody",1)).map=g=[r+2,0]),(h=e.push("tr_open","tr",1)).map=[l,l+1],a=0;a=4))break;s=++n}return e.line=s,(o=e.push("code_block","code",0)).content=e.getLines(r,s,4+e.blkIndent,!1)+"\n",o.map=[r,e.line],!0}],["fence",function(e,r,t,n){var s,o,i,a,c,l,u,p=!1,h=e.bMarks[r]+e.tShift[r],f=e.eMarks[r];if(e.sCount[r]-e.blkIndent>=4)return!1;if(h+3>f)return!1;if(126!==(s=e.src.charCodeAt(h))&&96!==s)return!1;if(c=h,(o=(h=e.skipChars(h,s))-c)<3)return!1;if(u=e.src.slice(c,h),i=e.src.slice(h,f),96===s&&i.indexOf(String.fromCharCode(s))>=0)return!1;if(n)return!0;for(a=r;!(++a>=t)&&!((h=c=e.bMarks[a]+e.tShift[a])<(f=e.eMarks[a])&&e.sCount[a]=4||(h=e.skipChars(h,s))-c=4)return!1;if(62!==e.src.charCodeAt(D++))return!1;if(n)return!0;for(a=h=e.sCount[r]+1,32===e.src.charCodeAt(D)?(D++,a++,h++,s=!1,b=!0):9===e.src.charCodeAt(D)?(b=!0,(e.bsCount[r]+h)%4==3?(D++,a++,h++,s=!1):s=!0):b=!1,f=[e.bMarks[r]],e.bMarks[r]=D;D=w,_=[e.sCount[r]],e.sCount[r]=h-a,k=[e.tShift[r]],e.tShift[r]=D-e.bMarks[r],C=e.md.block.ruler.getRules("blockquote"),g=e.parentType,e.parentType="blockquote",p=r+1;p=(w=e.eMarks[p])));p++)if(62!==e.src.charCodeAt(D++)||A){if(l)break;for(v=!1,i=0,c=C.length;i=w,d.push(e.bsCount[p]),e.bsCount[p]=e.sCount[p]+1+(b?1:0),_.push(e.sCount[p]),e.sCount[p]=h-a,k.push(e.tShift[p]),e.tShift[p]=D-e.bMarks[p]}for(m=e.blkIndent,e.blkIndent=0,(y=e.push("blockquote_open","blockquote",1)).markup=">",y.map=u=[r,0],e.md.block.tokenize(e,r,p),(y=e.push("blockquote_close","blockquote",-1)).markup=">",e.lineMax=x,e.parentType=g,u[1]=e.line,i=0;i=4)return!1;if(42!==(s=e.src.charCodeAt(c++))&&45!==s&&95!==s)return!1;for(o=1;c=4)return!1;if(e.listIndent>=0&&e.sCount[r]-e.listIndent>=4&&e.sCount[r]=e.blkIndent&&(z=!0),(w=be(e,r))>=0){if(u=!0,q=e.bMarks[r]+e.tShift[r],g=Number(e.src.slice(q,w-1)),z&&1!==g)return!1}else{if(!((w=ke(e,r))>=0))return!1;u=!1}if(z&&e.skipSpaces(w)>=e.eMarks[r])return!1;if(m=e.src.charCodeAt(w-1),n)return!0;for(d=e.tokens.length,u?(L=e.push("ordered_list_open","ol",1),1!==g&&(L.attrs=[["start",g]])):L=e.push("bullet_list_open","ul",1),L.map=f=[r,0],L.markup=String.fromCharCode(m),k=r,E=!1,F=e.md.block.ruler.getRules("list"),C=e.parentType,e.parentType="list";k=_?1:b-l)>4&&(c=1),a=l+c,(L=e.push("list_item_open","li",1)).markup=String.fromCharCode(m),L.map=p=[r,0],u&&(L.info=e.src.slice(q,w-1)),x=e.tight,A=e.tShift[r],y=e.sCount[r],v=e.listIndent,e.listIndent=e.blkIndent,e.blkIndent=a,e.tight=!0,e.tShift[r]=o-e.bMarks[r],e.sCount[r]=b,o>=_&&e.isEmpty(r+1)?e.line=Math.min(e.line+2,t):e.md.block.tokenize(e,r,t,!0),e.tight&&!E||(T=!1),E=e.line-r>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=v,e.tShift[r]=A,e.sCount[r]=y,e.tight=x,(L=e.push("list_item_close","li",-1)).markup=String.fromCharCode(m),k=r=e.line,p[1]=k,o=e.bMarks[r],k>=t)break;if(e.sCount[k]=4)break;for(S=!1,i=0,h=F.length;i=4)return!1;if(91!==e.src.charCodeAt(C))return!1;for(;++C3||e.sCount[A]<0)){for(_=!1,l=0,u=k.length;l=4)return!1;if(!e.md.options.html)return!1;if(60!==e.src.charCodeAt(c))return!1;for(a=e.src.slice(c,l),s=0;s=4)return!1;if(35!==(s=e.src.charCodeAt(c))||c>=l)return!1;for(o=1,s=e.src.charCodeAt(++c);35===s&&c6||cc&&Fe(e.src.charCodeAt(i-1))&&(l=i),e.line=r+1,(a=e.push("heading_open","h"+String(o),1)).markup="########".slice(0,o),a.map=[r,e.line],(a=e.push("inline","",0)).content=e.src.slice(c,l).trim(),a.map=[r,e.line],a.children=[],(a=e.push("heading_close","h"+String(o),-1)).markup="########".slice(0,o)),!0)},["paragraph","reference","blockquote"]],["lheading",function(e,r,t){var n,s,o,i,a,c,l,u,p,h,f=r+1,d=e.md.block.ruler.getRules("paragraph");if(e.sCount[r]-e.blkIndent>=4)return!1;for(h=e.parentType,e.parentType="paragraph";f3)){if(e.sCount[f]>=e.blkIndent&&(c=e.bMarks[f]+e.tShift[f])<(l=e.eMarks[f])&&(45===(p=e.src.charCodeAt(c))||61===p)&&(c=e.skipChars(c,p),(c=e.skipSpaces(c))>=l)){u=61===p?1:2;break}if(!(e.sCount[f]<0)){for(s=!1,o=0,i=d.length;o3||e.sCount[c]<0)){for(n=!1,s=0,o=l.length;s=t))&&!(e.sCount[i]=c){e.line=t;break}for(n=0;n?@[]^_`{|}~-".split("").forEach((function(e){Ve[e.charCodeAt(0)]=1}));var $e={};function Ge(e,r){var t,n,s,o,i,a=[],c=r.length;for(t=0;t=0;t--)95!==(n=r[t]).marker&&42!==n.marker||-1!==n.end&&(s=r[n.end],a=t>0&&r[t-1].end===n.end+1&&r[t-1].marker===n.marker&&r[t-1].token===n.token-1&&r[n.end+1].token===s.token+1,i=String.fromCharCode(n.marker),(o=e.tokens[n.token]).type=a?"strong_open":"em_open",o.tag=a?"strong":"em",o.nesting=1,o.markup=a?i+i:i,o.content="",(o=e.tokens[s.token]).type=a?"strong_close":"em_close",o.tag=a?"strong":"em",o.nesting=-1,o.markup=a?i+i:i,o.content="",a&&(e.tokens[r[t-1].token].content="",e.tokens[r[n.end+1].token].content="",t--))}He.tokenize=function(e,r){var t,n,s=e.pos,o=e.src.charCodeAt(s);if(r)return!1;if(95!==o&&42!==o)return!1;for(n=e.scanDelims(e.pos,42===o),t=0;t\x00-\x20]*)$/,rr=ye.HTML_TAG_RE;var tr=t,nr=r.has,sr=r.isValidEntityCode,or=r.fromCodePoint,ir=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,ar=/^&([a-z][a-z0-9]{1,31});/i;function cr(e,r){var t,n,s,o,i,a,c,l,u={},p=r.length;if(p){var h=0,f=-2,d=[];for(t=0;ti;n-=d[n]+1)if((o=r[n]).marker===s.marker&&o.open&&o.end<0&&(c=!1,(o.close||s.open)&&(o.length+s.length)%3==0&&(o.length%3==0&&s.length%3==0||(c=!0)),!c)){l=n>0&&!r[n-1].open?d[n-1]+1:0,d[t]=t-n+l,d[n]=l,s.open=!1,o.end=t,o.close=!1,a=-1,f=-2;break}-1!==a&&(u[s.marker][(s.open?3:0)+(s.length||0)%3]=a)}}}var lr=se,ur=r.isWhiteSpace,pr=r.isPunctChar,hr=r.isMdAsciiPunct;function fr(e,r,t,n){this.src=e,this.env=t,this.md=r,this.tokens=n,this.tokens_meta=Array(n.length),this.pos=0,this.posMax=this.src.length,this.level=0,this.pending="",this.pendingLevel=0,this.cache={},this.delimiters=[],this._prev_delimiters=[],this.backticks={},this.backticksScanned=!1,this.linkLevel=0}fr.prototype.pushPending=function(){var e=new lr("text","",0);return e.content=this.pending,e.level=this.pendingLevel,this.tokens.push(e),this.pending="",e},fr.prototype.push=function(e,r,t){this.pending&&this.pushPending();var n=new lr(e,r,t),s=null;return t<0&&(this.level--,this.delimiters=this._prev_delimiters.pop()),n.level=this.level,t>0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],s={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(n),this.tokens_meta.push(s),n},fr.prototype.scanDelims=function(e,r){var t,n,s,o,i,a,c,l,u,p=e,h=!0,f=!0,d=this.posMax,m=this.src.charCodeAt(e);for(t=e>0?this.src.charCodeAt(e-1):32;p0)&&(!((t=e.pos)+3>e.posMax)&&(58===e.src.charCodeAt(t)&&(47===e.src.charCodeAt(t+1)&&(47===e.src.charCodeAt(t+2)&&(!!(n=e.pending.match(Pe))&&(s=n[1],!!(o=e.md.linkify.matchAtStart(e.src.slice(t-s.length)))&&(i=(i=o.url).replace(/\*+$/,""),a=e.md.normalizeLink(i),!!e.md.validateLink(a)&&(r||(e.pending=e.pending.slice(0,-s.length),(c=e.push("link_open","a",1)).attrs=[["href",a]],c.markup="linkify",c.info="auto",(c=e.push("text","",0)).content=e.md.normalizeLinkText(i),(c=e.push("link_close","a",-1)).markup="linkify",c.info="auto"),e.pos+=i.length-s.length,!0)))))))))}],["newline",function(e,r){var t,n,s,o=e.pos;if(10!==e.src.charCodeAt(o))return!1;if(t=e.pending.length-1,n=e.posMax,!r)if(t>=0&&32===e.pending.charCodeAt(t))if(t>=1&&32===e.pending.charCodeAt(t-1)){for(s=t-1;s>=1&&32===e.pending.charCodeAt(s-1);)s--;e.pending=e.pending.slice(0,s),e.push("hardbreak","br",0)}else e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0);else e.push("softbreak","br",0);for(o++;o=c)return!1;if(10===(t=e.src.charCodeAt(a))){for(r||e.push("hardbreak","br",0),a++;a=55296&&t<=56319&&a+1=56320&&n<=57343&&(o+=e.src[a+1],a++),s="\\"+o,r||(i=e.push("text_special","",0),t<256&&0!==Ve[t]?i.content=o:i.content=s,i.markup=s,i.info="escape"),e.pos=a+1,!0}],["backticks",function(e,r){var t,n,s,o,i,a,c,l,u=e.pos;if(96!==e.src.charCodeAt(u))return!1;for(t=u,u++,n=e.posMax;u=f)return!1;if(d=a,(c=e.md.helpers.parseLinkDestination(e.src,a,e.posMax)).ok){for(u=e.md.normalizeLink(c.str),e.md.validateLink(u)?a=c.pos:u="",d=a;a=f||41!==e.src.charCodeAt(a))&&(m=!0),a++}if(m){if(void 0===e.env.references)return!1;if(a=0?s=e.src.slice(d,a++):a=o+1):a=o+1,s||(s=e.src.slice(i,o)),!(l=e.env.references[We(s)]))return e.pos=h,!1;u=l.href,p=l.title}return r||(e.pos=i,e.posMax=o,e.push("link_open","a",1).attrs=t=[["href",u]],p&&t.push(["title",p]),e.linkLevel++,e.md.inline.tokenize(e),e.linkLevel--,e.push("link_close","a",-1)),e.pos=a,e.posMax=f,!0}],["image",function(e,r){var t,n,s,o,i,a,c,l,u,p,h,f,d,m="",g=e.pos,_=e.posMax;if(33!==e.src.charCodeAt(e.pos))return!1;if(91!==e.src.charCodeAt(e.pos+1))return!1;if(a=e.pos+2,(i=e.md.helpers.parseLinkLabel(e,e.pos+1,!1))<0)return!1;if((c=i+1)<_&&40===e.src.charCodeAt(c)){for(c++;c<_&&(n=e.src.charCodeAt(c),Qe(n)||10===n);c++);if(c>=_)return!1;for(d=c,(u=e.md.helpers.parseLinkDestination(e.src,c,e.posMax)).ok&&(m=e.md.normalizeLink(u.str),e.md.validateLink(m)?c=u.pos:m=""),d=c;c<_&&(n=e.src.charCodeAt(c),Qe(n)||10===n);c++);if(u=e.md.helpers.parseLinkTitle(e.src,c,e.posMax),c<_&&d!==c&&u.ok)for(p=u.str,c=u.pos;c<_&&(n=e.src.charCodeAt(c),Qe(n)||10===n);c++);else p="";if(c>=_||41!==e.src.charCodeAt(c))return e.pos=g,!1;c++}else{if(void 0===e.env.references)return!1;if(c<_&&91===e.src.charCodeAt(c)?(d=c+1,(c=e.md.helpers.parseLinkLabel(e,c))>=0?o=e.src.slice(d,c++):c=i+1):c=i+1,o||(o=e.src.slice(a,i)),!(l=e.env.references[Ke(o)]))return e.pos=g,!1;m=l.href,p=l.title}return r||(s=e.src.slice(a,i),e.md.inline.parse(s,e.md,e.env,f=[]),(h=e.push("image","img",0)).attrs=t=[["src",m],["alt",""]],h.children=f,h.content=s,p&&t.push(["title",p])),e.pos=c,e.posMax=_,!0}],["autolink",function(e,r){var t,n,s,o,i,a,c=e.pos;if(60!==e.src.charCodeAt(c))return!1;for(i=e.pos,a=e.posMax;;){if(++c>=a)return!1;if(60===(o=e.src.charCodeAt(c)))return!1;if(62===o)break}return t=e.src.slice(i+1,c),er.test(t)?(n=e.md.normalizeLink(t),!!e.md.validateLink(n)&&(r||((s=e.push("link_open","a",1)).attrs=[["href",n]],s.markup="autolink",s.info="auto",(s=e.push("text","",0)).content=e.md.normalizeLinkText(t),(s=e.push("link_close","a",-1)).markup="autolink",s.info="auto"),e.pos+=t.length+2,!0)):!!Xe.test(t)&&(n=e.md.normalizeLink("mailto:"+t),!!e.md.validateLink(n)&&(r||((s=e.push("link_open","a",1)).attrs=[["href",n]],s.markup="autolink",s.info="auto",(s=e.push("text","",0)).content=e.md.normalizeLinkText(t),(s=e.push("link_close","a",-1)).markup="autolink",s.info="auto"),e.pos+=t.length+2,!0))}],["html_inline",function(e,r){var t,n,s,o,i,a=e.pos;return!!e.md.options.html&&(s=e.posMax,!(60!==e.src.charCodeAt(a)||a+2>=s)&&(!(33!==(t=e.src.charCodeAt(a+1))&&63!==t&&47!==t&&!function(e){var r=32|e;return r>=97&&r<=122}(t))&&(!!(n=e.src.slice(a).match(rr))&&(r||((o=e.push("html_inline","",0)).content=e.src.slice(a,a+n[0].length),i=o.content,/^\s]/i.test(i)&&e.linkLevel++,function(e){return/^<\/a\s*>/i.test(e)}(o.content)&&e.linkLevel--),e.pos+=n[0].length,!0))))}],["entity",function(e,r){var t,n,s,o=e.pos,i=e.posMax;if(38!==e.src.charCodeAt(o))return!1;if(o+1>=i)return!1;if(35===e.src.charCodeAt(o+1)){if(n=e.src.slice(o).match(ir))return r||(t="x"===n[1][0].toLowerCase()?parseInt(n[1].slice(1),16):parseInt(n[1],10),(s=e.push("text_special","",0)).content=sr(t)?or(t):or(65533),s.markup=n[0],s.info="entity"),e.pos+=n[0].length,!0}else if((n=e.src.slice(o).match(ar))&&nr(tr,n[1]))return r||((s=e.push("text_special","",0)).content=tr[n[1]],s.markup=n[0],s.info="entity"),e.pos+=n[0].length,!0;return!1}]],_r=[["balance_pairs",function(e){var r,t=e.tokens_meta,n=e.tokens_meta.length;for(cr(0,e.delimiters),r=0;r0&&n++,"text"===s[r].type&&r+1=o)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},kr.prototype.parse=function(e,r,t,n){var s,o,i,a=new this.State(e,r,t,n);for(this.tokenize(a),i=(o=this.ruler2.getRules("")).length,s=0;s=3&&":"===e[r-3]||r>=3&&"/"===e[r-3]?0:n.match(t.re.no_http)[0].length:0}},"mailto:":{validate:function(e,r,t){var n=e.slice(r);return t.re.mailto||(t.re.mailto=new RegExp("^"+t.re.src_email_name+"@"+t.re.src_host_strict,"i")),t.re.mailto.test(n)?n.match(t.re.mailto)[0].length:0}}},wr="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function Er(e){var r=e.re=function(e){var r={};return e=e||{},r.src_Any=D.source,r.src_Cc=w.source,r.src_Z=E.source,r.src_P=n.source,r.src_ZPCc=[r.src_Z,r.src_P,r.src_Cc].join("|"),r.src_ZCc=[r.src_Z,r.src_Cc].join("|"),r.src_pseudo_letter="(?:(?![><|]|"+r.src_ZPCc+")"+r.src_Any+")",r.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",r.src_auth="(?:(?:(?!"+r.src_ZCc+"|[@/\\[\\]()]).)+@)?",r.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",r.src_host_terminator="(?=$|[><|]|"+r.src_ZPCc+")(?!"+(e["---"]?"-(?!--)|":"-|")+"_|:\\d|\\.-|\\.(?!$|"+r.src_ZPCc+"))",r.src_path="(?:[/?#](?:(?!"+r.src_ZCc+"|[><|]|[()[\\]{}.,\"'?!\\-;]).|\\[(?:(?!"+r.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+r.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+r.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+r.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+r.src_ZCc+"|[']).)+\\'|\\'(?="+r.src_pseudo_letter+"|[-])|\\.{2,}[a-zA-Z0-9%/&]|\\.(?!"+r.src_ZCc+"|[.]|$)|"+(e["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+",(?!"+r.src_ZCc+"|$)|;(?!"+r.src_ZCc+"|$)|\\!+(?!"+r.src_ZCc+"|[!]|$)|\\?(?!"+r.src_ZCc+"|[?]|$))+|\\/)?",r.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',r.src_xn="xn--[a-z0-9\\-]{1,59}",r.src_domain_root="(?:"+r.src_xn+"|"+r.src_pseudo_letter+"{1,63})",r.src_domain="(?:"+r.src_xn+"|(?:"+r.src_pseudo_letter+")|(?:"+r.src_pseudo_letter+"(?:-|"+r.src_pseudo_letter+"){0,61}"+r.src_pseudo_letter+"))",r.src_host="(?:(?:(?:(?:"+r.src_domain+")\\.)*"+r.src_domain+"))",r.tpl_host_fuzzy="(?:"+r.src_ip4+"|(?:(?:(?:"+r.src_domain+")\\.)+(?:%TLDS%)))",r.tpl_host_no_ip_fuzzy="(?:(?:(?:"+r.src_domain+")\\.)+(?:%TLDS%))",r.src_host_strict=r.src_host+r.src_host_terminator,r.tpl_host_fuzzy_strict=r.tpl_host_fuzzy+r.src_host_terminator,r.src_host_port_strict=r.src_host+r.src_port+r.src_host_terminator,r.tpl_host_port_fuzzy_strict=r.tpl_host_fuzzy+r.src_port+r.src_host_terminator,r.tpl_host_port_no_ip_fuzzy_strict=r.tpl_host_no_ip_fuzzy+r.src_port+r.src_host_terminator,r.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+r.src_ZPCc+"|>|$))",r.tpl_email_fuzzy='(^|[><|]|"|\\(|'+r.src_ZCc+")("+r.src_email_name+"@"+r.tpl_host_fuzzy_strict+")",r.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+r.src_ZPCc+"))((?![$+<=>^`||])"+r.tpl_host_port_fuzzy_strict+r.src_path+")",r.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+r.src_ZPCc+"))((?![$+<=>^`||])"+r.tpl_host_port_no_ip_fuzzy_strict+r.src_path+")",r}(e.__opts__),t=e.__tlds__.slice();function s(e){return e.replace("%TLDS%",r.src_tlds)}e.onCompile(),e.__tlds_replaced__||t.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),t.push(r.src_xn),r.src_tlds=t.join("|"),r.email_fuzzy=RegExp(s(r.tpl_email_fuzzy),"i"),r.link_fuzzy=RegExp(s(r.tpl_link_fuzzy),"i"),r.link_no_ip_fuzzy=RegExp(s(r.tpl_link_no_ip_fuzzy),"i"),r.host_fuzzy_test=RegExp(s(r.tpl_host_fuzzy_test),"i");var o=[];function i(e,r){throw new Error('(LinkifyIt) Invalid schema "'+e+'": '+r)}e.__compiled__={},Object.keys(e.__schemas__).forEach((function(r){var t=e.__schemas__[r];if(null!==t){var n={validate:null,link:null};if(e.__compiled__[r]=n,"[object Object]"===Cr(t))return!function(e){return"[object RegExp]"===Cr(e)}(t.validate)?yr(t.validate)?n.validate=t.validate:i(r,t):n.validate=function(e){return function(r,t){var n=r.slice(t);return e.test(n)?n.match(e)[0].length:0}}(t.validate),void(yr(t.normalize)?n.normalize=t.normalize:t.normalize?i(r,t):n.normalize=function(e,r){r.normalize(e)});!function(e){return"[object String]"===Cr(e)}(t)?i(r,t):o.push(r)}})),o.forEach((function(r){e.__compiled__[e.__schemas__[r]]&&(e.__compiled__[r].validate=e.__compiled__[e.__schemas__[r]].validate,e.__compiled__[r].normalize=e.__compiled__[e.__schemas__[r]].normalize)})),e.__compiled__[""]={validate:null,normalize:function(e,r){r.normalize(e)}};var a=Object.keys(e.__compiled__).filter((function(r){return r.length>0&&e.__compiled__[r]})).map(Ar).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+r.src_ZPCc+"))("+a+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+r.src_ZPCc+"))("+a+")","ig"),e.re.schema_at_start=RegExp("^"+e.re.schema_search.source,"i"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),function(e){e.__index__=-1,e.__text_cache__=""}(e)}function qr(e,r){var t=e.__index__,n=e.__last_index__,s=e.__text_cache__.slice(t,n);this.schema=e.__schema__.toLowerCase(),this.index=t+r,this.lastIndex=n+r,this.raw=s,this.text=s,this.url=s}function Sr(e,r){var t=new qr(e,r);return e.__compiled__[t.schema].normalize(t,e),t}function Fr(e,r){if(!(this instanceof Fr))return new Fr(e,r);var t;r||(t=e,Object.keys(t||{}).reduce((function(e,r){return e||xr.hasOwnProperty(r)}),!1)&&(r=e,e={})),this.__opts__=vr({},xr,r),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=vr({},Dr,e),this.__compiled__={},this.__tlds__=wr,this.__tlds_replaced__=!1,this.re={},Er(this)}Fr.prototype.add=function(e,r){return this.__schemas__[e]=r,Er(this),this},Fr.prototype.set=function(e){return this.__opts__=vr(this.__opts__,e),this},Fr.prototype.test=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return!1;var r,t,n,s,o,i,a,c;if(this.re.schema_test.test(e))for((a=this.re.schema_search).lastIndex=0;null!==(r=a.exec(e));)if(s=this.testSchemaAt(e,r[2],a.lastIndex)){this.__schema__=r[2],this.__index__=r.index+r[1].length,this.__last_index__=r.index+r[0].length+s;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=e.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||c=0&&null!==(n=e.match(this.re.email_fuzzy))&&(o=n.index+n[1].length,i=n.index+n[0].length,(this.__index__<0||othis.__last_index__)&&(this.__schema__="mailto:",this.__index__=o,this.__last_index__=i)),this.__index__>=0},Fr.prototype.pretest=function(e){return this.re.pretest.test(e)},Fr.prototype.testSchemaAt=function(e,r,t){return this.__compiled__[r.toLowerCase()]?this.__compiled__[r.toLowerCase()].validate(e,t,this):0},Fr.prototype.match=function(e){var r=0,t=[];this.__index__>=0&&this.__text_cache__===e&&(t.push(Sr(this,r)),r=this.__last_index__);for(var n=r?e.slice(r):e;this.test(n);)t.push(Sr(this,r)),n=n.slice(this.__last_index__),r+=this.__last_index__;return t.length?t:null},Fr.prototype.matchAtStart=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return null;var r=this.re.schema_at_start.exec(e);if(!r)return null;var t=this.testSchemaAt(e,r[2],r[0].length);return t?(this.__schema__=r[2],this.__index__=r.index+r[1].length,this.__last_index__=r.index+r[0].length+t,Sr(this,0)):null},Fr.prototype.tlds=function(e,r){return e=Array.isArray(e)?e:[e],r?(this.__tlds__=this.__tlds__.concat(e).sort().filter((function(e,r,t){return e!==t[r-1]})).reverse(),Er(this),this):(this.__tlds__=e.slice(),this.__tlds_replaced__=!0,Er(this),this)},Fr.prototype.normalize=function(e){e.schema||(e.url="http://"+e.url),"mailto:"!==e.schema||/^mailto:/i.test(e.url)||(e.url="mailto:"+e.url)},Fr.prototype.onCompile=function(){};var Lr=Fr,zr=2147483647,Tr=/^xn--/,Ir=/[^\x20-\x7E]/,Mr=/[\x2E\u3002\uFF0E\uFF61]/g,Rr={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},Br=Math.floor,Nr=String.fromCharCode; +/*! https://mths.be/punycode v1.4.1 by @mathias */function Or(e){throw new RangeError(Rr[e])}function Pr(e,r){for(var t=e.length,n=[];t--;)n[t]=r(e[t]);return n}function jr(e,r){var t=e.split("@"),n="";return t.length>1&&(n=t[0]+"@",e=t[1]),n+Pr((e=e.replace(Mr,".")).split("."),r).join(".")}function Ur(e){for(var r,t,n=[],s=0,o=e.length;s=55296&&r<=56319&&s65535&&(r+=Nr((e-=65536)>>>10&1023|55296),e=56320|1023&e),r+=Nr(e)})).join("")}function Zr(e,r){return e+22+75*(e<26)-((0!=r)<<5)}function $r(e,r,t){var n=0;for(e=t?Br(e/700):e>>1,e+=Br(e/r);e>455;n+=36)e=Br(e/35);return Br(n+36*e/(e+38))}function Gr(e){var r,t,n,s,o,i,a,c,l,u,p,h=[],f=e.length,d=0,m=128,g=72;for((t=e.lastIndexOf("-"))<0&&(t=0),n=0;n=128&&Or("not-basic"),h.push(e.charCodeAt(n));for(s=t>0?t+1:0;s=f&&Or("invalid-input"),((c=(p=e.charCodeAt(s++))-48<10?p-22:p-65<26?p-65:p-97<26?p-97:36)>=36||c>Br((zr-d)/i))&&Or("overflow"),d+=c*i,!(c<(l=a<=g?1:a>=g+26?26:a-g));a+=36)i>Br(zr/(u=36-l))&&Or("overflow"),i*=u;g=$r(d-o,r=h.length+1,0==o),Br(d/r)>zr-m&&Or("overflow"),m+=Br(d/r),d%=r,h.splice(d++,0,m)}return Vr(h)}function Hr(e){var r,t,n,s,o,i,a,c,l,u,p,h,f,d,m,g=[];for(h=(e=Ur(e)).length,r=128,t=0,o=72,i=0;i=r&&pBr((zr-t)/(f=n+1))&&Or("overflow"),t+=(a-r)*f,r=a,i=0;izr&&Or("overflow"),p==r){for(c=t,l=36;!(c<(u=l<=o?1:l>=o+26?26:l-o));l+=36)m=c-u,d=36-u,g.push(Nr(Zr(u+m%d,0))),c=Br(m/d);g.push(Nr(Zr(c,0))),o=$r(t,f,n==s),t=0,++n}++t,++r}return g.join("")}function Jr(e){return jr(e,(function(e){return Tr.test(e)?Gr(e.slice(4).toLowerCase()):e}))}function Wr(e){return jr(e,(function(e){return Ir.test(e)?"xn--"+Hr(e):e}))}var Yr={decode:Ur,encode:Vr},Kr={version:"1.4.1",ucs2:Yr,toASCII:Wr,toUnicode:Jr,encode:Hr,decode:Gr},Qr=r,Xr=q,et=R,rt=pe,tt=Ne,nt=br,st=Lr,ot=s,it=e(Object.freeze({__proto__:null,decode:Gr,encode:Hr,toUnicode:Jr,toASCII:Wr,version:"1.4.1",ucs2:Yr,default:Kr})),at={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}},zero:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline","text_join"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","fragments_join"]}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline","text_join"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","fragments_join"]}}}},ct=/^(vbscript|javascript|file|data):/,lt=/^data:image\/(gif|png|jpeg|webp);/;function ut(e){var r=e.trim().toLowerCase();return!ct.test(r)||!!lt.test(r)}var pt=["http:","https:","mailto:"];function ht(e){var r=ot.parse(e,!0);if(r.hostname&&(!r.protocol||pt.indexOf(r.protocol)>=0))try{r.hostname=it.toASCII(r.hostname)}catch(e){}return ot.encode(ot.format(r))}function ft(e){var r=ot.parse(e,!0);if(r.hostname&&(!r.protocol||pt.indexOf(r.protocol)>=0))try{r.hostname=it.toUnicode(r.hostname)}catch(e){}return ot.decode(ot.format(r),ot.decode.defaultChars+"%")}function dt(e,r){if(!(this instanceof dt))return new dt(e,r);r||Qr.isString(e)||(r=e||{},e="default"),this.inline=new nt,this.block=new tt,this.core=new rt,this.renderer=new et,this.linkify=new st,this.validateLink=ut,this.normalizeLink=ht,this.normalizeLinkText=ft,this.utils=Qr,this.helpers=Qr.assign({},Xr),this.options={},this.configure(e),r&&this.set(r)}dt.prototype.set=function(e){return Qr.assign(this.options,e),this},dt.prototype.configure=function(e){var r,t=this;if(Qr.isString(e)&&!(e=at[r=e]))throw new Error('Wrong `markdown-it` preset "'+r+'", check name');if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach((function(r){e.components[r].rules&&t[r].ruler.enableOnly(e.components[r].rules),e.components[r].rules2&&t[r].ruler2.enableOnly(e.components[r].rules2)})),this},dt.prototype.enable=function(e,r){var t=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach((function(r){t=t.concat(this[r].ruler.enable(e,!0))}),this),t=t.concat(this.inline.ruler2.enable(e,!0));var n=e.filter((function(e){return t.indexOf(e)<0}));if(n.length&&!r)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+n);return this},dt.prototype.disable=function(e,r){var t=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach((function(r){t=t.concat(this[r].ruler.disable(e,!0))}),this),t=t.concat(this.inline.ruler2.disable(e,!0));var n=e.filter((function(e){return t.indexOf(e)<0}));if(n.length&&!r)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+n);return this},dt.prototype.use=function(e){var r=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,r),this},dt.prototype.parse=function(e,r){if("string"!=typeof e)throw new Error("Input data should be a String");var t=new this.core.State(e,this,r);return this.core.process(t),t.tokens},dt.prototype.render=function(e,r){return r=r||{},this.renderer.render(this.parse(e,r),this.options,r)},dt.prototype.parseInline=function(e,r){var t=new this.core.State(e,this,r);return t.inlineMode=!0,this.core.process(t),t.tokens},dt.prototype.renderInline=function(e,r){return r=r||{},this.renderer.render(this.parseInline(e,r),this.options,r)};var mt=dt;export default mt; diff --git a/uni_modules/uview-next/components/u-markdown/parser.js b/uni_modules/uview-next/components/u-markdown/parser.js new file mode 100644 index 0000000..0d28a40 --- /dev/null +++ b/uni_modules/uview-next/components/u-markdown/parser.js @@ -0,0 +1,352 @@ +/* + * HTML5 Parser By Sam Blowes + * + * Designed for HTML5 documents + * + * Original code by John Resig (ejohn.org) + * http://ejohn.org/blog/pure-javascript-html-parser/ + * Original code by Erik Arvidsson, Mozilla Public License + * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js + * + * ---------------------------------------------------------------------------- + * License + * ---------------------------------------------------------------------------- + * + * This code is triple licensed using Apache Software License 2.0, + * Mozilla Public License or GNU Public License + * + * //////////////////////////////////////////////////////////////////////////// + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * //////////////////////////////////////////////////////////////////////////// + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * + * The Original Code is Simple HTML Parser. + * + * The Initial Developer of the Original Code is Erik Arvidsson. + * Portions created by Erik Arvidssson are Copyright (C) 2004. All Rights + * Reserved. + * + * //////////////////////////////////////////////////////////////////////////// + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ---------------------------------------------------------------------------- + * Usage + * ---------------------------------------------------------------------------- + * + * // Use like so: + * HTMLParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * // or to get an XML string: + * HTMLtoXML(htmlString); + * + * // or to get an XML DOM Document + * HTMLtoDOM(htmlString); + * + * // or to inject into an existing document/DOM node + * HTMLtoDOM(htmlString, document); + * HTMLtoDOM(htmlString, document.body); + * + */ +// Regular Expressions for parsing tags and attributes +var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/; +var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/; +var attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5 + +var empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'); // Block Elements - HTML 5 +// fixed by xxx 将 ins 标签从块级名单中移除 + +var block = makeMap('a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'); // Inline Elements - HTML 5 + +var inline = makeMap('abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'); // Elements that you can, intentionally, leave open +// (and which close themselves) + +var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled" + +var fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); // Special Elements (can contain anything) + +var special = makeMap('script,style'); +function HTMLParser(html, handler) { + var index; + var chars; + var match; + var stack = []; + var last = html; + + stack.last = function () { + return this[this.length - 1]; + }; + + while (html) { + chars = true; // Make sure we're not in a script or style element + + if (!stack.last() || !special[stack.last()]) { + // Comment + if (html.indexOf(''); + + if (index >= 0) { + if (handler.comment) { + handler.comment(html.substring(4, index)); + } + + html = html.substring(index + 3); + chars = false; + } // end tag + + } else if (html.indexOf(']*>'), function (all, text) { + text = text.replace(/|/g, '$1$2'); + + if (handler.chars) { + handler.chars(text); + } + + return ''; + }); + parseEndTag('', stack.last()); + } + + if (html == last) { + throw 'Parse Error: ' + html; + } + + last = html; + } // Clean up any remaining tags + + + parseEndTag(); + + function parseStartTag(tag, tagName, rest, unary) { + tagName = tagName.toLowerCase(); + + if (block[tagName]) { + while (stack.last() && inline[stack.last()]) { + parseEndTag('', stack.last()); + } + } + + if (closeSelf[tagName] && stack.last() == tagName) { + parseEndTag('', tagName); + } + + unary = empty[tagName] || !!unary; + + if (!unary) { + stack.push(tagName); + } + + if (handler.start) { + var attrs = []; + rest.replace(attr, function (match, name) { + var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? arguments[4] : fillAttrs[name] ? name : ''; + attrs.push({ + name: name, + value: value, + escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // " + + }); + }); + + if (handler.start) { + handler.start(tagName, attrs, unary); + } + } + } + + function parseEndTag(tag, tagName) { + // If no tag name is provided, clean shop + if (!tagName) { + var pos = 0; + } // Find the closest opened tag of the same type + else { + for (var pos = stack.length - 1; pos >= 0; pos--) { + if (stack[pos] == tagName) { + break; + } + } + } + + if (pos >= 0) { + // Close all the open elements, up the stack + for (var i = stack.length - 1; i >= pos; i--) { + if (handler.end) { + handler.end(stack[i]); + } + } // Remove the open elements from the stack + + + stack.length = pos; + } + } +} + +function makeMap(str) { + var obj = {}; + var items = str.split(','); + + for (var i = 0; i < items.length; i++) { + obj[items[i]] = true; + } + + return obj; +} + +function removeDOCTYPE(html) { + return html.replace(/<\?xml.*\?>\n/, '').replace(/\n/, '').replace(/\n/, ''); +} + +function parseAttrs(attrs) { + return attrs.reduce(function (pre, attr) { + var value = attr.value; + var name = attr.name; + + if (pre[name]) { + pre[name] = pre[name] + " " + value; + } else { + pre[name] = value; + } + + return pre; + }, {}); +} + +function parseHtml(html) { + html = removeDOCTYPE(html); + var stacks = []; + var results = { + node: 'root', + children: [] + }; + HTMLParser(html, { + start: function start(tag, attrs, unary) { + var node = { + name: tag + }; + + if (attrs.length !== 0) { + node.attrs = parseAttrs(attrs); + } + + if (unary) { + var parent = stacks[0] || results; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } else { + stacks.unshift(node); + } + }, + end: function end(tag) { + var node = stacks.shift(); + if (node.name !== tag) console.error('invalid state: mismatch end tag'); + + if (stacks.length === 0) { + results.children.push(node); + } else { + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }, + chars: function chars(text) { + var node = { + type: 'text', + text: text + }; + + if (stacks.length === 0) { + results.children.push(node); + } else { + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }, + comment: function comment(text) { + var node = { + node: 'comment', + text: text + }; + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }); + return results.children; +} + +export default parseHtml; \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-markdown/props.js b/uni_modules/uview-next/components/u-markdown/props.js new file mode 100644 index 0000000..17ef874 --- /dev/null +++ b/uni_modules/uview-next/components/u-markdown/props.js @@ -0,0 +1,12 @@ +export default { + props: { + content: { + type: String, + default: ()=> uni.$u.props.markdown.content + }, + showLine: { + type: [Boolean, String], + default: ()=> uni.$u.props.markdown.showLine + } + } +} diff --git a/uni_modules/uview-next/components/u-markdown/u-markdown.vue b/uni_modules/uview-next/components/u-markdown/u-markdown.vue new file mode 100644 index 0000000..3551b12 --- /dev/null +++ b/uni_modules/uview-next/components/u-markdown/u-markdown.vue @@ -0,0 +1,617 @@ + + + + diff --git a/uni_modules/uview-next/components/u-modal/props.js b/uni_modules/uview-next/components/u-modal/props.js new file mode 100644 index 0000000..da58b16 --- /dev/null +++ b/uni_modules/uview-next/components/u-modal/props.js @@ -0,0 +1,114 @@ +export default { + props: { + // 是否展示modal + show: { + type: Boolean, + default: ()=> uni.$u.props.modal.show + }, + // 标题 + title: { + type: [String], + default: ()=> uni.$u.props.modal.title + }, + // 弹窗内容 + content: { + type: String, + default: ()=> uni.$u.props.modal.content + }, + // 确认文案 + confirmText: { + type: String, + default: ()=> uni.$u.$t('uModal.confirmText') + }, + // 取消文案 + cancelText: { + type: String, + default: ()=> uni.$u.$t('uModal.cancelText') + }, + // 是否显示确认按钮 + showConfirmButton: { + type: Boolean, + default: ()=> uni.$u.props.modal.showConfirmButton + }, + // 是否显示取消按钮 + showCancelButton: { + type: Boolean, + default: ()=> uni.$u.props.modal.showCancelButton + }, + // 确认按钮颜色 + confirmColor: { + type: String, + default: ()=> uni.$u.props.modal.confirmColor + }, + // 取消文字颜色 + cancelColor: { + type: String, + default: ()=> uni.$u.props.modal.cancelColor + }, + // 对调确认和取消的位置 + buttonReverse: { + type: Boolean, + default: ()=> uni.$u.props.modal.buttonReverse + }, + // 确认按钮背景颜色 + confirmBgColor: { + type: String, + default: ()=> uni.$u.props.modal.confirmBgColor + }, + // 取消按钮背景颜色 + cancelBgColor: { + type: String, + default: ()=> uni.$u.props.modal.cancelBgColor + }, + // 确认按钮圆角 + buttonRound: { + type: String, + default: ()=> uni.$u.props.modal.buttonRound + }, + // 按钮模式 + buttonModel: { + type: String, + default: ()=> uni.$u.props.modal.buttonModel + }, + // 是否开启缩放效果 + zoom: { + type: Boolean, + default: ()=> uni.$u.props.modal.zoom + }, + // 是否异步关闭,只对确定按钮有效 + asyncClose: { + type: Boolean, + default: ()=> uni.$u.props.modal.asyncClose + }, + // 是否允许点击遮罩关闭modal + closeOnClickOverlay: { + type: Boolean, + default: ()=> uni.$u.props.modal.closeOnClickOverlay + }, + // 给一个负的margin-top,往上偏移,避免和键盘重合的情况 + negativeTop: { + type: [String, Number], + default: ()=> uni.$u.props.modal.negativeTop + }, + // modal宽度,不支持百分比,可以数值,px,rpx单位 + width: { + type: [String, Number], + default: ()=> uni.$u.props.modal.width + }, + // 确认按钮的样式,circle-圆形,square-方形,如设置,将不会显示取消按钮 + confirmButtonShape: { + type: String, + default: ()=> uni.$u.props.modal.confirmButtonShape + }, + // 弹窗动画过度时间 + duration: { + type: [String, Number], + default: ()=> uni.$u.props.modal.duration + }, + // 设置圆角值 + round: { + type: String, + default: ()=> uni.$u.props.modal.round + } + } +} diff --git a/uni_modules/uview-next/components/u-modal/u-modal.vue b/uni_modules/uview-next/components/u-modal/u-modal.vue new file mode 100644 index 0000000..5c7a223 --- /dev/null +++ b/uni_modules/uview-next/components/u-modal/u-modal.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-navbar/props.js b/uni_modules/uview-next/components/u-navbar/props.js new file mode 100644 index 0000000..038e3ce --- /dev/null +++ b/uni_modules/uview-next/components/u-navbar/props.js @@ -0,0 +1,84 @@ +export default { + props: { + // 是否开启顶部安全区适配 + safeAreaInsetTop: { + type: Boolean, + default: () => uni.$u.props.navbar.safeAreaInsetTop + }, + // 固定在顶部时,是否生成一个等高元素,以防止塌陷 + placeholder: { + type: Boolean, + default: () => uni.$u.props.navbar.placeholder + }, + // 是否固定在顶部 + fixed: { + type: Boolean, + default: () => uni.$u.props.navbar.fixed + }, + // 是否显示下边框 + border: { + type: Boolean, + default: () => uni.$u.props.navbar.border + }, + // 左边的图标 + leftIcon: { + type: String, + default: () => uni.$u.props.navbar.leftIcon + }, + // 左边的提示文字 + leftText: { + type: String, + default: () => uni.$u.props.navbar.leftText + }, + // 左右的提示文字 + rightText: { + type: String, + default: () => uni.$u.props.navbar.rightText + }, + // 右边的图标 + rightIcon: { + type: String, + default: () => uni.$u.props.navbar.rightIcon + }, + // 标题 + title: { + type: [String, Number], + default: () => uni.$u.props.navbar.title + }, + // 背景颜色 + bgColor: { + type: String, + default: () => uni.$u.props.navbar.bgColor + }, + // 标题的宽度 + titleWidth: { + type: [String, Number], + default: () => uni.$u.props.navbar.titleWidth + }, + // 导航栏高度 + height: { + type: [String, Number], + default: () => uni.$u.props.navbar.height + }, + // 左侧返回图标的大小 + leftIconSize: { + type: [String, Number], + default: () => uni.$u.props.navbar.leftIconSize + }, + // 左侧返回图标的颜色 + leftIconColor: { + type: String, + default: () => uni.$u.props.navbar.leftIconColor + }, + // 点击左侧区域(返回图标),是否自动返回上一页 + autoBack: { + type: Boolean, + default: () => uni.$u.props.navbar.autoBack + }, + // 标题的样式,对象或字符串 + titleStyle: { + type: [String, Object], + default: () => uni.$u.props.navbar.titleStyle + } + } +} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-navbar/u-navbar.vue b/uni_modules/uview-next/components/u-navbar/u-navbar.vue new file mode 100644 index 0000000..bcc393f --- /dev/null +++ b/uni_modules/uview-next/components/u-navbar/u-navbar.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-no-network/props.js b/uni_modules/uview-next/components/u-no-network/props.js new file mode 100644 index 0000000..991dbd0 --- /dev/null +++ b/uni_modules/uview-next/components/u-no-network/props.js @@ -0,0 +1,19 @@ +export default { + props: { + // 页面文字提示 + tips: { + type: String, + default: ()=> uni.$u.$t('uNoNetwork.tips') + }, + // 一个z-index值,用于设置没有网络这个组件的层次,因为页面可能会有其他定位的元素层级过高,导致此组件被覆盖 + zIndex: { + type: [String, Number], + default: ()=> uni.$u.props.noNetwork.zIndex + }, + // image 没有网络的图片提示 + image: { + type: String, + default: ()=> uni.$u.props.noNetwork.image + } + } +} diff --git a/uni_modules/uview-next/components/u-no-network/u-no-network.vue b/uni_modules/uview-next/components/u-no-network/u-no-network.vue new file mode 100644 index 0000000..689599d --- /dev/null +++ b/uni_modules/uview-next/components/u-no-network/u-no-network.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-notice-bar/props.js b/uni_modules/uview-next/components/u-notice-bar/props.js new file mode 100644 index 0000000..70da558 --- /dev/null +++ b/uni_modules/uview-next/components/u-notice-bar/props.js @@ -0,0 +1,70 @@ +export default { + props: { + // 显示的内容,数组 + text: { + type: [Array, String], + default: () => uni.$u.props.noticeBar.text + }, + // 通告滚动模式,row-横向滚动,column-竖向滚动 + direction: { + type: String, + default: () => uni.$u.props.noticeBar.direction + }, + // direction = row时,是否使用步进形式滚动 + step: { + type: Boolean, + default: () => uni.$u.props.noticeBar.step + }, + // 是否显示左侧的音量图标 + icon: { + type: String, + default: () => uni.$u.props.noticeBar.icon + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: () => uni.$u.props.noticeBar.mode + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: () => uni.$u.props.noticeBar.color + }, + // 背景颜色 + bgColor: { + type: String, + default: () => uni.$u.props.noticeBar.bgColor + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: () => uni.$u.props.noticeBar.speed + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: () => uni.$u.props.noticeBar.fontSize + }, + // 滚动一个周期的时间长,单位ms + duration: { + type: [String, Number], + default: () => uni.$u.props.noticeBar.duration + }, + // 是否禁止用手滑动切换 + // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 + disableTouch: { + type: Boolean, + default: () => uni.$u.props.noticeBar.disableTouch + }, + // 跳转的页面路径 + url: { + type: String, + default: () => uni.$u.props.noticeBar.url + }, + // 页面跳转的类型 + linkType: { + type: String, + default: () => uni.$u.props.noticeBar.linkType + } + } +} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-notice-bar/u-notice-bar.vue b/uni_modules/uview-next/components/u-notice-bar/u-notice-bar.vue new file mode 100644 index 0000000..801394a --- /dev/null +++ b/uni_modules/uview-next/components/u-notice-bar/u-notice-bar.vue @@ -0,0 +1,106 @@ + + + + diff --git a/uni_modules/uview-next/components/u-notify/props.js b/uni_modules/uview-next/components/u-notify/props.js new file mode 100644 index 0000000..dad5f99 --- /dev/null +++ b/uni_modules/uview-next/components/u-notify/props.js @@ -0,0 +1,49 @@ +export default { + props: { + // 到顶部的距离 + top: { + type: [String, Number], + default: () => uni.$u.props.notify.top + }, + // 是否展示组件 + // show: { + // type: Boolean, + // default: uni.$u.props.notify.show + // }, + // type主题,primary,success,warning,error + type: { + type: String, + default: () => uni.$u.props.notify.type + }, + // 字体颜色 + color: { + type: String, + default: () => uni.$u.props.notify.color + }, + // 背景颜色 + bgColor: { + type: String, + default: () => uni.$u.props.notify.bgColor + }, + // 展示的文字内容 + message: { + type: String, + default: () => uni.$u.props.notify.message + }, + // 展示时长,为0时不消失,单位ms + duration: { + type: [String, Number], + default: () => uni.$u.props.notify.duration + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: () => uni.$u.props.notify.fontSize + }, + // 是否留出顶部安全距离(状态栏高度) + safeAreaInsetTop: { + type: Boolean, + default: () => uni.$u.props.notify.safeAreaInsetTop + } + } +} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-notify/u-notify.vue b/uni_modules/uview-next/components/u-notify/u-notify.vue new file mode 100644 index 0000000..9ee26f1 --- /dev/null +++ b/uni_modules/uview-next/components/u-notify/u-notify.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-number-box/props.js b/uni_modules/uview-next/components/u-number-box/props.js new file mode 100644 index 0000000..d1b7284 --- /dev/null +++ b/uni_modules/uview-next/components/u-number-box/props.js @@ -0,0 +1,143 @@ +export default { + props: { + // 步进器标识符,在change回调返回 + name: { + type: [String, Number], + default: () => uni.$u.props.numberBox.name + }, + // 用于双向绑定的值,初始化时设置设为默认min值(最小值) + // #ifdef VUE2 + value: { + type: [String, Number], + default: () => uni.$u.props.numberBox.value + }, + // #endif + // #ifdef VUE3 + modelValue: { + type: [String, Number], + default: () => uni.$u.props.numberBox.value + }, + // #endif + // 最小值 + min: { + type: [String, Number], + default: () => uni.$u.props.numberBox.min + }, + // 最大值 + max: { + type: [String, Number], + default: () => uni.$u.props.numberBox.max + }, + // 加减的步长,可为小数 + step: { + type: [String, Number], + default: () => uni.$u.props.numberBox.step + }, + // 是否只允许输入整数 + integer: { + type: Boolean, + default: () => uni.$u.props.numberBox.integer + }, + // 是否禁用,包括输入框,加减按钮 + disabled: { + type: Boolean, + default: () => uni.$u.props.numberBox.disabled + }, + // 是否禁用输入框 + disabledInput: { + type: Boolean, + default: () => uni.$u.props.numberBox.disabledInput + }, + // 是否开启异步变更,开启后需要手动控制输入值 + asyncChange: { + type: Boolean, + default: () => uni.$u.props.numberBox.asyncChange + }, + // 输入框宽度,单位为px + inputWidth: { + type: [String, Number], + default: () => uni.$u.props.numberBox.inputWidth + }, + // 是否显示减少按钮 + showMinus: { + type: Boolean, + default: () => uni.$u.props.numberBox.showMinus + }, + // 是否显示增加按钮 + showPlus: { + type: Boolean, + default: () => uni.$u.props.numberBox.showPlus + }, + // 显示的小数位数 + decimalLength: { + type: [String, Number, null], + default: () => uni.$u.props.numberBox.decimalLength + }, + // 是否开启长按加减手势 + longPress: { + type: Boolean, + default: () => uni.$u.props.numberBox.longPress + }, + // 输入框文字和加减按钮图标的颜色 + color: { + type: String, + default: () => uni.$u.props.numberBox.color + }, + // 按钮大小,宽高等于此值,单位px,输入框高度和此值保持一致 + buttonSize: { + type: [String, Number], + default: () => uni.$u.props.numberBox.buttonSize + }, + // 输入框和按钮的背景颜色 + bgColor: { + type: String, + default: () => uni.$u.props.numberBox.bgColor + }, + // 按钮禁用后的背景颜色 + disableBgColor: { + type: String, + default: () => uni.$u.props.numberBox.disableBgColor + }, + // 按钮禁用后的字体颜色 + disableColor: { + type: String, + default: () => uni.$u.props.numberBox.disableColor + }, + // 指定光标于键盘的距离,避免键盘遮挡输入框,单位px + cursorSpacing: { + type: [String, Number], + default: () => uni.$u.props.numberBox.cursorSpacing + }, + // 是否禁用增加按钮 + disablePlus: { + type: Boolean, + default: () => uni.$u.props.numberBox.disablePlus + }, + // 是否禁用减少按钮 + disableMinus: { + type: Boolean, + default: () => uni.$u.props.numberBox.disableMinus + }, + + // 加减按钮图标的样式 + iconStyle: { + type: [Object, String], + default: () => uni.$u.props.numberBox.iconStyle + }, + // 加减按钮圆角,单位px + buttonRound: { + type: [String, Number], + default: () => uni.$u.props.numberBox.buttonRound + }, + // 输入框背景颜色 + inputBgColor: { + type: String, + default: () => uni.$u.props.numberBox.inputBgColor + }, + // 加减按钮图标大小,单位px + iconSize: { + type: [String, Number], + default: () => uni.$u.props.numberBox.iconSize + } + } +} \ No newline at end of file diff --git a/uni_modules/uview-next/components/u-number-box/u-number-box.vue b/uni_modules/uview-next/components/u-number-box/u-number-box.vue new file mode 100644 index 0000000..a893fc7 --- /dev/null +++ b/uni_modules/uview-next/components/u-number-box/u-number-box.vue @@ -0,0 +1,456 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-number-keyboard/props.js b/uni_modules/uview-next/components/u-number-keyboard/props.js new file mode 100644 index 0000000..7a4d622 --- /dev/null +++ b/uni_modules/uview-next/components/u-number-keyboard/props.js @@ -0,0 +1,19 @@ +export default { + props: { + // 键盘的类型,number-数字键盘,card-身份证键盘 + mode: { + type: String, + default: ()=> uni.$u.props.numberKeyboard.value + }, + // 是否显示键盘的"."符号 + dotDisabled: { + type: Boolean, + default: ()=> uni.$u.props.numberKeyboard.dotDisabled + }, + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: ()=> uni.$u.props.numberKeyboard.random + } + } +} diff --git a/uni_modules/uview-next/components/u-number-keyboard/u-number-keyboard.vue b/uni_modules/uview-next/components/u-number-keyboard/u-number-keyboard.vue new file mode 100644 index 0000000..faeccf6 --- /dev/null +++ b/uni_modules/uview-next/components/u-number-keyboard/u-number-keyboard.vue @@ -0,0 +1,199 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-overlay/props.js b/uni_modules/uview-next/components/u-overlay/props.js new file mode 100644 index 0000000..d3e00be --- /dev/null +++ b/uni_modules/uview-next/components/u-overlay/props.js @@ -0,0 +1,24 @@ +export default { + props: { + // 是否显示遮罩 + show: { + type: Boolean, + default: ()=> uni.$u.props.overlay.show + }, + // 层级z-index + zIndex: { + type: [String, Number], + default: ()=> uni.$u.props.overlay.zIndex + }, + // 遮罩的过渡时间,单位为ms + duration: { + type: [String, Number], + default: ()=> uni.$u.props.overlay.duration + }, + // 不透明度值,当做rgba的第四个参数 + opacity: { + type: [String, Number], + default: ()=> uni.$u.props.overlay.opacity + } + } +} diff --git a/uni_modules/uview-next/components/u-overlay/u-overlay.vue b/uni_modules/uview-next/components/u-overlay/u-overlay.vue new file mode 100644 index 0000000..983d2e5 --- /dev/null +++ b/uni_modules/uview-next/components/u-overlay/u-overlay.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-pagination/props.js b/uni_modules/uview-next/components/u-pagination/props.js new file mode 100644 index 0000000..2c30d09 --- /dev/null +++ b/uni_modules/uview-next/components/u-pagination/props.js @@ -0,0 +1,111 @@ +export default { + props: { + // 当前页码 + // #ifdef VUE3 + modelValue: { + type: Number, + default: ()=> uni.$u.props.pagination.modelValue + }, + // #endif + // v-model 的别名 + value: { + type: Number, + default: ()=> uni.$u.props.pagination.modelValue + }, + // 总记录数,用于计算总页数 + total: { + type: Number, + default: ()=> uni.$u.props.pagination.total + }, + // 每页显示的记录数 + pageSize: { + type: Number, + default: ()=> uni.$u.props.pagination.pageSize + }, + // 显示的页码按钮数量 + pagerCount: { + type: Number, + default: ()=> uni.$u.props.pagination.pagerCount + }, + // 是否禁用分页 + disabled: { + type: Boolean, + default: ()=> uni.$u.props.pagination.disabled + }, + // 是否显示省略号 + forceEllipses: { + type: Boolean, + default: ()=> uni.$u.props.pagination.forceEllipses + }, + // 是否为简单分页 + simple: { + type: Boolean, + default: ()=> uni.$u.props.pagination.simple + }, + // 是否展示上一页按钮 + showPrevButton: { + type: Boolean, + default: ()=> uni.$u.props.pagination.showPrevButton + }, + // 是否展示下一页按钮 + showNextButton: { + type: Boolean, + default: ()=> uni.$u.props.pagination.showNextButton + }, + // 上一页按钮文字 + prevText: { + type: String, + default: ()=> uni.$u.$t('uPagination.prevText') + }, + // 下一页按钮文字 + nextText: { + type: String, + default: ()=> uni.$u.$t('uPagination.nextText') + }, + // 背景色 + bgColor: { + type: [String, Boolean], + default: ()=> uni.$u.props.pagination.bgColor + }, + // 文本色 + color: { + type: String, + default: ()=> uni.$u.props.pagination.color + }, + // 激活背景色 + activeBgColor: { + type: [String, Boolean], + default: ()=> uni.$u.props.pagination.activeBgColor + }, + // 激活文本色 + activeColor: { + type: [String, Boolean], + default: ()=> uni.$u.props.pagination.activeColor + }, + // 字体尺寸 + fontSize: { + type: String, + default: ()=> uni.$u.props.pagination.fontSize + }, + // 圆角 + round: { + type: String, + default: ()=> uni.$u.props.pagination.round + }, + // 描边色 + borderColor: { + type: [String, Boolean], + default: ()=> uni.$u.props.pagination.borderColor + }, + // 每项宽度 + itemWidth: { + type: String, + default: ()=> uni.$u.props.pagination.itemWidth + }, + // 每项高度 + itemHeight: { + type: String, + default: ()=> uni.$u.props.pagination.itemHeight + } + } +} diff --git a/uni_modules/uview-next/components/u-pagination/u-pagination.vue b/uni_modules/uview-next/components/u-pagination/u-pagination.vue new file mode 100644 index 0000000..32969f7 --- /dev/null +++ b/uni_modules/uview-next/components/u-pagination/u-pagination.vue @@ -0,0 +1,392 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-parse/audio/audio.vue b/uni_modules/uview-next/components/u-parse/audio/audio.vue new file mode 100644 index 0000000..dc9476a --- /dev/null +++ b/uni_modules/uview-next/components/u-parse/audio/audio.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/uni_modules/uview-next/components/u-parse/audio/context.js b/uni_modules/uview-next/components/u-parse/audio/context.js new file mode 100644 index 0000000..bde4da9 --- /dev/null +++ b/uni_modules/uview-next/components/u-parse/audio/context.js @@ -0,0 +1,7 @@ +const ctx = {} + +export default { + get: id => ctx[id], + set: (id, vm) => { ctx[id] = vm }, + remove: id => { ctx[id] = undefined } +} diff --git a/uni_modules/uview-next/components/u-parse/audio/index.js b/uni_modules/uview-next/components/u-parse/audio/index.js new file mode 100644 index 0000000..c0b3445 --- /dev/null +++ b/uni_modules/uview-next/components/u-parse/audio/index.js @@ -0,0 +1,34 @@ +/** + * @fileoverview audio 插件 + */ +import context from './context' +let index = 0 + +function Audio (vm) { + this.vm = vm +} + +Audio.prototype.onUpdate = function () { + this.audios = [] +} + +Audio.prototype.onParse = function (node) { + if (node.name === 'audio') { + if (!node.attrs.id) { + node.attrs.id = 'a' + index++ + } + this.audios.push(node.attrs.id) + } +} + +Audio.prototype.onLoad = function () { + setTimeout(() => { + for (let i = 0; i < this.audios.length; i++) { + const ctx = context.get(this.audios[i]) + ctx.id = this.audios[i] + this.vm._videos.push(ctx) + } + }, 500) +} + +export default Audio diff --git a/uni_modules/uview-next/components/u-parse/node/node.vue b/uni_modules/uview-next/components/u-parse/node/node.vue new file mode 100644 index 0000000..1e336ea --- /dev/null +++ b/uni_modules/uview-next/components/u-parse/node/node.vue @@ -0,0 +1,599 @@ +