Adding a/an feature, fixes #39

This commit is contained in:
Jean Viscogliosi-Pate 2025-07-20 10:21:28 -07:00
parent fdcce37656
commit 9faabd6f0d
6 changed files with 61 additions and 6 deletions

1
.gitignore vendored
View File

@ -1,4 +1,5 @@
node_modules
src/content-script.js
src/popup.js
src/manifest.json
dist

View File

@ -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 20152023 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 20092014 by TJ Holowaychuk.
- MetamorPOV supports adaptive articles with [indefinite](https://github.com/tandrewnichols/indefinite), licensed under [MIT](third-party-licenses/LICENSE-indefinite), copyrighted 20152025 by Andrew Nichols.
- MetamorPOV is themed with [Primary](https://primary-theme.github.io/), licensed under [GPL-3.0](third-party-licenses/LICENSE-Primary), copyrighted 20212024 by Cecilia May.
- Icons, excepting the butterfly, are redistributed from [Luicide](https://lucide.dev), licensed under [ISC](third-party-licenses/LICENSE-Luicide), copyrighted 20222025 by Lucide Contributors. Luicide contains portions of Feather, licensed under [MIT](third-party-licenses/LICENSE-Feather), copyrighted 20132022 by Cole Bemis.
- All other portions of MetamorPOV are licensed under [GPL-3.0-or-later](LICENSE), copyrighted 20242025 by Jean Viscogliosi-Pate.

11
package-lock.json generated
View File

@ -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",

View File

@ -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"

View File

@ -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);

View File

@ -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.