From 4ff2d02fbef8be4d43fa2e5237dcd9e8d9c2adf4 Mon Sep 17 00:00:00 2001 From: igor <igor.markin@vereign.com> Date: Mon, 30 Nov 2020 16:52:38 +0300 Subject: [PATCH] Add build --- .gitignore | 1 - diff1 | 1541 ++++++++++++++++++ diff2 | 1545 +++++++++++++++++++ dist/HTMLNormalizer/HTMLNormalizer.d.ts | 6 + dist/HTMLNormalizer/HTMLNormalizer.js | 200 +++ dist/HTMLNormalizer/index.d.ts | 4 + dist/HTMLNormalizer/index.js | 6 + dist/HTMLNormalizer/strategies/common.d.ts | 21 + dist/HTMLNormalizer/strategies/common.js | 51 + dist/HTMLNormalizer/strategies/gmail.d.ts | 3 + dist/HTMLNormalizer/strategies/gmail.js | 41 + dist/HTMLNormalizer/strategies/outlook.d.ts | 8 + dist/HTMLNormalizer/strategies/outlook.js | 137 ++ dist/constants.d.ts | 9 + dist/constants.js | 12 + dist/index.d.ts | 2 + dist/index.js | 7 + dist/utils.d.ts | 1 + dist/utils.js | 9 + 19 files changed, 3603 insertions(+), 1 deletion(-) create mode 100644 diff1 create mode 100644 diff2 create mode 100644 dist/HTMLNormalizer/HTMLNormalizer.d.ts create mode 100644 dist/HTMLNormalizer/HTMLNormalizer.js create mode 100644 dist/HTMLNormalizer/index.d.ts create mode 100644 dist/HTMLNormalizer/index.js create mode 100644 dist/HTMLNormalizer/strategies/common.d.ts create mode 100644 dist/HTMLNormalizer/strategies/common.js create mode 100644 dist/HTMLNormalizer/strategies/gmail.d.ts create mode 100644 dist/HTMLNormalizer/strategies/gmail.js create mode 100644 dist/HTMLNormalizer/strategies/outlook.d.ts create mode 100644 dist/HTMLNormalizer/strategies/outlook.js create mode 100644 dist/constants.d.ts create mode 100644 dist/constants.js create mode 100644 dist/index.d.ts create mode 100644 dist/index.js create mode 100644 dist/utils.d.ts create mode 100644 dist/utils.js diff --git a/.gitignore b/.gitignore index 24ea571..f3c728e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ node_modules .idea yarn-error.log -dist diff --git a/diff1 b/diff1 new file mode 100644 index 0000000..d987a6e --- /dev/null +++ b/diff1 @@ -0,0 +1,1541 @@ +"<DIV> + <DIV> + <DIV> + <H2> + <TEXT>Validationcases</TEXT> + </H2> + <BUTTON/> + </DIV> + <DIV> + <DIV> + <DIV> + <P/> + <P> + <TEXT>Validationcases</TEXT> + </P> + </DIV> + </DIV> + </DIV> + <DIV> + <DIV> + <P> + <STRONG> + <TEXT>Abstract</TEXT> + </STRONG> + <TEXT>Themainprincipleofnormalizationstrategiesistoremoveasmuchnotrelevantinformationaspossibleandleaveonlyessentialinfolikelinks,texts,dates.</TEXT> + </P> + <P> + <STRONG> + <TEXT>BasicHTMLnormalization(AppliedtobothGmailandOutlook):</TEXT> + </STRONG> + </P> + <OL> + <LI> + <TEXT>RemoveallHTMLattributesexceptfor:</TEXT> + </LI> + </OL> + <UL> + <LI> + <TEXT>alt</TEXT> + </LI> + <LI> + <TEXT>src</TEXT> + </LI> + <LI> + <TEXT>cite</TEXT> + </LI> + <LI> + <TEXT>data</TEXT> + </LI> + <LI> + <TEXT>datetime</TEXT> + </LI> + <LI> + <TEXT>href</TEXT> + </LI> + <LI> + <TEXT>value</TEXT> + </LI> + </UL> + <OL> + <LI> + <TEXT>Orderattributesalphabeticallywithinthetag</TEXT> + </LI> + <LI> + <TEXT>Removeallemptytexts,commentsanddoctypenodes,</TEXT> + <CODE> + <TEXT><br></TEXT> + </CODE> + <TEXT>and</TEXT> + <CODE> + <TEXT><hr></TEXT> + </CODE> + <TEXT>tags</TEXT> + </LI> + <LI> + <TEXT>RemoveQARCodeHTMLnode</TEXT> + </LI> + <LI> + <TEXT>Removeallspacesandlinebreaksfromthetext</TEXT> + </LI> + </OL> + <P> + <STRONG> + <TEXT>Basictextnormalization(AppliedtobothGmailandOutlook)</TEXT> + </STRONG> + </P> + <UL> + <LI> + <TEXT>Removeallwhitespacesandlinebreaksfromtheplaintext,becauseemailclientsmayamendtheoriginalspacingofthetext.Forexampletrimspacesfromedges,orreduceamountofspacesbetweenwords.Orinsertzero-widthcharacterwithunicode</TEXT> + <CODE> + <TEXT>\\u200B</TEXT> + </CODE> + <TEXT>.</TEXT> + </LI> + </UL> + <P> + <STRONG> + <TEXT>OutlookspecificHTMLnormalization(prependsbasicnormalization)</TEXT> + </STRONG> + </P> + <OL> + <LI> + <TEXT>Unwindall</TEXT> + <CODE> + <TEXT>span</TEXT> + </CODE> + <TEXT>tags,becauseincertaincasesOutlookamendsmarkupbyinsertingspantags.</TEXT> + </LI> + </OL> + <P> + <TEXT>Example:</TEXT> + </P> + <PRE> + <CODE> + <TEXT><div></TEXT> + <TEXT><span></TEXT> + <TEXT><p>Nestinglevel1</p></TEXT> + <TEXT><span>Nestinglevel2</span></TEXT> + <TEXT></span></TEXT> + <TEXT></div></TEXT> + </CODE> + </PRE> + <P> + <TEXT>turnsinto</TEXT> + </P> + <PRE> + <CODE> + <TEXT><div></TEXT> + <TEXT><p>Nestinglevel1</p></TEXT> + <TEXT>Nestinglevel2</TEXT> + <TEXT></div></TEXT> + </CODE> + </PRE> + <OL> + <LI> + <P> + <TEXT>Removealloutlookspecifictagsstartingwithprefix</TEXT> + <CODE> + <TEXT>o:</TEXT> + </CODE> + <TEXT>.E.g.</TEXT> + <CODE> + <TEXT><o:p>...</o:p></TEXT> + </CODE> + </P> + </LI> + <LI> + <P> + <TEXT>Unwindcontentsofdivwithclass</TEXT> + <CODE> + <TEXT>WordSection1</TEXT> + </CODE> + <TEXT>.Desktopversionswrappingemaildataintothistagbehindthescenes.</TEXT> + </P> + </LI> + </OL> + <P> + <TEXT>Example:</TEXT> + </P> + <PRE> + <CODE> + <TEXT><divclass=\"WordSection1\"></TEXT> + <TEXT><p>Nestinglevel1</p></TEXT> + <TEXT><ahref=\"..\">Link</span></TEXT> + <TEXT></div></TEXT> + </CODE> + </PRE> + <P> + <TEXT>turnsinto</TEXT> + </P> + <PRE> + <CODE> + <TEXT><p>Nestinglevel1</p></TEXT> + <TEXT><ahref=\"..\">Link</span></TEXT> + </CODE> + </PRE> + <P> + <STRONG> + <TEXT>GmailspecificHTMLnormalization(prependsbasicnormalization)</TEXT> + </STRONG> + </P> + <UL> + <LI> + <TEXT>Findallimgtagswith</TEXT> + <CODE> + <TEXT>data-surl</TEXT> + </CODE> + <TEXT>attribute,extractit'svalueandplaceinto</TEXT> + <CODE> + <TEXT>src</TEXT> + </CODE> + <TEXT>attribute,andremove</TEXT> + <CODE> + <TEXT>data-surl</TEXT> + </CODE> + <TEXT>attribute</TEXT> + </LI> + </UL> + <P> + <TEXT>Example:</TEXT> + </P> + <PRE> + <CODE> + <TEXT><imgdata-surl=\"cid:aaaa_aaa\"src=\"blob:https://mail.google.com\"/></TEXT> + </CODE> + </PRE> + <P> + <TEXT>turnsinto</TEXT> + </P> + <PRE> + <CODE> + <TEXT><imgsrc=\"cid:aaaa_aaa\"/></TEXT> + </CODE> + </PRE> + <P> + <STRONG> + <TEXT>Validationtests</TEXT> + </STRONG> + </P> + <TABLE> + <THEAD> + <TR> + <TH> + <TEXT>title</TEXT> + </TH> + <TH> + <TEXT>Sentfrom</TEXT> + </TH> + <TH> + <TEXT>HTMLnormalization</TEXT> + </TH> + <TH> + <TEXT>Plaintextnormalization</TEXT> + </TH> + <TH> + <TEXT>Chrome</TEXT> + </TH> + <TH> + <TEXT>Edge</TEXT> + </TH> + <TH> + <TEXT>Safari</TEXT> + </TH> + <TH> + <TEXT>Desktop(Windows)</TEXT> + </TH> + <TH> + <TEXT>Desktop(Mac)</TEXT> + </TH> + </TR> + </THEAD> + <TBODY> + <TR> + <TD> + <TEXT>01justatext</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>02Table/list/textformatting</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/31\"> + <TEXT>#31</TEXT> + </A> + </TD> + <TD> + <TEXT>ok/failed</TEXT> + </TD> + <TD/> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/31\"> + <TEXT>#31</TEXT> + </A> + </TD> + <TD> + <TEXT>Validationfailed</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>03Createanemailwithbigtextinsideemail</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated,validationisslow</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>04Sendcomplextextwithhtmlcopiedfromtheinternet</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/32\"> + <TEXT>#32</TEXT> + </A> + <TEXT>,</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/33\"> + <TEXT>#33</TEXT> + </A> + </TD> + <TD> + <TEXT>ok/failed</TEXT> + </TD> + <TD/> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/33\"> + <TEXT>#33</TEXT> + </A> + </TD> + </TR> + <TR> + <TD> + <TEXT>05AppendpictureasAttachment</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>Ok/Validated,Landingpageshowserrorfilenotfound</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>06Appendpictureasinlinepicture</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>failed</TEXT> + </TD> + <TD> + <TEXT>failed</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>07Attachfiles:xml,html,zip,docx</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>08AppendOneDrivelink.OutlookwebNewversion</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/34\"> + <TEXT>#34</TEXT> + </A> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/34\"> + <TEXT>#34</TEXT> + </A> + </TD> + <TD/> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/34\"> + <TEXT>#34</TEXT> + </A> + </TD> + <TD> + <TEXT>Notapplicable</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>09AppendOneDrivelink.OutlookwebOldversion</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>Notapplicable</TEXT> + </TD> + <TD> + <TEXT>Notapplicable</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>10Append24mbfile</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/35\"> + <TEXT>#35</TEXT> + </A> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/35\"> + <TEXT>#35</TEXT> + </A> + </TD> + <TD/> + <TD> + <TEXT>EmailissentwithoutQRcode</TEXT> + </TD> + <TD> + <TEXT>ForsomereasontheSizeofattachmentincreasesby~30%,</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/35\"> + <TEXT>#35</TEXT> + </A> + </TD> + </TR> + <TR> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>20Replywith:justatext</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>+ok/Validated</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>21Replywith:Table/list/textformatting</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/36\"> + <TEXT>#36</TEXT> + </A> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>22Replywith:Createanemailwithbigtextinsideemail</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>Ok/validated,Landingpageshowserrorfilenotfound</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>23Replywith:Sendcomplextextwithhtmlcopiedfromtheinternet</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/33\"> + <TEXT>#33</TEXT> + </A> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>24Replywith:AppendpictureasAttachment</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>Ok/validated,Landingpageshowserrorfilenotfound</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>25Replywith:Appendpictureasinlinepicture</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>Ok/validated,Landingpageshowserrorfilenotfound</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>26Replywith:Attachfiles:xml,html,zip,docx</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>Ok/validated,Landingpageshowserrorfilenotfound</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>27Replywith:AppendOneDrivelink.OutlookwebNewversion</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/34\"> + <TEXT>#34</TEXT> + </A> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>28Replywith:AppendOneDrivelink.OutlookwebOldversion</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>29Replywith:Append24mbfile</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/35\"> + <TEXT>#35</TEXT> + </A> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>CheckValidationOnly</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>40Received:justatext</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>41Received:Table/list/textformatting</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>42Received:Createanemailwithbigtextinsideemail</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>43Received:Sendcomplextextwithhtmlcopiedfromtheinternet</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>44Received:AppendpictureasAttachment</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>45Received:Appendpictureasinlinepicture</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>46Received:Attachfiles:xml,html,zip,docx</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>47Received:AppendGDrivelink.OutlookwebNewversion</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>48Received:AppendGDrivelink.OutlookwebOldversion</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>49Received:Append24mbfile</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>60ReceivedReplywith:justatext</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>61ReceivedReplywith:Table/list/textformatting</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>62ReceivedReplywith:Createanemailwithbigtextinsideemail</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>63ReceivedReplywith:Sendcomplextextwithhtmlcopiedfromtheinternet</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>64ReceivedReplywith:AppendpictureasAttachment</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>65ReceivedReplywith:Appendpictureasinlinepicture</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>66ReceivedReplywith:Attachfiles:xml,html,zip,docx</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>67ReceivedReplywith:AppendGDrivelink.OutlookwebNewversion</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>68ReceivedReplywith:AppendGDrivelink.OutlookwebOldversion</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>69ReceivedReplywith:Append24mbfile</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + </TBODY> + </TABLE> + </DIV> + <SMALL> + <TEXT>Edited</TEXT> + <TIME datetime=\"2020-11-19T05:41:23+00:00\"> + <TEXT>8minutesago</TEXT> + </TIME> + <TEXT>by</TEXT> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + </SMALL> + </DIV> + </DIV> + <DIV> + <DIV> + <OL> + <LI> + <DIV> + <BUTTON> + <DIV> + <P> + <TEXT>Dropor</TEXT> + <TEXT>upload</TEXT> + <TEXT>designstoattach</TEXT> + </P> + </DIV> + </BUTTON> + </DIV> + <DIV> + <DIV> + <DIV> + <H3> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#related-issues\"/> + <TEXT>Linkedissues</TEXT> + <A href=\"https://code.vereign.com/help/user/project/issues/related_issues\"/> + <DIV> + <DIV> + <TEXT>0</TEXT> + </DIV> + <BUTTON/> + </DIV> + </H3> + </DIV> + </DIV> + </DIV> + </LI> + </OL> + </DIV> + <DIV> + <DIV> + <DIV> + <DIV> + <BUTTON> + <TEXT>👍</TEXT> + <TEXT>0</TEXT> + </BUTTON> + <BUTTON> + <TEXT>👎</TEXT> + <TEXT>0</TEXT> + </BUTTON> + <DIV> + <BUTTON/> + </DIV> + </DIV> + </DIV> + <DIV> + <DIV> + <BUTTON> + <TEXT>Oldestfirst</TEXT> + </BUTTON> + <DIV> + <BUTTON> + <TEXT>Showallactivity</TEXT> + </BUTTON> + <DIV> + <DIV> + <BUTTON> + <TEXT>Createmergerequest</TEXT> + </BUTTON> + <BUTTON> + <I/> + </BUTTON> + </DIV> + </DIV> + </DIV> + </DIV> + </DIV> + <DIV> + <UL> + <LI> + <DIV> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58017\"> + <TIME datetime=\"2020-11-18T06:13:44.010Z\"> + <TEXT>23hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedtitlefrom</TEXT> + <STRONG> + <TEXT>Validationcases</TEXT> + <TEXT>:</TEXT> + </STRONG> + <TEXT>to</TEXT> + <STRONG> + <TEXT>Validationcases</TEXT> + </STRONG> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58025\"> + <TIME datetime=\"2020-11-18T07:53:16.478Z\"> + <TEXT>21hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58026\"> + <TIME datetime=\"2020-11-18T07:53:16.502Z\"> + <TEXT>21hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58036\"> + <TIME datetime=\"2020-11-18T10:42:04.722Z\"> + <TEXT>19hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>IgorMarkin</TEXT> + </A> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>@igor.markin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58052\"> + <TIME datetime=\"2020-11-18T13:32:47.847Z\"> + <TEXT>16hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>IgorMarkin</TEXT> + </A> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>@igor.markin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58055\"> + <TIME datetime=\"2020-11-18T13:59:00.395Z\"> + <TEXT>15hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>IgorMarkin</TEXT> + </A> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>@igor.markin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58056\"> + <TIME datetime=\"2020-11-18T14:07:05.781Z\"> + <TEXT>15hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58066\"> + <TIME datetime=\"2020-11-19T03:24:46.045Z\"> + <TEXT>2hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58068\"> + <TIME datetime=\"2020-11-19T05:41:23.630Z\"> + <TEXT>8minutesago</TEXT> + </TIME> + </A> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + </UL> + </DIV> + </DIV> + </DIV> + </DIV> + </DIV> + <DIV> + <DIV> + <A href=\"https://office.test.vereign.com/?q=CiCHsHP9w5YPuk73rk6eoIG92LtgQ2AujTWDDS4VR1bL4BIgGlITXdUo30ZvEgaMsw7RqQZ2xTYF7a3-6QwFpvOGnG4=&https://office.test.vereign.com/?q=CiCHsHP9w5YPuk73rk6eoIG92LtgQ2AujTWDDS4VR1bL4BIgGlITXdUo30ZvEgaMsw7RqQZ2xTYF7a3-6QwFpvOGnG4=&\"> + <IMG alt=\"qrcode.png\" src=\"cid:56c315d8-19bf-4bb0-a3c6-89980b1c588d\"/> + </A> + </DIV> + </DIV> diff --git a/diff2 b/diff2 new file mode 100644 index 0000000..4f3f708 --- /dev/null +++ b/diff2 @@ -0,0 +1,1545 @@ +<DIV> + <DIV> + <DIV> + <H2> + <TEXT>Validationcases</TEXT> + </H2> + <BUTTON/> + </DIV> + <DIV> + <DIV> + <DIV> + <P/> + <P> + <TEXT>Validationcases</TEXT> + </P> + </DIV> + </DIV> + </DIV> + <DIV> + <DIV> + <P> + <STRONG> + <TEXT>Abstract</TEXT> + </STRONG> + <TEXT>Themainprincipleofnormalizationstrategiesistoremoveasmuchnotrelevantinformationaspossibleandleaveonlyessentialinfolikelinks,texts,dates.</TEXT> + </P> + <P> + <STRONG> + <TEXT>BasicHTMLnormalization(AppliedtobothGmailandOutlook):</TEXT> + </STRONG> + </P> + <OL> + <LI> + <TEXT>RemoveallHTMLattributesexceptfor:</TEXT> + </LI> + </OL> + <UL> + <LI> + <TEXT>alt</TEXT> + </LI> + <LI> + <TEXT>src</TEXT> + </LI> + <LI> + <TEXT>cite</TEXT> + </LI> + <LI> + <TEXT>data</TEXT> + </LI> + <LI> + <TEXT>datetime</TEXT> + </LI> + <LI> + <TEXT>href</TEXT> + </LI> + <LI> + <TEXT>value</TEXT> + </LI> + </UL> + <OL> + <LI> + <TEXT>Orderattributesalphabeticallywithinthetag</TEXT> + </LI> + <LI> + <TEXT>Removeallemptytexts,commentsanddoctypenodes,</TEXT> + <CODE> + <TEXT><br></TEXT> + </CODE> + <TEXT>and</TEXT> + <CODE> + <TEXT><hr></TEXT> + </CODE> + <TEXT>tags</TEXT> + </LI> + <LI> + <TEXT>RemoveQARCodeHTMLnode</TEXT> + </LI> + <LI> + <TEXT>Removeallspacesandlinebreaksfromthetext</TEXT> + </LI> + </OL> + <P> + <STRONG> + <TEXT>Basictextnormalization(AppliedtobothGmailandOutlook)</TEXT> + </STRONG> + </P> + <UL> + <LI> + <TEXT>Removeallwhitespacesandlinebreaksfromtheplaintext,becauseemailclientsmayamendtheoriginalspacingofthetext.Forexampletrimspacesfromedges,orreduceamountofspacesbetweenwords.Orinsertzero-widthcharacterwithunicode</TEXT> + <CODE> + <TEXT>\\u200B</TEXT> + </CODE> + <TEXT>.</TEXT> + </LI> + </UL> + <P> + <STRONG> + <TEXT>OutlookspecificHTMLnormalization(prependsbasicnormalization)</TEXT> + </STRONG> + </P> + <OL> + <LI> + <TEXT>Unwindall</TEXT> + <CODE> + <TEXT>span</TEXT> + </CODE> + <TEXT>tags,becauseincertaincasesOutlookamendsmarkupbyinsertingspantags.</TEXT> + </LI> + </OL> + <P> + <TEXT>Example:</TEXT> + </P> + <PRE> + <CODE> + <TEXT><div></TEXT> + <TEXT><span></TEXT> + <TEXT><p>Nestinglevel1</p></TEXT> + <TEXT><span>Nestinglevel2</span></TEXT> + <TEXT></span></TEXT> + <TEXT></div></TEXT> + </CODE> + </PRE> + <P> + <TEXT>turnsinto</TEXT> + </P> + <PRE> + <CODE> + <TEXT><div></TEXT> + <TEXT><p>Nestinglevel1</p></TEXT> + <TEXT>Nestinglevel2</TEXT> + <TEXT></div></TEXT> + </CODE> + </PRE> + <OL> + <LI> + <P> + <TEXT>Removealloutlookspecifictagsstartingwithprefix</TEXT> + <CODE> + <TEXT>o:</TEXT> + </CODE> + <TEXT>.E.g.</TEXT> + <CODE> + <TEXT><o:p>...</o:p></TEXT> + </CODE> + </P> + </LI> + <LI> + <P> + <TEXT>Unwindcontentsofdivwithclass</TEXT> + <CODE> + <TEXT>WordSection1</TEXT> + </CODE> + <TEXT>.Desktopversionswrappingemaildataintothistagbehindthescenes.</TEXT> + </P> + </LI> + </OL> + <P> + <TEXT>Example:</TEXT> + </P> + <PRE> + <CODE> + <TEXT><divclass=\"WordSection1\"></TEXT> + <TEXT><p>Nestinglevel1</p></TEXT> + <TEXT><ahref=\"..\">Link</span></TEXT> + <TEXT></div></TEXT> + </CODE> + </PRE> + <P> + <TEXT>turnsinto</TEXT> + </P> + <PRE> + <CODE> + <TEXT><p>Nestinglevel1</p></TEXT> + <TEXT><ahref=\"..\">Link</span></TEXT> + </CODE> + </PRE> + <P> + <STRONG> + <TEXT>GmailspecificHTMLnormalization(prependsbasicnormalization)</TEXT> + </STRONG> + </P> + <UL> + <LI> + <TEXT>Findallimgtagswith</TEXT> + <CODE> + <TEXT>data-surl</TEXT> + </CODE> + <TEXT>attribute,extractit'svalueandplaceinto</TEXT> + <CODE> + <TEXT>src</TEXT> + </CODE> + <TEXT>attribute,andremove</TEXT> + <CODE> + <TEXT>data-surl</TEXT> + </CODE> + <TEXT>attribute</TEXT> + </LI> + </UL> + <P> + <TEXT>Example:</TEXT> + </P> + <PRE> + <CODE> + <TEXT><imgdata-surl=\"cid:aaaa_aaa\"src=\"blob:https://mail.google.com\"/></TEXT> + </CODE> + </PRE> + <P> + <TEXT>turnsinto</TEXT> + </P> + <PRE> + <CODE> + <TEXT><imgsrc=\"cid:aaaa_aaa\"/></TEXT> + </CODE> + </PRE> + <P> + <STRONG> + <TEXT>Validationtests</TEXT> + </STRONG> + </P> + <TABLE> + <THEAD> + <TR> + <TH> + <TEXT>title</TEXT> + </TH> + <TH> + <TEXT>Sentfrom</TEXT> + </TH> + <TH> + <TEXT>HTMLnormalization</TEXT> + </TH> + <TH> + <TEXT>Plaintextnormalization</TEXT> + </TH> + <TH> + <TEXT>Chrome</TEXT> + </TH> + <TH> + <TEXT>Edge</TEXT> + </TH> + <TH> + <TEXT>Safari</TEXT> + </TH> + <TH> + <TEXT>Desktop(Windows)</TEXT> + </TH> + <TH> + <TEXT>Desktop(Mac)</TEXT> + </TH> + </TR> + </THEAD> + <TBODY> + <TR> + <TD> + <TEXT>01justatext</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>02Table/list/textformatting</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/31\"> + <TEXT>#31</TEXT> + </A> + </TD> + <TD> + <TEXT>ok/failed</TEXT> + </TD> + <TD/> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/31\"> + <TEXT>#31</TEXT> + </A> + </TD> + <TD> + <TEXT>Validationfailed</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>03Createanemailwithbigtextinsideemail</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated,validationisslow</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>04Sendcomplextextwithhtmlcopiedfromtheinternet</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/32\"> + <TEXT>#32</TEXT> + </A> + <TEXT>,</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/33\"> + <TEXT>#33</TEXT> + </A> + </TD> + <TD> + <TEXT>ok/failed</TEXT> + </TD> + <TD/> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/33\"> + <TEXT>#33</TEXT> + </A> + </TD> + </TR> + <TR> + <TD> + <TEXT>05AppendpictureasAttachment</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>Ok/Validated,Landingpageshowserrorfilenotfound</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>06Appendpictureasinlinepicture</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>failed</TEXT> + </TD> + <TD> + <TEXT>failed</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>07Attachfiles:xml,html,zip,docx</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>08AppendOneDrivelink.OutlookwebNewversion</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/34\"> + <TEXT>#34</TEXT> + </A> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/34\"> + <TEXT>#34</TEXT> + </A> + </TD> + <TD/> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/34\"> + <TEXT>#34</TEXT> + </A> + </TD> + <TD> + <TEXT>Notapplicable</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>09AppendOneDrivelink.OutlookwebOldversion</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD> + <TEXT>Notapplicable</TEXT> + </TD> + <TD> + <TEXT>Notapplicable</TEXT> + </TD> + </TR> + <TR> + <TD> + <TEXT>10Append24mbfile</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/35\"> + <TEXT>#35</TEXT> + </A> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/35\"> + <TEXT>#35</TEXT> + </A> + </TD> + <TD/> + <TD> + <TEXT>EmailissentwithoutQRcode</TEXT> + </TD> + <TD> + <TEXT>ForsomereasontheSizeofattachmentincreasesby~30%,</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/35\"> + <TEXT>#35</TEXT> + </A> + </TD> + </TR> + <TR> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>20Replywith:justatext</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>+ok/Validated</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>21Replywith:Table/list/textformatting</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/36\"> + <TEXT>#36</TEXT> + </A> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>22Replywith:Createanemailwithbigtextinsideemail</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>Ok/validated,Landingpageshowserrorfilenotfound</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>23Replywith:Sendcomplextextwithhtmlcopiedfromtheinternet</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/33\"> + <TEXT>#33</TEXT> + </A> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>24Replywith:AppendpictureasAttachment</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>Ok/validated,Landingpageshowserrorfilenotfound</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>25Replywith:Appendpictureasinlinepicture</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>Ok/validated,Landingpageshowserrorfilenotfound</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>26Replywith:Attachfiles:xml,html,zip,docx</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>Ok/validated,Landingpageshowserrorfilenotfound</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>27Replywith:AppendOneDrivelink.OutlookwebNewversion</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/34\"> + <TEXT>#34</TEXT> + </A> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>28Replywith:AppendOneDrivelink.OutlookwebOldversion</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <TEXT>ok/validated</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>29Replywith:Append24mbfile</TEXT> + </TD> + <TD> + <TEXT>Outlookaccount</TEXT> + </TD> + <TD> + <TEXT>OutlookspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/35\"> + <TEXT>#35</TEXT> + </A> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>CheckValidationOnly</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>40Received:justatext</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>41Received:Table/list/textformatting</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>42Received:Createanemailwithbigtextinsideemail</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>43Received:Sendcomplextextwithhtmlcopiedfromtheinternet</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>44Received:AppendpictureasAttachment</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>45Received:Appendpictureasinlinepicture</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>46Received:Attachfiles:xml,html,zip,docx</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>47Received:AppendGDrivelink.OutlookwebNewversion</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>48Received:AppendGDrivelink.OutlookwebOldversion</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>49Received:Append24mbfile</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>60ReceivedReplywith:justatext</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>61ReceivedReplywith:Table/list/textformatting</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>62ReceivedReplywith:Createanemailwithbigtextinsideemail</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>63ReceivedReplywith:Sendcomplextextwithhtmlcopiedfromtheinternet</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>64ReceivedReplywith:AppendpictureasAttachment</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>65ReceivedReplywith:Appendpictureasinlinepicture</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>66ReceivedReplywith:Attachfiles:xml,html,zip,docx</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>67ReceivedReplywith:AppendGDrivelink.OutlookwebNewversion</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>68ReceivedReplywith:AppendGDrivelink.OutlookwebOldversion</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization+</TEXT> + <A href=\"https://code.vereign.com/light/clients/utils/-/issues/7\"> + <TEXT>utils#7(closed)</TEXT> + </A> + <TEXT>(closed)</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + <TR> + <TD> + <TEXT>69ReceivedReplywith:Append24mbfile</TEXT> + </TD> + <TD> + <TEXT>Gmailaccount</TEXT> + </TD> + <TD> + <TEXT>GmailspecificHTMLnormalization+basicnormalization</TEXT> + </TD> + <TD> + <TEXT>Basicplaintextnormalization</TEXT> + </TD> + <TD/> + <TD/> + <TD/> + <TD/> + <TD/> + </TR> + </TBODY> + </TABLE> + </DIV> + <SMALL> + <TEXT>Edited</TEXT> + <TIME datetime=\"2020-11-19T05:41:23+00:00\"> + <TEXT>8minutesago</TEXT> + </TIME> + <TEXT>by</TEXT> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + </SMALL> + </DIV> + </DIV> + <DIV> + <DIV> + <OL> + <LI> + <DIV> + <BUTTON> + <DIV> + <P> + <TEXT>Dropor</TEXT> + <TEXT>upload</TEXT> + <TEXT>designstoattach</TEXT> + </P> + </DIV> + </BUTTON> + </DIV> + <DIV> + <DIV> + <DIV> + <H3> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#related-issues\"/> + <TEXT>Linkedissues</TEXT> + <A href=\"https://code.vereign.com/help/user/project/issues/related_issues\"/> + <DIV> + <DIV> + <TEXT>0</TEXT> + </DIV> + <BUTTON/> + </DIV> + </H3> + </DIV> + </DIV> + </DIV> + </LI> + </OL> + </DIV> + <DIV> + <DIV> + <DIV> + <DIV> + <BUTTON> + <TEXT>👍</TEXT> + <TEXT>0</TEXT> + </BUTTON> + <BUTTON> + <TEXT>👎</TEXT> + <TEXT>0</TEXT> + </BUTTON> + <DIV> + <BUTTON/> + </DIV> + </DIV> + </DIV> + <DIV> + <DIV> + <BUTTON> + <TEXT>Oldestfirst</TEXT> + </BUTTON> + <DIV> + <BUTTON> + <TEXT>Showallactivity</TEXT> + </BUTTON> + <DIV> + <DIV> + <BUTTON> + <TEXT>Createmergerequest</TEXT> + </BUTTON> + <BUTTON> + <I/> + </BUTTON> + </DIV> + </DIV> + </DIV> + </DIV> + </DIV> + <SECTION> + <DIV> + <UL> + <LI> + <DIV> + <DIV/> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58017\"> + <TIME datetime=\"2020-11-18T06:13:44.010Z\"> + <TEXT>23hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV/> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedtitlefrom</TEXT> + <STRONG> + <TEXT>Validationcases</TEXT> + <TEXT>:</TEXT> + </STRONG> + <TEXT>to</TEXT> + <STRONG> + <TEXT>Validationcases</TEXT> + </STRONG> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58025\"> + <TIME datetime=\"2020-11-18T07:53:16.478Z\"> + <TEXT>21hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV/> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58026\"> + <TIME datetime=\"2020-11-18T07:53:16.502Z\"> + <TEXT>21hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV/> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58036\"> + <TIME datetime=\"2020-11-18T10:42:04.722Z\"> + <TEXT>19hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV/> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>IgorMarkin</TEXT> + </A> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>@igor.markin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58052\"> + <TIME datetime=\"2020-11-18T13:32:47.847Z\"> + <TEXT>16hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV/> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>IgorMarkin</TEXT> + </A> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>@igor.markin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58055\"> + <TIME datetime=\"2020-11-18T13:59:00.395Z\"> + <TEXT>15hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV/> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>IgorMarkin</TEXT> + </A> + <A href=\"https://code.vereign.com/igor.markin\"> + <TEXT>@igor.markin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58056\"> + <TIME datetime=\"2020-11-18T14:07:05.781Z\"> + <TEXT>15hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV/> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58066\"> + <TIME datetime=\"2020-11-19T03:24:46.045Z\"> + <TEXT>2hoursago</TEXT> + </TIME> + </A> + <DIV/> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + <LI> + <DIV> + <DIV/> + <DIV> + <DIV> + <DIV> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>AlexeyLunin</TEXT> + </A> + <A href=\"https://code.vereign.com/alexey.lunin\"> + <TEXT>@alexey.lunin</TEXT> + </A> + <TEXT>changedthedescription</TEXT> + <A href=\"https://code.vereign.com/light/clients/outlookaddin/-/issues/30#note_58068\"> + <TIME datetime=\"2020-11-19T05:41:23.630Z\"> + <TEXT>8minutesago</TEXT> + </TIME> + </A> + </DIV> + </DIV> + </DIV> + </DIV> + </LI> + </UL> + </DIV> + </SECTION> + </DIV> + </DIV> + </DIV> + </DIV> diff --git a/dist/HTMLNormalizer/HTMLNormalizer.d.ts b/dist/HTMLNormalizer/HTMLNormalizer.d.ts new file mode 100644 index 0000000..1451258 --- /dev/null +++ b/dist/HTMLNormalizer/HTMLNormalizer.d.ts @@ -0,0 +1,6 @@ +export declare const normalizeVendorHtml: (document: HTMLDocument, vendor: string) => string; +export declare const printHtmlChildren: (node: Node, printFunction: (node: Node) => string, depth: number) => string; +export declare const printHtmlNode: (node: Node, printFunction: (node: Node) => string, depth: number) => string; +export declare const cleanupHtmlNodeAttributes: (node: Node, cleanupElementAttributes: (element: HTMLElement) => void) => void; +export declare const pruneHtmlNode: (node: Node, pruneElement: (element: HTMLElement) => boolean) => boolean; +export declare const escapeHtmlString: (string: string) => string; diff --git a/dist/HTMLNormalizer/HTMLNormalizer.js b/dist/HTMLNormalizer/HTMLNormalizer.js new file mode 100644 index 0000000..1cf9605 --- /dev/null +++ b/dist/HTMLNormalizer/HTMLNormalizer.js @@ -0,0 +1,200 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.escapeHtmlString = exports.pruneHtmlNode = exports.cleanupHtmlNodeAttributes = exports.printHtmlNode = exports.printHtmlChildren = exports.normalizeVendorHtml = void 0; +const constants_1 = require("../constants"); +const outlook_1 = require("./strategies/outlook"); +const constants_2 = require("../constants"); +const utils_1 = require("../utils"); +const gmail_1 = require("./strategies/gmail"); +const nodesAmendingFunctions = { + [constants_2.EMAIL_VENDORS.GMAIL]: gmail_1.amendGmailNodes, + [constants_2.EMAIL_VENDORS.OUTLOOK]: outlook_1.amendOutlookNodes, +}; +const nodesPruningFunctions = { + [constants_2.EMAIL_VENDORS.GMAIL]: gmail_1.pruneGmailElement, + [constants_2.EMAIL_VENDORS.OUTLOOK]: outlook_1.pruneOutlookElement, +}; +const attributesCleanupFunctions = { + [constants_2.EMAIL_VENDORS.GMAIL]: gmail_1.cleanupGMailElementAttributes, + [constants_2.EMAIL_VENDORS.OUTLOOK]: outlook_1.cleanupOutlookElementAttributes, +}; +const vendorPrintingFunctions = { + [constants_2.EMAIL_VENDORS.OUTLOOK]: outlook_1.printOutlookElement, +}; +const normalizeVendorHtml = (document, vendor) => { + const mimeBody = document.body; + const amendNodesFunction = nodesAmendingFunctions[vendor]; + if (amendNodesFunction) { + amendNodesFunction(document); + } + /** + * Remove unnecessary nodes + */ + const elementPruningFunction = nodesPruningFunctions[vendor]; + if (!elementPruningFunction) { + throw new Error(`Vendor "${vendor}" is not supported. Please, develop a pruning function for it.`); + } + exports.pruneHtmlNode(document, elementPruningFunction); + /** + * Cleanup unnecessary attributes of nodes + */ + const elementAttributesCleanupFunction = attributesCleanupFunctions[vendor]; + if (elementAttributesCleanupFunction) { + exports.cleanupHtmlNodeAttributes(document, elementAttributesCleanupFunction); + } + /** + * Print nodes + */ + const vendorPrintFunction = vendorPrintingFunctions[vendor]; + return exports.printHtmlChildren(mimeBody, vendorPrintFunction, 0); +}; +exports.normalizeVendorHtml = normalizeVendorHtml; +const printHtmlChildren = (node, printFunction, depth) => { + let child = node.firstChild; + if (!child) { + return ""; + } + if (child == node.lastChild && child.nodeType == constants_1.TEXT_NODE) { + return exports.printHtmlNode(child, printFunction, depth); + } + else { + let result = ""; + while (child) { + result = result.concat(exports.printHtmlNode(child, printFunction, depth)); + child = child.nextSibling; + } + return result; + } +}; +exports.printHtmlChildren = printHtmlChildren; +const printHtmlNode = (node, printFunction, depth) => { + let result = ""; + if (printFunction) { + const customPrintout = printFunction(node); + if (customPrintout) { + return customPrintout; + } + } + switch (node.nodeType) { + case constants_1.TEXT_NODE: { + const text = utils_1.removeSpacesAndLinebreaks(node.textContent); + if (text.length) { + result += "<TEXT>"; + result += text; + result += "</TEXT>"; + result += "\n"; + } + break; + } + case constants_1.DOCUMENT_NODE: + result += exports.printHtmlChildren(node, printFunction, depth); + break; + case constants_1.ELEMENT_NODE: + result += "<" + node.nodeName; + Array.from(node.attributes) + .sort((a, b) => a.name.localeCompare(b.name)) + .forEach((attribute) => { + result += ` ${attribute.name}`; + if (attribute.value) { + result += `="${exports.escapeHtmlString(attribute.value)}"`; + } + }); + if (node.firstChild) { + result += ">"; + result += "\n"; + result += exports.printHtmlChildren(node, printFunction, depth + 1); + result += "</" + node.nodeName + ">"; + } + else { + result += "/>"; + } + result += "\n"; + break; + } + return result; +}; +exports.printHtmlNode = printHtmlNode; +const cleanupHtmlNodeAttributes = (node, cleanupElementAttributes) => { + if (node.nodeType === node.ELEMENT_NODE) { + cleanupElementAttributes(node); + } + let child = node.firstChild; + while (child) { + exports.cleanupHtmlNodeAttributes(child, cleanupElementAttributes); + child = child.nextSibling; + } +}; +exports.cleanupHtmlNodeAttributes = cleanupHtmlNodeAttributes; +const pruneHtmlNode = (node, pruneElement) => { + let toBeRemoved = false; + switch (node.nodeType) { + case node.COMMENT_NODE: + case node.DOCUMENT_TYPE_NODE: + toBeRemoved = true; + break; + case node.TEXT_NODE: { + const trimmedText = node.textContent.trim(); + if (trimmedText === "") { + toBeRemoved = true; + } + else { + node.textContent = trimmedText; + } + break; + } + case node.ELEMENT_NODE: + toBeRemoved = pruneElement(node); + } + if (toBeRemoved) { + return true; + } + const childrenToRemove = []; + let child = node.firstChild; + while (child) { + exports.pruneHtmlNode(child, pruneElement) && childrenToRemove.push(child); + child = child.nextSibling; + } + childrenToRemove.forEach((child) => node.removeChild(child)); + return false; +}; +exports.pruneHtmlNode = pruneHtmlNode; +const escapeHtmlString = (string) => { + const matchHtmlRegExp = /["'&<>]/; + const str = "" + string; + const match = matchHtmlRegExp.exec(str); + if (!match) { + return str; + } + let escape; + let html = ""; + let index = 0; + let lastIndex = 0; + for (let index = match.index; index < str.length; index++) { + switch (str.charCodeAt(index)) { + case 34: // " + escape = """; + break; + case 38: // & + escape = "&"; + break; + case 39: // ' + escape = "'"; + break; + case 60: // < + escape = "<"; + break; + case 62: // > + escape = ">"; + break; + default: + continue; + } + if (lastIndex !== index) { + html += str.substring(lastIndex, index); + } + lastIndex = index + 1; + html += escape; + } + return lastIndex !== index ? html + str.substring(lastIndex, index) : html; +}; +exports.escapeHtmlString = escapeHtmlString; diff --git a/dist/HTMLNormalizer/index.d.ts b/dist/HTMLNormalizer/index.d.ts new file mode 100644 index 0000000..41ae932 --- /dev/null +++ b/dist/HTMLNormalizer/index.d.ts @@ -0,0 +1,4 @@ +declare const _default: { + normalizeVendorHtml: (document: HTMLDocument, vendor: string) => string; +}; +export default _default; diff --git a/dist/HTMLNormalizer/index.js b/dist/HTMLNormalizer/index.js new file mode 100644 index 0000000..1034775 --- /dev/null +++ b/dist/HTMLNormalizer/index.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const HTMLNormalizer_1 = require("./HTMLNormalizer"); +exports.default = { + normalizeVendorHtml: HTMLNormalizer_1.normalizeVendorHtml, +}; diff --git a/dist/HTMLNormalizer/strategies/common.d.ts b/dist/HTMLNormalizer/strategies/common.d.ts new file mode 100644 index 0000000..15043d7 --- /dev/null +++ b/dist/HTMLNormalizer/strategies/common.d.ts @@ -0,0 +1,21 @@ +export declare const ELEMENT_TYPES_TO_REMOVE: { + br: boolean; + hr: boolean; + use: boolean; + svg: boolean; +}; +export declare const ATTRIBUTES_TO_KEEP: { + alt: boolean; + src: boolean; + cite: boolean; + data: boolean; + datetime: boolean; + href: boolean; + value: boolean; +}; +/** + * Decides whether node should be removed + * @param element + */ +export declare const pruneElement: (element: HTMLElement) => boolean; +export declare const cloneAnchorFromPane: (a: HTMLAnchorElement, pane: HTMLElement) => void; diff --git a/dist/HTMLNormalizer/strategies/common.js b/dist/HTMLNormalizer/strategies/common.js new file mode 100644 index 0000000..6901494 --- /dev/null +++ b/dist/HTMLNormalizer/strategies/common.js @@ -0,0 +1,51 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.cloneAnchorFromPane = exports.pruneElement = exports.ATTRIBUTES_TO_KEEP = exports.ELEMENT_TYPES_TO_REMOVE = void 0; +const DUMMY_QR_CODE_ID = "dummyQrCode"; +exports.ELEMENT_TYPES_TO_REMOVE = { br: true, hr: true, use: true, svg: true }; +exports.ATTRIBUTES_TO_KEEP = { + alt: true, + src: true, + cite: true, + data: true, + datetime: true, + href: true, + value: true, +}; +/** + * Removes dummy QR code from HTML + * @param element + */ +const isDummyQrCode = (element) => { + if (element.id === DUMMY_QR_CODE_ID) { + return true; + } +}; +/** + * Decides whether node should be removed + * @param element + */ +const pruneElement = (element) => { + if (isDummyQrCode(element)) { + return true; + } + if (element.nodeName.toLowerCase() === "div" && + element.childNodes.length === 0) { + return true; + } + return !!exports.ELEMENT_TYPES_TO_REMOVE[element.nodeName.toLowerCase()]; +}; +exports.pruneElement = pruneElement; +const cloneAnchorFromPane = (a, pane) => { + try { + const url = new URL(a.href); + // If this is external url + if (url.host && url.protocol) { + pane.parentNode.insertBefore(a.cloneNode(false), pane); + } + } + catch { + return; + } +}; +exports.cloneAnchorFromPane = cloneAnchorFromPane; diff --git a/dist/HTMLNormalizer/strategies/gmail.d.ts b/dist/HTMLNormalizer/strategies/gmail.d.ts new file mode 100644 index 0000000..3c4b5ba --- /dev/null +++ b/dist/HTMLNormalizer/strategies/gmail.d.ts @@ -0,0 +1,3 @@ +export declare const pruneGmailElement: (element: HTMLElement) => boolean; +export declare const amendGmailNodes: (document: HTMLDocument) => void; +export declare const cleanupGMailElementAttributes: (element: HTMLElement) => void; diff --git a/dist/HTMLNormalizer/strategies/gmail.js b/dist/HTMLNormalizer/strategies/gmail.js new file mode 100644 index 0000000..bb994ff --- /dev/null +++ b/dist/HTMLNormalizer/strategies/gmail.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.cleanupGMailElementAttributes = exports.amendGmailNodes = exports.pruneGmailElement = void 0; +const common_1 = require("./common"); +const pruneGmailElement = (element) => { + return common_1.pruneElement(element); +}; +exports.pruneGmailElement = pruneGmailElement; +const amendGmailNodes = (document) => { + /** + * Look for attachments panes and remove everything but liks + */ + const attachmentsPanes = Array.from(document.getElementsByClassName("gmail_chip")); + attachmentsPanes.forEach((pane) => { + const as = pane.querySelectorAll("a"); + as.forEach((a) => { + common_1.cloneAnchorFromPane(a, pane); + }); + }); + attachmentsPanes.forEach((pane) => { + pane.parentNode.removeChild(pane); + }); +}; +exports.amendGmailNodes = amendGmailNodes; +const cleanupGMailElementAttributes = (element) => { + if (element.attributes.length > 0) { + for (const attribute of element.attributes) { + if (attribute.name === "data-surl") { + element.setAttribute("src", attribute.value); + } + } + for (let i = 0; i < element.attributes.length; i++) { + const attribute = element.attributes[i]; + if (!common_1.ATTRIBUTES_TO_KEEP[attribute.name]) { + element.removeAttribute(attribute.name); + i--; + } + } + } +}; +exports.cleanupGMailElementAttributes = cleanupGMailElementAttributes; diff --git a/dist/HTMLNormalizer/strategies/outlook.d.ts b/dist/HTMLNormalizer/strategies/outlook.d.ts new file mode 100644 index 0000000..7221552 --- /dev/null +++ b/dist/HTMLNormalizer/strategies/outlook.d.ts @@ -0,0 +1,8 @@ +export declare const printOutlookElement: (node: Node) => string; +/** + * Returns true if element should be completely removed + * @param element + */ +export declare const pruneOutlookElement: (element: HTMLElement) => boolean; +export declare const amendOutlookNodes: (document: HTMLDocument) => void; +export declare const cleanupOutlookElementAttributes: (element: HTMLElement) => void; diff --git a/dist/HTMLNormalizer/strategies/outlook.js b/dist/HTMLNormalizer/strategies/outlook.js new file mode 100644 index 0000000..d31ae26 --- /dev/null +++ b/dist/HTMLNormalizer/strategies/outlook.js @@ -0,0 +1,137 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.cleanupOutlookElementAttributes = exports.amendOutlookNodes = exports.pruneOutlookElement = exports.printOutlookElement = void 0; +// TODO: Move this logic to amendOutlookNodes +const HTMLNormalizer_1 = require("../HTMLNormalizer"); +const constants_1 = require("../../constants"); +const common_1 = require("./common"); +const printOutlookElement = (node) => { + if (node.nodeType === constants_1.ELEMENT_NODE) { + if (node.classList.contains("WordSection1")) { + return HTMLNormalizer_1.printHtmlChildren(node, null, 0); + } + } +}; +exports.printOutlookElement = printOutlookElement; +/** + * Returns true if element should be completely removed + * @param element + */ +const pruneOutlookElement = (element) => { + if (common_1.pruneElement(element)) { + return true; + } + // Remove Outlook generic <o:*> tags + return !!element.nodeName.toLowerCase().startsWith("o:"); +}; +exports.pruneOutlookElement = pruneOutlookElement; +const amendOutlookNodes = (document) => { + /** + * Remove quoted text + */ + // Quoted text in web apps + const appendOnSend = document.querySelector("[id*='appendonsend']"); + if (appendOnSend) { + let child = appendOnSend; + while (child) { + const nextSibling = child.nextSibling; + child.parentNode.removeChild(child); + child = nextSibling; + } + } + // Quoted text in desktop apps + // let mailOriginal = document.querySelector("[name*='_MailOriginal']") as HTMLElement; + // if (mailOriginal) { + // let removeCurrent = true; + // while (mailOriginal !== document.body) { + // while (mailOriginal.nextSibling) { + // mailOriginal.nextSibling.remove(); + // } + // const currentNode = mailOriginal; + // mailOriginal = mailOriginal.parentElement; + // if (removeCurrent && currentNode.previousSibling) { + // currentNode.remove(); + // removeCurrent = false; + // } + // } + // } + // if (mailOriginal) { + // const separatorCandidate = mailOriginal.parentNode as Node; + // + // // while (!(separatorCandidate.parentNode as Element).classList.contains("WordSection1")) { + // // separatorCandidate = separatorCandidate.parentNode; + // // } + // + // let child = separatorCandidate; + // while (child) { + // const nextSibling = child.nextSibling; + // child.parentNode.removeChild(child); + // child = nextSibling as Node; + // } + // } + /** + * Get rid of attachments panes + */ + const attachmentsPanesContainer = document.getElementById("OwaReferenceAttachments"); + const attachmentsPanesContainerEnd = document.getElementById("OwaReferenceAttachmentsEnd"); + if (attachmentsPanesContainer) { + const as = attachmentsPanesContainer.getElementsByTagName("a"); + Array.from(as).forEach((a) => { + common_1.cloneAnchorFromPane(a, attachmentsPanesContainer); + }); + attachmentsPanesContainer.parentNode.removeChild(attachmentsPanesContainer); + } + attachmentsPanesContainerEnd && + attachmentsPanesContainerEnd.parentNode.removeChild(attachmentsPanesContainerEnd); + /** + * Unwind spans, because sometimes Outlook wraps everything into span after sending + */ + const spans = document.getElementsByTagName("span"); + //Sort spans by depth to start unwinding the deepest ones, which does not contain nested spans + const spansDepths = {}; + Array.from(spans).forEach((span) => { + let descendant = span; + let parent = descendant.parentNode; + let depth = 0; + while (parent && descendant !== parent) { + descendant = parent; + parent = descendant.parentNode; + depth++; + } + if (!spansDepths[depth]) { + spansDepths[depth] = []; + } + spansDepths[depth].push(span); + }); + Object.keys(spansDepths) + .sort((a, b) => parseInt(b) - parseInt(a)) + .forEach((depth) => { + spansDepths[depth].forEach((span) => { + let child = span.firstChild; + const parent = span.parentNode; + while (child) { + parent.insertBefore(child.cloneNode(true), span); + child = child.nextSibling; + } + span.parentNode.removeChild(span); + }); + }); +}; +exports.amendOutlookNodes = amendOutlookNodes; +const cleanupOutlookElementAttributes = (element) => { + if (element.attributes.length > 0) { + for (const attribute of element.attributes) { + let valueSplit = attribute.value.split(" "); + valueSplit = valueSplit.map((value) => value.startsWith("x_") ? value.replace("x_", "") : value); + element.setAttribute(attribute.name, valueSplit.join(" ")); + } + for (let i = 0; i < element.attributes.length; i++) { + const attribute = element.attributes[i]; + if (!common_1.ATTRIBUTES_TO_KEEP[attribute.name]) { + element.removeAttribute(attribute.name); + i--; + } + } + } +}; +exports.cleanupOutlookElementAttributes = cleanupOutlookElementAttributes; diff --git a/dist/constants.d.ts b/dist/constants.d.ts new file mode 100644 index 0000000..0fd8b9d --- /dev/null +++ b/dist/constants.d.ts @@ -0,0 +1,9 @@ +export declare const ELEMENT_NODE = 1; +export declare const TEXT_NODE = 3; +export declare const DOCUMENT_NODE = 9; +export declare const EMAIL_VENDORS: { + GMAIL: string; + OUTLOOK: string; + ROUNDCUBE: string; + GENERIC_MIME: string; +}; diff --git a/dist/constants.js b/dist/constants.js new file mode 100644 index 0000000..9b8e006 --- /dev/null +++ b/dist/constants.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.EMAIL_VENDORS = exports.DOCUMENT_NODE = exports.TEXT_NODE = exports.ELEMENT_NODE = void 0; +exports.ELEMENT_NODE = 1; +exports.TEXT_NODE = 3; +exports.DOCUMENT_NODE = 9; +exports.EMAIL_VENDORS = { + GMAIL: "GMAIL", + OUTLOOK: "OUTLOOK", + ROUNDCUBE: "ROUNDCUBE", + GENERIC_MIME: "GENERIC_MIME", +}; diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..32d700f --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,2 @@ +export { default as HTMLNormalizer } from "./HTMLNormalizer"; +export { default as PlainNormalizer } from "./PlainNormalizer"; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..a0275e2 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PlainNormalizer = exports.HTMLNormalizer = void 0; +var HTMLNormalizer_1 = require("./HTMLNormalizer"); +Object.defineProperty(exports, "HTMLNormalizer", { enumerable: true, get: function () { return HTMLNormalizer_1.default; } }); +var PlainNormalizer_1 = require("./PlainNormalizer"); +Object.defineProperty(exports, "PlainNormalizer", { enumerable: true, get: function () { return PlainNormalizer_1.default; } }); diff --git a/dist/utils.d.ts b/dist/utils.d.ts new file mode 100644 index 0000000..4a534c0 --- /dev/null +++ b/dist/utils.d.ts @@ -0,0 +1 @@ +export declare const removeSpacesAndLinebreaks: (s: string) => string; diff --git a/dist/utils.js b/dist/utils.js new file mode 100644 index 0000000..6a64db9 --- /dev/null +++ b/dist/utils.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.removeSpacesAndLinebreaks = void 0; +const removeSpacesAndLinebreaks = (s) => { + const regexNewlines = new RegExp(/[\r\n\v]+/g); + const regexSpaces = new RegExp(/\s+|\u200B/g); + return s.replace(regexNewlines, "").replace(regexSpaces, ""); +}; +exports.removeSpacesAndLinebreaks = removeSpacesAndLinebreaks; -- GitLab