From 0575ebb7e5a2c5bd5bfd698d42e3ba0ec14f5bbf Mon Sep 17 00:00:00 2001 From: kavitharaju Date: Wed, 25 Sep 2024 22:24:35 +0530 Subject: [PATCH 1/5] Handle error reporting and use of ignore-errors in node module properly --- node-usfm-parser/src/usfmParser.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/node-usfm-parser/src/usfmParser.js b/node-usfm-parser/src/usfmParser.js index dd01b7d2..3e794d3e 100644 --- a/node-usfm-parser/src/usfmParser.js +++ b/node-usfm-parser/src/usfmParser.js @@ -60,8 +60,14 @@ Only one of USFM, USJ or USX is supported in one object.`) return this.syntaxTree.toString(); } - toUSJ() { - this.usj = this.convertUSFMToUSJ(); + toUSJ(excludeMarkers = null, + includeMarkers = null, + ignoreErrors = false, + combineTexts = true,) { + this.usj = this.convertUSFMToUSJ(excludeMarkers = excludeMarkers, + includeMarkers = includeMarkers, + ignoreErrors = ignoreErrors, + combineTexts = combineTexts,); return this.usj; } @@ -128,14 +134,13 @@ Only one of USFM, USJ or USX is supported in one object.`) return outputUSFM; } - convertUSFMToUSJ({ + convertUSFMToUSJ( excludeMarkers = null, includeMarkers = null, ignoreErrors = false, - combineTexts = true, - } = {}) { + combineTexts = true,) { if (!ignoreErrors && this.errors.length > 0) { - let errorString = this.errors.map((err) => err.join(":")).join("\n\t"); + let errorString = this.errors.join("\n\t"); throw new Error( `Errors present:\n\t${errorString}\nUse ignoreErrors = true to generate output despite errors.`, ); @@ -153,7 +158,7 @@ Only one of USFM, USJ or USX is supported in one object.`) } catch (err) { let message = "Unable to do the conversion. "; if (this.errors) { - let errorString = this.errors.map((err) => err.join(":")).join("\n\t"); + let errorString = this.errors.join("\n\t"); message += `Could be due to an error in the USFM\n\t${errorString}`; } else { From f444e8ae2425ae1863c4a014d40ad14777276b08 Mon Sep 17 00:00:00 2001 From: kavitharaju Date: Wed, 25 Sep 2024 22:25:51 +0530 Subject: [PATCH 2/5] Prepare for alpha.9 release of node and web modules for \s5 support with ignore errors --- node-usfm-parser/package.json | 2 +- web-usfm-parser/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/node-usfm-parser/package.json b/node-usfm-parser/package.json index c8e5920f..a4c5111a 100644 --- a/node-usfm-parser/package.json +++ b/node-usfm-parser/package.json @@ -1,6 +1,6 @@ { "name": "usfm-grammar", - "version": "3.0.0-alpha.8", + "version": "3.0.0-alpha.9", "description": "Parser using tree-sitter-usfm3, to convert usfm to usj format.", "main": "./dist/cjs/index.cjs", "module": "./dist/es/index.mjs", diff --git a/web-usfm-parser/package.json b/web-usfm-parser/package.json index 2eb46794..2e61255f 100644 --- a/web-usfm-parser/package.json +++ b/web-usfm-parser/package.json @@ -1,6 +1,6 @@ { "name": "usfm-grammar-web", - "version": "3.0.0-alpha.2", + "version": "3.0.0-alpha.9", "description": "Parser using tree-sitter-usfm3, to convert usfm to usj format.", "type": "module", "module": "dist/bundle.mjs", From df2721d54557a9b3ba21b657ca4feec3dd0a55fc Mon Sep 17 00:00:00 2001 From: kavitharaju Date: Wed, 25 Sep 2024 22:28:10 +0530 Subject: [PATCH 3/5] Make API changes and do error handling in web, similar to python and node packages --- web-usfm-parser/src/index.js | 1 - web-usfm-parser/src/usfmParser.js | 119 ++++++++++++++++++++++-------- web-usfm-parser/test.js | 25 +++++-- 3 files changed, 107 insertions(+), 38 deletions(-) diff --git a/web-usfm-parser/src/index.js b/web-usfm-parser/src/index.js index 5875da88..7891749d 100644 --- a/web-usfm-parser/src/index.js +++ b/web-usfm-parser/src/index.js @@ -1,4 +1,3 @@ import USFMParser from "./usfmParser.js"; -console.log("COmes in index.js"); export { USFMParser }; \ No newline at end of file diff --git a/web-usfm-parser/src/usfmParser.js b/web-usfm-parser/src/usfmParser.js index a4a4d756..df64cb0c 100644 --- a/web-usfm-parser/src/usfmParser.js +++ b/web-usfm-parser/src/usfmParser.js @@ -18,12 +18,47 @@ class USFMParser { USFMParser.language = await Parser.Language.load(grammarPath); } - constructor() { + constructor(usfmString=null, fromUsj=null, fromUsx=null) { + let inputsGiven = 0 + if (usfmString !== null) { + inputsGiven += 1 + } + if (fromUsj !== null) { + inputsGiven += 1 + } + if (fromUsx !== null) { + inputsGiven += 1 + } + + if (inputsGiven > 1) { + throw new Error(`Found more than one input! +Only one of USFM, USJ or USX is supported in one object.`) + } + if (inputsGiven === 0) { + throw Error("Missing input! Either USFM, USJ or USX is to be provided.") + } + + if (usfmString !== null) { + if (typeof usfmString !== "string" || usfmString === null) { + throw new Error("Invalid input for USFM. Expected a string."); + } + this.usfm = usfmString; + } else if(fromUsj !== null) { + this.usj = fromUsj; + this.usfm = this.convertUSJToUSFM() + } else if (fromUsx !== null) { + this.usx = fromUsx; + // this.usfm = this.convertUSXToUSFM() + } this.parser = null; - this.usfm = null; - this.usj = null; + this.initializeParser(); + this.syntaxTree = null; + this.errors = []; + this.warnings = []; + this.parseUSFM(); } + initializeParser() { if (!USFMParser.language) { throw new Error( @@ -32,18 +67,23 @@ class USFMParser { } this.parser = new Parser(); this.parser.setLanguage(USFMParser.language); + this.parserOptions = Parser.Options = { + bufferSize: 1024 * 1024, + }; } - usfmToUsj(usfmString) { - if (typeof usfmString !== "string" || usfmString === null) { - throw new Error("Invalid input for USFM. Expected a string."); - } - if (!this.parser) { - this.initializeParser(); - } - this.usfm = usfmString; - this.parseUSFM(); - this.usj = this.convertUSFMToUSJ(); + toSyntaxTree() { + return this.syntaxTree.toString(); + } + + toUSJ(excludeMarkers = null, + includeMarkers = null, + ignoreErrors = false, + combineTexts = true,) { + this.usj = this.convertUSFMToUSJ(excludeMarkers = excludeMarkers, + includeMarkers = includeMarkers, + ignoreErrors = ignoreErrors, + combineTexts = combineTexts,); return this.usj; } @@ -62,12 +102,21 @@ class USFMParser { parseUSFM() { let tree = null; try { - tree = this.parser.parse(this.usfm); + if (this.usfm.length > 25000) { + tree = this.parser.parse(this.usfm, null, this.parserOptions); + } + else { + tree = this.parser.parse(this.usfm); + } } catch (err) { - console.log(err.toString()); + throw err; + // console.log("Error in parser.parse()"); + // console.log(err.toString()); + // console.log(this.usfm); } - const error = this.checkForErrors(tree); - if (error) throw error; + this.checkForErrors(tree); + this.checkforMissing(tree.rootNode); + // if (error) throw error; this.syntaxTree = tree.rootNode; } @@ -85,46 +134,52 @@ class USFMParser { return null; } + checkforMissing(node) { + for (let n of node.children) { + if (n.isMissing){ + this.errors.push( + `At ${n.startPosition.row+1}:${n.startPosition.column}, Error: Missing ${n.type}`) + } + this.checkforMissing(n); + } + } + convertUSJToUSFM() { const outputUSFM = new USFMGenerator().usjToUsfm(this.usj); // Simulated conversion return outputUSFM; } - convertUSFMToUSJ({ + convertUSFMToUSJ( excludeMarkers = null, includeMarkers = null, ignoreErrors = false, combineTexts = true, - } = {}) { - if (!ignoreErrors && this.errors) { - let errorString = this.errors.map((err) => err.join(":")).join("\n\t"); + ) { + if (!ignoreErrors && this.errors.length > 0) { + let errorString = this.errors.join("\n\t"); throw new Error( `Errors present:\n\t${errorString}\nUse ignoreErrors = true to generate output despite errors.`, ); } - let jsonRootObj = { - type: "USJ", - version: "0.2.0", - content: [], - }; - let outputUSJ; try { let usjGenerator = new USJGenerator( USFMParser.language, - this.usfm, - jsonRootObj, + this.usfm ); - usjGenerator.nodeToUSJ(this.syntaxTree, jsonRootObj); + usjGenerator.nodeToUSJ(this.syntaxTree, usjGenerator.jsonRootObj); outputUSJ = usjGenerator.jsonRootObj; } catch (err) { let message = "Unable to do the conversion. "; if (this.errors) { - let errorString = this.errors.map((err) => err.join(":")).join("\n\t"); + let errorString = this.errors.join("\n\t"); message += `Could be due to an error in the USFM\n\t${errorString}`; } - return null; + else { + message = err.message; + } + return {error: message}; } if (includeMarkers) { diff --git a/web-usfm-parser/test.js b/web-usfm-parser/test.js index c24a4ea7..13df0b41 100644 --- a/web-usfm-parser/test.js +++ b/web-usfm-parser/test.js @@ -1,11 +1,26 @@ import {USFMParser} from './src/index.js'; +import { readFile } from 'fs/promises'; (async () => { await USFMParser.init("tree-sitter-usfm.wasm", "tree-sitter.wasm"); - const usfmParser = new USFMParser(); - const output = usfmParser.usfmToUsj('\\id GEN\n\\c 1\n\\p\n\\v 1 In the begining..\\v 2 more text'); - console.log({ output }); - const usfm = usfmParser.usjToUsfm(output); - console.log({ usfm }); + // await USFMParser.init(); + // const usfmParser = new USFMParser('\\id GEN\n\\c 1\n\\p\n\\v 1 In the begining..\\v 2 more text'); + // const output = usfmParser.toUSJ(); + // console.log({ output }); + + // const usfmParser2 = new USFMParser(null, output); + // const output2 = usfmParser.usfm; + // console.log({ output2 }); + + const filePath = "../tests/usfmjsTests/missing_verses/origin.usfm"; + const content = await readFile(filePath, 'utf-8'); // Specify encoding + console.log(content); + + await USFMParser.init("tree-sitter-usfm.wasm", "tree-sitter.wasm"); + const usfmParser = new USFMParser(content); + const output = usfmParser.toUSJ(null, null, true); + console.log({output}) + + })(); From dafa5a6142a191f9b7658b053cf987467c294b57 Mon Sep 17 00:00:00 2001 From: kavitharaju Date: Wed, 25 Sep 2024 22:29:34 +0530 Subject: [PATCH 4/5] Change documentations corresponding to web module usage and development --- docs/Dev_notes.md | 1 + tree-sitter-usfm3/package-lock.json | 552 +++++++++++++++++++++++++++- web-usfm-parser/README.md | 24 +- 3 files changed, 550 insertions(+), 27 deletions(-) diff --git a/docs/Dev_notes.md b/docs/Dev_notes.md index b8ac58bc..0a4ab0db 100644 --- a/docs/Dev_notes.md +++ b/docs/Dev_notes.md @@ -56,6 +56,7 @@ First compile the grammar and get the wasm file cd tree-sitter-usfm3 export PATH=$PATH:./node_modules/.bin tree-sitter generate +tree-sitter build --wasm cp tree-sitter-usfm.wasm ../js-usfm-parser/ cd .. ``` diff --git a/tree-sitter-usfm3/package-lock.json b/tree-sitter-usfm3/package-lock.json index fb732afc..7d7f7d97 100644 --- a/tree-sitter-usfm3/package-lock.json +++ b/tree-sitter-usfm3/package-lock.json @@ -7,28 +7,172 @@ "": { "name": "tree-sitter-usfm3", "version": "3.0.0-beta.10", + "hasInstallScript": true, "license": "MIT License", "dependencies": { - "nan": "^2.15.0", + "node-addon-api": "^7.1.0", + "node-gyp-build": "^4.8.0", "tree-sitter": "^0.21.1" }, "devDependencies": { + "prebuildify": "^6.0.0", "tree-sitter-cli": "^0.22.6" + }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } } }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/node-addon-api": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.0.0.tgz", - "integrity": "sha512-ipO7rsHEBqa9STO5C5T10fj732ml+5kLN1cAG8/jdHd56ldQeGj3Q7+scUS+VHK/qy1zLEwC4wMK5+yM0btPvw==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.67.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", + "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, "engines": { - "node": "^18 || ^20 || >= 21" + "node": ">=10" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, "node_modules/node-gyp-build": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", @@ -39,6 +183,157 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/prebuildify": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/prebuildify/-/prebuildify-6.0.1.tgz", + "integrity": "sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "mkdirp-classic": "^0.5.3", + "node-abi": "^3.3.0", + "npm-run-path": "^3.1.0", + "pump": "^3.0.0", + "tar-fs": "^2.1.0" + }, + "bin": { + "prebuildify": "bin.js" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tree-sitter": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", @@ -58,24 +353,228 @@ "bin": { "tree-sitter": "cli.js" } + }, + "node_modules/tree-sitter/node_modules/node-addon-api": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.1.0.tgz", + "integrity": "sha512-yBY+qqWSv3dWKGODD6OGE6GnTX7Q2r+4+DfpqxHSHh8x0B4EKP9+wVGLS6U/AM1vxSNNmUEuIV5EGhYwPpfOwQ==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" } }, "dependencies": { - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node-abi": { + "version": "3.67.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", + "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } }, "node-addon-api": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.0.0.tgz", - "integrity": "sha512-ipO7rsHEBqa9STO5C5T10fj732ml+5kLN1cAG8/jdHd56ldQeGj3Q7+scUS+VHK/qy1zLEwC4wMK5+yM0btPvw==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" }, "node-gyp-build": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==" }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "prebuildify": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/prebuildify/-/prebuildify-6.0.1.tgz", + "integrity": "sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "mkdirp-classic": "^0.5.3", + "node-abi": "^3.3.0", + "npm-run-path": "^3.1.0", + "pump": "^3.0.0", + "tar-fs": "^2.1.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "tree-sitter": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", @@ -83,6 +582,13 @@ "requires": { "node-addon-api": "^8.0.0", "node-gyp-build": "^4.8.0" + }, + "dependencies": { + "node-addon-api": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.1.0.tgz", + "integrity": "sha512-yBY+qqWSv3dWKGODD6OGE6GnTX7Q2r+4+DfpqxHSHh8x0B4EKP9+wVGLS6U/AM1vxSNNmUEuIV5EGhYwPpfOwQ==" + } } }, "tree-sitter-cli": { @@ -90,6 +596,18 @@ "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.22.6.tgz", "integrity": "sha512-s7mYOJXi8sIFkt/nLJSqlYZP96VmKTc3BAwIX0rrrlRxWjWuCwixFqwzxWZBQz4R8Hx01iP7z3cT3ih58BUmZQ==", "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true } } } diff --git a/web-usfm-parser/README.md b/web-usfm-parser/README.md index 5a291e51..65c72f32 100644 --- a/web-usfm-parser/README.md +++ b/web-usfm-parser/README.md @@ -30,10 +30,12 @@ function App() { }, []); const calculateValue = async () => { - const usfmParser = new USFMParser(); - const output = await usfmParser.usfmToUsj('\\id GEN\n\\c 1\n\\p\n\\v 1 In the begining..\\v 2 more text'); + const usfmParser = new USFMParser('\\id GEN\n\\c 1\n\\p\n\\v 1 In the begining..\\v 2 more text'); + const output = usfmParser.toUSJ(); setResult(JSON.stringify(output)); - const usfm = usfmParser.usjToUsfm(output); + + const usfmParser2 = new USFMParser(null, output) //initialse from USJ + const usfm = usfmParser2.usfm; setResult2(usfm); }; @@ -60,10 +62,12 @@ It can be used directly in the HTML script tag too. (async () => { await USFMParser.init("https://cdn.jsdelivr.net/npm/usfm-grammar-web@3.0.0-alpha.2/tree-sitter-usfm.wasm", "https://cdn.jsdelivr.net/npm/usfm-grammar-web@3.0.0-alpha.2/tree-sitter.wasm"); - const usfmParser = new USFMParser() - const output = usfmParser.usfmToUsj('\\id GEN\n\\c 1\n\\p\n\\v 1 In the begining..\\v 2 more text') + const usfmParser = new USFMParser('\\id GEN\n\\c 1\n\\p\n\\v 1 In the begining..\\v 2 more text') + const output = usfmParser.toUSJ() console.log({ output }) - const usfm = usfmParser.usjToUsfm(output) + + const usfmParser2 = new USFMParser(null, output); + const usfm = usfmParser2.usfm; console.log({ usfm }) })(); @@ -77,19 +81,19 @@ If using from react, please refer the instructions for it [here](../docs/react-u ### `USFMParser.init()` Initializes the USFMParser. This function must be called before creating instances of `USFMParser`. And can take the grammar and the tree-sitter files (in wasm format) as arguments, that is included in the package. -### `USFMParser.usfmToUsj(usfmString: string): Object` +### `USFMParser.toUSJ(usfmString: string): Object` Converts a USFM string to a USJ object. - `usfmString`: The input USFM string. Returns: A JSON-like object representing the USJ. -### `USFMParser.usjToUsfm(usjObject: Object): string` -Converts a USJ object to a USFM string. +### `new USFMParser(null, usjObject: Object)` +Initialize a parser object from USJ and also converts it to USFM. - `usjObject`: The input USJ object. -Returns: The converted USFM string. +Returns: The parser object. To obtain the USFM generated from USJ use `parserObject.usfm`. ## Contributing Contributions are welcome! If you find any issues or have suggestions for improvements, feel free to open an issue or create a pull request on [GitHub](https://github.com/your-username/usfm-grammar). From 4010a7003150ea610b8cd076f401e6c983ef1778 Mon Sep 17 00:00:00 2001 From: kavitharaju Date: Wed, 25 Sep 2024 22:40:43 +0530 Subject: [PATCH 5/5] Update dev notes regarding node and web modules --- docs/Dev_notes.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/Dev_notes.md b/docs/Dev_notes.md index 0a4ab0db..208b22c4 100644 --- a/docs/Dev_notes.md +++ b/docs/Dev_notes.md @@ -49,7 +49,7 @@ pytest -k "not compare_usx_with_testsuite_samples and not testsuite_usx_with_rnc ``` -## How to build and publish JS module for local Development +## How to build and publish JS web module for local Development First compile the grammar and get the wasm file ```bash @@ -70,7 +70,9 @@ cp node_modules/web-tree-sitter/tree-sitter.wasm ./ ``` -Build the code base generating both cjs and esm versions of the same code base. This used parcel and its configs are in package.json(main, module, source, etc). Upon running the commands two folders `dist/cjs/` and `dist/esm` would be created. +### To publish the node and web modules + +Build the code base generating both cjs and esm versions of the same code base. This used parcel and its configs are in package.json(main, module, source, etc). These steps can be followed in both the node module directory and web module directory. ```bash rm -fr ./dist