feat(developer): use peggy grammar in from/to transform

Fixes: #13175
This commit is contained in:
Steven R. Loomis 2025-02-13 16:47:12 -06:00
parent a2a0e79675
commit 53b20e6adc
8 changed files with 41 additions and 3 deletions

View file

@ -1 +1,2 @@
src/util/abnf/*.pegjs
src/util/abnf/*.js

View file

@ -54,9 +54,12 @@ function do_build_abnf() {
base=$(basename "$file" .abnf)
peg="$base.pegjs"
outfile="./src/util/abnf/$peg"
outjs="./src/util/abnf/$base.js"
if [ ! -f "$outfile" ]; then
printf "${COLOR_GREY}abnf_gen ${COLOR_PURPLE}${base}.abnf -> ${peg}${COLOR_RESET}"
npx -p abnf abnf_gen "$file" -o "$outfile"
printf "${COLOR_GREY}abnf_gen ${COLOR_PURPLE}${peg} -> ${base}.js${COLOR_RESET}"
npx peggy "$outfile" -o "$outjs" --format es --dts
fi
done
}

View file

@ -29,7 +29,6 @@
"@keymanapp/keyman-version": "*",
"@keymanapp/kmc-kmn": "*",
"@keymanapp/ldml-keyboard-constants": "*",
"peggy": "^4.2.0",
"semver": "^7.5.4"
},
"devDependencies": {
@ -44,6 +43,7 @@
"chalk": "^2.4.2",
"common-tags": "^1.8.2",
"mocha": "^8.4.0",
"peggy": "^4.2.0",
"typescript": "^5.4.5"
},
"mocha": {

View file

@ -258,4 +258,9 @@ export class LdmlCompilerMessages {
\`<transform from="($[fromSet])" to="$[1:toSet]"/>\`.
`);
static ERROR_UnparseableTransformTo = SevErrorTransform | 0x06;
static Error_UnparseableTransformTo = (o: { to: string, message: string }) =>
m(this.ERROR_UnparseableTransformTo, `Invalid transform to="${def(o.to)}": "${def(o.message)}"`);
}

View file

@ -17,6 +17,7 @@ import LKTransforms = LDMLKeyboard.LKTransforms;
import { verifyValidAndUnique } from "../util/util.js";
import { LdmlCompilerMessages } from "./ldml-compiler-messages.js";
import { Substitutions, SubstitutionUse } from "./substitution-tracker.js";
import { transform_from_parse, transform_to_parse } from "../util/abnf/abnf.js";
type TransformCompilerType = 'simple' | 'backspace';
@ -144,8 +145,24 @@ export abstract class TransformCompiler<T extends TransformCompilerType, TranBas
let cookedFrom = transform.from;
// check for incorrect \uXXXX escapes. Do this before substituting markers or sets.
// We run this first because it's more helpful than the ABNF.
cookedFrom = this.checkEscapes(cookedFrom); // check for \uXXXX escapes before normalizing
// run the parser here next
try {
if (cookedFrom != null) {
transform_from_parse(cookedFrom);
}
} catch (e) {
this.callbacks.reportMessage(LdmlCompilerMessages.Error_UnparseableTransformFrom({ from: cookedFrom, message: e.toString() }));
}
try {
transform_to_parse(transform.to || '');
} catch (e) {
this.callbacks.reportMessage(LdmlCompilerMessages.Error_UnparseableTransformTo({ to: transform.to || '', message: e.toString() }));
}
cookedFrom = sections.vars.substituteStrings(cookedFrom, sections, true);
const mapFrom = LdmlKeyboardTypes.VariableParser.CAPTURE_SET_REFERENCE.exec(cookedFrom);
const mapTo = LdmlKeyboardTypes.VariableParser.MAPPED_SET_REFERENCE.exec(transform.to || '');

View file

@ -0,0 +1,6 @@
/**
* Re-export the generated parsers.
*/
export { parse as transform_to_parse } from './transform-to-required.js';
export { parse as transform_from_parse } from './transform-from-required.js';

View file

@ -7,7 +7,8 @@
"baseUrl": ".",
},
"include": [
"src/**/*.ts"
"src/**/*.ts",
"src/util/abnf/*.js",
],
"references": [
{ "path": "../../../common/web/keyman-version" },

7
package-lock.json generated
View file

@ -1281,7 +1281,6 @@
"@keymanapp/keyman-version": "*",
"@keymanapp/kmc-kmn": "*",
"@keymanapp/ldml-keyboard-constants": "*",
"peggy": "^4.2.0",
"semver": "^7.5.4"
},
"devDependencies": {
@ -1296,6 +1295,7 @@
"chalk": "^2.4.2",
"common-tags": "^1.8.2",
"mocha": "^8.4.0",
"peggy": "^4.2.0",
"typescript": "^5.4.5"
}
},
@ -3664,6 +3664,7 @@
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@peggyjs/from-mem/-/from-mem-1.3.5.tgz",
"integrity": "sha512-oRyzXE7nirAn+5yYjCdWQHg3EG2XXcYRoYNOK8Quqnmm+9FyK/2YWVunwudlYl++M3xY+gIAdf0vAYS+p0nKfQ==",
"dev": true,
"dependencies": {
"semver": "7.6.3"
},
@ -3675,6 +3676,7 @@
"version": "7.6.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
},
@ -12433,6 +12435,7 @@
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/peggy/-/peggy-4.2.0.tgz",
"integrity": "sha512-ZjzyJYY8NqW8JOZr2PbS/J0UH/hnfGALxSDsBUVQg5Y/I+ZaPuGeBJ7EclUX2RvWjhlsi4pnuL1C/K/3u+cDeg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@peggyjs/from-mem": "1.3.5",
@ -12450,6 +12453,7 @@
"version": "12.1.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
"integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
"dev": true,
"engines": {
"node": ">=18"
}
@ -13615,6 +13619,7 @@
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/source-map-generator/-/source-map-generator-0.8.0.tgz",
"integrity": "sha512-psgxdGMwl5MZM9S3FWee4EgsEaIjahYV5AzGnwUvPhWeITz/j6rKpysQHlQ4USdxvINlb8lKfWGIXwfkrgtqkA==",
"dev": true,
"engines": {
"node": ">= 10"
}