pax_global_header00006660000000000000000000000064151437121670014521gustar00rootroot0000000000000052 comment=c6a8d268197dfd77dce690f18868d95aaae81820 node-sentencex-ts-0.1.13-ts/000077500000000000000000000000001514371216700155725ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/.github/000077500000000000000000000000001514371216700171325ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/.github/workflows/000077500000000000000000000000001514371216700211675ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/.github/workflows/ci.yml000066400000000000000000000004671514371216700223140ustar00rootroot00000000000000name: CI on: push: branches: [main] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: latest cache: npm - run: npm ci - run: npm test node-sentencex-ts-0.1.13-ts/.gitignore000066400000000000000000000000451514371216700175610ustar00rootroot00000000000000node_modules/ dist/ .DS_Store .idea/ node-sentencex-ts-0.1.13-ts/.prettierrc000066400000000000000000000001421514371216700177530ustar00rootroot00000000000000{ "tabWidth": 4, "singleQuote": true, "trailingComma": "all", "printWidth": 100 } node-sentencex-ts-0.1.13-ts/LICENSE000066400000000000000000000021501514371216700165750ustar00rootroot00000000000000MIT License Copyright (c) 2026 Abe Jellinek Based on sentencex Copyright (c) 2025 Santhosh Thottingal Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. node-sentencex-ts-0.1.13-ts/README.md000066400000000000000000000004271514371216700170540ustar00rootroot00000000000000# Sentence segmenter [sentencex](https://github.com/wikimedia/sentencex), but ported (back) from Rust to TypeScript, so it can be used on the web in environments where bundle size matters. ## Install ```shell npm install sentencex-ts ``` ## Build ```shell npm run build ``` node-sentencex-ts-0.1.13-ts/package-lock.json000066400000000000000000002200321514371216700210050ustar00rootroot00000000000000{ "name": "sentencex-ts", "version": "0.1.13-ts", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sentencex-ts", "version": "0.1.13-ts", "devDependencies": { "@types/node": "^25.2.3", "prettier": "^3.8.1", "typescript": "^5.7.0", "vite": "^6.0.0", "vite-plugin-dts": "^4.0.0", "vitest": "^3.0.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, "dependencies": { "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/types": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@esbuild/darwin-arm64": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "darwin" ], "engines": { "node": ">=18" } }, "node_modules/@isaacs/balanced-match": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", "dev": true, "engines": { "node": "20 || >=22" } }, "node_modules/@isaacs/brace-expansion": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz", "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==", "dev": true, "dependencies": { "@isaacs/balanced-match": "^4.0.1" }, "engines": { "node": "20 || >=22" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true }, "node_modules/@microsoft/api-extractor": { "version": "7.56.3", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.56.3.tgz", "integrity": "sha512-fRqok4aRNq5GpgGBv2fKlSSKbirPKTJ75vQefthB5x9dwt4Zz+AezUzdc1p/AG4wUBIgmhjcEwn/Rj+N4Wh4Mw==", "dev": true, "dependencies": { "@microsoft/api-extractor-model": "7.32.2", "@microsoft/tsdoc": "~0.16.0", "@microsoft/tsdoc-config": "~0.18.0", "@rushstack/node-core-library": "5.19.1", "@rushstack/rig-package": "0.6.0", "@rushstack/terminal": "0.21.0", "@rushstack/ts-command-line": "5.2.0", "diff": "~8.0.2", "lodash": "~4.17.23", "minimatch": "10.1.2", "resolve": "~1.22.1", "semver": "~7.5.4", "source-map": "~0.6.1", "typescript": "5.8.2" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { "version": "7.32.2", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.32.2.tgz", "integrity": "sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww==", "dev": true, "dependencies": { "@microsoft/tsdoc": "~0.16.0", "@microsoft/tsdoc-config": "~0.18.0", "@rushstack/node-core-library": "5.19.1" } }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { "version": "5.8.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=14.17" } }, "node_modules/@microsoft/tsdoc": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", "dev": true }, "node_modules/@microsoft/tsdoc-config": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.0.tgz", "integrity": "sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw==", "dev": true, "dependencies": { "@microsoft/tsdoc": "0.16.0", "ajv": "~8.12.0", "jju": "~1.4.0", "resolve": "~1.22.2" } }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.57.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rushstack/node-core-library": { "version": "5.19.1", "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz", "integrity": "sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==", "dev": true, "dependencies": { "ajv": "~8.13.0", "ajv-draft-04": "~1.0.0", "ajv-formats": "~3.0.1", "fs-extra": "~11.3.0", "import-lazy": "~4.0.0", "jju": "~1.4.0", "resolve": "~1.22.1", "semver": "~7.5.4" }, "peerDependencies": { "@types/node": "*" }, "peerDependenciesMeta": { "@types/node": { "optional": true } } }, "node_modules/@rushstack/node-core-library/node_modules/ajv": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.4.1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/@rushstack/problem-matcher": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", "dev": true, "peerDependencies": { "@types/node": "*" }, "peerDependenciesMeta": { "@types/node": { "optional": true } } }, "node_modules/@rushstack/rig-package": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", "dev": true, "dependencies": { "resolve": "~1.22.1", "strip-json-comments": "~3.1.1" } }, "node_modules/@rushstack/terminal": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.21.0.tgz", "integrity": "sha512-cLaI4HwCNYmknM5ns4G+drqdEB6q3dCPV423+d3TZeBusYSSm09+nR7CnhzJMjJqeRcdMAaLnrA4M/3xDz4R3w==", "dev": true, "dependencies": { "@rushstack/node-core-library": "5.19.1", "@rushstack/problem-matcher": "0.1.1", "supports-color": "~8.1.1" }, "peerDependencies": { "@types/node": "*" }, "peerDependenciesMeta": { "@types/node": { "optional": true } } }, "node_modules/@rushstack/ts-command-line": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.2.0.tgz", "integrity": "sha512-lYxCX0nDdkDtCkVpvF0m25ymf66SaMWuppbD6b7MdkIzvGXKBXNIVZlwBH/C0YfkanrupnICWf2n4z3AKSfaHw==", "dev": true, "dependencies": { "@rushstack/terminal": "0.21.0", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" } }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "node_modules/@types/node": { "version": "25.2.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", "dev": true, "dependencies": { "undici-types": "~7.16.0" } }, "node_modules/@vitest/expect": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { "optional": true }, "vite": { "optional": true } } }, "node_modules/@vitest/mocker/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "dependencies": { "@types/estree": "^1.0.0" } }, "node_modules/@vitest/pretty-format": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "dependencies": { "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "dependencies": { "tinyspy": "^4.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@volar/language-core": { "version": "2.4.28", "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", "dev": true, "dependencies": { "@volar/source-map": "2.4.28" } }, "node_modules/@volar/source-map": { "version": "2.4.28", "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", "dev": true }, "node_modules/@volar/typescript": { "version": "2.4.28", "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", "dev": true, "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "node_modules/@vue/compiler-core": { "version": "3.5.28", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.28.tgz", "integrity": "sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==", "dev": true, "dependencies": { "@babel/parser": "^7.29.0", "@vue/shared": "3.5.28", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { "version": "3.5.28", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.28.tgz", "integrity": "sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA==", "dev": true, "dependencies": { "@vue/compiler-core": "3.5.28", "@vue/shared": "3.5.28" } }, "node_modules/@vue/compiler-vue2": { "version": "2.7.16", "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", "dev": true, "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "node_modules/@vue/language-core": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", "dev": true, "dependencies": { "@volar/language-core": "~2.4.11", "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.5.0", "alien-signals": "^0.4.9", "minimatch": "^9.0.3", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@vue/language-core/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@vue/shared": { "version": "3.5.28", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.28.tgz", "integrity": "sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==", "dev": true }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ajv-draft-04": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", "dev": true, "peerDependencies": { "ajv": "^8.5.0" }, "peerDependenciesMeta": { "ajv": { "optional": true } } }, "node_modules/ajv-formats": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "dependencies": { "ajv": "^8.0.0" }, "peerDependencies": { "ajv": "^8.0.0" }, "peerDependenciesMeta": { "ajv": { "optional": true } } }, "node_modules/alien-signals": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", "dev": true }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/chai": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" }, "engines": { "node": ">=18" } }, "node_modules/check-error": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", "dev": true, "engines": { "node": ">= 16" } }, "node_modules/compare-versions": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", "dev": true }, "node_modules/confbox": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", "dev": true }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", "dev": true }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "dependencies": { "ms": "^2.1.3" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/diff": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/entities": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "dev": true, "engines": { "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/es-module-lexer": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true }, "node_modules/esbuild": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { "node": ">=18" }, "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" } }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, "node_modules/expect-type": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "engines": { "node": ">=12.0.0" } }, "node_modules/exsolve": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", "dev": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "engines": { "node": ">=12.0.0" }, "peerDependencies": { "picomatch": "^3 || ^4" }, "peerDependenciesMeta": { "picomatch": { "optional": true } } }, "node_modules/fs-extra": { "version": "11.3.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { "node": ">=14.14" } }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "bin": { "he": "bin/he" } }, "node_modules/import-lazy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "dependencies": { "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, "node_modules/js-tokens": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "node_modules/jsonfile": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/kolorist": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", "dev": true }, "node_modules/local-pkg": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", "dev": true, "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/lodash": { "version": "4.17.23", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "dev": true }, "node_modules/loupe": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/minimatch": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.2.tgz", "integrity": "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==", "dev": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.1" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mlly": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", "dev": true, "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "node_modules/mlly/node_modules/confbox": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", "dev": true }, "node_modules/mlly/node_modules/pkg-types": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/muggle-string": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "dev": true }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], "bin": { "nanoid": "bin/nanoid.cjs" }, "engines": { "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true }, "node_modules/pathval": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "engines": { "node": ">= 14.16" } }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pkg-types": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "dev": true, "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/prettier": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/quansync": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/antfu" }, { "type": "individual", "url": "https://github.com/sponsors/sxzz" } ] }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/rollup": { "version": "4.57.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "dev": true, "dependencies": { "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.57.1", "@rollup/rollup-android-arm64": "4.57.1", "@rollup/rollup-darwin-arm64": "4.57.1", "@rollup/rollup-darwin-x64": "4.57.1", "@rollup/rollup-freebsd-arm64": "4.57.1", "@rollup/rollup-freebsd-x64": "4.57.1", "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", "@rollup/rollup-linux-arm-musleabihf": "4.57.1", "@rollup/rollup-linux-arm64-gnu": "4.57.1", "@rollup/rollup-linux-arm64-musl": "4.57.1", "@rollup/rollup-linux-loong64-gnu": "4.57.1", "@rollup/rollup-linux-loong64-musl": "4.57.1", "@rollup/rollup-linux-ppc64-gnu": "4.57.1", "@rollup/rollup-linux-ppc64-musl": "4.57.1", "@rollup/rollup-linux-riscv64-gnu": "4.57.1", "@rollup/rollup-linux-riscv64-musl": "4.57.1", "@rollup/rollup-linux-s390x-gnu": "4.57.1", "@rollup/rollup-linux-x64-gnu": "4.57.1", "@rollup/rollup-linux-x64-musl": "4.57.1", "@rollup/rollup-openbsd-x64": "4.57.1", "@rollup/rollup-openharmony-arm64": "4.57.1", "@rollup/rollup-win32-arm64-msvc": "4.57.1", "@rollup/rollup-win32-ia32-msvc": "4.57.1", "@rollup/rollup-win32-x64-gnu": "4.57.1", "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" } }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, "node_modules/std-env": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "engines": { "node": ">=0.6.19" } }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-literal": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", "dev": true, "dependencies": { "js-tokens": "^9.0.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tinypool": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" } }, "node_modules/tinyrainbow": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "engines": { "node": ">=14.0.0" } }, "node_modules/tinyspy": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "engines": { "node": ">=14.0.0" } }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=14.17" } }, "node_modules/ufo": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "dev": true }, "node_modules/undici-types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { "punycode": "^2.1.0" } }, "node_modules/vite": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, "jiti": { "optional": true }, "less": { "optional": true }, "lightningcss": { "optional": true }, "sass": { "optional": true }, "sass-embedded": { "optional": true }, "stylus": { "optional": true }, "sugarss": { "optional": true }, "terser": { "optional": true }, "tsx": { "optional": true }, "yaml": { "optional": true } } }, "node_modules/vite-node": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" }, "engines": { "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/vite-plugin-dts": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", "dev": true, "dependencies": { "@microsoft/api-extractor": "^7.50.1", "@rollup/pluginutils": "^5.1.4", "@volar/typescript": "^2.4.11", "@vue/language-core": "2.2.0", "compare-versions": "^6.1.1", "debug": "^4.4.0", "kolorist": "^1.8.0", "local-pkg": "^1.0.0", "magic-string": "^0.30.17" }, "peerDependencies": { "typescript": "*", "vite": "*" }, "peerDependenciesMeta": { "vite": { "optional": true } } }, "node_modules/vitest": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "peerDependenciesMeta": { "@edge-runtime/vm": { "optional": true }, "@types/debug": { "optional": true }, "@types/node": { "optional": true }, "@vitest/browser": { "optional": true }, "@vitest/ui": { "optional": true }, "happy-dom": { "optional": true }, "jsdom": { "optional": true } } }, "node_modules/vscode-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" }, "engines": { "node": ">=8" } }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } } node-sentencex-ts-0.1.13-ts/package.json000066400000000000000000000016641514371216700200670ustar00rootroot00000000000000{ "name": "sentencex-ts", "version": "0.1.13-ts", "description": "Rule-based sentence segmentation library; TS port of sentencex", "homepage": "https://github.com/AbeJellinek/sentencex-ts", "type": "module", "main": "./dist/sentencex.cjs", "module": "./dist/sentencex.js", "types": "./dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", "import": "./dist/sentencex.js", "require": "./dist/sentencex.cjs" } }, "files": [ "dist" ], "scripts": { "build": "vite build && tsc --project tsconfig.build.json --emitDeclarationOnly", "test": "vitest run", "test:watch": "vitest" }, "devDependencies": { "@types/node": "^25.2.3", "prettier": "^3.8.1", "typescript": "^5.7.0", "vite": "^6.0.0", "vite-plugin-dts": "^4.0.0", "vitest": "^3.0.0" } } node-sentencex-ts-0.1.13-ts/src/000077500000000000000000000000001514371216700163615ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/src/abbrev/000077500000000000000000000000001514371216700176225ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/src/abbrev/am.txt000066400000000000000000000000101514371216700207470ustar00rootroot00000000000000ዓ ም node-sentencex-ts-0.1.13-ts/src/abbrev/ar.txt000066400000000000000000000001451514371216700207650ustar00rootroot00000000000000ا. د ا.د ا.ش.ا ا ت.ب ج.ب ج.م.ع جم س.ت سم ص.ب. ص.ب كج. كلم. م.ب م ه node-sentencex-ts-0.1.13-ts/src/abbrev/bg.txt000066400000000000000000000006621514371216700207570ustar00rootroot00000000000000p.s акад ал б.р б.ред бел.а бел.пр бр бул в вж вкл вм вр г ген гр дж дм доц др ем заб зам инж к.с кв.м кв кг км кор куб.м куб л лв м.г м мин млн млрд мм н.с напр пл полк проф р рис с св сек см сп срв ст стр т.г т.е т.н т.нар т табл тел у ул фиг ха хил ч чл щ.д node-sentencex-ts-0.1.13-ts/src/abbrev/bn.txt000066400000000000000000000003211514371216700207560ustar00rootroot00000000000000এ বি সি ডি ঈ এফ জি এইচ আই জে কে এল এম এন ও পি কিউ আর এস টি ইউ ভি ডাবলিউ এক্স ওয়াই জেড node-sentencex-ts-0.1.13-ts/src/abbrev/da.txt000066400000000000000000000045161514371216700207550ustar00rootroot00000000000000adm adr afd afs al alm ang ank anm ann ansvh apr årg årh årl arr ass att aud aug aut bd bdt bet bhk bio biol bk bl.a bot br bto ca cal cirk cit co cpr-nr cvr-nr d.å d.æ d.d d.e d.m d.s.s d.s d.y da dav dec def del dep diam din dir disp distr do dobb dr ds dvs e.b e.kr e.l e.o e.v.t eftf eftm egl eks eksam ekskl eksp ekspl el emer endv eng enk etc eur evt exam f.å f.eks f.kr f.m f.n f.o.m f.o f.s.v f.t f.v.t f fa fær fakt feb fec ff fg fhv fig fl flg fm fmd forb foreg foren forf forh fork form forr fors forsk forts fp fr frk fru fuldm fung fys g.d g.m g gd gdr gg gh gl gn gns gr grdl gross h.a h.c hdl henh henv hf hft hhv hort hosp hpl hr hrs hum i.e i ib ibid if ifm ill indb indreg ing inkl insp instr isl istf jan jf jfr jnr jr jul jun jur jvf kal kap kat kbh kem kgl kin kl kld km/t knsp komm kons korr kp kr kst kt ktr kv kvt l.c l lab lat lb. lb.nr lb lejl lgd lic lign lin ling.merc litt lø lok lrs ltr m.a.o m.fl.st m.m m m/ ma mag maks mar mat matr.nr md mdl mdr mdtl med medd medflg medl merc mezz mf mfl mgl mhp mht mi mia mio ml mods modsv modt mr mrk mrs ms mul mv mvh n.br n.f n nat ned nedenn nedenst nederl nkr nl no nord nov nr nto nuv o.a ø.f o.fl.st o.g o.h o.m.a o obj obl obs odont oecon off ofl okt omg omr omtr on op.cit opg opl opr org orig osfr osv øv ovenn ovenst overs ovf øvr oz p.a p.b.v p.c p.m.v p.p p.s p.t p.v.a p.v.c p pæd par partc pass pct pd pens perf pers pg pga pgl ph.d ph pharm phil pinx pk pkt pl pluskv polit polyt port pos pp pr præd præf præp præs præt prc priv prod prof pron psych pt q.e.d rad red ref reg regn rel rep repr rest rk russ s.å s.br s.d s.e s.f s.m.b.a s.u s s/ sa sædv såk sb sc scient sek sekr sem sen sep sept sg sign sj skr skt slutn sml smp sms smst sø soc sort sp spec spm spr spsk st stk str stud subj subst suff sup suppl sv t.h t.o.m t.v t tab td tdl tdr techn tekn temp th ti tidl tilf tilh till tilsv tjg tlf tlgr to tr trp tv ty u.å u.p u.st u uafh ubf ubøj udb udbet udd udg uds ugtl ulin ult undt univ v.f vær var vb vbsb vedk vedl vedr vejl vh vol vs vsa zool node-sentencex-ts-0.1.13-ts/src/abbrev/de.txt000066400000000000000000000012511514371216700207520ustar00rootroot00000000000000ä Ä adj adm adv ao.univ.prof art ass.prof ass asst b.a b.s bart bldg brig bros bse buchst bzgl bzw c.-à-d ca capt chr cmdr co col comdr con corp cpl d.h d.j dergl dgl di dipl.-ing dkr dr ens etc ev evtl ff g.g.a g.u gen ggf gov hon.prof hon hosp i.f i.h.v ii iii insp iv ix jun k.o kath lfd lt ltd m.e mag maj med messrs mio mlle mm mme mr mrd mrs ms msgr mwst no nos nr o.ä o.univ.-prof op ord pfc ph pp prof projektass pvt rep reps res rev rt s s.p.a sa sen sens sfc sgt sog sogen spp sr st std str stud.ass supt surg T u.a u.ä u.e u.s.w u.u univ.-doz univ.-prof univ.ass usf usw v vgl vi vii viii vs x xi xii xiii xiv xix xv xvi xvii xviii xx z.b z.t z.z z.zt zt zzt node-sentencex-ts-0.1.13-ts/src/abbrev/el.txt000066400000000000000000000001101514371216700207530ustar00rootroot00000000000000Δρ κ κα δρ κ λπ κλπ π χ λ χ π μ π.χ τ Υ Γ Τ Κ node-sentencex-ts-0.1.13-ts/src/abbrev/en.txt000066400000000000000000000015241514371216700207670ustar00rootroot00000000000000A adj adm adv al ala alta apr arc ariz ark art assn asst attys aug ave B bart bld bldg blvd brig bros btw C cal calif capt cl cmdr co col colo comdr con conn corp cpl cres ct d.phil D dak dec del dept det dist dr.phil dr.philos dr drs e.g E ens esp esq etc exp expy ext F feb fed fig fla ft fwy fy G ga gen gov H hon hosp hr hway hwy i.e I ia id ida ill inc ind ing insp J jan jr jul jun K kan kans ken ky L la lt ltd M maj // man mar // mass may md me med messrs mex mfg mich min minn miss mlle mm mme mo mont mr mrs ms msgr mssrs mt mtn Nº N° No̱ No N neb nebr nev no nos nov nr O oct ok okla ont op ord ore p P pa pd pde penn penna pfc ph.d ph pl plz pp prof pvt Q que R rd ref rep reps res rev rs rt S sask sec sen sens sep sept sfc sgt sr st supt surg T tce tenn tex u.s U univ usafa ut v V va ver viz vs vt W // wash wis wisc wy wyo X Y yuk Z node-sentencex-ts-0.1.13-ts/src/abbrev/es.txt000066400000000000000000000022121514371216700207670ustar00rootroot00000000000000a.c a a/c abr adj admón aero afmo ago almte ambi an anfi ante anti ap apdo archi arci arq art atte auto av avda bco bi bibl bien bis bs. as c.f c.g c c/c c/u cap cc.aa cdad cm co com con contra cra crio cta cuadri cuasi cuatri cv d.e.p da dcha dcho de deci dep des di dic dicc dir dis dn doc dom dpto dr dra dto ecto ee ej en endo entlo entre epi equi esq etc ex excmo ext extra f.c fca fdo febr ff. aa ff.cc fig fil fra g.p g/p geo gob gr gral grs hemi hetero hiper hipo hnos homo hs i igl iltre im imp impr impto in incl infra ing inst inter intra iso izdo izq izqdo j.c jue jul jun kg km lcdo ldo let lic ltd lun macro mar máx may mega mg micro mié min mín mini mm mono mt multi n. del t n.b neo no nos nov ntra. sra núm oct omni p.a p.d p.ej p.v.p p pág págs para párr párrf pen ph.d ph pluri poli pos post pp ppal pre prev pro prof prov pseudo ptas pts pza q.e.g.e q.e.p.d q.e.s.m re reg rep retro rr. hh rte s. a s.a.r s.e s.l s.r.c s.r.l s.s.s s s/n sáb sdad seg semi sept seudo sig sobre sr sra sres srta sta sto sub super supra t.v.e tamb tel tfno trans tras tri ud uds ulter ultra un uni univ uu v.b v.e vd vds vice vid vie vol vs vto yuxta node-sentencex-ts-0.1.13-ts/src/abbrev/fi.txt000066400000000000000000000016241514371216700207640ustar00rootroot00000000000000A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Å Ä Ö // List of titles. // These are often followed by upper-case names but do not indicate sentence breaks alik alil amir apul apul.prof arkkit ass assist dipl dipl.arkkit dipl.ekon dipl.ins dipl.kielenk dipl.kirjeenv dipl.kosm dipl.urk dos Dr erikoiseläinl erikoishammasl erikoisl erikoist ev.luutn evp fil ft hallinton hallintot hammaslääket jatk jääk kansaned kapt kapt.luutn kenr kenr.luutn kenr.maj kers kirjeenv kom kom.kapt komm konst korpr luutn maist maj Mr Mrs Ms M.Sc neuv nimim Ph.D prof puh.joht pääll res san siht suom sähköp säv toht toim toim.apul toim.joht toim.siht tuom ups vänr vääp ye.ups ylik ylil ylim ylimatr yliop yliopp ylip yliv // misc - odd period-ending items that NEVER indicate breaks (p.m. does NOT fall // into this category - it sometimes ends a sentence) e.g ent esim huom i.e ilm l mm myöh nk nyk par po t v node-sentencex-ts-0.1.13-ts/src/abbrev/fr.txt000066400000000000000000000007221514371216700207730ustar00rootroot00000000000000a.c.n a.m al ann apr art auj av b.p boul c.-à-d c.n.s c.n c.p.i c.q.f.d c.s ca cf ch.-l chap co contr dir e.g e.v éd env etc ex fasc fém fig fr hab i.e ibid id inf l.d lib ll.aa.ii ll.aa.rr ll.aa.ss ll.aa ll.ee ll.mm.ii.rr ll.mm loc.cit ltd masc mm ms n.b n.d.a n.d.l.r n.d.t n.d n.p.a.i n.s n/réf nn.ss p.c.c p.ex p.j p.s pl pp r.-v r.a.s r.i.p r.p s.a.i s.a.r s.a.s s.a s.e s.m.i.r s.m s.s sec sect sing sq sqq ss suiv sup suppl t.s.v.p tél vb vol vs x.o z.i node-sentencex-ts-0.1.13-ts/src/abbrev/gu.txt000066400000000000000000000003131514371216700207730ustar00rootroot00000000000000એ બી સી ડી ઈ એફ જી એચ આઈ જે કે એલ એમ એન ઓ પી ક્યૂ આર એસ ટી યૂ વી ડબલ્યૂ એક્સ વાય જેડ node-sentencex-ts-0.1.13-ts/src/abbrev/hi.txt000066400000000000000000000003101514371216700207550ustar00rootroot00000000000000ए बी सी डी ई एफ जी एच आई जे के एल एम एन ओ पी क्यू आर एस टी यू भी डब्लू एक्स वाई जेड node-sentencex-ts-0.1.13-ts/src/abbrev/it.txt000066400000000000000000000252511514371216700210040ustar00rootroot00000000000000°c °f °n °ra °ré 1° a.c a.c/a a.cam a.civ a.cor a.d.r a.gov a.mil a.mon a.smv a.v a/a a/c a/i aa aaaa aaal aacst aamct aams aar aato ab abbigl abbrev abc abi abl abm abr abs absp ac acam acb acbi acc accorc accr acd ace acec acep aci acli acp acro acsit actl ad.mil ad ada adap adatt adc add adei adeion adhd adi adisco adj adm adp adr ads adsi adsl adv ae.b aefi aer aerodin aeron afa afc afci affl afi afic afm afp ag agcm agcom age agecs agesci agg agip agis agm ago agr agric agt ai aia aiab aiac aiace aiap aias aiat aib aic aica aicel aici aics aid aida aidaa aidac aidama aidda aidim aido aids aies aif aih aiip aimi aip aipsc airi ais aisa aism aiss aissca aitc aiti aitr aits aka al alai alch alg ali alim all allev allus alp alq alt am amm ama amaci amag amami amc ammec amn ampas amps an ana anaai anac anaci anad anai anaoo anart anat. comp anat ancci anci ancip ancsa andit anec anee anem anes anffas ani ania anica anie animi anis anisc anm anmfit anmig anmil anmli anms anpa anpas anpci anpe anpi ansi ansv ant anta antifr antlo anton antrop anusca anvi anx ao ap apa apd apea apec apet api apos app.sc app apr aps apt aq ar.ind ar.rep ar arald arame arc arch archeol arci ardsu are arg aritm arpa arpat arred arrt arsia art arti min artig artigl artt as asa asae asc asci ascii ascom ascop asd ase asf asfer asg asic asifa asl asmdc asmi asp aspic aspp assi assic assol asst aster astr astrol astron at ata atb atic atm ats att attrav atv au auc aus auser aut autom av avi avis avo avv avvers awb awdp az azh b.a b2b b2c ba bafta bal ball ban banc bar bart bas bat batt bban bbc bbl bbs bbtc bcc bce bcf bdf bei bep bers bg bi bibl bic bioch biol bl bld bldg blpc bm bmps bmw bn bna bncf bncrm bni bnl bo bot bpl bpm bpn bpr br brd bre bric brig.ca brig.gen brig bros bs bsc bsp bsu bt btc btg.l btg btr bts bu bur bz c.a.p c.a c.c.p c.cost c.d a c.d c.le c.m c.opv c.p c.s c.v.d c.v c/a c/c c/pag ca.rep ca.sm ca.sz ca.uf ca caaf cab cad cae cai cal cam cap capol capt car.sc car carat card cas casaca casd cass.civ cat caus cav cavg cb cbd cbr cbs cc cca ccap ccda ccdp ccee cciaa ccie ccip cciss ccna ccnl ccnp ccpb ccs ccsp cctld cctv ccv cd cda cdma cdo cdpd cdr cds cdw ce ced cee cei cemat cenelec centr cepis ceps cept cerit cese cesis cesvot cet cf cfa cfr cg cgi cgil cgs ch chf chim. ind chim chir ci-europa ci ciber cicae cid cie cif cifej cig cigs cii cilea cilo cim cime cin cinit cio cipe cirm cisal ciscs cisd cisl cism citol cl class cli cm cm² cm³ cmdr cme cmo cmr cms cmyk cn cna cnb cnc cnel cngei cni cnipa cnit cnn cnr cns cnt cnvvf co.ing co.sa co cobas coc cod. civ cod. deont. not cod. pen cod. proc. civ cod. proc. pen cod codec coi col colf coll com comdr comm comp compar compl con conai conc concl condiz confetra confitarma confr cong congeav congiunt coni coniug consec consob contab contr coreco corp corr correl corrisp cosap cospe cost costr cpc cpdel cpe cpi cpl cpt cpu cr cral credem crf cri cric cristall crm cro cron crsm crt cs csa csai csc csm csn css ct ctc cte cti ctr ctsis cuc cud cun cup cusi cvb cvbs cwt cz d.c d.i.a d dab dac dam dams dat dau db dbms dc dca dccc dda ddp ddr ddt dea decoraz dect dek denom deriv derm determ df dfp dg dga dhcp di dia dial dic dicomac dif difett dig. iv digos dimin dimostr din dipart diplom dir. amm dir. can dir. civ dir. d. lav dir. giur dir. internaz dir. it dir. pen dir. priv dir. proces dir. pub dir. rom dir disus diy dl dlf dm dm² dm³ dme dmf dmo dmoz dnr dns doa doc docg dom dop dos dott dpa dpi dpl dpof dps dpt dr dra drm drs dry pt ds dslam dspn dss dtc dtmf dtp dts dv dvb-t dvb dvd dvi dwdm e.g e.p.c ead eafrd ean eap easw eb eban ebr ebri ebtn ecc eccl ecdl ecfa ecff ecg ecm econ. az econ. dom econ. pol econ ecpnm ed agg ed edge edi edil edit ef efa efcb efp efsa efta eg egiz egl egr ei eisa elab elettr elettron ellitt emap emas embr emdr emi emr en enaip enal enaoli enapi encat enclic enea enel eni enigm enit enol enpa enpaf enpals enpi enpmf ens entom epd epigr epirbs epl epo ept erc ercom ermes erp es esa escl esist eso esp estens estr. min etacs etf eti etim etn etol eu eufem eufic eula eva® f f.a f.b f.m f.p fa fabi fac facl facs fad fai faile failp failpa faisa falcri fam famar fans fao fapav faq farm fasi fasib fatt fbe fbi fc fco fcp fcr fcu fdi fe feaog feaosc feb fedic fema feoga ferr fesco fesr fess fg fi fiaf fiaip fiais fialtel fiap fiapf fiat fiavet fic ficc fice fidal fidam fidapa fieg fifa fifo fig figc figs filat filcams file filol filos fim fima fimmg fin finco fio fioto fipe fipresci fis fisar fisc fisg fisiol fisiopatol fistel fit fita fitav fits fiv fivet fivl flo flpd fluid pt fm fmcg fmi fmth fnas fnomceo fnsi fob fod folcl fon fop fotogr fp fpc fpld fr fra fs fsc fse fsf fsfi fsh ft ft² ft³ ftase ftbcc fte ftp fts fuaav fut fv fvg g.fv g.u.el g.u gal gats gatt gb gc gccc gco gcost gd gdd gdf gdi gdo gdp ge gea gel gen geneal geod geofis geogr. antr geogr. fis geogr geol geom gep germ gescal gg ggv gi gia gides gift gio giorn gis gisma gismo giu gm gmdss gme gmo go gov gp gpl gprs gps gr.sel.spec gr.sel.tr gr.sqd gr gra gram grano grd grtn grv gsa gsm-r gsm gsr gtld gu guce gui gus ha haart haccp hba hcg hcrp hd-dvd hdcp hdi hdml hdtv hepa hfpa hg hifi hiperlan hiv hm hmld hon hosp hpv hr hrh hrm hrt html http hvac hz i.e i.g.m iana iasb iasc iass iat iata iatse iau iban ibid ibm icann icao icbi iccu ice icf ici icm icom icon ics icsi icstis ict icta id iden idl idraul iec iedm ieee ietf ifat ifel ifla ifrs ifto ifts ig igm igmp igp iims iipp ilm ilo ilor ils im imaie imap imc imdb imei imi imms imo imp imper imperf impers imq ims imsi in in² in³ inail inca incb inci ind. agr ind. alim ind. cart ind. chim ind. cuoio ind. estratt ind. graf ind. mecc ind. tess ind indecl indef indeterm indire inea inf infea infm inform ing ingl inmarsat inpdai inpdap inpgi inps inr inran ins insp int inter intr invar invim ioma iosco ip ipab ipasvi ipi ippc ips iptv iq ira irap ircc ircs irda iref ires iron irpef irpeg irpet irreg is isae isbd isbn isc isdn isee isef isfol isg isi isia ism ismea isnart iso isp ispearmi ispel ispescuole ispesl ispo ispro iss issn istat istol isvap it iti itt ittiol itu iud iugr iulm iva iveco ivg ivr ivs iyhp j jal jit jr jv k kb kee kg kkk klm km km/h km² kmph kmq kr kw kwh l.n l'avv l'ing l la lag lan lanc larn laser lat lav. femm lav. pubbl lav laz lb lc lcca lcd le led lett lh li liaf lib lic.ord lic.strd lic licd lice lida lidci liff lifo lig liit lila lilt linfa ling lipu lis lisaac lism lit litab lnp lo loc. div loc lolo lom long lp lrm lrms lsi lsu lt ltd lu lug luiss lun lwt lww m.a m.b m.o m/s m² m³ ma mac macch mag magg.(maj) magg.gen.(maj.gen.) mai maj mar.a mar.ca mar.ord mar marc mat mater max mb mbac mc mcl mcpc mcs md mdf mdp me mec mecc med mediev mef mer merc merid mesa messrs metall meteor metr metrol mg mgc mgm mi mibac mica microb mifed miglio nautico per ora miglio nautico miglio nautico² miglio² mil mile miles/h milesph min miner mips miptv mit mitol miur ml mlle mls mm mm² mme mms mn mnp mo mod mol mons morf mos mpaa mpd mpeg mpi mps mq mr mrs ms msgr mss mt mto murst mus mvds mws n.a n.b na naa nafta napt nars nasa nat natas nato nb nba nbc ncts nd nda nde ndr ndt ne ned neg neol netpac neur news! ngcc nhmf nlcc nmr no nodo nom nos nov novissdi npi nr nt nta nts ntsc nu nuct numism nwt nyc nz o.m.i oai-pmh oav oc occ occult oci ocr ocse oculist od odg odp oecd oem ofdm oft og ogg ogi ogm ohim oic oics olaf oland ole oled omi oms on ong onig onlus onomat onpi onu op opac opec opord opsosa or ord. scol ord ore oref orient ornit orogr orp ort os osa osas osd ot ote ott oz p.a p.c.c p.c p.es p.f p.m p.r p.s p.t p.v p pa pac pag./p pagg./pp pai pal paleobot paleogr paleont paleozool paletn pamr pan papir par parapsicol part partic pass pat patol pb pc pci pcm pcmcia pcs pcss pct pd pda pdf pdl pds pe pec ped pedag peg pegg per.ind pers pert pesq pet petr petrogr pfc pg pga pgp pgut ph php pi pics pie pif pii pil pime pin pine pip pir pit pitt piuss pkcs pki pko pl pli plr pm pma pmi pmr pn pnf pnl po poet pof pol pop popitt popol port pos poss post pots pp ppa ppc ppga ppp pps pptt ppv pr pra praa pref preist prep pres pret prg pri priv pro.civ prof pron pronom propr prov prs prtl prusst ps pse psi psicoan psicol pso psp pstn pt ptc pti ptsd ptt pu pug puk put pv pvb pvc pvt pz qb qcs qfd qg qi qlco qlcu qos qualif r-lan r.s ra racc radar radc radiotecn raee raf rag raid ram rar ras rass. avv. stato rc rca rcdp rcs rdc rdco rdf rdi rdp rds rdt re rea recipr recl reg region rel rem rep reps res retor rev rfi rfid rg rgb rgc rge rgi bdp rgi rgpt rgt ri riaa riaj riba ric rid rif rifl rina rip ris rit ritts rm rmn rn ro roa roc roi rom roro rov rp rpm rr rrf rs rsc rspp rss rsu rsvp rt rtdpc rtg rtn rtp rttt rvm s-dab s.a s.b.f s.n.c s.p.a s.p.m s.r.l s.ten s.v s/m sa sab saca sace sact sad sag sahm sai saisa sam san sanas sape sar sars sart sas sbaf sbas sbn sc sca.sm scherz scien scn scsi scuba scult scut sdds sdiaf sds sdsl se seat sebc sec seca secam secc see seg segg segredifesa sem sempo sen sens seo serg.magg.(sgm) serg.magg.ca serg set sfc sfis sfx sg sga sgc sgg sgml sgt si si@lt sia siae siaic siap sias sic sicav sid sido sie sif sig.na sig.ra sig sige sigg sigill sigo siia simb simbdea simg simo sin sinalv sing sins sinu siocmf siog sioi siommms siot sip sipem sips sirf sirm sis sisde sismi sissa sit siulp siusa sla sldn slm slr sm sma smau smd sme smes smm smpt sms sn snad snai snc sncci sncf sngci snit so soc sociol sogg soho soi sol somipar somm sonar sp spa spe spett spi spm spot spp spreg sq sqd sr srd srl srr ss ssi ssn ssr sss st. d. arte st. d. dir st. d. filos st. d. rel st stat stg stp stw su suap suem suff sup superl supt surg surl susm sut suv sv svga swics swift swot sxga sz t-dab t.sg ta taa tac tacan tacs taeg tai tan tar targa tav tb tbt tci tcp tcp/ip tcsm tdm tdma te tecn tecnol ted tel telecom temp ten.(lt) ten.col.(ltc) ten.gen teol term tesa tese tesol tess tet tetra tfr tft tfts tgv thx tim tipogr tir tit tld tm tmc tn to toefl ton top topog tos tosap tosc tp tpl tr trad tramat trasp ts tso tuir tuld tv twa twain u.ad u.s ucai ucca ucei ucina uclaf ucoi ucoii ucsi ud udc udi udp ue uefa uemri ufo ugc uhci uhf uht uibm uic uicc uiga uil uilps uisp uits uk ul ull uma umb ummc umss umts unac unar unasp uncem unctad undp unefa unep unesco ungh unhcr uni unicef unitec unpredep unsa upa upc urar urban url urp urss usa usb usfi usga usl usp uspi ussr utap v.brig v.cte v.m v.p v.r v.s v va vab vaio val vas vb vbr vc vcc vcr vda ve ven ves vesa veter vezz vfb vfp vfx vga vhf vhs vi via vip vis vn vo voc voip vol volg voll vor vpdn vpn vr vs vsp vt vtc vts vtt vv vvf wai wais wan wap wasp wc wcdma wcm wga wi-fi wipo wisp wll wml wms worm wp wpan wssn wto wwan wwf www wygiwys xl xml xs xxl xxs yaf yb yci yd yd² yd³ ymca zat zb zcs zdf zdg zift zool zoot ztc ztl µg node-sentencex-ts-0.1.13-ts/src/abbrev/kk.txt000066400000000000000000000041101514371216700207640ustar00rootroot00000000000000afp anp atp aбб bae bg bp cam cctv cd cez cgi cnpc dvd eiti epo er farc fbi gp gps has hiv hrh http icu idf imd ime ip iso kaz kpa kpo kz mgm mri nasa nba nbc nds ohl omlt pda pkk ppm psm psp raf rss rtl sas sme sms tnt udf uefa usb utc x zdf а. аақ авг. аек ак акад. акср акцион. ақ ақш амт англ аөсшк апр. апр аум. аф ацат әқбк әөк әч б. з. б. б. з. д. б. т. б. э. д. б.б. ббс биікт. биол. биохим бмтрк боак бө бсн бта бұұ бхооо вич всоонл г геогр. геол. гленкор гсбп гсдп гулаг гэс ғ. с. ғ. дек. дк днқ дсұ еақк еаэы еқыұ ембімұнайгаз ео еуразэқ еуроодақ еұу еэы ж. жж. жіө жко жкт жққ жоо жсдп жск жтсх жхл жшс жэк зоо и. инта исаф іім камаз кг кгб кеу кимеп км км² км³ кмс кокп кота кср ксро кту кхдр қ. қазатомпром қазкср қазмұнайгаз қазпошта қазтаг қазұу қк қкп ққс қмдб қр қхр лат. м. м м² м³ магатэ маж май. максам мб мбф мвт мемдум мемл мин мқо млн млрд мм. мм мр мсоп мт мтк мыс. наса нато нквд нояб. нұсжп оар обб обл. огпу оеб окт. оңт. опек өгк өзенмұнайгаз өұқ өф пәк пед. пиқ р. ржмб ркфср рлдп рнқ рсфср ртж руб рф рфкп с. с.ш. сбд сбл свс сву сду сент. сес см снпс солт. сооно спбму сср ссро ссс ссср сэс т. б. т. с. с. т. т.с.с т тв тереңд. тех. тж тжқ тим тмд төм. тр трлн тэц уаз уефа ук ұқк ұқшұ февр. фкққ фққ фсб хвқ хдо хдп хим. хқко хтқо цас цтп ш. ш.б. шұар шыұ экон. экспо эқк эөкк эыдұ юнеско янв. А М Т node-sentencex-ts-0.1.13-ts/src/abbrev/kn.txt000066400000000000000000000003401514371216700207700ustar00rootroot00000000000000ಎ ಬಿ ಸಿ ಡಿ ಈ ಎಫ್ ಜಿ ಹೆಚ್ ಐ ಜೆ ಕೆ ಎಲ್ ಎಂ ಎನ್ ಓ ಪಿ ಕ್ಯೂ ಆರ್ ಎಸ್ ಟಿ ಯೂ ವಿ ಡಬಲ್ಯೂ ಎಕ್ಸ್ ವೈ ಜೆಡ್ node-sentencex-ts-0.1.13-ts/src/abbrev/ml.txt000066400000000000000000000005731514371216700210000ustar00rootroot00000000000000ഡോ Dr പ്രൊ പ്രൊഫ മി ശ്രീ ശ്രീമതി ബഹു എ ബി സി ഡി എഫ് ജി എച് എച്ച് ഐ ജെ കെ എൽ എം എൻ ഒ ഓ പി ക്യു ക്യൂ ആർ എസ് ടി യു യൂ വി ഡബ്ല്യു ഡബ്ള്യു എക്സ് വൈ ഇസഡ് node-sentencex-ts-0.1.13-ts/src/abbrev/nl.txt000066400000000000000000000261351514371216700210030ustar00rootroot00000000000000 riv.dir.int."le priv 2d 3e a.2d a.a.j.b a.a a.f.t a.g.j.b a.h.v a.h.w a.hosp a.i a.j.b a.j.t a.m.r a.m a.p.m a.p.r a.p.t a.s a.t.d.f a.u.b a.v.a a.w aanbev.comm aanbev aant aanv.st aanw.vnw aanw abd abm abs acc.& fisc acc.act acc.bedr.m acc.bedr.t "acc.themas m." acc.thema’s m achterv act.dr.fam act.dr act.fisc act.soc adm.akk adm.besl adm.lex adm.onderr adm.ov adv.bl adv afd afl aggl.verord agr al alg.richts alg amén ann.dr.lg ann.dr.sc.pol ann.dr ann.ét.eur ann.fac.dr.lg ann.jur.créd.règl.coll ann.jur.créd ann.not ann.parl ann.prat.comm app arb arbbl arbh arbit.besl arbrb arr.cass arr.r.v.st arr.verbr arr arrondrb art artw aud b.&w b.a.s b.a b.b.o b.best.dep b.br.ex b.coll.fr.gem.comm b.coll.vl.gem.comm b.d.cult.r b.d.gem.ex b.d.gem.reg b.dep b.e.b b.f.r b.fr.gem.ex b.fr.gem.reg b.i.h b.inl.j.d b.inl.s.reg b.j b.l b.lid br.ex b.lid d.gem.ex b.lid fr.gem.ex b.lid vl.ex b.lid w.gew.ex b.o.z b.prov.r b.r.h b.s b.sr b.stb b.t.i.r b.t.s.z b.t.w.rev b.v b.ver.coll.gem.gem.comm b.verg.r.b b.versl b.vl.ex b.voorl.reg b.w.gew.ex b.w b.z.d.g b.z.v b bab bank fin.r bank fin bedr.org begins beheersov bekendm.comm bel.besch bel.w.p bel beleidsov belg benelux jur ber.w ber besch besl beslagr besluitwet nr best bestuurswet bet betr bevest bew bijbl.n.bijdr bijbl bijl bijv bijw bijz.decr bin.b bkh bl blz bm bn bnlx merkw bnlx tek bnlx uitl bnw bouwr br drs br.parl bs bt drs btw rev bull.adm.pénit bull.ass bull.b.m.m bull.bel bull.best.strafinr bull.bmm bull.c.b.n bull.c.n.c bull.cbn bull.centr.arb bull.cnc bull.contr bull.doc.min.fin bull.f.e.b bull.feb bull.fisc.fin.r bull.i.u.m bull.inf.ass.secr.soc bull.inf.i.e.c bull.inf.i.n.a.m.i bull.inf.i.r.e bull.inf.iec bull.inf.inami bull.inf.ire bull.inst.arb bull.ium bull.jur.imm bull.lég.b bull.off bull.trim.b.dr.comp bull.us bull.v.b.o bull.vbo bull bv i.o bv bw int.reg bw bxh byz c.& f.p c.& f c.a.-a c.a.b.g c.a c.c.i c.c.s c.c c.conc.jur c.d.e c.d.p.k c.e c.ex c.f c.h.a c.i.f.i.c c.i.f c.j c.l c.n c.o.d c.p c.pr.civ c.q c.r.a c.r c.s.a c.s.q.n c.s c.v.a c.v.o c.v c ca cadeaust cah.const cah.dr.europ cah.dr.immo cah.dr.jud cal cap carg cas cass cert cf ch chr chron.d.s chron.dr.not chron cie cir circ.z circ cit.loc cit civ cl.et.b cmt co cognoss.v coll colp.w com.v.min com comm.bijz.ov comm.erf comm.fin comm.ger comm.handel comm.pers comm.pub comm.straf comm.v.en v comm.v comm.venn comm.verz comm.voor comm comp compt.w computerr con.m concl concr conf confl.w.huwbetr confl.w cons conv coöp corr.bl corr cour de cass cour.fisc cour.immo cridon crim crt cur curs d.-g d.a.v d.a d.b.f d.c.c.r d.c d.d.p d.d d.e.t d.gem.r d.h.z d.h d.i.t d.i d.j d.l.r d.m.v d.m d.o.v d.parl d.w.z d dact dat dbesch dbesl de advoc de belg.acc de burg.st de dr de gem de gerechtsd de venn de verz decr.d decr.fr decr.vl decr.w decr deelw def dep.opv dep.rtl derg desp det.mag deurw.regl dez dgl dhr disp diss div.act div.bel div dl dln dnotz doc.jur.b doc.min.fin doc.parl doc doctr dpl.besl dpl dr.banc.fin dr.circ dr.inform dr.mr dr.pén.entr dr.q.m dr drs dtp dwz dyn e cont e.a e.b e.c.a e.c e.d e.e.a e.e.g e.e e.g.a e.g e.h.a e.i e.j e.m.a e.n.a.c e.o e.p.c e.r.c e.r.f e.r.h e.r.o e.r.p e.r.v e.s.r.a e.s.t e.v.a e.v e.w e e&o.e ec.pol.r echos log econ ed ed(s) eeg verd.v eex san s eff eg rtl eig.mag eig eil elektr en antw en gew en m en prov en s en w enmb entr.et dr enz err et al et seq etc etq eur.t.s eur.verd.overdracht strafv eur ev rechtsh ev uitl ev evt ex.crim ex exec f.a.o f.a.q f.a.s f.i.b f.j.f f.o.b f.o.r f.o.s f.o.t f.r f.supp f.suppl f fa facs fare act fasc fg fid.ber fig fin.verh.w fin fisc.act fisc.koer fisc fl form foro fr.cult.r fr.gem.r fr.parl fr fra ft g.a.v g.a.w.v g.a g.g.d g.m.t g.o g.omt.e g.p g.s g.v g.w.w g geb gebr gebrs gec.decr gec ged.st ged gedipl gedr.st geh gem.comm gem.gem.comm gem.st gem.stem gem.w gem.wet gem.wet gem gemeensch.optr gemeensch.standp gemeensch.strat gemeent.b gemeent.regl gemeent.verord gemeent gen geol geopp gepubl ger.deurw ger.w gerekw gereq gesch get getr gev.m gev.maatr gew ghert gir.eff.verk gk gr gramm grat.w gronopm.en leermed grondw grootb.w grs grur ausl grur int grvm grw gst gw h.a.v.o h.a h.b.o h.e.a.o h.e.g.a h.e.geb h.e.gestr h.l h.m h.o h.r h.t.l h.t.m h.w.geb hand handelsn.w handelspr handelsr.w handelsreg.w handv harv.l.rev hc herald hert herz hfdst hfst hgrw hhr hist hooggel hoogl hosp hpw hr.ms hr hregw hrg hst huis.just huisv.w huurbl hv.vn hw hyp.w i.b.s i.c.m.h i.c i.e i.f.p i.f i.g.v i.h.a i.h.b i.h i.l.pr i.o i.p.o i.p.r i.p.v i.pl.v i.r.d.i i.s.m i.t.t i.v.m i.v.s i.v i.w.tr i.z ib ibid icip-ing.cons iem ind prop ind indic.soc indiv inf.i.d.a.c inf.idac inf.r.i.z.i.v inf.riziv inf.soc.secr inf ing.cons ing inst "intl & comp.l.q." int interm intern.fisc.act intern.vervoerr inv.w inv.wet inv invord.w inz ir irspr it iwtr j.-cl j.c.b j.c.e j.c.fl j.c.j j.c.p j.d.e j.d.f j.d.s.c j.dr.jeun j.j.d j.j.p j.j.pol j.l.m.b j.l.o j.l j.ordre pharm j.p.a j.r.s j.t.d.e j.t.dr.eur j.t.o j.t.t j.t j jaarl jb.hand jb.kred.c.s jb.kred jb.l.r.b jb.lrb jb.markt jb.mens jb.t.r.d jb.trd jeugdrb jeugdwerkg.w jg jis jl journ.jur journ.prat.dr.fisc.fin journ.proc jrg jur.comm.fl jur.dr.soc.b.l.n jur.f.p.e jur.fpe jur.niv jur.trav.brux jur jura falc jurambt jv.cass jv.h.r.j jv.hrj jw k.b k.g k.k k.m.b.o k.o.o k.v.k k.v.v.v k kadasterw kaderb kador kbo-nr kg kh kiesw kind.bes.v kkr koopv kr krankz.w ksbel kt ktg ktr kvdm kw.r kymr kzr kzw l.b.o l.b l.bas l.c l.gew l.j l.k l.l l.o l.r.b l.u.v.i l.v.r l.v.w l.w "lexp.-compt.b." l’exp.-compt.b l landinr.w landscrt larcier cass lat law.ed lett levensverz lgrs lidw limb.rechtsl lit litt liw liwet lk ll.(l.)l.r ll loonw losbl ltd luchtv.w luchtv m.a.v.o m.a.w m.b.o m.b.r m.b.t m.b m.d.g.o m.e.a.o m.e.r m.h.d m.h m.i.v m.j.t m.k m.m.a m.m.h.h m.m.v m.m m.n m.not.fisc m.nt m.o m.r m.s.a m.u.p m.v.a m.v.h.n m.v.t m.z m maatr.teboekgest.luchtv maced mand max mbl.not me med.b.u.f.r med.bufr med.vbo med meerv meetbr.w mém.adm mgr mgrs mhd mi.verantw mil.bed mil.ger mil min.j.omz min.just.circ min mitt mnd mod mon monde ass mouv.comm mr ms muz mv mva ii inv mva inv n cont n.a.g n.a.v n.a n.b n.c n.chr n.d.r n.d n.e.a n.g n.h.b.c n.j.b n.j.w n.j n.l n.m.m n.m n.n.b n.n.g n.n.k n.n n.o.m n.o.t.k n.rapp n.tijd.pol n.v.d.r n.v.d.v n.v.h n.v.o.b n.v.t n.v n nat.besch.w nat.omb nat.pers ned.cult.r neg.verkl nhd nieuw arch njcm-bull nl nnd no not.fisc.m not.w not.wet not nr nrs nste nt numism o.a o.b o.c o.g.v o.g o.i.d o.i o.m o.o.d o.o.v o.o o.p o.r o.regl o.s o.t.s o.t.t.t o.t.t.z o.t.t o.tk.t o.v.t.t o.v.t o.v.tk.t o.v.v o ob obsv octr.gem.regl octr.regl octr oe oecd mod off.pol ofra ohd omb omnia frat omnil omz on.ww onderr onfrank onteig.w ontw onuitg onz oorl.w op.cit opin.pa opm or ord.br ord.gem ors orth os osm ov.w.i ov.w.ii ov.ww ov overg.w overw ovkst ow kadasterw oz p.& b p.a.o p.a p.b.o p.e p.g p.j p.m.a p.m p.o.j.t p.o p.p p.v.s p.v p pachtw pag pan pand.b pand.pér parl.gesch parl.st parl part.arb pas pasin pat pb.c pb.l pens pensioenverz per.ber.i.b.r per.ber.ibr pers pft pg wijz.rv pk pktg pli jur plv po pol.off pol.r pol.w pol politie j postbankw postw pp pr preadv pres prf prft prg prijz.w pro jus proc procesregl prof prot prov.b prov.instr.h.m.g prov.regl prov.verord prov.w prov publ.cour eur.d.h publ.eur.court h.r publ pun pw q.b.d q.e.d q.q q.r r.a.b.g r.a.c.e r.a.j.b r.b.d.c r.b.d.i r.b.s.s r.c.b r.c.d.c r.c.j.b r.c.s.j r.c r.cass r.d.c r.d.i.d.c r.d.i r.d.j.b r.d.j.p r.d.p.c r.d.s r.d.t.i r.e r.f.s.v.p r.g.a.r r.g.c.f r.g.d.c r.g.f r.g.z r.h.a r.i.c r.i.d.a r.i.e.j r.i.n r.i.s.a r.j.d.a r.j.i r.k r.l.g.b r.l r.med.rechtspr r.med r.n.b r.o r.orde apoth r.ov r.p.d.b r.p.o.t r.p.r.j r.p.s r.p r.r.d r.r.s r.s.v.p r.s r.stvb r.t.d.f r.t.d.h r.t.l r.trim.dr.eur r.v.a r.v.k r.verkb r.w.d r.w r rap.ann.c.a rap.ann.c.c rap.ann.c.e rap.ann.c.s.j rap.ann.ca rap.ann.cass rap.ann.cc rap.ann.ce rap.ann.csj rapp rb.kh rb.van kh rb rdn rdnr re.pers rec.c.i.j rec.c.j.c.e rec.cij rec.cjce rec.cour eur.d.h rec.gén.enr.not rec.lois decr.arr rec rechtsh rechtsk.t rechtspl.zeem rechtspr.arb.br rechtspr.b.f.e rechtspr.bfe rechtspr.soc.r.b.l.n recl.reg rect red reg.huiz.bew reg.w reg registr.w regl.besl regl.onderr regl.r.t regl rep.eur.court h.r rép.fisc rép.not rep.r.j rep.rj rep req res resp rev.acc.trav rev.adm rev.b.compt rev.b.dr.const rev.b.dr.intern rev.b.séc.soc rev.banc.fin rev.comm rev.cons.prud rev.dr.b rev.dr.commun rev.dr.étr rev.dr.fam rev.dr.intern.comp rev.dr.mil rev.dr.min rev.dr.pén.mil rev.dr.pén rev.dr.rur rev.dr.u.l.b rev.dr.ulb rev.exp rev.faill rev.fisc rev.gd rev.hist.dr rev.i.p.c rev.ipc rev.not.b rev.prat.dr.comm rev.prat.not.b rev.prat.soc rev.rec rev.rw rev.trav rev.trim.d.h rev.trim.dr.fam rev.urb rev rh richtl riv.dir.int.priv.proc riv.dir.int rk rln roln rom rondz rov rprt rtl rubr ruilv.wet rv.verdr rvkb s.a s.b.n s.ct s.d s.e.c s.e.et.o s.e.w s.exec.rept s.hrg s.j.b s.l.e.a s.l.n.d s.l s.p.a s.s s.t.b s.t s.v.p s.v s samenw sc sch scheidsr.uitspr schepel.besl secr.comm secr.gen sect.soc sess sir soc.act soc.best soc.kron soc.r soc.sw soc.weg soc sofi-nr somm.ann somm sp.c.c sr ss st.doc.b.c.n.a.r st.doc.bcnar st.vw st stagever stas stat stb stbl stcrt stichting i.v strafz stud.dipl su subs subst succ.w suppl sv sw t.a.a t.a.n t.a.p t.a.s.n t.a.v.w t.a.v t.a t.aann t.acc t.agr.r t.app t.b.b.r t.b.h t.b.m t.b.o t.b.p t.b.r t.b.s t.b.v t.bankw t.belg.not t.desk t.e.m t.e.p t.f.r t.fam t.fin.r t.g.r t.g.t t.g.v t.gem t.gez t.huur t.i.n t.in b.z t.j.k t.l.l t.l.v t.m.r t.m.w t.m t.mil.r t.mil.strafr t.not t.o.r.b t.o.v t.o t.ontv t.orde geneesh t.p.r t.pol t.r.d.& i t.r.g t.r.o.s t.r.v t.r t.s.r t.strafr t.t t.u t.v.c t.v.g t.v.m.r t.v.o t.v.v.d.b t.v.v t.v.w t.verz t.vred t.vreemd t.w.k t.w.v.r t.w.v t.w t.wrr t.z.t t.z.v t.z t taalk tar.burg.z td techn tek.mod telecomm tijdschr toel.st.v.w toel toep.regl toep tom top trans.b transp.r trav.com.ét.et lég.not trb trib.civ trib.gr.inst trib trim ts turnh.rechtsl tvpol tvpr tvrechtsgesch tw u.a.r u.a.v u.a u.c.c u.c u.g u.p u.s.d.c u.s u uitdr uitl.w uitv.besch.div.b uitv.besl.bel.rv uitv.besl.l.b uitv.besl uitv.reg.afd.verm uitv.reg.bel.d uitv.reg.lb uitv.reg.succ.w uitv.reg univ.verkl univ v.& f v.a.v v.a v.b.o v.bp prot v.c v.chr v.h v.huw.verm v.i.o v.i v.k.a v.m v.o.f v.o.n v.onderh.verpl v.p v.r v.s.o v.t.t.t v.t.t v.tk.t v.toep.r.vert v.v.b v.v.g v.v.t.t v.v.t v.v.tk.t v.w.b v.z.m v vb.bo vb vbb vc vd veldw ver.k ver.verg.gem ver verbr verd verdr.v verdr verdrag benel.i.z verenw verg.fr.gem verg verkl.herz.gw verkl verl vern verord vers.r versch versl.c.s.w versl.csw vert verv verw verz.schr verz.w verz.wett.besl verz.wett.decr.besl verz vgl vid vigiles jb viss.w vl.parl vl.r vl.t.gez vl.w.reg vl.w.succ vlg vn vnl vnw vo.bl vo voegw vol volg volt voorl voorz vord.w vorst.d vr vred vrg vrijgrs vs vt vvsr jb vw vz vzngr vzr w.a w.b.r w.c.h w.conf.huw w.conf.huwelijksb w.consum.kr w.f.r w.g w.gelijke beh w.gew.r w.ident.pl w.just.doc w.kh w.l.r w.l.v w.mil.straf.spr w.n w.not.ambt w.o.d.huurcomm w.o.d.k w.o w.openb.manif w.parl w.r w.reg w.succ w.u.b w.uitv.pl.verord w.v.k w.v.m.s w.v.r w.v.w w.v w.venn w wac wd wet a.b wet bel.rv wet c.a.o wet c.o wet div.bel wet ksbel wet l.v wetb wgb winkelt.w wisk wka-verkl wnd won.w woningw woonr.w wrr.ber wrr wrsch ws wsch wsr wtvb ww x.d z cont z.a z.g z.i z.j z.o.z z.p z.s.m zesde richtl zg zgn zn znw zr.ms zr node-sentencex-ts-0.1.13-ts/src/abbrev/pa.txt000066400000000000000000000003021514371216700207560ustar00rootroot00000000000000ਏ ਬੀ ਸੀ ਡੀ ਈ ਐਫ ਜੀ ਐਚ ਆਈ ਜੇ ਕੇ ਐਲ ਐਮ ਐਨ ਓ ਪੀ ਕਿਊ ਆਰ ਐਸ ਟੀ ਯੂ ਵੀ ਡਬਲਯੂ ਐਕਸ ਵਾਈ ਜੇਡ node-sentencex-ts-0.1.13-ts/src/abbrev/pl.txt000066400000000000000000000013121514371216700207730ustar00rootroot00000000000000ags alb ang aor awest bałt bojkow bret brus bsł bułg c.b.d.o c.b.d.u celt chorw cs czakaw czerw czes dłuż dniem dor dubrow duń ekaw fiń franc gal germ głuż gniem goc gr grudz hebr het hol I cont ie ikaw irań irl islandz itd itd. itp jekaw kajkaw kasz kirg kwiec łac lip listop lit łot lp maced mar młpol moraw n.e nb. ngr niem nord norw np np. ok. orm oset osk p.n p.n.e p.o pazdz pers pie pod red. podhal pol połab port prekm pskow psł R cont rez rom rozdz. rum rus rys. sas sch scs serb sierp śl sła słe słi słow sp. z o.o śrdniem śrgniem śrirl stbułg stind stpol stpr str. strus stwniem stycz sztokaw szwedz t. tj. tłum. toch tur tzn ukr ul umbr wed węg wlkpol włos wrzes wyd. zakarp node-sentencex-ts-0.1.13-ts/src/abbrev/pt.txt000066400000000000000000000006001514371216700210020ustar00rootroot00000000000000Adj Adm Adv Art Ca Capt Cmdr Col Comdr Con Corp Cpl DR DRA Dr Dra Dras Drs Eng Enga Engas Engos Ex Exo Exmo Fig Gen Hosp Insp Lda MM MR MRS MS Maj Mrs Ms Msgr Op Ord Pfc Ph Prof Pvt Rep Reps Res Rev Rt Sen Sens Sfc Sgt Sr Sra Sras Srs Sto Supt Surg adj adm adv art cit col con corp cpl dr dra dras drs eng enga engas engos ex exo exmo fig op prof sr sra sras srs sto v vs i.e rev e.g node-sentencex-ts-0.1.13-ts/src/abbrev/ru.txt000066400000000000000000000006711514371216700210150ustar00rootroot00000000000000y.e y а авт адм.-терр акад в вв вкз вост.-европ г гг гос гр д деп дисс дол долл ежедн ж жен з зап.-европ зап заруб и ин иностр инст к канд кв кг куб л.h л.н л м мин моск муж н нед о п пгт пер пп пр просп проф р руб с сек см спб стр т тел тов тт тыс у.е у ул ф ч node-sentencex-ts-0.1.13-ts/src/abbrev/sk.txt000066400000000000000000000016611514371216700210040ustar00rootroot00000000000000a. d a. g. p a. i. i a. k. a a. m a. r. k a. s. a. p a. s a. v a.d a.g.p a.i.i a.k.a a.m a.s.a.p a.s a.v akad al apod arm atď. atd atď bc bros c. k c.k č cca co corp čs csc čsl d. c d.c doc dr drsc e. t e.t el etc ev gen hl hod i. b i.b ii iii inc ind ing iv jr judr k. o k.o kol konkr kt ll. m ll.m ltd m. n. m m.n.m m.o max mgr mil min ml mld mr mudr mvdr n. a n. o n. w. a n.a n.o n.w.a nám napr např naprk nár nešp no nr o. c. p o. f. i o. k o. z o.c.p o.f.i o.i o.k o.z obr obv odd ods os p. a p. n. l p. s p.a p.n.l p.s p paeddr pedg ph. d ph.d phd phdr písm plgr pod pok pol. pr pol.pr por pozn pp pr prek príp prof r. o r.o red resp rndr roz rozh rsdr rtg s. a s. e. g š. p s. r. o s.a s.e.g š.p s.r.o skr sl slov soc sp spol sr st št stor str stred súkr sv sz t. č t. j t. z t.č t.j t.z tel tis tj tr tu tvz tz tzn tzv ú. p. v. o u. s ú.p.v.o u.s ul v. sp v.sp var vi viď vs vyd vz xx z. z z.z zák zb zdravot zs zz node-sentencex-ts-0.1.13-ts/src/abbrev/ta.txt000066400000000000000000000003571514371216700207740ustar00rootroot00000000000000ஏ பி சி டி ஈ எஃப் ஜி ஹேச் ஐ ஜே கே எல் எம் என் ஓ // பி க்யூ ஆர் எஸ் // டி யூ வி டபிள்யூ எக்ஸ் வை ஜெட் node-sentencex-ts-0.1.13-ts/src/abbrev/te.txt000066400000000000000000000003431514371216700207730ustar00rootroot00000000000000ఎ బి సి డి ఈ ఎఫ్ జి హెచ్ ఐ జె కె ఎల్ ఎం ఎన్ ఓ పి క్యూ ఆర్ ఎస్ టి యూ వి డబ్ల్యూ ఎక్స్ వై జెడ్ node-sentencex-ts-0.1.13-ts/src/chunk-text.ts000066400000000000000000000034171514371216700210300ustar00rootroot00000000000000export function chunkText(text: string, chunkSize: number): string[] { if (chunkSize === 0 || text.length <= chunkSize) { return [text]; } let chunks: string[] = []; // Split by paragraph breaks let re = /\n[\r]*\n/g; // Get paragraph parts and their positions let paragraphs: Array<[number, number]> = []; let lastEnd = 0; let mat: RegExpExecArray | null; while ((mat = re.exec(text)) !== null) { paragraphs.push([lastEnd, mat.index]); lastEnd = mat.index + mat[0].length; } // Add the final paragraph if (lastEnd < text.length) { paragraphs.push([lastEnd, text.length]); } if (paragraphs.length === 0) { return [text]; } let currentStart = 0; let currentEnd = 0; let i = 0; while (i < paragraphs.length) { let [paraStart, paraEnd] = paragraphs[i]; // If this is the first paragraph in the chunk if (currentEnd === currentStart) { currentStart = paraStart; currentEnd = paraEnd; i++; continue; } // Check if adding this paragraph would exceed chunkSize let potentialSize = paraEnd - currentStart; if (potentialSize > chunkSize) { // Finalize current chunk chunks.push(text.slice(currentStart, currentEnd)); // Start new chunk with current paragraph currentStart = paraStart; currentEnd = paraEnd; } else { // Add this paragraph to current chunk currentEnd = paraEnd; } i++; } // Add the final chunk if there's remaining content if (currentStart < text.length) { chunks.push(text.slice(currentStart, currentEnd)); } return chunks; } node-sentencex-ts-0.1.13-ts/src/constants.ts000066400000000000000000000240731514371216700207530ustar00rootroot00000000000000export const ROMAN_NUMERALS: readonly string[] = [ 'i', 'ii', 'iii', 'iv', 'v', 'vi', 'vii', 'viii', 'ix', 'x', 'xi', 'xii', 'xiii', 'xiv', 'xv', 'xvi', 'xvii', 'xviii', 'xix', 'xx', ]; export function getQuotePairs(): Map { let pairs = new Map(); pairs.set('"', '"'); pairs.set(" '", "'"); // Need a space before ' to avoid capturing don't, l'Avv, etc. pairs.set('\u00AB', '\u00BB'); // «» pairs.set('\u2018', '\u2019'); // '' pairs.set('\u201A', '\u201A'); // ‚‚ pairs.set('\u201C', '\u201D'); // "" pairs.set('\u201B', '\u201B'); // ‛‛ pairs.set('\u201E', '\u201C'); // „" pairs.set('\u201F', '\u201F'); // ‟‟ pairs.set('\u2039', '\u203A'); // ‹› pairs.set('\u300A', '\u300B'); // 《》 pairs.set('\u300C', '\u300D'); // 「」 return pairs; } function escapeRegex(s: string): string { return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } function buildQuotesRegex(): RegExp { let pairs = getQuotePairs(); let patterns: string[] = []; for (let [left, right] of pairs) { patterns.push(`${escapeRegex(left)}[\\s\\S]*?${escapeRegex(right)}`); } return new RegExp(patterns.join('|'), 'gu'); } export const PARENS_REGEX = /[((<{\[](?:[^)\]}>)]|\\[)\]}>)])*[)\]}>)]/gu; export const EMAIL_REGEX = /[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,7}/gu; export const NUMBERED_REFERENCE_REGEX = /^(\s*\[\d+\])+/u; export const SPACE_AFTER_SEPARATOR = /^\s+/u; export const QUOTES_REGEX = buildQuotesRegex(); export const EXCLAMATION_WORDS: readonly string[] = [ '!X\u0169', '!Kung', '\u01C3\u02BCO\u01C3Kung', '!Xuun', '!Kung-Ekoka', '\u01C3Hu', '\u01C3Khung', '\u01C3Ku', '\u01C3ung', '\u01C3Xo', '\u01C3X\u00FB', '\u01C3Xung', '\u01C3X\u0169', '!Xun', 'Yahoo!', 'Y!J', 'Yum!', ]; export const GLOBAL_SENTENCE_TERMINATORS: readonly string[] = [ '!', '.', '?', '\u0589', // ։ Armenian Full Stop '\u061D', // ؝ Arabic End Of Text Mark '\u061E', // ؞ Arabic Triple Dot Punctuation Mark '\u061F', // ؟ Arabic Question Mark '\u06D4', // ۔ Arabic Full Stop '\u0700', // ܀ Syriac End Of Paragraph '\u0701', // ܁ Syriac Supralinear Full Stop '\u0702', // ܂ Syriac Sublinear Full Stop '\u07F9', // ߹ Nko Exclamation Mark '\u0837', // ࠷ Samaritan Punctuation Melodic Qitsa '\u0839', // ࠹ Samaritan Punctuation Qitsa '\u083D', // ࠽ Samaritan Punctuation Sof Mashfaat '\u083E', // ࠾ Samaritan Punctuation Annaau '\u0964', // । Devanagari Danda '\u0965', // ॥ Devanagari Double Danda '\u104A', // ၊ Myanmar Sign Little Section '\u104B', // ။ Myanmar Sign Section '\u1362', // ። Ethiopic Full Stop '\u1367', // ፧ Ethiopic Question Mark '\u1368', // ፨ Ethiopic Paragraph Separator '\u166E', // ᙮ Canadian Syllabics Full Stop '\u1735', // ᜵ Philippine Single Punctuation '\u1736', // ᜶ Philippine Double Punctuation '\u1803', // ᠃ Mongolian Full Stop '\u1809', // ᠉ Mongolian Manchu Full Stop '\u1944', // ᥄ Limbu Exclamation Mark '\u1945', // ᥅ Limbu Question Mark '\u1AA8', // ᪨ Tai Tham Sign Kaan '\u1AA9', // ᪩ Tai Tham Sign Kaankuu '\u1AAA', // ᪪ Tai Tham Sign Satkaan '\u1AAB', // ᪫ Tai Tham Sign Satkaankuu '\u1B5A', // ᭚ Balinese Panti '\u1B5B', // ᭛ Balinese Pamada '\u1B5E', // ᭞ Balinese Carik Siki '\u1B5F', // ᭟ Balinese Carik Pareren '\u1B7D', // ᭽ Balinese Panti Lantang '\u1B7E', // ᭾ Balinese Pamada Lantang '\u1C3B', // ᰻ Lepcha Punctuation Ta-Rol '\u1C3C', // ᰼ Lepcha Punctuation Nyet Thyoom Ta-Rol '\u1C7E', // ᱾ Ol Chiki Punctuation Mucaad '\u1C7F', // ᱿ Ol Chiki Punctuation Double Mucaad '\u2024', // ․ One Dot Leader '\u203C', // ‼ Double Exclamation Mark '\u203D', // ‽ Interrobang '\u2047', // ⁇ Double Question Mark '\u2048', // ⁈ Question Exclamation Mark '\u2049', // ⁉ Exclamation Question Mark '\u2E2E', // ⸮ Reversed Question Mark '\u2E3C', // ⸼ Stenographic Full Stop '\u2E53', // ⹓ Medieval Exclamation Mark '\u2E54', // ⹔ Medieval Question Mark '\uA4FF', // ꓿ Lisu Punctuation Full Stop '\uA60E', // ꘎ Vai Full Stop '\uA60F', // ꘏ Vai Question Mark '\uA6F3', // ꛳ Bamum Full Stop '\uA6F7', // ꛷ Bamum Question Mark '\uA876', // ꡶ Phags-Pa Mark Shad '\uA877', // ꡷ Phags-Pa Mark Double Shad '\uA8CE', // ꣎ Saurashtra Danda '\uA8CF', // ꣏ Saurashtra Double Danda '\uA92F', // ꤯ Kayah Li Sign Shya '\uA9C8', // ꧈ Javanese Pada Lingsa '\uA9C9', // ꧉ Javanese Pada Lungsi '\uAA5D', // ꩝ Cham Punctuation Danda '\uAA5E', // ꩞ Cham Punctuation Double Danda '\uAA5F', // ꩟ Cham Punctuation Triple Danda '\uAAF0', // ꫰ Meetei Mayek Cheikhan '\uAAF1', // ꫱ Meetei Mayek Ahang Khudam '\uABEB', // ꯫ Meetei Mayek Cheikhei '\uFE52', // ﹒ Small Full Stop '\uFE56', // ﹖ Small Question Mark '\uFE57', // ﹗ Small Exclamation Mark '\uFF01', // ! Fullwidth Exclamation Mark '\uFF0E', // .Fullwidth Full Stop '\uFF1F', // ? Fullwidth Question Mark '\u{10A56}', // 𐩖 Kharoshthi Punctuation Danda '\u{10A57}', // 𐩗 Kharoshthi Punctuation Double Danda '\u{10F55}', // 𐽕 Sogdian Punctuation Two Vertical Bars '\u{10F56}', // 𐽖 Sogdian Punctuation Two Vertical Bars With Dots '\u{10F57}', // 𐽗 Sogdian Punctuation Circle With Dot '\u{10F58}', // 𐽘 Sogdian Punctuation Two Circles With Dots '\u{10F59}', // 𐽙 Sogdian Punctuation Half Circle With Dot '\u{10F86}', // 𐾆 Old Uyghur Punctuation Bar '\u{10F87}', // 𐾇 Old Uyghur Punctuation Two Bars '\u{10F88}', // 𐾈 Old Uyghur Punctuation Two Dots '\u{10F89}', // 𐾉 Old Uyghur Punctuation Four Dots '\u{11047}', // 𑁇 Brahmi Danda '\u{11048}', // 𑁈 Brahmi Double Danda '\u{110BE}', // 𑂾 Kaithi Section Mark '\u{110BF}', // 𑂿 Kaithi Double Section Mark '\u{110C0}', // 𑃀 Kaithi Danda '\u{110C1}', // 𑃁 Kaithi Double Danda '\u{11141}', // 𑅁 Chakma Danda '\u{11142}', // 𑅂 Chakma Double Danda '\u{11143}', // 𑅃 Chakma Question Mark '\u{111C5}', // 𑇅 Sharada Danda '\u{111C6}', // 𑇆 Sharada Double Danda '\u{111CD}', // 𑇍 Sharada Sutra Mark '\u{111DE}', // 𑇞 Sharada Section Mark-1 '\u{111DF}', // 𑇟 Sharada Section Mark-2 '\u{11238}', // 𑈸 Khojki Danda '\u{11239}', // 𑈹 Khojki Double Danda '\u{1123B}', // 𑈻 Khojki Section Mark '\u{1123C}', // 𑈼 Khojki Double Section Mark '\u{112A9}', // 𑊩 Multani Section Mark '\u{1144B}', // 𑑋 Newa Danda '\u{1144C}', // 𑑌 Newa Double Danda '\u{115C2}', // 𑗂 Siddham Danda '\u{115C3}', // 𑗃 Siddham Double Danda '\u{115C9}', // 𑗉 Siddham End Of Text Mark '\u{115CA}', // 𑗊 Siddham Section Mark '\u{115CB}', // 𑗋 Siddham Section Mark '\u{115CC}', // 𑗌 Siddham Section Mark '\u{115CD}', // 𑗍 Siddham Section Mark '\u{115CE}', // 𑗎 Siddham Section Mark '\u{115CF}', // 𑗏 Siddham Section Mark Double Ring '\u{115D0}', // 𑗐 Siddham Section Mark Double Ring With Rays '\u{115D1}', // 𑗑 Siddham Section Mark With Double Crescents '\u{115D2}', // 𑗒 Siddham Section Mark With Triple Crescents '\u{115D3}', // 𑗓 Siddham Section Mark With Quadruple Crescents '\u{115D4}', // 𑗔 Siddham Section Mark With Septuple Crescents '\u{115D5}', // 𑗕 Siddham Section Mark With Circles And Rays '\u{115D6}', // 𑗖 Siddham Section Mark With Circles And Two Enclosures '\u{115D7}', // 𑗗 Siddham Section Mark With Circles And Four Enclosures '\u{11641}', // 𑙁 Modi Danda '\u{11642}', // 𑙂 Modi Double Danda '\u{1173C}', // 𑜼 Ahom Sign Small Section '\u{1173D}', // 𑜽 Ahom Sign Section '\u{1173E}', // 𑜾 Ahom Sign Rulai '\u{11944}', // 𑥄 Dives Akuru Double Danda '\u{11946}', // 𑥆 Dives Akuru End Of Text Mark '\u{11A42}', // 𑩂 Zanabazar Square Mark Shad '\u{11A43}', // 𑩃 Zanabazar Square Mark Double Shad '\u{11A9B}', // 𑪛 Soyombo Mark Shad '\u{11A9C}', // 𑪜 Soyombo Mark Double Shad '\u{11C41}', // 𑱁 Bhaiksuki Danda '\u{11C42}', // 𑱂 Bhaiksuki Double Danda '\u{11EF7}', // 𑻷 Makasar Passimbang '\u{11EF8}', // 𑻸 Makasar End Of Section '\u{11F43}', // 𑽃 Kawi Danda '\u{11F44}', // 𑽄 Kawi Double Danda '\u{16A6E}', // 𖩮 Mro Danda '\u{16A6F}', // 𖩯 Mro Double Danda '\u{16AF5}', // 𖫵 Bassa Vah Full Stop '\u{16B37}', // 𖬷 Pahawh Hmong Sign Vos Thom '\u{16B38}', // 𖬸 Pahawh Hmong Sign Vos Tshab Ceeb '\u{16B44}', // 𖭄 Pahawh Hmong Sign Xaus '\u{16E98}', // 𖺘 Medefaidrin Full Stop '\u{1BC9F}', // 𛲟 Duployan Punctuation Chinook Full Stop '\u{1DA88}', // 𝪈 Signwriting Full Stop '\u3002', // 。 Ideographic Full Stop '\uFF61', // 。 Halfwidth Ideographic Full Stop ]; // Build a Set for O(1) lookup export const SENTENCE_TERMINATOR_SET: Set = new Set(GLOBAL_SENTENCE_TERMINATORS); // Build the default terminator character class for regex // For chars in the BMP, we can use them directly in a character class. // For supplementary plane chars, we need alternation. function buildTerminatorsPattern(): string { let bmpChars: string[] = []; let supplementary: string[] = []; for (let t of GLOBAL_SENTENCE_TERMINATORS) { if (t.length === 1) { bmpChars.push(escapeRegex(t)); } else { // Surrogate pair or multi-char — use alternation supplementary.push(escapeRegex(t)); } } // Character class for BMP + alternation for supplementary let pattern = `[${bmpChars.join('')}]`; if (supplementary.length > 0) { pattern = `(?:${pattern}|${supplementary.join('|')})`; } return pattern; } export const TERMINATORS_PATTERN: string = buildTerminatorsPattern(); node-sentencex-ts-0.1.13-ts/src/fallbacks.ts000066400000000000000000000222271514371216700206600ustar00rootroot00000000000000export const LANGUAGE_FALLBACKS: ReadonlyMap = new Map([ ['aae', ['it']], ['ab', ['ru']], ['abs', ['id']], ['ace', ['id']], ['acm', ['ar']], ['ady', ['ady-cyrl']], ['aeb', ['aeb-arab']], ['aeb-arab', ['ar']], ['aln', ['sq']], ['als', ['gsw', 'de']], ['alt', ['ru']], ['ami', ['zh-tw', 'zh-hant', 'zh', 'zh-hans']], ['an', ['es']], ['anp', ['hi']], ['apc', ['ar']], ['arn', ['es']], ['arq', ['ar']], ['ary', ['ar']], ['arz', ['ar']], ['ast', ['es']], ['atj', ['fr']], ['av', ['ru']], ['avk', ['fr', 'es', 'ru']], ['awa', ['hi']], ['ay', ['es']], ['azb', ['fa']], ['ba', ['ru']], ['ban', ['id']], ['ban-bali', ['ban']], ['bar', ['de']], ['bat-smg', ['sgs', 'lt']], ['bbc', ['bbc-latn']], ['bbc-latn', ['id']], ['bcc', ['fa']], ['bci', ['fr']], ['bdr', ['ms']], ['be-tarask', ['be']], ['be-x-old', ['be-tarask', 'be']], ['bew', ['id']], ['bgn', ['fa']], ['bh', ['bho']], ['bjn', ['id']], ['blk', ['my']], ['bm', ['fr']], ['bpy', ['bn']], ['bqi', ['fa']], ['btm', ['id']], ['bug', ['id']], ['bug-bugi', ['bug', 'id']], ['bxr', ['ru']], ['ca', ['oc']], ['cbk-zam', ['es']], ['cdo', ['cdo-latn', 'cdo-hant', 'nan-hant', 'zh-hant', 'zh', 'zh-hans']], ['cdo-hant', ['cdo', 'cdo-latn', 'nan-hant', 'zh-hant', 'zh', 'zh-hans']], ['cdo-latn', ['cdo', 'cdo-hant', 'nan-hant', 'zh-hant', 'zh', 'zh-hans']], ['ce', ['ru']], ['co', ['it']], ['cpx', ['cpx-hant', 'cpx-hans', 'cpx-latn', 'cdo', 'zh-hant', 'zh', 'zh-hans']], ['cpx-hans', ['cpx', 'cpx-hant', 'cpx-latn', 'cdo', 'zh-hans', 'zh', 'zh-hant']], ['cpx-hant', ['cpx', 'cpx-hans', 'cpx-latn', 'cdo', 'zh-hant', 'zh', 'zh-hans']], ['crh', ['crh-latn', 'tr']], ['crh-cyrl', ['tr']], ['crh-latn', ['tr']], ['cs', ['sk']], ['csb', ['pl']], ['cv', ['ru']], ['de-at', ['de']], ['de-ch', ['de']], ['de-formal', ['de']], ['dsb', ['hsb', 'de']], ['dtp', ['ms']], ['dty', ['ne']], ['dua', ['fr']], ['egl', ['it']], ['eml', ['it']], ['es-formal', ['es']], ['ext', ['es']], ['fit', ['fi']], ['fiu-vro', ['vro', 'et']], ['fon', ['fr']], ['frc', ['fr']], ['frp', ['fr']], ['frr', ['de']], ['fur', ['it']], ['gag', ['tr']], ['gan', ['gan-hant', 'gan-hans', 'zh-hant', 'zh', 'zh-hans']], ['gan-hans', ['gan', 'gan-hant', 'zh-hans', 'zh', 'zh-hant']], ['gan-hant', ['gan', 'gan-hans', 'zh-hant', 'zh', 'zh-hans']], ['gcf', ['fr']], ['gcr', ['fr']], ['gl', ['pt']], ['gld', ['ru']], ['glk', ['fa']], ['gn', ['es']], ['gom', ['gom-deva', 'gom-latn']], ['gom-deva', ['gom-latn']], ['gor', ['id']], ['gsw', ['de']], ['guc', ['es']], ['hak', ['zh-hant', 'zh', 'zh-hans']], ['hif', ['hif-latn']], ['hke', ['fr']], ['hrx', ['de']], ['hsb', ['dsb', 'de']], ['hsn', ['zh-hant', 'zh', 'zh-hans']], ['ht', ['fr']], ['hu-formal', ['hu']], ['hyw', ['hy']], ['iba', ['ms']], ['ii', ['zh-cn', 'zh-hans', 'zh', 'zh-hant']], ['ike-cans', ['iu']], ['ike-latn', ['iu']], ['inh', ['ru']], ['io', ['eo']], ['iu', ['ike-cans']], ['jut', ['da']], ['jv', ['id']], ['kaa', ['kk-latn', 'kk-cyrl']], ['kab', ['fr']], ['kbd', ['kbd-cyrl']], ['kbp', ['fr']], ['kea', ['pt']], ['kge', ['id']], ['khw', ['ur']], ['kiu', ['tr']], ['kjh', ['ru']], ['kjp', ['my']], ['kk', ['kk-cyrl']], ['kk-arab', ['kk', 'kk-cyrl']], ['kk-cn', ['kk-arab', 'kk', 'kk-cyrl']], ['kk-cyrl', ['kk']], ['kk-kz', ['kk-cyrl', 'kk']], ['kk-latn', ['kk', 'kk-cyrl']], ['kk-tr', ['kk-latn', 'kk', 'kk-cyrl']], ['kl', ['da']], ['ko-kp', ['ko']], ['koi', ['ru']], ['kr', ['knc']], ['krc', ['ru']], ['krl', ['fi']], ['ks', ['ks-arab']], ['ksh', ['de']], ['ksw', ['my']], ['ku', ['ku-latn']], ['ku-arab', ['ku', 'ckb']], ['ku-latn', ['ku']], ['kum', ['ru']], ['kv', ['ru']], ['lad', ['es']], ['lb', ['de']], ['lbe', ['ru']], ['lez', ['ru', 'az']], ['li', ['nl']], ['lij', ['it']], ['liv', ['et']], ['ljp', ['id']], ['lki', ['fa']], ['lld', ['it', 'rm', 'fur']], ['lmo', ['pms', 'eml', 'lij', 'vec', 'it']], ['ln', ['fr']], ['lrc', ['fa']], ['ltg', ['lv']], ['lua', ['fr']], ['luz', ['fa']], ['lzh', ['zh-hant', 'zh', 'zh-hans']], ['lzz', ['tr']], ['mad', ['id']], ['mag', ['hi']], ['mai', ['hi']], ['map-bms', ['jv', 'id']], ['mdf', ['myv', 'ru']], ['mg', ['fr']], ['mhr', ['mrj', 'ru']], ['min', ['id']], ['mnc-latn', ['mnc']], ['mnc-mong', ['mnc']], ['mnw', ['my']], ['mo', ['ro']], ['mrj', ['mhr', 'ru']], ['ms-arab', ['ms']], ['mui', ['id']], ['mwl', ['pt']], ['myv', ['mdf', 'ru']], ['mzn', ['fa']], ['nah', ['es']], ['nan', ['nan-latn-pehoeji', 'nan-latn-tailo', 'nan-hant', 'cdo', 'zh-hant', 'zh', 'zh-hans']], ['nan-hant', ['nan', 'nan-latn-pehoeji', 'nan-latn-tailo', 'cdo', 'zh-hant', 'zh', 'zh-hans']], [ 'nan-latn-pehoeji', ['nan-latn', 'nan-latn-tailo', 'nan', 'nan-hant', 'cdo', 'zh-hant', 'zh', 'zh-hans'], ], [ 'nan-latn-tailo', ['nan-latn', 'nan-latn-pehoeji', 'nan', 'nan-hant', 'cdo', 'zh-hant', 'zh', 'zh-hans'], ], ['nap', ['it']], ['nb', ['no', 'nn']], ['nds', ['de']], ['nds-nl', ['nl']], ['nia', ['id']], ['nl-informal', ['nl']], ['nn', ['no', 'nb']], ['no', ['nb', 'nn']], ['nrm', ['nrf', 'fr']], ['nyo', ['ttj', 'nyn', 'lg', 'sw']], ['oc', ['ca', 'fr']], ['olo', ['fi']], ['os', ['ru']], ['pcd', ['fr']], ['pdc', ['de']], ['pdt', ['de']], ['pfl', ['de']], ['pms', ['it']], ['pnt', ['el']], ['pt', ['pt-br']], ['pt-br', ['pt']], ['pwn', ['zh-tw', 'zh-hant', 'zh', 'zh-hans']], ['qu', ['qug', 'es']], ['qug', ['qu', 'es']], ['rgn', ['it']], ['rm', ['de']], ['rmy', ['ro']], ['roa-rup', ['rup', 'ro']], ['roa-tara', ['it']], ['rsk', ['sr-cyrl', 'sr-ec']], ['rue', ['uk', 'ru']], ['rup', ['ro']], ['ruq', ['ruq-latn', 'ro']], ['ruq-cyrl', ['mk']], ['ruq-latn', ['ro']], ['rut', ['ru']], ['sa', ['hi']], ['sah', ['ru']], ['scn', ['it']], ['sdc', ['it']], ['sdh', ['ckb', 'fa']], ['se', ['nb', 'fi']], ['se-fi', ['se', 'fi', 'sv']], ['se-no', ['se', 'nb', 'nn']], ['se-se', ['se', 'sv']], ['ses', ['fr']], ['sg', ['fr']], ['sgs', ['lt']], ['sh', ['sh-latn', 'sh-cyrl', 'bs', 'sr-latn', 'sr-el', 'hr']], ['sh-cyrl', ['sr-cyrl', 'sr-ec', 'sh', 'sh-latn']], ['sh-latn', ['sh', 'sh-cyrl', 'bs', 'sr-latn', 'sr-el', 'hr']], ['shi', ['shi-latn', 'fr']], ['shy', ['shy-latn']], ['shy-latn', ['fr']], ['sjd', ['ru']], ['sk', ['cs']], ['skr', ['skr-arab']], ['skr-arab', ['skr']], ['sli', ['de']], ['sma', ['sv', 'nb']], ['smn', ['fi']], ['sr', ['sr-cyrl', 'sr-ec', 'sr-latn', 'sr-el']], ['sr-cyrl', ['sr-ec', 'sr']], ['sr-ec', ['sr-cyrl', 'sr']], ['sr-el', ['sr-latn', 'sr']], ['sr-latn', ['sr-el', 'sr']], ['srn', ['nl']], ['sro', ['it']], ['stq', ['de']], ['sty', ['ru']], ['su', ['id']], ['szl', ['pl']], ['szy', ['zh-tw', 'zh-hant', 'zh', 'zh-hans']], ['tay', ['zh-tw', 'zh-hant', 'zh', 'zh-hans']], ['tcy', ['kn']], ['tet', ['pt']], ['tg', ['tg-cyrl']], ['tg-cyrl', ['tg']], ['tg-latn', ['tg']], ['trv', ['zh-tw', 'zh-hant', 'zh', 'zh-hans']], ['tt', ['tt-cyrl', 'ru']], ['ttj', ['nyo', 'nyn', 'lg', 'sw']], ['tt-cyrl', ['ru']], ['ty', ['fr']], ['tyv', ['ru']], ['udm', ['ru']], ['ug', ['ug-arab']], ['vec', ['it']], ['vep', ['et']], ['vls', ['nl']], ['vmf', ['de']], ['vmw', ['pt']], ['vot', ['fi']], ['vro', ['et']], ['wa', ['fr']], ['wls', ['fr']], ['wo', ['fr']], ['wuu', ['wuu-hans', 'wuu-hant', 'zh-hans', 'zh', 'zh-hant']], ['wuu-hans', ['wuu', 'wuu-hant', 'zh-hans', 'zh', 'zh-hant']], ['wuu-hant', ['wuu', 'wuu-hans', 'zh-hant', 'zh', 'zh-hans']], ['xal', ['ru']], ['xmf', ['ka']], ['yi', ['he']], ['yue', ['yue-hant', 'yue-hans']], ['yue-hans', ['yue', 'yue-hant']], ['yue-hant', ['yue', 'yue-hans']], ['za', ['zh-hans', 'zh', 'zh-hant']], ['zh-classical', ['lzh', 'zh-hant', 'zh', 'zh-hans']], ['zh-cn', ['zh-hans', 'zh', 'zh-hant']], ['zh-hans', ['zh-cn', 'zh', 'zh-hant']], ['zh-hant', ['zh-tw', 'zh-hk', 'zh', 'zh-hans']], ['zh-hk', ['zh-hant', 'zh-tw', 'zh', 'zh-hans']], [ 'zh-min-nan', [ 'nan', 'nan-latn-pehoeji', 'nan-latn-tailo', 'nan-hant', 'cdo', 'zh-hant', 'zh', 'zh-hans', ], ], ['zh-mo', ['zh-hk', 'zh-hant', 'zh-tw', 'zh', 'zh-hans']], ['zh-my', ['zh-sg', 'zh-hans', 'zh-cn', 'zh', 'zh-hant']], ['zh-sg', ['zh-hans', 'zh-cn', 'zh', 'zh-hant']], ['zh-tw', ['zh-hant', 'zh-hk', 'zh', 'zh-hans']], ['zh-yue', ['yue', 'yue-hant', 'yue-hans']], ]); node-sentencex-ts-0.1.13-ts/src/index.ts000066400000000000000000000063351514371216700200470ustar00rootroot00000000000000export { Language, parseAbbreviations } from './language'; export type { SentenceBoundary } from './language'; export { chunkText } from './chunk-text'; export { LANGUAGE_FALLBACKS } from './fallbacks'; export { LANGUAGE_REGISTRY } from './languages'; import type { SentenceBoundary } from './language'; import { Language } from './language'; import { chunkText } from './chunk-text'; import { LANGUAGE_FALLBACKS } from './fallbacks'; import { LANGUAGE_REGISTRY } from './languages'; export function languageFactory(languageCode: string): Language { let currentCode = languageCode; let visited = new Set(); while (true) { if (visited.has(currentCode)) { currentCode = 'en'; } else { visited.add(currentCode); } let LangClass = LANGUAGE_REGISTRY.get(currentCode); if (LangClass) { return new LangClass(); } let fallbacks = LANGUAGE_FALLBACKS.get(currentCode); if (fallbacks) { let found = false; for (let nextCode of fallbacks) { if (!visited.has(nextCode)) { currentCode = nextCode; found = true; break; } } if (!found) { currentCode = 'en'; } } else { currentCode = 'en'; } } } const CHUNK_SIZE = 10 * 1024; // 10KB export function segment(languageCode: string, text: string): string[] { let language = languageFactory(languageCode); if (text.length > CHUNK_SIZE) { let chunks = chunkText(text, CHUNK_SIZE); let allSentences: string[] = []; for (let chunk of chunks) { let chunkSentences = language.segment(chunk); allSentences.push(...chunkSentences); } return allSentences; } return language.segment(text); } export function getSentenceBoundaries(languageCode: string, text: string): SentenceBoundary[] { let BOUNDARY_CHUNK_SIZE = 10 * 100; // Match Rust's get_sentence_boundaries chunk size let language = languageFactory(languageCode); if (text.length > BOUNDARY_CHUNK_SIZE) { let chunks = chunkText(text, BOUNDARY_CHUNK_SIZE); let allBoundaries: SentenceBoundary[] = []; let chunkOffset = 0; for (let chunk of chunks) { let chunkBoundaries = language.getSentenceBoundaries(chunk); let prevEndIndex = 0; for (let boundary of chunkBoundaries) { let startIndex = prevEndIndex > 0 ? prevEndIndex : [...text.slice(0, boundary.startIndex + chunkOffset)].length; let endIndex = startIndex + [...boundary.text].length; prevEndIndex = endIndex; allBoundaries.push({ startIndex, endIndex, text: boundary.text, boundarySymbol: boundary.boundarySymbol, isParagraphBreak: boundary.isParagraphBreak, }); } chunkOffset += chunk.length; } return allBoundaries; } return language.getSentenceBoundaries(text); } node-sentencex-ts-0.1.13-ts/src/language.ts000066400000000000000000000267451514371216700205320ustar00rootroot00000000000000import { EXCLAMATION_WORDS, SENTENCE_TERMINATOR_SET, TERMINATORS_PATTERN, QUOTES_REGEX, PARENS_REGEX, EMAIL_REGEX, NUMBERED_REFERENCE_REGEX, SPACE_AFTER_SEPARATOR, } from './constants'; export interface SentenceBoundary { startIndex: number; endIndex: number; text: string; boundarySymbol: string | null; isParagraphBreak: boolean; } export enum SkippableRangeType { Quote = 'Quote', Parentheses = 'Parentheses', Email = 'Email', } export interface SkippableRange { start: number; end: number; rangeType: SkippableRangeType; } function skippableContains(range: SkippableRange, position: number): boolean { return position > range.start && position < range.end; } function isQuoteRange(range: SkippableRange): boolean { return range.rangeType === SkippableRangeType.Quote; } const CONTINUE_REGEX = /^[0-9a-z]/; // Regex cache for sentence break patterns const sentenceBreakRegexCache = new Map(); export function parseAbbreviations(...texts: string[]): string[] { let result: string[] = []; for (let text of texts) { for (let line of text.split('\n')) { let trimmed = line.trim(); if (trimmed && !trimmed.startsWith('#')) { result.push(trimmed); } } } return result; } /** * Advance past one full Unicode code point from position `pos` in `text`. * Returns the number of UTF-16 code units consumed (1 for BMP, 2 for supplementary). */ function charAdvance(text: string, pos: number): number { let code = text.codePointAt(pos); if (code === undefined) return 1; return code > 0xffff ? 2 : 1; } export abstract class Language { abstract getAbbreviations(): readonly string[]; getAbbreviationChar(): string { return '.'; } getSentenceBreakRegex(): RegExp { let pattern = `${TERMINATORS_PATTERN}+`; let regex = sentenceBreakRegexCache.get(pattern); if (!regex) { regex = new RegExp(pattern, 'gu'); sentenceBreakRegexCache.set(pattern, regex); } return regex; } getSentenceBoundaries(text: string): SentenceBoundary[] { let boundaries: SentenceBoundary[] = []; // Split by paragraph breaks let paraSplitRe = /\n[\r]*\n/g; let paragraphs = text.split(paraSplitRe); // Pre-calculate paragraph offsets (in UTF-16 code unit indices) let paragraphOffsets: number[] = []; let currentOffset = 0; for (let i = 0; i < paragraphs.length; i++) { paragraphOffsets.push(currentOffset); currentOffset += paragraphs[i].length; if (i < paragraphs.length - 1) { // Find the actual separator length // We need to account for the paragraph separator that was split on // The split removes the separator, so we need to find it currentOffset += 2; // "\n\n" minimum // Check if there was a \r in between let sepStart = paragraphOffsets[i] + paragraphs[i].length; let remaining = text.slice(sepStart); let sepMatch = remaining.match(/^\n[\r]*\n/); if (sepMatch) { currentOffset = sepStart + sepMatch[0].length; } } } let sentenceBounds: number[] = []; for (let pindex = 0; pindex < paragraphs.length; pindex++) { let paragraph = paragraphs[pindex]; if (pindex > 0) { let paraStart = paragraphOffsets[pindex]; boundaries.push({ startIndex: paraStart - 2, endIndex: paraStart, text: '\n\n', boundarySymbol: null, isParagraphBreak: true, }); } let paraOffset = paragraphOffsets[pindex]; sentenceBounds.length = 0; sentenceBounds.push(0); // Find all terminator matches let breakRegex = this.getSentenceBreakRegex(); // Reset lastIndex for global regex breakRegex.lastIndex = 0; let matches: Array<[number, number]> = []; let m: RegExpExecArray | null; while ((m = breakRegex.exec(paragraph)) !== null) { matches.push([m.index, m.index + m[0].length]); } let skippableRanges = this.getSkippableRanges(paragraph); for (let [start, end] of matches) { let boundary = this.findBoundary(paragraph, start, end); if (boundary === null) { continue; } let inRange = false; for (let range of skippableRanges) { if (skippableContains(range, boundary)) { let nextWord = this.getNextWordApprox(text, paraOffset + range.end); let boundaryExtend = this.getBoundaryExtend(nextWord); // Check if boundary is right at the end of a quote range let nextCharBoundary = boundary + charAdvance(paragraph, boundary); if ( isQuoteRange(range) && nextCharBoundary === range.end && boundaryExtend >= 0 ) { boundary = range.end + boundaryExtend; inRange = false; } else { inRange = true; } break; } } if (inRange) { continue; } sentenceBounds.push(boundary); } if (sentenceBounds[sentenceBounds.length - 1] !== paragraph.length) { sentenceBounds.push(paragraph.length); } for (let i = 0; i < sentenceBounds.length - 1; i++) { let start = sentenceBounds[i]; let end = sentenceBounds[i + 1]; if (start >= paragraph.length || end > paragraph.length || start > end) { continue; } let sentenceText = paragraph.slice(start, end); // Detect boundary symbol by trimming trailing whitespace let boundarySymbol: string | null = null; if (end > 0 && end <= paragraph.length) { let sentenceSlice = paragraph.slice(0, end); let trimmedSlice = sentenceSlice.trimEnd(); if (trimmedSlice.length > 0) { // Iterate to get the last full Unicode character safely let chars = [...trimmedSlice]; let lastFullChar = chars[chars.length - 1]; if (SENTENCE_TERMINATOR_SET.has(lastFullChar)) { boundarySymbol = lastFullChar; } } } let startIndex = paraOffset + start; let endIndex = paraOffset + end; boundaries.push({ startIndex, endIndex, text: sentenceText, boundarySymbol, isParagraphBreak: false, }); } } return boundaries; } segment(text: string): string[] { let boundaries = this.getSentenceBoundaries(text); let sentences: string[] = []; for (let boundary of boundaries) { if (boundary.text.length > 0) { sentences.push(boundary.text); } } return sentences; } getBoundaryExtend(word: string): number { if (this.continueInNextWord(word.trim())) { return -1; } let count = 0; for (let ch of word) { if (/\s/.test(ch) || SENTENCE_TERMINATOR_SET.has(ch)) { count += ch.length; // Account for surrogate pairs } else { break; } } return count; } isAbbreviation(head: string, _tail: string, separator: string): boolean { if (this.getAbbreviationChar() !== separator) { return false; } let lastWord = this.getLastWord(head); if (!lastWord) { return false; } let abbreviations = this.getAbbreviations(); return ( abbreviations.includes(lastWord) || abbreviations.includes(lastWord.toLowerCase()) || abbreviations.includes(lastWord.toUpperCase()) ); } getLastWord(text: string): string { let parts = text.split(/[\s.]/); return parts[parts.length - 1] || ''; } isExclamation(head: string, _tail: string): boolean { let lastWord = this.getLastWord(head); let exclamationWord = `${lastWord}!`; return EXCLAMATION_WORDS.includes(exclamationWord); } getNextWordApprox(text: string, start: number): string { if (start >= text.length) { return ''; } let maxChars = 30; let endPos = Math.min(start + maxChars, text.length); return text.slice(start, endPos); } findBoundary(text: string, start: number, end: number): number | null { let head = text.slice(0, start); let nextIndex = start + charAdvance(text, start); let nextWordApprox = this.getNextWordApprox(text, nextIndex); let numberRefMatch = NUMBERED_REFERENCE_REGEX.exec(nextWordApprox); if (numberRefMatch) { return nextIndex + numberRefMatch[0].length; } if (this.continueInNextWord(nextWordApprox)) { return null; } if (this.isAbbreviation(head, nextWordApprox, text.slice(start, end))) { return null; } if (this.isExclamation(head, nextWordApprox)) { return null; } let spaceMatch = SPACE_AFTER_SEPARATOR.exec(nextWordApprox); if (spaceMatch) { return nextIndex + spaceMatch[0].length; } return end; } continueInNextWord(textAfterBoundary: string): boolean { return CONTINUE_REGEX.test(textAfterBoundary); } getSkippableRanges(text: string): SkippableRange[] { let ranges: SkippableRange[] = []; // Reset global regex lastIndex before matchAll let quotesRegex = new RegExp(QUOTES_REGEX.source, QUOTES_REGEX.flags); for (let mat of text.matchAll(quotesRegex)) { ranges.push({ start: mat.index!, end: mat.index! + mat[0].length, rangeType: SkippableRangeType.Quote, }); } let parensRegex = new RegExp(PARENS_REGEX.source, PARENS_REGEX.flags); for (let mat of text.matchAll(parensRegex)) { ranges.push({ start: mat.index!, end: mat.index! + mat[0].length, rangeType: SkippableRangeType.Parentheses, }); } let emailRegex = new RegExp(EMAIL_REGEX.source, EMAIL_REGEX.flags); for (let mat of text.matchAll(emailRegex)) { ranges.push({ start: mat.index!, end: mat.index! + mat[0].length, rangeType: SkippableRangeType.Email, }); } ranges.sort((a, b) => a.start - b.start); return ranges; } } node-sentencex-ts-0.1.13-ts/src/languages/000077500000000000000000000000001514371216700203275ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/src/languages/am.ts000066400000000000000000000004351514371216700212760ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import amText from '../abbrev/am.txt?raw'; const ABBREVIATIONS = parseAbbreviations(amText, amText); export class Amharic extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/ar.ts000066400000000000000000000005071514371216700213030ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import arText from '../abbrev/ar.txt?raw'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(arText, enText); export class Arabic extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/bg.ts000066400000000000000000000004271514371216700212720ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import bgText from '../abbrev/bg.txt?raw'; const ABBREVIATIONS = parseAbbreviations(bgText); export class Bulgarian extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/bn.ts000066400000000000000000000005101514371216700212720ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import bnText from '../abbrev/bn.txt?raw'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(bnText, enText); export class Bengali extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/ca.ts000066400000000000000000000007531514371216700212670ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import esText from '../abbrev/es.txt?raw'; // Catalan uses Spanish abbreviations const ABBREVIATIONS = parseAbbreviations(esText); const CONTINUE_REGEX = /^[^\p{L}\p{N}_]*[0-9a-z]/u; export class Catalan extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } continueInNextWord(textAfterBoundary: string): boolean { return CONTINUE_REGEX.test(textAfterBoundary); } } node-sentencex-ts-0.1.13-ts/src/languages/da.ts000066400000000000000000000007041514371216700212640ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import daText from '../abbrev/da.txt?raw'; const ABBREVIATIONS = parseAbbreviations(daText); const CONTINUE_REGEX = /^[^\p{L}\p{N}_]*[0-9a-z]/u; export class Danish extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } continueInNextWord(textAfterBoundary: string): boolean { return CONTINUE_REGEX.test(textAfterBoundary); } } node-sentencex-ts-0.1.13-ts/src/languages/de.ts000066400000000000000000000022531514371216700212710ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import deText from '../abbrev/de.txt?raw'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(deText, enText); const CONTINUE_REGEX = /^[^\p{L}\p{N}_]*[0-9a-z]/u; const GERMAN_MONTHS = [ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember', ]; const MONTHS_SET = new Set(GERMAN_MONTHS); export class German extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } continueInNextWord(textAfterBoundary: string): boolean { if (CONTINUE_REGEX.test(textAfterBoundary)) { return true; } let nextWord = (textAfterBoundary.trim().split(/\s+/)[0] || '').replace(/[?!.]/g, ''); if (!nextWord) return false; // Check month names (case-insensitive first letter capitalization) if (MONTHS_SET.has(nextWord)) return true; let capitalized = nextWord.charAt(0).toUpperCase() + nextWord.slice(1); if (MONTHS_SET.has(capitalized)) return true; return false; } } node-sentencex-ts-0.1.13-ts/src/languages/el.ts000066400000000000000000000010401514371216700212720ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import { TERMINATORS_PATTERN } from '../constants'; import elText from '../abbrev/el.txt?raw'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(elText, enText); export class Greek extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } getSentenceBreakRegex(): RegExp { // Greek adds semicolon as sentence terminator return new RegExp(`(?:${TERMINATORS_PATTERN}|;)+`, 'gu'); } } node-sentencex-ts-0.1.13-ts/src/languages/en.ts000066400000000000000000000004251514371216700213020ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(enText); export class English extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/es.ts000066400000000000000000000004251514371216700213070ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import esText from '../abbrev/es.txt?raw'; const ABBREVIATIONS = parseAbbreviations(esText); export class Spanish extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/fi.ts000066400000000000000000000020661514371216700213010ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import fiText from '../abbrev/fi.txt?raw'; const ABBREVIATIONS = parseAbbreviations(fiText); const CONTINUE_REGEX = /^[^\p{L}\p{N}_]*[0-9a-z]/u; const FINNISH_MONTHS = [ 'tammikuu', 'helmikuu', 'maaliskuu', 'huhtikuu', 'toukokuu', 'kes\u00E4kuu', 'hein\u00E4kuu', 'elokuu', 'syyskuu', 'lokakuu', 'marraskuu', 'joulukuu', ]; const MONTHS_SET = new Set(FINNISH_MONTHS); export class Finnish extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } continueInNextWord(textAfterBoundary: string): boolean { if (CONTINUE_REGEX.test(textAfterBoundary)) { return true; } let nextWord = textAfterBoundary.trim().split(/\s+/)[0] || ''; if (!nextWord) return false; if (MONTHS_SET.has(nextWord)) return true; let capitalized = nextWord.charAt(0).toUpperCase() + nextWord.slice(1); if (MONTHS_SET.has(capitalized)) return true; return false; } } node-sentencex-ts-0.1.13-ts/src/languages/fr.ts000066400000000000000000000004241514371216700213060ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import frText from '../abbrev/fr.txt?raw'; const ABBREVIATIONS = parseAbbreviations(frText); export class French extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/gu.ts000066400000000000000000000005111514371216700213070ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import guText from '../abbrev/gu.txt?raw'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(guText, enText); export class Gujarati extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/hi.ts000066400000000000000000000005061514371216700213000ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import hiText from '../abbrev/hi.txt?raw'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(hiText, enText); export class Hindi extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/hy.ts000066400000000000000000000024021514371216700213150ustar00rootroot00000000000000import { Language } from '../language'; import { GLOBAL_SENTENCE_TERMINATORS } from '../constants'; import { English } from './en'; const englishInstance = new English(); function escapeRegex(s: string): string { return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } // Armenian: excludes "." from terminators, adds ;։՜: function buildArmenianBreakRegex(): RegExp { let filtered = GLOBAL_SENTENCE_TERMINATORS.filter((t) => t !== '.'); let bmpChars: string[] = []; let supplementary: string[] = []; for (let t of filtered) { if (t.length === 1) { bmpChars.push(escapeRegex(t)); } else { supplementary.push(escapeRegex(t)); } } // Add Armenian-specific terminators bmpChars.push(';', '\u0589', '\u055C', ':'); // ; ։ ՜ : let pattern = `[${bmpChars.join('')}]`; if (supplementary.length > 0) { pattern = `(?:${pattern}|${supplementary.join('|')})`; } return new RegExp(`${pattern}+`, 'gu'); } const ARMENIAN_BREAK_REGEX = buildArmenianBreakRegex(); export class Armenian extends Language { getAbbreviations(): readonly string[] { return englishInstance.getAbbreviations(); } getSentenceBreakRegex(): RegExp { return ARMENIAN_BREAK_REGEX; } } node-sentencex-ts-0.1.13-ts/src/languages/index.ts000066400000000000000000000034021514371216700220050ustar00rootroot00000000000000import { Language } from '../language'; import { Amharic } from './am'; import { Arabic } from './ar'; import { Armenian } from './hy'; import { Bengali } from './bn'; import { Bulgarian } from './bg'; import { Burmese } from './my'; import { Catalan } from './ca'; import { Danish } from './da'; import { Dutch } from './nl'; import { English } from './en'; import { Finnish } from './fi'; import { French } from './fr'; import { German } from './de'; import { Greek } from './el'; import { Gujarati } from './gu'; import { Hindi } from './hi'; import { Italian } from './it'; import { Japanese } from './ja'; import { Kannada } from './kn'; import { Kazakh } from './kk'; import { Malayalam } from './ml'; import { Marathi } from './mr'; import { Polish } from './pl'; import { Portuguese } from './pt'; import { Punjabi } from './pa'; import { Russian } from './ru'; import { Slovak } from './sk'; import { Spanish } from './es'; import { Tamil } from './ta'; import { Telugu } from './te'; export type LanguageConstructor = new () => Language; export const LANGUAGE_REGISTRY: Map = new Map([ ['am', Amharic], ['ar', Arabic], ['bg', Bulgarian], ['bn', Bengali], ['ca', Catalan], ['da', Danish], ['de', German], ['en', English], ['es', Spanish], ['el', Greek], ['gu', Gujarati], ['hi', Hindi], ['hy', Armenian], ['ja', Japanese], ['ml', Malayalam], ['mr', Marathi], ['sk', Slovak], ['my', Burmese], ['nl', Dutch], ['pt', Portuguese], ['it', Italian], ['ta', Tamil], ['te', Tamil], // Telugu maps to Tamil in Rust factory ['kn', Kannada], ['kk', Kazakh], ['pa', Punjabi], ['pl', Polish], ['fr', French], ['fi', Finnish], ['ru', Russian], ]); node-sentencex-ts-0.1.13-ts/src/languages/it.ts000066400000000000000000000013311514371216700213110ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import itText from '../abbrev/it.txt?raw'; const ABBREVIATIONS = parseAbbreviations(itText); const CONTINUE_REGEX = /^[0-9a-z]/; export class Italian extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } getLastWord(text: string): string { let parts = text.split(/[\s.]/); let lastWord = parts[parts.length - 1] || ''; // Handle l' contractions (e.g., "l'Avv" -> "Avv") let lParts = lastWord.split("l'"); return lParts[lParts.length - 1] || ''; } continueInNextWord(textAfterBoundary: string): boolean { return CONTINUE_REGEX.test(textAfterBoundary); } } node-sentencex-ts-0.1.13-ts/src/languages/ja.ts000066400000000000000000000003111514371216700212640ustar00rootroot00000000000000import { Language } from '../language'; const ABBREVIATIONS: string[] = []; export class Japanese extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/kk.ts000066400000000000000000000012051514371216700213020ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import kkText from '../abbrev/kk.txt?raw'; const ABBREVIATIONS = parseAbbreviations(kkText); const CYRILLIC_CONTINUE_REGEX = /^[^\p{L}\p{N}_]*[0-9a-z\u0430-\u044f]/u; export class Kazakh extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } getLastWord(text: string): string { let words = text.split(/[\s.]/).filter((w) => w.length > 0); return words[words.length - 1] || ''; } continueInNextWord(textAfterBoundary: string): boolean { return CYRILLIC_CONTINUE_REGEX.test(textAfterBoundary); } } node-sentencex-ts-0.1.13-ts/src/languages/kn.ts000066400000000000000000000005101514371216700213030ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import knText from '../abbrev/kn.txt?raw'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(knText, enText); export class Kannada extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/ml.ts000066400000000000000000000005121514371216700213050ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import mlText from '../abbrev/ml.txt?raw'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(mlText, enText); export class Malayalam extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/mr.ts000066400000000000000000000003701514371216700213150ustar00rootroot00000000000000import { Language } from '../language'; import { Hindi } from './hi'; const hindiInstance = new Hindi(); export class Marathi extends Language { getAbbreviations(): readonly string[] { return hindiInstance.getAbbreviations(); } } node-sentencex-ts-0.1.13-ts/src/languages/my.ts000066400000000000000000000007441514371216700213310ustar00rootroot00000000000000import { Language } from '../language'; import { TERMINATORS_PATTERN } from '../constants'; import { English } from './en'; const englishInstance = new English(); export class Burmese extends Language { getAbbreviations(): readonly string[] { return englishInstance.getAbbreviations(); } getSentenceBreakRegex(): RegExp { // Burmese adds ၏ (U+104F) as sentence terminator return new RegExp(`(?:${TERMINATORS_PATTERN}|\u104F)+`, 'gu'); } } node-sentencex-ts-0.1.13-ts/src/languages/nl.ts000066400000000000000000000004231514371216700213070ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import nlText from '../abbrev/nl.txt?raw'; const ABBREVIATIONS = parseAbbreviations(nlText); export class Dutch extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/pa.ts000066400000000000000000000005101514371216700212730ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import paText from '../abbrev/pa.txt?raw'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(paText, enText); export class Punjabi extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/pl.ts000066400000000000000000000004241514371216700213120ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import plText from '../abbrev/pl.txt?raw'; const ABBREVIATIONS = parseAbbreviations(plText); export class Polish extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/pt.ts000066400000000000000000000006351514371216700213260ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import { ROMAN_NUMERALS } from '../constants'; import ptText from '../abbrev/pt.txt?raw'; const ABBREVIATIONS = [ ...parseAbbreviations(ptText), ...ROMAN_NUMERALS, ...ROMAN_NUMERALS.map((r) => r.toUpperCase()), ]; export class Portuguese extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/ru.ts000066400000000000000000000007241514371216700213300ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import ruText from '../abbrev/ru.txt?raw'; const ABBREVIATIONS = parseAbbreviations(ruText); const CYRILLIC_CONTINUE_REGEX = /^[0-9a-z\u0430-\u044f]/; export class Russian extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } continueInNextWord(textAfterBoundary: string): boolean { return CYRILLIC_CONTINUE_REGEX.test(textAfterBoundary); } } node-sentencex-ts-0.1.13-ts/src/languages/sk.ts000066400000000000000000000026421514371216700213200ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import { ROMAN_NUMERALS } from '../constants'; import skText from '../abbrev/sk.txt?raw'; const ABBREVIATIONS = [ ...parseAbbreviations(skText), ...ROMAN_NUMERALS, ...ROMAN_NUMERALS.map((r) => r.toUpperCase()), ]; const CONTINUE_REGEX = /^[^\p{L}\p{N}_]*[0-9a-z]/u; const SLOVAK_MONTHS = [ 'Janu\u00E1r', 'Febru\u00E1r', 'Marec', 'Apr\u00EDl', 'M\u00E1j', 'J\u00FAn', 'J\u00FAl', 'August', 'September', 'Okt\u00F3ber', 'November', 'December', 'Janu\u00E1ra', 'Febru\u00E1ra', 'Marca', 'Apr\u00EDla', 'M\u00E1ja', 'J\u00FAna', 'J\u00FAla', 'Augusta', 'Septembra', 'Okt\u00F3bra', 'Novembra', 'Decembra', ]; const MONTHS_SET = new Set(SLOVAK_MONTHS); export class Slovak extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } continueInNextWord(textAfterBoundary: string): boolean { if (CONTINUE_REGEX.test(textAfterBoundary)) { return true; } let nextWord = (textAfterBoundary.trim().split(/\s+/)[0] || '').replace(/[?!.]/g, ''); if (!nextWord) return false; if (MONTHS_SET.has(nextWord)) return true; let capitalized = nextWord.charAt(0).toUpperCase() + nextWord.slice(1); if (MONTHS_SET.has(capitalized)) return true; return false; } } node-sentencex-ts-0.1.13-ts/src/languages/ta.ts000066400000000000000000000027201514371216700213040ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import taText from '../abbrev/ta.txt?raw'; import enText from '../abbrev/en.txt?raw'; function buildTamilAbbreviations(): string[] { let vowelSigns = [ '\u0BBE', '\u0BBF', '\u0BC0', '\u0BC1', '\u0BC2', '\u0BC7', '\u0BC7', '\u09C8', '\u09CB', '\u0ACB', '\u09CC', ]; let vowels = [ '\u0B85', '\u0B86', '\u0B87', '\u0B88', '\u0B89', '\u0B8A', '\u0B8E', '\u0B8F', '\u0B90', '\u0B92', '\u0B93', '\u0B94', ]; let consonants = [ '\u0B95', '\u0B99', '\u0B9A', '\u0B9E', '\u0B9F', '\u0BA3', '\u0BA4', '\u0BA8', '\u0BAA', '\u0BAE', '\u0BAF', '\u0BB0', '\u0BB2', '\u0BB5', '\u0BB4', '\u0BB3', '\u0BB1', '\u0BA9', ]; let consonantVowels: string[] = []; for (let consonant of consonants) { for (let vowelSign of vowelSigns) { consonantVowels.push(consonant + vowelSign); } } return [...parseAbbreviations(taText, enText), ...vowels, ...consonants, ...consonantVowels]; } const ABBREVIATIONS = buildTamilAbbreviations(); export class Tamil extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/languages/te.ts000066400000000000000000000005071514371216700213110ustar00rootroot00000000000000import { Language, parseAbbreviations } from '../language'; import teText from '../abbrev/te.txt?raw'; import enText from '../abbrev/en.txt?raw'; const ABBREVIATIONS = parseAbbreviations(teText, enText); export class Telugu extends Language { getAbbreviations(): readonly string[] { return ABBREVIATIONS; } } node-sentencex-ts-0.1.13-ts/src/raw.d.ts000066400000000000000000000001261514371216700177430ustar00rootroot00000000000000declare module '*.txt?raw' { const content: string; export default content; } node-sentencex-ts-0.1.13-ts/tests/000077500000000000000000000000001514371216700167345ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/tests/constants.test.ts000066400000000000000000000110011514371216700222670ustar00rootroot00000000000000import { describe, it, expect } from 'vitest'; import { QUOTES_REGEX, getQuotePairs } from '../src/constants'; function findAllMatches(text: string): string[] { let regex = new RegExp(QUOTES_REGEX.source, QUOTES_REGEX.flags); return [...text.matchAll(regex)].map((m) => m[0]); } describe('QUOTES_REGEX', () => { it('matches Greek basic quotes', () => { let text = '\u039F \u03B3\u03B9\u03B1\u03C4\u03C1\u03CC\u03C2 \u03B5\u03AF\u03C0\u03B5: \u00AB\u0397 \u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C3\u03C4\u03B1\u03B8\u03B5\u03C1\u03AE\u00BB.'; let matches = findAllMatches(text); expect(matches).toEqual([ '\u00AB\u0397 \u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C3\u03C4\u03B1\u03B8\u03B5\u03C1\u03AE\u00BB', ]); }); it('matches Greek multiple quotes', () => { let text = '\u00AB\u039A\u03B1\u03BB\u03B7\u03BC\u03AD\u03C1\u03B1\u00BB \u03B5\u03AF\u03C0\u03B5. \u00AB\u03A0\u03CE\u03C2 \u03B5\u03AF\u03C3\u03B1\u03B9;\u00BB'; let matches = findAllMatches(text); expect(matches).toEqual([ '\u00AB\u039A\u03B1\u03BB\u03B7\u03BC\u03AD\u03C1\u03B1\u00BB', '\u00AB\u03A0\u03CE\u03C2 \u03B5\u03AF\u03C3\u03B1\u03B9;\u00BB', ]); }); it('matches multiline quotes', () => { let text = '\u03A0\u03B1\u03C1\u03AC\u03B4\u03B5\u03B9\u03B3\u03BC\u03B1:\n\u00AB\u03A0\u03C1\u03CE\u03C4\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\n\u0394\u03B5\u03CD\u03C4\u03B5\u03C1\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u00BB \u03C4\u03AD\u03BB\u03BF\u03C2.'; let matches = findAllMatches(text); expect(matches).toEqual([ '\u00AB\u03A0\u03C1\u03CE\u03C4\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\n\u0394\u03B5\u03CD\u03C4\u03B5\u03C1\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u00BB', ]); }); it('matches standard double quotes', () => { let text = 'He said, "Hello" and left.'; let matches = findAllMatches(text); expect(matches).toEqual(['"Hello"']); }); it('matches all quote types', () => { let testCases: [string, string[]][] = [ ['Standard double: "Hello"', ['"Hello"']], ["Curved single: 'Hi'", [" 'Hi'"]], // Uses ASCII ' with space before ['German-style: \u201EHallo\u201C', ['\u201EHallo\u201C']], ['Single angular: \u2039Bonjour\u203A', ['\u2039Bonjour\u203A']], [ 'CJK: \u300C\u3053\u3093\u306B\u3061\u306F\u300D', ['\u300C\u3053\u3093\u306B\u3061\u306F\u300D'], ], ['Chinese: \u300A\u4F60\u597D\u300B', ['\u300A\u4F60\u597D\u300B']], ]; for (let [text, expected] of testCases) { let matches = findAllMatches(text); expect(matches).toEqual(expected); } }); it('matches edge cases', () => { // Empty quotes expect(findAllMatches('Empty: \u00AB\u00BB')).toEqual(['\u00AB\u00BB']); // Nested quotes expect(findAllMatches("Nested: \u00ABOuter 'inner' quotes\u00BB")).toEqual([ "\u00ABOuter 'inner' quotes\u00BB", ]); // No quotes expect(findAllMatches('No quotes here at all.')).toEqual([]); }); it('matches quotes with punctuation inside', () => { let testCases: [string, string[]][] = [ [ 'Question: \u00AB\u03A0\u03CE\u03C2 \u03B5\u03AF\u03C3\u03B1\u03B9;\u00BB', ['\u00AB\u03A0\u03CE\u03C2 \u03B5\u03AF\u03C3\u03B1\u03B9;\u00BB'], ], [ 'Exclamation: \u00AB\u0393\u03B5\u03B9\u03B1 \u03C3\u03BF\u03C5!\u00BB', ['\u00AB\u0393\u03B5\u03B9\u03B1 \u03C3\u03BF\u03C5!\u00BB'], ], [ 'Period: \u00AB\u039A\u03B1\u03BB\u03B7\u03BC\u03AD\u03C1\u03B1.\u00BB', ['\u00AB\u039A\u03B1\u03BB\u03B7\u03BC\u03AD\u03C1\u03B1.\u00BB'], ], ]; for (let [text, expected] of testCases) { expect(findAllMatches(text)).toEqual(expected); } }); it('has Greek quotes in pattern', () => { let pairs = getQuotePairs(); let patterns: string[] = []; for (let [left, right] of pairs) { patterns.push(`${left}...${right}`); } let patternStr = patterns.join('|'); expect(patternStr).toContain('\u00AB'); expect(patternStr).toContain('\u00BB'); }); }); node-sentencex-ts-0.1.13-ts/tests/fallbacks.test.ts000066400000000000000000000010501514371216700222000ustar00rootroot00000000000000import { describe, it, expect } from 'vitest'; import { LANGUAGE_FALLBACKS } from '../src/fallbacks'; describe('language fallbacks', () => { it('returns correct fallbacks for zh-cn', () => { expect(LANGUAGE_FALLBACKS.get('zh-cn')).toEqual(['zh-hans', 'zh', 'zh-hant']); }); it('returns correct fallbacks for de-at', () => { expect(LANGUAGE_FALLBACKS.get('de-at')).toEqual(['de']); }); it('returns undefined for en (no fallbacks)', () => { expect(LANGUAGE_FALLBACKS.get('en')).toBeUndefined(); }); }); node-sentencex-ts-0.1.13-ts/tests/fixtures/000077500000000000000000000000001514371216700206055ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/tests/fixtures/am.txt000066400000000000000000000011221514371216700217370ustar00rootroot00000000000000እንደምን አለህ፧መልካም ቀን ይሁንልህ።እባክሽ ያልሽዉን ድገሚልኝ። --- እንደምን አለህ፧ መልካም ቀን ይሁንልህ። እባክሽ ያልሽዉን ድገሚልኝ። === ቴዎድሮስ ጥር ፮ ቀን ፲፰፻፲፩ ዓ.ም. ሻርጌ በተባለ ቦታ ቋራ ውስጥ፣ ከጎንደር ከተማ በስተ ምዕራብ ተወለዱ። --- ቴዎድሮስ ጥር ፮ ቀን ፲፰፻፲፩ ዓ.ም. ሻርጌ በተባለ ቦታ ቋራ ውስጥ፣ ከጎንደር ከተማ በስተ ምዕራብ ተወለዱ። === node-sentencex-ts-0.1.13-ts/tests/fixtures/ar.txt000066400000000000000000000126011514371216700217500ustar00rootroot00000000000000# Each test case is defined as: # Input text # --- # Expected segments (one per line) # === سؤال وجواب: ماذا حدث بعد الانتخابات الايرانية؟ طرح الكثير من التساؤلات غداة ظهور نتائج الانتخابات الرئاسية الايرانية التي أججت مظاهرات واسعة واعمال عنف بين المحتجين على النتائج ورجال الامن. يقول معارضو الرئيس الإيراني إن الطريقة التي اعلنت بها النتائج كانت مثيرة للاستغراب. --- سؤال وجواب: ماذا حدث بعد الانتخابات الايرانية؟ طرح الكثير من التساؤلات غداة ظهور نتائج الانتخابات الرئاسية الايرانية التي أججت مظاهرات واسعة واعمال عنف بين المحتجين على النتائج ورجال الامن. يقول معارضو الرئيس الإيراني إن الطريقة التي اعلنت بها النتائج كانت مثيرة للاستغراب. === #وقال د‪.‬ ديفيد ريدي و الأطباء الذين كانوا يعالجونها في مستشفى برمنجهام إنها كانت تعاني من أمراض أخرى. وليس معروفا ما اذا كانت قد توفيت بسبب اصابتها بأنفلونزا الخنازير. #--- #وقال د‪.‬ ديفيد ريدي و الأطباء الذين كانوا يعالجونها في مستشفى برمنجهام إنها كانت تعاني من أمراض أخرى. #وليس معروفا ما اذا كانت قد توفيت بسبب اصابتها بأنفلونزا الخنازير. #=== ومن المنتظر أن يكتمل مشروع خط أنابيب نابوكو البالغ طوله 3300 كليومترا في 12‪/‬08‪/‬2014 بتكلفة تُقدر بـ 7.9 مليارات يورو أي نحو 10.9 مليارات دولار. ومن المقرر أن تصل طاقة ضخ الغاز في المشروع 31 مليار متر مكعب انطلاقا من بحر قزوين مرورا بالنمسا وتركيا ودول البلقان دون المرور على الأراضي الروسية. --- ومن المنتظر أن يكتمل مشروع خط أنابيب نابوكو البالغ طوله 3300 كليومترا في 12‪/‬08‪/‬2014 بتكلفة تُقدر بـ 7.9 مليارات يورو أي نحو 10.9 مليارات دولار. ومن المقرر أن تصل طاقة ضخ الغاز في المشروع 31 مليار متر مكعب انطلاقا من بحر قزوين مرورا بالنمسا وتركيا ودول البلقان دون المرور على الأراضي الروسية. === #الاحد 21 فبراير/ شباط 2010 05:01 GMT الصنداي تايمز: رئيس الموساد قد يصبح ضحية الحرب السرية التي شتنها بنفسه. العقل المنظم هو مئير داجان رئيس الموساد الإسرائيلي الذي يشتبه بقيامه باغتيال القائد الفلسطيني في حركة حماس محمود المبحوح في دبي. #--- #الاحد 21 فبراير/ شباط 2010 05:01 GMT الصنداي تايمز: #رئيس الموساد قد يصبح ضحية الحرب السرية التي شتنها بنفسه. #العقل المنظم هو مئير داجان رئيس الموساد الإسرائيلي الذي يشتبه بقيامه باغتيال القائد الفلسطيني في حركة حماس محمود المبحوح في دبي. #=== #عثر في الغرفة على بعض أدوية علاج ارتفاع ضغط الدم، والقلب، زرعها عملاء الموساد كما تقول مصادر إسرائيلية، وقرر الطبيب أن الفلسطيني قد توفي وفاة طبيعية ربما إثر نوبة قلبية، وبدأت مراسم الحداد عليه #--- #عثر في الغرفة على بعض أدوية علاج ارتفاع ضغط الدم، والقلب، #زرعها عملاء الموساد كما تقول مصادر إسرائيلية، #وقرر الطبيب أن الفلسطيني قد توفي وفاة طبيعية ربما إثر نوبة قلبية، #وبدأت مراسم الحداد عليه === الدكتور أحمد، الذي وصل في الساعة 15:00، قال: "حالة المريض مستقرة؛ ومع ذلك، هناك حاجة إلى مزيد من الفحوصات (مثل MRI وCT)." في هذه الأثناء، لاحظت الممرضة—التي كانت في الخدمة منذ الساعة 7:00—أن العلامات الحيوية للمريض (ضغط الدم: 120/80، معدل ضربات القلب: 75) كانت ضمن الحدود الطبيعية. وأضافت: "دعونا نواصل الفحوصات في أسرع وقت ممكن." --- الدكتور أحمد، الذي وصل في الساعة 15:00، قال: "حالة المريض مستقرة؛ ومع ذلك، هناك حاجة إلى مزيد من الفحوصات (مثل MRI وCT)." في هذه الأثناء، لاحظت الممرضة—التي كانت في الخدمة منذ الساعة 7:00—أن العلامات الحيوية للمريض (ضغط الدم: 120/80، معدل ضربات القلب: 75) كانت ضمن الحدود الطبيعية. وأضافت: "دعونا نواصل الفحوصات في أسرع وقت ممكن." === node-sentencex-ts-0.1.13-ts/tests/fixtures/bg.txt000066400000000000000000000105361514371216700217430ustar00rootroot00000000000000В първата половина на ноември т.г. ще бъде свикан Консултативният съвет за национална сигурност, обяви държавният глава. --- В първата половина на ноември т.г. ще бъде свикан Консултативният съвет за национална сигурност, обяви държавният глава. === Компютърът е устройство с общо предназначение, което може да бъде програмирано да извършва набор от аритметични и/или логически операции. Възможността поредицата такива операции да бъде променяна позволява компютърът да се използва за решаването на теоретично всяка изчислителна/логическа задача. Обикновено целта на тези операции е обработката на въведена информация (данни), представена в цифров (дигитален) вид, резултатът от които може да се изведе в най-общо казано използваема форма. --- Компютърът е устройство с общо предназначение, което може да бъде програмирано да извършва набор от аритметични и/или логически операции. Възможността поредицата такива операции да бъде променяна позволява компютърът да се използва за решаването на теоретично всяка изчислителна/логическа задача. Обикновено целта на тези операции е обработката на въведена информация (данни), представена в цифров (дигитален) вид, резултатът от които може да се изведе в най-общо казано използваема форма. === Пл. "20 Април" --- Пл. "20 Април" === Той поставя началото на могъща династия, която управлява в продължение на 150 г. Саргон надделява в двубой с владетеля на град Ур и разширява териториите на държавата си по долното течение на Тигър и Ефрат. Стойностни, вкл. български и руски --- Той поставя началото на могъща династия, която управлява в продължение на 150 г. Саргон надделява в двубой с владетеля на град Ур и разширява териториите на държавата си по долното течение на Тигър и Ефрат. Стойностни, вкл. български и руски === Др. д-р Иванов, който пристигна в 15:00 ч., каза: „Състоянието на пациента е стабилно; обаче са необходими допълнителни изследвания (напр. ЯМР, КТ).“ Междувременно сестрата, която беше на смяна от 7:00 ч., отбеляза, че жизнените показатели на пациента (АД: 120/80, П: 75) са в нормални граници. „Да продължим с изследванията възможно най-скоро,“ добави тя. --- Др. д-р Иванов, който пристигна в 15:00 ч., каза: „Състоянието на пациента е стабилно; обаче са необходими допълнителни изследвания (напр. ЯМР, КТ).“ Междувременно сестрата, която беше на смяна от 7:00 ч., отбеляза, че жизнените показатели на пациента (АД: 120/80, П: 75) са в нормални граници. „Да продължим с изследванията възможно най-скоро,“ добави тя. === node-sentencex-ts-0.1.13-ts/tests/fixtures/bn.txt000066400000000000000000000000001514371216700217330ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/tests/fixtures/ca.txt000066400000000000000000000000001514371216700217170ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/tests/fixtures/da.txt000066400000000000000000000005001514371216700217250ustar00rootroot00000000000000Hej Verden. Mit navn er Jonas. --- Hej Verden. Mit navn er Jonas. === Hvad er dit navn? Mit nav er Jonas. --- Hvad er dit navn? Mit nav er Jonas. === De holdt Skt. Hans i byen. --- De holdt Skt. Hans i byen. === St. Michael's Kirke er på 5. gade nær ved lyset. --- St. Michael's Kirke er på 5. gade nær ved lyset. node-sentencex-ts-0.1.13-ts/tests/fixtures/de.txt000066400000000000000000000255721514371216700217510ustar00rootroot00000000000000„Ich habe heute keine Zeit“, sagte die Frau und flüsterte leise: „Und auch keine Lust.“ Wir haben 1.000.000 Euro. --- „Ich habe heute keine Zeit“, sagte die Frau und flüsterte leise: „Und auch keine Lust.“ Wir haben 1.000.000 Euro. === #Es gibt jedoch einige Vorsichtsmaßnahmen, die Du ergreifen kannst, z. B. ist es sehr empfehlenswert, dass Du Dein Zuhause von allem Junkfood befreist. #--- #Es gibt jedoch einige Vorsichtsmaßnahmen, die Du ergreifen kannst, z. #B. ist es sehr empfehlenswert, dass Du Dein Zuhause von allem Junkfood befreist. === Was sind die Konsequenzen der Abstimmung vom 12. Juni? --- Was sind die Konsequenzen der Abstimmung vom 12. Juni? === #Thomas sagte: ,,Wann kommst zu mir?” ,,Das weiß ich noch nicht“, antwortete Susi, ,,wahrscheinlich am Sonntag.“ Wir haben 1.000.000 Euro. #--- #Thomas sagte: ,,Wann kommst zu mir?” ,,Das weiß ich noch nicht“, antwortete Susi, ,,wahrscheinlich am Sonntag.“ #Wir haben 1.000.000 Euro. === „Lass uns jetzt essen gehen!“, sagte die Mutter zu ihrer Freundin, „am besten zum Italiener.“ --- „Lass uns jetzt essen gehen!“, sagte die Mutter zu ihrer Freundin, „am besten zum Italiener.“ === Wir haben 1.000.000 Euro. --- Wir haben 1.000.000 Euro. === Sie bekommen 3,50 Euro zurück. --- Sie bekommen 3,50 Euro zurück. === Dafür brauchen wir 5,5 Stunden. --- Dafür brauchen wir 5,5 Stunden. === Bitte überweisen Sie 5.300,25 Euro. --- Bitte überweisen Sie 5.300,25 Euro. === #1. Dies ist eine Punkteliste. #--- #1. Dies ist eine Punkteliste. === Wir trafen Dr. med. Meyer in der Stadt. --- Wir trafen Dr. med. Meyer in der Stadt. === Wir brauchen Getränke, z. B. Wasser, Saft, Bier usw. --- Wir brauchen Getränke, z. B. Wasser, Saft, Bier usw. === Ich kann u.a. Spanisch sprechen. --- Ich kann u.a. Spanisch sprechen. === Frau Prof. Schulze ist z. Z. nicht da. --- Frau Prof. Schulze ist z. Z. nicht da. === Sie erhalten ein neues Bank-Statement bzw. ein neues Schreiben. --- Sie erhalten ein neues Bank-Statement bzw. ein neues Schreiben. === Z. T. ist die Lieferung unvollständig. --- Z. T. ist die Lieferung unvollständig. === Das finden Sie auf S. 225. --- Das finden Sie auf S. 225. === Sie besucht eine kath. Schule. --- Sie besucht eine kath. Schule. === Wir benötigen Zeitungen, Zeitschriften u. Ä. für unser Projekt. --- Wir benötigen Zeitungen, Zeitschriften u. Ä. für unser Projekt. === Das steht auf S. 23, s. vorherige Anmerkung. --- Das steht auf S. 23, s. vorherige Anmerkung. === Dies ist meine Adresse: Dr. Meier, Berliner Str. 5, 21234 Bremen. --- Dies ist meine Adresse: Dr. Meier, Berliner Str. 5, 21234 Bremen. === Er sagte: „Hallo, wie geht´s Ihnen, Frau Prof. Müller?“ --- Er sagte: „Hallo, wie geht´s Ihnen, Frau Prof. Müller?“ === #Fit in vier Wochen\n\nDeine Anleitung für eine reine Ernährung und ein gesünderes und glücklicheres Leben\n\nRECHTLICHE HINWEISE\n\nOhne die ausdrückliche schriftliche Genehmigung der Eigentümerin von instafemmefitness, Anna Anderson, darf dieses E-Book weder teilweise noch in vollem Umfang reproduziert, gespeichert, kopiert oder auf irgendeine Weise übertragen werden. Wenn Du das E-Book auf einem öffentlich zugänglichen Computer ausdruckst, musst Du es nach dem Ausdrucken von dem Computer löschen. Jedes E-Book wird mit einem Benutzernamen und Transaktionsinformationen versehen.\n\nVerstöße gegen dieses Urheberrecht werden im vollen gesetzlichen Umfang geltend gemacht. Obgleich die Autorin und Herausgeberin alle Anstrengungen unternommen hat, sicherzustellen, dass die Informationen in diesem Buch zum Zeitpunkt der Drucklegung korrekt sind, übernimmt die Autorin und Herausgeberin keine Haftung für etwaige Verluste, Schäden oder Störungen, die durch Fehler oder Auslassungen in Folge von Fahrlässigkeit, zufälligen Umständen oder sonstigen Ursachen entstehen, und lehnt hiermit jedwede solche Haftung ab.\n\nDieses Buch ist kein Ersatz für die medizinische Beratung durch Ärzte. Der Leser/die Leserin sollte regelmäßig einen Arzt/eine Ärztin hinsichtlich Fragen zu seiner/ihrer Gesundheit und vor allem in Bezug auf Symptome, die eventuell einer ärztlichen Diagnose oder Behandlung bedürfen, konsultieren.\n\nDie Informationen in diesem Buch sind dazu gedacht, ein ordnungsgemäßes Training zu ergänzen, nicht aber zu ersetzen. Wie jeder andere Sport, der Geschwindigkeit, Ausrüstung, Gleichgewicht und Umweltfaktoren einbezieht, stellt dieser Sport ein gewisses Risiko dar. Die Autorin und Herausgeberin rät den Lesern dazu, die volle Verantwortung für die eigene Sicherheit zu übernehmen und die eigenen Grenzen zu beachten. Vor dem Ausüben der in diesem Buch beschriebenen Übungen solltest Du sicherstellen, dass Deine Ausrüstung in gutem Zustand ist, und Du solltest keine Risiken außerhalb Deines Erfahrungs- oder Trainingsniveaus, Deiner Fähigkeiten oder Deines Komfortbereichs eingehen.\nHintergrundillustrationen Urheberrecht © 2013 bei Shuttershock, Buchgestaltung und -produktion durch Anna Anderson Verfasst von Anna Anderson\nUrheberrecht © 2014 Instafemmefitness. Alle Rechte vorbehalten\n\nÜber mich, #--- #Fit in vier Wochen #Deine Anleitung für eine reine Ernährung und ein gesünderes und glücklicheres Leben #RECHTLICHE HINWEISE #Ohne die ausdrückliche schriftliche Genehmigung der Eigentümerin von instafemmefitness, Anna Anderson, darf dieses E-Book weder teilweise noch in vollem Umfang reproduziert, gespeichert, kopiert oder auf irgendeine Weise übertragen werden. #Wenn Du das E-Book auf einem öffentlich zugänglichen Computer ausdruckst, musst Du es nach dem Ausdrucken von dem Computer löschen. #Jedes E-Book wird mit einem Benutzernamen und Transaktionsinformationen versehen. #Verstöße gegen dieses Urheberrecht werden im vollen gesetzlichen Umfang geltend gemacht. #Obgleich die Autorin und Herausgeberin alle Anstrengungen unternommen hat, sicherzustellen, dass die Informationen in diesem Buch zum Zeitpunkt der Drucklegung korrekt sind, übernimmt die Autorin und Herausgeberin keine Haftung für etwaige Verluste, Schäden oder Störungen, die durch Fehler oder Auslassungen in Folge von Fahrlässigkeit, zufälligen Umständen oder sonstigen Ursachen entstehen, und lehnt hiermit jedwede solche Haftung ab. #Dieses Buch ist kein Ersatz für die medizinische Beratung durch Ärzte. #Der Leser/die Leserin sollte regelmäßig einen Arzt/eine Ärztin hinsichtlich Fragen zu seiner/ihrer Gesundheit und vor allem in Bezug auf Symptome, die eventuell einer ärztlichen Diagnose oder Behandlung bedürfen, konsultieren. #Die Informationen in diesem Buch sind dazu gedacht, ein ordnungsgemäßes Training zu ergänzen, nicht aber zu ersetzen. #Wie jeder andere Sport, der Geschwindigkeit, Ausrüstung, Gleichgewicht und Umweltfaktoren einbezieht, stellt dieser Sport ein gewisses Risiko dar. #Die Autorin und Herausgeberin rät den Lesern dazu, die volle Verantwortung für die eigene Sicherheit zu übernehmen und die eigenen Grenzen zu beachten. #Vor dem Ausüben der in diesem Buch beschriebenen Übungen solltest Du sicherstellen, dass Deine Ausrüstung in gutem Zustand ist, und Du solltest keine Risiken außerhalb Deines Erfahrungs- oder Trainingsniveaus, Deiner Fähigkeiten oder Deines Komfortbereichs eingehen. #Hintergrundillustrationen Urheberrecht © 2013 bei Shuttershock, Buchgestaltung und -produktion durch Anna Anderson Verfasst von Anna Anderson #Urheberrecht © 2014 Instafemmefitness. #Alle Rechte vorbehalten #Über mich === #Es gibt jedoch einige Vorsichtsmaßnahmen, die Du ergreifen kannst, z. B. ist es sehr empfehlenswert, dass Du Dein Zuhause von allem Junkfood befreist. Ich persönlich kaufe kein Junkfood oder etwas, das nicht rein ist (ich traue mir da selbst nicht!). Ich finde jeden Vorwand, um das Junkfood zu essen, vor allem die Vorstellung, dass ich nicht mehr in Versuchung kommen werde, wenn ich es jetzt aufesse und es weg ist. Es ist schon komisch, was unser Verstand mitunter anstellt! #--- #Es gibt jedoch einige Vorsichtsmaßnahmen, die Du ergreifen kannst, z. B. ist es sehr empfehlenswert, dass Du Dein Zuhause von allem Junkfood befreist. #Ich persönlich kaufe kein Junkfood oder etwas, das nicht rein ist (ich traue mir da selbst nicht!). #Ich finde jeden Vorwand, um das Junkfood zu essen, vor allem die Vorstellung, dass ich nicht mehr in Versuchung kommen werde, wenn ich es jetzt aufesse und es weg ist. #Es ist schon komisch, was unser Verstand mitunter anstellt! === #Ob Sie in Hannover nur auf der Durchreise, für einen längeren Aufenthalt oder zum Besuch einer der zahlreichen Messen sind: Die Hauptstadt des Landes Niedersachsens hat viele Sehenswürdigkeiten und ist zu jeder Jahreszeit eine Reise Wert. Hannovers Ursprünge können bis zur römischen Kaiserzeit zurückverfolgt werden, und zwar durch Ausgrabungen von Tongefäßen aus dem 1. -3. Jahrhundert nach Christus, die an mehreren Stellen im Untergrund des Stadtzentrums durchgeführt wurden. #--- #Ob Sie in Hannover nur auf der Durchreise, für einen längeren Aufenthalt oder zum Besuch einer der zahlreichen Messen sind: Die Hauptstadt des Landes Niedersachsens hat viele Sehenswürdigkeiten und ist zu jeder Jahreszeit eine Reise Wert. #Hannovers Ursprünge können bis zur römischen Kaiserzeit zurückverfolgt werden, und zwar durch Ausgrabungen von Tongefäßen aus dem 1. -3. Jahrhundert nach Christus, die an mehreren Stellen im Untergrund des Stadtzentrums durchgeführt wurden. === #• 3. Seien Sie achtsam bei der Auswahl der Nahrungsmittel! \n• 4. Nehmen Sie zusätzlich Folsäurepräparate und essen Sie Fisch! \n• 5. Treiben Sie regelmäßig Sport! \n• 6. Beginnen Sie mit Übungen für die Beckenbodenmuskulatur! \n• 7. Reduzieren Sie Ihren Alkoholgenuss! \n, #--- #• 3. Seien Sie achtsam bei der Auswahl der Nahrungsmittel! #• 4. Nehmen Sie zusätzlich Folsäurepräparate und essen Sie Fisch! #• 5. Treiben Sie regelmäßig Sport! #• 6. Beginnen Sie mit Übungen für die Beckenbodenmuskulatur! #• 7. Reduzieren Sie Ihren Alkoholgenuss! === Was sind die Konsequenzen der Abstimmung vom 12. Juni? --- Was sind die Konsequenzen der Abstimmung vom 12. Juni? === Was pro Jahr10. Zudem pro Jahr um 0.3 %11. Der gängigen Theorie nach erfolgt der Anstieg. --- Was pro Jahr10. Zudem pro Jahr um 0.3 %11. Der gängigen Theorie nach erfolgt der Anstieg. === s. vorherige Anmerkung. --- s. vorherige Anmerkung. === Mit Inkrafttreten des Mindestlohngesetzes (MiLoG) zum 01. Januar 2015 werden in Bezug auf den Einsatz von Leistungs. --- Mit Inkrafttreten des Mindestlohngesetzes (MiLoG) zum 01. Januar 2015 werden in Bezug auf den Einsatz von Leistungs. === #• einige Sorten Weichkäse \n• rohes oder nicht ganz durchgebratenes Fleisch \n• ungeputztes Gemüse und ungewaschener Salat \n• nicht ganz durchgebratenes Hühnerfleisch, rohe oder nur weich gekochte Eier #--- #• einige Sorten Weichkäse #• rohes oder nicht ganz durchgebratenes Fleisch #• ungeputztes Gemüse und ungewaschener Salat #• nicht ganz durchgebratenes Hühnerfleisch, rohe oder nur weich gekochte Eier === node-sentencex-ts-0.1.13-ts/tests/fixtures/el.txt000066400000000000000000000032321514371216700217460ustar00rootroot00000000000000Με συγχωρείτε· πού είναι οι τουαλέτες; Τις Κυριακές δε δούλευε κανένας. το κόστος του σπιτιού ήταν £260.950,00. --- Με συγχωρείτε· πού είναι οι τουαλέτες; Τις Κυριακές δε δούλευε κανένας. το κόστος του σπιτιού ήταν £260.950,00. === Ο Δρ. Παπαδόπουλος, που έφτασε στις 15:00, είπε: «Η κατάσταση του ασθενούς είναι σταθερή· ωστόσο, απαιτούνται περαιτέρω εξετάσεις (π.χ., MRI, CT).» Εν τω μεταξύ, η νοσοκόμα—που ήταν σε υπηρεσία από τις 7:00—σημείωσε ότι τα ζωτικά σημεία του ασθενούς (ΑΠ: 120/80, ΣΦ: 75) ήταν εντός φυσιολογικών ορίων. «Ας προχωρήσουμε στις εξετάσεις το συντομότερο δυνατόν,» πρόσθεσε. --- Ο Δρ. Παπαδόπουλος, που έφτασε στις 15:00, είπε: «Η κατάσταση του ασθενούς είναι σταθερή· ωστόσο, απαιτούνται περαιτέρω εξετάσεις (π.χ., MRI, CT).» Εν τω μεταξύ, η νοσοκόμα—που ήταν σε υπηρεσία από τις 7:00—σημείωσε ότι τα ζωτικά σημεία του ασθενούς (ΑΠ: 120/80, ΣΦ: 75) ήταν εντός φυσιολογικών ορίων. «Ας προχωρήσουμε στις εξετάσεις το συντομότερο δυνατόν,» πρόσθεσε. === node-sentencex-ts-0.1.13-ts/tests/fixtures/en.txt000066400000000000000000000241541514371216700217560ustar00rootroot00000000000000# Each test case is defined as: # Input text # --- # Expected segments (one per line) # === This is a test. This is only a test. --- This is a test. This is only a test. === Hello world! How are you? --- Hello world! How are you? === This is Dr. Watson --- This is Dr. Watson === Roses Are Red. Violets Are Blue --- Roses Are Red. Violets Are Blue === Hello! How are you? --- Hello! How are you? === This is a test. --- This is a test. === Mr. Smith went to Washington. --- Mr. Smith went to Washington. === What a suprise?! --- What a suprise?! === That's all folks... --- That's all folks... === This is UK. Not US --- This is UK. Not US === This balloon costs $1.20 --- This balloon costs $1.20 === Hello World. My name is Jonas. --- Hello World. My name is Jonas. === What is your name? My name is Jonas. --- What is your name? My name is Jonas. === There it is! I found it. --- There it is! I found it. === My name is Jonas E. Smith. --- My name is Jonas E. Smith. === Please turn to p. 55. --- Please turn to p. 55. === Were Jane and co. at the party? --- Were Jane and co. at the party? === They closed the deal with Pitt, Briggs & Co. at noon. --- They closed the deal with Pitt, Briggs & Co. at noon. === #Let's ask Jane and co. They should know. #--- #Let's ask Jane and co. #They should know. #=== #They closed the deal with Pitt, Briggs & Co. It closed yesterday. #--- #They closed the deal with Pitt, Briggs & Co. #It closed yesterday. #=== I can see Mt. Fuji from here. --- I can see Mt. Fuji from here. === St. Michael's Church is on 5th st. near the light. --- St. Michael's Church is on 5th st. near the light. === That is JFK Jr.'s book. --- That is JFK Jr.'s book. === I visited the U.S.A. last year. --- I visited the U.S.A. last year. === #I live in the E.U. How about you? #--- #I live in the E.U. #How about you? #=== #I live in the U.S. How about you? #--- #I live in the U.S. #How about you? === I work for the U.S. Government in Virginia. --- I work for the U.S. Government in Virginia. === I have lived in the U.S. for 20 years. --- I have lived in the U.S. for 20 years. === #At 5 a.m. Mr. Smith went to the bank. He left the bank at 6 P.M. Mr. Smith then went to the store. #--- #At 5 a.m. Mr. Smith went to the bank. #He left the bank at 6 P.M. #Mr. Smith then went to the store. #=== She has $100.00 in her bag. --- She has $100.00 in her bag. === She has $100.00. It is in her bag. --- She has $100.00. It is in her bag. === He teaches science (He previously worked for 5 years as an engineer.) at the local University. --- He teaches science (He previously worked for 5 years as an engineer.) at the local University. === Her email is Jane.Doe@example.com. I sent her an email. --- Her email is Jane.Doe@example.com. I sent her an email. === The site is, https,//www.example.50.com/new-site/awesome_content.html. Please check it out. --- The site is, https,//www.example.50.com/new-site/awesome_content.html. Please check it out. === She turned to him, 'This is great.' she said. --- She turned to him, 'This is great.' she said. === She turned to him, "This is great." she said. --- She turned to him, "This is great." she said. === She turned to him, "This is great." She held the book out to show him. --- She turned to him, "This is great." She held the book out to show him. === Hello!! Long time no see. --- Hello!! Long time no see. === Hello?? Who is there? --- Hello?? Who is there? === Hello!? Is that you? --- Hello!? Is that you? === Hello?! Is that you? --- Hello?! Is that you? === You can find it at N°. 1026.253.553. That is where the treasure is. --- You can find it at N°. 1026.253.553. That is where the treasure is. === She works at Yahoo! in the accounting department. --- She works at Yahoo! in the accounting department. === #We make a good team, you and I. Did you see Albert I. Jones yesterday? #--- #We make a good team, you and I. #Did you see Albert I. Jones yesterday? === Thoreau argues that by simplifying one's life, "the laws of the universe will appear less complex. . . ." --- Thoreau argues that by simplifying one's life, "the laws of the universe will appear less complex. . . ." === "Bohr [...] used the analogy of parallel stairways [...]" (Smith 55). --- "Bohr [...] used the analogy of parallel stairways [...]" (Smith 55). === #If words are left off at the end of a sentence, and that is all that is omitted, indicate the omission with ellipsis marks (preceded and followed by a space) and then indicate the end of the sentence with a period . . . . Next sentence. --- #If words are left off at the end of a sentence, and that is all that is omitted, indicate the omission with ellipsis marks (preceded and followed by a space) and then indicate the end of the sentence with a period . . . . #Next sentence. === I never meant that.... She left the store. --- I never meant that.... She left the store. === #I wasn't really ... well, what I mean...see . . . what I'm saying, the thing is . . . I didn't mean it. #--- #I wasn't really ... well, what I mean...see . . . what I'm saying, the thing is . . . I didn't mean it. === #One further habit which was somewhat weakened . . . was that of combining words into self-interpreting compounds. . . . The practice was not abandoned. . . . #--- #One further habit which was somewhat weakened . . . was that of combining words into self-interpreting compounds. #. . . The practice was not abandoned. . . . === Saint Maximus (died 250) is a Christian saint and martyr.[1] The emperor Decius published a decree ordering the veneration of busts of the deified emperors. --- Saint Maximus (died 250) is a Christian saint and martyr.[1] The emperor Decius published a decree ordering the veneration of busts of the deified emperors. === Differing agendas can potentially create an understanding gap in a consultation.11 12 Take the example of one of the most common presentations in ill health: the common cold. --- Differing agendas can potentially create an understanding gap in a consultation.11 12 Take the example of one of the most common presentations in ill health: the common cold. === Its traditional use[1] is well documented in the ethnobotanical literature [2–11]. Leaves, buds, tar and essential oils are used to treat a wide spectrum of diseases. --- Its traditional use[1] is well documented in the ethnobotanical literature [2–11]. Leaves, buds, tar and essential oils are used to treat a wide spectrum of diseases. === Thus increasing the desire for political reform both in Lancashire and in the country at large.[7][8] This was a serious misdemeanour,[16] encouraging them to declare the assembly illegal as soon as it was announced on 31 July.[17][18] The radicals sought a second opinion on the meeting's legality. --- Thus increasing the desire for political reform both in Lancashire and in the country at large.[7][8] This was a serious misdemeanour,[16] encouraging them to declare the assembly illegal as soon as it was announced on 31 July.[17][18] The radicals sought a second opinion on the meeting's legality. === "How many? I don't know." --- "How many? I don't know." === Hydrogen is a gas. [1] It is colorless, odorless, tasteless and highly flammable --- Hydrogen is a gas. [1] It is colorless, odorless, tasteless and highly flammable === Hydrogen is a gas. [1][2] [3] It is colorless, odorless, tasteless and highly flammable --- Hydrogen is a gas. [1][2] [3] It is colorless, odorless, tasteless and highly flammable === This function (see. section 4.2) is important. Let's continue. --- This function (see. section 4.2) is important. Let's continue. === The book is famous. I recommend reading it. --- The book is famous. I recommend reading it. === The array {1, 2, 3} contains integers. Each element has a value. --- The array {1, 2, 3} contains integers. Each element has a value. === Check the reference [page. 42] for details. You'll find it helpful. --- Check the reference [page. 42] for details. You'll find it helpful. === The Japanese quote 「こんにちは」 means hello. It's a common greeting. --- The Japanese quote 「こんにちは」 means hello. It's a common greeting. === In Chinese 《红楼梦》 is a classic novel. Many people have read it. --- In Chinese 《红楼梦》 is a classic novel. Many people have read it. === The fullwidth parentheses (like. these) are used in Asian text. They serve the same purpose. --- The fullwidth parentheses (like. these) are used in Asian text. They serve the same purpose. === Mixed brackets (normal) and [square] and {cur. ly} work too. This is the next sentence. --- Mixed brackets (normal) and [square] and {cur. ly} work too. This is the next sentence. === Nested brackets (with [inner. brackets] inside) should work. This tests complex cases. --- Nested brackets (with [inner. brackets] inside) should work. This tests complex cases. === Unblanaced bracket with period (. in it will break. --- Unblanaced bracket with period (. in it will break. === Dr. Smith, who arrived at 3:00 p.m., said, "The patient's condition is stable; however, further tests (e.g., MRI, CT scan) are required." Meanwhile, the nurse—who had been on duty since 7:00 a.m.—noted that the patient's vitals (BP: 120/80, HR: 75) were within normal limits. "Let's proceed with the tests ASAP," she added. --- Dr. Smith, who arrived at 3:00 p.m., said, "The patient's condition is stable; however, further tests (e.g., MRI, CT scan) are required." Meanwhile, the nurse—who had been on duty since 7:00 a.m.—noted that the patient's vitals (BP: 120/80, HR: 75) were within normal limits. "Let's proceed with the tests ASAP," she added. === Dr. Smith, who arrived at 3:00 p.m., said, "The patient's condition is stable; however, further tests (e.g., MRI, CT scan) are required.". Meanwhile, the nurse—who had been on duty since 7:00 a.m.—noted that the patient's vitals (BP: 120/80, HR: 75) were within normal limits. "Let's proceed with the tests ASAP," she added. --- Dr. Smith, who arrived at 3:00 p.m., said, "The patient's condition is stable; however, further tests (e.g., MRI, CT scan) are required.". Meanwhile, the nurse—who had been on duty since 7:00 a.m.—noted that the patient's vitals (BP: 120/80, HR: 75) were within normal limits. "Let's proceed with the tests ASAP," she added. node-sentencex-ts-0.1.13-ts/tests/fixtures/es.txt000066400000000000000000000003571514371216700217620ustar00rootroot00000000000000# Each test case is defined as: # Input text # --- # Expected segments (one per line) # === Hola mundo. ¿Cómo estás? --- Hola mundo. ¿Cómo estás? === Esto es una prueba. Solo una prueba. --- Esto es una prueba. Solo una prueba. === node-sentencex-ts-0.1.13-ts/tests/fixtures/fi.txt000066400000000000000000000033261514371216700217500ustar00rootroot00000000000000Se julkaistiin singlenä 7. heinäkuuta 1997, ja se nousi listaykköseksi yhtyeen kotimaassa Britanniassa sekä Irlannissa, Suomessa, Espanjassa ja Kanadassa --- Se julkaistiin singlenä 7. heinäkuuta 1997, ja se nousi listaykköseksi yhtyeen kotimaassa Britanniassa sekä Irlannissa, Suomessa, Espanjassa ja Kanadassa === Brittiläinen musiikkilehti NME valitsi lokakuussa 2011 ”D’You Know What I Meanin?” sijalle 77 listallaan, joka sisälsi 150 parasta kappaletta vuosilta 1996–2011. --- Brittiläinen musiikkilehti NME valitsi lokakuussa 2011 ”D’You Know What I Meanin?” sijalle 77 listallaan, joka sisälsi 150 parasta kappaletta vuosilta 1996–2011. === Netistä ladattu musiikki on otettu huomioon singlelistalla 3. lokakuuta 2007 lähtien.[13] Uudistus muutti listan luonnetta. --- Netistä ladattu musiikki on otettu huomioon singlelistalla 3. lokakuuta 2007 lähtien.[13] Uudistus muutti listan luonnetta. === Radiomafia oli Yleisradion pääasiassa nuorille ja nuorille aikuisille suunnattu radiokanava, joka aloitti toimintansa vuoden 1990 radiouudistuksessa 1. kesäkuuta 1990 ja lopetti Ylen radiouudistuksen myötä 12. tammikuuta 2003. --- Radiomafia oli Yleisradion pääasiassa nuorille ja nuorille aikuisille suunnattu radiokanava, joka aloitti toimintansa vuoden 1990 radiouudistuksessa 1. kesäkuuta 1990 ja lopetti Ylen radiouudistuksen myötä 12. tammikuuta 2003. === Dr. Alban (oikealta nimeltä Alban Uzoma Nwapa, s. 26. elokuuta 1957 Oguta, Brittiläinen Nigeria) on nigerialaissyntyinen ruotsalainen eurodance/rap/reggae -artisti. --- Dr. Alban (oikealta nimeltä Alban Uzoma Nwapa, s. 26. elokuuta 1957 Oguta, Brittiläinen Nigeria) on nigerialaissyntyinen ruotsalainen eurodance/rap/reggae -artisti. === node-sentencex-ts-0.1.13-ts/tests/fixtures/fr.txt000066400000000000000000000040231514371216700217540ustar00rootroot00000000000000 Après avoir été l'un des acteurs du projet génome humain, le Genoscope met aujourd'hui le cap vers la génomique environnementale. L'exploitation des données de séquences, prolongée par l'identification expérimentale des fonctions biologiques, notamment dans le domaine de la biocatalyse, ouvrent des perspectives de développements en biotechnologie industrielle. --- Après avoir été l'un des acteurs du projet génome humain, le Genoscope met aujourd'hui le cap vers la génomique environnementale. L'exploitation des données de séquences, prolongée par l'identification expérimentale des fonctions biologiques, notamment dans le domaine de la biocatalyse, ouvrent des perspectives de développements en biotechnologie industrielle. === "Airbus livrera comme prévu 30 appareils 380 cette année avec en ligne de mire l'objectif d'équilibre financier du programme en 2015", a-t-il ajouté. --- "Airbus livrera comme prévu 30 appareils 380 cette année avec en ligne de mire l'objectif d'équilibre financier du programme en 2015", a-t-il ajouté. === À 11 heures ce matin, la direction ne décomptait que douze grévistes en tout sur la France : ce sont ceux du site de Saran (Loiret), dont l’effectif est de 809 salariés, dont la moitié d’intérimaires. Elle assure que ce mouvement « n’aura aucun impact sur les livraisons ». --- À 11 heures ce matin, la direction ne décomptait que douze grévistes en tout sur la France : ce sont ceux du site de Saran (Loiret), dont l’effectif est de 809 salariés, dont la moitié d’intérimaires. Elle assure que ce mouvement « n’aura aucun impact sur les livraisons ». === Ce modèle permet d’afficher le texte « LL.AA.II.RR. » pour l’abréviation de « Leurs Altesses impériales et royales » avec son infobulle. --- Ce modèle permet d’afficher le texte « LL.AA.II.RR. » pour l’abréviation de « Leurs Altesses impériales et royales » avec son infobulle. === Les derniers ouvrages de Intercept Ltd. sont ici. --- Les derniers ouvrages de Intercept Ltd. sont ici. === node-sentencex-ts-0.1.13-ts/tests/fixtures/gu.txt000066400000000000000000000000001514371216700217470ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/tests/fixtures/he.txt000066400000000000000000000015701514371216700217450ustar00rootroot00000000000000ד"ר כהן, שהגיע בשעה 15:00, אמר: "מצב החולה יציב; עם זאת, יש צורך בבדיקות נוספות (כגון MRI, CT)." בינתיים, האחות—שהייתה בתפקיד מאז 7:00—ציינה שהמדדים החיוניים של החולה (לחץ דם: 120/80, דופק: 75) היו בטווח הנורמלי. "בואו נמשיך עם הבדיקות בהקדם האפשרי," היא הוסיפה. --- ד"ר כהן, שהגיע בשעה 15:00, אמר: "מצב החולה יציב; עם זאת, יש צורך בבדיקות נוספות (כגון MRI, CT)." בינתיים, האחות—שהייתה בתפקיד מאז 7:00—ציינה שהמדדים החיוניים של החולה (לחץ דם: 120/80, דופק: 75) היו בטווח הנורמלי. "בואו נמשיך עם הבדיקות בהקדם האפשרי," היא הוסיפה. === node-sentencex-ts-0.1.13-ts/tests/fixtures/hi.txt000066400000000000000000000012201514371216700217410ustar00rootroot00000000000000सच्चाई यह है कि इसे कोई नहीं जानता। हो सकता है यह फ़्रेन्को के खिलाफ़ कोई विद्रोह रहा हो, या फिर बेकाबू हो गया कोई आनंदोत्सव। --- सच्चाई यह है कि इसे कोई नहीं जानता। हो सकता है यह फ़्रेन्को के खिलाफ़ कोई विद्रोह रहा हो, या फिर बेकाबू हो गया कोई आनंदोत्सव। === node-sentencex-ts-0.1.13-ts/tests/fixtures/hy.txt000066400000000000000000000227711514371216700217770ustar00rootroot00000000000000Ի՞նչ ես մտածում: Ոչինչ: --- Ի՞նչ ես մտածում: Ոչինչ: === Ապրիլի 24-ին սկսեց անձրևել...Այդպես էի գիտեի: --- Ապրիլի 24-ին սկսեց անձրևել...Այդպես էի գիտեի: === Այսպիսով` մոտենում ենք ավարտին: Տրամաբանությյունը հետևյալն է. պարզություն և աշխատանք: Այսպիսով` մոտենում ենք ավարտին: Տրամաբանությյունը հետևյալն է. պարզություն և աշխատանք: === 'Սա այն փուլն է, երբ տեղի է ունենում Համակարգի մշակումը: Համաձայն Փուլ 2-ի, Մատակարարը մշակում և/կամ հարմարեցնում է համապատասխան ծրագիրը, տեղադրում ծրագրի բաղկացուցիչները, կատարում առանձին բլոկի և համակարգի թեստավորում և ներառում տարբեր մոդուլներ եզակի աշխատանքային համակարգում, որը կազմում է այս Փուլի արդյունքը: === Սա այն փուլն է, երբ տեղի է ունենում Համակարգի մշակումը: Համաձայն Փուլ 2-ի, Մատակարարը մշակում և/կամ հարմարեցնում է համապատասխան ծրագիրը, տեղադրում ծրագրի բաղկացուցիչները, կատարում առանձին բլոկի և համակարգի թեստավորում և ներառում տարբեր մոդուլներ եզակի աշխատանքային համակարգում, որը կազմում է այս Փուլի արդյունքը: === Մատակարարի նախագծի անձնակազմի կողմից համակարգի թեստերը հաջող անցնելուց հետո, Համակարգը տրվում է Գնորդին թեստավորման համար: 2-րդ փուլում, հիմք ընդունելով թեստային սցենարիոները, թեստերը կատարվում են Կառավարության կողմից Մատակարարի աջակցությամբ: Այս թեստերի թիրախը հանդիսանում է Համակարգի` որպես մեկ ամբողջության և համակարգի գործունեության ստուգումը համաձայն տեխնիկական բնութագրերի: Այս թեստերի հաջողակ ավարտից հետո, Համակարգը ժամանակավոր ընդունվում է Կառավարության կողմից: Այս թեստերի արդյունքները փաստաթղթային ձևով կներակայացվեն Թեստային Արդյունքների Հաշվետվություններում: Մատակարարը պետք է տրամադրի հետևյալը --- Մատակարարի նախագծի անձնակազմի կողմից համակարգի թեստերը հաջող անցնելուց հետո, Համակարգը տրվում է Գնորդին թեստավորման համար: 2-րդ փուլում, հիմք ընդունելով թեստային սցենարիոները, թեստերը կատարվում են Կառավարության կողմից Մատակարարի աջակցությամբ: Այս թեստերի թիրախը հանդիսանում է Համակարգի` որպես մեկ ամբողջության և համակարգի գործունեության ստուգումը համաձայն տեխնիկական բնութագրերի: Այս թեստերի հաջողակ ավարտից հետո, Համակարգը ժամանակավոր ընդունվում է Կառավարության կողմից: Այս թեստերի արդյունքները փաստաթղթային ձևով կներակայացվեն Թեստային Արդյունքների Հաշվետվություններում: Մատակարարը պետք է տրամադրի հետևյալը === Բարև Ձեզ: Իմ անունն էԱրմինե: --- Բարև Ձեզ: Իմ անունն էԱրմինե: === Այսօր երկուշաբթի է: Ես գնում եմ աշխատանքի: --- Այսօր երկուշաբթի է: Ես գնում եմ աշխատանքի: === Վաղը սեպտեմբերի 1-ն է: Մենք գնում ենք դպրոց: Վաղը սեպտեմբերի 1-ն է: Մենք գնում ենք դպրոց: === Այո, ես հասկացա: Ես իսկապես քեզ սիրում եմ: --- Այո, ես հասկացա: Ես իսկապես քեզ սիրում եմ: === Փակիր պատուհանները: Երեկոյան անձրևում է: --- Փակիր պատուհանները: Երեկոյան անձրևում է: Մութ է: Ես պետք է տուն վերադառնամ: --- Մութ է: Ես պետք է տուն վերադառնամ: === Գիտես, սկսել եմ հավատալ: Ամեն ինչ փոխվում է: Գիտես, սկսել եմ հավատալ: Ամեն ինչ փոխվում է: === Տոնածառը նոր է: Պետք է այն զարդարել: Տոնածառը նոր է: Պետք է այն զարդարել: === Ես շտապում եմ: Ես քեզ չեմ կարող սպասել: --- Ես շտապում եմ: Ես քեզ չեմ կարող սպասել: === Սպասիր, մենք իրար սիրում ենք: Ցանկանում եմ միասին ապրենք: --- Սպասիր, մենք իրար սիրում ենք: Ցանկանում եմ միասին ապրենք: === Ոչ, այդպես չեմ կարծում: Դա ճիշտ չէ: --- Ոչ, այդպես չեմ կարծում: Դա ճիշտ չէ: === 1960 թվական…ձմեռ…գիշեր: Սառն էր…դատարկություն: --- 1960 թվական…ձմեռ…գիշեր: Սառն էր…դատարկություն: === Ինչ՟ու այն, ինչ անում է մարդը, չի կարող անել համակարգիչը: Պարզապես չունի մարդկային ուղեղ: --- Ինչ՟ու այն, ինչ անում է մարդը, չի կարող անել համակարգիչը: Պարզապես չունի մարդկային ուղեղ: === Թվարկիր ինձ համար 3 բան, որ կարևոր է քեզ համար - Պատասխանում եմ. սեր, գիտելիք, ազնվություն: Թվարկիր ինձ համար 3 բան, որ կարևոր է քեզ համար - Պատասխանում եմ. սեր, գիտելիք, ազնվություն: === Կարող ե՞նք միասին աշխատել: Գուցե այն ինչ մտածում ես, իրականանալի է: --- Կարող ե՞նք միասին աշխատել: Գուցե այն ինչ մտածում ես, իրականանալի է: === Հիմա, այն ինչ սկսել ենք, ավարտին է մոտենում: Հարցերը սակայն շատ են...: --- Հիմա, այն ինչ սկսել ենք, ավարտին է մոտենում: Հարցերը սակայն շատ են...: === Սիրելիս...սպասում եմ: Գնամ թ՟ե …: --- Սիրելիս...սպասում եմ: Գնամ թ՟ե …: === Դիեգո Արմանդո Մարադոնան ծնվել է 1960 թվականի հոկտեմբերի 30-ին (կիրակի)` առավոտյան ժամը 5-ին, Բուենոս-Այրես գավառում գտնվող Լանուս քաղաքի Էվիտա կլինիկայում: Նա ծնվել է Դոն Դիեգոյի ընտանիքում: Հայրն աշխատում էր Տրիտումոլ հողմաղացում որպես բանվոր, իսկ մայրը` Դալմա Սալվադորա Ֆրանկոն, տնային տնտեսուհի էր։ Դիեգոն ընտանիքի հինգերորդ, բայց առաջին արու զավակն էր, ուներ չորս քույր` Ռիտան, Աննան, Էլզան և Մարիան։ Դալմա Սալվադորան ասում էր. «Նա բոլորովին չչարչարեց ինձ. շաբաթ ամբողջ օրը ես ինձ շատ լավ էի զգում, իսկ գիշերն ինձ կլինիկա տարան: Նա շատ արագ լույս աշխարհ եկավ: Այդ պահին ես միայն մի բան էի խնդրում. որպեսզի նա առողջ ծնվի և լավ մարդ դառնա: Բարեբախտաբար, այդ ամենն իրականացավ, կարծում եմ, դեռ մի բան էլ ավելի»։ --- Դիեգո Արմանդո Մարադոնան ծնվել է 1960 թվականի հոկտեմբերի 30-ին (կիրակի)` առավոտյան ժամը 5-ին, Բուենոս-Այրես գավառում գտնվող Լանուս քաղաքի Էվիտա կլինիկայում: Նա ծնվել է Դոն Դիեգոյի ընտանիքում: Հայրն աշխատում էր Տրիտումոլ հողմաղացում որպես բանվոր, իսկ մայրը` Դալմա Սալվադորա Ֆրանկոն, տնային տնտեսուհի էր։ Դիեգոն ընտանիքի հինգերորդ, բայց առաջին արու զավակն էր, ուներ չորս քույր` Ռիտան, Աննան, Էլզան և Մարիան։ Դալմա Սալվադորան ասում էր. «Նա բոլորովին չչարչարեց ինձ. շաբաթ ամբողջ օրը ես ինձ շատ լավ էի զգում, իսկ գիշերն ինձ կլինիկա տարան: Նա շատ արագ լույս աշխարհ եկավ: Այդ պահին ես միայն մի բան էի խնդրում. որպեսզի նա առողջ ծնվի և լավ մարդ դառնա: Բարեբախտաբար, այդ ամենն իրականացավ, կարծում եմ, դեռ մի բան էլ ավելի»։ === node-sentencex-ts-0.1.13-ts/tests/fixtures/it.txt000066400000000000000000000101731514371216700217640ustar00rootroot00000000000000# Each test case is defined as: # Input text # --- # Expected segments (one per line) # === Salve Sig.ra Mengoni! Come sta oggi? --- Salve Sig.ra Mengoni! Come sta oggi? === Una lettera si può iniziare in questo modo «Il/la sottoscritto/a.». --- Una lettera si può iniziare in questo modo «Il/la sottoscritto/a.». === La casa costa 170.500.000,00€! --- La casa costa 170.500.000,00€! === Buongiorno! Sono l'Ing. Mengozzi. È presente l'Avv. Cassioni? --- Buongiorno! Sono l'Ing. Mengozzi. È presente l'Avv. Cassioni? === Mi fissi un appuntamento per mar. 23 Nov.. Grazie. --- Mi fissi un appuntamento per mar. 23 Nov.. Grazie. === Ecco il mio tel.:01234567. Mi saluti la Sig.na Manelli. Arrivederci. --- Ecco il mio tel.:01234567. Mi saluti la Sig.na Manelli. Arrivederci. === La centrale meteor. si è guastata. Gli idraul. son dovuti andare a sistemarla. --- La centrale meteor. si è guastata. Gli idraul. son dovuti andare a sistemarla. === Hanno creato un algoritmo allo st. d. arte. Si ringrazia lo psicol. Serenti. --- Hanno creato un algoritmo allo st. d. arte. Si ringrazia lo psicol. Serenti. === Chiamate il V.Cte. delle F.P., adesso! --- Chiamate il V.Cte. delle F.P., adesso! === Giancarlo ha sostenuto l'esame di econ. az.. --- Giancarlo ha sostenuto l'esame di econ. az.. === Stava viaggiando a 90 km/h verso la provincia di TR quando il Dott. Mesini ha sentito un rumore e si fermò! --- Stava viaggiando a 90 km/h verso la provincia di TR quando il Dott. Mesini ha sentito un rumore e si fermò! === Egregio Dir. Amm., le faccio sapere che l'ascensore non funziona. --- Egregio Dir. Amm., le faccio sapere che l'ascensore non funziona. === Stava mangiando e/o dormendo. --- Stava mangiando e/o dormendo. === Ricordatevi che dom 25 Set. sarà il compleanno di Maria; dovremo darle un regalo. --- Ricordatevi che dom 25 Set. sarà il compleanno di Maria; dovremo darle un regalo. === La politica è quella della austerità; quindi verranno fatti tagli agli sprechi. --- La politica è quella della austerità; quindi verranno fatti tagli agli sprechi. === Nel tribunale, l'Avv. Fabrizi ha urlato "Io, l'illustrissimo Fabrizi, vi si oppone!". --- Nel tribunale, l'Avv. Fabrizi ha urlato "Io, l'illustrissimo Fabrizi, vi si oppone!". === Le parti fisiche di un computer (ad es. RAM, CPU, tastiera, mouse, etc.) sono definiti HW. --- Le parti fisiche di un computer (ad es. RAM, CPU, tastiera, mouse, etc.) sono definiti HW. === La parola "casa" è sinonimo di abitazione. --- La parola "casa" è sinonimo di abitazione. === La "Mulino Bianco" fa alimentari pre-confezionati. --- La "Mulino Bianco" fa alimentari pre-confezionati. === "Ei fu. Siccome immobile / dato il mortal sospiro / stette la spoglia immemore / orba di tanto spiro / [...]" (Manzoni). --- "Ei fu. Siccome immobile / dato il mortal sospiro / stette la spoglia immemore / orba di tanto spiro / [...]" (Manzoni). === Una lettera si può iniziare in questo modo «Il/la sottoscritto/a ... nato/a a ...». --- Una lettera si può iniziare in questo modo «Il/la sottoscritto/a ... nato/a a ...». === Per casa, in uno degli esercizi per i bambini c"era "3 + (14/7) = 5" --- Per casa, in uno degli esercizi per i bambini c"era "3 + (14/7) = 5" === Ai bambini è stato chiesto di fare "4:2*2" --- Ai bambini è stato chiesto di fare "4:2*2" === La maestra esclamò: "Bambini, quanto fa '2/3 + 4/3?'". --- La maestra esclamò: "Bambini, quanto fa '2/3 + 4/3?'". === Il motore misurava 120°C. --- Il motore misurava 120°C. === Il volume era di 3m³. --- Il volume era di 3m³. === La stanza misurava 20m². --- La stanza misurava 20m². === 1°C corrisponde a 33.8°F. --- 1°C corrisponde a 33.8°F. === Oggi è il 27-10-14. --- Oggi è il 27-10-14. === La casa costa 170.500.000,00€! --- La casa costa 170.500.000,00€! === Il corridore 103 è arrivato 4°. --- Il corridore 103 è arrivato 4°. === Oggi è il 27/10/2014. --- Oggi è il 27/10/2014. === Ecco l'elenco: 1.gelato, 2.carne, 3.riso. --- Ecco l'elenco: 1.gelato, 2.carne, 3.riso. === Devi comprare : 1)pesce 2)sale. --- Devi comprare : 1)pesce 2)sale. === La macchina viaggiava a 100 km/h. --- La macchina viaggiava a 100 km/h. === node-sentencex-ts-0.1.13-ts/tests/fixtures/ja.txt000066400000000000000000000122231514371216700217400ustar00rootroot00000000000000 これはペンです。それはマーカーです。 --- これはペンです。 それはマーカーです。 === それは何ですか?ペンですか? --- それは何ですか? ペンですか? === 良かったね!すごい!': ['良かったね!', 'すごい!'], === 自民党税制調査会の幹部は、「引き下げ幅は3.29%以上を目指すことになる」と指摘していて、今後、公明党と合意したうえで、30日に決定する与党税制改正大綱に盛り込むことにしています。2%台後半を目指すとする方向で最終調整に入りました。 --- 自民党税制調査会の幹部は、「引き下げ幅は3.29%以上を目指すことになる」と指摘していて、今後、公明党と合意したうえで、30日に決定する与党税制改正大綱に盛り込むことにしています。 2%台後半を目指すとする方向で最終調整に入りました。 === アンディ・ガトマンズ(英: Andi Gutmans、ヘブライ語: אנדי גוטמנס‎)はスイスにルーツを持つイスラエル人プログラマで、PHPの開発とゼンド・テクノロジーズの創業者の1人として知られている[1]。ハイファにあるイスラエル工科大学出身で、1997年に友人のゼーブ・スラスキーと共にPHP 3を開発した。1999年、PHP 4の中核である Zend Engine を開発し、ゼンド・テクノロジーズを創業。その後PHPの発展に関与し続け、PHP 5開発にも参加している[2]。なおZendという名称は、ガトマンズとスラスキーの名前(ZeevとAndi)を組み合わせたかばん語である[3]。 ハイファにあるイスラエル工科大学出身で、1997年に友人のゼーブ・スラスキーと共にPHP 3を開発した。1999年、PHP 4の中核である Zend Engine を開発し、ゼンド・テクノロジーズを創業。その後PHPの発展に関与し続け、PHP 5開発にも参加している[2]。なおZendという名称は、ガトマンズとスラスキーの名前(ZeevとAndi)を組み合わせたかばん語である[3]。 --- アンディ・ガトマンズ(英: Andi Gutmans、ヘブライ語: אנדי גוטמנס‎)はスイスにルーツを持つイスラエル人プログラマで、PHPの開発とゼンド・テクノロジーズの創業者の1人として知られている[1]。 ハイファにあるイスラエル工科大学出身で、1997年に友人のゼーブ・スラスキーと共にPHP 3を開発した。1999年、PHP 4の中核である Zend Engine を開発し、ゼンド・テクノロジーズを創業。 その後PHPの発展に関与し続け、PHP 5開発にも参加している[2]。 なおZendという名称は、ガトマンズとスラスキーの名前(ZeevとAndi)を組み合わせたかばん語である[3]。 ハイファにあるイスラエル工科大学出身で、1997年に友人のゼーブ・スラスキーと共にPHP 3を開発した。1999年、PHP 4の中核である Zend Engine を開発し、ゼンド・テクノロジーズを創業。 その後PHPの発展に関与し続け、PHP 5開発にも参加している[2]。 なおZendという名称は、ガトマンズとスラスキーの名前(ZeevとAndi)を組み合わせたかばん語である[3]。 === ハイファにあるイスラエル工科大学出身で、1997年に友人のゼーブ・スラスキーと共にPHP 3を開発した。1999年、PHP 4の中核である Zend Engine を開発し、ゼンド・テクノロジーズを創業。その後PHPの発展に関与し続け、PHP 5開発にも参加している。なおZendという名称は、ガトマンズとスラスキーの名前(ZeevとAndi)を組み合わせたかばん語である。ハイファにあるイスラエル工科大学出身で、1997年に友人のゼーブ・スラスキーと共にPHP 3を開発した。1999年、PHP 4の中核である Zend Engine を開発し、ゼンド・テクノロジーズを創業。その後PHPの発展に関与し続け、PHP 5 開発にも参加している。なおZendという名称は、ガトマンズとスラスキーの名前(ZeevとAndi)を組み合わせたかばん語である。 --- ハイファにあるイスラエル工科大学出身で、1997年に友人のゼーブ・スラスキーと共にPHP 3を開発した。1999年、PHP 4の中核である Zend Engine を開発し、ゼンド・テクノロジーズを創業。 その後PHPの発展に関与し続け、PHP 5開発にも参加している。 なおZendという名称は、ガトマンズとスラスキーの名前(ZeevとAndi)を組み合わせたかばん語である。 ハイファにあるイスラエル工科大学出身で、1997年に友人のゼーブ・スラスキーと共にPHP 3を開発した。1999年、PHP 4の中核である Zend Engine を開発し、ゼンド・テクノロジーズを創業。 その後PHPの発展に関与し続け、PHP 5 開発にも参加している。 なおZendという名称は、ガトマンズとスラスキーの名前(ZeevとAndi)を組み合わせたかばん語である。 === node-sentencex-ts-0.1.13-ts/tests/fixtures/kk.txt000066400000000000000000000114431514371216700217560ustar00rootroot00000000000000# Each test case is defined as: # Input text # --- # Expected segments (one per line) # === Мұхитқа тікелей шыға алмайтын мемлекеттердің ішінде Қазақстан - ең үлкені. --- Мұхитқа тікелей шыға алмайтын мемлекеттердің ішінде Қазақстан - ең үлкені. === Оқушылар үйі, Достық даңғылы, Абай даналығы, ауыл шаруашылығы – кім? не? --- Оқушылар үйі, Достық даңғылы, Абай даналығы, ауыл шаруашылығы – кім? не? === Әр түрлі өлшемнің атауы болып табылатын м (метр), см (сантиметр), кг (киллограмм), т (тонна), га (гектар), ц (центнер), т. б. (тағы басқа), тәрізді белгілер де қысқарған сөздер болып табылады. --- Әр түрлі өлшемнің атауы болып табылатын м (метр), см (сантиметр), кг (киллограмм), т (тонна), га (гектар), ц (центнер), т. б. (тағы басқа), тәрізді белгілер де қысқарған сөздер болып табылады. === Мысалы: обкомға (облыстық комитетке) барды, ауаткомда (аудандық атқару комитетінде) болды, педучилищеге (педагогтік училищеге) түсті, медпункттің (медициналық пункттің) алдында т. б. --- Мысалы: обкомға (облыстық комитетке) барды, ауаткомда (аудандық атқару комитетінде) болды, педучилищеге (педагогтік училищеге) түсті, медпункттің (медициналық пункттің) алдында т. б. === Елдің жалпы ішкі өнімі ЖІӨ (номинал) = $225.619 млрд (2014) --- Елдің жалпы ішкі өнімі ЖІӨ (номинал) = $225.619 млрд (2014) === Ресейдiң әлеуметтiк-экономикалық жағдайы.XVIII ғасырдың бiрiншi ширегiнде Ресейге тән нәрсе. --- Ресейдiң әлеуметтiк-экономикалық жағдайы. XVIII ғасырдың бiрiншi ширегiнде Ресейге тән нәрсе. === («Егемен Қазақстан», 7 қыркүйек 2012 жыл. №590-591); Бұл туралы кеше санпедқадағалау комитетінің облыыстық департаменті хабарлады. («Айқын», 23 сəуір 2010 жыл. № 70). --- («Егемен Қазақстан», 7 қыркүйек 2012 жыл. №590-591); Бұл туралы кеше санпедқадағалау комитетінің облыыстық департаменті хабарлады. («Айқын», 23 сəуір 2010 жыл. № 70). === Иран революциясы (1905 — 11) және азаматтық қозғалыс (1918 — 21) кезінде А. Фарахани, М. Кермани, М. Т. Бехар, т.б. ақындар демократиялық идеяның жыршысы болды. --- Иран революциясы (1905 — 11) және азаматтық қозғалыс (1918 — 21) кезінде А. Фарахани, М. Кермани, М. Т. Бехар, т.б. ақындар демократиялық идеяның жыршысы болды. === Владимир Федосеев: Аттар магиясы енді жоқ http://www.vremya.ru/2003/179/10/80980.html --- Владимир Федосеев: Аттар магиясы енді жоқ http://www.vremya.ru/2003/179/10/80980.html === Бірақ оның енді не керегі бар? — деді. --- Бірақ оның енді не керегі бар? — деді. === Сондықтан шапаныма жегізіп отырғаным! - деп, жауап береді. --- Сондықтан шапаныма жегізіп отырғаным! - деп, жауап береді. === Б.з.б. 6 – 3 ғасырларда конфуцийшілдік, моизм, легизм мектептерінің қалыптасуы нәтижесінде Қытай философиясы пайда болды. --- Б.з.б. 6 – 3 ғасырларда конфуцийшілдік, моизм, легизм мектептерінің қалыптасуы нәтижесінде Қытай философиясы пайда болды. === 'Та марбута' тек сөз соңында екі түрде жазылады: --- 'Та марбута' тек сөз соңында екі түрде жазылады: === node-sentencex-ts-0.1.13-ts/tests/fixtures/kn.txt000066400000000000000000000000001514371216700217440ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/tests/fixtures/ml.txt000066400000000000000000000012271514371216700217600ustar00rootroot00000000000000# Each test case is defined as: # Input text # --- # Expected segments (one per line) # === Roses Are Red. Violets Are Blue --- Roses Are Red. Violets Are Blue === ഇത് ഡോ. ശിവൻ. ഇദ്ദേഹമാണ് ഞാൻ പറഞ്ഞയാൾ --- ഇത് ഡോ. ശിവൻ. ഇദ്ദേഹമാണ് ഞാൻ പറഞ്ഞയാൾ === ഇത് മി. കെ. പി. മോഹനൻ --- ഇത് മി. കെ. പി. മോഹനൻ === ഇത് പ്രൊ. കെ.പി. മോഹനൻ --- ഇത് പ്രൊ. കെ.പി. മോഹനൻ === ഇത് Dr. മോഹനൻ --- ഇത് Dr. മോഹനൻ === node-sentencex-ts-0.1.13-ts/tests/fixtures/mr.txt000066400000000000000000000022701514371216700217650ustar00rootroot00000000000000आज दसरा आहे. आज खूप शुभ दिवस आहे. --- आज दसरा आहे. आज खूप शुभ दिवस आहे. === ढग खूप गर्जत होते; पण पाऊस पडत नव्हता. --- ढग खूप गर्जत होते; पण पाऊस पडत नव्हता. === रमाची परीक्षा कधी आहे? अवकाश आहे अजून. --- रमाची परीक्षा कधी आहे? अवकाश आहे अजून. === शाब्बास, असाच अभ्यास कर! आणि मग तुला नक्की यश मिळणार. --- शाब्बास, असाच अभ्यास कर! आणि मग तुला नक्की यश मिळणार. === "आपली आपण करी स्तुती तो एक मूर्ख" असे समर्थ रामदासस्वामी म्हणतात. --- "आपली आपण करी स्तुती तो एक मूर्ख" असे समर्थ रामदासस्वामी म्हणतात. === node-sentencex-ts-0.1.13-ts/tests/fixtures/my.txt000066400000000000000000000003601514371216700217720ustar00rootroot00000000000000ခင္ဗ်ားနာမည္ဘယ္လိုေခၚလဲ။ င္ေနေကာင္းလား။ --- ခင္ဗ်ားနာမည္ဘယ္လိုေခၚလဲ။ င္ေနေကာင္းလား။ === node-sentencex-ts-0.1.13-ts/tests/fixtures/nl.txt000066400000000000000000000006751514371216700217670ustar00rootroot00000000000000Hij schoot op de JP8-brandstof toen de Surface-to-Air (sam)-missiles op hem af kwamen. 81 procent van de schoten was raak. --- Hij schoot op de JP8-brandstof toen de Surface-to-Air (sam)-missiles op hem af kwamen. 81 procent van de schoten was raak. === 81 procent van de schoten was raak. ...en toen arste de hel los. --- 81 procent van de schoten was raak. ... en toen arste de hel los. === Afkorting aanw. vnw. --- Afkorting aanw. vnw. === node-sentencex-ts-0.1.13-ts/tests/fixtures/pa.txt000066400000000000000000000016641514371216700217550ustar00rootroot00000000000000ਸਰੋਜਿਨੀ ਨਾਇਡੂ ਦਾ ਜਨਮ 13 ਫਰਵਰੀ 1879 ਨੂੰ ਭਾਰਤ ਦੇ ਸ਼ਹਿਰ ਹੈਦਰਾਬਾਦ ਵਿੱਚ ਹੋਇਆ ਸੀ। ਉਸ ਦੇ ਪਿਤਾ ਅਘੋਰਨਾਥ ਚੱਟੋਪਾਧਿਆਏ ਇੱਕ ਨਾਮੀ ਵਿਦਵਾਨ ਅਤੇ ਮਾਂ ਬਰਾਦਾ ਸੁੰਦਰੀ ਦੇਬੀ ਕਵਿਤਰੀ ਸੀ ਅਤੇ ਬੰਗਾਲੀ ਵਿੱਚ ਲਿਖਦੀ ਸੀ। --- ਸਰੋਜਿਨੀ ਨਾਇਡੂ ਦਾ ਜਨਮ 13 ਫਰਵਰੀ 1879 ਨੂੰ ਭਾਰਤ ਦੇ ਸ਼ਹਿਰ ਹੈਦਰਾਬਾਦ ਵਿੱਚ ਹੋਇਆ ਸੀ। ਉਸ ਦੇ ਪਿਤਾ ਅਘੋਰਨਾਥ ਚੱਟੋਪਾਧਿਆਏ ਇੱਕ ਨਾਮੀ ਵਿਦਵਾਨ ਅਤੇ ਮਾਂ ਬਰਾਦਾ ਸੁੰਦਰੀ ਦੇਬੀ ਕਵਿਤਰੀ ਸੀ ਅਤੇ ਬੰਗਾਲੀ ਵਿੱਚ ਲਿਖਦੀ ਸੀ। === node-sentencex-ts-0.1.13-ts/tests/fixtures/pl.txt000066400000000000000000000001061514371216700217560ustar00rootroot00000000000000To słowo bałt. jestskrótem. --- To słowo bałt. jestskrótem. === node-sentencex-ts-0.1.13-ts/tests/fixtures/pt.txt000066400000000000000000000021771514371216700220000ustar00rootroot00000000000000# Each test case is defined as: # Input text # --- # Expected segments (one per line) # === A Lei do Sorteio (n.º 1860, de 4 de janeiro de 1908) introduziu o serviço militar obrigatório para as Forças Armadas do Brasil, implantado de fato em 1916, substituindo o recrutamento forçado, o antigo “tributo de sangue”, e permitindo a constituição de uma reserva. --- A Lei do Sorteio (n.º 1860, de 4 de janeiro de 1908) introduziu o serviço militar obrigatório para as Forças Armadas do Brasil, implantado de fato em 1916, substituindo o recrutamento forçado, o antigo “tributo de sangue”, e permitindo a constituição de uma reserva. === Os oficiais mantinham a disciplina pelo castigo corporal.[13] Na Marinha, isso resultou na Revolta da Chibata de 1910.[14] --- Os oficiais mantinham a disciplina pelo castigo corporal.[13] Na Marinha, isso resultou na Revolta da Chibata de 1910.[14] === A nova legislação era a lei 2.556, de 26 de setembro de 1874, e o decreto 5.881, de 17 de fevereiro de 1875.[35] --- A nova legislação era a lei 2.556, de 26 de setembro de 1874, e o decreto 5.881, de 17 de fevereiro de 1875.[35] === node-sentencex-ts-0.1.13-ts/tests/fixtures/ru.txt000066400000000000000000000173251514371216700220040ustar00rootroot00000000000000Объем составляет 5 куб.м. --- Объем составляет 5 куб.м. === Маленькая девочка бежала и кричала: «Не видали маму?». --- Маленькая девочка бежала и кричала: «Не видали маму?». === Сегодня 27.10.14 --- Сегодня 27.10.14 === «Я приду поздно», — сказал Андрей. --- «Я приду поздно», — сказал Андрей. === «К чему ты готовишься? – спросила мама. – Завтра ведь выходной». --- «К чему ты готовишься? – спросила мама. – Завтра ведь выходной». === По словам Пушкина, «Привычка свыше дана, замена счастью она». --- По словам Пушкина, «Привычка свыше дана, замена счастью она». === Он сказал: «Я очень устал», и сразу же замолчал. --- Он сказал: «Я очень устал», и сразу же замолчал. === Мне стало как-то ужасно грустно в это мгновение; однако что-то похожее на смех зашевелилось в душе моей. --- Мне стало как-то ужасно грустно в это мгновение; однако что-то похожее на смех зашевелилось в душе моей. === Шухов как был в ватных брюках, не снятых на ночь повыше левого колена их тоже был пришит затасканный погрязневший лоскут, и на нем выведен черной, уже поблекшей краской номер Щ-854, надел телогрейку… --- Шухов как был в ватных брюках, не снятых на ночь повыше левого колена их тоже был пришит затасканный погрязневший лоскут, и на нем выведен черной, уже поблекшей краской номер Щ-854, надел телогрейку… === Слово «дом» является синонимом жилища --- Слово «дом» является синонимом жилища === В Санкт-Петербург на гастроли приехал театр «Современник» --- В Санкт-Петербург на гастроли приехал театр «Современник» === Машина едет со скоростью 100 км/ч. --- Машина едет со скоростью 100 км/ч. === Я поем и/или лягу спать. --- Я поем и/или лягу спать. === Он не мог справиться с примером "3 + (14:7) = 5" --- Он не мог справиться с примером "3 + (14:7) = 5" === Вот список: 1.мороженое, 2.мясо, 3.рис. --- Вот список: 1.мороженое, 2.мясо, 3.рис. === Квартира 234 находится на 4-ом этаже. --- Квартира 234 находится на 4-ом этаже. === В это время года температура может подниматься до 40°C. --- В это время года температура может подниматься до 40°C. === Объем составляет 5м³. --- Объем составляет 5м³. === Площадь комнаты 14м². --- Площадь комнаты 14м². === Площадь комнаты 14 кв.м. --- Площадь комнаты 14 кв.м. === 1°C соответствует 33.8°F. --- 1°C соответствует 33.8°F. === Сегодня 27 октября 2014 года. --- Сегодня 27 октября 2014 года. === Эта машина стоит 150 000 дол.! --- Эта машина стоит 150 000 дол.! === Эта машина стоит $150 000! --- Эта машина стоит $150 000! === Вот номер моего телефона: +39045969798. Передавайте привет г-ну Шапочкину. До свидания. --- Вот номер моего телефона: +39045969798. Передавайте привет г-ну Шапочкину. До свидания. === Постойте, разве можно указывать цены в у.е.! --- Постойте, разве можно указывать цены в у.е.! === Едем на скорости 90 км/ч в сторону пгт. Брагиновка, о котором мы так много слышали по ТВ! --- Едем на скорости 90 км/ч в сторону пгт. Брагиновка, о котором мы так много слышали по ТВ! === Д-р ветеринарных наук А. И. Семенов и пр. выступали на этом семинаре. --- Д-р ветеринарных наук А. И. Семенов и пр. выступали на этом семинаре. === Уважаемый проф. Семенов! Просьба до 20.10 сдать отчет на кафедру. Уважаемый проф. Семенов! Просьба до 20.10 сдать отчет на кафедру. === Первоначальная стоимость этого комплекта 30 долл., но сейчас действует скидка. Предъявите дисконтную карту, пожалуйста! --- Первоначальная стоимость этого комплекта 30 долл., но сейчас действует скидка. Предъявите дисконтную карту, пожалуйста! === Виктор съел пол-лимона и ушел по-английски из дома на ул. 1 Мая.': ['Виктор съел пол-лимона и ушел по-английски из дома на ул. 1 Мая. === Напоминаю Вам, что 25.10 день рождения у Маши К., нужно будет купить ей подарок. Напоминаю Вам, что 25.10 день рождения у Маши К., нужно будет купить ей подарок. === В 2010-2012 гг. Виктор посещал г. Волгоград неоднократно. --- В 2010-2012 гг. Виктор посещал г. Волгоград неоднократно. === Маленькая девочка бежала и кричала: «Не видали маму?» --- Маленькая девочка бежала и кричала: «Не видали маму?» === Кв. 234 находится на 4 этаже. --- Кв. 234 находится на 4 этаже. === Нужно купить 1)рыбу 2)соль. --- Нужно купить 1)рыбу 2)соль. === Л.Н. Толстой написал "Войну и мир". Кроме Волконских, Л. Н. Толстой состоял в близком родстве с некоторыми другими аристократическими родами. Дом, где родился Л.Н.Толстой, 1898 г. В 1854 году дом продан по распоряжению писателя на вывоз в село Долгое. --- Л.Н. Толстой написал "Войну и мир". Кроме Волконских, Л. Н. Толстой состоял в близком родстве с некоторыми другими аристократическими родами. Дом, где родился Л.Н.Толстой, 1898 г. В 1854 году дом продан по распоряжению писателя на вывоз в село Долгое. === node-sentencex-ts-0.1.13-ts/tests/fixtures/sk.txt000066400000000000000000000016141514371216700217650ustar00rootroot00000000000000Ide o majiteľov firmy ABTrade s. r. o., ktorí stoja aj za ďalšími spoločnosťami, napr. XYZCorp a.s. --- Ide o majiteľov firmy ABTrade s. r. o., ktorí stoja aj za ďalšími spoločnosťami, napr. XYZCorp a.s. === „Prieskumy beriem na ľahkú váhu. V podstate ma to nezaujíma,“ reagoval Matovič na prieskum agentúry Focus. --- „Prieskumy beriem na ľahkú váhu. V podstate ma to nezaujíma,“ reagoval Matovič na prieskum agentúry Focus. === Toto sa mi podarilo až na 10. pokus, ale stálo to za to. --- Toto sa mi podarilo až na 10. pokus, ale stálo to za to. === Ide o príslušníkov XII. Pluku špeciálneho určenia. --- Ide o príslušníkov XII. Pluku špeciálneho určenia. === Spoločnosť bola založená 7. Apríla 2020, na zmluve však figuruje dátum 20. marec 2020. --- Spoločnosť bola založená 7. Apríla 2020, na zmluve však figuruje dátum 20. marec 2020. === node-sentencex-ts-0.1.13-ts/tests/fixtures/ta.txt000066400000000000000000000000001514371216700217400ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/tests/fixtures/te.txt000066400000000000000000000000001514371216700217440ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/tests/fixtures/ur.txt000066400000000000000000000002701514371216700217730ustar00rootroot00000000000000کیا حال ہے؟ ميرا نام ___ ەے۔ میں حالا تاوان دےدوں؟ --- کیا حال ہے؟ ميرا نام ___ ەے۔ میں حالا تاوان دےدوں؟ === node-sentencex-ts-0.1.13-ts/tests/fixtures/zh.txt000066400000000000000000000012661514371216700217740ustar00rootroot00000000000000安永已聯繫周怡安親屬,協助辦理簽證相關事宜,周怡安家屬1月1日晚間搭乘東方航空班機抵達上海,他們步入入境大廳時神情落寞、不發一語。周怡安來自台中,去年剛從元智大學畢業,同年9月加入安永。 --- 安永已聯繫周怡安親屬,協助辦理簽證相關事宜,周怡安家屬1月1日晚間搭乘東方航空班機抵達上海,他們步入入境大廳時神情落寞、不發一語。 周怡安來自台中,去年剛從元智大學畢業,同年9月加入安永。 === 我们明天一起去看《摔跤吧!爸爸》好吗?好! --- 我们明天一起去看《摔跤吧!爸爸》好吗? 好! === node-sentencex-ts-0.1.13-ts/tests/helpers.ts000066400000000000000000000021051514371216700207440ustar00rootroot00000000000000import { expect } from 'vitest'; import { readFileSync } from 'node:fs'; import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; import { segment } from '../src'; const __dirname = dirname(fileURLToPath(import.meta.url)); export function runLanguageTests(langCode: string, testFile: string): void { let filePath = resolve(__dirname, 'fixtures', testFile); let content = readFileSync(filePath, 'utf-8'); let testCases = content.split('===\n'); for (let testCase of testCases) { if (testCase.trim().startsWith('#')) { continue; } let parts = testCase.split('---\n'); if (parts.length !== 2) { continue; } let input = parts[0].trim(); let expected = parts[1] .split('\n') .map((line: string) => line.trim()) .filter((line: string) => line.length > 0); let result = segment(langCode, input); let trimmedResult = result.map((item: string) => item.trim()); expect(trimmedResult).toEqual(expected); } } node-sentencex-ts-0.1.13-ts/tests/languages/000077500000000000000000000000001514371216700207025ustar00rootroot00000000000000node-sentencex-ts-0.1.13-ts/tests/languages/am.test.ts000066400000000000000000000003351514371216700226260ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Amharic segmentation', () => { it('passes fixture tests', () => { runLanguageTests('am', 'am.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/ar.test.ts000066400000000000000000000003341514371216700226320ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Arabic segmentation', () => { it('passes fixture tests', () => { runLanguageTests('ar', 'ar.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/bg.test.ts000066400000000000000000000003371514371216700226230ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Bulgarian segmentation', () => { it('passes fixture tests', () => { runLanguageTests('bg', 'bg.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/bn.test.ts000066400000000000000000000003351514371216700226300ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Bengali segmentation', () => { it('passes fixture tests', () => { runLanguageTests('bn', 'bn.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/ca.test.ts000066400000000000000000000003351514371216700226140ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Catalan segmentation', () => { it('passes fixture tests', () => { runLanguageTests('ca', 'ca.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/da.test.ts000066400000000000000000000003341514371216700226140ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Danish segmentation', () => { it('passes fixture tests', () => { runLanguageTests('da', 'da.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/de.test.ts000066400000000000000000000003341514371216700226200ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('German segmentation', () => { it('passes fixture tests', () => { runLanguageTests('de', 'de.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/el.test.ts000066400000000000000000000003331514371216700226270ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Greek segmentation', () => { it('passes fixture tests', () => { runLanguageTests('el', 'el.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/en.test.ts000066400000000000000000000003351514371216700226330ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('English segmentation', () => { it('passes fixture tests', () => { runLanguageTests('en', 'en.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/es.test.ts000066400000000000000000000003351514371216700226400ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Spanish segmentation', () => { it('passes fixture tests', () => { runLanguageTests('es', 'es.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/fi.test.ts000066400000000000000000000003351514371216700226270ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Finnish segmentation', () => { it('passes fixture tests', () => { runLanguageTests('fi', 'fi.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/fr.test.ts000066400000000000000000000003341514371216700226370ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('French segmentation', () => { it('passes fixture tests', () => { runLanguageTests('fr', 'fr.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/gu.test.ts000066400000000000000000000003361514371216700226450ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Gujarati segmentation', () => { it('passes fixture tests', () => { runLanguageTests('gu', 'gu.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/hi.test.ts000066400000000000000000000003331514371216700226270ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Hindi segmentation', () => { it('passes fixture tests', () => { runLanguageTests('hi', 'hi.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/hy.test.ts000066400000000000000000000003361514371216700226520ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Armenian segmentation', () => { it('passes fixture tests', () => { runLanguageTests('hy', 'hy.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/it.test.ts000066400000000000000000000003351514371216700226450ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Italian segmentation', () => { it('passes fixture tests', () => { runLanguageTests('it', 'it.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/ja.test.ts000066400000000000000000000003361514371216700226240ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Japanese segmentation', () => { it('passes fixture tests', () => { runLanguageTests('ja', 'ja.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/kk.test.ts000066400000000000000000000003341514371216700226350ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Kazakh segmentation', () => { it('passes fixture tests', () => { runLanguageTests('kk', 'kk.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/kn.test.ts000066400000000000000000000003351514371216700226410ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Kannada segmentation', () => { it('passes fixture tests', () => { runLanguageTests('kn', 'kn.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/ml.test.ts000066400000000000000000000003371514371216700226430ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Malayalam segmentation', () => { it('passes fixture tests', () => { runLanguageTests('ml', 'ml.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/mr.test.ts000066400000000000000000000003351514371216700226470ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Marathi segmentation', () => { it('passes fixture tests', () => { runLanguageTests('mr', 'mr.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/my.test.ts000066400000000000000000000003351514371216700226560ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Burmese segmentation', () => { it('passes fixture tests', () => { runLanguageTests('my', 'my.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/nl.test.ts000066400000000000000000000003331514371216700226400ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Dutch segmentation', () => { it('passes fixture tests', () => { runLanguageTests('nl', 'nl.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/pa.test.ts000066400000000000000000000003351514371216700226310ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Punjabi segmentation', () => { it('passes fixture tests', () => { runLanguageTests('pa', 'pa.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/pl.test.ts000066400000000000000000000003341514371216700226430ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Polish segmentation', () => { it('passes fixture tests', () => { runLanguageTests('pl', 'pl.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/pt.test.ts000066400000000000000000000003401514371216700226500ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Portuguese segmentation', () => { it('passes fixture tests', () => { runLanguageTests('pt', 'pt.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/ru.test.ts000066400000000000000000000003351514371216700226570ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Russian segmentation', () => { it('passes fixture tests', () => { runLanguageTests('ru', 'ru.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/sk.test.ts000066400000000000000000000003341514371216700226450ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Slovak segmentation', () => { it('passes fixture tests', () => { runLanguageTests('sk', 'sk.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/ta.test.ts000066400000000000000000000003331514371216700226330ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Tamil segmentation', () => { it('passes fixture tests', () => { runLanguageTests('ta', 'ta.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/languages/te.test.ts000066400000000000000000000003341514371216700226400ustar00rootroot00000000000000import { describe, it } from 'vitest'; import { runLanguageTests } from '../helpers'; describe('Telugu segmentation', () => { it('passes fixture tests', () => { runLanguageTests('te', 'te.txt'); }); }); node-sentencex-ts-0.1.13-ts/tests/segment.test.ts000066400000000000000000000155161514371216700217340ustar00rootroot00000000000000import { describe, it, expect } from 'vitest'; import { chunkText, segment, getSentenceBoundaries } from '../src'; import { runLanguageTests } from './helpers'; describe('segment', () => { it('segments basic English text', () => { let result = segment('en', 'Hello world. This is a test.'); expect(result).toEqual(['Hello world. ', 'This is a test.']); }); it('handles Urdu text', () => { runLanguageTests('ur', 'ur.txt'); }); it('handles Chinese text', () => { runLanguageTests('zh', 'zh.txt'); }); }); describe('chunkText', () => { it('chunks basic text at paragraph boundaries', () => { let text = 'First paragraph.\n\nSecond paragraph.\n\nThird paragraph.'; let chunks = chunkText(text, 20); expect(chunks.length).toBe(3); expect(chunks[0]).toBe('First paragraph.'); expect(chunks[1]).toBe('Second paragraph.'); expect(chunks[2]).toBe('Third paragraph.'); }); it('returns single chunk when no paragraph breaks', () => { let text = 'This is a long text without paragraph breaks that should be returned as one chunk.'; let chunks = chunkText(text, 20); expect(chunks.length).toBe(1); expect(chunks[0]).toBe(text); }); }); describe('automatic chunking', () => { it('handles large text with chunking', () => { let smallText = 'First sentence. Second sentence.\n\nThird sentence. Fourth sentence.'; let largeText = smallText.repeat(10000); let result = segment('en', largeText); let expectedPerRepetition = segment('en', smallText); expect(result.length).toBeGreaterThanOrEqual(expectedPerRepetition.length * 9000); let smallResult = segment('en', smallText); expect(smallResult).toEqual(expectedPerRepetition); }); }); describe('getSentenceBoundaries', () => { it('detects paragraph breaks', () => { let text = 'Title\n\nSentence 1.\n\nSentence 2.'; let boundaries = getSentenceBoundaries('en', text); expect(boundaries.length).toBeGreaterThanOrEqual(2); // Verify indices are ordered for (let i = 1; i < boundaries.length; i++) { expect(boundaries[i].startIndex).toBeGreaterThanOrEqual(boundaries[i - 1].endIndex); } // Verify text can be reconstructed let reconstructed = boundaries.map((b) => b.text).join(''); expect(reconstructed).toBe(text); // Check paragraph breaks detected let paraBreaks = boundaries.filter((b) => b.isParagraphBreak); expect(paraBreaks.length).toBeGreaterThanOrEqual(2); }); it('handles CJK multi-byte characters', () => { let text = '\u65E5\u672C\u8A9E\u3067\u3059\u3002\n\n\u4E2D\u6587\u6587\u7AE0\u3002'; let boundaries = getSentenceBoundaries('en', text); expect(boundaries.length).toBeGreaterThanOrEqual(2); for (let i = 1; i < boundaries.length; i++) { expect(boundaries[i].startIndex).toBeGreaterThanOrEqual(boundaries[i - 1].endIndex); } let reconstructed = boundaries.map((b) => b.text).join(''); expect(reconstructed).toBe(text); }); it('handles emoji characters', () => { let text = 'Hello world \uD83D\uDC4B.\n\nGoodbye \uD83D\uDC4B.'; let boundaries = getSentenceBoundaries('en', text); expect(boundaries.length).toBeGreaterThanOrEqual(2); let reconstructed = boundaries.map((b) => b.text).join(''); expect(reconstructed).toBe(text); for (let boundary of boundaries) { expect(boundary.startIndex).toBeLessThanOrEqual(boundary.endIndex); } }); it('handles mixed scripts', () => { let text = 'English text. Caf\u00E9 r\u00E9sum\u00E9.\n\n\u65E5\u672C\u8A9E\u306E\u30C6\u30AD\u30B9\u30C8\u3002'; let boundaries = getSentenceBoundaries('en', text); let reconstructed = boundaries.map((b) => b.text).join(''); expect(reconstructed).toBe(text); for (let i = 1; i < boundaries.length; i++) { expect(boundaries[i].startIndex).toBeGreaterThanOrEqual(boundaries[i - 1].endIndex); } for (let boundary of boundaries) { expect(boundary.startIndex).toBeLessThanOrEqual(boundary.endIndex); } }); it('handles multi-byte segment', () => { let text = '\u65E5\u672C\u8A9E\u3067\u3059\u3002\u4E2D\u6587\u6587\u7AE0\u3002'; let sentences = segment('en', text); expect(sentences.length).toBeGreaterThan(0); let reconstructed = sentences.join(''); expect(reconstructed).toBe(text); }); }); describe('boundary symbol detection', () => { it('detects boundary symbol with trailing space', () => { let text = 'Hello world. This is a test.Another test. And another test.'; let boundaries = getSentenceBoundaries('en', text); expect(boundaries.length).toBeGreaterThanOrEqual(4); let nonParagraph = boundaries.filter((b) => !b.isParagraphBreak); for (let boundary of nonParagraph) { expect(boundary.boundarySymbol).toBe('.'); } }); it('detects boundary symbol with multiple trailing spaces', () => { let text = 'Hello. This is another. Yet another.'; let boundaries = getSentenceBoundaries('en', text); let nonParagraph = boundaries.filter((b) => !b.isParagraphBreak); for (let boundary of nonParagraph) { expect(boundary.boundarySymbol).toBe('.'); } }); it('detects mixed terminators', () => { let text = "Hello! How are you? I'm fine. Yes."; let boundaries = getSentenceBoundaries('en', text); let nonParagraph = boundaries.filter((b) => !b.isParagraphBreak); let symbols = nonParagraph .map((b) => b.boundarySymbol) .filter((s): s is string => s !== null); expect(symbols).toContain('!'); expect(symbols).toContain('?'); expect(symbols).toContain('.'); }); it('detects CJK terminator', () => { let text = '\u65E5\u672C\u8A9E\u3067\u3059\u3002\u4E2D\u6587\u3067\u3059\u3002'; let boundaries = getSentenceBoundaries('en', text); let nonParagraph = boundaries.filter((b) => !b.isParagraphBreak); let withCjkStop = nonParagraph.filter((b) => b.boundarySymbol === '\u3002'); expect(withCjkStop.length).toBeGreaterThanOrEqual(1); }); it('works with tabs and spaces', () => { let text = 'First sentence.\t\n Second sentence. Third one!'; let boundaries = getSentenceBoundaries('en', text); let nonParagraph = boundaries.filter((b) => !b.isParagraphBreak); for (let boundary of nonParagraph) { expect(boundary.boundarySymbol).not.toBeNull(); } let reconstructed = boundaries.map((b) => b.text).join(''); expect(reconstructed).toBe(text); }); }); node-sentencex-ts-0.1.13-ts/tsconfig.build.json000066400000000000000000000002411514371216700213740ustar00rootroot00000000000000{ "extends": "./tsconfig.json", "compilerOptions": { "rootDir": "./src" }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "tests"] } node-sentencex-ts-0.1.13-ts/tsconfig.json000066400000000000000000000006421514371216700203030ustar00rootroot00000000000000{ "compilerOptions": { "target": "ES2020", "module": "ESNext", "moduleResolution": "bundler", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "declaration": true, "declarationDir": "./dist", "outDir": "./dist", "sourceMap": true }, "include": ["src/**/*", "tests/**/*"], "exclude": ["node_modules", "dist"] } node-sentencex-ts-0.1.13-ts/vite.config.ts000066400000000000000000000007251514371216700203610ustar00rootroot00000000000000import { defineConfig } from 'vite'; import { resolve } from 'path'; export default defineConfig({ build: { lib: { entry: resolve(__dirname, 'src/index.ts'), name: 'sentencex', formats: ['es', 'cjs'], fileName: 'sentencex', }, minify: true, rollupOptions: { output: { exports: 'named', }, }, }, assetsInclude: ['**/*.txt'], }); node-sentencex-ts-0.1.13-ts/vitest.config.ts000066400000000000000000000003551514371216700207270ustar00rootroot00000000000000import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { globals: true, include: ['tests/**/*.test.ts'], typecheck: { tsconfig: './tsconfig.json', }, }, });