From 9b9be8aadef57736a70f766965cfcbad1504e5b4 Mon Sep 17 00:00:00 2001 From: igor <igor.markin@vereign.com> Date: Tue, 15 Dec 2020 13:25:34 +0300 Subject: [PATCH] Strip qr code from gmail plain and html --- .../gmail-gmail/one/21/r_htmlContent.html | 32 +++++++++++++-- .../gmail-gmail/one/21/s_htmlContent.html | 30 +++++++++++++- .../gmail-gmail/one/22/r_htmlContent.html | 35 +++++++++++++++- .../gmail-gmail/one/22/s_htmlContent.html | 33 ++++++++++++++- __tests__/html-gmail-gmail.test.ts | 2 +- ...l.test.ts => htmltext-gmail-gmail.test.ts} | 0 ...test.ts => htmltext-gmail-outlook.test.ts} | 0 ...st.ts => htmltext-outlook-outlook.test.ts} | 0 __tests__/utils.ts | 30 +++++++++++--- src/HTMLNormalizer/strategies/gmail.ts | 40 ++++++++++++++++++- src/HTMLNormalizer/strategies/outlook.ts | 11 ++++- src/PlainNormalizer/PlainNormalizer.ts | 4 +- 12 files changed, 199 insertions(+), 18 deletions(-) rename __tests__/{pseudoplain-gmail-gmail.test.ts => htmltext-gmail-gmail.test.ts} (100%) rename __tests__/{pseudoplain-gmail-outlook.test.ts => htmltext-gmail-outlook.test.ts} (100%) rename __tests__/{pseudoplain-outlook-outlook.test.ts => htmltext-outlook-outlook.test.ts} (100%) diff --git a/__tests__/files/gmail-gmail/one/21/r_htmlContent.html b/__tests__/files/gmail-gmail/one/21/r_htmlContent.html index a2ee3ed..c3701da 100644 --- a/__tests__/files/gmail-gmail/one/21/r_htmlContent.html +++ b/__tests__/files/gmail-gmail/one/21/r_htmlContent.html @@ -1,3 +1,29 @@ -<div dir="ltr"><br>Forwarding an email with history.<br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">---------- Forwarded message ---------<br>From: <strong class="gmail_sendername" dir="auto">Rosen Georgiev</strong> <span dir="auto"><<a href="mailto:rosenkirchev@gmail.com">rosenkirchev@gmail.com</a>></span><br>Date: Fri, Dec 11, 2020 at 11:48 AM<br>Subject: test 123<br>To: <<a href="mailto:rosenvereign@gmail.com">rosenvereign@gmail.com</a>><br></div><br><br><div dir="ltr"><br>test 123<br><a href="https://gmail.test.vereign.com/?q=CiCmv1km3XHq88gSQqKAJks6cjqJT9REU6092ANxbXdWFRIg41MUcRa9szrNE_Uzk2mg0oaERcNsEyt2zbELns2nyuQ=&timestamp=1607680132583" id="m_-6319369610188194273vereignWrapperLink" target="_blank"><img src="cid:ii_kik38q6m0" alt="qrcode.png" width="153" height="230"></a></div> -</div><br><a href="https://gmail.test.vereign.com/?q=CiD_af1bRp3Lr0VN7XCjr21NhG_sBlsJvujutgLw-NVlGRIgV_8SkcSyAOg15y3-_XauPmzF-mbK48azNaiRmfnpvtk=&timestamp=1607680317560" id="vereignWrapperLink"><img src="cid:ii_kik3coos1" alt="qrcode.png" width="153" height="230"></a></div> - +<div dir="ltr"> + <br />Forwarding an email with history.<br /><br /> + <div class="gmail_quote"> + <div dir="ltr" class="gmail_attr"> + ---------- Forwarded message ---------<br />From: + <strong class="gmail_sendername" dir="auto">Rosen Georgiev</strong> + <span dir="auto" + ><<a href="mailto:rosenkirchev@gmail.com">rosenkirchev@gmail.com</a + >></span + ><br />Date: Fri, Dec 11, 2020 at 11:48 AM<br />Subject: test 123<br />To: + <<a href="mailto:rosenvereign@gmail.com">rosenvereign@gmail.com</a + >><br /> + </div> + <br /><br /> + <div dir="ltr"> + <br />test 123<br /><a + href="https://gmail.test.vereign.com/?q=CiCmv1km3XHq88gSQqKAJks6cjqJT9REU6092ANxbXdWFRIg41MUcRa9szrNE_Uzk2mg0oaERcNsEyt2zbELns2nyuQ=&timestamp=1607680132583" + id="m_-6319369610188194273vereignWrapperLink" + target="_blank" + ><img src="cid:ii_kik38q6m0" alt="qrcode.png" width="153" height="230" + /></a> + </div> + </div> + <br /><a + href="https://gmail.test.vereign.com/?q=CiD_af1bRp3Lr0VN7XCjr21NhG_sBlsJvujutgLw-NVlGRIgV_8SkcSyAOg15y3-_XauPmzF-mbK48azNaiRmfnpvtk=&timestamp=1607680317560" + id="vereignWrapperLink" + ><img src="cid:ii_kik3coos1" alt="qrcode.png" width="153" height="230" + /></a> +</div> diff --git a/__tests__/files/gmail-gmail/one/21/s_htmlContent.html b/__tests__/files/gmail-gmail/one/21/s_htmlContent.html index 7bf32b2..72f659f 100644 --- a/__tests__/files/gmail-gmail/one/21/s_htmlContent.html +++ b/__tests__/files/gmail-gmail/one/21/s_htmlContent.html @@ -1 +1,29 @@ -<div dir="ltr">Forwarding an email with history.<br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">---------- Forwarded message ---------<br>From: <strong class="gmail_sendername" dir="auto">Rosen Georgiev</strong><span dir="auto"><<a href="mailto:rosenkirchev@gmail.com">rosenkirchev@gmail.com</a>></span><br>Date: Fri, Dec 11, 2020 at 11:48 AM<br>Subject: test 123<br>To: <<a href="mailto:rosenvereign@gmail.com">rosenvereign@gmail.com</a>><br></div><br><br><div dir="ltr"><br>test 123<br><a href="https://gmail.test.vereign.com/?q=CiCmv1km3XHq88gSQqKAJks6cjqJT9REU6092ANxbXdWFRIg41MUcRa9szrNE_Uzk2mg0oaERcNsEyt2zbELns2nyuQ=&timestamp=1607680132583" id="m_-6319369610188194273vereignWrapperLink" target="_blank"><img src="cid:ii_kik38q6m0" alt="qrcode.png" width="153" height="230" data-surl="cid:ii_kik38q6m0"></a></div></div></div> +<div dir="ltr"> + Forwarding an email with history.<br /><br /> + <div class="gmail_quote"> + <div dir="ltr" class="gmail_attr"> + ---------- Forwarded message ---------<br />From: + <strong class="gmail_sendername" dir="auto">Rosen Georgiev</strong + ><span dir="auto" + ><<a href="mailto:rosenkirchev@gmail.com">rosenkirchev@gmail.com</a + >></span + ><br />Date: Fri, Dec 11, 2020 at 11:48 AM<br />Subject: test 123<br />To: + <<a href="mailto:rosenvereign@gmail.com">rosenvereign@gmail.com</a + >><br /> + </div> + <br /><br /> + <div dir="ltr"> + <br />test 123<br /><a + href="https://gmail.test.vereign.com/?q=CiCmv1km3XHq88gSQqKAJks6cjqJT9REU6092ANxbXdWFRIg41MUcRa9szrNE_Uzk2mg0oaERcNsEyt2zbELns2nyuQ=&timestamp=1607680132583" + id="m_-6319369610188194273vereignWrapperLink" + target="_blank" + ><img + src="cid:ii_kik38q6m0" + alt="qrcode.png" + width="153" + height="230" + data-surl="cid:ii_kik38q6m0" + /></a> + </div> + </div> +</div> diff --git a/__tests__/files/gmail-gmail/one/22/r_htmlContent.html b/__tests__/files/gmail-gmail/one/22/r_htmlContent.html index a40d8e3..ac21599 100644 --- a/__tests__/files/gmail-gmail/one/22/r_htmlContent.html +++ b/__tests__/files/gmail-gmail/one/22/r_htmlContent.html @@ -1,2 +1,33 @@ -<div dir="ltr"><br>reply second email to all<br><a href="https://gmail.test.vereign.com/?q=CiA9KpFulwecbra-Vzakr6t3kGPTJ2uK4JQ91KlzUGJRRhIgK4-brXpuJcszaNGljeunMlWUv5IYmujPBaBRyB3zWL8=&timestamp=1607695422416" id="vereignWrapperLink"><img src="cid:ii_kikccfmt1" alt="qrcode.png" width="153" height="230"></a></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Dec 11, 2020 at 3:55 PM Rosen Georgiev <<a href="mailto:rosenkirchev@gmail.com">rosenkirchev@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br>multiple recipients<br><a href="https://gmail.test.vereign.com/?q=CiDvUAtuwEqSqs8bzF92OF4rTkJG3jt19AV3vGsh12aGfBIg_N4I9OD2jbSdQJGC8ATfPfemwfxcQyE66gUtrCECppk=&timestamp=1607694903364" id="gmail-m_5893169313940791883vereignWrapperLink" target="_blank"><img src="cid:ii_kikc1b5f0" alt="qrcode.png" width="153" height="230"></a></div> -</blockquote></div> \ No newline at end of file +<div dir="ltr"> + <br />reply second email to all<br /><a + href="https://gmail.test.vereign.com/?q=CiA9KpFulwecbra-Vzakr6t3kGPTJ2uK4JQ91KlzUGJRRhIgK4-brXpuJcszaNGljeunMlWUv5IYmujPBaBRyB3zWL8=&timestamp=1607695422416" + id="vereignWrapperLink" + ><img src="cid:ii_kikccfmt1" alt="qrcode.png" width="153" height="230" + /></a> +</div> +<br /> +<div class="gmail_quote"> + <div dir="ltr" class="gmail_attr"> + On Fri, Dec 11, 2020 at 3:55 PM Rosen Georgiev <<a + href="mailto:rosenkirchev@gmail.com" + >rosenkirchev@gmail.com</a + >> wrote:<br /> + </div> + <blockquote + class="gmail_quote" + style=" + margin: 0px 0px 0px 0.8ex; + border-left: 1px solid rgb(204, 204, 204); + padding-left: 1ex; + " + > + <div dir="ltr"> + <br />multiple recipients<br /><a + href="https://gmail.test.vereign.com/?q=CiDvUAtuwEqSqs8bzF92OF4rTkJG3jt19AV3vGsh12aGfBIg_N4I9OD2jbSdQJGC8ATfPfemwfxcQyE66gUtrCECppk=&timestamp=1607694903364" + id="gmail-m_5893169313940791883vereignWrapperLink" + target="_blank" + ><img src="cid:ii_kikc1b5f0" alt="qrcode.png" width="153" height="230" + /></a> + </div> + </blockquote> +</div> diff --git a/__tests__/files/gmail-gmail/one/22/s_htmlContent.html b/__tests__/files/gmail-gmail/one/22/s_htmlContent.html index 3482ae8..b5d275e 100644 --- a/__tests__/files/gmail-gmail/one/22/s_htmlContent.html +++ b/__tests__/files/gmail-gmail/one/22/s_htmlContent.html @@ -1 +1,32 @@ -<div dir="ltr">reply second email to all</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Dec 11, 2020 at 3:55 PM Rosen Georgiev <<a href="mailto:rosenkirchev@gmail.com">rosenkirchev@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br>multiple recipients<br><a href="https://gmail.test.vereign.com/?q=CiDvUAtuwEqSqs8bzF92OF4rTkJG3jt19AV3vGsh12aGfBIg_N4I9OD2jbSdQJGC8ATfPfemwfxcQyE66gUtrCECppk=&timestamp=1607694903364" id="gmail-m_5893169313940791883vereignWrapperLink" target="_blank"><img src="cid:ii_kikc1b5f0" alt="qrcode.png" width="153" height="230" data-surl="cid:ii_kikc1b5f0"></a></div></blockquote></div> \ No newline at end of file +<div dir="ltr">reply second email to all</div> + +<div class="gmail_quote"> + <div dir="ltr" class="gmail_attr"> + On Fri, Dec 11, 2020 at 3:55 PM Rosen Georgiev <<a + href="mailto:rosenkirchev@gmail.com" + >rosenkirchev@gmail.com</a + >> wrote:<br /> + </div> + <blockquote + class="gmail_quote" + style=" + margin: 0px 0px 0px 0.8ex; + border-left: 1px solid rgb(204, 204, 204); + padding-left: 1ex; + " + > + <div dir="ltr"> + <br />multiple recipients<br /><a + href="https://gmail.test.vereign.com/?q=CiDvUAtuwEqSqs8bzF92OF4rTkJG3jt19AV3vGsh12aGfBIg_N4I9OD2jbSdQJGC8ATfPfemwfxcQyE66gUtrCECppk=&timestamp=1607694903364" + id="gmail-m_5893169313940791883vereignWrapperLink" + target="_blank" + ><img + src="cid:ii_kikc1b5f0" + alt="qrcode.png" + width="153" + height="230" + data-surl="cid:ii_kikc1b5f0" + /></a> + </div> + </blockquote> +</div> diff --git a/__tests__/html-gmail-gmail.test.ts b/__tests__/html-gmail-gmail.test.ts index c0901b7..6b2a782 100644 --- a/__tests__/html-gmail-gmail.test.ts +++ b/__tests__/html-gmail-gmail.test.ts @@ -13,5 +13,5 @@ describe("[HTML] GMail-GMail", () => { EMAIL_VENDORS.GMAIL ); - describe("One", describeFunction("one", [""])); + describe("One", describeFunction("one", ["sssas"])); }); diff --git a/__tests__/pseudoplain-gmail-gmail.test.ts b/__tests__/htmltext-gmail-gmail.test.ts similarity index 100% rename from __tests__/pseudoplain-gmail-gmail.test.ts rename to __tests__/htmltext-gmail-gmail.test.ts diff --git a/__tests__/pseudoplain-gmail-outlook.test.ts b/__tests__/htmltext-gmail-outlook.test.ts similarity index 100% rename from __tests__/pseudoplain-gmail-outlook.test.ts rename to __tests__/htmltext-gmail-outlook.test.ts diff --git a/__tests__/pseudoplain-outlook-outlook.test.ts b/__tests__/htmltext-outlook-outlook.test.ts similarity index 100% rename from __tests__/pseudoplain-outlook-outlook.test.ts rename to __tests__/htmltext-outlook-outlook.test.ts diff --git a/__tests__/utils.ts b/__tests__/utils.ts index ef875f2..9d0a0aa 100644 --- a/__tests__/utils.ts +++ b/__tests__/utils.ts @@ -8,7 +8,23 @@ const RECEIVED_PLAIN_NAME = "r_plainContent.data"; import { PlainNormalizer, HTMLNormalizer } from "../src"; import { expect, test } from "@jest/globals"; import { DOM } from "@vereign/dom"; -//import { diffStringsUnified } from "jest-diff"; +import { diffStringsUnified } from "jest-diff"; + +expect.extend({ + toContainWithDiff(target, source) { + let pass = true; + try { + expect(target).toContain(source); + } catch (e) { + pass = false; + } + + return { + pass, + message: pass ? () => "Pass" : () => diffStringsUnified(source, target), + }; + }, +}); export const getNormalizedPlain = ( testCasePath: string @@ -106,7 +122,10 @@ export const createDescribeHtmlTestCases = ( // expect(receivedHtml.length).toBeGreaterThan(0); // expect(sentHtml.length).toBeGreaterThan(0); - expect(receivedHtml).toContain(sentHtml); + + // eslint-disable-next-line + // @ts-ignore + expect(receivedHtml).toContainWithDiff(sentHtml); }); }; @@ -136,9 +155,10 @@ export const createDescribePlainTestCases = (testsPath: string) => ( // expect(sentPlain.length).toBeGreaterThan(0); // expect(receivedPlain.length).toBeGreaterThan(0); - expect(receivedPlain).toContain(sentPlain); - // const diff = diffStringsUnified(sentPlain, receivedPlain); - // console.log(diff); + + // eslint-disable-next-line + // @ts-ignore + expect(receivedPlain).toContainWithDiff(sentPlain); }); }; diff --git a/src/HTMLNormalizer/strategies/gmail.ts b/src/HTMLNormalizer/strategies/gmail.ts index fa82935..55f4f9f 100644 --- a/src/HTMLNormalizer/strategies/gmail.ts +++ b/src/HTMLNormalizer/strategies/gmail.ts @@ -3,16 +3,54 @@ import { cloneAnchorFromPane, pruneElement, } from "./common"; +import { ELEMENT_NODE } from "../../constants"; export const pruneGmailElement = (element: HTMLElement): boolean => { return pruneElement(element); }; +const qrCodeContainerIds = { vereignWrapperLink: 1 }; +const removeQrCodeNodes = (document: HTMLDocument) => { + const remove = (node: Element) => { + let toRemove = []; + + let child = node.firstChild; + + while (child) { + if (child.nodeType == ELEMENT_NODE) { + toRemove = [...toRemove, ...remove(child as Element)]; + + const childElement = child as Element; + const id = childElement.getAttribute("id"); + if ( + id && + Object.keys(qrCodeContainerIds).find((possibleId) => + id.includes(possibleId) + ) + ) { + toRemove.push(childElement); + } + } + + child = child.nextSibling; + } + + return toRemove; + }; + + const elementsToRemove = remove(document.body); + elementsToRemove.forEach((element) => + element.parentNode.removeChild(element) + ); +}; + export const amendGmailNodes = (document: HTMLDocument): void => { // unwindTags(document, "span"); + removeQrCodeNodes(document); + /** - * Look for attachments panes and remove everything but liks + * Look for attachments panes and remove everything but links */ const attachmentsPanes = Array.from( diff --git a/src/HTMLNormalizer/strategies/outlook.ts b/src/HTMLNormalizer/strategies/outlook.ts index 2f47a2b..21d9eda 100644 --- a/src/HTMLNormalizer/strategies/outlook.ts +++ b/src/HTMLNormalizer/strategies/outlook.ts @@ -28,7 +28,9 @@ export const pruneOutlookElement = (element: HTMLElement): boolean => { return !!element.nodeName.toLowerCase().startsWith("o:"); }; -const qrCodeContainerId = "test-for-us"; +const qrCodeContainerIds = { + "test-for-us": 1, +}; const removeQrCodeNodes = (document: HTMLDocument) => { const remove = (node: Element) => { let toRemove = []; @@ -41,7 +43,12 @@ const removeQrCodeNodes = (document: HTMLDocument) => { const childElement = child as Element; const id = childElement.getAttribute("id"); - if (id && id.includes(qrCodeContainerId)) { + if ( + id && + Object.keys(qrCodeContainerIds).find((possibleId) => + id.includes(possibleId) + ) + ) { toRemove.push(childElement.parentNode); } } diff --git a/src/PlainNormalizer/PlainNormalizer.ts b/src/PlainNormalizer/PlainNormalizer.ts index 16a59c9..2dd46a7 100644 --- a/src/PlainNormalizer/PlainNormalizer.ts +++ b/src/PlainNormalizer/PlainNormalizer.ts @@ -8,8 +8,8 @@ export const normalizePlainPart = (text: string): string => { const removeQRCodes = (s: string): string => { return s - .replace(/\[qrcode.png]\s*<https:\/\/[\w./?=\-&]+>/g, "") - .replace(/<https:\/\/[\w./?=\-&]+>\s*\[qrcode.png]/g, ""); + .replace(/\[(image:)*qrcode.png]\s*<https:\/\/[\w./?=\-&]+>/g, "") + .replace(/<https:\/\/[\w./?=\-&]+>\s*\[(image: )*qrcode.png]/g, ""); }; const removeListBullets = (s: string): string => { -- GitLab