@the-inclusionist/engine 10.0.0 → 11.0.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/README.md +32 -1
- package/app/css/style.css +216 -42
- package/app/public/vendor/fonts-licences/NOTICE.txt +166 -0
- package/app/public/vendor/fonts-licences/OFL-1.1.txt +86 -0
- package/app/public/vendor/fonts.css +11 -1175
- package/dist-pkg/boot/create-game.d.ts +84 -33
- package/dist-pkg/boot/create-game.js +708 -307
- package/dist-pkg/core/a11y-sr.d.ts +1 -1
- package/dist-pkg/core/a11y-sr.js +3 -5
- package/dist-pkg/core/accommodations.d.ts +26 -8
- package/dist-pkg/core/accommodations.js +27 -10
- package/dist-pkg/core/actions.d.ts +39 -10
- package/dist-pkg/core/actions.js +28 -6
- package/dist-pkg/core/contract.d.ts +0 -2
- package/dist-pkg/core/contract.js +0 -2
- package/dist-pkg/core/i18n.d.ts +36 -71
- package/dist-pkg/core/i18n.js +131 -198
- package/dist-pkg/core/session-clock.d.ts +23 -0
- package/dist-pkg/core/session-clock.js +37 -0
- package/dist-pkg/i18n/en.js +44 -49
- package/dist-pkg/i18n/es.js +44 -49
- package/dist-pkg/i18n/pt.js +49 -54
- package/dist-pkg/input/gamepad.d.ts +42 -11
- package/dist-pkg/input/gamepad.js +50 -15
- package/dist-pkg/input/key-default.d.ts +30 -0
- package/dist-pkg/input/key-default.js +60 -0
- package/dist-pkg/input/keyboard-runtime.d.ts +0 -4
- package/dist-pkg/input/keyboard.d.ts +0 -1
- package/dist-pkg/input/keydown.d.ts +5 -11
- package/dist-pkg/input/keydown.js +3 -3
- package/dist-pkg/input/latch-edge.d.ts +10 -2
- package/dist-pkg/input/latch-edge.js +4 -3
- package/dist-pkg/input/latch-scope.d.ts +27 -22
- package/dist-pkg/input/latch-scope.js +25 -37
- package/dist-pkg/input/latch-store.d.ts +9 -12
- package/dist-pkg/input/latch-store.js +13 -18
- package/dist-pkg/input/latch-sync.d.ts +5 -4
- package/dist-pkg/input/latch-sync.js +5 -5
- package/dist-pkg/input/pad-reading.js +7 -2
- package/dist-pkg/input/pad-wizard.d.ts +4 -1
- package/dist-pkg/input/pad-wizard.js +60 -9
- package/dist-pkg/input/switch-scan.d.ts +29 -12
- package/dist-pkg/input/switch-scan.js +15 -2
- package/dist-pkg/input/touch-bindings.d.ts +3 -6
- package/dist-pkg/input/touch.d.ts +17 -2
- package/dist-pkg/input/touch.js +55 -17
- package/dist-pkg/input/transport-in-use.d.ts +5 -5
- package/dist-pkg/input/transport-in-use.js +5 -5
- package/dist-pkg/input/transports.d.ts +0 -9
- package/dist-pkg/input/transports.js +1 -1
- package/dist-pkg/input/virtual-controller.d.ts +39 -3
- package/dist-pkg/input/virtual-controller.js +32 -4
- package/dist-pkg/input/voice-map.d.ts +27 -11
- package/dist-pkg/input/voice-map.js +41 -43
- package/dist-pkg/platform/audio-ambient.d.ts +0 -1
- package/dist-pkg/platform/audio-ambient.js +3 -1
- package/dist-pkg/platform/audio-mixer.js +4 -9
- package/dist-pkg/platform/audio-sonar.d.ts +8 -94
- package/dist-pkg/platform/audio-sonar.js +22 -207
- package/dist-pkg/platform/audio.d.ts +10 -1
- package/dist-pkg/platform/audio.js +35 -2
- package/dist-pkg/platform/choose-by-voice.d.ts +70 -0
- package/dist-pkg/platform/choose-by-voice.js +157 -0
- package/dist-pkg/platform/font-library.d.ts +77 -0
- package/dist-pkg/platform/font-library.js +98 -0
- package/dist-pkg/platform/font-library.json +721 -0
- package/dist-pkg/platform/heavy-catalogue.d.ts +46 -0
- package/dist-pkg/platform/heavy-catalogue.js +47 -14
- package/dist-pkg/platform/heavy-mirror.d.ts +3 -9
- package/dist-pkg/platform/heavy-mirror.js +14 -17
- package/dist-pkg/platform/heavy.d.ts +40 -8
- package/dist-pkg/platform/heavy.js +177 -22
- package/dist-pkg/platform/interruptible-speech.d.ts +15 -8
- package/dist-pkg/platform/interruptible-speech.js +37 -13
- package/dist-pkg/platform/listener-scope.js +22 -13
- package/dist-pkg/platform/locale-host.d.ts +7 -3
- package/dist-pkg/platform/locale-host.js +13 -2
- package/dist-pkg/platform/reading-in-worker.d.ts +24 -0
- package/dist-pkg/platform/reading-in-worker.js +38 -0
- package/dist-pkg/platform/reading-model.d.ts +21 -0
- package/dist-pkg/platform/reading-model.js +25 -0
- package/dist-pkg/platform/reading-runtime.js +13 -8
- package/dist-pkg/platform/reading.d.ts +12 -1
- package/dist-pkg/platform/reading.js +9 -1
- package/dist-pkg/platform/speech-recognition.d.ts +10 -1
- package/dist-pkg/platform/speech-recognition.js +29 -9
- package/dist-pkg/platform/speech.d.ts +10 -1
- package/dist-pkg/platform/speech.js +24 -13
- package/dist-pkg/platform/tts.d.ts +37 -4
- package/dist-pkg/platform/tts.js +279 -57
- package/dist-pkg/platform/voice-listener.d.ts +6 -2
- package/dist-pkg/platform/voice-listener.js +1 -1
- package/dist-pkg/platform/voice-plan.d.ts +13 -0
- package/dist-pkg/platform/voice-plan.js +57 -2
- package/dist-pkg/platform/vosk-runtime.d.ts +25 -0
- package/dist-pkg/platform/vosk-runtime.js +59 -1
- package/dist-pkg/platform/vosk-vocabulary.d.ts +6 -0
- package/dist-pkg/platform/vosk-vocabulary.js +178 -0
- package/dist-pkg/render/crt.d.ts +11 -9
- package/dist-pkg/render/crt.js +6 -10
- package/dist-pkg/render/cvd-matrices.d.ts +5 -1
- package/dist-pkg/render/cvd-matrices.js +5 -1
- package/dist-pkg/render/high-contrast.d.ts +1 -2
- package/dist-pkg/render/high-contrast.js +5 -1
- package/dist-pkg/render/viz-axes.d.ts +9 -0
- package/dist-pkg/render/viz-axes.js +15 -2
- package/dist-pkg/ui/aac-sets.d.ts +29 -24
- package/dist-pkg/ui/aac-sets.js +22 -30
- package/dist-pkg/ui/audio-choices.d.ts +10 -5
- package/dist-pkg/ui/audio-choices.js +14 -10
- package/dist-pkg/ui/camera-control.d.ts +47 -0
- package/dist-pkg/ui/camera-control.js +35 -1
- package/dist-pkg/ui/declared-words.d.ts +21 -0
- package/dist-pkg/ui/declared-words.js +66 -0
- package/dist-pkg/ui/drawing-problems.js +4 -3
- package/dist-pkg/ui/eye-control.js +17 -17
- package/dist-pkg/ui/face-control.js +15 -15
- package/dist-pkg/ui/fonts.d.ts +42 -8
- package/dist-pkg/ui/fonts.js +58 -24
- package/dist-pkg/ui/footer-scroll-driver.d.ts +14 -0
- package/dist-pkg/ui/footer-scroll-driver.js +201 -0
- package/dist-pkg/ui/footer-scroll.d.ts +38 -0
- package/dist-pkg/ui/footer-scroll.js +55 -0
- package/dist-pkg/ui/game-options.d.ts +14 -9
- package/dist-pkg/ui/game-options.js +41 -21
- package/dist-pkg/ui/hand-control.js +15 -15
- package/dist-pkg/ui/help-panel.d.ts +19 -8
- package/dist-pkg/ui/help-panel.js +15 -5
- package/dist-pkg/ui/hud-bands.d.ts +29 -12
- package/dist-pkg/ui/hud-bands.js +63 -25
- package/dist-pkg/ui/hud-row.d.ts +34 -0
- package/dist-pkg/ui/hud-row.js +80 -0
- package/dist-pkg/ui/hud.d.ts +0 -3
- package/dist-pkg/ui/layout.js +5 -2
- package/dist-pkg/ui/libras-avatar-clip.d.ts +30 -0
- package/dist-pkg/ui/libras-avatar-clip.js +86 -0
- package/dist-pkg/ui/libras-avatar-load.d.ts +52 -0
- package/dist-pkg/ui/libras-avatar-load.js +134 -0
- package/dist-pkg/ui/libras-avatar-plan.d.ts +102 -0
- package/dist-pkg/ui/libras-avatar-plan.js +211 -0
- package/dist-pkg/ui/libras-avatar-player.d.ts +28 -0
- package/dist-pkg/ui/libras-avatar-player.js +226 -0
- package/dist-pkg/ui/libras-avatar-stage.d.ts +37 -0
- package/dist-pkg/ui/libras-avatar-stage.js +208 -0
- package/dist-pkg/ui/libras-glosses.d.ts +28 -0
- package/dist-pkg/ui/libras-glosses.js +161 -0
- package/dist-pkg/ui/menu-intent.d.ts +29 -0
- package/dist-pkg/ui/menu-intent.js +35 -1
- package/dist-pkg/ui/menu-items.d.ts +10 -0
- package/dist-pkg/ui/menu-items.js +29 -0
- package/dist-pkg/ui/menu-nav.d.ts +40 -4
- package/dist-pkg/ui/menu-nav.js +132 -47
- package/dist-pkg/ui/panel-widgets.d.ts +34 -0
- package/dist-pkg/ui/panel-widgets.js +86 -0
- package/dist-pkg/ui/pause-icons.d.ts +30 -14
- package/dist-pkg/ui/pause-icons.js +106 -45
- package/dist-pkg/ui/scan-overlay.d.ts +3 -3
- package/dist-pkg/ui/scan-overlay.js +11 -3
- package/dist-pkg/ui/screen-text.d.ts +25 -0
- package/dist-pkg/ui/screen-text.js +152 -0
- package/dist-pkg/ui/session-clock.d.ts +32 -0
- package/dist-pkg/ui/session-clock.js +67 -0
- package/dist-pkg/ui/settings-aac.d.ts +3 -1
- package/dist-pkg/ui/settings-aac.js +32 -13
- package/dist-pkg/ui/settings-audio.d.ts +10 -5
- package/dist-pkg/ui/settings-audio.js +101 -35
- package/dist-pkg/ui/settings-controls.d.ts +0 -4
- package/dist-pkg/ui/settings-mobility.d.ts +3 -6
- package/dist-pkg/ui/settings-mobility.js +4 -46
- package/dist-pkg/ui/settings-motion.js +2 -2
- package/dist-pkg/ui/settings-panel.d.ts +10 -0
- package/dist-pkg/ui/settings-panel.js +25 -1
- package/dist-pkg/ui/settings-typo.d.ts +5 -6
- package/dist-pkg/ui/settings-typo.js +20 -11
- package/dist-pkg/ui/settings-visual.js +2 -2
- package/dist-pkg/ui/shell.d.ts +1 -3
- package/dist-pkg/ui/shell.js +8 -4
- package/dist-pkg/ui/title.d.ts +2 -11
- package/dist-pkg/ui/title.js +39 -6
- package/dist-pkg/ui/top-band.d.ts +5 -3
- package/dist-pkg/ui/top-band.js +21 -25
- package/dist-pkg/ui/typo-choices.d.ts +3 -3
- package/dist-pkg/ui/typo-choices.js +9 -8
- package/dist-pkg/ui/vlibras.d.ts +71 -27
- package/dist-pkg/ui/vlibras.js +116 -44
- package/dist-pkg/ui/voice-control.d.ts +23 -1
- package/dist-pkg/ui/voice-control.js +149 -16
- package/dist-pkg/ui/voice-settings.d.ts +2 -3
- package/dist-pkg/ui/voice-settings.js +53 -3
- package/dist-pkg/ui/where-the-child-is.js +2 -2
- package/docs/CREDITS.md +122 -10
- package/docs/LICENSES.md +36 -7
- package/package.json +34 -9
- package/scripts/check-cartridge.mjs +78 -0
- package/scripts/game-build.d.mts +25 -0
- package/scripts/game-build.mjs +144 -0
- package/scripts/heavy-into-the-delivery.mjs +284 -40
- package/scripts/libras-avatar.json +680 -0
- package/scripts/libras-avatar.mjs +246 -0
- package/scripts/libras-glosses/gloss.py +95 -0
- package/scripts/libras-glosses/pyproject.toml +32 -0
- package/scripts/libras-glosses/uv.lock +781 -0
- package/scripts/libras-glosses.mjs +351 -0
- package/scripts/licences/OFL-1.1.txt +86 -0
- package/scripts/licences/UFL-1.0.txt +96 -0
- package/scripts/licences/fonts.mjs +389 -0
- package/scripts/licences/third-party.mjs +35 -21
- package/app/public/vendor/fonts/bitter-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/bitter-var.woff2 +0 -0
- package/app/public/vendor/fonts/bodonimoda-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/bodonimoda-var.woff2 +0 -0
- package/app/public/vendor/fonts/cat-abril_fatface-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-abril_fatface-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-adlam_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-adlam_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-agu_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-agu_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-alfa_slab_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-alfa_slab_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-are_you_serious-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-are_you_serious-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-asimovian-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-asimovian-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-atkinson_hyperlegible_next-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bakbak_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bakbak_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bangers-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bangers-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-barriecito-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-barriecito-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-berkshire_swash-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-berkshire_swash-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bevan-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bevan-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bitcount-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bitcount-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bowlby_one_sc-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bowlby_one_sc-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bungee_shade-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-bungee_shade-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-charm-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cherry_bomb_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cherry_bomb_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chokokutai-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chokokutai-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chonburi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-chonburi-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-climate_crisis-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-climate_crisis-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-cookie-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-dela_gothic_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-dela_gothic_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-fascinate_inline-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-fascinate_inline-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ga_maamli-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ga_maamli-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-itim-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-itim-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-jacquard_24-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-jacquard_24-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kablammo-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kablammo-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-kalam-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-katibeh-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-katibeh-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lemonada-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lemonada-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lilita_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lilita_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lobster-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-lobster-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-luckiest_guy-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-luckiest_guy-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-marhey-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-marhey-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-modak-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-modak-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-momo_signature-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-momo_signature-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monofett-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monofett-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monomakh-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monomakh-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monoton-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-monoton-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-nerko_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-nerko_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_adlam-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_adlam-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_arabic-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_arabic-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_devanagari-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_devanagari-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_hebrew-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_hebrew-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_jp-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_jp-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_khmer-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_khmer-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_kr-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_kr-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_sc-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_sc-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_thai-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-noto_sans_thai-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ole-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ole-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pacifico-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pacifico-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-patrick_hand-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-patrick_hand-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-petit_formal_script-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-petit_formal_script-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pixelify_sans-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-pixelify_sans-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-plaster-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-plaster-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ar_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_at-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_at_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_nsw-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_nsw_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_qld-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_qld_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_sa-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_sa_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_tas-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_tas_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_vic-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_au_vic_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_vlg-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_vlg_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_wal-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_be_wal_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_br_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ca_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_co_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cu_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_cz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_grund-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_grund_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_la-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_la_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_sas-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_sas_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_va-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_de_va_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_loopet-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_loopet_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_uloopet-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_dk_uloopet_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_es_deco_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_es_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_moderne-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_moderne_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_trad-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_fr_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_gb_j_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_gb_s_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_lijeva-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hr_lijeva_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hu-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_hu_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_id-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_id_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ie-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ie_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_in-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_in_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_is-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_is_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_moderna-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_moderna_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_trad-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_it_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_mx_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ng_modern-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ng_modern_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nl-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_no-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_no_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_basic-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_basic_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_nz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pe_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pl-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pl_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_pt_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ro-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_ro_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_sk-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_sk_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_tz-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_tz_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_us_modern_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_us_trad_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_vn-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_vn_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_za-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-playwrite_za_guides-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-potta_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-potta_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranchers-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranchers-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ranga-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-risque-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-risque-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-rowdies-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruge_boogie-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruge_boogie-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruslan_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-ruslan_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sacramento-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sacramento-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sancreek-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sancreek-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sankofa_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sankofa_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sedgwick_ave_display-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sedgwick_ave_display-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-shantell_sans-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-shantell_sans-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-smokum-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-smokum-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-solitreo-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-solitreo-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-spicy_rice-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-spicy_rice-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sriracha-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-sriracha-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-srisakdi-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-stix_two_math-400-0.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-tillana-700.woff2 +0 -0
- package/app/public/vendor/fonts/cat-titan_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-titan_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yatra_one-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yatra_one-400.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yomogi-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/cat-yomogi-400.woff2 +0 -0
- package/app/public/vendor/fonts/dmserifdisplay-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/dmserifdisplay-400.woff2 +0 -0
- package/app/public/vendor/fonts/domine-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/domine-var.woff2 +0 -0
- package/app/public/vendor/fonts/fondamento-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fondamento-400.woff2 +0 -0
- package/app/public/vendor/fonts/fraunces-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fraunces-var.woff2 +0 -0
- package/app/public/vendor/fonts/fredoka-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/fredoka-var.woff2 +0 -0
- package/app/public/vendor/fonts/inter-400.woff2 +0 -0
- package/app/public/vendor/fonts/inter-700.woff2 +0 -0
- package/app/public/vendor/fonts/jakarta-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/jakarta-var.woff2 +0 -0
- package/app/public/vendor/fonts/lato-400.woff2 +0 -0
- package/app/public/vendor/fonts/lato-700.woff2 +0 -0
- package/app/public/vendor/fonts/literata-400.woff2 +0 -0
- package/app/public/vendor/fonts/literata-700.woff2 +0 -0
- package/app/public/vendor/fonts/lora-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/lora-var.woff2 +0 -0
- package/app/public/vendor/fonts/merriweather-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/merriweather-var.woff2 +0 -0
- package/app/public/vendor/fonts/newsreader-400.woff2 +0 -0
- package/app/public/vendor/fonts/newsreader-700.woff2 +0 -0
- package/app/public/vendor/fonts/notosans-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/notosans-var.woff2 +0 -0
- package/app/public/vendor/fonts/nunito-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/nunito-var.woff2 +0 -0
- package/app/public/vendor/fonts/opendyslexic-400.woff2 +0 -0
- package/app/public/vendor/fonts/opensans-400.woff2 +0 -0
- package/app/public/vendor/fonts/opensans-700.woff2 +0 -0
- package/app/public/vendor/fonts/pinyon-400.woff2 +0 -0
- package/app/public/vendor/fonts/playfair-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/playfair-var.woff2 +0 -0
- package/app/public/vendor/fonts/pressstart-400.woff2 +0 -0
- package/app/public/vendor/fonts/quattro-400.woff2 +0 -0
- package/app/public/vendor/fonts/quattro-700.woff2 +0 -0
- package/app/public/vendor/fonts/quicksand-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/quicksand-var.woff2 +0 -0
- package/app/public/vendor/fonts/robotoflex-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/robotoflex-var.woff2 +0 -0
- package/app/public/vendor/fonts/sora-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/sora-var.woff2 +0 -0
- package/app/public/vendor/fonts/sourcesans-400.woff2 +0 -0
- package/app/public/vendor/fonts/sourcesans-700.woff2 +0 -0
- package/app/public/vendor/fonts/sourceserif-400.woff2 +0 -0
- package/app/public/vendor/fonts/sourceserif-700.woff2 +0 -0
- package/app/public/vendor/fonts/spacegrotesk-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spacegrotesk-var.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-400.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/spectral-700.woff2 +0 -0
- package/app/public/vendor/fonts/teachers-var-ext.woff2 +0 -0
- package/app/public/vendor/fonts/teachers-var.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-400-ext.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-400.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-700-ext.woff2 +0 -0
- package/app/public/vendor/fonts/ubuntu-700.woff2 +0 -0
- package/app/public/vendor/fonts/ufmag-400.woff2 +0 -0
- package/dist-pkg/platform/guide-intensity.d.ts +0 -39
- package/dist-pkg/platform/guide-intensity.js +0 -71
- package/dist-pkg/ui/latch-refusal.d.ts +0 -33
- package/dist-pkg/ui/latch-refusal.js +0 -60
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
//
|
|
3
|
+
// THE BUILD-TIME GLOSSES (ADR-0234, plan item 5b): run by `inclusionist-heavy --libras`, before the avatar is written.
|
|
4
|
+
// The player signs a GLOSS, and the text a child is shown is Portuguese; translating it needs spaCy's Portuguese parser, which
|
|
5
|
+
// does not run in a browser. It does not have to: that text is AUTHORED, so it is glossed here, once, on the build machine, and
|
|
6
|
+
// written beside the avatar as `glosses.json` (`ui/libras-glosses` reads it).
|
|
7
|
+
//
|
|
8
|
+
// WHICH TEXTS, and why these:
|
|
9
|
+
// · THE ENGINE'S OWN PORTUGUESE DICTIONARY, all of it (`dist-pkg/i18n/pt.js`). The sonar reads what is on the screen — a
|
|
10
|
+
// panel, the pause card, a notice, the navigation sentence of a world it cannot read — and which key lands where is decided
|
|
11
|
+
// by the code that renders it, not by the key's name. A filter by prefix would drop a string the day a panel starts showing
|
|
12
|
+
// it, silently; glossing all of it costs build time only.
|
|
13
|
+
// · THE GAME'S OWN DICTIONARY, when the game's delivery names it: `--libras-texts <file>`, repeatable — a JSON object of
|
|
14
|
+
// `key: "pt string"` (what the game hands `registerDict('pt', …)`), a JSON array of strings, or an ES module whose default
|
|
15
|
+
// export is either. A game's text that lives in no dictionary (written straight into its page) is not glossed: the
|
|
16
|
+
// interpreter hands it over by the fallback rule.
|
|
17
|
+
// · NOT en or es: the translator reads Brazilian Portuguese only, and Libras is Brazil's.
|
|
18
|
+
// A string with `{param}` holes is glossed with each hole in place (`JOGADOR {n} ENTRAR [EXCLAMAÇÃO]`): the translator reads a
|
|
19
|
+
// placeholder word where each hole is, and the word is put back as the hole. The VALUE is known only at run time, and there the
|
|
20
|
+
// interpreter looks it up in turn, or fingerspells it (`ui/libras-glosses`). A string that is only holes is not glossed.
|
|
21
|
+
//
|
|
22
|
+
// 🔴 THE RULE-BASED MODE ONLY: `gloss.py` calls `translate(text, neural=False)`. The neural mode fetches LAViD's model, which
|
|
23
|
+
// declares no licence.
|
|
24
|
+
//
|
|
25
|
+
// 🔴 A DELIVERY BUILT WITH `--libras` IS NEVER WRITTEN WITHOUT ITS GLOSSES. No environment, no model, a translator of another
|
|
26
|
+
// version: each THROWS here, saying what is missing and the one command that sets it up, and the delivery stops. The glosser
|
|
27
|
+
// runs in an environment OUTSIDE the repository (`INCLUSIONIST_LIBRAS_ENV`, else `~/.cache/the-inclusionist/libras-glosses`),
|
|
28
|
+
// built from `libras-glosses/uv.lock` by `inclusionist-heavy --libras-setup` — which needs `uv` and Python 3.12 on this machine,
|
|
29
|
+
// and never downloads a Python.
|
|
30
|
+
//
|
|
31
|
+
// WHICH TOKENS HAVE A SIGN is the avatar's answer: a token the delivery carries a clip for (`scripts/libras-avatar.json`, the
|
|
32
|
+
// names the free player signs) stays a sign; any other is fingerspelled. The clips themselves are delivered by
|
|
33
|
+
// `scripts/libras-avatar.mjs`, in the same `--libras` step.
|
|
34
|
+
//
|
|
35
|
+
// 🔴 A WORD WITH NO SIGN IS SPELLED AS IT IS WRITTEN (ADR-0234 erratum; the Dev: «Soletra-se a palavra escrita»). The translator
|
|
36
|
+
// returns LEMMAS, and a token the delivery carries no sign for is fingerspelled — so «entrou» would be spelled E-N-T-R-A-R. So
|
|
37
|
+
// `gloss.py` also reports each text's words as written, with the forms the translator can make of each; every gloss token is
|
|
38
|
+
// aligned back to the word that produced it (`writtenWords`), and a token with no sign carried is replaced by THAT word, in
|
|
39
|
+
// capitals, its accents stripped as the player's letters require and its Ç kept, a letter of its own (`spelledWord`, the
|
|
40
|
+
// run-time fallback's own rule). The child sees spelled what she reads. Measured on the engine's dictionary, and printed by
|
|
41
|
+
// every delivery: see `spellable`.
|
|
42
|
+
|
|
43
|
+
import { spawnSync } from 'node:child_process';
|
|
44
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
45
|
+
import { homedir } from 'node:os';
|
|
46
|
+
import { dirname, join } from 'node:path';
|
|
47
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
48
|
+
import { readAvatarPins } from './libras-avatar.mjs';
|
|
49
|
+
|
|
50
|
+
/** The uv project that pins the glosser's environment (`pyproject.toml`, `uv.lock`, `gloss.py`). */
|
|
51
|
+
export const GLOSSER_PROJECT = fileURLToPath(new URL('./libras-glosses/', import.meta.url));
|
|
52
|
+
|
|
53
|
+
/** What the glosses are made with, checked against what the environment reports: another version is refused, not trusted. */
|
|
54
|
+
export const PINNED = Object.freeze({ translator: '1.3.3', model: 'pt_core_news_md', modelVersion: '3.8.0', mode: 'rules' });
|
|
55
|
+
|
|
56
|
+
/** The one command that builds the environment, as a game's delivery and this repository each run it. */
|
|
57
|
+
export const SETUP_COMMAND = '`npx inclusionist-heavy --libras-setup` (in this repository: `npm run libras:setup`)';
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
/** Where the glosser's environment lives: never inside the repository or `node_modules`. */
|
|
61
|
+
export function glosserEnvironment(env = process.env, home = homedir()) {
|
|
62
|
+
return env.INCLUSIONIST_LIBRAS_ENV || join(home, '.cache', 'the-inclusionist', 'libras-glosses');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The environment's interpreter. */
|
|
66
|
+
export function glosserPython(envDir, platform = process.platform) {
|
|
67
|
+
return platform === 'win32' ? join(envDir, 'Scripts', 'python.exe') : join(envDir, 'bin', 'python');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Builds the environment from the lock, or THROWS saying why. `uv sync --locked` refuses a lock that drifted from the project,
|
|
72
|
+
* and `--no-python-downloads` makes a missing Python 3.12 an error instead of a silent download.
|
|
73
|
+
*/
|
|
74
|
+
export function setUpGlosser({ envDir = glosserEnvironment(), run = spawnSync, project = GLOSSER_PROJECT, env = process.env } = {}) {
|
|
75
|
+
const done = run('uv', ['sync', '--locked', '--no-python-downloads', '--project', project], {
|
|
76
|
+
stdio: 'inherit', env: { ...env, UV_PROJECT_ENVIRONMENT: envDir },
|
|
77
|
+
});
|
|
78
|
+
if (done.error?.code === 'ENOENT') {
|
|
79
|
+
throw new Error('the Libras glosser needs `uv`, and it is not installed on this machine: install it '
|
|
80
|
+
+ '(https://docs.astral.sh/uv/getting-started/installation/) and run the setup again');
|
|
81
|
+
}
|
|
82
|
+
if (done.error || done.status !== 0) {
|
|
83
|
+
throw new Error(`uv could not build the Libras glosser's environment at ${envDir} (exit ${done.status ?? done.error?.message}): `
|
|
84
|
+
+ 'it needs Python 3.12 installed on this machine — uv is told never to download one — and the network once, for what '
|
|
85
|
+
+ 'libras-glosses/uv.lock pins');
|
|
86
|
+
}
|
|
87
|
+
return envDir;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* The translator, run once over `inputs` in the environment: returns `{ glosses, made }`, one gloss per input — or THROWS,
|
|
92
|
+
* saying what is missing and how to set it up.
|
|
93
|
+
*/
|
|
94
|
+
export function runGlosser(inputs, { envDir = glosserEnvironment(), run = spawnSync, exists = existsSync,
|
|
95
|
+
script = join(GLOSSER_PROJECT, 'gloss.py'), pinned = PINNED, env = process.env } = {}) {
|
|
96
|
+
const python = glosserPython(envDir);
|
|
97
|
+
if (!exists(python)) {
|
|
98
|
+
throw new Error(`the Libras glosser's environment is missing (no ${python}): run ${SETUP_COMMAND} once — it needs uv and `
|
|
99
|
+
+ 'Python 3.12 — or point INCLUSIONIST_LIBRAS_ENV at one that exists');
|
|
100
|
+
}
|
|
101
|
+
const done = run(python, [script], {
|
|
102
|
+
input: JSON.stringify({ texts: inputs }), encoding: 'utf8', maxBuffer: 256 * 1024 * 1024,
|
|
103
|
+
env: { ...env, PYTHONIOENCODING: 'utf-8', PYTHONUTF8: '1' },
|
|
104
|
+
});
|
|
105
|
+
const said = String(done.stderr ?? '').trim().split(/\r?\n/).slice(-3).join(' · ');
|
|
106
|
+
if (done.error) throw new Error(`the Libras glosser could not be started (${python}): ${done.error.message}`);
|
|
107
|
+
if (done.status === 3) {
|
|
108
|
+
throw new Error(`spaCy's Portuguese model ${pinned.model} is missing from the Libras glosser's environment: run `
|
|
109
|
+
+ `${SETUP_COMMAND} again (${said})`);
|
|
110
|
+
}
|
|
111
|
+
if (done.status === 4) {
|
|
112
|
+
throw new Error(`the translator is missing from the Libras glosser's environment: run ${SETUP_COMMAND} again (${said})`);
|
|
113
|
+
}
|
|
114
|
+
if (done.status !== 0) throw new Error(`the Libras glosser failed (exit ${done.status}): ${said}`);
|
|
115
|
+
let out;
|
|
116
|
+
try { out = JSON.parse(done.stdout); } catch { throw new Error('the Libras glosser answered something that is not JSON'); }
|
|
117
|
+
const got = `vlibras-translator ${out.translator} (${out.mode}) · ${out.model} ${out.modelVersion}`;
|
|
118
|
+
if (out.translator !== pinned.translator || out.model !== pinned.model || out.modelVersion !== pinned.modelVersion
|
|
119
|
+
|| out.mode !== pinned.mode) {
|
|
120
|
+
throw new Error(`REFUSED: the Libras glosser's environment has ${got}, and the glosses are made with vlibras-translator `
|
|
121
|
+
+ `${pinned.translator} (${pinned.mode}) · ${pinned.model} ${pinned.modelVersion} — run ${SETUP_COMMAND} again`);
|
|
122
|
+
}
|
|
123
|
+
if (!Array.isArray(out.glosses) || out.glosses.length !== inputs.length || out.glosses.some((g) => typeof g !== 'string')) {
|
|
124
|
+
throw new Error(`the Libras glosser answered ${out.glosses?.length} glosses for ${inputs.length} texts`);
|
|
125
|
+
}
|
|
126
|
+
// without the words as written, a token with no sign would be spelled as its lemma — refused, not spelled wrong
|
|
127
|
+
if (!Array.isArray(out.words) || out.words.length !== inputs.length || !out.words.every(isWordList)) {
|
|
128
|
+
throw new Error(`the Libras glosser answered the written words of ${out.words?.length ?? 'no'} texts for ${inputs.length}: `
|
|
129
|
+
+ `run ${SETUP_COMMAND} again, or update the package`);
|
|
130
|
+
}
|
|
131
|
+
return { glosses: out.glosses, words: out.words, made: `${got} · spaCy ${out.spacy}` };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** `[[as written, [forms…]], …]`, as `gloss.py` writes the words of one text. */
|
|
135
|
+
function isWordList(words) {
|
|
136
|
+
return Array.isArray(words) && words.every((w) => Array.isArray(w) && typeof w[0] === 'string' && Array.isArray(w[1])
|
|
137
|
+
&& w[1].every((f) => typeof f === 'string'));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** A hole of a template, as the engine's dictionaries write it (`core/i18n`). */
|
|
141
|
+
const HOLE = /\{([^{}\s]+)\}/gu;
|
|
142
|
+
const HAS_LETTER = /\p{L}/u;
|
|
143
|
+
|
|
144
|
+
/** The texts of one or more dictionaries (`key: string` objects or arrays), each once, with a letter outside its holes. */
|
|
145
|
+
export function textsToGloss(dictionaries) {
|
|
146
|
+
const texts = new Set();
|
|
147
|
+
for (const dict of dictionaries) {
|
|
148
|
+
for (const text of Array.isArray(dict) ? dict : Object.values(dict ?? {})) {
|
|
149
|
+
if (typeof text !== 'string') continue;
|
|
150
|
+
const trimmed = text.trim();
|
|
151
|
+
if (trimmed && HAS_LETTER.test(trimmed.replace(HOLE, ''))) texts.add(trimmed);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return [...texts].sort();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** The placeholder word read where hole `i` is: letters only (a digit is read as a number), and no plural `S` at the end. */
|
|
158
|
+
export function placeholderWord(i) {
|
|
159
|
+
let letters = '';
|
|
160
|
+
for (let n = i; ; n = Math.floor(n / 26) - 1) { letters = String.fromCharCode(65 + (n % 26)) + letters; if (n < 26) break; }
|
|
161
|
+
return `ZPARAM${letters}Z`;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** The text with each hole replaced by its placeholder word, and the holes' names in order. */
|
|
165
|
+
function withPlaceholders(text) {
|
|
166
|
+
const names = [];
|
|
167
|
+
const input = text.replace(HOLE, (_, name) => placeholderWord(names.push(name) - 1));
|
|
168
|
+
return { input, names };
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** The gloss with each placeholder word put back as its hole — or `null` when the translator lost or doubled one. */
|
|
172
|
+
function withHoles(gloss, names) {
|
|
173
|
+
let out = gloss;
|
|
174
|
+
for (const [i, name] of names.entries()) {
|
|
175
|
+
const word = placeholderWord(i);
|
|
176
|
+
if (out.split(word).length !== 2) return null;
|
|
177
|
+
out = out.replace(word, () => `{${name}}`);
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** The punctuation marks the translator writes for the player (`[PONTO]`), and a hole — neither is a sign to fetch. */
|
|
183
|
+
const NOT_A_SIGN = /^\[.*\]$|^\{.*\}$/u;
|
|
184
|
+
|
|
185
|
+
const tokensOf = (gloss) => gloss.split(/\s+/u).filter(Boolean);
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* THE WORD AS WRITTEN behind each token of a gloss (ADR-0234, erratum «A WORD WITH NO SIGN IS SPELLED AS IT IS WRITTEN»): one
|
|
189
|
+
* entry per token, `[word, how]`. `words` are the text's words as `gloss.py` reports them, each with the forms the translator's
|
|
190
|
+
* rules can make of it; a token is matched to the words whose forms include it.
|
|
191
|
+
* · `one` — the words that match all write it the same way: that word.
|
|
192
|
+
* · `order` — AMBIGUOUS, more than one written form matches (a lemma two words share): the translator's rule-based mode keeps
|
|
193
|
+
* the sentence's order, so the first unused matching word AFTER the last one taken is chosen, else the first
|
|
194
|
+
* unused, else the first.
|
|
195
|
+
* · `stem` — no form matches, but an unused word shares all of the token but its last two letters (📏 the translator's
|
|
196
|
+
* rules re-end a word the lemmatizer does not: «mancha» → MANCHO, «névoa» → NÉVOAR, «película» → PELÍCULO): the
|
|
197
|
+
* word sharing the longest start, the first in the sentence on a tie.
|
|
198
|
+
* · `none` — no word of the text gives this token (the translator made it: a compound, a synonym, a number it read as an
|
|
199
|
+
* hour): `word` is `null`, and the token is spelled as the translator wrote it — nothing better is known.
|
|
200
|
+
* The punctuation marks and the holes are `[null, 'mark']`.
|
|
201
|
+
*/
|
|
202
|
+
export function writtenWords(gloss, words = []) {
|
|
203
|
+
const used = new Set();
|
|
204
|
+
let last = -1;
|
|
205
|
+
const take = (j, how) => { used.add(j); last = j; return [words[j][0], how]; };
|
|
206
|
+
return tokensOf(gloss).map((token) => {
|
|
207
|
+
if (NOT_A_SIGN.test(token)) return [null, 'mark'];
|
|
208
|
+
const key = token.normalize('NFC').toUpperCase();
|
|
209
|
+
const hits = [];
|
|
210
|
+
for (const [j, [word, forms]] of words.entries()) {
|
|
211
|
+
if (word.normalize('NFC').toUpperCase() === key || forms.some((f) => f.normalize('NFC') === key)) hits.push(j);
|
|
212
|
+
}
|
|
213
|
+
if (!hits.length) {
|
|
214
|
+
const stem = stemMatch(key, words, used);
|
|
215
|
+
return stem === null ? [null, 'none'] : take(stem, 'stem');
|
|
216
|
+
}
|
|
217
|
+
const spellings = new Set(hits.map((j) => words[j][0].normalize('NFC').toLocaleLowerCase('pt-BR')));
|
|
218
|
+
const j = hits.find((h) => h > last && !used.has(h)) ?? hits.find((h) => !used.has(h)) ?? hits[0];
|
|
219
|
+
return take(j, spellings.size > 1 ? 'order' : 'one');
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* The unused word whose start is the longest shared with `key`, at least all of `key` but two letters and three — or `null`.
|
|
225
|
+
* Only for a token with a letter: a number the translator split out («640» of «640×360») is spelled as it is.
|
|
226
|
+
*/
|
|
227
|
+
function stemMatch(key, words, used) {
|
|
228
|
+
if (!/\p{L}/u.test(key)) return null;
|
|
229
|
+
const floor = Math.max(3, [...key].length - 2);
|
|
230
|
+
let best = null;
|
|
231
|
+
let bestLength = floor - 1;
|
|
232
|
+
for (const [j, [word]] of words.entries()) {
|
|
233
|
+
if (used.has(j)) continue;
|
|
234
|
+
const a = [...key];
|
|
235
|
+
const b = [...word.normalize('NFC').toUpperCase()];
|
|
236
|
+
let n = 0;
|
|
237
|
+
while (n < a.length && n < b.length && a[n] === b[n]) n += 1;
|
|
238
|
+
if (n > bestLength) { best = j; bestLength = n; }
|
|
239
|
+
}
|
|
240
|
+
return best;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Glosses `texts` with `translate(inputs) → { glosses, words, made }` (sync or async): returns
|
|
245
|
+
* `{ format: 1, made, glosses: [[text, gloss], …], written: [[[word, how], …], …] }` — `written` holds, per text and per gloss
|
|
246
|
+
* token, the word as written (`writtenWords`), and `spellable` turns the two into the file `ui/libras-glosses` reads. A
|
|
247
|
+
* template whose placeholder the translator dropped is glossed again in pieces — the fixed text between its holes — and the
|
|
248
|
+
* holes put between them. A placeholder word is written as itself, so it aligns to itself, and becoming a hole keeps the tokens
|
|
249
|
+
* where they were.
|
|
250
|
+
*/
|
|
251
|
+
export async function glossTexts(texts, translate) {
|
|
252
|
+
const prepared = texts.map(withPlaceholders);
|
|
253
|
+
const first = await translate(prepared.map((p) => p.input));
|
|
254
|
+
const glosses = prepared.map((p, i) => withHoles(first.glosses[i], p.names));
|
|
255
|
+
const written = prepared.map((_, i) => writtenWords(first.glosses[i], first.words?.[i]));
|
|
256
|
+
|
|
257
|
+
const redo = texts.map((text, i) => (glosses[i] === null ? text.split(HOLE) : null));
|
|
258
|
+
const pieces = redo.flatMap((parts) => (parts ? parts.filter((_, i) => i % 2 === 0) : []));
|
|
259
|
+
if (pieces.length) {
|
|
260
|
+
const second = await translate(pieces.map((p) => (HAS_LETTER.test(p) ? p : '')));
|
|
261
|
+
let next = 0;
|
|
262
|
+
for (const [i, parts] of redo.entries()) {
|
|
263
|
+
if (!parts) continue;
|
|
264
|
+
const glossed = parts.map((part, j) => {
|
|
265
|
+
if (j % 2) return { gloss: `{${part}}`, written: [[null, 'mark']] };
|
|
266
|
+
const n = next++;
|
|
267
|
+
return { gloss: second.glosses[n], written: writtenWords(second.glosses[n], second.words?.[n]) };
|
|
268
|
+
});
|
|
269
|
+
glosses[i] = glossed.map((g) => g.gloss).join(' ').replace(/\s+/gu, ' ').trim();
|
|
270
|
+
written[i] = glossed.flatMap((g) => g.written);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return { format: 1, made: first.made, glosses: texts.map((text, i) => [text, glosses[i]]), written };
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** The distinct tokens the glosses ask the player to sign, sorted. */
|
|
277
|
+
export function glossTokens(file) {
|
|
278
|
+
const tokens = new Set();
|
|
279
|
+
for (const [, gloss] of file.glosses) {
|
|
280
|
+
for (const token of gloss.split(/\s+/u)) if (token && !NOT_A_SIGN.test(token)) tokens.add(token);
|
|
281
|
+
}
|
|
282
|
+
return [...tokens].sort();
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* A word as the player fingerspells it — the run-time fallback's rule (`ui/libras-glosses` `provisionalGloss`), so a word is
|
|
287
|
+
* spelled the same whether the build or the run time spelled it: capitals, and every mark stripped but Ç's. The avatar has no
|
|
288
|
+
* clip for an accented vowel (its alphabet is A–Z and Ç, `scripts/libras-avatar.json`), so it is spelled as its base letter
|
|
289
|
+
* (Ã → A, É → E); Ç is a letter of the Libras manual alphabet, with its own handshape and movement, and the avatar carries its
|
|
290
|
+
* clip, so it stays Ç: the marks are stripped from each run with no Ç in it. Anything that is not a letter or a digit separates.
|
|
291
|
+
*/
|
|
292
|
+
export function spelledWord(word) {
|
|
293
|
+
return word.normalize('NFC').replace(/[^Çç]+/gu, (run) => run.normalize('NFD').replace(/\p{M}+/gu, '')).toUpperCase()
|
|
294
|
+
.split(/[^\p{L}\p{N}]+/u).filter(Boolean).join(' ');
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* The glosses as the player can sign them from THIS delivery, and how their spelled tokens were found: a carried sign, a
|
|
299
|
+
* punctuation mark and a hole stay as they are; any other token is FINGERSPELLED, and what is spelled is the word as WRITTEN on
|
|
300
|
+
* the screen (`written`, from `glossTexts`) — «entrou», not the translator's lemma «ENTRAR» (the Dev: «Soletra-se a palavra
|
|
301
|
+
* escrita») — or the token itself where no written word gave it. Returns the file `ui/libras-glosses` reads (`[text, gloss]`
|
|
302
|
+
* pairs, nothing else) and `spelled`: `{ tokens, asWritten, ambiguous, byStem, asTranslated }` over the spelled tokens (`ambiguous`
|
|
303
|
+
* and `byStem` are among `asWritten`; see `writtenWords`).
|
|
304
|
+
*/
|
|
305
|
+
export function spellable(file, carried) {
|
|
306
|
+
const spelled = { tokens: 0, asWritten: 0, ambiguous: 0, byStem: 0, asTranslated: 0 };
|
|
307
|
+
const glosses = file.glosses.map(([text, gloss], i) => {
|
|
308
|
+
const tokens = tokensOf(gloss);
|
|
309
|
+
const written = file.written?.[i]?.length === tokens.length ? file.written[i] : [];
|
|
310
|
+
return [text, tokens.map((token, k) => {
|
|
311
|
+
if (NOT_A_SIGN.test(token) || carried.has(token)) return token;
|
|
312
|
+
const [word, how] = written[k] ?? [null, 'none'];
|
|
313
|
+
spelled.tokens += 1;
|
|
314
|
+
if (word === null) { spelled.asTranslated += 1; return spelledWord(token); }
|
|
315
|
+
spelled.asWritten += 1;
|
|
316
|
+
if (how === 'order') spelled.ambiguous += 1;
|
|
317
|
+
if (how === 'stem') spelled.byStem += 1;
|
|
318
|
+
return spelledWord(word);
|
|
319
|
+
}).filter(Boolean).join(' ')];
|
|
320
|
+
});
|
|
321
|
+
return { file: { format: file.format, made: file.made, glosses }, spelled };
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/** Reads one `--libras-texts` file: JSON (object or array), or an ES module whose default export is one. */
|
|
325
|
+
export async function readTexts(path) {
|
|
326
|
+
if (/\.(m?js)$/i.test(path)) return (await import(pathToFileURL(path).href)).default;
|
|
327
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* THE GLOSSES `--libras` WRITES: glosses the dictionaries and writes `glosses.json` into `folder` (the avatar's), every token
|
|
332
|
+
* the avatar carries no clip for (`carried`: by default the clip names `scripts/libras-avatar.json` pins, which is what the
|
|
333
|
+
* delivery ships) spelled as written (`spellable`). Returns what the build prints: the tokens signed and the tokens
|
|
334
|
+
* fingerspelled (each sorted), and `spelled` — how the spelled tokens were found. THROWS — and writes nothing — when the glosses
|
|
335
|
+
* cannot be made.
|
|
336
|
+
*/
|
|
337
|
+
export async function deliverLibrasGlosses({ destino, folder, glossesFile, dictionaries, translate,
|
|
338
|
+
carried = Object.keys(readAvatarPins().clips) }) {
|
|
339
|
+
const texts = textsToGloss(dictionaries);
|
|
340
|
+
if (!texts.length) throw new Error('there is no text to gloss: the engine\'s Portuguese dictionary was not found');
|
|
341
|
+
const signs = new Set(carried);
|
|
342
|
+
if (!signs.size) throw new Error('the avatar carries no clip: every word would be fingerspelled, and there are no letters to spell with');
|
|
343
|
+
const file = await glossTexts(texts, translate);
|
|
344
|
+
const tokens = glossTokens(file);
|
|
345
|
+
const path = `${folder}${glossesFile}`;
|
|
346
|
+
mkdirSync(dirname(join(destino, path)), { recursive: true });
|
|
347
|
+
const { file: playable, spelled } = spellable(file, signs);
|
|
348
|
+
writeFileSync(join(destino, path), `${JSON.stringify(playable, null, 1)}\n`);
|
|
349
|
+
return { path, texts: texts.length, tokens: tokens.length, signed: tokens.filter((t) => signs.has(t)),
|
|
350
|
+
fingerspelled: tokens.filter((t) => !signs.has(t)), spelled };
|
|
351
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
-----------------------------------------------------------
|
|
2
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
3
|
+
-----------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
PREAMBLE
|
|
6
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
7
|
+
development of collaborative font projects, to support the font creation
|
|
8
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
9
|
+
open framework in which fonts may be shared and improved in partnership
|
|
10
|
+
with others.
|
|
11
|
+
|
|
12
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
13
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
14
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
15
|
+
redistributed and/or sold with any software provided that any reserved
|
|
16
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
17
|
+
however, cannot be released under any other type of license. The
|
|
18
|
+
requirement for fonts to remain under this license does not apply
|
|
19
|
+
to any document created using the fonts or their derivatives.
|
|
20
|
+
|
|
21
|
+
DEFINITIONS
|
|
22
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
23
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
24
|
+
include source files, build scripts and documentation.
|
|
25
|
+
|
|
26
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
27
|
+
copyright statement(s).
|
|
28
|
+
|
|
29
|
+
"Original Version" refers to the collection of Font Software components as
|
|
30
|
+
distributed by the Copyright Holder(s).
|
|
31
|
+
|
|
32
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
33
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
34
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
35
|
+
new environment.
|
|
36
|
+
|
|
37
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
38
|
+
writer or other person who contributed to the Font Software.
|
|
39
|
+
|
|
40
|
+
PERMISSION & CONDITIONS
|
|
41
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
42
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
43
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
44
|
+
Software, subject to the following conditions:
|
|
45
|
+
|
|
46
|
+
1) Neither the Font Software nor any of its individual components,
|
|
47
|
+
in Original or Modified Versions, may be sold by itself.
|
|
48
|
+
|
|
49
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
50
|
+
redistributed and/or sold with any software, provided that each copy
|
|
51
|
+
contains the above copyright notice and this license. These can be
|
|
52
|
+
included either as stand-alone text files, human-readable headers or
|
|
53
|
+
in the appropriate machine-readable metadata fields within text or
|
|
54
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
55
|
+
|
|
56
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
57
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
58
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
59
|
+
presented to the users.
|
|
60
|
+
|
|
61
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
62
|
+
Software shall not be used to promote, endorse or advertise any
|
|
63
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
64
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
65
|
+
permission.
|
|
66
|
+
|
|
67
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
68
|
+
must be distributed entirely under this license, and must not be
|
|
69
|
+
distributed under any other license. The requirement for fonts to
|
|
70
|
+
remain under this license does not apply to any document created
|
|
71
|
+
using the Font Software.
|
|
72
|
+
|
|
73
|
+
TERMINATION
|
|
74
|
+
This license becomes null and void if any of the above conditions are
|
|
75
|
+
not met.
|
|
76
|
+
|
|
77
|
+
DISCLAIMER
|
|
78
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
79
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
80
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
81
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
82
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
83
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
84
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
85
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
86
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
-------------------------------
|
|
2
|
+
UBUNTU FONT LICENCE Version 1.0
|
|
3
|
+
-------------------------------
|
|
4
|
+
|
|
5
|
+
PREAMBLE
|
|
6
|
+
This licence allows the licensed fonts to be used, studied, modified and
|
|
7
|
+
redistributed freely. The fonts, including any derivative works, can be
|
|
8
|
+
bundled, embedded, and redistributed provided the terms of this licence
|
|
9
|
+
are met. The fonts and derivatives, however, cannot be released under
|
|
10
|
+
any other licence. The requirement for fonts to remain under this
|
|
11
|
+
licence does not require any document created using the fonts or their
|
|
12
|
+
derivatives to be published under this licence, as long as the primary
|
|
13
|
+
purpose of the document is not to be a vehicle for the distribution of
|
|
14
|
+
the fonts.
|
|
15
|
+
|
|
16
|
+
DEFINITIONS
|
|
17
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
18
|
+
Holder(s) under this licence and clearly marked as such. This may
|
|
19
|
+
include source files, build scripts and documentation.
|
|
20
|
+
|
|
21
|
+
"Original Version" refers to the collection of Font Software components
|
|
22
|
+
as received under this licence.
|
|
23
|
+
|
|
24
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
25
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
26
|
+
Original Version, by changing formats or by porting the Font Software to
|
|
27
|
+
a new environment.
|
|
28
|
+
|
|
29
|
+
"Copyright Holder(s)" refers to all individuals and companies who have a
|
|
30
|
+
copyright ownership of the Font Software.
|
|
31
|
+
|
|
32
|
+
"Substantially Changed" refers to Modified Versions which can be easily
|
|
33
|
+
identified as dissimilar to the Font Software by users of the Font
|
|
34
|
+
Software comparing the Original Version with the Modified Version.
|
|
35
|
+
|
|
36
|
+
To "Propagate" a work means to do anything with it that, without
|
|
37
|
+
permission, would make you directly or secondarily liable for
|
|
38
|
+
infringement under applicable copyright law, except executing it on a
|
|
39
|
+
computer or modifying a private copy. Propagation includes copying,
|
|
40
|
+
distribution (with or without modification and with or without charging
|
|
41
|
+
a redistribution fee), making available to the public, and in some
|
|
42
|
+
countries other activities as well.
|
|
43
|
+
|
|
44
|
+
PERMISSION & CONDITIONS
|
|
45
|
+
This licence does not grant any rights under trademark law and all such
|
|
46
|
+
rights are reserved.
|
|
47
|
+
|
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining a
|
|
49
|
+
copy of the Font Software, to propagate the Font Software, subject to
|
|
50
|
+
the below conditions:
|
|
51
|
+
|
|
52
|
+
1) Each copy of the Font Software must contain the above copyright
|
|
53
|
+
notice and this licence. These can be included either as stand-alone
|
|
54
|
+
text files, human-readable headers or in the appropriate machine-
|
|
55
|
+
readable metadata fields within text or binary files as long as those
|
|
56
|
+
fields can be easily viewed by the user.
|
|
57
|
+
|
|
58
|
+
2) The font name complies with the following:
|
|
59
|
+
(a) The Original Version must retain its name, unmodified.
|
|
60
|
+
(b) Modified Versions which are Substantially Changed must be renamed to
|
|
61
|
+
avoid use of the name of the Original Version or similar names entirely.
|
|
62
|
+
(c) Modified Versions which are not Substantially Changed must be
|
|
63
|
+
renamed to both (i) retain the name of the Original Version and (ii) add
|
|
64
|
+
additional naming elements to distinguish the Modified Version from the
|
|
65
|
+
Original Version. The name of such Modified Versions must be the name of
|
|
66
|
+
the Original Version, with "derivative X" where X represents the name of
|
|
67
|
+
the new work, appended to that name.
|
|
68
|
+
|
|
69
|
+
3) The name(s) of the Copyright Holder(s) and any contributor to the
|
|
70
|
+
Font Software shall not be used to promote, endorse or advertise any
|
|
71
|
+
Modified Version, except (i) as required by this licence, (ii) to
|
|
72
|
+
acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with
|
|
73
|
+
their explicit written permission.
|
|
74
|
+
|
|
75
|
+
4) The Font Software, modified or unmodified, in part or in whole, must
|
|
76
|
+
be distributed entirely under this licence, and must not be distributed
|
|
77
|
+
under any other licence. The requirement for fonts to remain under this
|
|
78
|
+
licence does not affect any document created using the Font Software,
|
|
79
|
+
except any version of the Font Software extracted from a document
|
|
80
|
+
created using the Font Software may only be distributed under this
|
|
81
|
+
licence.
|
|
82
|
+
|
|
83
|
+
TERMINATION
|
|
84
|
+
This licence becomes null and void if any of the above conditions are
|
|
85
|
+
not met.
|
|
86
|
+
|
|
87
|
+
DISCLAIMER
|
|
88
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
89
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
90
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
91
|
+
COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
92
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
93
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
94
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
95
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
|
|
96
|
+
DEALINGS IN THE FONT SOFTWARE.
|