From a2a0e79675131237223cca31b34dcb19312c718e Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 13 Feb 2025 16:28:35 -0600 Subject: [PATCH] feat(core): convert abnf to peggy grammar - convert each .abnf to a .pegjs file Fixes: #13175 --- developer/src/kmc-ldml/.gitignore | 1 + developer/src/kmc-ldml/build.sh | 18 +++- developer/src/kmc-ldml/package.json | 2 + developer/src/kmc-ldml/src/util/abnf/abnf.ts | 0 package-lock.json | 86 ++++++++++++++++++++ 5 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 developer/src/kmc-ldml/.gitignore create mode 100644 developer/src/kmc-ldml/src/util/abnf/abnf.ts diff --git a/developer/src/kmc-ldml/.gitignore b/developer/src/kmc-ldml/.gitignore new file mode 100644 index 00000000000..c27c0f4e3bf --- /dev/null +++ b/developer/src/kmc-ldml/.gitignore @@ -0,0 +1 @@ +src/util/abnf/*.pegjs diff --git a/developer/src/kmc-ldml/build.sh b/developer/src/kmc-ldml/build.sh index a961fea6fdc..abd213e7c40 100755 --- a/developer/src/kmc-ldml/build.sh +++ b/developer/src/kmc-ldml/build.sh @@ -9,6 +9,8 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" ## END STANDARD BUILD SCRIPT INCLUDE . "$KEYMAN_ROOT/resources/shellHelperFunctions.sh" +# for CLDR version +. "$KEYMAN_ROOT/core/include/ldml/keyman_core_ldml.sh" builder_describe "Keyman kmc Keyboard Compiler module" \ "@/common/web/keyman-version" \ @@ -34,17 +36,31 @@ builder_describe_outputs \ builder_parse "$@" function do_clean() { - rm -rf ./build/ ./tsconfig.tsbuildinfo + rm -rf ./build/ ./tsconfig.tsbuildinfo ./src/util/abnf/*.pegjs } function do_configure() { verify_npm_setup + do_build_abnf } function do_build() { npm run build } +function do_build_abnf() { + ABNF_SRC="$KEYMAN_ROOT/resources/standards-data/ldml-keyboards/$LDML_CLDR_VERSION_LATEST/abnf" + for file in ${ABNF_SRC}/*.abnf; do + base=$(basename "$file" .abnf) + peg="$base.pegjs" + outfile="./src/util/abnf/$peg" + if [ ! -f "$outfile" ]; then + printf "${COLOR_GREY}abnf_gen ${COLOR_PURPLE}${base}.abnf -> ${peg}${COLOR_RESET}" + npx -p abnf abnf_gen "$file" -o "$outfile" + fi + done +} + function do_build_fixtures() { # Build basic.kmx and emit its checksum mkdir -p ./build/test/fixtures diff --git a/developer/src/kmc-ldml/package.json b/developer/src/kmc-ldml/package.json index cecbc8e15b8..08708b64cc5 100644 --- a/developer/src/kmc-ldml/package.json +++ b/developer/src/kmc-ldml/package.json @@ -29,6 +29,7 @@ "@keymanapp/keyman-version": "*", "@keymanapp/kmc-kmn": "*", "@keymanapp/ldml-keyboard-constants": "*", + "peggy": "^4.2.0", "semver": "^7.5.4" }, "devDependencies": { @@ -38,6 +39,7 @@ "@types/mocha": "^5.2.7", "@types/node": "^20.4.1", "@types/semver": "^7.3.12", + "abnf": "^4.3.1", "c8": "^7.12.0", "chalk": "^2.4.2", "common-tags": "^1.8.2", diff --git a/developer/src/kmc-ldml/src/util/abnf/abnf.ts b/developer/src/kmc-ldml/src/util/abnf/abnf.ts new file mode 100644 index 00000000000..e69de29bb2d diff --git a/package-lock.json b/package-lock.json index 0528b2c8145..012a3ea53bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1281,6 +1281,7 @@ "@keymanapp/keyman-version": "*", "@keymanapp/kmc-kmn": "*", "@keymanapp/ldml-keyboard-constants": "*", + "peggy": "^4.2.0", "semver": "^7.5.4" }, "devDependencies": { @@ -1290,6 +1291,7 @@ "@types/mocha": "^5.2.7", "@types/node": "^20.4.1", "@types/semver": "^7.3.12", + "abnf": "^4.3.1", "c8": "^7.12.0", "chalk": "^2.4.2", "common-tags": "^1.8.2", @@ -3658,6 +3660,28 @@ "@octokit/openapi-types": "^11.2.0" } }, + "node_modules/@peggyjs/from-mem": { + "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==", + "dependencies": { + "semver": "7.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@peggyjs/from-mem/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -5765,6 +5789,35 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/abnf": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/abnf/-/abnf-4.3.1.tgz", + "integrity": "sha512-j4A8wWqKqkcSjx5xFESo9GtW2EUvlUZutcWB1knhxSP9kaXJ/YwL0g6dvMhHRjCPCNsIWwNGoKMHzPwemSpCvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "commander": "^13.0.0", + "peggy": "^4.2.0" + }, + "bin": { + "abnf_ast": "bin/abnf_ast.js", + "abnf_check": "bin/abnf_check.js", + "abnf_gen": "bin/abnf_gen.js", + "abnf_test": "bin/abnf_test.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/abnf/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/accepts": { "version": "1.3.8", "license": "MIT", @@ -12376,6 +12429,31 @@ "through": "~2.3" } }, + "node_modules/peggy": { + "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==", + "license": "MIT", + "dependencies": { + "@peggyjs/from-mem": "1.3.5", + "commander": "^12.1.0", + "source-map-generator": "0.8.0" + }, + "bin": { + "peggy": "bin/peggy.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/peggy/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, "node_modules/pend": { "version": "1.2.0", "license": "MIT" @@ -13533,6 +13611,14 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-generator": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/source-map-generator/-/source-map-generator-0.8.0.tgz", + "integrity": "sha512-psgxdGMwl5MZM9S3FWee4EgsEaIjahYV5AzGnwUvPhWeITz/j6rKpysQHlQ4USdxvINlb8lKfWGIXwfkrgtqkA==", + "engines": { + "node": ">= 10" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",