/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġquote Parser Ċ Ċ import Ġquote Parser . features .* Ċ import Ġjava . io . File Ċ import Ġjavax . mail . internet . Mime Message Ċ Ċ private Ġenum Ġclass ĠRelation () Ġ{ ĊĠĠĠ ĠHEADER _ LINES _ FIRST , ĊĠĠĠ ĠQU OTE _ MARK _ FIRST , ĊĠĠĠ ĠQU OTE _ MARK _ IN _ HEADER _ LINES Ċ } Ċ Ċ private Ġfun Ġget Relation ( start Header Lines Index : ĠInt , Ġend Header Lines Index : ĠInt , Ġquote Mark Index : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquote Mark Index Ġ< Ġstart Header Lines Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . QUOTE _ MARK _ FIRST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquote Mark Index Ġ> Ġend Header Lines Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . HEADER _ LINES _ FIRST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . QUOTE _ MARK _ IN _ HEADER _ LINES ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġfun Ġis Text Between ( startIndex : ĠInt , Ġend Index : ĠInt , Ġmatching Lines : ĠList < Quote Mark Matching Result >) Ġ= ĊĠĠĠĠĠĠĠ Ġ( startIndex Ġ+ Ġ 1 .. end Index Ġ- Ġ 1 ). any () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines [ it ] Ġ== ĠQuote Mark Matching Result . NOT _ EMPTY ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġfun Ġis Quoted Text Between ( startIndex : ĠInt , Ġend Index : ĠInt , Ġmatching Lines : ĠList < Quote Mark Matching Result >) Ġ= ĊĠĠĠĠĠĠĠ Ġ( startIndex Ġ+ Ġ 1 .. end Index Ġ- Ġ 1 ). any () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines [ it ] Ġ== ĠQuote Mark Matching Result . V _ NOT _ EMPTY ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ private Ġfun Ġis Quote Marks Around Header Lines ( start Header Lines Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Header Lines Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Mark Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines : ĠList < Quote Mark Matching Result >): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġheader Lines Contains Quote Marks Ġ= Ġ( start Header Lines Index .. end Header Lines Index ). all () Ġ{ ĊĠĠĠĠĠĠĠ Ġmatching Lines [ it ]. has Quote Mark () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( header Lines Contains Quote Marks ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġfor Ġ( i Ġin Ġend Header Lines Index Ġ+ Ġ 1 .. quote Mark Index ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( matching Lines [ i ]. has Quote Mark ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( matching Lines [ i ] Ġ== ĠQuote Mark Matching Result . NOT _ EMPTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġparser Ġto Ġseparate Ġa Ġquote Ġfrom Ġuseful Ġemail Ġcontent . Ċ Ġ* ĠĊ Ġ* ĠTo Ġinstantiate Ġthis Ġclass Ġuse Ġ[ Quote Parser . Builder ]. ĠĠĠĠĠĠ Ċ Ġ* ĠTyp ical Ġusage : Ġcreate Ġ** Quote Parser ** Ġinstance Ġwith Ġ[ builder ][ Quote Parser . Builder ] Ċ Ġ* Ġand Ġcall Ġits Ġ[ parse () ][ Quote Parser . parse ] Ġmethod Ġeither Ġwith Ġfile Ġor Ġlist Ġof Ġstrings . Ċ Ġ* ĠĊ Ġ* ĠFor Ġnow Ġit Ġworks Ġonly Ġwith Ġ* text / plain * ĠMIME Ġtype . ĠĊ Ġ*/ Ċ class ĠQuote Parser Ġprivate Ġconstructor ( builder : ĠBuilder ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdelete Quote Marks : ĠBoolean ĊĠĠĠ Ġprivate Ġval Ġrecursive : ĠBoolean ĊĊĠĠĠ Ġprivate Ġval Ġquote Mark Feature : ĠQuote Mark Feature ĊĠĠĠ Ġprivate Ġval Ġquote Header Lines Parser : ĠQuote Header Lines Parser ĊĠĠĠ Ġprivate Ġval Ġquote Mark Parser : ĠQuote Mark Parser ĊĊĠĠĠ Ġprivate Ġvar Ġlines : ĠList < String > Ġ= ĠlistOf () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilder Ġfor Ġ[ Quote Parser ] Ġclass . ĊĠĠĠĠ Ġ* ĠĊĠĠĠĠ Ġ* ĠAll Ġcustom izable Ġparameters Ġhave Ġthe Ġdefault Ġvalue . ĊĠĠĠĠ Ġ* ĠIn Ġmost Ġcases Ġyou Ġdo Ġnot Ġneed Ġto Ġmodify Ġthem . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġheader Lines Count : ĠInt Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġmulti Line Header Lines Count : ĠInt Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġmax Quote Blocks Count : ĠInt Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġminimum Quote BlockSize : ĠInt Ġ= Ġ 7 ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġdelete Quote Marks : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġrecursive : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġinternal Ġvar Ġkey Ph rases : ĠList < String > Ġ= ĠKey Ph rases . default ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMaximum Ġnumber Ġof Ġlines Ġgoing Ġone Ġafter Ġanother Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentify Ġkey Ġfeatures Ġof Ġthe Ġquote . ĠDefault Ġ= Ġ 3 . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġheader Lines Count ( value : ĠInt ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . header Lines Count Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMaximum Ġnumber Ġof Ġlines Ġgoing Ġone Ġafter Ġanother Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġcheck Ġ[ Middle Colon Feature ]. ĠUsed Ġin Ġmultiline ĠĊĠĠĠĠĠĠĠĠ Ġ* Ġheaders Ġof Ġthe Ġquote . ĠDefault Ġ= Ġ 6 . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġmulti Line Header Lines Count ( value : ĠInt ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . multi Line Header Lines Count Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMaximum Ġnumber Ġof Ġblocks Ġmarked Ġwith Ġ' >' Ġsymbol . ĠĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthis Ġnumber Ġis Ġexceeded Ġthen Ġall Ġquote Ġmarks Ġ( >) ĊĠĠĠĠĠĠĠĠ Ġ* Ġare Ġignored . ĠDefault Ġ= Ġ 3 . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġmax Quote Blocks Count ( value : ĠInt ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . max Quote Blocks Count Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMinimum Ġnumber Ġof Ġlines Ġgoing Ġone Ġafter Ġanother Ġwith Ġmark Ġ' >' Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġidentify Ġquote Ġblock . ĠIf Ġthe Ġreal Ġnumber Ġis Ġbelow Ġthan Ġspecified ĊĠĠĠĠĠĠĠĠ Ġ* Ġthen Ġin Ġmost Ġcases Ġit Ġis Ġnot Ġa Ġreal Ġquote . ĠDefault Ġ= Ġ 7 . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġminimum Quote BlockSize ( value : ĠInt ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . minimum Quote BlockSize Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSpecify Ġwhether Ġquote Ġmarks Ġ( >) Ġshould Ġbe Ġdeleted Ġfrom Ġthe Ġoriginal ĊĠĠĠĠĠĠĠĠ Ġ* Ġemail . ĠDefault Ġ= Ġtrue . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġdelete Quote Marks ( value : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . delete Quote Marks Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSpecify Ġwhether Ġto Ġanalyze Ġthe Ġnested Ġcit ations . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġset Ġtrue Ġthen Ġ[ delete Quote Marks ] Ġmust Ġalso Ġbe Ġtrue . ĠĊĠĠĠĠĠĠĠĠ Ġ* ĠIt Ġis Ġimpossible Ġto Ġparse Ġnested Ġcit ations Ġwithout Ġdeleting Ġ' >'. ĊĠĠĠĠĠĠĠĠ Ġ* ĠDefault Ġ= Ġfalse . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġrecursive ( value : ĠBoolean ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . recursive Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ĠUser Ġcan Ġspecify Ġlist Ġof Ġregex es Ġdefining Ġa Ġquote Ġbeginning . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ĠIf Ġany Ġof Ġthe Ġregex Ġfrom Ġthe Ġlist Ġis Ġmatched Ġthen Ġquote Ġis Ġdefined . ĠĊĠĠĠĠĠĠĠĠ Ġ* Ġ ĠDefault Ġ= Ġ[ Key Ph rases . default ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ@ param Ġvalue Ġlist Ġof Ġthe Ġuser Ġdefined Ġregex es ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġkey Ph rases ( value : ĠList < String >): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . key Ph rases Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠQuote Parser Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠQuote Parser ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild ( init : ĠBuilder . () Ġ-> ĠUnit ): ĠQuote Parser Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . init () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠQuote Parser ( builder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . delete Quote Marks Ġ= Ġbuilder . delete Quote Marks ĊĠĠĠĠĠĠĠ Ġthis . recursive Ġ= Ġbuilder . recursive ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! this . delete Quote Marks Ġ&& Ġthis . recursive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Can 't Ġperform Ġrecursive Ġparsing Ġwithout Ġdeleting Ġ' >' ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . quote Mark Feature Ġ= ĠQuote Mark Feature () ĊĠĠĠĠĠĠĠ Ġthis . quote Header Lines Parser Ġ= ĠQuote Header Lines Parser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Lines Count Ġ= Ġbuilder . header Lines Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmulti L In e Header Lines Count Ġ= Ġbuilder . multi Line Header Lines Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ph rases Ġ= Ġbuilder . key Ph rases ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġthis . quote Mark Parser Ġ= ĠQuote Mark Parser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Quote Blocks Count Ġ= Ġbuilder . max Quote Blocks Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminimum Quote BlockSize Ġ= Ġbuilder . minimum Quote BlockSize ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParse Ġthe Ġgiven Ġfile Ġto Ġseparate Ġa Ġquote Ġfrom Ġthe Ġuseful Ġcontent . ĠĠĠ ĊĠĠĠĠ Ġ* ĠWorks Ġonly Ġwith Ġ* text / plain * ĠMIME Ġtype . ĊĠĠĠĠ Ġ* ĠĊĠĠĠĠ Ġ* Ġ@ param Ġem l File Ġa Ġfile Ġin Ġthe ĠE ML Ġformat ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Content ] Ġobject ĊĠĠĠĠ Ġ* Ġ@ throws ĠParseException Ġif Ġthe Ġemail Ġdoes Ġnot Ġcontain Ġtext / plain Ġpart ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġparse ( eml File : ĠFile ): ĠContent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmsg : ĠMime Message Ġ= Ġget Mime Message ( eml File ) ĊĠĠĠĠĠĠĠ Ġval Ġemail Text : ĠString Ġ= Ġget Email Text ( msg ) ĊĠĠĠĠĠĠĠ Ġreturn Ġparse ( email Text . lines (), Ġcontain In Reply To Header ( msg )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParse Ġgiven Ġlist Ġof Ġstrings Ġto Ġseparate Ġa Ġquote Ġfrom Ġthe Ġuseful Ġcontent . ĊĠĠĠĠ Ġ* ĠWorks Ġonly Ġwith Ġ* text / plain * ĠMIME Ġtype . ĊĠĠĠĠ Ġ* ĠĊĠĠĠĠ Ġ* Ġ* has In Reply To EML Header * Ġdefines Ġif Ġemail Ġcontains Ġ* In - Reply - To * Ġheader ĠĊĠĠĠĠ Ġ* Ġor Ġ* References * Ġheader . ĠIf Ġset Ġto Ġtrue Ġthen Ġwe aken ed Ġcriteria Ġare Ġused . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlines Ġlist Ġof Ġstrings Ġwith Ġemail Ġcontent . ĠStrings Ġmust Ġbe Ġrepresented Ġas Ġa Ġplain Ġtext . ĊĠĠĠĠ Ġ* Ġ@ param Ġhas In Reply To EML Header Ġdefines Ġif Ġemail Ġcontains ĠIn - Reply - To Ġheader Ġor ĠReferences Ġheader . ĠDefault Ġ= Ġtrue ĠĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Content ] Ġobject ĊĠĠĠĠ Ġ* Ġ@ see Ġcontain In Reply To Header ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġparse ( lines : ĠList < String >, Ġhas In Reply To EML Header : ĠBoolean Ġ= Ġtrue ): ĠContent Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . lines Ġ= Ġlines ĊĊĠĠĠĠĠĠĠ Ġval Ġmatching Lines Ġ= Ġthis . quote Mark Feature . match Lines ( this . lines ) ĊĠĠĠĠĠĠĠ Ġval Ġheader Lines Indexes Ġ= Ġthis . quote Header Lines Parser . parse ( this . lines , Ġmatching Lines ) ĊĠĠĠĠĠĠĠ Ġval Ġquote Mark Index Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġcondition Ġmeans : Ġfor ĠE ML s Ġwithout ĠIn - Reply - To Ġheader Ġor ĠReferences Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsearch Ġfor Ġquot ation Ġmarks ( >) Ġonly Ġif Ġquote Header Lines Ġis Ġnull . ĠIt Ġworks Ġwell Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġtest Ġdata , Ġbut Ġit Ġis Ġweird .. Ġbecause Ġit Ġskip s Ġquot ation Ġmarks Ġmost Ġof Ġthe Ġtime . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAs Ġalternative Ġthis Ġcondition Ġmay Ġbe Ġdeleted , Ġbut Ġit Ġworks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġworse Ġwith Ġsome Ġcases ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has In Reply To EML Header Ġ&& Ġheader Lines Indexes Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . quote Mark Parser . parse ( this . lines , Ġmatching Lines ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Lines Indexes Ġ== Ġnull Ġ&& Ġquote Mark Index Ġ== Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠContent ( lines , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Lines Indexes Ġ!= Ġnull Ġ&& Ġquote Mark Index Ġ== Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . create Content ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Lines Indexes . first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Lines Indexes . second Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Lines Indexes Ġ== Ġnull Ġ&& Ġquote Mark Index Ġ!= Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . create Content ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Mark Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines Ġ= Ġmatching Lines ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWithout Ġthis Ġcondition Ġsmart Ġcast Ġdoesn 't Ġwork . ĊĠĠĠĠĠĠĠ Ġif Ġ( header Lines Indexes Ġ== Ġnull Ġ|| Ġquote Mark Index Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Never Ġgets Ġhere ") ĊĊĠĠĠĠĠĠĠ Ġval Ġstart Header Lines Index Ġ= Ġheader Lines Indexes . first ĊĠĠĠĠĠĠĠ Ġval Ġend Header Line Index Ġ= Ġheader Lines Indexes . second ĊĊĠĠĠĠĠĠĠ Ġval Ġrelation Ġ= Ġget Relation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Header Lines Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Header Line Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Mark Index ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( relation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . QUOTE _ MARK _ IN _ HEADER _ LINES Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . create Content ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Header Lines Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Header Line Index Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . QUOTE _ MARK _ FIRST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . getContent Quote Mark First Case ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Header Lines Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Header Line Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Mark Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRelation . HEADER _ LINES _ FIRST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . getContent Header Lines First Case ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Header Lines Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Header Line Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Mark Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetContent Header Lines First Case ( start Header Lines Index : ĠInt , Ġend Header Line Index : ĠInt , Ġquote Mark Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines : ĠList < Quote Mark Matching Result >): ĠContent Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġis Text Between Ġ= Ġis Text Between ( end Header Line Index , Ġquote Mark Index , Ġmatching Lines ) ĊĠĠĠĠĠĠĠ Ġval Ġis Quote Marks Around Header Lines Ġ= Ġis Quote Marks Around Header Lines ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Header Lines Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Header Line Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Mark Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Text Between Ġ&& Ġ! is Quote Marks Around Header Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" Relation Ġ= Ġ${ Relation . HEADER _ LINES _ FIRST }. ĠBoth Ġis Text Between Ġand Ġis Header Lines Has Quote Mark Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" are Ġfalse , Ġbut Ġit Ġcan 't Ġbe !" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( msg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Text Between Ġ&& Ġis Quote Marks Around Header Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . create Content ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Mark Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines Ġ= Ġmatching Lines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . create Content ( start Header Lines Index , Ġend Header Line Index Ġ+ Ġ 1 , Ġmatching Lines ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetContent Quote Mark First Case ( start Header Lines Index : ĠInt , Ġend Header Line Index : ĠInt , Ġquote Mark Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines : ĠList < Quote Mark Matching Result >): ĠContent Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġis Text Between Ġ= Ġis Text Between ( quote Mark Index , Ġstart Header Lines Index , Ġmatching Lines ) ĊĠĠĠĠĠĠĠ Ġval Ġis Quoted Text Between Ġ= Ġis Quoted Text Between ( quote Mark Index , Ġstart Header Lines Index , Ġmatching Lines ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Text Between ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġstart Header Lines Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ> Ġ 0 Ġ&& Ġmatching Lines [ i Ġ- Ġ 1 ] Ġ!= ĠQuote Mark Matching Result . NOT _ EMPTY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- i ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 0 Ġ|| Ġmatching Lines . sub List ( i , Ġthis . lines . size ). any () Ġ{ Ġit . has Quote Mark () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" Relation Ġ= Ġ${ Relation . QUOTE _ MARK _ FIRST }. ĠFound Ġquote Mark ( >), Ġbut Ġin Ġthe Ġlines Ġafter Ġ${ i Ġ- Ġ 1 } Ġmust Ġnot Ġbe Ġany Ġquote Ġmark !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . create Content ( start Header Lines Index , Ġend Header Line Index Ġ+ Ġ 1 , Ġmatching Lines ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Quoted Text Between ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . create Content ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Mark Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines Ġ= Ġmatching Lines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar ĠstartIndex Ġ= Ġstart Header Lines Index ĊĠĠĠĠĠĠĠ Ġif Ġ( matching Lines . sub List ( start Header Lines Index , Ġend Header Line Index Ġ+ Ġ 1 ). all Ġ{ Ġit . has Quote Mark () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( startIndex Ġ> Ġ 0 Ġ&& Ġmatching Lines [ startIndex Ġ- Ġ 1 ]. has Quote Mark ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- startIndex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . create Content ( startIndex , Ġend Header Line Index Ġ+ Ġ 1 , Ġmatching Lines ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcreate Content ( from Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Index : ĠInt Ġ= Ġfrom Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines : ĠList < Quote Mark Matching Result >): ĠContent Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . delete Quote Marks ( from Index , Ġto Index , Ġmatching Lines ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! this . recursive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . lines . sub List ( 0 , Ġfrom Index ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuote Header ( from Index , Ġto Index , Ġthis . lines . sub List ( from Index , Ġto Index )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . lines . sub List ( to Index , Ġthis . lines . last Index Ġ+ Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . lines . sub List ( 0 , Ġfrom Index ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuote Header ( from Index , Ġto Index , Ġthis . lines . sub List ( from Index , Ġto Index )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . parse ( this . lines . sub List ( to Index , Ġthis . lines . last Index Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Quote Marks ( from Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Index : ĠInt Ġ= Ġfrom Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Lines : ĠList < Quote Mark Matching Result >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . delete Quote Marks Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( from Index Ġ== Ġto Index Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Quote Mark Suggestion ( to Index , Ġthis . lines , Ġmatching Lines ))) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . lines Ġ= Ġthis . lines . map Indexed Ġ{ Ġi , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġs . trim Start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ>= Ġfrom Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . startsWith ("> Ġ") Ġ-> Ġline . drop ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline . startsWith (' >') Ġ-> Ġline . drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ