From 31ef3ad935eabf8dc626a2b6ef177e2d68906f0c Mon Sep 17 00:00:00 2001 From: Jean Date: Sun, 3 Aug 2025 16:35:56 -0700 Subject: [PATCH] Cleaning up, bugfixes --- flake.lock | 16 +++++--- flake.nix | 4 +- metamorpov.js | 98 +++++++++++++++++++++++------------------------ package-lock.json | 2 +- 4 files changed, 61 insertions(+), 59 deletions(-) diff --git a/flake.lock b/flake.lock index 9750de2..48018f8 100644 --- a/flake.lock +++ b/flake.lock @@ -2,14 +2,18 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 0, - "narHash": "sha256-463SNPWmz46iLzJKRzO3Q2b0Aurff3U1n0nYItxq7jU=", - "path": "/nix/store/yw6kg4rb9v8s3ypjbpspig5r81m4lr5s-source", - "type": "path" + "lastModified": 1754217164, + "narHash": "sha256-7zupXwqbChmsEyOCUzUbrWVwnUxPc6ExBajgk/Y1oeU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "94bcd9f5bcc94c0a1451ea873e38dddea7360bdc", + "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" } }, "root": { diff --git a/flake.nix b/flake.nix index a5883ef..112091d 100644 --- a/flake.nix +++ b/flake.nix @@ -1,6 +1,6 @@ { inputs = { - # nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; systems.url = "github:nix-systems/default"; }; @@ -13,7 +13,7 @@ devShells = eachSystem (pkgs: { default = pkgs.mkShell { buildInputs = [ - pkgs.nodejs_22 + pkgs.nodejs_24 ]; }; }); diff --git a/metamorpov.js b/metamorpov.js index 8df6e7d..6c1ed6d 100644 --- a/metamorpov.js +++ b/metamorpov.js @@ -1,3 +1,6 @@ +// TODO time operation +// TODO change to global, time and compare performance + const verbsHelper = require("english-verbs-helper"); const verbsIrregular = require("english-verbs-irregular/dist/verbs.json"); const verbsGerunds = require("english-verbs-gerunds/dist/gerunds.json"); @@ -92,9 +95,9 @@ function vrb(request) { const regexp = new RegExp([ /(?v)r/, /(?[nb])\//, - /(?[\w\s]+)\//, - /(?:(?(?:(?:simple|progressive|perfect|perfect[ _]progressive|participle(?![ _]future))[ _])*(?:past|present|future))\/)*/ - ].map(r => r.source).join(''),'i'); + /(?:(?(?:(?:simple|progressive|perfect|perfect[ _]progressive|participle(?![ _]future))[ _])*(?:past|present|future))\/)*/, + /(?[\w\s]+)\// + ].map(r => r.source).join(''), 'i'); request.loop(request, { regexp: regexp, @@ -294,42 +297,32 @@ function prn(request) { /* Replaces specific words indicated in the options */ function also(request) { - Object.entries(options.also).forEach(([searchTerm, replacement]) => { - let searchTermEscaped = searchTerm.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); - - // 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); - }); + Object.entries(request.options.also).forEach(([key, replacement]) => { + const regexp = new RegExp(RegExp.escape(key), "gi"); + request.input = request.input.replaceAll(regexp, replacement); }); } /* alt/first and second or third/word1/word2/ becomes "word1" in first and second-person POV but "word2" in third-person */ function alt(request) { const regexp1 = new RegExp([ - /alt\/(?first|second|third)/, + /alt\/(?first|second|third)/, + /(?: and (?!\1)(?first|second|third))?/, /\/(?[^\/]*)\// - ].map(r => r.source).join(''),'i'); + ].map(r => r.source).join(''), 'i'); request.loop(request, { regexp: regexp1, pov: request.options.pov }, (input, params) => { 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); } else { - return input.replace(params.regexp, null); + return input.replace(params.regexp, ""); } }); @@ -340,28 +333,33 @@ function alt(request) { /(?: (?!\2)(?and|or) (?!\1|\3)(?:first|second|third))?/, /\/(?[^\/]*)\//, /(?[^\/]*)\// - ].map(r => r.source).join(''),'i'); + ].map(r => r.source).join(''), 'i'); request.loop(request, { regexp: regexp2, pov: request.options.pov }, (input, params) => { 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); - } else if (vars.conjunction1.toLowerCase() == "or" && vars.targetPov2 == params.pov) { - return input.replace(params.regexp, vars.replacement2); + } 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); + } } else if (vars.conjunction2 == null) { - return input.replace(params.regexp, null); + return input.replace(params.regexp, ""); } else { return input.replace(params.regexp, vars.replacement2); } }); const regexp3 = new RegExp([ - /alt\/(?[^\/]*)\//, + /alt\/(?:(first|second|third) or (?!\1)(first|second|third) or (?!\1|\2)(?:first|second|third)\/)?/, + /(?[^\/]*)\//, /(?[^\/]*)\//, /(?[^\/]*)\// - ].map(r => r.source).join(''),'i'); + ].map(r => r.source).join(''), 'i'); request.loop(request, { regexp: regexp3, pov: request.options.pov @@ -384,7 +382,7 @@ function ife(request) { /if\/(?[^\/]*) is /, /(?[^\/]*)\//, /(?[^\/]*)\// - ].map(r => r.source).join(''),'i'); + ].map(r => r.source).join(''), 'i'); request.loop(request, { regexp: regexp1 }, (input, params) => { @@ -392,7 +390,7 @@ function ife(request) { if (vars.lhs === vars.rhs) { return input.replace(params.regexp, vars.replacement); } else { - return null; + return input.replace(params.regexp, ""); } }); @@ -401,9 +399,9 @@ function ife(request) { /(?[^\/]*)\//, /(?[^\/]*)\//, /(?[^\/]*)\// - ].map(r => r.source).join(''),'i'); + ].map(r => r.source).join(''), 'i'); request.loop(request, { - regexp: regexp1 + regexp: regexp2 }, (input, params) => { const vars = input.match(params.regexp).groups; if (vars.lhs === vars.rhs) { @@ -417,19 +415,19 @@ function ife(request) { /* cut/off first 1/word/ shortens into "ord" */ function cut(request) { const regexp = new RegExp([ - /cut\/(?[^\/]+)\//, - /(?off|only) /, + /cut\/(?off|only) /, /(?first|last) /, - /(?[1-9][0-9]*)\// - ].map(r => r.source).join(''),'i'); + /(?[1-9][0-9]*)\//, + /(?[^\/]+)\// + ].map(r => r.source).join(''), 'i'); request.loop(request, { regexp: regexp }, (input, params) => { const vars = input.match(params.regexp).groups; const length = vars.target.length; let start, end; - if (vars.offonly == "only") { - if (isFirst) { // only first n + if (vars.offonly.toLowerCase() == "only") { + if (vars.firstlast.toLowerCase() == "first") { // only first n start = 0; end = Math.min(vars.index, length - 1); } else { // only last n @@ -437,7 +435,7 @@ function cut(request) { end = length; } } else { - if (vars.firstlast == "first") { // off first n + if (vars.firstlast.toLowerCase() == "first") { // off first n start = Math.min(vars.index, length - 1);; end = length; } else { // off last n @@ -445,7 +443,7 @@ function cut(request) { 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([ /(?