@elgap/edukaai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +15 -0
- package/.output/public/_nuxt/BHDzAs85.js +1 -0
- package/.output/public/_nuxt/BJzbfdL_.js +1 -0
- package/.output/public/_nuxt/BKGLlKXk.js +6 -0
- package/.output/public/_nuxt/BLuXzJk3.js +1 -0
- package/.output/public/_nuxt/BNOzzLI3.js +1 -0
- package/.output/public/_nuxt/BO5GMwXh.js +1 -0
- package/.output/public/_nuxt/BQRbsFGy.js +1 -0
- package/.output/public/_nuxt/Be4MVdOg.js +1 -0
- package/.output/public/_nuxt/Bu4d3Z1T.js +1 -0
- package/.output/public/_nuxt/BwpBBNv4.js +1 -0
- package/.output/public/_nuxt/C1Og9-6n.js +97 -0
- package/.output/public/_nuxt/C3CjAhtj.js +1 -0
- package/.output/public/_nuxt/C6E3Ty3z.js +1 -0
- package/.output/public/_nuxt/COct4B42.js +1 -0
- package/.output/public/_nuxt/CQ6g2dtj.js +1 -0
- package/.output/public/_nuxt/CURSW5TV.js +246 -0
- package/.output/public/_nuxt/CW57JW4s.js +1 -0
- package/.output/public/_nuxt/Cg2fM61o.js +18 -0
- package/.output/public/_nuxt/CgGOeWta.js +1 -0
- package/.output/public/_nuxt/CoyYbT7u.js +1 -0
- package/.output/public/_nuxt/D11MHbGc.js +133 -0
- package/.output/public/_nuxt/D24dz0S8.js +1 -0
- package/.output/public/_nuxt/D3EFPr8x.js +1 -0
- package/.output/public/_nuxt/Dvt4ZHil.js +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -0
- package/.output/public/_nuxt/builds/meta/ab87ba0e-6d0d-4466-8b12-00d44f8fb9d3.json +1 -0
- package/.output/public/_nuxt/default.C1K1-g4D.css +1 -0
- package/.output/public/_nuxt/entry.CH8k-Mga.css +1 -0
- package/.output/public/_nuxt/error-404.C-Ezrlz-.css +1 -0
- package/.output/public/_nuxt/error-500.DBWf9FGj.css +1 -0
- package/.output/public/_nuxt/first-training.wFDD65zm.css +1 -0
- package/.output/public/_nuxt/import.cUKYdCrq.css +1 -0
- package/.output/public/_nuxt/index.D-2VHyHA.css +1 -0
- package/.output/public/_nuxt/index.D4J_vHmL.css +1 -0
- package/.output/public/_nuxt/mPJeLIz7.js +1 -0
- package/.output/server/chunks/_/error-500.mjs +19 -0
- package/.output/server/chunks/_/error-500.mjs.map +1 -0
- package/.output/server/chunks/build/ExampleCard-styles.BUOJhEg0.mjs +8 -0
- package/.output/server/chunks/build/ExampleCard-styles.BUOJhEg0.mjs.map +1 -0
- package/.output/server/chunks/build/ExampleForm-Bcpl0CfL.mjs +238 -0
- package/.output/server/chunks/build/ExampleForm-Bcpl0CfL.mjs.map +1 -0
- package/.output/server/chunks/build/ImportPreview-styles.CFmMl5Ok.mjs +8 -0
- package/.output/server/chunks/build/ImportPreview-styles.CFmMl5Ok.mjs.map +1 -0
- package/.output/server/chunks/build/_id_-BUSGcL-H.mjs +113 -0
- package/.output/server/chunks/build/_id_-BUSGcL-H.mjs.map +1 -0
- package/.output/server/chunks/build/axolotl-C-EXGgM8.mjs +112 -0
- package/.output/server/chunks/build/axolotl-C-EXGgM8.mjs.map +1 -0
- package/.output/server/chunks/build/best-practices-DsadorHb.mjs +38 -0
- package/.output/server/chunks/build/best-practices-DsadorHb.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +4 -0
- package/.output/server/chunks/build/client.precomputed.mjs.map +1 -0
- package/.output/server/chunks/build/default-DPkqqHOE.mjs +354 -0
- package/.output/server/chunks/build/default-DPkqqHOE.mjs.map +1 -0
- package/.output/server/chunks/build/default-styles.DsqVVS7k.mjs +8 -0
- package/.output/server/chunks/build/default-styles.DsqVVS7k.mjs.map +1 -0
- package/.output/server/chunks/build/error-404-K4UfZNck.mjs +97 -0
- package/.output/server/chunks/build/error-404-K4UfZNck.mjs.map +1 -0
- package/.output/server/chunks/build/error-404-styles.DuDrf-v0.mjs +8 -0
- package/.output/server/chunks/build/error-404-styles.DuDrf-v0.mjs.map +1 -0
- package/.output/server/chunks/build/error-500-CA7TEPNg.mjs +79 -0
- package/.output/server/chunks/build/error-500-CA7TEPNg.mjs.map +1 -0
- package/.output/server/chunks/build/error-500-styles.8IYEHzz6.mjs +8 -0
- package/.output/server/chunks/build/error-500-styles.8IYEHzz6.mjs.map +1 -0
- package/.output/server/chunks/build/examples-BHK8MDrs.mjs +134 -0
- package/.output/server/chunks/build/examples-BHK8MDrs.mjs.map +1 -0
- package/.output/server/chunks/build/export-BzxFqqfP.mjs +233 -0
- package/.output/server/chunks/build/export-BzxFqqfP.mjs.map +1 -0
- package/.output/server/chunks/build/faq-DKch73dS.mjs +112 -0
- package/.output/server/chunks/build/faq-DKch73dS.mjs.map +1 -0
- package/.output/server/chunks/build/field-guide-qbukT8F0.mjs +38 -0
- package/.output/server/chunks/build/field-guide-qbukT8F0.mjs.map +1 -0
- package/.output/server/chunks/build/first-training-BbEOBcEW.mjs +343 -0
- package/.output/server/chunks/build/first-training-BbEOBcEW.mjs.map +1 -0
- package/.output/server/chunks/build/first-training-styles.BzOa_KRD.mjs +8 -0
- package/.output/server/chunks/build/first-training-styles.BzOa_KRD.mjs.map +1 -0
- package/.output/server/chunks/build/glossary-CxSGCJoH.mjs +397 -0
- package/.output/server/chunks/build/glossary-CxSGCJoH.mjs.map +1 -0
- package/.output/server/chunks/build/huggingface-TSmyUzZU.mjs +128 -0
- package/.output/server/chunks/build/huggingface-TSmyUzZU.mjs.map +1 -0
- package/.output/server/chunks/build/import-C0kYhRv9.mjs +247 -0
- package/.output/server/chunks/build/import-C0kYhRv9.mjs.map +1 -0
- package/.output/server/chunks/build/index-C1ntBEWd.mjs +235 -0
- package/.output/server/chunks/build/index-C1ntBEWd.mjs.map +1 -0
- package/.output/server/chunks/build/index-D3CxihcX.mjs +320 -0
- package/.output/server/chunks/build/index-D3CxihcX.mjs.map +1 -0
- package/.output/server/chunks/build/index-DgKa1cy0.mjs +360 -0
- package/.output/server/chunks/build/index-DgKa1cy0.mjs.map +1 -0
- package/.output/server/chunks/build/index-cG54gaKX.mjs +513 -0
- package/.output/server/chunks/build/index-cG54gaKX.mjs.map +1 -0
- package/.output/server/chunks/build/index-styles.BX2SZiiS.mjs +8 -0
- package/.output/server/chunks/build/index-styles.BX2SZiiS.mjs.map +1 -0
- package/.output/server/chunks/build/llm-training-DIqc0eiM.mjs +91 -0
- package/.output/server/chunks/build/llm-training-DIqc0eiM.mjs.map +1 -0
- package/.output/server/chunks/build/new-b3338aLF.mjs +92 -0
- package/.output/server/chunks/build/new-b3338aLF.mjs.map +1 -0
- package/.output/server/chunks/build/nuxt-link-Ceyd90PQ.mjs +290 -0
- package/.output/server/chunks/build/nuxt-link-Ceyd90PQ.mjs.map +1 -0
- package/.output/server/chunks/build/sample-datasets-CVLWMQUA.mjs +45 -0
- package/.output/server/chunks/build/sample-datasets-CVLWMQUA.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +1979 -0
- package/.output/server/chunks/build/server.mjs.map +1 -0
- package/.output/server/chunks/build/styles.mjs +20 -0
- package/.output/server/chunks/build/styles.mjs.map +1 -0
- package/.output/server/chunks/build/test-router-BYM6Cpst.mjs +105 -0
- package/.output/server/chunks/build/test-router-BYM6Cpst.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +5800 -0
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -0
- package/.output/server/chunks/routes/renderer.mjs +481 -0
- package/.output/server/chunks/routes/renderer.mjs.map +1 -0
- package/.output/server/chunks/virtual/_virtual_spa-template.mjs +4 -0
- package/.output/server/chunks/virtual/_virtual_spa-template.mjs.map +1 -0
- package/.output/server/index.mjs +12 -0
- package/.output/server/index.mjs.map +1 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/api.js +2 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/app.js +2 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/component.js +2 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/context.js +2 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/hooks.js +2 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/index.js +22 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/api/util.js +2 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/const.js +5 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/env.js +17 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/index.js +45 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/plugin.js +2 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/proxy.js +111 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/lib/cjs/time.js +28 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@6.6.4/package.json +37 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@7.7.9/dist/index.cjs +42 -0
- package/.output/server/node_modules/.nitro/@vue/devtools-api@7.7.9/package.json +32 -0
- package/.output/server/node_modules/.nitro/hookable@5.5.3/dist/index.cjs +299 -0
- package/.output/server/node_modules/.nitro/hookable@5.5.3/package.json +49 -0
- package/.output/server/node_modules/.nitro/hookable@6.0.1/dist/index.mjs +266 -0
- package/.output/server/node_modules/.nitro/hookable@6.0.1/package.json +52 -0
- package/.output/server/node_modules/.nitro/perfect-debounce@1.0.0/dist/index.cjs +59 -0
- package/.output/server/node_modules/.nitro/perfect-debounce@1.0.0/package.json +44 -0
- package/.output/server/node_modules/.nitro/perfect-debounce@2.1.0/dist/index.mjs +89 -0
- package/.output/server/node_modules/.nitro/perfect-debounce@2.1.0/package.json +41 -0
- package/.output/server/node_modules/@babel/parser/lib/index.js +14582 -0
- package/.output/server/node_modules/@babel/parser/package.json +50 -0
- package/.output/server/node_modules/@iconify/utils/lib/colors/index.js +292 -0
- package/.output/server/node_modules/@iconify/utils/lib/colors/keywords.js +702 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/common.js +76 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/format.js +40 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/icon.js +52 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/icons.js +133 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/bool.js +20 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/defaults.js +15 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/flip.js +18 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/merge.js +18 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/rotate.js +31 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/cleanup.js +80 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/convert.js +102 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/data.js +29 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/format.js +60 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/parse.js +50 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/base.js +204 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/create.js +35 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/numbers.js +134 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/similar.js +167 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/tree.js +81 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/replace/find.js +94 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/replace/replace.js +28 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/components.js +78 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/missing.js +68 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/name.js +47 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/parse.js +105 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/similar.js +38 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/tree.js +94 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/variations.js +64 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/defaults.js +26 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/merge.js +18 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/name.js +58 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/square.js +34 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/transformations.js +13 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/convert-info.js +126 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/expand.js +21 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/get-icon.js +27 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/get-icons.js +38 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/minify.js +93 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/parse.js +48 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/tree.js +24 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/validate-basic.js +44 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/validate.js +125 -0
- package/.output/server/node_modules/@iconify/utils/lib/index.js +53 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/custom.js +32 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/loader.js +28 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/modern.js +42 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/utils.js +63 -0
- package/.output/server/node_modules/@iconify/utils/lib/misc/objects.js +27 -0
- package/.output/server/node_modules/@iconify/utils/lib/misc/strings.js +27 -0
- package/.output/server/node_modules/@iconify/utils/lib/misc/title.js +10 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/build.js +115 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/defs.js +32 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/encode-svg-for-css.js +15 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/html.js +10 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/id.js +42 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/inner-html.js +23 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/parse.js +69 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/pretty.js +55 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/size.js +28 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/trim.js +8 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/url.js +23 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/viewbox.js +9 -0
- package/.output/server/node_modules/@iconify/utils/package.json +118 -0
- package/.output/server/node_modules/@iconify/vue/dist/iconify.mjs +1893 -0
- package/.output/server/node_modules/@iconify/vue/package.json +64 -0
- package/.output/server/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +6763 -0
- package/.output/server/node_modules/@vue/compiler-core/package.json +58 -0
- package/.output/server/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +689 -0
- package/.output/server/node_modules/@vue/compiler-dom/package.json +57 -0
- package/.output/server/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +1413 -0
- package/.output/server/node_modules/@vue/compiler-ssr/package.json +34 -0
- package/.output/server/node_modules/@vue/devtools-kit/dist/index.cjs +6850 -0
- package/.output/server/node_modules/@vue/devtools-kit/package.json +44 -0
- package/.output/server/node_modules/@vue/devtools-shared/dist/index.cjs +378 -0
- package/.output/server/node_modules/@vue/devtools-shared/package.json +34 -0
- package/.output/server/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +1870 -0
- package/.output/server/node_modules/@vue/reactivity/package.json +55 -0
- package/.output/server/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +6810 -0
- package/.output/server/node_modules/@vue/runtime-core/package.json +52 -0
- package/.output/server/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +1750 -0
- package/.output/server/node_modules/@vue/runtime-dom/package.json +60 -0
- package/.output/server/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +883 -0
- package/.output/server/node_modules/@vue/server-renderer/package.json +55 -0
- package/.output/server/node_modules/@vue/shared/dist/shared.cjs.prod.js +604 -0
- package/.output/server/node_modules/@vue/shared/package.json +47 -0
- package/.output/server/node_modules/birpc/dist/index.cjs +296 -0
- package/.output/server/node_modules/birpc/package.json +57 -0
- package/.output/server/node_modules/consola/dist/chunks/prompt.mjs +280 -0
- package/.output/server/node_modules/consola/dist/core.mjs +512 -0
- package/.output/server/node_modules/consola/dist/index.mjs +651 -0
- package/.output/server/node_modules/consola/dist/shared/consola.DRwqZj3T.mjs +72 -0
- package/.output/server/node_modules/consola/dist/shared/consola.DXBYu-KD.mjs +288 -0
- package/.output/server/node_modules/consola/package.json +136 -0
- package/.output/server/node_modules/devalue/index.js +4 -0
- package/.output/server/node_modules/devalue/package.json +37 -0
- package/.output/server/node_modules/devalue/src/base64.js +110 -0
- package/.output/server/node_modules/devalue/src/constants.js +7 -0
- package/.output/server/node_modules/devalue/src/parse.js +246 -0
- package/.output/server/node_modules/devalue/src/stringify.js +350 -0
- package/.output/server/node_modules/devalue/src/uneval.js +490 -0
- package/.output/server/node_modules/devalue/src/utils.js +148 -0
- package/.output/server/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
- package/.output/server/node_modules/entities/dist/commonjs/decode.js +568 -0
- package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-html.js +7 -0
- package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +7 -0
- package/.output/server/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js +21 -0
- package/.output/server/node_modules/entities/dist/commonjs/internal/decode-shared.js +31 -0
- package/.output/server/node_modules/entities/dist/commonjs/package.json +3 -0
- package/.output/server/node_modules/entities/package.json +120 -0
- package/.output/server/node_modules/estree-walker/dist/umd/estree-walker.js +344 -0
- package/.output/server/node_modules/estree-walker/package.json +37 -0
- package/.output/server/node_modules/pinia/dist/pinia.prod.cjs +719 -0
- package/.output/server/node_modules/pinia/package.json +94 -0
- package/.output/server/node_modules/source-map-js/lib/array-set.js +121 -0
- package/.output/server/node_modules/source-map-js/lib/base64-vlq.js +140 -0
- package/.output/server/node_modules/source-map-js/lib/base64.js +67 -0
- package/.output/server/node_modules/source-map-js/lib/binary-search.js +111 -0
- package/.output/server/node_modules/source-map-js/lib/mapping-list.js +79 -0
- package/.output/server/node_modules/source-map-js/lib/quick-sort.js +132 -0
- package/.output/server/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
- package/.output/server/node_modules/source-map-js/lib/source-map-generator.js +444 -0
- package/.output/server/node_modules/source-map-js/lib/source-node.js +413 -0
- package/.output/server/node_modules/source-map-js/lib/util.js +594 -0
- package/.output/server/node_modules/source-map-js/package.json +71 -0
- package/.output/server/node_modules/source-map-js/source-map.js +8 -0
- package/.output/server/node_modules/tailwindcss/dist/chunk-X4GG3EDV.mjs +1 -0
- package/.output/server/node_modules/tailwindcss/dist/colors.mjs +1 -0
- package/.output/server/node_modules/tailwindcss/package.json +89 -0
- package/.output/server/node_modules/ufo/dist/index.mjs +645 -0
- package/.output/server/node_modules/ufo/package.json +48 -0
- package/.output/server/node_modules/unhead/dist/index.mjs +9 -0
- package/.output/server/node_modules/unhead/dist/parser.mjs +508 -0
- package/.output/server/node_modules/unhead/dist/plugins.mjs +101 -0
- package/.output/server/node_modules/unhead/dist/scripts.mjs +30 -0
- package/.output/server/node_modules/unhead/dist/server.mjs +180 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BPM0-cfG.mjs +44 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BYvz9V1x.mjs +43 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BnoAbrHA.mjs +269 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CApf5sj3.mjs +148 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CbpEuj3y.mjs +71 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.DQc16pHI.mjs +196 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.D_nrZZPH.mjs +182 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.ckV6dpEQ.mjs +166 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.fVVqDC1O.mjs +203 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.yem5I2v_.mjs +38 -0
- package/.output/server/node_modules/unhead/dist/utils.mjs +5 -0
- package/.output/server/node_modules/unhead/package.json +105 -0
- package/.output/server/node_modules/vue/dist/vue.cjs.js +80 -0
- package/.output/server/node_modules/vue/dist/vue.cjs.prod.js +66 -0
- package/.output/server/node_modules/vue/index.js +7 -0
- package/.output/server/node_modules/vue/index.mjs +1 -0
- package/.output/server/node_modules/vue/package.json +112 -0
- package/.output/server/node_modules/vue/server-renderer/index.mjs +1 -0
- package/.output/server/node_modules/vue-bundle-renderer/dist/runtime.mjs +301 -0
- package/.output/server/node_modules/vue-bundle-renderer/package.json +55 -0
- package/.output/server/node_modules/vue-router/dist/devtools-EWN81iOl.mjs +1220 -0
- package/.output/server/node_modules/vue-router/dist/vue-router.mjs +1557 -0
- package/.output/server/node_modules/vue-router/package.json +153 -0
- package/.output/server/node_modules/vue-router/vue-router.node.mjs +2 -0
- package/.output/server/package.json +37 -0
- package/LICENSE +21 -0
- package/README.md +132 -0
- package/bin/cli.js +75 -0
- package/package.json +71 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { getEmojiSequenceFromString, getUnqualifiedEmojiSequence } from "./cleanup.js";
|
|
2
|
+
import { getEmojiSequenceKeyword } from "./format.js";
|
|
3
|
+
import { parseEmojiTestFile } from "./test/parse.js";
|
|
4
|
+
import { getQualifiedEmojiVariations } from "./test/variations.js";
|
|
5
|
+
import { findMissingEmojis } from "./test/missing.js";
|
|
6
|
+
import { createOptimisedRegexForEmojiSequences } from "./regex/create.js";
|
|
7
|
+
import { combineSimilarEmojiTestData } from "./test/similar.js";
|
|
8
|
+
import { getEmojiTestDataTree } from "./test/tree.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Prepare emoji for icons list
|
|
12
|
+
*
|
|
13
|
+
* Test data should be fetched from 'https://unicode.org/Public/emoji/17.0/emoji-test.txt'
|
|
14
|
+
* It is used to detect missing emojis and optimise regular expression
|
|
15
|
+
*/
|
|
16
|
+
function prepareEmojiForIconsList(icons, rawTestData) {
|
|
17
|
+
const testData = rawTestData ? parseEmojiTestFile(rawTestData) : void 0;
|
|
18
|
+
let iconsList = [];
|
|
19
|
+
for (const char in icons) {
|
|
20
|
+
const sequence = getEmojiSequenceFromString(char);
|
|
21
|
+
iconsList.push({
|
|
22
|
+
icon: icons[char],
|
|
23
|
+
sequence
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
iconsList = getQualifiedEmojiVariations(iconsList);
|
|
27
|
+
if (testData) iconsList = iconsList.concat(findMissingEmojis(iconsList, getEmojiTestDataTree(combineSimilarEmojiTestData(testData))));
|
|
28
|
+
const preparedIcons = iconsList.map((item) => {
|
|
29
|
+
const sequence = getEmojiSequenceKeyword(getUnqualifiedEmojiSequence(item.sequence));
|
|
30
|
+
return {
|
|
31
|
+
icon: item.icon,
|
|
32
|
+
sequence
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
return {
|
|
36
|
+
regex: createOptimisedRegexForEmojiSequences(iconsList.map((item) => item.sequence)),
|
|
37
|
+
icons: preparedIcons
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Prepare emoji for an icon set
|
|
42
|
+
*
|
|
43
|
+
* Test data should be fetched from 'https://unicode.org/Public/emoji/15.1/emoji-test.txt'
|
|
44
|
+
* It is used to detect missing emojis and optimise regular expression
|
|
45
|
+
*/
|
|
46
|
+
function prepareEmojiForIconSet(iconSet, rawTestData) {
|
|
47
|
+
return prepareEmojiForIconsList(iconSet.chars || {}, rawTestData);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { prepareEmojiForIconSet, prepareEmojiForIconsList };
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert number to string
|
|
3
|
+
*/
|
|
4
|
+
function toString(number) {
|
|
5
|
+
if (number < 255) {
|
|
6
|
+
if (number > 32 && number < 127) {
|
|
7
|
+
const char = String.fromCharCode(number);
|
|
8
|
+
if (number > 47 && number < 58 || number > 64 && number < 91 || number > 94 && number < 123) return char;
|
|
9
|
+
return "\\" + char;
|
|
10
|
+
}
|
|
11
|
+
return "\\x" + (number < 16 ? "0" : "") + number.toString(16).toUpperCase();
|
|
12
|
+
}
|
|
13
|
+
return "\\u" + number.toString(16).toUpperCase();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Typescript stuff
|
|
17
|
+
*/
|
|
18
|
+
function assertNever(v) {}
|
|
19
|
+
/**
|
|
20
|
+
* Wrap regex in group
|
|
21
|
+
*/
|
|
22
|
+
function wrapRegexInGroup(regex) {
|
|
23
|
+
return "(?:" + regex + ")";
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Update UTF16 item, return regex
|
|
27
|
+
*/
|
|
28
|
+
function updateUTF16EmojiRegexItem(item) {
|
|
29
|
+
const numbers = item.numbers;
|
|
30
|
+
if (numbers.length === 1) {
|
|
31
|
+
const num = numbers[0];
|
|
32
|
+
return item.regex = toString(num);
|
|
33
|
+
}
|
|
34
|
+
numbers.sort((a, b) => a - b);
|
|
35
|
+
const chars = [];
|
|
36
|
+
let range = null;
|
|
37
|
+
const addRange = () => {
|
|
38
|
+
if (range) {
|
|
39
|
+
const { start, last, numbers: numbers$1 } = range;
|
|
40
|
+
range = null;
|
|
41
|
+
if (last > start + 1) chars.push(toString(start) + "-" + toString(last));
|
|
42
|
+
else for (let i = 0; i < numbers$1.length; i++) chars.push(toString(numbers$1[i]));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
for (let i = 0; i < numbers.length; i++) {
|
|
46
|
+
const num = numbers[i];
|
|
47
|
+
if (range) {
|
|
48
|
+
if (range.last === num) continue;
|
|
49
|
+
if (range.last === num - 1) {
|
|
50
|
+
range.numbers.push(num);
|
|
51
|
+
range.last = num;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
addRange();
|
|
56
|
+
range = {
|
|
57
|
+
start: num,
|
|
58
|
+
last: num,
|
|
59
|
+
numbers: [num]
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
addRange();
|
|
63
|
+
if (!chars.length) throw new Error("Unexpected empty range");
|
|
64
|
+
return item.regex = "[" + chars.join("") + "]";
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create UTF-16 regex
|
|
68
|
+
*/
|
|
69
|
+
function createUTF16EmojiRegexItem(numbers) {
|
|
70
|
+
const result = {
|
|
71
|
+
type: "utf16",
|
|
72
|
+
regex: "",
|
|
73
|
+
numbers,
|
|
74
|
+
length: 1,
|
|
75
|
+
group: true
|
|
76
|
+
};
|
|
77
|
+
updateUTF16EmojiRegexItem(result);
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Update sequence regex. Does not update group
|
|
82
|
+
*/
|
|
83
|
+
function updateSequenceEmojiRegexItem(item) {
|
|
84
|
+
return item.regex = item.items.map((childItem) => {
|
|
85
|
+
if (!childItem.group && childItem.type === "set") return wrapRegexInGroup(childItem.regex);
|
|
86
|
+
return childItem.regex;
|
|
87
|
+
}).join("");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create sequence regex
|
|
91
|
+
*/
|
|
92
|
+
function createSequenceEmojiRegexItem(sequence, numbers) {
|
|
93
|
+
let items = [];
|
|
94
|
+
sequence.forEach((item) => {
|
|
95
|
+
if (item.type === "sequence") items = items.concat(item.items);
|
|
96
|
+
else items.push(item);
|
|
97
|
+
});
|
|
98
|
+
if (!items.length) throw new Error("Empty sequence");
|
|
99
|
+
const result = {
|
|
100
|
+
type: "sequence",
|
|
101
|
+
items,
|
|
102
|
+
regex: "",
|
|
103
|
+
length: items.reduce((length, item) => item.length + length, 0),
|
|
104
|
+
group: false
|
|
105
|
+
};
|
|
106
|
+
if (sequence.length === 1) {
|
|
107
|
+
const firstItem = sequence[0];
|
|
108
|
+
result.group = firstItem.group;
|
|
109
|
+
if (firstItem.type !== "optional") {
|
|
110
|
+
const numbers$1 = firstItem.numbers;
|
|
111
|
+
if (numbers$1) result.numbers = numbers$1;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (numbers) result.numbers = numbers;
|
|
115
|
+
updateSequenceEmojiRegexItem(result);
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Update set regex and group
|
|
120
|
+
*/
|
|
121
|
+
function updateSetEmojiRegexItem(item) {
|
|
122
|
+
if (item.sets.length === 1) {
|
|
123
|
+
const firstItem = item.sets[0];
|
|
124
|
+
item.group = firstItem.group;
|
|
125
|
+
return item.regex = firstItem.regex;
|
|
126
|
+
}
|
|
127
|
+
item.group = false;
|
|
128
|
+
return item.regex = item.sets.map((childItem) => childItem.regex).join("|");
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create set regex
|
|
132
|
+
*/
|
|
133
|
+
function createSetEmojiRegexItem(set) {
|
|
134
|
+
let sets = [];
|
|
135
|
+
let numbers = [];
|
|
136
|
+
set.forEach((item) => {
|
|
137
|
+
if (item.type === "set") sets = sets.concat(item.sets);
|
|
138
|
+
else sets.push(item);
|
|
139
|
+
if (numbers) if (item.type === "optional" || !item.numbers) numbers = null;
|
|
140
|
+
else numbers = [...numbers, ...item.numbers];
|
|
141
|
+
});
|
|
142
|
+
sets.sort((a, b) => {
|
|
143
|
+
if (a.length === b.length) return a.regex.localeCompare(b.regex);
|
|
144
|
+
return b.length - a.length;
|
|
145
|
+
});
|
|
146
|
+
const result = {
|
|
147
|
+
type: "set",
|
|
148
|
+
sets,
|
|
149
|
+
regex: "",
|
|
150
|
+
length: sets.reduce((length, item) => length ? Math.min(length, item.length) : item.length, 0),
|
|
151
|
+
group: false
|
|
152
|
+
};
|
|
153
|
+
if (numbers) result.numbers = numbers;
|
|
154
|
+
if (set.length === 1) result.group = set[0].group;
|
|
155
|
+
updateSetEmojiRegexItem(result);
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Update optional regex
|
|
160
|
+
*/
|
|
161
|
+
function updateOptionalEmojiRegexItem(item) {
|
|
162
|
+
const childItem = item.item;
|
|
163
|
+
return item.regex = (childItem.group ? childItem.regex : wrapRegexInGroup(childItem.regex)) + "?";
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Create optional item
|
|
167
|
+
*/
|
|
168
|
+
function createOptionalEmojiRegexItem(item) {
|
|
169
|
+
if (item.type === "optional") return item;
|
|
170
|
+
const result = {
|
|
171
|
+
type: "optional",
|
|
172
|
+
item,
|
|
173
|
+
regex: "",
|
|
174
|
+
length: item.length,
|
|
175
|
+
group: true
|
|
176
|
+
};
|
|
177
|
+
updateOptionalEmojiRegexItem(result);
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Clone item
|
|
182
|
+
*/
|
|
183
|
+
function cloneEmojiRegexItem(item, shallow = false) {
|
|
184
|
+
const result = { ...item };
|
|
185
|
+
if (result.type !== "optional" && result.numbers) result.numbers = [...result.numbers];
|
|
186
|
+
switch (result.type) {
|
|
187
|
+
case "utf16": break;
|
|
188
|
+
case "sequence":
|
|
189
|
+
if (shallow) result.items = [...result.items];
|
|
190
|
+
else result.items = result.items.map((item$1) => cloneEmojiRegexItem(item$1, false));
|
|
191
|
+
break;
|
|
192
|
+
case "set":
|
|
193
|
+
if (shallow) result.sets = [...result.sets];
|
|
194
|
+
else result.sets = result.sets.map((item$1) => cloneEmojiRegexItem(item$1, false));
|
|
195
|
+
break;
|
|
196
|
+
case "optional":
|
|
197
|
+
if (!shallow) result.item = cloneEmojiRegexItem(result.item, false);
|
|
198
|
+
break;
|
|
199
|
+
default: assertNever(result);
|
|
200
|
+
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export { cloneEmojiRegexItem, createOptionalEmojiRegexItem, createSequenceEmojiRegexItem, createSetEmojiRegexItem, createUTF16EmojiRegexItem, updateOptionalEmojiRegexItem, updateSequenceEmojiRegexItem, updateSetEmojiRegexItem, updateUTF16EmojiRegexItem, wrapRegexInGroup };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { convertEmojiSequenceToUTF32 } from "../convert.js";
|
|
2
|
+
import { getSequenceFromEmojiStringOrKeyword } from "../cleanup.js";
|
|
3
|
+
import { getQualifiedEmojiVariations } from "../test/variations.js";
|
|
4
|
+
import { createEmojisTree, parseEmojiTree } from "./tree.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Create optimised regex
|
|
8
|
+
*/
|
|
9
|
+
function createOptimisedRegexForEmojiSequences(sequences) {
|
|
10
|
+
sequences = sequences.map((item) => convertEmojiSequenceToUTF32(item));
|
|
11
|
+
return parseEmojiTree(createEmojisTree(sequences)).regex;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create optimised regex for emojis
|
|
15
|
+
*
|
|
16
|
+
* First parameter is array of emojis, entry can be either list of
|
|
17
|
+
* code points or emoji sequence as a string
|
|
18
|
+
*
|
|
19
|
+
* Examples of acceptable strings (case insensitive):
|
|
20
|
+
* '1F636 200D 1F32B FE0F' - space separated UTF32 sequence
|
|
21
|
+
* '1f636-200d-1f32b-fe0f' - dash separated UTF32 sequence
|
|
22
|
+
* 'd83d-de36-200d-d83c-df2b-fe0f' - dash separated UTF16 sequence
|
|
23
|
+
* '\\uD83D\\uDE36\\u200D\\uD83C\\uDF2B\\uFE0F' - UTF16 sequence escaped with '\\u'
|
|
24
|
+
*
|
|
25
|
+
* All examples above refer to the same emoji and will generate the same regex result
|
|
26
|
+
*/
|
|
27
|
+
function createOptimisedRegex(emojis) {
|
|
28
|
+
let sequences = emojis.map((item) => typeof item === "string" ? getSequenceFromEmojiStringOrKeyword(item) : item);
|
|
29
|
+
sequences = getQualifiedEmojiVariations(sequences.map((sequence) => {
|
|
30
|
+
return { sequence };
|
|
31
|
+
})).map((item) => item.sequence);
|
|
32
|
+
return createOptimisedRegexForEmojiSequences(sequences);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { createOptimisedRegex, createOptimisedRegexForEmojiSequences };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { vs16Emoji } from "../data.js";
|
|
2
|
+
import { splitUTF32Number } from "../convert.js";
|
|
3
|
+
import { createOptionalEmojiRegexItem, createSequenceEmojiRegexItem, createSetEmojiRegexItem, createUTF16EmojiRegexItem } from "./base.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Create regex item for set of numbers
|
|
7
|
+
*/
|
|
8
|
+
function createEmojiRegexItemForNumbers(numbers) {
|
|
9
|
+
const utf32 = [];
|
|
10
|
+
const utf16 = [];
|
|
11
|
+
numbers.sort((a, b) => a - b);
|
|
12
|
+
let lastNumber;
|
|
13
|
+
for (let i = 0; i < numbers.length; i++) {
|
|
14
|
+
const number = numbers[i];
|
|
15
|
+
if (number === lastNumber) continue;
|
|
16
|
+
lastNumber = number;
|
|
17
|
+
const split = splitUTF32Number(number);
|
|
18
|
+
if (!split) {
|
|
19
|
+
utf16.push(number);
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const [first, second] = split;
|
|
23
|
+
const item = utf32.find((item$1) => item$1.first === first);
|
|
24
|
+
if (item) {
|
|
25
|
+
item.second.push(second);
|
|
26
|
+
item.numbers.push(number);
|
|
27
|
+
} else utf32.push({
|
|
28
|
+
first,
|
|
29
|
+
second: [second],
|
|
30
|
+
numbers: [number]
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const results = [];
|
|
34
|
+
if (utf16.length) results.push(createUTF16EmojiRegexItem(utf16));
|
|
35
|
+
if (utf32.length) {
|
|
36
|
+
const utf32Set = [];
|
|
37
|
+
for (let i = 0; i < utf32.length; i++) {
|
|
38
|
+
const item = utf32[i];
|
|
39
|
+
const secondRegex = createUTF16EmojiRegexItem(item.second);
|
|
40
|
+
const listItem = utf32Set.find((item$1) => item$1.second.regex === secondRegex.regex);
|
|
41
|
+
if (listItem) {
|
|
42
|
+
listItem.first.push(item.first);
|
|
43
|
+
listItem.numbers = [...listItem.numbers, ...item.numbers];
|
|
44
|
+
} else utf32Set.push({
|
|
45
|
+
second: secondRegex,
|
|
46
|
+
first: [item.first],
|
|
47
|
+
numbers: [...item.numbers]
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
for (let i = 0; i < utf32Set.length; i++) {
|
|
51
|
+
const item = utf32Set[i];
|
|
52
|
+
const firstRegex = createUTF16EmojiRegexItem(item.first);
|
|
53
|
+
const secondRegex = item.second;
|
|
54
|
+
results.push(createSequenceEmojiRegexItem([firstRegex, secondRegex], item.numbers));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return results.length === 1 ? results[0] : createSetEmojiRegexItem(results);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create sequence of numbers
|
|
61
|
+
*/
|
|
62
|
+
function createRegexForNumbersSequence(numbers, optionalVariations = true) {
|
|
63
|
+
const items = [];
|
|
64
|
+
for (let i = 0; i < numbers.length; i++) {
|
|
65
|
+
const num = numbers[i];
|
|
66
|
+
const split = splitUTF32Number(num);
|
|
67
|
+
if (!split) {
|
|
68
|
+
const item = createUTF16EmojiRegexItem([num]);
|
|
69
|
+
if (optionalVariations && num === vs16Emoji) items.push(createOptionalEmojiRegexItem(item));
|
|
70
|
+
else items.push(item);
|
|
71
|
+
} else {
|
|
72
|
+
items.push(createUTF16EmojiRegexItem([split[0]]));
|
|
73
|
+
items.push(createUTF16EmojiRegexItem([split[1]]));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (items.length === 1) return items[0];
|
|
77
|
+
const result = createSequenceEmojiRegexItem(items);
|
|
78
|
+
if (numbers.length === 1 && items[0].type === "utf16") result.numbers = [...numbers];
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Attempt to optimise numbers in a set
|
|
83
|
+
*/
|
|
84
|
+
function optimiseNumbersSet(set) {
|
|
85
|
+
const mandatoryMatches = {
|
|
86
|
+
numbers: [],
|
|
87
|
+
items: []
|
|
88
|
+
};
|
|
89
|
+
const optionalMatches = {
|
|
90
|
+
numbers: [],
|
|
91
|
+
items: []
|
|
92
|
+
};
|
|
93
|
+
const filteredItems = set.sets.filter((item) => {
|
|
94
|
+
if (item.type === "optional") {
|
|
95
|
+
const parentItem = item.item;
|
|
96
|
+
if (parentItem.numbers) {
|
|
97
|
+
optionalMatches.items.push(item);
|
|
98
|
+
optionalMatches.numbers = optionalMatches.numbers.concat(parentItem.numbers);
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
if (item.numbers) {
|
|
104
|
+
mandatoryMatches.items.push(item);
|
|
105
|
+
mandatoryMatches.numbers = mandatoryMatches.numbers.concat(item.numbers);
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return true;
|
|
109
|
+
});
|
|
110
|
+
if (mandatoryMatches.items.length + optionalMatches.items.length < 2) return set;
|
|
111
|
+
const optionalNumbers = new Set(optionalMatches.numbers);
|
|
112
|
+
let foundMatches = false;
|
|
113
|
+
mandatoryMatches.numbers = mandatoryMatches.numbers.filter((number) => {
|
|
114
|
+
if (optionalNumbers.has(number)) {
|
|
115
|
+
foundMatches = true;
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
});
|
|
120
|
+
if (mandatoryMatches.items.length) {
|
|
121
|
+
if (!foundMatches && mandatoryMatches.items.length === 1) filteredItems.push(mandatoryMatches.items[0]);
|
|
122
|
+
else if (mandatoryMatches.numbers.length) filteredItems.push(createEmojiRegexItemForNumbers(mandatoryMatches.numbers));
|
|
123
|
+
}
|
|
124
|
+
switch (optionalMatches.items.length) {
|
|
125
|
+
case 0: break;
|
|
126
|
+
case 1:
|
|
127
|
+
filteredItems.push(optionalMatches.items[0]);
|
|
128
|
+
break;
|
|
129
|
+
default: filteredItems.push(createOptionalEmojiRegexItem(createEmojiRegexItemForNumbers(optionalMatches.numbers)));
|
|
130
|
+
}
|
|
131
|
+
return filteredItems.length === 1 ? filteredItems[0] : createSetEmojiRegexItem(filteredItems);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export { createEmojiRegexItemForNumbers, createRegexForNumbersSequence, optimiseNumbersSet };
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { cloneEmojiRegexItem, createOptionalEmojiRegexItem, createSequenceEmojiRegexItem, createSetEmojiRegexItem } from "./base.js";
|
|
2
|
+
import { optimiseNumbersSet } from "./numbers.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Typescript stuff
|
|
6
|
+
*/
|
|
7
|
+
function assertNever(v) {}
|
|
8
|
+
/**
|
|
9
|
+
* Find similar item sequences
|
|
10
|
+
*
|
|
11
|
+
* Returns sequence(s) with highest score. Only one of results should be
|
|
12
|
+
* applied to items. If there are multiple sequences, clone items list,
|
|
13
|
+
* attempt to apply each sequence, run further optimisations on each fork
|
|
14
|
+
* and see which one returns better result.
|
|
15
|
+
*
|
|
16
|
+
* Returns undefined if no common sequences found
|
|
17
|
+
*/
|
|
18
|
+
function findSimilarRegexItemSequences(items) {
|
|
19
|
+
const startRegex = Object.create(null);
|
|
20
|
+
const endRegex = Object.create(null);
|
|
21
|
+
const addMapItem = (target, index, regex, slice) => {
|
|
22
|
+
if (!target[regex]) {
|
|
23
|
+
target[regex] = {
|
|
24
|
+
score: 0,
|
|
25
|
+
slices: [{
|
|
26
|
+
index,
|
|
27
|
+
slice
|
|
28
|
+
}]
|
|
29
|
+
};
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const item = target[regex];
|
|
33
|
+
item.score += regex.length;
|
|
34
|
+
item.slices.push({
|
|
35
|
+
index,
|
|
36
|
+
slice
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
for (let index = 0; index < items.length; index++) {
|
|
40
|
+
const baseItem = items[index];
|
|
41
|
+
switch (baseItem.type) {
|
|
42
|
+
case "optional":
|
|
43
|
+
case "utf16":
|
|
44
|
+
addMapItem(startRegex, index, baseItem.regex, "full");
|
|
45
|
+
addMapItem(endRegex, index, baseItem.regex, "full");
|
|
46
|
+
break;
|
|
47
|
+
case "sequence": {
|
|
48
|
+
addMapItem(startRegex, index, baseItem.regex, "full");
|
|
49
|
+
addMapItem(endRegex, index, baseItem.regex, "full");
|
|
50
|
+
const sequence = baseItem.items;
|
|
51
|
+
for (let i = 1; i < sequence.length; i++) {
|
|
52
|
+
const startSequence = createSequenceEmojiRegexItem(sequence.slice(0, i));
|
|
53
|
+
addMapItem(startRegex, index, startSequence.regex, i);
|
|
54
|
+
const endSequence = createSequenceEmojiRegexItem(sequence.slice(i));
|
|
55
|
+
addMapItem(endRegex, index, endSequence.regex, i);
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case "set": throw new Error("Unexpected set within a set");
|
|
60
|
+
default: assertNever(baseItem);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
let result;
|
|
64
|
+
const checkResults = (target, type) => {
|
|
65
|
+
for (const regex in target) {
|
|
66
|
+
const item = target[regex];
|
|
67
|
+
if (!item.score) continue;
|
|
68
|
+
if (!result || result.score < item.score) {
|
|
69
|
+
result = {
|
|
70
|
+
score: item.score,
|
|
71
|
+
sequences: [{
|
|
72
|
+
type,
|
|
73
|
+
slices: item.slices
|
|
74
|
+
}]
|
|
75
|
+
};
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (result.score === item.score) result.sequences.push({
|
|
79
|
+
type,
|
|
80
|
+
slices: item.slices
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
checkResults(startRegex, "start");
|
|
85
|
+
checkResults(endRegex, "end");
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Merge similar sequences
|
|
90
|
+
*
|
|
91
|
+
* Accepts callback to run optimisation on created subset
|
|
92
|
+
*/
|
|
93
|
+
function mergeSimilarRegexItemSequences(items, merge, optimise) {
|
|
94
|
+
const { type, slices } = merge;
|
|
95
|
+
const indexes = /* @__PURE__ */ new Set();
|
|
96
|
+
let hasFullSequence = false;
|
|
97
|
+
let longestMatch = 0;
|
|
98
|
+
let longestMatchIndex = -1;
|
|
99
|
+
const differentSequences = [];
|
|
100
|
+
for (let i = 0; i < slices.length; i++) {
|
|
101
|
+
const { index, slice } = slices[i];
|
|
102
|
+
const item = items[index];
|
|
103
|
+
let length;
|
|
104
|
+
if (slice === "full") {
|
|
105
|
+
hasFullSequence = true;
|
|
106
|
+
if (item.type === "sequence") length = item.items.length;
|
|
107
|
+
else length = 1;
|
|
108
|
+
} else {
|
|
109
|
+
if (item.type !== "sequence") throw new Error(`Unexpected partial match for type "${item.type}"`);
|
|
110
|
+
length = type === "start" ? slice : item.items.length - slice;
|
|
111
|
+
differentSequences.push(type === "start" ? item.items.slice(slice) : item.items.slice(0, slice));
|
|
112
|
+
}
|
|
113
|
+
if (length > longestMatch) {
|
|
114
|
+
longestMatchIndex = index;
|
|
115
|
+
longestMatch = length;
|
|
116
|
+
}
|
|
117
|
+
indexes.add(index);
|
|
118
|
+
}
|
|
119
|
+
if (longestMatch < 1 || longestMatchIndex < 0) throw new Error("Cannot find common sequence");
|
|
120
|
+
const commonItem = items[longestMatchIndex];
|
|
121
|
+
let sequence;
|
|
122
|
+
if (commonItem.type !== "sequence") {
|
|
123
|
+
if (longestMatch !== 1) throw new Error("Something went wrong. Cannot have long match in non-sequence");
|
|
124
|
+
sequence = [commonItem];
|
|
125
|
+
} else sequence = type === "start" ? commonItem.items.slice(0, longestMatch) : commonItem.items.slice(commonItem.items.length - longestMatch);
|
|
126
|
+
const setItems = [];
|
|
127
|
+
for (let i = 0; i < differentSequences.length; i++) {
|
|
128
|
+
const list = differentSequences[i];
|
|
129
|
+
if (list.length === 1) setItems.push(list[0]);
|
|
130
|
+
else setItems.push(createSequenceEmojiRegexItem(list));
|
|
131
|
+
}
|
|
132
|
+
const set = createSetEmojiRegexItem(setItems);
|
|
133
|
+
let mergedChunk = set.sets.length === 1 ? set.sets[0] : optimise ? optimise(set) : set;
|
|
134
|
+
if (hasFullSequence) mergedChunk = createOptionalEmojiRegexItem(mergedChunk);
|
|
135
|
+
sequence[type === "start" ? "push" : "unshift"](mergedChunk);
|
|
136
|
+
return [createSequenceEmojiRegexItem(sequence), ...items.filter((item, index) => !indexes.has(index))];
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Merge similar items
|
|
140
|
+
*/
|
|
141
|
+
function mergeSimilarItemsInSet(set) {
|
|
142
|
+
const updatedSet = optimiseNumbersSet(set);
|
|
143
|
+
if (updatedSet.type !== "set") return updatedSet;
|
|
144
|
+
set = updatedSet;
|
|
145
|
+
let merges;
|
|
146
|
+
while (merges = findSimilarRegexItemSequences(set.sets)) {
|
|
147
|
+
const sequences = merges.sequences;
|
|
148
|
+
if (sequences.length === 1) {
|
|
149
|
+
const merged = mergeSimilarRegexItemSequences(set.sets.map((item) => cloneEmojiRegexItem(item, true)), sequences[0], mergeSimilarItemsInSet);
|
|
150
|
+
if (merged.length === 1) return merged[0];
|
|
151
|
+
set = createSetEmojiRegexItem(merged);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
let newItem;
|
|
155
|
+
for (let i = 0; i < sequences.length; i++) {
|
|
156
|
+
const merged = mergeSimilarRegexItemSequences(set.sets.map((item) => cloneEmojiRegexItem(item, true)), sequences[i], mergeSimilarItemsInSet);
|
|
157
|
+
const mergedItem = merged.length === 1 ? merged[0] : createSetEmojiRegexItem(merged);
|
|
158
|
+
if (!newItem || mergedItem.regex.length < newItem.regex.length) newItem = mergedItem;
|
|
159
|
+
}
|
|
160
|
+
if (!newItem) throw new Error("Empty sequences list");
|
|
161
|
+
if (newItem.type !== "set") return newItem;
|
|
162
|
+
set = newItem;
|
|
163
|
+
}
|
|
164
|
+
return set;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export { findSimilarRegexItemSequences, mergeSimilarItemsInSet, mergeSimilarRegexItemSequences };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { joinerEmoji } from "../data.js";
|
|
2
|
+
import { convertEmojiSequenceToUTF32 } from "../convert.js";
|
|
3
|
+
import { splitEmojiSequences } from "../cleanup.js";
|
|
4
|
+
import { createOptionalEmojiRegexItem, createSequenceEmojiRegexItem, createSetEmojiRegexItem, createUTF16EmojiRegexItem } from "./base.js";
|
|
5
|
+
import { createRegexForNumbersSequence } from "./numbers.js";
|
|
6
|
+
import { mergeSimilarItemsInSet } from "./similar.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Create tree
|
|
10
|
+
*/
|
|
11
|
+
function createEmojisTree(sequences) {
|
|
12
|
+
const root = [];
|
|
13
|
+
for (let i = 0; i < sequences.length; i++) {
|
|
14
|
+
const split = splitEmojiSequences(convertEmojiSequenceToUTF32(sequences[i]));
|
|
15
|
+
let parent = root;
|
|
16
|
+
for (let j = 0; j < split.length; j++) {
|
|
17
|
+
const regex = createRegexForNumbersSequence(split[j]);
|
|
18
|
+
let item;
|
|
19
|
+
const match = parent.find((item$1) => item$1.regex.regex === regex.regex);
|
|
20
|
+
if (!match) {
|
|
21
|
+
item = { regex };
|
|
22
|
+
parent.push(item);
|
|
23
|
+
} else item = match;
|
|
24
|
+
if (j === split.length - 1) {
|
|
25
|
+
item.end = true;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
parent = item.children || (item.children = []);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return root;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse tree
|
|
35
|
+
*/
|
|
36
|
+
function parseEmojiTree(items) {
|
|
37
|
+
function mergeParsedChildren(items$1) {
|
|
38
|
+
const parsedItems = [];
|
|
39
|
+
const mapWithoutEnd = Object.create(null);
|
|
40
|
+
const mapWithEnd = Object.create(null);
|
|
41
|
+
for (let i = 0; i < items$1.length; i++) {
|
|
42
|
+
const item = items$1[i];
|
|
43
|
+
const children = item.children;
|
|
44
|
+
if (children) {
|
|
45
|
+
const fullItem = item;
|
|
46
|
+
const target = item.end ? mapWithEnd : mapWithoutEnd;
|
|
47
|
+
const regex = children.regex;
|
|
48
|
+
if (!target[regex]) target[regex] = [fullItem];
|
|
49
|
+
else target[regex].push(fullItem);
|
|
50
|
+
} else parsedItems.push(item.regex);
|
|
51
|
+
}
|
|
52
|
+
[mapWithEnd, mapWithoutEnd].forEach((source) => {
|
|
53
|
+
for (const regex in source) {
|
|
54
|
+
const items$2 = source[regex];
|
|
55
|
+
const firstItem = items$2[0];
|
|
56
|
+
let childSequence = [createUTF16EmojiRegexItem([joinerEmoji]), firstItem.children];
|
|
57
|
+
if (firstItem.end) childSequence = [createOptionalEmojiRegexItem(createSequenceEmojiRegexItem(childSequence))];
|
|
58
|
+
let mergedRegex;
|
|
59
|
+
if (items$2.length === 1) mergedRegex = firstItem.regex;
|
|
60
|
+
else mergedRegex = mergeSimilarItemsInSet(createSetEmojiRegexItem(items$2.map((item) => item.regex)));
|
|
61
|
+
const sequence = createSequenceEmojiRegexItem([mergedRegex, ...childSequence]);
|
|
62
|
+
parsedItems.push(sequence);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
if (parsedItems.length === 1) return parsedItems[0];
|
|
66
|
+
return mergeSimilarItemsInSet(createSetEmojiRegexItem(parsedItems));
|
|
67
|
+
}
|
|
68
|
+
function parseItemChildren(item) {
|
|
69
|
+
const result = {
|
|
70
|
+
regex: item.regex,
|
|
71
|
+
end: !!item.end
|
|
72
|
+
};
|
|
73
|
+
const children = item.children;
|
|
74
|
+
if (!children) return result;
|
|
75
|
+
result.children = mergeParsedChildren(children.map(parseItemChildren));
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
return mergeParsedChildren(items.map(parseItemChildren));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { createEmojisTree, parseEmojiTree };
|