@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
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates LanguagePattern objects from CommandSchema + LanguageProfile.
|
|
5
|
+
* This solves the pattern explosion problem by deriving patterns from
|
|
6
|
+
* high-level definitions rather than hand-writing each one.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { LanguagePattern, PatternToken, ExtractionRule } from '../types';
|
|
10
|
+
import type { LanguageProfile } from './language-profiles';
|
|
11
|
+
import type { CommandSchema, RoleSpec } from './command-schemas';
|
|
12
|
+
import { getDefinedSchemas } from './command-schemas';
|
|
13
|
+
|
|
14
|
+
// Import shared utilities
|
|
15
|
+
import { sortRolesByWordOrder } from '../parser/utils/role-positioning';
|
|
16
|
+
import { resolveMarkerForRole } from '../parser/utils/marker-resolution';
|
|
17
|
+
|
|
18
|
+
// Note: languageProfiles is no longer imported here.
|
|
19
|
+
// Pattern generation for specific languages uses the registry instead.
|
|
20
|
+
|
|
21
|
+
// Import registry functions - this is safe because:
|
|
22
|
+
// 1. Registry doesn't import pattern-generator
|
|
23
|
+
// 2. The circular path is: pattern-generator -> registry -> pattern-generator
|
|
24
|
+
// But registry only uses setPatternGenerator which is exported, not module-level code
|
|
25
|
+
import {
|
|
26
|
+
getRegisteredLanguages as registryGetLanguages,
|
|
27
|
+
tryGetProfile as registryTryGetProfile,
|
|
28
|
+
} from '../registry';
|
|
29
|
+
|
|
30
|
+
function getAllRegisteredProfiles(): LanguageProfile[] {
|
|
31
|
+
const languages = registryGetLanguages();
|
|
32
|
+
return languages
|
|
33
|
+
.map((lang: string) => registryTryGetProfile(lang))
|
|
34
|
+
.filter((p): p is LanguageProfile => p !== undefined);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// Pattern Generator
|
|
39
|
+
// =============================================================================
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Configuration for pattern generation.
|
|
43
|
+
*/
|
|
44
|
+
export interface GeneratorConfig {
|
|
45
|
+
/** Base priority for generated patterns (higher = checked first) */
|
|
46
|
+
basePriority?: number;
|
|
47
|
+
/** Whether to generate simple patterns (without optional roles) */
|
|
48
|
+
generateSimpleVariants?: boolean;
|
|
49
|
+
/** Whether to generate alternative keyword patterns */
|
|
50
|
+
generateAlternatives?: boolean;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const defaultConfig: GeneratorConfig = {
|
|
54
|
+
basePriority: 100,
|
|
55
|
+
generateSimpleVariants: true,
|
|
56
|
+
generateAlternatives: true,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Generate a pattern for a command in a specific language.
|
|
61
|
+
*/
|
|
62
|
+
export function generatePattern(
|
|
63
|
+
schema: CommandSchema,
|
|
64
|
+
profile: LanguageProfile,
|
|
65
|
+
config: GeneratorConfig = defaultConfig
|
|
66
|
+
): LanguagePattern {
|
|
67
|
+
const id = `${schema.action}-${profile.code}-generated`;
|
|
68
|
+
const priority = config.basePriority ?? 100;
|
|
69
|
+
|
|
70
|
+
// Get keyword translation
|
|
71
|
+
const keyword = profile.keywords[schema.action];
|
|
72
|
+
if (!keyword) {
|
|
73
|
+
throw new Error(`No keyword translation for '${schema.action}' in ${profile.code}`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Build tokens based on word order
|
|
77
|
+
const tokens = buildTokens(schema, profile, keyword);
|
|
78
|
+
|
|
79
|
+
// Build extraction rules with defaults for optional roles
|
|
80
|
+
// This ensures defaults are applied even when optional groups don't match
|
|
81
|
+
const extraction = buildExtractionRulesWithDefaults(schema, profile);
|
|
82
|
+
|
|
83
|
+
// Build template format string (for documentation)
|
|
84
|
+
const format = buildFormatString(schema, profile, keyword);
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
id,
|
|
88
|
+
language: profile.code,
|
|
89
|
+
command: schema.action,
|
|
90
|
+
priority,
|
|
91
|
+
template: {
|
|
92
|
+
format,
|
|
93
|
+
tokens,
|
|
94
|
+
},
|
|
95
|
+
extraction,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Generate a simple variant pattern (without optional roles).
|
|
101
|
+
*/
|
|
102
|
+
export function generateSimplePattern(
|
|
103
|
+
schema: CommandSchema,
|
|
104
|
+
profile: LanguageProfile,
|
|
105
|
+
config: GeneratorConfig = defaultConfig
|
|
106
|
+
): LanguagePattern | null {
|
|
107
|
+
// Only generate simple variant if there are optional roles
|
|
108
|
+
const optionalRoles = schema.roles.filter(r => !r.required);
|
|
109
|
+
if (optionalRoles.length === 0) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const requiredRoles = schema.roles.filter(r => r.required);
|
|
114
|
+
const simpleSchema: CommandSchema = {
|
|
115
|
+
...schema,
|
|
116
|
+
roles: requiredRoles,
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const pattern = generatePattern(simpleSchema, profile, config);
|
|
120
|
+
|
|
121
|
+
// Adjust for simple variant
|
|
122
|
+
return {
|
|
123
|
+
...pattern,
|
|
124
|
+
id: `${schema.action}-${profile.code}-simple`,
|
|
125
|
+
priority: (config.basePriority ?? 100) - 5, // Lower priority than full pattern (was -10)
|
|
126
|
+
extraction: buildExtractionRulesWithDefaults(schema, profile),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Generate all pattern variants for a command in a language.
|
|
132
|
+
*/
|
|
133
|
+
export function generatePatternVariants(
|
|
134
|
+
schema: CommandSchema,
|
|
135
|
+
profile: LanguageProfile,
|
|
136
|
+
config: GeneratorConfig = defaultConfig
|
|
137
|
+
): LanguagePattern[] {
|
|
138
|
+
const patterns: LanguagePattern[] = [];
|
|
139
|
+
|
|
140
|
+
// Main pattern
|
|
141
|
+
patterns.push(generatePattern(schema, profile, config));
|
|
142
|
+
|
|
143
|
+
// Simple variant (without optional roles)
|
|
144
|
+
if (config.generateSimpleVariants) {
|
|
145
|
+
const simple = generateSimplePattern(schema, profile, config);
|
|
146
|
+
if (simple) {
|
|
147
|
+
patterns.push(simple);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return patterns;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Generate patterns for all commands in a specific language.
|
|
156
|
+
*/
|
|
157
|
+
export function generatePatternsForLanguage(
|
|
158
|
+
profile: LanguageProfile,
|
|
159
|
+
config: GeneratorConfig = defaultConfig
|
|
160
|
+
): LanguagePattern[] {
|
|
161
|
+
const patterns: LanguagePattern[] = [];
|
|
162
|
+
const schemas = getDefinedSchemas();
|
|
163
|
+
|
|
164
|
+
for (const schema of schemas) {
|
|
165
|
+
// Skip if no keyword translation exists
|
|
166
|
+
if (!profile.keywords[schema.action]) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const variants = generatePatternVariants(schema, profile, config);
|
|
171
|
+
patterns.push(...variants);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return patterns;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Generate patterns for a command across specified profiles.
|
|
179
|
+
*
|
|
180
|
+
* @param schema Command schema to generate patterns for
|
|
181
|
+
* @param profiles Array of language profiles to generate patterns for (defaults to all registered)
|
|
182
|
+
* @param config Generator configuration
|
|
183
|
+
*/
|
|
184
|
+
export function generatePatternsForCommand(
|
|
185
|
+
schema: CommandSchema,
|
|
186
|
+
profiles?: LanguageProfile[],
|
|
187
|
+
config: GeneratorConfig = defaultConfig
|
|
188
|
+
): LanguagePattern[] {
|
|
189
|
+
const patterns: LanguagePattern[] = [];
|
|
190
|
+
|
|
191
|
+
// If no profiles provided, use all registered profiles
|
|
192
|
+
const profilesToUse = profiles ?? getAllRegisteredProfiles();
|
|
193
|
+
|
|
194
|
+
for (const profile of profilesToUse) {
|
|
195
|
+
// Skip if no keyword translation exists
|
|
196
|
+
if (!profile.keywords[schema.action]) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const variants = generatePatternVariants(schema, profile, config);
|
|
201
|
+
patterns.push(...variants);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return patterns;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Generate all patterns for all commands across specified profiles.
|
|
209
|
+
*
|
|
210
|
+
* @param profiles Array of language profiles to generate patterns for (defaults to all registered)
|
|
211
|
+
* @param config Generator configuration
|
|
212
|
+
*/
|
|
213
|
+
export function generateAllPatterns(
|
|
214
|
+
profiles?: LanguageProfile[],
|
|
215
|
+
config: GeneratorConfig = defaultConfig
|
|
216
|
+
): LanguagePattern[] {
|
|
217
|
+
const patterns: LanguagePattern[] = [];
|
|
218
|
+
|
|
219
|
+
// If no profiles provided, use all registered profiles
|
|
220
|
+
const profilesToUse = profiles ?? getAllRegisteredProfiles();
|
|
221
|
+
|
|
222
|
+
for (const profile of profilesToUse) {
|
|
223
|
+
const langPatterns = generatePatternsForLanguage(profile, config);
|
|
224
|
+
patterns.push(...langPatterns);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return patterns;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// =============================================================================
|
|
231
|
+
// Token Building
|
|
232
|
+
// =============================================================================
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Build pattern tokens based on word order.
|
|
236
|
+
*/
|
|
237
|
+
function buildTokens(
|
|
238
|
+
schema: CommandSchema,
|
|
239
|
+
profile: LanguageProfile,
|
|
240
|
+
keyword: { primary: string; alternatives?: string[] }
|
|
241
|
+
): PatternToken[] {
|
|
242
|
+
const tokens: PatternToken[] = [];
|
|
243
|
+
|
|
244
|
+
// Get verb token
|
|
245
|
+
const verbToken: PatternToken = keyword.alternatives
|
|
246
|
+
? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }
|
|
247
|
+
: { type: 'literal', value: keyword.primary };
|
|
248
|
+
|
|
249
|
+
// Get role tokens sorted by position
|
|
250
|
+
const roleTokens = buildRoleTokens(schema, profile);
|
|
251
|
+
|
|
252
|
+
// Arrange based on word order
|
|
253
|
+
switch (profile.wordOrder) {
|
|
254
|
+
case 'SVO':
|
|
255
|
+
// Verb first, then roles in order
|
|
256
|
+
tokens.push(verbToken);
|
|
257
|
+
tokens.push(...roleTokens);
|
|
258
|
+
break;
|
|
259
|
+
|
|
260
|
+
case 'SOV':
|
|
261
|
+
// Roles first (reversed for SOV), then verb
|
|
262
|
+
tokens.push(...roleTokens);
|
|
263
|
+
tokens.push(verbToken);
|
|
264
|
+
break;
|
|
265
|
+
|
|
266
|
+
case 'VSO':
|
|
267
|
+
// Verb first, then subject, then object
|
|
268
|
+
tokens.push(verbToken);
|
|
269
|
+
tokens.push(...roleTokens);
|
|
270
|
+
break;
|
|
271
|
+
|
|
272
|
+
default:
|
|
273
|
+
// Default to SVO
|
|
274
|
+
tokens.push(verbToken);
|
|
275
|
+
tokens.push(...roleTokens);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return tokens;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Build tokens for roles.
|
|
283
|
+
*/
|
|
284
|
+
function buildRoleTokens(schema: CommandSchema, profile: LanguageProfile): PatternToken[] {
|
|
285
|
+
const tokens: PatternToken[] = [];
|
|
286
|
+
|
|
287
|
+
// Sort roles by position using shared utility
|
|
288
|
+
const sortedRoles = sortRolesByWordOrder(schema.roles, profile.wordOrder);
|
|
289
|
+
|
|
290
|
+
for (const roleSpec of sortedRoles) {
|
|
291
|
+
const roleToken = buildRoleToken(roleSpec, profile);
|
|
292
|
+
|
|
293
|
+
if (!roleSpec.required) {
|
|
294
|
+
// Wrap optional roles in a group
|
|
295
|
+
tokens.push({
|
|
296
|
+
type: 'group',
|
|
297
|
+
optional: true,
|
|
298
|
+
tokens: roleToken,
|
|
299
|
+
});
|
|
300
|
+
} else {
|
|
301
|
+
tokens.push(...roleToken);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return tokens;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Build token(s) for a single role.
|
|
310
|
+
*/
|
|
311
|
+
function buildRoleToken(roleSpec: RoleSpec, profile: LanguageProfile): PatternToken[] {
|
|
312
|
+
const tokens: PatternToken[] = [];
|
|
313
|
+
|
|
314
|
+
// Check for command-specific marker override first
|
|
315
|
+
const overrideMarker = roleSpec.markerOverride?.[profile.code];
|
|
316
|
+
const defaultMarker = profile.roleMarkers[roleSpec.role];
|
|
317
|
+
|
|
318
|
+
// Role value token
|
|
319
|
+
const roleValueToken: PatternToken = {
|
|
320
|
+
type: 'role',
|
|
321
|
+
role: roleSpec.role,
|
|
322
|
+
optional: !roleSpec.required,
|
|
323
|
+
expectedTypes: roleSpec.expectedTypes as any,
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
// Use override marker if available, otherwise use default
|
|
327
|
+
if (overrideMarker !== undefined) {
|
|
328
|
+
// Command-specific marker override
|
|
329
|
+
const position = defaultMarker?.position ?? 'before';
|
|
330
|
+
if (position === 'before') {
|
|
331
|
+
if (overrideMarker) {
|
|
332
|
+
tokens.push({ type: 'literal', value: overrideMarker });
|
|
333
|
+
}
|
|
334
|
+
tokens.push(roleValueToken);
|
|
335
|
+
} else {
|
|
336
|
+
tokens.push(roleValueToken);
|
|
337
|
+
if (overrideMarker) {
|
|
338
|
+
tokens.push({ type: 'literal', value: overrideMarker });
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
} else if (defaultMarker) {
|
|
342
|
+
if (defaultMarker.position === 'before') {
|
|
343
|
+
// Preposition: "on #button"
|
|
344
|
+
if (defaultMarker.primary) {
|
|
345
|
+
const markerToken: PatternToken = defaultMarker.alternatives
|
|
346
|
+
? {
|
|
347
|
+
type: 'literal',
|
|
348
|
+
value: defaultMarker.primary,
|
|
349
|
+
alternatives: defaultMarker.alternatives,
|
|
350
|
+
}
|
|
351
|
+
: { type: 'literal', value: defaultMarker.primary };
|
|
352
|
+
tokens.push(markerToken);
|
|
353
|
+
}
|
|
354
|
+
tokens.push(roleValueToken);
|
|
355
|
+
} else {
|
|
356
|
+
// Postposition/particle: "#button に"
|
|
357
|
+
tokens.push(roleValueToken);
|
|
358
|
+
const markerToken: PatternToken = defaultMarker.alternatives
|
|
359
|
+
? {
|
|
360
|
+
type: 'literal',
|
|
361
|
+
value: defaultMarker.primary,
|
|
362
|
+
alternatives: defaultMarker.alternatives,
|
|
363
|
+
}
|
|
364
|
+
: { type: 'literal', value: defaultMarker.primary };
|
|
365
|
+
tokens.push(markerToken);
|
|
366
|
+
}
|
|
367
|
+
} else {
|
|
368
|
+
// No marker, just the role value
|
|
369
|
+
tokens.push(roleValueToken);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return tokens;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// =============================================================================
|
|
376
|
+
// Extraction Rules Building
|
|
377
|
+
// =============================================================================
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Build extraction rules for a pattern.
|
|
381
|
+
*/
|
|
382
|
+
function buildExtractionRules(
|
|
383
|
+
schema: CommandSchema,
|
|
384
|
+
profile: LanguageProfile
|
|
385
|
+
): Record<string, ExtractionRule> {
|
|
386
|
+
const rules: Record<string, ExtractionRule> = {};
|
|
387
|
+
|
|
388
|
+
for (const roleSpec of schema.roles) {
|
|
389
|
+
// Check for command-specific marker override first
|
|
390
|
+
const overrideMarker = roleSpec.markerOverride?.[profile.code];
|
|
391
|
+
const defaultMarker = profile.roleMarkers[roleSpec.role];
|
|
392
|
+
|
|
393
|
+
if (overrideMarker !== undefined) {
|
|
394
|
+
// Use the override marker
|
|
395
|
+
rules[roleSpec.role] = overrideMarker ? { marker: overrideMarker } : {};
|
|
396
|
+
} else if (defaultMarker && defaultMarker.primary) {
|
|
397
|
+
rules[roleSpec.role] = defaultMarker.alternatives
|
|
398
|
+
? { marker: defaultMarker.primary, markerAlternatives: defaultMarker.alternatives }
|
|
399
|
+
: { marker: defaultMarker.primary };
|
|
400
|
+
} else {
|
|
401
|
+
rules[roleSpec.role] = {};
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
return rules;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Build extraction rules with defaults for optional roles.
|
|
410
|
+
*/
|
|
411
|
+
function buildExtractionRulesWithDefaults(
|
|
412
|
+
schema: CommandSchema,
|
|
413
|
+
profile: LanguageProfile
|
|
414
|
+
): Record<string, ExtractionRule> {
|
|
415
|
+
const baseRules = buildExtractionRules(schema, profile);
|
|
416
|
+
const rules: Record<string, ExtractionRule> = {};
|
|
417
|
+
|
|
418
|
+
// Copy base rules and add defaults for optional roles
|
|
419
|
+
for (const roleSpec of schema.roles) {
|
|
420
|
+
const baseRule = baseRules[roleSpec.role] || {};
|
|
421
|
+
|
|
422
|
+
if (!roleSpec.required && roleSpec.default) {
|
|
423
|
+
rules[roleSpec.role] = { ...baseRule, default: roleSpec.default };
|
|
424
|
+
} else {
|
|
425
|
+
rules[roleSpec.role] = baseRule;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
return rules;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// =============================================================================
|
|
433
|
+
// Format String Building
|
|
434
|
+
// =============================================================================
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Build a human-readable format string for documentation.
|
|
438
|
+
*/
|
|
439
|
+
function buildFormatString(
|
|
440
|
+
schema: CommandSchema,
|
|
441
|
+
profile: LanguageProfile,
|
|
442
|
+
keyword: { primary: string }
|
|
443
|
+
): string {
|
|
444
|
+
const parts: string[] = [];
|
|
445
|
+
|
|
446
|
+
// Sort roles by position using shared utility
|
|
447
|
+
const sortedRoles = sortRolesByWordOrder(schema.roles, profile.wordOrder);
|
|
448
|
+
|
|
449
|
+
// Build role parts
|
|
450
|
+
const roleParts = sortedRoles.map(roleSpec => {
|
|
451
|
+
// Use shared marker resolution utility
|
|
452
|
+
const resolved = resolveMarkerForRole(roleSpec, profile);
|
|
453
|
+
let part = '';
|
|
454
|
+
|
|
455
|
+
if (resolved && resolved.primary) {
|
|
456
|
+
// Has a marker
|
|
457
|
+
if (resolved.position === 'before') {
|
|
458
|
+
part = `${resolved.primary} {${roleSpec.role}}`;
|
|
459
|
+
} else {
|
|
460
|
+
part = `{${roleSpec.role}} ${resolved.primary}`;
|
|
461
|
+
}
|
|
462
|
+
} else {
|
|
463
|
+
// No marker
|
|
464
|
+
part = `{${roleSpec.role}}`;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
return roleSpec.required ? part : `[${part}]`;
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
// Arrange based on word order
|
|
471
|
+
switch (profile.wordOrder) {
|
|
472
|
+
case 'SVO':
|
|
473
|
+
case 'VSO':
|
|
474
|
+
parts.push(keyword.primary, ...roleParts);
|
|
475
|
+
break;
|
|
476
|
+
case 'SOV':
|
|
477
|
+
parts.push(...roleParts, keyword.primary);
|
|
478
|
+
break;
|
|
479
|
+
default:
|
|
480
|
+
parts.push(keyword.primary, ...roleParts);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return parts.join(' ');
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// =============================================================================
|
|
487
|
+
// Utility Functions
|
|
488
|
+
// =============================================================================
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* Get a summary of what patterns can be generated.
|
|
492
|
+
* Note: This requires the registry to have languages registered.
|
|
493
|
+
*/
|
|
494
|
+
export function getGeneratorSummary(): {
|
|
495
|
+
languages: string[];
|
|
496
|
+
commands: string[];
|
|
497
|
+
totalPatterns: number;
|
|
498
|
+
} {
|
|
499
|
+
const languages = registryGetLanguages();
|
|
500
|
+
const commands = getDefinedSchemas().map(s => s.action);
|
|
501
|
+
|
|
502
|
+
// Estimate total patterns (2 variants per command per language)
|
|
503
|
+
let totalPatterns = 0;
|
|
504
|
+
for (const lang of languages) {
|
|
505
|
+
const profile = registryTryGetProfile(lang);
|
|
506
|
+
if (profile) {
|
|
507
|
+
for (const schema of getDefinedSchemas()) {
|
|
508
|
+
if (profile.keywords[schema.action]) {
|
|
509
|
+
totalPatterns += 2; // Full + simple variant
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
return { languages, commands, totalPatterns };
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Validate that all required keywords exist for a language.
|
|
520
|
+
*/
|
|
521
|
+
export function validateLanguageKeywords(
|
|
522
|
+
profile: LanguageProfile,
|
|
523
|
+
schemas: CommandSchema[] = getDefinedSchemas()
|
|
524
|
+
): { missing: string[]; available: string[] } {
|
|
525
|
+
const missing: string[] = [];
|
|
526
|
+
const available: string[] = [];
|
|
527
|
+
|
|
528
|
+
for (const schema of schemas) {
|
|
529
|
+
if (profile.keywords[schema.action]) {
|
|
530
|
+
available.push(schema.action);
|
|
531
|
+
} else {
|
|
532
|
+
missing.push(schema.action);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
return { missing, available };
|
|
537
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arabic Language Profile
|
|
3
|
+
*
|
|
4
|
+
* VSO word order, prepositions, RTL (right-to-left), space-separated.
|
|
5
|
+
* Features root-based morphology and rich verb conjugation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { LanguageProfile } from './types';
|
|
9
|
+
|
|
10
|
+
export const arabicProfile: LanguageProfile = {
|
|
11
|
+
code: 'ar',
|
|
12
|
+
name: 'Arabic',
|
|
13
|
+
nativeName: 'العربية',
|
|
14
|
+
direction: 'rtl',
|
|
15
|
+
wordOrder: 'VSO',
|
|
16
|
+
markingStrategy: 'preposition',
|
|
17
|
+
usesSpaces: true,
|
|
18
|
+
verb: {
|
|
19
|
+
position: 'start',
|
|
20
|
+
subjectDrop: true,
|
|
21
|
+
},
|
|
22
|
+
references: {
|
|
23
|
+
me: 'أنا', // "I/me" - first person
|
|
24
|
+
it: 'هو', // "it" (masculine)
|
|
25
|
+
you: 'أنت', // "you"
|
|
26
|
+
result: 'النتيجة',
|
|
27
|
+
event: 'الحدث',
|
|
28
|
+
target: 'الهدف',
|
|
29
|
+
body: 'الجسم',
|
|
30
|
+
},
|
|
31
|
+
possessive: {
|
|
32
|
+
marker: '', // No explicit marker - uses possessive pronouns
|
|
33
|
+
markerPosition: 'after-object',
|
|
34
|
+
usePossessiveAdjectives: true,
|
|
35
|
+
specialForms: {
|
|
36
|
+
// Arabic: "value لي" (value for-me) - possessive pronoun follows property
|
|
37
|
+
me: 'لي', // "for me" / "mine"
|
|
38
|
+
it: 'له', // "for it" / "its"
|
|
39
|
+
you: 'لك', // "for you" / "yours"
|
|
40
|
+
},
|
|
41
|
+
keywords: {
|
|
42
|
+
// "my" / "mine"
|
|
43
|
+
لي: 'me',
|
|
44
|
+
// "your" / "yours"
|
|
45
|
+
لك: 'you',
|
|
46
|
+
// "its/his/her"
|
|
47
|
+
له: 'it', // his/its (masculine)
|
|
48
|
+
لها: 'it', // her/its (feminine)
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
roleMarkers: {
|
|
52
|
+
destination: { primary: 'على', alternatives: ['في', 'إلى', 'ب'], position: 'before' },
|
|
53
|
+
source: { primary: 'من', position: 'before' },
|
|
54
|
+
patient: { primary: '', position: 'before' },
|
|
55
|
+
style: { primary: 'بـ', alternatives: ['باستخدام'], position: 'before' },
|
|
56
|
+
},
|
|
57
|
+
keywords: {
|
|
58
|
+
// Class/Attribute operations
|
|
59
|
+
toggle: { primary: 'بدّل', alternatives: ['بدل', 'غيّر', 'غير'], normalized: 'toggle' },
|
|
60
|
+
add: { primary: 'أضف', alternatives: ['اضف', 'زِد'], normalized: 'add' },
|
|
61
|
+
remove: { primary: 'احذف', alternatives: ['أزل', 'امسح'], normalized: 'remove' },
|
|
62
|
+
// Content operations
|
|
63
|
+
put: { primary: 'ضع', alternatives: ['اجعل'], normalized: 'put' },
|
|
64
|
+
append: { primary: 'ألحق', normalized: 'append' },
|
|
65
|
+
prepend: { primary: 'سبق', normalized: 'prepend' },
|
|
66
|
+
take: { primary: 'خذ', alternatives: ['احصل'], normalized: 'take' },
|
|
67
|
+
make: { primary: 'اصنع', alternatives: ['أنشئ'], normalized: 'make' },
|
|
68
|
+
clone: { primary: 'استنسخ', alternatives: ['انسخ'], normalized: 'clone' },
|
|
69
|
+
swap: { primary: 'استبدل', alternatives: ['تبادل'], normalized: 'swap' },
|
|
70
|
+
morph: { primary: 'حوّل', alternatives: ['غيّر'], normalized: 'morph' },
|
|
71
|
+
// Variable operations
|
|
72
|
+
set: { primary: 'اضبط', alternatives: ['عيّن', 'حدد'], normalized: 'set' },
|
|
73
|
+
get: { primary: 'احصل', alternatives: ['خذ'], normalized: 'get' },
|
|
74
|
+
increment: { primary: 'زِد', alternatives: ['زد', 'ارفع'], normalized: 'increment' },
|
|
75
|
+
decrement: { primary: 'أنقص', alternatives: ['انقص', 'قلل'], normalized: 'decrement' },
|
|
76
|
+
log: { primary: 'سجل', normalized: 'log' },
|
|
77
|
+
// Visibility
|
|
78
|
+
show: { primary: 'اظهر', alternatives: ['أظهر', 'اعرض'], normalized: 'show' },
|
|
79
|
+
hide: { primary: 'اخف', alternatives: ['أخفِ', 'اخفي'], normalized: 'hide' },
|
|
80
|
+
transition: { primary: 'انتقال', alternatives: ['انتقل'], normalized: 'transition' },
|
|
81
|
+
// Events
|
|
82
|
+
on: { primary: 'على', alternatives: ['عند', 'لدى', 'حين'], normalized: 'on' },
|
|
83
|
+
trigger: { primary: 'تشغيل', alternatives: ['أطلق', 'فعّل'], normalized: 'trigger' },
|
|
84
|
+
send: { primary: 'أرسل', normalized: 'send' },
|
|
85
|
+
// DOM focus
|
|
86
|
+
focus: { primary: 'تركيز', alternatives: ['ركز'], normalized: 'focus' },
|
|
87
|
+
blur: { primary: 'ضبابية', alternatives: ['شوش'], normalized: 'blur' },
|
|
88
|
+
// Navigation
|
|
89
|
+
go: { primary: 'اذهب', alternatives: ['انتقل'], normalized: 'go' },
|
|
90
|
+
// Async
|
|
91
|
+
wait: { primary: 'انتظر', normalized: 'wait' },
|
|
92
|
+
fetch: { primary: 'احضر', alternatives: ['جلب'], normalized: 'fetch' },
|
|
93
|
+
settle: { primary: 'استقر', normalized: 'settle' },
|
|
94
|
+
// Control flow
|
|
95
|
+
if: { primary: 'إذا', normalized: 'if' },
|
|
96
|
+
when: { primary: 'عندما', normalized: 'when' },
|
|
97
|
+
where: { primary: 'أين', normalized: 'where' },
|
|
98
|
+
else: { primary: 'وإلا', alternatives: ['خلاف ذلك'], normalized: 'else' },
|
|
99
|
+
repeat: { primary: 'كرر', normalized: 'repeat' },
|
|
100
|
+
for: { primary: 'لكل', normalized: 'for' },
|
|
101
|
+
while: { primary: 'بينما', normalized: 'while' },
|
|
102
|
+
continue: { primary: 'واصل', normalized: 'continue' },
|
|
103
|
+
halt: { primary: 'أوقف', alternatives: ['توقف'], normalized: 'halt' },
|
|
104
|
+
throw: { primary: 'ارم', alternatives: ['ارمِ'], normalized: 'throw' },
|
|
105
|
+
call: { primary: 'استدع', alternatives: ['نادِ'], normalized: 'call' },
|
|
106
|
+
return: { primary: 'ارجع', alternatives: ['عُد'], normalized: 'return' },
|
|
107
|
+
then: { primary: 'ثم', alternatives: ['بعدها', 'ثمّ'], normalized: 'then' },
|
|
108
|
+
and: { primary: 'وأيضاً', alternatives: ['أيضاً'], normalized: 'and' },
|
|
109
|
+
end: { primary: 'نهاية', alternatives: ['انتهى', 'آخر'], normalized: 'end' },
|
|
110
|
+
// Advanced
|
|
111
|
+
js: { primary: 'جافاسكربت', alternatives: ['js'], normalized: 'js' },
|
|
112
|
+
async: { primary: 'متزامن', normalized: 'async' },
|
|
113
|
+
tell: { primary: 'أخبر', normalized: 'tell' },
|
|
114
|
+
default: { primary: 'افتراضي', normalized: 'default' },
|
|
115
|
+
init: { primary: 'تهيئة', alternatives: ['بدء'], normalized: 'init' },
|
|
116
|
+
behavior: { primary: 'سلوك', normalized: 'behavior' },
|
|
117
|
+
install: { primary: 'تثبيت', alternatives: ['ثبّت'], normalized: 'install' },
|
|
118
|
+
measure: { primary: 'قياس', alternatives: ['قِس'], normalized: 'measure' },
|
|
119
|
+
// Modifiers
|
|
120
|
+
into: { primary: 'في', alternatives: ['إلى'], normalized: 'into' },
|
|
121
|
+
before: { primary: 'قبل', normalized: 'before' },
|
|
122
|
+
after: { primary: 'بعد', normalized: 'after' },
|
|
123
|
+
// Event modifiers (for repeat until event)
|
|
124
|
+
until: { primary: 'حتى', normalized: 'until' },
|
|
125
|
+
event: { primary: 'حدث', normalized: 'event' },
|
|
126
|
+
from: { primary: 'من', normalized: 'from' },
|
|
127
|
+
},
|
|
128
|
+
tokenization: {
|
|
129
|
+
prefixes: ['ال', 'و', 'ف', 'ب', 'ك', 'ل'],
|
|
130
|
+
},
|
|
131
|
+
};
|