Cleaning up, bugfixes

This commit is contained in:
Jean Viscogliosi-Pate 2025-08-03 16:35:56 -07:00
parent c2dcb27f8c
commit 31ef3ad935
4 changed files with 61 additions and 59 deletions

View File

@ -2,14 +2,18 @@
"nodes": { "nodes": {
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 0, "lastModified": 1754217164,
"narHash": "sha256-463SNPWmz46iLzJKRzO3Q2b0Aurff3U1n0nYItxq7jU=", "narHash": "sha256-7zupXwqbChmsEyOCUzUbrWVwnUxPc6ExBajgk/Y1oeU=",
"path": "/nix/store/yw6kg4rb9v8s3ypjbpspig5r81m4lr5s-source", "owner": "NixOS",
"type": "path" "repo": "nixpkgs",
"rev": "94bcd9f5bcc94c0a1451ea873e38dddea7360bdc",
"type": "github"
}, },
"original": { "original": {
"id": "nixpkgs", "owner": "NixOS",
"type": "indirect" "ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
} }
}, },
"root": { "root": {

View File

@ -1,6 +1,6 @@
{ {
inputs = { inputs = {
# nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
systems.url = "github:nix-systems/default"; systems.url = "github:nix-systems/default";
}; };
@ -13,7 +13,7 @@
devShells = eachSystem (pkgs: { devShells = eachSystem (pkgs: {
default = pkgs.mkShell { default = pkgs.mkShell {
buildInputs = [ buildInputs = [
pkgs.nodejs_22 pkgs.nodejs_24
]; ];
}; };
}); });

View File

@ -1,3 +1,6 @@
// TODO time operation
// TODO change to global, time and compare performance
const verbsHelper = require("english-verbs-helper"); const verbsHelper = require("english-verbs-helper");
const verbsIrregular = require("english-verbs-irregular/dist/verbs.json"); const verbsIrregular = require("english-verbs-irregular/dist/verbs.json");
const verbsGerunds = require("english-verbs-gerunds/dist/gerunds.json"); const verbsGerunds = require("english-verbs-gerunds/dist/gerunds.json");
@ -92,8 +95,8 @@ function vrb(request) {
const regexp = new RegExp([ const regexp = new RegExp([
/(?<firstLetter>v)r/, /(?<firstLetter>v)r/,
/(?<category>[nb])\//, /(?<category>[nb])\//,
/(?<verb>[\w\s]+)\//, /(?:(?<tense>(?:(?:simple|progressive|perfect|perfect[ _]progressive|participle(?![ _]future))[ _])*(?:past|present|future))\/)*/,
/(?:(?<tense>(?:(?:simple|progressive|perfect|perfect[ _]progressive|participle(?![ _]future))[ _])*(?:past|present|future))\/)*/ /(?<verb>[\w\s]+)\//
].map(r => r.source).join(''), 'i'); ].map(r => r.source).join(''), 'i');
request.loop(request, { request.loop(request, {
@ -294,31 +297,17 @@ function prn(request) {
/* Replaces specific words indicated in the options */ /* Replaces specific words indicated in the options */
function also(request) { function also(request) {
Object.entries(options.also).forEach(([searchTerm, replacement]) => { Object.entries(request.options.also).forEach(([key, replacement]) => {
let searchTermEscaped = searchTerm.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); const regexp = new RegExp(RegExp.escape(key), "gi");
request.input = request.input.replaceAll(regexp, replacement);
// Remove whitespace from the front and back
if (searchTermEscaped[0].match(/[a-z]/i)) {
searchTermEscaped = `\\b${searchTermEscaped}`;
}
if (searchTermEscaped[searchTermEscaped.length - 1].match((/[a-z]/i))) {
searchTermEscaped = `${searchTermEscaped}\\b`;
}
const searchTermRegexp = new RegExp(searchTermEscaped);
request.loop(request, {
regexp: searchTermRegexp,
replacement: replacement
}, (input, params) => {
return input.replaceAll(params.regexp, params.replacement);
});
}); });
} }
/* alt/first and second or third/word1/word2/ becomes "word1" in first and second-person POV but "word2" in third-person */ /* alt/first and second or third/word1/word2/ becomes "word1" in first and second-person POV but "word2" in third-person */
function alt(request) { function alt(request) {
const regexp1 = new RegExp([ const regexp1 = new RegExp([
/alt\/(?<targetPov>first|second|third)/, /alt\/(?<targetPov1>first|second|third)/,
/(?: and (?!\1)(?<targetPov2>first|second|third))?/,
/\/(?<replacement>[^\/]*)\// /\/(?<replacement>[^\/]*)\//
].map(r => r.source).join(''), 'i'); ].map(r => r.source).join(''), 'i');
request.loop(request, { request.loop(request, {
@ -326,10 +315,14 @@ function alt(request) {
pov: request.options.pov pov: request.options.pov
}, (input, params) => { }, (input, params) => {
const vars = input.match(params.regexp).groups; const vars = input.match(params.regexp).groups;
if (vars.targetPov == params.pov) { if (vars.targetPov1.toLowerCase() == params.pov) {
return input.replace(params.regexp, vars.replacement);
} else if (vars.targetPov2 == null) {
return input.replace(params.regexp, "");
} else if (vars.targetPov2.toLowerCase() == params.pov) {
return input.replace(params.regexp, vars.replacement); return input.replace(params.regexp, vars.replacement);
} else { } else {
return input.replace(params.regexp, null); return input.replace(params.regexp, "");
} }
}); });
@ -346,19 +339,24 @@ function alt(request) {
pov: request.options.pov pov: request.options.pov
}, (input, params) => { }, (input, params) => {
const vars = input.match(params.regexp).groups; const vars = input.match(params.regexp).groups;
if (vars.targetPov1 == params.pov || vars.conjunction1.toLowerCase() == "and" && vars.targetPov2 == params.pov) { if (vars.targetPov1.toLowerCase() == params.pov) {
return input.replace(params.regexp, vars.replacement1); return input.replace(params.regexp, vars.replacement1);
} else if (vars.conjunction1.toLowerCase() == "or" && vars.targetPov2 == params.pov) { } else if (vars.targetPov2.toLowerCase() == params.pov) {
if (vars.conjunction1.toLowerCase() == "and") {
return input.replace(params.regexp, vars.replacement1);
} else {
return input.replace(params.regexp, vars.replacement2); return input.replace(params.regexp, vars.replacement2);
}
} else if (vars.conjunction2 == null) { } else if (vars.conjunction2 == null) {
return input.replace(params.regexp, null); return input.replace(params.regexp, "");
} else { } else {
return input.replace(params.regexp, vars.replacement2); return input.replace(params.regexp, vars.replacement2);
} }
}); });
const regexp3 = new RegExp([ const regexp3 = new RegExp([
/alt\/(?<replacement1>[^\/]*)\//, /alt\/(?:(first|second|third) or (?!\1)(first|second|third) or (?!\1|\2)(?:first|second|third)\/)?/,
/(?<replacement1>[^\/]*)\//,
/(?<replacement2>[^\/]*)\//, /(?<replacement2>[^\/]*)\//,
/(?<replacement3>[^\/]*)\// /(?<replacement3>[^\/]*)\//
].map(r => r.source).join(''), 'i'); ].map(r => r.source).join(''), 'i');
@ -392,7 +390,7 @@ function ife(request) {
if (vars.lhs === vars.rhs) { if (vars.lhs === vars.rhs) {
return input.replace(params.regexp, vars.replacement); return input.replace(params.regexp, vars.replacement);
} else { } else {
return null; return input.replace(params.regexp, "");
} }
}); });
@ -403,7 +401,7 @@ function ife(request) {
/(?<else>[^\/]*)\// /(?<else>[^\/]*)\//
].map(r => r.source).join(''), 'i'); ].map(r => r.source).join(''), 'i');
request.loop(request, { request.loop(request, {
regexp: regexp1 regexp: regexp2
}, (input, params) => { }, (input, params) => {
const vars = input.match(params.regexp).groups; const vars = input.match(params.regexp).groups;
if (vars.lhs === vars.rhs) { if (vars.lhs === vars.rhs) {
@ -417,10 +415,10 @@ function ife(request) {
/* cut/off first 1/word/ shortens into "ord" */ /* cut/off first 1/word/ shortens into "ord" */
function cut(request) { function cut(request) {
const regexp = new RegExp([ const regexp = new RegExp([
/cut\/(?<target>[^\/]+)\//, /cut\/(?<offonly>off|only) /,
/(?<offonly>off|only) /,
/(?<firstlast>first|last) /, /(?<firstlast>first|last) /,
/(?<index>[1-9][0-9]*)\// /(?<index>[1-9][0-9]*)\//,
/(?<target>[^\/]+)\//
].map(r => r.source).join(''), 'i'); ].map(r => r.source).join(''), 'i');
request.loop(request, { request.loop(request, {
regexp: regexp regexp: regexp
@ -428,8 +426,8 @@ function cut(request) {
const vars = input.match(params.regexp).groups; const vars = input.match(params.regexp).groups;
const length = vars.target.length; const length = vars.target.length;
let start, end; let start, end;
if (vars.offonly == "only") { if (vars.offonly.toLowerCase() == "only") {
if (isFirst) { // only first n if (vars.firstlast.toLowerCase() == "first") { // only first n
start = 0; start = 0;
end = Math.min(vars.index, length - 1); end = Math.min(vars.index, length - 1);
} else { // only last n } else { // only last n
@ -437,7 +435,7 @@ function cut(request) {
end = length; end = length;
} }
} else { } else {
if (vars.firstlast == "first") { // off first n if (vars.firstlast.toLowerCase() == "first") { // off first n
start = Math.min(vars.index, length - 1);; start = Math.min(vars.index, length - 1);;
end = length; end = length;
} else { // off last n } else { // off last n
@ -445,7 +443,7 @@ function cut(request) {
end = Math.max(length - vars.index, 1); end = Math.max(length - vars.index, 1);
} }
} }
return vars.target.slice(start, end); return input.replace(params.regexp, vars.target.slice(start, end));
}); });
} }
@ -454,20 +452,20 @@ function cap(request) {
const regexp = new RegExp([ const regexp = new RegExp([
/(?<style>cap|Cap|CAP)\//, /(?<style>cap|Cap|CAP)\//,
/(?<target>[^\/]+)\// /(?<target>[^\/]+)\//
].map(r => r.source).join(''),'i'); ].map(r => r.source).join(''));
request.loop(request, { request.loop(request, {
regexp: regexp regexp: regexp
}, (input, params) => { }, (input, params) => {
const vars = input.match(params.regexp).groups; const vars = input.match(params.regexp).groups;
const isLowerCase = /c/.test(vars.style.slice(0,1)); // cap const isLowerCase = /c/.test(vars.style.slice(0,1)); // cap
if (isLowerCase) { if (isLowerCase) {
return vars.target.toLowerCase(); return input.replace(params.regexp, vars.target.toLowerCase());
} else { } else {
const isStartCase = /a/.test(vars.style.slice(1,2)); // Cap const isStartCase = /a/.test(vars.style.slice(1,2)); // Cap
if (isStartCase) { if (isStartCase) {
return capitalize(vars.target); return input.replace(params.regexp, capitalize(vars.target));
} else { // CAP } else { // CAP
return vars.target.toUpperCase(); return input.replace(params.regexp, vars.target.toUpperCase());
} }
} }
}); });
@ -479,7 +477,7 @@ function mrr(request) {
regexp: /mrr\/(?<target>[^\/]+)\//i regexp: /mrr\/(?<target>[^\/]+)\//i
}, (input, params) => { }, (input, params) => {
const target = input.match(params.regexp).groups.target; const target = input.match(params.regexp).groups.target;
return target.split('').reverse().join(''); return input.replace(params.regexp, target.split('').reverse().join(''));
}); });
} }
@ -489,7 +487,7 @@ function aan(request) {
regexp: /a\/an (?<target>\w+)/i regexp: /a\/an (?<target>\w+)/i
}, (input, params) => { }, (input, params) => {
const target = input.match(params.regexp).groups.target; const target = input.match(params.regexp).groups.target;
return articleHelper(target, { numbers: 'colloquial' }); return input.replace(params.regexp, articleHelper(target, { numbers: 'colloquial' }));
}); });
} }

2
package-lock.json generated
View File

@ -7,7 +7,7 @@
"": { "": {
"name": "metamorpov", "name": "metamorpov",
"version": "1.0.0", "version": "1.0.0",
"license": "ISC", "license": "GPL-3.0-or-later",
"devDependencies": { "devDependencies": {
"english-verbs-gerunds": "^3.4.0", "english-verbs-gerunds": "^3.4.0",
"english-verbs-helper": "^3.4.0", "english-verbs-helper": "^3.4.0",