@lokascript/semantic 1.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/LICENSE +21 -0
- package/README.md +686 -0
- package/dist/browser-ar.ar.global.js +2 -0
- package/dist/browser-core.core.global.js +2 -0
- package/dist/browser-de.de.global.js +2 -0
- package/dist/browser-east-asian.east-asian.global.js +2 -0
- package/dist/browser-en-tr.en-tr.global.js +2 -0
- package/dist/browser-en.en.global.js +2 -0
- package/dist/browser-es-en.es-en.global.js +2 -0
- package/dist/browser-es.es.global.js +2 -0
- package/dist/browser-fr.fr.global.js +2 -0
- package/dist/browser-id.id.global.js +2 -0
- package/dist/browser-ja.ja.global.js +2 -0
- package/dist/browser-ko.ko.global.js +2 -0
- package/dist/browser-lazy.lazy.global.js +2 -0
- package/dist/browser-priority.priority.global.js +2 -0
- package/dist/browser-pt.pt.global.js +2 -0
- package/dist/browser-qu.qu.global.js +2 -0
- package/dist/browser-sw.sw.global.js +2 -0
- package/dist/browser-tr.tr.global.js +2 -0
- package/dist/browser-western.western.global.js +2 -0
- package/dist/browser-zh.zh.global.js +2 -0
- package/dist/browser.global.js +3 -0
- package/dist/browser.global.js.map +1 -0
- package/dist/index.cjs +35051 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3426 -0
- package/dist/index.d.ts +3426 -0
- package/dist/index.js +34890 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/ar.d.ts +78 -0
- package/dist/languages/ar.js +1622 -0
- package/dist/languages/ar.js.map +1 -0
- package/dist/languages/de.d.ts +38 -0
- package/dist/languages/de.js +1168 -0
- package/dist/languages/de.js.map +1 -0
- package/dist/languages/en.d.ts +44 -0
- package/dist/languages/en.js +3491 -0
- package/dist/languages/en.js.map +1 -0
- package/dist/languages/es.d.ts +52 -0
- package/dist/languages/es.js +1493 -0
- package/dist/languages/es.js.map +1 -0
- package/dist/languages/fr.d.ts +37 -0
- package/dist/languages/fr.js +1159 -0
- package/dist/languages/fr.js.map +1 -0
- package/dist/languages/id.d.ts +35 -0
- package/dist/languages/id.js +1152 -0
- package/dist/languages/id.js.map +1 -0
- package/dist/languages/ja.d.ts +53 -0
- package/dist/languages/ja.js +1430 -0
- package/dist/languages/ja.js.map +1 -0
- package/dist/languages/ko.d.ts +51 -0
- package/dist/languages/ko.js +1729 -0
- package/dist/languages/ko.js.map +1 -0
- package/dist/languages/pt.d.ts +37 -0
- package/dist/languages/pt.js +1127 -0
- package/dist/languages/pt.js.map +1 -0
- package/dist/languages/qu.d.ts +36 -0
- package/dist/languages/qu.js +1143 -0
- package/dist/languages/qu.js.map +1 -0
- package/dist/languages/sw.d.ts +35 -0
- package/dist/languages/sw.js +1147 -0
- package/dist/languages/sw.js.map +1 -0
- package/dist/languages/tr.d.ts +45 -0
- package/dist/languages/tr.js +1529 -0
- package/dist/languages/tr.js.map +1 -0
- package/dist/languages/zh.d.ts +58 -0
- package/dist/languages/zh.js +1257 -0
- package/dist/languages/zh.js.map +1 -0
- package/dist/types-C4dcj53L.d.ts +600 -0
- package/package.json +202 -0
- package/src/__test-utils__/index.ts +7 -0
- package/src/__test-utils__/test-helpers.ts +8 -0
- package/src/__types__/test-helpers.ts +122 -0
- package/src/analysis/index.ts +479 -0
- package/src/ast-builder/command-mappers.ts +1133 -0
- package/src/ast-builder/expression-parser/index.ts +41 -0
- package/src/ast-builder/expression-parser/parser.ts +563 -0
- package/src/ast-builder/expression-parser/tokenizer.ts +394 -0
- package/src/ast-builder/expression-parser/types.ts +208 -0
- package/src/ast-builder/index.ts +536 -0
- package/src/ast-builder/value-converters.ts +172 -0
- package/src/bridge.ts +275 -0
- package/src/browser-ar.ts +162 -0
- package/src/browser-core.ts +231 -0
- package/src/browser-de.ts +162 -0
- package/src/browser-east-asian.ts +173 -0
- package/src/browser-en-tr.ts +165 -0
- package/src/browser-en.ts +157 -0
- package/src/browser-es-en.ts +200 -0
- package/src/browser-es.ts +170 -0
- package/src/browser-fr.ts +162 -0
- package/src/browser-id.ts +162 -0
- package/src/browser-ja.ts +162 -0
- package/src/browser-ko.ts +162 -0
- package/src/browser-lazy.ts +189 -0
- package/src/browser-priority.ts +214 -0
- package/src/browser-pt.ts +162 -0
- package/src/browser-qu.ts +162 -0
- package/src/browser-sw.ts +162 -0
- package/src/browser-tr.ts +162 -0
- package/src/browser-western.ts +181 -0
- package/src/browser-zh.ts +162 -0
- package/src/browser.ts +268 -0
- package/src/cache/index.ts +14 -0
- package/src/cache/semantic-cache.ts +344 -0
- package/src/core-bridge.ts +372 -0
- package/src/explicit/converter.ts +258 -0
- package/src/explicit/index.ts +18 -0
- package/src/explicit/parser.ts +236 -0
- package/src/explicit/renderer.ts +424 -0
- package/src/generators/command-schemas.ts +1636 -0
- package/src/generators/event-handler-generator.ts +109 -0
- package/src/generators/index.ts +117 -0
- package/src/generators/language-profiles.ts +139 -0
- package/src/generators/pattern-generator.ts +537 -0
- package/src/generators/profiles/arabic.ts +131 -0
- package/src/generators/profiles/bengali.ts +132 -0
- package/src/generators/profiles/chinese.ts +124 -0
- package/src/generators/profiles/english.ts +113 -0
- package/src/generators/profiles/french.ts +125 -0
- package/src/generators/profiles/german.ts +126 -0
- package/src/generators/profiles/hindi.ts +146 -0
- package/src/generators/profiles/index.ts +46 -0
- package/src/generators/profiles/indonesian.ts +125 -0
- package/src/generators/profiles/italian.ts +139 -0
- package/src/generators/profiles/japanese.ts +149 -0
- package/src/generators/profiles/korean.ts +127 -0
- package/src/generators/profiles/marker-templates.ts +288 -0
- package/src/generators/profiles/ms.ts +130 -0
- package/src/generators/profiles/polish.ts +249 -0
- package/src/generators/profiles/portuguese.ts +115 -0
- package/src/generators/profiles/quechua.ts +113 -0
- package/src/generators/profiles/russian.ts +260 -0
- package/src/generators/profiles/spanish.ts +130 -0
- package/src/generators/profiles/swahili.ts +129 -0
- package/src/generators/profiles/thai.ts +132 -0
- package/src/generators/profiles/tl.ts +128 -0
- package/src/generators/profiles/turkish.ts +124 -0
- package/src/generators/profiles/types.ts +165 -0
- package/src/generators/profiles/ukrainian.ts +270 -0
- package/src/generators/profiles/vietnamese.ts +133 -0
- package/src/generators/schema-error-codes.ts +160 -0
- package/src/generators/schema-validator.ts +391 -0
- package/src/index.ts +429 -0
- package/src/language-building-schema.ts +3170 -0
- package/src/language-loader.ts +394 -0
- package/src/languages/_all.ts +65 -0
- package/src/languages/ar.ts +15 -0
- package/src/languages/bn.ts +16 -0
- package/src/languages/de.ts +15 -0
- package/src/languages/en.ts +29 -0
- package/src/languages/es.ts +15 -0
- package/src/languages/fr.ts +15 -0
- package/src/languages/hi.ts +26 -0
- package/src/languages/id.ts +15 -0
- package/src/languages/index.ts +18 -0
- package/src/languages/it.ts +15 -0
- package/src/languages/ja.ts +15 -0
- package/src/languages/ko.ts +15 -0
- package/src/languages/ms.ts +16 -0
- package/src/languages/pl.ts +18 -0
- package/src/languages/pt.ts +15 -0
- package/src/languages/qu.ts +15 -0
- package/src/languages/ru.ts +26 -0
- package/src/languages/sw.ts +15 -0
- package/src/languages/th.ts +16 -0
- package/src/languages/tl.ts +16 -0
- package/src/languages/tr.ts +15 -0
- package/src/languages/uk.ts +26 -0
- package/src/languages/vi.ts +16 -0
- package/src/languages/zh.ts +15 -0
- package/src/parser/index.ts +15 -0
- package/src/parser/pattern-matcher.ts +1181 -0
- package/src/parser/semantic-parser.ts +573 -0
- package/src/parser/utils/index.ts +35 -0
- package/src/parser/utils/marker-resolution.ts +111 -0
- package/src/parser/utils/possessive-keywords.ts +43 -0
- package/src/parser/utils/role-positioning.ts +70 -0
- package/src/parser/utils/type-validation.ts +134 -0
- package/src/patterns/add/ar.ts +71 -0
- package/src/patterns/add/bn.ts +70 -0
- package/src/patterns/add/hi.ts +69 -0
- package/src/patterns/add/index.ts +87 -0
- package/src/patterns/add/it.ts +61 -0
- package/src/patterns/add/ja.ts +93 -0
- package/src/patterns/add/ko.ts +74 -0
- package/src/patterns/add/ms.ts +30 -0
- package/src/patterns/add/pl.ts +62 -0
- package/src/patterns/add/ru.ts +62 -0
- package/src/patterns/add/th.ts +49 -0
- package/src/patterns/add/tl.ts +30 -0
- package/src/patterns/add/tr.ts +71 -0
- package/src/patterns/add/uk.ts +62 -0
- package/src/patterns/add/vi.ts +61 -0
- package/src/patterns/add/zh.ts +71 -0
- package/src/patterns/builders.ts +207 -0
- package/src/patterns/decrement/bn.ts +70 -0
- package/src/patterns/decrement/de.ts +42 -0
- package/src/patterns/decrement/hi.ts +68 -0
- package/src/patterns/decrement/index.ts +79 -0
- package/src/patterns/decrement/it.ts +69 -0
- package/src/patterns/decrement/ms.ts +30 -0
- package/src/patterns/decrement/pl.ts +58 -0
- package/src/patterns/decrement/ru.ts +58 -0
- package/src/patterns/decrement/th.ts +49 -0
- package/src/patterns/decrement/tl.ts +30 -0
- package/src/patterns/decrement/tr.ts +48 -0
- package/src/patterns/decrement/uk.ts +58 -0
- package/src/patterns/decrement/vi.ts +61 -0
- package/src/patterns/decrement/zh.ts +32 -0
- package/src/patterns/en.ts +302 -0
- package/src/patterns/event-handler/ar.ts +151 -0
- package/src/patterns/event-handler/bn.ts +72 -0
- package/src/patterns/event-handler/de.ts +117 -0
- package/src/patterns/event-handler/en.ts +117 -0
- package/src/patterns/event-handler/es.ts +136 -0
- package/src/patterns/event-handler/fr.ts +117 -0
- package/src/patterns/event-handler/hi.ts +64 -0
- package/src/patterns/event-handler/id.ts +117 -0
- package/src/patterns/event-handler/index.ts +119 -0
- package/src/patterns/event-handler/it.ts +54 -0
- package/src/patterns/event-handler/ja.ts +118 -0
- package/src/patterns/event-handler/ko.ts +133 -0
- package/src/patterns/event-handler/ms.ts +30 -0
- package/src/patterns/event-handler/pl.ts +62 -0
- package/src/patterns/event-handler/pt.ts +117 -0
- package/src/patterns/event-handler/qu.ts +66 -0
- package/src/patterns/event-handler/ru.ts +62 -0
- package/src/patterns/event-handler/shared.ts +270 -0
- package/src/patterns/event-handler/sw.ts +117 -0
- package/src/patterns/event-handler/th.ts +53 -0
- package/src/patterns/event-handler/tl.ts +30 -0
- package/src/patterns/event-handler/tr.ts +170 -0
- package/src/patterns/event-handler/uk.ts +62 -0
- package/src/patterns/event-handler/vi.ts +61 -0
- package/src/patterns/event-handler/zh.ts +150 -0
- package/src/patterns/get/ar.ts +49 -0
- package/src/patterns/get/bn.ts +47 -0
- package/src/patterns/get/de.ts +32 -0
- package/src/patterns/get/hi.ts +52 -0
- package/src/patterns/get/index.ts +83 -0
- package/src/patterns/get/it.ts +56 -0
- package/src/patterns/get/ja.ts +53 -0
- package/src/patterns/get/ko.ts +53 -0
- package/src/patterns/get/ms.ts +30 -0
- package/src/patterns/get/pl.ts +57 -0
- package/src/patterns/get/ru.ts +57 -0
- package/src/patterns/get/th.ts +29 -0
- package/src/patterns/get/tl.ts +30 -0
- package/src/patterns/get/uk.ts +57 -0
- package/src/patterns/get/vi.ts +48 -0
- package/src/patterns/grammar-transformed/index.ts +39 -0
- package/src/patterns/grammar-transformed/ja.ts +1713 -0
- package/src/patterns/grammar-transformed/ko.ts +1311 -0
- package/src/patterns/grammar-transformed/tr.ts +1067 -0
- package/src/patterns/hide/ar.ts +67 -0
- package/src/patterns/hide/bn.ts +47 -0
- package/src/patterns/hide/de.ts +36 -0
- package/src/patterns/hide/hi.ts +61 -0
- package/src/patterns/hide/index.ts +91 -0
- package/src/patterns/hide/it.ts +56 -0
- package/src/patterns/hide/ja.ts +69 -0
- package/src/patterns/hide/ko.ts +69 -0
- package/src/patterns/hide/ms.ts +30 -0
- package/src/patterns/hide/pl.ts +57 -0
- package/src/patterns/hide/ru.ts +57 -0
- package/src/patterns/hide/th.ts +29 -0
- package/src/patterns/hide/tl.ts +30 -0
- package/src/patterns/hide/tr.ts +65 -0
- package/src/patterns/hide/uk.ts +57 -0
- package/src/patterns/hide/vi.ts +56 -0
- package/src/patterns/hide/zh.ts +68 -0
- package/src/patterns/increment/bn.ts +70 -0
- package/src/patterns/increment/de.ts +36 -0
- package/src/patterns/increment/hi.ts +68 -0
- package/src/patterns/increment/index.ts +79 -0
- package/src/patterns/increment/it.ts +69 -0
- package/src/patterns/increment/ms.ts +30 -0
- package/src/patterns/increment/pl.ts +58 -0
- package/src/patterns/increment/ru.ts +58 -0
- package/src/patterns/increment/th.ts +49 -0
- package/src/patterns/increment/tl.ts +30 -0
- package/src/patterns/increment/tr.ts +52 -0
- package/src/patterns/increment/uk.ts +58 -0
- package/src/patterns/increment/vi.ts +61 -0
- package/src/patterns/increment/zh.ts +32 -0
- package/src/patterns/index.ts +84 -0
- package/src/patterns/languages/en/control-flow.ts +93 -0
- package/src/patterns/languages/en/fetch.ts +62 -0
- package/src/patterns/languages/en/index.ts +42 -0
- package/src/patterns/languages/en/repeat.ts +67 -0
- package/src/patterns/languages/en/set.ts +48 -0
- package/src/patterns/languages/en/swap.ts +38 -0
- package/src/patterns/languages/en/temporal.ts +57 -0
- package/src/patterns/put/ar.ts +74 -0
- package/src/patterns/put/bn.ts +53 -0
- package/src/patterns/put/en.ts +74 -0
- package/src/patterns/put/es.ts +74 -0
- package/src/patterns/put/hi.ts +69 -0
- package/src/patterns/put/id.ts +96 -0
- package/src/patterns/put/index.ts +99 -0
- package/src/patterns/put/it.ts +56 -0
- package/src/patterns/put/ja.ts +75 -0
- package/src/patterns/put/ko.ts +67 -0
- package/src/patterns/put/ms.ts +30 -0
- package/src/patterns/put/pl.ts +81 -0
- package/src/patterns/put/ru.ts +85 -0
- package/src/patterns/put/th.ts +32 -0
- package/src/patterns/put/tl.ts +30 -0
- package/src/patterns/put/tr.ts +67 -0
- package/src/patterns/put/uk.ts +85 -0
- package/src/patterns/put/vi.ts +72 -0
- package/src/patterns/put/zh.ts +62 -0
- package/src/patterns/registry.ts +163 -0
- package/src/patterns/remove/ar.ts +71 -0
- package/src/patterns/remove/bn.ts +68 -0
- package/src/patterns/remove/hi.ts +69 -0
- package/src/patterns/remove/index.ts +87 -0
- package/src/patterns/remove/it.ts +69 -0
- package/src/patterns/remove/ja.ts +74 -0
- package/src/patterns/remove/ko.ts +78 -0
- package/src/patterns/remove/ms.ts +30 -0
- package/src/patterns/remove/pl.ts +62 -0
- package/src/patterns/remove/ru.ts +62 -0
- package/src/patterns/remove/th.ts +49 -0
- package/src/patterns/remove/tl.ts +30 -0
- package/src/patterns/remove/tr.ts +78 -0
- package/src/patterns/remove/uk.ts +62 -0
- package/src/patterns/remove/vi.ts +61 -0
- package/src/patterns/remove/zh.ts +72 -0
- package/src/patterns/set/ar.ts +84 -0
- package/src/patterns/set/bn.ts +53 -0
- package/src/patterns/set/de.ts +84 -0
- package/src/patterns/set/es.ts +92 -0
- package/src/patterns/set/fr.ts +88 -0
- package/src/patterns/set/hi.ts +56 -0
- package/src/patterns/set/id.ts +84 -0
- package/src/patterns/set/index.ts +107 -0
- package/src/patterns/set/it.ts +56 -0
- package/src/patterns/set/ja.ts +86 -0
- package/src/patterns/set/ko.ts +85 -0
- package/src/patterns/set/ms.ts +30 -0
- package/src/patterns/set/pl.ts +57 -0
- package/src/patterns/set/pt.ts +84 -0
- package/src/patterns/set/ru.ts +57 -0
- package/src/patterns/set/th.ts +31 -0
- package/src/patterns/set/tl.ts +30 -0
- package/src/patterns/set/tr.ts +107 -0
- package/src/patterns/set/uk.ts +57 -0
- package/src/patterns/set/vi.ts +53 -0
- package/src/patterns/set/zh.ts +84 -0
- package/src/patterns/show/ar.ts +67 -0
- package/src/patterns/show/bn.ts +47 -0
- package/src/patterns/show/de.ts +32 -0
- package/src/patterns/show/fr.ts +32 -0
- package/src/patterns/show/hi.ts +61 -0
- package/src/patterns/show/index.ts +95 -0
- package/src/patterns/show/it.ts +56 -0
- package/src/patterns/show/ja.ts +69 -0
- package/src/patterns/show/ko.ts +73 -0
- package/src/patterns/show/ms.ts +30 -0
- package/src/patterns/show/pl.ts +57 -0
- package/src/patterns/show/ru.ts +57 -0
- package/src/patterns/show/th.ts +29 -0
- package/src/patterns/show/tl.ts +30 -0
- package/src/patterns/show/tr.ts +65 -0
- package/src/patterns/show/uk.ts +57 -0
- package/src/patterns/show/vi.ts +56 -0
- package/src/patterns/show/zh.ts +68 -0
- package/src/patterns/take/ar.ts +51 -0
- package/src/patterns/take/index.ts +31 -0
- package/src/patterns/toggle/ar.ts +61 -0
- package/src/patterns/toggle/bn.ts +70 -0
- package/src/patterns/toggle/en.ts +61 -0
- package/src/patterns/toggle/es.ts +61 -0
- package/src/patterns/toggle/hi.ts +80 -0
- package/src/patterns/toggle/index.ts +95 -0
- package/src/patterns/toggle/it.ts +69 -0
- package/src/patterns/toggle/ja.ts +156 -0
- package/src/patterns/toggle/ko.ts +113 -0
- package/src/patterns/toggle/ms.ts +30 -0
- package/src/patterns/toggle/pl.ts +62 -0
- package/src/patterns/toggle/ru.ts +62 -0
- package/src/patterns/toggle/th.ts +50 -0
- package/src/patterns/toggle/tl.ts +30 -0
- package/src/patterns/toggle/tr.ts +88 -0
- package/src/patterns/toggle/uk.ts +62 -0
- package/src/patterns/toggle/vi.ts +61 -0
- package/src/patterns/toggle/zh.ts +99 -0
- package/src/public-api.ts +286 -0
- package/src/registry.ts +441 -0
- package/src/tokenizers/arabic.ts +723 -0
- package/src/tokenizers/base.ts +1300 -0
- package/src/tokenizers/bengali.ts +289 -0
- package/src/tokenizers/chinese.ts +481 -0
- package/src/tokenizers/english.ts +416 -0
- package/src/tokenizers/french.ts +326 -0
- package/src/tokenizers/german.ts +324 -0
- package/src/tokenizers/hindi.ts +319 -0
- package/src/tokenizers/index.ts +127 -0
- package/src/tokenizers/indonesian.ts +306 -0
- package/src/tokenizers/italian.ts +458 -0
- package/src/tokenizers/japanese.ts +447 -0
- package/src/tokenizers/korean.ts +642 -0
- package/src/tokenizers/morphology/arabic-normalizer.ts +242 -0
- package/src/tokenizers/morphology/french-normalizer.ts +268 -0
- package/src/tokenizers/morphology/german-normalizer.ts +256 -0
- package/src/tokenizers/morphology/index.ts +46 -0
- package/src/tokenizers/morphology/italian-normalizer.ts +329 -0
- package/src/tokenizers/morphology/japanese-normalizer.ts +288 -0
- package/src/tokenizers/morphology/korean-normalizer.ts +428 -0
- package/src/tokenizers/morphology/polish-normalizer.ts +264 -0
- package/src/tokenizers/morphology/portuguese-normalizer.ts +310 -0
- package/src/tokenizers/morphology/spanish-normalizer.ts +327 -0
- package/src/tokenizers/morphology/turkish-normalizer.ts +412 -0
- package/src/tokenizers/morphology/types.ts +211 -0
- package/src/tokenizers/ms.ts +198 -0
- package/src/tokenizers/polish.ts +354 -0
- package/src/tokenizers/portuguese.ts +304 -0
- package/src/tokenizers/quechua.ts +339 -0
- package/src/tokenizers/russian.ts +375 -0
- package/src/tokenizers/spanish.ts +403 -0
- package/src/tokenizers/swahili.ts +303 -0
- package/src/tokenizers/thai.ts +236 -0
- package/src/tokenizers/tl.ts +198 -0
- package/src/tokenizers/turkish.ts +411 -0
- package/src/tokenizers/ukrainian.ts +369 -0
- package/src/tokenizers/vietnamese.ts +410 -0
- package/src/types/grammar-types.ts +617 -0
- package/src/types/unified-profile.ts +267 -0
- package/src/types.ts +709 -0
- package/src/utils/confidence-calculator.ts +147 -0
- package/src/validators/command-validator.ts +380 -0
- package/src/validators/index.ts +15 -0
package/src/bridge.ts
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Bridge
|
|
3
|
+
*
|
|
4
|
+
* Connects the semantic parser to the LokaScript core runtime.
|
|
5
|
+
* Converts SemanticNodes to the CommandNode format expected by the runtime.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { SemanticNode, EventHandlerSemanticNode, SemanticValue } from './types';
|
|
9
|
+
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// CommandNode Interface (from @lokascript/core)
|
|
12
|
+
// =============================================================================
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Simplified CommandNode interface matching core runtime expectations.
|
|
16
|
+
* In production, this would import from @lokascript/core.
|
|
17
|
+
*/
|
|
18
|
+
interface CommandNode {
|
|
19
|
+
type: 'command';
|
|
20
|
+
name: string;
|
|
21
|
+
args: ExpressionNode[];
|
|
22
|
+
modifiers?: Record<string, ExpressionNode>;
|
|
23
|
+
body?: StatementNode[];
|
|
24
|
+
implicitTarget?: ExpressionNode;
|
|
25
|
+
isBlocking: boolean;
|
|
26
|
+
start?: number;
|
|
27
|
+
end?: number;
|
|
28
|
+
line?: number;
|
|
29
|
+
column?: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface EventHandlerNode {
|
|
33
|
+
type: 'eventHandler';
|
|
34
|
+
eventName: string;
|
|
35
|
+
body: StatementNode[];
|
|
36
|
+
filter?: ExpressionNode;
|
|
37
|
+
modifiers?: {
|
|
38
|
+
once?: boolean;
|
|
39
|
+
debounce?: number;
|
|
40
|
+
throttle?: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type ExpressionNode = {
|
|
45
|
+
type: string;
|
|
46
|
+
[key: string]: unknown;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
type StatementNode = CommandNode | EventHandlerNode | ExpressionNode;
|
|
50
|
+
|
|
51
|
+
// =============================================================================
|
|
52
|
+
// Semantic to Runtime Bridge
|
|
53
|
+
// =============================================================================
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Convert a SemanticNode to a CommandNode for runtime execution.
|
|
57
|
+
*/
|
|
58
|
+
export function toCommandNode(semantic: SemanticNode): CommandNode {
|
|
59
|
+
const args: ExpressionNode[] = [];
|
|
60
|
+
const modifiers: Record<string, ExpressionNode> = {};
|
|
61
|
+
|
|
62
|
+
// Map semantic roles to CommandNode structure
|
|
63
|
+
for (const [role, value] of semantic.roles) {
|
|
64
|
+
const expr = valueToExpression(value);
|
|
65
|
+
|
|
66
|
+
switch (role) {
|
|
67
|
+
// Primary arguments (go into args array)
|
|
68
|
+
case 'patient':
|
|
69
|
+
args.push(expr);
|
|
70
|
+
break;
|
|
71
|
+
|
|
72
|
+
// Modifiers (go into modifiers object with preposition keys)
|
|
73
|
+
case 'destination':
|
|
74
|
+
// Determine appropriate preposition based on command
|
|
75
|
+
if (semantic.action === 'put') {
|
|
76
|
+
modifiers['into'] = expr;
|
|
77
|
+
} else {
|
|
78
|
+
modifiers['on'] = expr;
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
|
|
82
|
+
case 'source':
|
|
83
|
+
modifiers['from'] = expr;
|
|
84
|
+
break;
|
|
85
|
+
|
|
86
|
+
case 'style':
|
|
87
|
+
case 'quantity':
|
|
88
|
+
modifiers['by'] = expr;
|
|
89
|
+
break;
|
|
90
|
+
|
|
91
|
+
case 'method':
|
|
92
|
+
modifiers['as'] = expr;
|
|
93
|
+
break;
|
|
94
|
+
|
|
95
|
+
case 'condition':
|
|
96
|
+
modifiers['if'] = expr;
|
|
97
|
+
break;
|
|
98
|
+
|
|
99
|
+
case 'event':
|
|
100
|
+
// For event handlers, this becomes the event name
|
|
101
|
+
args.push(expr);
|
|
102
|
+
break;
|
|
103
|
+
|
|
104
|
+
default:
|
|
105
|
+
// Unknown role - add as modifier
|
|
106
|
+
modifiers[role] = expr;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const result: CommandNode = {
|
|
111
|
+
type: 'command',
|
|
112
|
+
name: semantic.action,
|
|
113
|
+
args,
|
|
114
|
+
isBlocking: false,
|
|
115
|
+
start: semantic.metadata?.sourcePosition?.start ?? 0,
|
|
116
|
+
end: semantic.metadata?.sourcePosition?.end ?? 0,
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
if (Object.keys(modifiers).length > 0) {
|
|
120
|
+
result.modifiers = modifiers;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Convert a SemanticNode to an EventHandlerNode for runtime execution.
|
|
128
|
+
*/
|
|
129
|
+
export function toEventHandlerNode(semantic: EventHandlerSemanticNode): EventHandlerNode {
|
|
130
|
+
const eventValue = semantic.roles.get('event');
|
|
131
|
+
const eventName = eventValue ? valueToString(eventValue) : 'click';
|
|
132
|
+
|
|
133
|
+
const body: StatementNode[] = semantic.body.map(node => {
|
|
134
|
+
if (node.kind === 'event-handler') {
|
|
135
|
+
return toEventHandlerNode(node as EventHandlerSemanticNode);
|
|
136
|
+
}
|
|
137
|
+
return toCommandNode(node);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const result: EventHandlerNode = {
|
|
141
|
+
type: 'eventHandler',
|
|
142
|
+
eventName,
|
|
143
|
+
body,
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
if (semantic.eventModifiers) {
|
|
147
|
+
const mods: { once?: boolean; debounce?: number; throttle?: number } = {};
|
|
148
|
+
if (semantic.eventModifiers.once !== undefined) mods.once = semantic.eventModifiers.once;
|
|
149
|
+
if (semantic.eventModifiers.debounce !== undefined)
|
|
150
|
+
mods.debounce = semantic.eventModifiers.debounce;
|
|
151
|
+
if (semantic.eventModifiers.throttle !== undefined)
|
|
152
|
+
mods.throttle = semantic.eventModifiers.throttle;
|
|
153
|
+
if (Object.keys(mods).length > 0) {
|
|
154
|
+
result.modifiers = mods;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Convert a SemanticNode to the appropriate runtime node type.
|
|
163
|
+
*/
|
|
164
|
+
export function toRuntimeNode(semantic: SemanticNode): StatementNode {
|
|
165
|
+
if (semantic.kind === 'event-handler') {
|
|
166
|
+
return toEventHandlerNode(semantic as EventHandlerSemanticNode);
|
|
167
|
+
}
|
|
168
|
+
return toCommandNode(semantic);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// =============================================================================
|
|
172
|
+
// Helper Functions
|
|
173
|
+
// =============================================================================
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Convert a SemanticValue to an ExpressionNode.
|
|
177
|
+
*/
|
|
178
|
+
function valueToExpression(value: SemanticValue): ExpressionNode {
|
|
179
|
+
switch (value.type) {
|
|
180
|
+
case 'literal':
|
|
181
|
+
return {
|
|
182
|
+
type: 'literal',
|
|
183
|
+
value: value.value,
|
|
184
|
+
dataType: value.dataType,
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
case 'selector':
|
|
188
|
+
return {
|
|
189
|
+
type: 'selector',
|
|
190
|
+
value: value.value,
|
|
191
|
+
selectorType: value.selectorKind,
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
case 'reference':
|
|
195
|
+
return {
|
|
196
|
+
type: 'identifier',
|
|
197
|
+
name: value.value,
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
case 'property-path':
|
|
201
|
+
return {
|
|
202
|
+
type: 'memberExpression',
|
|
203
|
+
object: valueToExpression(value.object),
|
|
204
|
+
property: {
|
|
205
|
+
type: 'identifier',
|
|
206
|
+
name: value.property,
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
case 'expression':
|
|
211
|
+
return {
|
|
212
|
+
type: 'raw',
|
|
213
|
+
value: value.raw,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Convert a SemanticValue to a string.
|
|
220
|
+
*/
|
|
221
|
+
function valueToString(value: SemanticValue): string {
|
|
222
|
+
switch (value.type) {
|
|
223
|
+
case 'literal':
|
|
224
|
+
return String(value.value);
|
|
225
|
+
case 'selector':
|
|
226
|
+
return value.value;
|
|
227
|
+
case 'reference':
|
|
228
|
+
return value.value;
|
|
229
|
+
case 'property-path':
|
|
230
|
+
return `${valueToString(value.object)}'s ${value.property}`;
|
|
231
|
+
case 'expression':
|
|
232
|
+
return value.raw;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// =============================================================================
|
|
237
|
+
// Integration API
|
|
238
|
+
// =============================================================================
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Parse multilingual hyperscript and return a runtime-compatible node.
|
|
242
|
+
*
|
|
243
|
+
* @param input Hyperscript input (any supported language)
|
|
244
|
+
* @param language Source language code
|
|
245
|
+
* @returns Runtime-compatible node
|
|
246
|
+
*/
|
|
247
|
+
export function parseToRuntime(input: string, language: string): StatementNode {
|
|
248
|
+
// Import here to avoid circular dependency
|
|
249
|
+
const { parse } = require('./parser');
|
|
250
|
+
const semantic = parse(input, language);
|
|
251
|
+
return toRuntimeNode(semantic);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Parse multilingual hyperscript and execute it.
|
|
256
|
+
* This is a placeholder - actual execution requires the core runtime.
|
|
257
|
+
*
|
|
258
|
+
* @param input Hyperscript input
|
|
259
|
+
* @param language Source language code
|
|
260
|
+
* @param context Execution context (from core runtime)
|
|
261
|
+
*/
|
|
262
|
+
export async function parseAndExecute(
|
|
263
|
+
input: string,
|
|
264
|
+
language: string,
|
|
265
|
+
_context: unknown
|
|
266
|
+
): Promise<void> {
|
|
267
|
+
const node = parseToRuntime(input, language);
|
|
268
|
+
|
|
269
|
+
// In production, this would call the core runtime's execute function
|
|
270
|
+
console.log('Would execute:', JSON.stringify(node, null, 2));
|
|
271
|
+
|
|
272
|
+
// Placeholder for actual execution
|
|
273
|
+
// const runtime = context.runtime;
|
|
274
|
+
// await runtime.processCommand(node, context);
|
|
275
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arabic Browser Bundle Entry Point
|
|
3
|
+
*
|
|
4
|
+
* Minimal single-language bundle.
|
|
5
|
+
* Estimated size: ~69 KB (~24 KB gzip)
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```html
|
|
9
|
+
* <script src="hyperfixi-semantic.ar.global.js"></script>
|
|
10
|
+
* <script>
|
|
11
|
+
* const ast = LokaScriptSemanticAr.parse('toggle .active', 'ar');
|
|
12
|
+
* </script>
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Register Languages: ar
|
|
18
|
+
// =============================================================================
|
|
19
|
+
|
|
20
|
+
import './languages/ar';
|
|
21
|
+
|
|
22
|
+
// =============================================================================
|
|
23
|
+
// Version
|
|
24
|
+
// =============================================================================
|
|
25
|
+
|
|
26
|
+
export const VERSION = '1.0.0-ar';
|
|
27
|
+
|
|
28
|
+
// =============================================================================
|
|
29
|
+
// Supported Languages
|
|
30
|
+
// =============================================================================
|
|
31
|
+
|
|
32
|
+
const SUPPORTED_LANGUAGES = ['ar'] as const;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Get all supported languages in this bundle.
|
|
36
|
+
*/
|
|
37
|
+
export function getSupportedLanguages(): string[] {
|
|
38
|
+
return [...SUPPORTED_LANGUAGES];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Validate that a language is supported by this bundle.
|
|
43
|
+
*/
|
|
44
|
+
function validateLanguage(language: string): void {
|
|
45
|
+
if (language !== 'ar') {
|
|
46
|
+
throw new Error(`Language not supported in this bundle: ${language}. ` + `Supported: ar`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// =============================================================================
|
|
51
|
+
// Tokenizers (from registry)
|
|
52
|
+
// =============================================================================
|
|
53
|
+
|
|
54
|
+
export { getTokenizer, isLanguageSupported } from './registry';
|
|
55
|
+
|
|
56
|
+
import type { LanguageToken } from './types';
|
|
57
|
+
import { tokenize as tokenizeInternal } from './tokenizers';
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Tokenize input and return array of tokens (browser-friendly wrapper).
|
|
61
|
+
*/
|
|
62
|
+
export function tokenize(input: string, language: string): LanguageToken[] {
|
|
63
|
+
validateLanguage(language);
|
|
64
|
+
const stream = tokenizeInternal(input, language);
|
|
65
|
+
return [...stream.tokens];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Re-export tokenizers
|
|
69
|
+
export { arabicTokenizer } from './tokenizers/arabic';
|
|
70
|
+
|
|
71
|
+
// =============================================================================
|
|
72
|
+
// Patterns (from registry - lazy generation)
|
|
73
|
+
// =============================================================================
|
|
74
|
+
|
|
75
|
+
import { getPatternsForLanguage as getPatternsFromRegistry } from './registry';
|
|
76
|
+
import type { LanguagePattern, ActionType } from './types';
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Get all patterns for a language.
|
|
80
|
+
*/
|
|
81
|
+
export function getPatternsForLanguage(language: string): LanguagePattern[] {
|
|
82
|
+
validateLanguage(language);
|
|
83
|
+
return getPatternsFromRegistry(language);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Get patterns for a language and specific command.
|
|
88
|
+
*/
|
|
89
|
+
export function getPatternsForLanguageAndCommand(
|
|
90
|
+
language: string,
|
|
91
|
+
command: ActionType
|
|
92
|
+
): LanguagePattern[] {
|
|
93
|
+
return getPatternsForLanguage(language)
|
|
94
|
+
.filter(p => p.command === command)
|
|
95
|
+
.sort((a, b) => b.priority - a.priority);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// =============================================================================
|
|
99
|
+
// Language Profiles (from registry)
|
|
100
|
+
// =============================================================================
|
|
101
|
+
|
|
102
|
+
export { getProfile, tryGetProfile } from './registry';
|
|
103
|
+
export { arabicProfile } from './generators/language-profiles';
|
|
104
|
+
|
|
105
|
+
// =============================================================================
|
|
106
|
+
// Parsing
|
|
107
|
+
// =============================================================================
|
|
108
|
+
|
|
109
|
+
export { parse, canParse } from './parser';
|
|
110
|
+
export { parseAny, parseExplicit, isExplicitSyntax } from './explicit';
|
|
111
|
+
|
|
112
|
+
// =============================================================================
|
|
113
|
+
// Rendering
|
|
114
|
+
// =============================================================================
|
|
115
|
+
|
|
116
|
+
export { render, renderExplicit, toExplicit, fromExplicit } from './explicit';
|
|
117
|
+
|
|
118
|
+
// =============================================================================
|
|
119
|
+
// AST Builder
|
|
120
|
+
// =============================================================================
|
|
121
|
+
|
|
122
|
+
export { buildAST, ASTBuilder, getCommandMapper, registerCommandMapper } from './ast-builder';
|
|
123
|
+
|
|
124
|
+
// =============================================================================
|
|
125
|
+
// Semantic Analyzer (for core parser integration)
|
|
126
|
+
// =============================================================================
|
|
127
|
+
|
|
128
|
+
export {
|
|
129
|
+
createSemanticAnalyzer,
|
|
130
|
+
SemanticAnalyzerImpl,
|
|
131
|
+
shouldUseSemanticResult,
|
|
132
|
+
DEFAULT_CONFIDENCE_THRESHOLD,
|
|
133
|
+
HIGH_CONFIDENCE_THRESHOLD,
|
|
134
|
+
} from './core-bridge';
|
|
135
|
+
|
|
136
|
+
export type { SemanticAnalyzer, SemanticAnalysisResult } from './core-bridge';
|
|
137
|
+
|
|
138
|
+
// =============================================================================
|
|
139
|
+
// Type Helpers
|
|
140
|
+
// =============================================================================
|
|
141
|
+
|
|
142
|
+
export {
|
|
143
|
+
createSelector,
|
|
144
|
+
createLiteral,
|
|
145
|
+
createReference,
|
|
146
|
+
createPropertyPath,
|
|
147
|
+
createCommandNode,
|
|
148
|
+
createEventHandler,
|
|
149
|
+
} from './types';
|
|
150
|
+
|
|
151
|
+
// =============================================================================
|
|
152
|
+
// Types
|
|
153
|
+
// =============================================================================
|
|
154
|
+
|
|
155
|
+
export type {
|
|
156
|
+
ActionType,
|
|
157
|
+
SemanticRole,
|
|
158
|
+
SemanticValue,
|
|
159
|
+
SemanticNode,
|
|
160
|
+
LanguageToken,
|
|
161
|
+
TokenStream,
|
|
162
|
+
} from './types';
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Browser Bundle Entry Point (No Languages)
|
|
3
|
+
*
|
|
4
|
+
* A minimal browser bundle that includes only the parsing infrastructure.
|
|
5
|
+
* Languages must be loaded via URL or pre-loaded modules.
|
|
6
|
+
*
|
|
7
|
+
* This is ideal for:
|
|
8
|
+
* - CDN-based language loading
|
|
9
|
+
* - Applications that load languages dynamically from external sources
|
|
10
|
+
* - Minimizing initial bundle size
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```html
|
|
14
|
+
* <script src="hyperfixi-semantic-core.global.js"></script>
|
|
15
|
+
* <script src="lang/en.global.js"></script> <!-- Self-registering -->
|
|
16
|
+
* <script>
|
|
17
|
+
* const ast = LokaScriptSemanticCore.parse('toggle .active', 'en');
|
|
18
|
+
* </script>
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```html
|
|
23
|
+
* <script src="hyperfixi-semantic-core.global.js"></script>
|
|
24
|
+
* <script>
|
|
25
|
+
* // Load from URL
|
|
26
|
+
* await LokaScriptSemanticCore.loadLanguageFromUrl('ja', '/lang/ja.global.js');
|
|
27
|
+
* const ast = LokaScriptSemanticCore.parse('トグル .active', 'ja');
|
|
28
|
+
* </script>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// Version
|
|
34
|
+
// =============================================================================
|
|
35
|
+
|
|
36
|
+
export const VERSION = '1.0.0-core';
|
|
37
|
+
|
|
38
|
+
// =============================================================================
|
|
39
|
+
// Registry (Core)
|
|
40
|
+
// =============================================================================
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
registerLanguage,
|
|
44
|
+
registerPatterns,
|
|
45
|
+
getTokenizer,
|
|
46
|
+
isLanguageSupported,
|
|
47
|
+
isLanguageRegistered,
|
|
48
|
+
getRegisteredLanguages,
|
|
49
|
+
getProfile,
|
|
50
|
+
tryGetProfile,
|
|
51
|
+
getPatternsForLanguage,
|
|
52
|
+
setPatternGenerator,
|
|
53
|
+
} from './registry';
|
|
54
|
+
|
|
55
|
+
// =============================================================================
|
|
56
|
+
// Tokenizers
|
|
57
|
+
// =============================================================================
|
|
58
|
+
|
|
59
|
+
import type { LanguageToken } from './types';
|
|
60
|
+
import { tokenize as tokenizeInternal } from './tokenizers';
|
|
61
|
+
import { isLanguageRegistered } from './registry';
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Tokenize input and return array of tokens.
|
|
65
|
+
* @throws Error if language is not loaded
|
|
66
|
+
*/
|
|
67
|
+
export function tokenize(input: string, language: string): LanguageToken[] {
|
|
68
|
+
if (!isLanguageRegistered(language)) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`Language '${language}' is not loaded. ` + `Load it via script tag or loadLanguageFromUrl().`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
const stream = tokenizeInternal(input, language);
|
|
74
|
+
return [...stream.tokens];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// =============================================================================
|
|
78
|
+
// Parsing
|
|
79
|
+
// =============================================================================
|
|
80
|
+
|
|
81
|
+
export { parse, canParse } from './parser';
|
|
82
|
+
export { parseAny, parseExplicit, isExplicitSyntax } from './explicit';
|
|
83
|
+
|
|
84
|
+
// =============================================================================
|
|
85
|
+
// Rendering
|
|
86
|
+
// =============================================================================
|
|
87
|
+
|
|
88
|
+
export { render, renderExplicit, toExplicit, fromExplicit } from './explicit';
|
|
89
|
+
|
|
90
|
+
// =============================================================================
|
|
91
|
+
// AST Builder
|
|
92
|
+
// =============================================================================
|
|
93
|
+
|
|
94
|
+
export { buildAST, ASTBuilder, getCommandMapper, registerCommandMapper } from './ast-builder';
|
|
95
|
+
|
|
96
|
+
// =============================================================================
|
|
97
|
+
// Semantic Analyzer (for core parser integration)
|
|
98
|
+
// =============================================================================
|
|
99
|
+
|
|
100
|
+
export {
|
|
101
|
+
createSemanticAnalyzer,
|
|
102
|
+
SemanticAnalyzerImpl,
|
|
103
|
+
shouldUseSemanticResult,
|
|
104
|
+
DEFAULT_CONFIDENCE_THRESHOLD,
|
|
105
|
+
HIGH_CONFIDENCE_THRESHOLD,
|
|
106
|
+
} from './core-bridge';
|
|
107
|
+
|
|
108
|
+
export type { SemanticAnalyzer, SemanticAnalysisResult } from './core-bridge';
|
|
109
|
+
|
|
110
|
+
// =============================================================================
|
|
111
|
+
// URL-Based Language Loading
|
|
112
|
+
// =============================================================================
|
|
113
|
+
|
|
114
|
+
import {
|
|
115
|
+
registerLanguage as regLang,
|
|
116
|
+
registerPatterns as regPatterns,
|
|
117
|
+
type LanguageProfile,
|
|
118
|
+
} from './registry';
|
|
119
|
+
import type { LanguageTokenizer, LanguagePattern } from './types';
|
|
120
|
+
|
|
121
|
+
// Re-export for language module registration
|
|
122
|
+
export type { LanguagePattern };
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* A language module that can be registered.
|
|
126
|
+
*/
|
|
127
|
+
export interface LanguageModule {
|
|
128
|
+
tokenizer: LanguageTokenizer;
|
|
129
|
+
profile: LanguageProfile;
|
|
130
|
+
patterns?: LanguagePattern[];
|
|
131
|
+
buildPatterns?: () => LanguagePattern[];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Load a language from a URL.
|
|
136
|
+
*
|
|
137
|
+
* The URL should point to a JavaScript file that:
|
|
138
|
+
* - Either self-registers the language (recommended for IIFE bundles)
|
|
139
|
+
* - Or exports a LanguageModule object
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* // Load self-registering bundle
|
|
144
|
+
* await loadLanguageFromUrl('ja', '/lang/ja.global.js');
|
|
145
|
+
*
|
|
146
|
+
* // Load from CDN
|
|
147
|
+
* await loadLanguageFromUrl('ko', 'https://cdn.example.com/semantic/lang/ko.js');
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
export async function loadLanguageFromUrl(
|
|
151
|
+
code: string,
|
|
152
|
+
url: string
|
|
153
|
+
): Promise<{ loaded: boolean; error?: string }> {
|
|
154
|
+
try {
|
|
155
|
+
// Fetch the script
|
|
156
|
+
const response = await fetch(url);
|
|
157
|
+
if (!response.ok) {
|
|
158
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const text = await response.text();
|
|
162
|
+
|
|
163
|
+
// Execute the script (self-registering bundles will register themselves)
|
|
164
|
+
const script = document.createElement('script');
|
|
165
|
+
script.textContent = text;
|
|
166
|
+
document.head.appendChild(script);
|
|
167
|
+
document.head.removeChild(script);
|
|
168
|
+
|
|
169
|
+
// Check if it registered
|
|
170
|
+
if (isLanguageRegistered(code)) {
|
|
171
|
+
return { loaded: true };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return {
|
|
175
|
+
loaded: false,
|
|
176
|
+
error: `Script loaded but language '${code}' was not registered`,
|
|
177
|
+
};
|
|
178
|
+
} catch (error) {
|
|
179
|
+
return {
|
|
180
|
+
loaded: false,
|
|
181
|
+
error: error instanceof Error ? error.message : String(error),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Register a pre-loaded language module.
|
|
188
|
+
*/
|
|
189
|
+
export function registerLanguageModule(code: string, module: LanguageModule): void {
|
|
190
|
+
regLang(code, module.tokenizer, module.profile);
|
|
191
|
+
|
|
192
|
+
if (module.patterns) {
|
|
193
|
+
regPatterns(code, module.patterns);
|
|
194
|
+
} else if (module.buildPatterns) {
|
|
195
|
+
regPatterns(code, module.buildPatterns());
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// =============================================================================
|
|
200
|
+
// Type Helpers
|
|
201
|
+
// =============================================================================
|
|
202
|
+
|
|
203
|
+
export {
|
|
204
|
+
createSelector,
|
|
205
|
+
createLiteral,
|
|
206
|
+
createReference,
|
|
207
|
+
createPropertyPath,
|
|
208
|
+
createCommandNode,
|
|
209
|
+
createEventHandler,
|
|
210
|
+
} from './types';
|
|
211
|
+
|
|
212
|
+
// =============================================================================
|
|
213
|
+
// Types
|
|
214
|
+
// =============================================================================
|
|
215
|
+
|
|
216
|
+
export type {
|
|
217
|
+
ActionType,
|
|
218
|
+
SemanticRole,
|
|
219
|
+
SemanticValue,
|
|
220
|
+
SemanticNode,
|
|
221
|
+
LanguageToken,
|
|
222
|
+
TokenStream,
|
|
223
|
+
} from './types';
|
|
224
|
+
|
|
225
|
+
// =============================================================================
|
|
226
|
+
// Pattern Generator (Optional)
|
|
227
|
+
// =============================================================================
|
|
228
|
+
// Note: This core bundle does NOT include the pattern generator by default.
|
|
229
|
+
// Language bundles (e.g., browser-en.en.global.js) register their own patterns.
|
|
230
|
+
// If you need dynamic pattern generation, import buildPatternsForLanguage from
|
|
231
|
+
// the full bundle or use setPatternGenerator() to provide your own generator.
|