From 9faabd6f0d37b26026d2a52e424a09f23c30eb4a Mon Sep 17 00:00:00 2001 From: Jean Date: Sun, 20 Jul 2025 10:21:28 -0700 Subject: [PATCH] Adding a/an feature, fixes #39 --- .gitignore | 1 + README.md | 11 ++++++----- package-lock.json | 11 +++++++++++ package.json | 3 ++- src/replace-words.js | 20 ++++++++++++++++++++ third-party-licenses/LICENSE-indefinite | 21 +++++++++++++++++++++ 6 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 third-party-licenses/LICENSE-indefinite diff --git a/.gitignore b/.gitignore index 55194c2..01d5c6f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules src/content-script.js src/popup.js +src/manifest.json dist diff --git a/README.md b/README.md index 0997f84..f34b95e 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,9 @@ npm run test-chrome ## Copyright and License -- Portions of MetamorPOV are derived from [InteractiveFics](https://github.com/interactivefics/interactive-fics), licensed under [MIT](third-party-licenses/LICENSE-InteractiveFics), copyrighted 2015-2023 by Mariam Maarouf. -- MetamorPOV supports verb conjugation with [RosaeNLG](https://rosaenlg.org/), licensed under [Apache-2.0](third-party-licenses/LICENSE-RosaeNLG), copyrighted 2019-2024 by Ludan Stoecklé, 2015 by Forbes Lindesay, and 2009-2014 by TJ Holowaychuk. -- MetamorPOV is themed with [Primary](https://primary-theme.github.io/), licensed under [GPL-3.0](third-party-licenses/LICENSE-Primary), copyrighted 2021-2024 by Cecilia May. -- Icons, excepting the butterfly, are redistributed from [Luicide](https://lucide.dev), licensed under [ISC](third-party-licenses/LICENSE-Luicide), copyrighted 2022-2025 by Lucide Contributors. Luicide contains portions of Feather, licensed under [MIT](third-party-licenses/LICENSE-Feather), copyrighted 2013-2022 by Cole Bemis. -- All other portions of MetamorPOV are licensed under [GPL-3.0-or-later](LICENSE), copyrighted 2024-2025 by Jean Viscogliosi-Pate. +- Portions of MetamorPOV are derived from [InteractiveFics](https://github.com/interactivefics/interactive-fics), licensed under [MIT](third-party-licenses/LICENSE-InteractiveFics), copyrighted 2015–2023 by Mariam Maarouf. +- MetamorPOV supports verb conjugation with [RosaeNLG](https://rosaenlg.org/), licensed under [Apache-2.0](third-party-licenses/LICENSE-RosaeNLG), copyrighted 2019-2024 by Ludan Stoecklé, 2015 by Forbes Lindesay, and 2009–2014 by TJ Holowaychuk. +- MetamorPOV supports adaptive articles with [indefinite](https://github.com/tandrewnichols/indefinite), licensed under [MIT](third-party-licenses/LICENSE-indefinite), copyrighted 2015–2025 by Andrew Nichols. +- MetamorPOV is themed with [Primary](https://primary-theme.github.io/), licensed under [GPL-3.0](third-party-licenses/LICENSE-Primary), copyrighted 2021–2024 by Cecilia May. +- Icons, excepting the butterfly, are redistributed from [Luicide](https://lucide.dev), licensed under [ISC](third-party-licenses/LICENSE-Luicide), copyrighted 2022–2025 by Lucide Contributors. Luicide contains portions of Feather, licensed under [MIT](third-party-licenses/LICENSE-Feather), copyrighted 2013–2022 by Cole Bemis. +- All other portions of MetamorPOV are licensed under [GPL-3.0-or-later](LICENSE), copyrighted 2024–2025 by Jean Viscogliosi-Pate. diff --git a/package-lock.json b/package-lock.json index c522260..bb7bb69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "english-verbs-gerunds": "3.3.1", "english-verbs-helper": "3.3.1", "english-verbs-irregular": "3.3.1", + "indefinite": "^2.5.1", "rollup": "^4.27.3", "web-ext": "^8.3.0", "webextension-polyfill": "^0.12.0" @@ -2824,6 +2825,16 @@ "node": ">=0.8.19" } }, + "node_modules/indefinite": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/indefinite/-/indefinite-2.5.1.tgz", + "integrity": "sha512-Ul0hCdnSjuFDEloYWeozTaEfljbz+0q+u4HsHns2dOk2DlhGlbRMGFtNcIL+Ve7sZYeIOTOAKA0usAXBGHpNDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", diff --git a/package.json b/package.json index a73a48c..4e2fede 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "test": "cp src/manifest-firefox.json src/manifest.json && npx rollup -c && npx web-ext run -s src && rm src/manifest.json", "test-chrome": "cp src/manifest-chrome.json src/manifest.json && npx rollup -c && chromium && rm src/manifest.json", "build": "cp src/manifest-firefox.json src/manifest.json && npx rollup -c && npx web-ext build -s src -a dist --ignore-files replace-words.js save-load-options.js manifest-* service-worker* -n {name}-{version}.xpi -o && rm src/manifest.json", - "build-chrome": "cp src/manifest-chrome.json src/manifest.json && npx rollup -c && npx web-ext build -s src -a dist --ignore-files replace-words.js save-load-options.js manifest-* background.js -n {name}-{version}-chrome.zip -o && rm src/manifest.json" + "build-chrome": "cp src/manifest-chrome.json src/manifest.json && npx rollup -c && npx web-ext build -s src -a dist --ignore-files replace-words.js save-load-options.js manifest-* background.js -n {name}-{version}.zip -o && rm src/manifest.json" }, "devDependencies": { "@rollup/plugin-commonjs": "28.0.2", @@ -23,6 +23,7 @@ "english-verbs-gerunds": "3.3.1", "english-verbs-helper": "3.3.1", "english-verbs-irregular": "3.3.1", + "indefinite": "^2.5.1", "rollup": "^4.27.3", "web-ext": "^8.3.0", "webextension-polyfill": "^0.12.0" diff --git a/src/replace-words.js b/src/replace-words.js index c53bdcb..9945ec0 100644 --- a/src/replace-words.js +++ b/src/replace-words.js @@ -3,6 +3,7 @@ const verbsHelper = require("english-verbs-helper"); const verbsIrregular = require("english-verbs-irregular/dist/verbs.json"); const verbsGerunds = require("english-verbs-gerunds/dist/gerunds.json"); const verbsData = verbsHelper.mergeVerbsData(verbsIrregular, verbsGerunds); +const articleHelper = require("indefinite"); /* Replaces verbs, point-of-view, name, pronouns, and "also" terms */ function replaceAll() { @@ -42,6 +43,7 @@ function replaceAll() { replaceCuts(); replaceCapitals(); replaceMirror(); + replaceAn(); } }); } @@ -246,6 +248,12 @@ function replaceMirror() { walk(document.body, searchTerm, null, mirrorMethod); } +/* Replaces ambiguous articles with one suitable to the following word */ +function replaceAn() { + const searchTerm = /a\/an (\w+)/i; + walk(document.body, searchTerm, null, anMethod); +} + /* Turns a term into regexp format and uses that to replace it */ function escapeAndReplace(searchTerm, replaceValue, caseSensitive) { let searchTermEscaped = searchTerm.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); @@ -445,6 +453,18 @@ function mirrorMethod(node, searchTerm, unused) { mirrorMethod(node, searchTerm, unused); } +/* Allows for custom words to have the right article */ +function anMethod(node, searchTerm, unused) { + const match = node.nodeValue.match(searchTerm); + if (match == null) { return; } + const target = match[1]; + + let replaceValue = articleHelper(target, { numbers: 'colloquial' }); + + node.nodeValue = node.nodeValue.replace(searchTerm, replaceValue); + mirrorMethod(node, searchTerm, unused); +} + /* Returns the input word, capitalized */ function capitalize(word) { return word.charAt(0).toUpperCase() + word.slice(1); diff --git a/third-party-licenses/LICENSE-indefinite b/third-party-licenses/LICENSE-indefinite new file mode 100644 index 0000000..c90f681 --- /dev/null +++ b/third-party-licenses/LICENSE-indefinite @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Andrew Nichols + +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.