diff --git a/lib/email.js b/lib/email.js index 7955391..c9e4ce2 100644 --- a/lib/email.js +++ b/lib/email.js @@ -9,13 +9,13 @@ class Email { getVisibleText() { return this.filterText((fragment) => { - return !fragment.isHidden; + return !fragment.isHidden(); }); } getQuotedText() { return this.filterText((fragment) => { - return fragment.isQuoted; + return fragment.isQuoted(); }); } diff --git a/lib/emailreplyparser.js b/lib/emailreplyparser.js index fa27d11..cb2259b 100644 --- a/lib/emailreplyparser.js +++ b/lib/emailreplyparser.js @@ -1,7 +1,6 @@ var EmailParser = require("./parser/emailparser"); class EmailReplyParser { - read(text) { return new EmailParser().parse(text); } diff --git a/lib/fragment.js b/lib/fragment.js index 6801a83..7ef9e2e 100644 --- a/lib/fragment.js +++ b/lib/fragment.js @@ -1,29 +1,29 @@ class Fragment { constructor(content, isHidden, isSignature, isQuoted) { - this.content = content; - this.isHidden = isHidden; - this.isSignature = isSignature; - this.isQuoted = isQuoted; + this._content = content; + this._isHidden = isHidden; + this._isSignature = isSignature; + this._isQuoted = isQuoted; } isHidden() { - return this.isHidden; + return this._isHidden; } isSignature() { - return this.isSignature; + return this._isSignature; } isQuoted() { - return this.isQuoted; + return this._isQuoted; } getContent() { - return this.content; + return this._content; } isEmpty() { - return "" === this.getContent.replace(/\n/g, ""); + return "" === this.getContent().replace(/\n/g, ""); } toString() { @@ -31,4 +31,4 @@ class Fragment { } } -module.exports = Fragment; \ No newline at end of file +module.exports = Fragment; diff --git a/lib/regex.js b/lib/regex.js index 1a7f6c9..192f4e2 100644 --- a/lib/regex.js +++ b/lib/regex.js @@ -20,6 +20,7 @@ class RegexList { /^(.+\s<.+>\sschrieb:)$/m, // NAME schrieb: /^(.+\son.*at.*wrote:)$/m, // NAME on DATE wrote: /^\s*(From\s?:.+\s?\n?\s*[\[|<].+[\]|>])/m, // "From: NAME " OR "From : NAME " OR "From : NAME"(With support whitespace before start and before <) + /^\s*(Von\s?:.+\s?\n?\s*[\[|<].+[\]|>])/m, // "Von: NAME " OR "Von : NAME " OR "Von : NAME"(With support whitespace before start and before <) /^\s*(De\s?:.+\s?\n?\s*(\[|<).+(\]|>))/m, // "De: NAME " OR "De : NAME " OR "De : NAME" (With support whitespace before start and before <) /^\s*(Van\s?:.+\s?\n?\s*(\[|<).+(\]|>))/m, // "Van: NAME " OR "Van : NAME " OR "Van : NAME" (With support whitespace before start and before <) /^\s*(Da\s?:.+\s?\n?\s*(\[|<).+(\]|>))/m, // "Da: NAME " OR "Da : NAME " OR "Da : NAME" (With support whitespace before start and before <) @@ -27,7 +28,10 @@ class RegexList { /^\s*([a-z]{3,4}\.\s[\s\S]+\sskrev\s[\s\S]+:)$/m, // DATE skrev NAME : /^([0-9]{2}).([0-9]{2}).(20[0-9]{2})(.*)(([0-9]{2}).([0-9]{2}))(.*)\"( *)<(.*)>( *):$/m, // DD.MM.20YY HH:II NAME /^[0-9]{2}:[0-9]{2}(.*)[0-9]{4}(.*)\"( *)<(.*)>( *):$/, // HH:II, DATE, NAME : - /^(.*)[0-9]{4}(.*)from(.*)<(.*)>:$/ + /^(.*)[0-9]{4}(.*)from(.*)<(.*)>:$/, + /^-{1,12} ?(O|o)riginal (M|m)essage ?-{1,12}$/i, + /^-{1,12} ?(O|o)prindelig (B|b)esked ?-{1,12}$/i, + /^-{1,12} ?(M|m)essage d\'origine ?-{1,12}$/i ]); this.signatureRegex = this.buildRe2([ @@ -38,20 +42,35 @@ class RegexList { /^\+{2,4}$/, // Separator /^\={2,4}$/, // Separator /^________________________________$/, // Separator - /^-{1,10}Original message-{1,10}$/, + + // EN /^Sent from (?:\s*.+)$/, // en /^Get Outlook for (?:\s*.+).*/m, // en /^Cheers,?!?$/mi, // en - /^Thank you,?!?$/mi, // en /^Best wishes,?!?$/mi, // en /^\w{0,20}\s?(\sand\s)?Regards,?!?!?$/mi, //en + + // DE /^Von (?:\s*.+) gesendet$/, // de + /^Gesendet von (?:\s*.+) für (?:\s*.+)$/, // de + + // DA + /^Sendt fra (?:\s*.+)$/, // da + + // FR /^Envoyé depuis (?:\s*.+)$/, //fr + /^Envoyé de mon (?:\s*.+)$/, // fr - e.g. Envoyé de mon iPhone + /^Envoyé à partir de (?:\s*.+)$/, //fr /^Télécharger Outlook pour (?:\s*.+).*/m, // fr /^Bien . vous,?!?$/mi, // fr /^\w{0,20}\s?cordialement,?!?$/mi, // fr /^Bonne (journ.e|soir.e)!?$/mi, // fr - /^Enviado desde (?:\s*.+)$/, // es + + // ES + /^Enviado desde (?:\s*.+)$/, // es, + + // NL + /^Verzonden vanaf (?:\s*.+)$/, // nl - e.g. Verzonden vanaf Outlook voor Android ]); } @@ -62,4 +81,4 @@ class RegexList { } } -module.exports = new RegexList(); \ No newline at end of file +module.exports = new RegexList(); diff --git a/package-lock.json b/package-lock.json index 6db8bc6..d4eef39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "email-reply-parser", - "version": "1.5.3", + "version": "1.7.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "email-reply-parser", - "version": "1.5.3", + "version": "1.7.1", "license": "MIT", "dependencies": { - "re2": "1.20.7" + "re2": "1.21.3" }, "devDependencies": { "nodeunit": "v0.11.3", @@ -251,24 +251,24 @@ } }, "node_modules/@npmcli/agent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", - "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" + "socks-proxy-agent": "^8.0.3" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dependencies": { "semver": "^7.3.5" }, @@ -294,9 +294,9 @@ } }, "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dependencies": { "debug": "^4.3.4" }, @@ -468,9 +468,9 @@ "dev": true }, "node_modules/cacache": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.1.tgz", - "integrity": "sha512-g4Uf2CFZPaxtJKre6qr4zqLDOOPU7bNVhWjlNhvzc51xaTOx2noMOLhfFkTAqwtrAZAKQUuDfyjitzilpA8WsQ==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -1008,9 +1008,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -1102,22 +1102,20 @@ } }, "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -1210,9 +1208,9 @@ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -1237,9 +1235,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -1293,18 +1291,35 @@ "dev": true }, "node_modules/install-artifact-from-github": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/install-artifact-from-github/-/install-artifact-from-github-1.3.3.tgz", - "integrity": "sha512-x79SL0d8WOi1ZjXSTUqqs0GPQZ92YArJAN9O46wgU9wdH2U9ecyyhB9YGDbPe2OLV4ptmt6AZYRQZ2GydQZosQ==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/install-artifact-from-github/-/install-artifact-from-github-1.3.5.tgz", + "integrity": "sha512-gZHC7f/cJgXz7MXlHFBxPVMsvIbev1OQN1uKQYKVJDydGNm9oYf9JstbU4Atnh/eSvk41WtEovoRm+8IF686xg==", "bin": { "install-from-cache": "bin/install-from-cache.js", "save-to-github-cache": "bin/save-to-github-cache.js" } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, "node_modules/is-arrayish": { "version": "0.2.1", @@ -1473,15 +1488,12 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -1627,12 +1639,9 @@ } }, "node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/make-dir": { "version": "2.1.0", @@ -1663,9 +1672,9 @@ "dev": true }, "node_modules/make-fetch-happen": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", - "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", "dependencies": { "@npmcli/agent": "^2.0.0", "cacache": "^18.0.0", @@ -1676,6 +1685,7 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", + "proc-log": "^4.2.0", "promise-retry": "^2.0.1", "ssri": "^10.0.0" }, @@ -1714,9 +1724,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1737,9 +1747,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { "node": ">=16 || 14 >=14.17" } @@ -1756,9 +1766,9 @@ } }, "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -1878,9 +1888,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==" }, "node_modules/negotiator": { "version": "0.6.3", @@ -1897,9 +1907,9 @@ "dev": true }, "node_modules/node-gyp": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", - "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -1907,9 +1917,9 @@ "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", + "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { @@ -1934,9 +1944,9 @@ } }, "node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dependencies": { "abbrev": "^2.0.0" }, @@ -2219,6 +2229,11 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -2265,15 +2280,15 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2328,9 +2343,9 @@ } }, "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -2385,14 +2400,14 @@ } }, "node_modules/re2": { - "version": "1.20.7", - "resolved": "https://registry.npmjs.org/re2/-/re2-1.20.7.tgz", - "integrity": "sha512-k6m3ACAKl2k83nwM7vk7tSDnO5KwNzSYf73aVNFWLo0rBBZsAJzZeeU1tyZjsX0lhBK0BQiMrIf7zaIwk8WaCQ==", + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/re2/-/re2-1.21.3.tgz", + "integrity": "sha512-GI+KoGkHT4kxTaX+9p0FgNB1XUnCndO9slG5qqeEoZ7kbf6Dk6ohQVpmwKVeSp7LPLn+g6Q3BaCopz4oHuBDuQ==", "hasInstallScript": true, "dependencies": { - "install-artifact-from-github": "^1.3.3", - "nan": "^2.18.0", - "node-gyp": "^10.0.1" + "install-artifact-from-github": "^1.3.5", + "nan": "^2.20.0", + "node-gyp": "^10.1.0" } }, "node_modules/read-pkg": { @@ -2619,12 +2634,9 @@ "devOptional": true }, "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==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -2632,17 +2644,6 @@ "node": ">=10" } }, - "node_modules/semver/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==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -2689,26 +2690,26 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -2865,9 +2866,9 @@ } }, "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dependencies": { "minipass": "^7.0.3" }, @@ -3320,9 +3321,9 @@ "dev": true }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", diff --git a/package.json b/package.json index c8a3515..8ae8eb2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "email-reply-parser", - "version": "1.5.4", + "version": "1.8.2", "description": "Node library for parsing plain text email content. Based on https://github.com/willdurand/EmailReplyParser", "main": "lib/emailreplyparser.js", "homepage": "https://github.com/crisp-oss/email-reply-parser", @@ -17,7 +17,7 @@ "author": "Crisp IM SAS", "license": "MIT", "dependencies": { - "re2": "1.20.7" + "re2": "1.21.3" }, "devDependencies": { "nodeunit": "v0.11.3", diff --git a/test/fixtures/email_danish_dash_separator.txt b/test/fixtures/email_danish_dash_separator.txt new file mode 100644 index 0000000..7522f91 --- /dev/null +++ b/test/fixtures/email_danish_dash_separator.txt @@ -0,0 +1,11 @@ +Fusce bibendum, quam hendrerit sagittis tempor, dui turpis tempus erat, pharetra sodales ante sem sit amet metus. +Nulla malesuada, orci non vulputate lobortis, massa felis pharetra ex, convallis consectetur ex libero eget ante. +Nam vel turpis posuere, rhoncus ligula in, venenatis orci. Duis interdum venenatis ex a rutrum. +Duis ut libero eu lectus consequat consequat ut vel lorem. Vestibulum convallis lectus urna, +et mollis ligula rutrum quis. Fusce sed odio id arcu varius aliquet nec nec nibh. + +-------- Oprindelig besked -------- +Fra: A B C +Dato: 04.07.2024 17.45 (GMT+01:00) +Til: abc@abc.dk +Emne: Abc has sent you a message! diff --git a/test/fixtures/email_french_dash_separator.txt b/test/fixtures/email_french_dash_separator.txt new file mode 100644 index 0000000..a12a00e --- /dev/null +++ b/test/fixtures/email_french_dash_separator.txt @@ -0,0 +1,10 @@ +Fusce bibendum, quam hendrerit sagittis tempor, dui turpis tempus erat, pharetra sodales ante sem sit amet metus. +Nulla malesuada, orci non vulputate lobortis, massa felis pharetra ex, convallis consectetur ex libero eget ante. +Nam vel turpis posuere, rhoncus ligula in, venenatis orci. Duis interdum venenatis ex a rutrum. +Duis ut libero eu lectus consequat consequat ut vel lorem. Vestibulum convallis lectus urna, +et mollis ligula rutrum quis. Fusce sed odio id arcu varius aliquet nec nec nibh. + +-------- Message d'origine -------- +De : A B C +Date : 23/06/24 10:46 (GMT+01:00) +À : abc@abc.be Objet : Abc vous a envoyé un message ! diff --git a/test/fixtures/email_german_2.txt b/test/fixtures/email_german_2.txt new file mode 100644 index 0000000..3dfc0c3 --- /dev/null +++ b/test/fixtures/email_german_2.txt @@ -0,0 +1,12 @@ +Fusce bibendum, quam hendrerit sagittis tempor, dui turpis tempus erat, pharetra sodales ante sem sit amet metus. +Nulla malesuada, orci non vulputate lobortis, massa felis pharetra ex, convallis consectetur ex libero eget ante. +Nam vel turpis posuere, rhoncus ligula in, venenatis orci. Duis interdum venenatis ex a rutrum. +Duis ut libero eu lectus consequat consequat ut vel lorem. Vestibulum convallis lectus urna, +et mollis ligula rutrum quis. Fusce sed odio id arcu varius aliquet nec nec nibh. + +Von: John Doe +Gesendet: Donnerstag, 23. März 2023 17:11 +An: John Doe +Betreff: AW: Hi there! + +Hi there! diff --git a/test/fixtures/email_german_3.txt b/test/fixtures/email_german_3.txt new file mode 100644 index 0000000..97b505c --- /dev/null +++ b/test/fixtures/email_german_3.txt @@ -0,0 +1,9 @@ +Fusce bibendum, quam hendrerit sagittis tempor, dui turpis tempus erat, pharetra sodales ante sem sit amet metus. +Nulla malesuada, orci non vulputate lobortis, massa felis pharetra ex, convallis consectetur ex libero eget ante. +Nam vel turpis posuere, rhoncus ligula in, venenatis orci. Duis interdum venenatis ex a rutrum. +Duis ut libero eu lectus consequat consequat ut vel lorem. Vestibulum convallis lectus urna, +et mollis ligula rutrum quis. Fusce sed odio id arcu varius aliquet nec nec nibh. + +Gesendet von Outlook für Android + +Hi there! diff --git a/test/fixtures/email_ios_outlook_fr.txt b/test/fixtures/email_ios_outlook_fr.txt new file mode 100644 index 0000000..149eecc --- /dev/null +++ b/test/fixtures/email_ios_outlook_fr.txt @@ -0,0 +1,16 @@ +Fusce bibendum, quam hendrerit sagittis tempor, dui turpis tempus erat, pharetra sodales ante sem sit amet metus. +Nulla malesuada, orci non vulputate lobortis, massa felis pharetra ex, convallis consectetur ex libero eget ante. +Nam vel turpis posuere, rhoncus ligula in, venenatis orci. Duis interdum venenatis ex a rutrum. +Duis ut libero eu lectus consequat consequat ut vel lorem. Vestibulum convallis lectus urna, +et mollis ligula rutrum quis. Fusce sed odio id arcu varius aliquet nec nec nibh. + +Envoyé à partir de Outlook pour iOS +________________________________ +From: The Hiring Engine +Sent: Thursday, September 26, 2019 11:35:12 AM +To: Yolanda Washington +Subject: Chauffeur - Berlin, CT - Text from Garret Zeiter + +Etiam non sagittis orci, non rutrum urna. Suspendisse ut sapien id dolor posuere placerat et vitae felis. +Fusce mollis condimentum nulla. Donec luctus justo eu purus placerat, non suscipit ex facilisis. +Sed risus lorem, porta eget imperdiet in, euismod eu nisl. Integer vel metus felis. \ No newline at end of file diff --git a/test/fixtures/email_original_message.txt b/test/fixtures/email_original_message.txt new file mode 100644 index 0000000..c5d7745 --- /dev/null +++ b/test/fixtures/email_original_message.txt @@ -0,0 +1,12 @@ +Fusce bibendum, quam hendrerit sagittis tempor, dui turpis tempus erat, pharetra sodales ante sem sit amet metus. +Nulla malesuada, orci non vulputate lobortis, massa felis pharetra ex, convallis consectetur ex libero eget ante. +Nam vel turpis posuere, rhoncus ligula in, venenatis orci. Duis interdum venenatis ex a rutrum. +Duis ut libero eu lectus consequat consequat ut vel lorem. Vestibulum convallis lectus urna, +et mollis ligula rutrum quis. Fusce sed odio id arcu varius aliquet nec nec nibh. + +-----original message----- + +Hi John, + +I'd like to revisit the proposal I previously shared with you regarding a +potential collaboration. diff --git a/test/fixtures/email_original_message_2.txt b/test/fixtures/email_original_message_2.txt new file mode 100644 index 0000000..4c3fbc0 --- /dev/null +++ b/test/fixtures/email_original_message_2.txt @@ -0,0 +1,12 @@ +Fusce bibendum, quam hendrerit sagittis tempor, dui turpis tempus erat, pharetra sodales ante sem sit amet metus. +Nulla malesuada, orci non vulputate lobortis, massa felis pharetra ex, convallis consectetur ex libero eget ante. +Nam vel turpis posuere, rhoncus ligula in, venenatis orci. Duis interdum venenatis ex a rutrum. +Duis ut libero eu lectus consequat consequat ut vel lorem. Vestibulum convallis lectus urna, +et mollis ligula rutrum quis. Fusce sed odio id arcu varius aliquet nec nec nibh. + +----- Original Message ----- + +Hi John, + +I'd like to revisit the proposal I previously shared with you regarding a +potential collaboration. diff --git a/test/test.js b/test/test.js index bae9142..259d745 100644 --- a/test/test.js +++ b/test/test.js @@ -1,5 +1,5 @@ -var fs = require("fs"); -var _ = require("underscore"); +var fs = require("fs"); +var _ = require("underscore"); var EmailReplyParser = require("../lib/emailreplyparser"); const COMMON_FIRST_FRAGMENT = 'Fusce bibendum, quam hendrerit sagittis tempor, dui turpis tempus erat, pharetra sodales ante sem sit amet metus.\n\ @@ -14,30 +14,26 @@ function get_email(name) { return new EmailReplyParser().read(data); } -function get_raw_email(name) { - return fs.readFileSync(__dirname + "/fixtures/" + name + ".txt", "utf-8"); -} - exports.test_reads_simple_body = function(test){ - reply = get_email("email_1"); + reply = get_email("email_1"); - test.equal(2, reply.fragments.length); + test.equal(2, reply.fragments.length); - test.deepEqual([false, false], _.map(reply.fragments, function(f) { return f.isQuoted; })); - test.deepEqual([false, true], _.map(reply.fragments, function(f) { return f.isHidden; })); + test.deepEqual([false, false], _.map(reply.fragments, function(f) { return f.isQuoted(); })); + test.deepEqual([false, true], _.map(reply.fragments, function(f) { return f.isHidden(); })); - test.equal("Hi folks\n\nWhat is the best way to clear a Riak bucket of all key, values after\nrunning a test?\nI am currently using the Java HTTP API.\n\n-Abhishek Kona\n\n", reply.fragments[0].toString()); + test.equal("Hi folks\n\nWhat is the best way to clear a Riak bucket of all key, values after\nrunning a test?\nI am currently using the Java HTTP API.\n\n-Abhishek Kona\n\n", reply.fragments[0].toString()); - test.done(); + test.done(); }; exports.test_reads_top_post = function(test){ - let email = get_email("email_3"); + let email = get_email("email_3"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); - test.equal("Hi folks\n\nWhat is the best way to clear a Riak bucket of all key, values after\nrunning a test?\nI am currently using the Java HTTP API.\n\n-Abhishek Kona\n\n", reply.fragments[0].toString()); - + test.equal("Hi folks\n\nWhat is the best way to clear a Riak bucket of all key, values after\nrunning a test?\nI am currently using the Java HTTP API.\n\n-Abhishek Kona\n\n", reply.fragments[0].toString()); + test.done(); }; @@ -56,9 +52,9 @@ exports.test_reads_bottom_post = function(test){ }; exports.test_recognizes_data_string_above_quote = function(test){ - let email = get_email("email_4"); + let email = get_email("email_4"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(true, /^Awesome/.test(fragments[0])); test.equal(true,/^On/.test(fragments[1])); @@ -67,18 +63,18 @@ exports.test_recognizes_data_string_above_quote = function(test){ }; exports.test_complex_body_with_only_one_fragment = function(test){ - let email = get_email("email_5"); + let email = get_email("email_5"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(1, fragments.length); test.done(); }; exports.test_deals_with_multiline_reply_headers = function(test){ - let email = get_email("email_6"); + let email = get_email("email_6"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(true, /^I get/.test(fragments[0])); test.equal(true,/^On/.test(fragments[1])); @@ -90,7 +86,7 @@ exports.test_deals_with_multiline_reply_headers = function(test){ exports.test_email_with_italian = function(test) { let email = get_email("email_7"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -100,7 +96,7 @@ exports.test_email_with_italian = function(test) { exports.test_email_with_dutch = function(test) { let email = get_email("email_8"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -110,7 +106,7 @@ exports.test_email_with_dutch = function(test) { exports.test_email_with_signature = function(test) { let email = get_email("email_9"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -120,7 +116,7 @@ exports.test_email_with_signature = function(test) { exports.test_email_with_hotmail = function(test) { let email = get_email("email_10"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -130,7 +126,7 @@ exports.test_email_with_hotmail = function(test) { exports.test_email_whitespace_before_header = function(test) { let email = get_email("email_11"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -140,7 +136,7 @@ exports.test_email_whitespace_before_header = function(test) { exports.test_email_square_brackets = function(test) { let email = get_email("email_12"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -150,7 +146,7 @@ exports.test_email_square_brackets = function(test) { exports.test_email_da_into_italian = function(test) { let email = get_email("email_13"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -160,7 +156,7 @@ exports.test_email_da_into_italian = function(test) { exports.test_email_header_polish = function(test) { let email = get_email("email_14"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -170,7 +166,7 @@ exports.test_email_header_polish = function(test) { exports.test_email_sent_from_my = function(test) { let email = get_email("email_15"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -180,7 +176,7 @@ exports.test_email_sent_from_my = function(test) { exports.test_email_header_polish_with_dnia_and_napisala = function(test) { let email = get_email("email_16"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -190,7 +186,7 @@ exports.test_email_header_polish_with_dnia_and_napisala = function(test) { exports.test_email_header_polish_with_date_in_iso8601 = function(test) { let email = get_email("email_17"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -200,7 +196,7 @@ exports.test_email_header_polish_with_date_in_iso8601 = function(test) { exports.test_email_outlook_en = function(test) { let email = get_email("email_18"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -210,7 +206,7 @@ exports.test_email_outlook_en = function(test) { exports.test_email_22 = function(test) { let email = get_email("email_22"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -220,7 +216,7 @@ exports.test_email_22 = function(test) { exports.test_email_23 = function(test) { let email = get_email("email_23"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -230,7 +226,7 @@ exports.test_email_23 = function(test) { exports.test_email_25 = function(test) { let email = get_email("email_25"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -240,7 +236,7 @@ exports.test_email_25 = function(test) { exports.test_email_26 = function(test) { let email = get_email("email_26"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -250,7 +246,7 @@ exports.test_email_26 = function(test) { exports.test_email_portuguese = function(test) { let email = get_email("email_portuguese"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -260,7 +256,27 @@ exports.test_email_portuguese = function(test) { exports.test_email_german = function(test) { let email = get_email("email_german"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); + + test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); + + test.done(); +}; + +exports.test_email_german_2 = function(test) { + let email = get_email("email_german_2"); + + let fragments = email.getFragments(); + + test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); + + test.done(); +}; + +exports.test_email_german_3 = function(test) { + let email = get_email("email_german_3"); + + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -270,7 +286,7 @@ exports.test_email_german = function(test) { exports.test_email_gmail_no = function(test) { let email = get_email("email_norwegian_gmail"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -280,7 +296,7 @@ exports.test_email_gmail_no = function(test) { exports.test_email_finnish = function(test) { let email = get_email("email_finnish"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -290,14 +306,14 @@ exports.test_email_finnish = function(test) { exports.test_email_with_correct_signature = function(test) { let email = get_email("correct_sig"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(2, fragments.length); - test.equal(false, fragments[1].isQuoted); - test.equal(false, fragments[0].isSignature); - test.equal(true, fragments[1].isSignature); - test.equal(false, fragments[0].isHidden); - test.equal(true, fragments[1].isHidden); + test.equal(false, fragments[1].isQuoted()); + test.equal(false, fragments[0].isSignature()); + test.equal(true, fragments[1].isSignature()); + test.equal(false, fragments[0].isHidden()); + test.equal(true, fragments[1].isHidden()); test.equal(true, /^--\nrick/.test(fragments[1])); @@ -307,17 +323,17 @@ exports.test_email_with_correct_signature = function(test) { exports.test_reads_email_with_signature_with_no_empty_line_above = function(test) { let email = get_email("sig_no_empty_line"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(2, fragments.length); - test.equal(false, fragments[0].isQuoted); - test.equal(false, fragments[1].isQuoted); + test.equal(false, fragments[0].isQuoted()); + test.equal(false, fragments[1].isQuoted()); - test.equal(false, fragments[0].isSignature); - test.equal(true, fragments[1].isSignature); + test.equal(false, fragments[0].isSignature()); + test.equal(true, fragments[1].isSignature()); - test.equal(false, fragments[0].isHidden); - test.equal(true, fragments[1].isHidden); + test.equal(false, fragments[0].isHidden()); + test.equal(true, fragments[1].isHidden()); test.equal(true, /^--\nrick/.test(fragments[1])); @@ -327,7 +343,7 @@ exports.test_reads_email_with_signature_with_no_empty_line_above = function(test exports.test_one_is_not_one = function(test) { let email = get_email("email_one_is_not_on"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(true, /One outstanding question/.test(fragments[0])); test.equal(true, /^On Oct 1, 2012/.test(fragments[1])); @@ -338,9 +354,7 @@ exports.test_one_is_not_one = function(test) { exports.test_sent_from = function(test) { let email = get_email("email_sent_from"); - let fragments = email.getFragments(); - - test.equal(email.getVisibleText(), "Hi it can happen to any texts you type, as long as you type in between words or paragraphs.\n"); + test.equal(email.getVisibleText(), "Hi it can happen to any texts you type, as long as you type in between words or paragraphs.\n"); test.done(); }; @@ -348,9 +362,7 @@ exports.test_sent_from = function(test) { exports.test_email_emoji = function(test) { let email = get_email("email_emoji"); - let fragments = email.getFragments(); - - test.equal(email.getVisibleText(), "🎉\n\n—\nJohn Doe\nCEO at Pandaland\n\n@pandaland"); + test.equal(email.getVisibleText(), "🎉\n\n—\nJohn Doe\nCEO at Pandaland\n\n@pandaland"); test.done(); }; @@ -358,7 +370,9 @@ exports.test_email_emoji = function(test) { exports.test_email_not_a_signature = function(test) { let email = get_email("email_not_a_signature"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); + + test.equal(fragments[0].isSignature(), false); test.done(); }; @@ -366,7 +380,7 @@ exports.test_email_not_a_signature = function(test) { exports.test_email_24 = function(test) { let email = get_email("email_24"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -409,10 +423,21 @@ exports.text_email_reply_header = function(test) { test.done(); } +exports.text_email_ios_outlook_fr = function(test) { + let email = get_email("email_ios_outlook_fr"); + + let fragments = email.getFragments(); + test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); + test.equal(3, fragments.length); + + test.done(); +} + exports.text_email_ios_outlook = function(test) { let email = get_email("email_ios_outlook"); let fragments = email.getFragments(); + test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); test.equal(3, fragments.length); @@ -423,6 +448,7 @@ exports.text_email_msn = function(test) { let email = get_email("email_msn"); let fragments = email.getFragments(); + test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); test.equal(2, fragments.length); @@ -470,4 +496,48 @@ exports.test_email_en_multiline_2 = function(test) { test.equal(2, fragments.length); test.done(); -} \ No newline at end of file +} + +exports.test_email_original_message = function(test) { + let email = get_email("email_original_message"); + + let fragments = email.getFragments(); + + test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); + test.equal(2, fragments.length); + + test.done(); +} + +exports.test_email_original_message_2 = function(test) { + let email = get_email("email_original_message_2"); + + let fragments = email.getFragments(); + + test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); + test.equal(2, fragments.length); + + test.done(); +} + +exports.test_email_original_message_danish_dash = function(test) { + let email = get_email("email_danish_dash_separator"); + + let fragments = email.getFragments(); + + test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); + test.equal(2, fragments.length); + + test.done(); +} + +exports.test_email_original_message_french_dash = function(test) { + let email = get_email("email_french_dash_separator"); + + let fragments = email.getFragments(); + + test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); + test.equal(2, fragments.length); + + test.done(); +}