From 44dd8dda55bb369ee03b73b48c9a08c373a73d4e Mon Sep 17 00:00:00 2001 From: ReptoxX <13363890+ReptoxX@users.noreply.github.com> Date: Tue, 11 Apr 2023 16:44:32 +0200 Subject: [PATCH 01/19] Added german Version of From: NAME --- lib/regex.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/regex.js b/lib/regex.js index 1a7f6c9..7875fd6 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 <) @@ -62,4 +63,4 @@ class RegexList { } } -module.exports = new RegexList(); \ No newline at end of file +module.exports = new RegexList(); From 613bbe91667f78af5e92693ec169a5283dd09db4 Mon Sep 17 00:00:00 2001 From: ReptoxX <13363890+ReptoxX@users.noreply.github.com> Date: Tue, 11 Apr 2023 16:59:09 +0200 Subject: [PATCH 02/19] Create email_german_2.txt --- test/fixtures/email_german_2.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 test/fixtures/email_german_2.txt 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! From 113fa26e1cbdd8e7fb34baaaced3bcff9eebf734 Mon Sep 17 00:00:00 2001 From: ReptoxX <13363890+ReptoxX@users.noreply.github.com> Date: Tue, 11 Apr 2023 17:00:14 +0200 Subject: [PATCH 03/19] Update test.js --- test/test.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/test.js b/test/test.js index bae9142..6cb48b4 100644 --- a/test/test.js +++ b/test/test.js @@ -267,6 +267,16 @@ exports.test_email_german = function(test) { 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_gmail_no = function(test) { let email = get_email("email_norwegian_gmail"); @@ -470,4 +480,4 @@ exports.test_email_en_multiline_2 = function(test) { test.equal(2, fragments.length); test.done(); -} \ No newline at end of file +} From ef3c62659b3376bd4ffb9784fa7a838745c90921 Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Mon, 22 Jan 2024 14:24:23 +0100 Subject: [PATCH 04/19] v1.6.0 --- lib/regex.js | 1 - package.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/regex.js b/lib/regex.js index 1a7f6c9..b2c2d2e 100644 --- a/lib/regex.js +++ b/lib/regex.js @@ -42,7 +42,6 @@ class RegexList { /^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 /^Von (?:\s*.+) gesendet$/, // de diff --git a/package.json b/package.json index c8a3515..e567f9f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "email-reply-parser", - "version": "1.5.4", + "version": "1.6.0", "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", From 7187418d1a557f273b8d6b0c50ad7b77671da763 Mon Sep 17 00:00:00 2001 From: jAg-upfort <129441823+jAg-upfort@users.noreply.github.com> Date: Wed, 10 Apr 2024 10:05:38 -0700 Subject: [PATCH 05/19] fix Fragment.isEmpty() call replace on the result of calling `this.getContent()` instead of the function itself --- lib/fragment.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/fragment.js b/lib/fragment.js index 6801a83..23f7d0d 100644 --- a/lib/fragment.js +++ b/lib/fragment.js @@ -23,7 +23,7 @@ class Fragment { } 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; From 282e2a1973718ac2997eb6472469ff3f0501d56a Mon Sep 17 00:00:00 2001 From: jAg-upfort <129441823+jAg-upfort@users.noreply.github.com> Date: Wed, 10 Apr 2024 10:08:28 -0700 Subject: [PATCH 06/19] don't override the functions in the constructor --- lib/fragment.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/fragment.js b/lib/fragment.js index 23f7d0d..7ef9e2e 100644 --- a/lib/fragment.js +++ b/lib/fragment.js @@ -1,25 +1,25 @@ 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() { From ef6fb124db9c6480d0966d317c7066f1104ad171 Mon Sep 17 00:00:00 2001 From: josh silver Date: Wed, 10 Apr 2024 11:14:27 -0700 Subject: [PATCH 07/19] fix tests --- lib/email.js | 4 ++-- test/test.js | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) 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/test/test.js b/test/test.js index bae9142..edbeff7 100644 --- a/test/test.js +++ b/test/test.js @@ -23,8 +23,8 @@ exports.test_reads_simple_body = function(test){ 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()); @@ -293,11 +293,11 @@ exports.test_email_with_correct_signature = function(test) { 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])); @@ -310,14 +310,14 @@ exports.test_reads_email_with_signature_with_no_empty_line_above = function(test 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])); From 50a8e7057d276fb204c486348ac57d8660b0d9c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Barthelet?= Date: Sun, 19 May 2024 13:47:28 +0200 Subject: [PATCH 08/19] Handle new case for emails sent from outlook on iOS in french --- lib/regex.js | 1 + test/fixtures/email_ios_outlook_fr.txt | 16 ++++++++++++++++ test/test.js | 10 ++++++++++ 3 files changed, 27 insertions(+) create mode 100644 test/fixtures/email_ios_outlook_fr.txt diff --git a/lib/regex.js b/lib/regex.js index b2c2d2e..3449c4f 100644 --- a/lib/regex.js +++ b/lib/regex.js @@ -46,6 +46,7 @@ class RegexList { /^\w{0,20}\s?(\sand\s)?Regards,?!?!?$/mi, //en /^Von (?:\s*.+) gesendet$/, // de /^Envoyé depuis (?:\s*.+)$/, //fr + /^Envoyé à partir de (?:\s*.+)$/, //fr /^Télécharger Outlook pour (?:\s*.+).*/m, // fr /^Bien . vous,?!?$/mi, // fr /^\w{0,20}\s?cordialement,?!?$/mi, // fr 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/test.js b/test/test.js index bae9142..378c643 100644 --- a/test/test.js +++ b/test/test.js @@ -409,6 +409,16 @@ 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"); From 0b5fd0fb2dbb5f5caf918b2c003bb693ad304369 Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Mon, 15 Jul 2024 09:05:04 +0200 Subject: [PATCH 09/19] Fix original message test case --- lib/regex.js | 4 ++-- package-lock.json | 4 ++-- test/fixtures/email_original_message.txt | 12 ++++++++++++ test/fixtures/email_original_message_2.txt | 12 ++++++++++++ test/test.js | 22 ++++++++++++++++++++++ 5 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/email_original_message.txt create mode 100644 test/fixtures/email_original_message_2.txt diff --git a/lib/regex.js b/lib/regex.js index b2c2d2e..c593bc9 100644 --- a/lib/regex.js +++ b/lib/regex.js @@ -27,7 +27,8 @@ 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,10} ?(O|o)riginal (M|m)essage ?-{1,10}$/i, ]); this.signatureRegex = this.buildRe2([ @@ -38,7 +39,6 @@ class RegexList { /^\+{2,4}$/, // Separator /^\={2,4}$/, // Separator /^________________________________$/, // Separator - /^-{1,10}Original message-{1,10}$/, /^Sent from (?:\s*.+)$/, // en /^Get Outlook for (?:\s*.+).*/m, // en /^Cheers,?!?$/mi, // en diff --git a/package-lock.json b/package-lock.json index 6db8bc6..2984cf8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "email-reply-parser", - "version": "1.5.3", + "version": "1.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "email-reply-parser", - "version": "1.5.3", + "version": "1.6.0", "license": "MIT", "dependencies": { "re2": "1.20.7" 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..8bfb6ff 100644 --- a/test/test.js +++ b/test/test.js @@ -469,5 +469,27 @@ exports.test_email_en_multiline_2 = function(test) { test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); test.equal(2, fragments.length); + test.done(); +} + +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(); } \ No newline at end of file From 774b813266483450ac58302fb56ce2f7723788d9 Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Mon, 15 Jul 2024 09:05:49 +0200 Subject: [PATCH 10/19] v1.6.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2984cf8..6d433e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "email-reply-parser", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "email-reply-parser", - "version": "1.6.0", + "version": "1.6.1", "license": "MIT", "dependencies": { "re2": "1.20.7" diff --git a/package.json b/package.json index e567f9f..70ebdc2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "email-reply-parser", - "version": "1.6.0", + "version": "1.6.1", "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", From 8ea82515f48ecf90612aa4b7514692718c9636d6 Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Mon, 15 Jul 2024 09:10:44 +0200 Subject: [PATCH 11/19] v1.7.0 --- lib/emailreplyparser.js | 1 - package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) 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/package-lock.json b/package-lock.json index 6d433e0..738d3c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "email-reply-parser", - "version": "1.6.1", + "version": "1.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "email-reply-parser", - "version": "1.6.1", + "version": "1.7.0", "license": "MIT", "dependencies": { "re2": "1.20.7" diff --git a/package.json b/package.json index 70ebdc2..1c3cb66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "email-reply-parser", - "version": "1.6.1", + "version": "1.7.0", "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", From d35cb147ea2490a23bbda6844e1ccb9f53c54443 Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Mon, 15 Jul 2024 09:11:44 +0200 Subject: [PATCH 12/19] v1.7.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 738d3c2..cbac1ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "email-reply-parser", - "version": "1.7.0", + "version": "1.7.1", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package.json b/package.json index 1c3cb66..2d0102f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "email-reply-parser", - "version": "1.7.0", + "version": "1.7.1", "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", From 7929c997b06dcff806c2cd091f6b1fabf80e5098 Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Mon, 15 Jul 2024 09:22:17 +0200 Subject: [PATCH 13/19] Fix test cases --- test/test.js | 101 ++++++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 53 deletions(-) diff --git a/test/test.js b/test/test.js index 6c65661..284f97e 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.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,7 @@ 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()); @@ -270,7 +266,7 @@ exports.test_email_german = function(test) { exports.test_email_german_2 = function(test) { let email = get_email("email_german_2"); - let fragments = email.getFragments(); + let fragments = email.getFragments(); test.equal(COMMON_FIRST_FRAGMENT, fragments[0].toString().trim()); @@ -280,7 +276,7 @@ exports.test_email_german_2 = 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()); @@ -290,7 +286,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()); @@ -300,7 +296,7 @@ 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()); @@ -317,7 +313,7 @@ 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()); @@ -337,7 +333,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])); @@ -348,9 +344,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(); }; @@ -358,9 +352,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(); }; @@ -368,7 +360,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(); }; @@ -376,7 +370,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()); @@ -423,6 +417,7 @@ 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); @@ -433,6 +428,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); @@ -503,4 +499,3 @@ exports.test_email_original_message_2 = function(test) { test.done(); } - From 9ba93ac9ea9183984a9d1d7d139e36446e33f6ea Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Mon, 15 Jul 2024 09:48:02 +0200 Subject: [PATCH 14/19] New test cases --- lib/regex.js | 19 +++++++++++++++- test/fixtures/email_danish_dash_separator.txt | 11 ++++++++++ test/fixtures/email_french_dash_separator.txt | 10 +++++++++ test/test.js | 22 +++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/email_danish_dash_separator.txt create mode 100644 test/fixtures/email_french_dash_separator.txt diff --git a/lib/regex.js b/lib/regex.js index dbcc34a..48c6e02 100644 --- a/lib/regex.js +++ b/lib/regex.js @@ -30,6 +30,8 @@ class RegexList { /^[0-9]{2}:[0-9]{2}(.*)[0-9]{4}(.*)\"( *)<(.*)>( *):$/, // HH:II, DATE, NAME : /^(.*)[0-9]{4}(.*)from(.*)<(.*)>:$/, /^-{1,10} ?(O|o)riginal (M|m)essage ?-{1,10}$/i, + /^-{1,10} ?(O|o)prindelig (B|b)esked ?-{1,10}$/i, + /^-{1,10} ?(M|m)essage d\'origine ?-{1,10}$/i ]); this.signatureRegex = this.buildRe2([ @@ -40,19 +42,34 @@ class RegexList { /^\+{2,4}$/, // Separator /^\={2,4}$/, // Separator /^________________________________$/, // Separator + + // EN /^Sent from (?:\s*.+)$/, // en /^Get Outlook for (?:\s*.+).*/m, // en /^Cheers,?!?$/mi, // en /^Best wishes,?!?$/mi, // en /^\w{0,20}\s?(\sand\s)?Regards,?!?!?$/mi, //en + + // DE /^Von (?:\s*.+) gesendet$/, // 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 ]); } 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/test.js b/test/test.js index c1d419b..51d604e 100644 --- a/test/test.js +++ b/test/test.js @@ -509,3 +509,25 @@ exports.test_email_original_message_2 = function(test) { 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(); +} From 3aebf046452432d341d36f11eb48ac25275d7f30 Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Mon, 15 Jul 2024 09:48:14 +0200 Subject: [PATCH 15/19] v1.8.0 --- package-lock.json | 247 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 126 insertions(+), 125 deletions(-) diff --git a/package-lock.json b/package-lock.json index cbac1ee..d4eef39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,10 +6,10 @@ "packages": { "": { "name": "email-reply-parser", - "version": "1.7.0", + "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 2d0102f..82293d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "email-reply-parser", - "version": "1.7.1", + "version": "1.8.0", "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", From adca166b77bc4ecf20584449036c9f9b0a129375 Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Thu, 17 Oct 2024 08:07:01 +0200 Subject: [PATCH 16/19] Fix quotes with 11 dashes --- lib/regex.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/regex.js b/lib/regex.js index 48c6e02..f66234e 100644 --- a/lib/regex.js +++ b/lib/regex.js @@ -29,9 +29,9 @@ class RegexList { /^([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(.*)<(.*)>:$/, - /^-{1,10} ?(O|o)riginal (M|m)essage ?-{1,10}$/i, - /^-{1,10} ?(O|o)prindelig (B|b)esked ?-{1,10}$/i, - /^-{1,10} ?(M|m)essage d\'origine ?-{1,10}$/i + /^-{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([ From 5c023871c85e101c479bb620dbe18b86126d933d Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Thu, 17 Oct 2024 08:08:11 +0200 Subject: [PATCH 17/19] v1.8.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 82293d6..4857a8c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "email-reply-parser", - "version": "1.8.0", + "version": "1.8.1", "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", From eb3f7f2b3c64bcf3769ff5e15e9a4fddb41725f7 Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Sun, 17 Nov 2024 16:54:48 +0100 Subject: [PATCH 18/19] new test case --- lib/regex.js | 1 + test/fixtures/email_german_3.txt | 9 +++++++++ test/test.js | 10 ++++++++++ 3 files changed, 20 insertions(+) create mode 100644 test/fixtures/email_german_3.txt diff --git a/lib/regex.js b/lib/regex.js index f66234e..192f4e2 100644 --- a/lib/regex.js +++ b/lib/regex.js @@ -52,6 +52,7 @@ class RegexList { // DE /^Von (?:\s*.+) gesendet$/, // de + /^Gesendet von (?:\s*.+) für (?:\s*.+)$/, // de // DA /^Sendt fra (?:\s*.+)$/, // da 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/test.js b/test/test.js index 51d604e..259d745 100644 --- a/test/test.js +++ b/test/test.js @@ -273,6 +273,16 @@ exports.test_email_german_2 = function(test) { 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()); + + test.done(); +}; + exports.test_email_gmail_no = function(test) { let email = get_email("email_norwegian_gmail"); From 71d8cb59b7233d3acf406b31b909948ae1fbcee6 Mon Sep 17 00:00:00 2001 From: Baptiste Jamin Date: Sun, 17 Nov 2024 16:56:12 +0100 Subject: [PATCH 19/19] v1.8.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4857a8c..8ae8eb2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "email-reply-parser", - "version": "1.8.1", + "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",