Some checks failed
✅ Check / 🔬 ESLint (push) Failing after 21s
✅ Check / 🏷️ Typecheck (push) Failing after 11s
✅ Check / 🔎 Test (push) Failing after 11s
✅ Check / e2e-test (push) Failing after 11s
✅ Check / 🔨 Build (push) Failing after 11s
🚀 Deploy / 🚀 Deploy (doc) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (demo) (push) Failing after 12s
🚀 Deploy / 🚀 Deploy (supabase) (push) Failing after 18s
84 lines
2.4 KiB
TypeScript
84 lines
2.4 KiB
TypeScript
/** Patterns that mark the beginning of a forwarded block in the email body. */
|
|
const FORWARD_SEPARATOR_PATTERNS = [
|
|
// Gmail
|
|
/^-{5,}\s*Forwarded message\s*-{5,}/im,
|
|
// Apple Mail
|
|
/^Begin forwarded message:/im,
|
|
// Outlook / Exchange
|
|
/^-{5,}\s*Original Message\s*-{5,}/im,
|
|
// French clients (Transféré / Message transféré)
|
|
/^-{5,}\s*Message transf[eé]r[eé]\s*-{5,}/im,
|
|
/^-{5,}\s*Transf[eé]r[eé]\s*-{5,}/im,
|
|
// German (Weitergeleitet)
|
|
/^-{5,}\s*Weitergeleitete Nachricht\s*-{5,}/im,
|
|
];
|
|
|
|
export const stripForwardingHeaderBlock = (text: string): string => {
|
|
const lines = text.split("\n");
|
|
let bodyStartIndex = 0;
|
|
|
|
// First check that the first line matches a known forwarding separator pattern
|
|
const hasForwardedSeparator = FORWARD_SEPARATOR_PATTERNS.some((pattern) => {
|
|
const match = lines[0].match(pattern);
|
|
return !!match;
|
|
});
|
|
if (!hasForwardedSeparator) {
|
|
// No known forwarding pattern detected, return the original text
|
|
return text.trim();
|
|
}
|
|
|
|
// Walk through the header-like lines at the top of the block
|
|
let i = 0;
|
|
while (i < lines.length) {
|
|
const line = lines[i];
|
|
// Blank line signals end of the forwarded header block
|
|
if (line.trim() === "") {
|
|
bodyStartIndex = i + 1;
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
// No blank line found after the header → no body to extract
|
|
if (bodyStartIndex === 0) {
|
|
return "";
|
|
}
|
|
|
|
return lines.slice(bodyStartIndex).join("\n").trim();
|
|
};
|
|
|
|
export const stripSubjectForwardingPrefix = (subject: string): string => {
|
|
const result = subject
|
|
.replace(/^(Fwd|FW|FWD|Tr|SV|VS|WG|WG:)\s*[:-]\s*/i, "")
|
|
.trim();
|
|
|
|
if (result.length === 0) {
|
|
console.warn(
|
|
`Stripping forwarding prefix from subject "${subject}" resulted in empty string, returning original subject`,
|
|
);
|
|
return subject;
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
export const stripMailSignature = (text: string): string => {
|
|
const signatureSeparatorIndex = text.indexOf("\n-- \n");
|
|
if (signatureSeparatorIndex !== -1) {
|
|
return text.substring(0, signatureSeparatorIndex).trim();
|
|
}
|
|
return text.trim();
|
|
};
|
|
|
|
export const getForwardedMailContent = (body: string): string => {
|
|
const strippedBody = stripForwardingHeaderBlock(stripMailSignature(body));
|
|
|
|
if (strippedBody.length === 0) {
|
|
console.warn(
|
|
"Stripping mail signature and forwarded header block resulted in empty note content, returning original body",
|
|
);
|
|
return body.trim();
|
|
}
|
|
return strippedBody;
|
|
};
|