/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠM oh amed ĠAl aa Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ @ file : Jvm Name (" Sp ann able Utils ") Ċ Ċ package Ġm oh amed al aa . ma utils . core _ android . extensions Ċ Ċ import Ġandroid . text . Sp ann able Ċ import Ġandroidx . core . text . set Ċ import Ġm oh amed al aa . ma utils . core _ kotlin . extensions . indexOf OrNull Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġ- ĠUses Ġ[ android x . core . text . set ] Ġfor Ġthe Ġwhole Ġ[ Sp ann able ] Ġisa . Ċ Ġ*/ Ċ operator Ġfun ĠSp ann able . plus Assign ( span : ĠAny ) Ġ{ ĊĠĠĠ Ġthis [ 0 .. length ] Ġ= Ġspan Ċ } Ċ Ċ /** Ċ Ġ* Ġ- ĠUses Ġ[ android x . core . text . set ] Ġfor Ġthe Ġ[ Char ] Ġat Ġprovided Ġ[ index ] Ġonly Ġisa . Ċ Ġ*/ Ċ operator Ġfun ĠSp ann able . set ( index : ĠInt , Ġspan : ĠAny ) Ġ{ ĊĠĠĠ Ġthis [ index .. ( index . inc ()) ] Ġ= Ġspan Ċ } Ċ Ċ /** Ċ Ġ* Ġ- ĠSame Ġas Ġ[ android x . core . text . set ] Ġfor Ġeach Ġspan Ġin Ġ[ spans List ] Ġisa . Ċ Ġ* Ġ``` Ċ Ġ* Ġsp ann able . span All ( 0 .. 3 , ĠlistOf ( Ċ Ġ* ĠĠĠĠĠ ĠFore ground Color Span ( Color . BLACK ), Ċ Ġ* ĠĠĠĠĠ ĠBackground Color Span ( Color . BLUE ) Ċ Ġ* Ġ)) Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ fun ĠSp ann able . span All ( range : ĠInt Range , Ġspans List : ĠList < Any >) Ġ{ ĊĠĠĠ Ġfor Ġ( span Ġin Ġspans List ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis [ range ] Ġ= Ġspan ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ- ĠUses Ġ[ android x . core . text . set ] Ġwhere Ġ[ Int Range . start ] Ġis Ġfirst Ġoccurrence Ġof Ġ[ string ] Ġin Ċ Ġ* Ġ` receiver ` Ġand Ġ Ġ[ Int Range . end Inclusive ] Ġ( which Ġis Ġactually Ġexclusive Ġdue Ġto Ġto Ġ[ Sp ann able . set Span ] Ġend Ġparam ) Ċ Ġ* Ġis Ġ[ Int Range . start ] Ġ+ Ġ[ String . length ] Ġisa . Ċ Ġ* Ċ Ġ* Ġ@ see ĠSp ann able . span All Ċ Ġ*/ Ċ operator Ġfun ĠSp ann able . set ( string : ĠString , Ġspan : ĠAny ) Ġ{ ĊĠĠĠ Ġval Ġstart Inclusive Ġ= ĠindexOf OrNull ( string ) Ġ?: Ġreturn ĊĠĠĠ Ġval Ġend Exclusive Ġ= Ġstart Inclusive Ġ+ Ġstring . length ĊĠĠĠ Ġthis [ start Inclusive .. end Exclusive ] Ġ= Ġspan Ċ } Ċ Ċ /** Ċ Ġ* Ġ- ĠSp ans Ġevey Ġchar Ġin Ġ[ string ] Ġby Ġreturned Ġvalue Ġof Ġ[ generate New Span ], Ċ Ġ* Ġif Ġconditions Ġof Ġ[ ignore Case ], Ġ[ all Chars ] Ġare Ġmet . Ċ Ġ* Ċ Ġ* Ġ@ param Ġstring Ġall Ġcharacters Ġthat Ġneed Ġto Ġbe Ġsp anned . Ċ Ġ* Ġ@ param Ġignore Case Ġif Ġtrue Ġthen Ġthe Ġsp anning Ġprocess Ġwill Ġbe Ġcase Ġsensitive , Ġdefault Ġis Ġfalse Ġisa . Ċ Ġ* Ġ@ param Ġall Chars Ġtrue Ġmeans Ġall Ġchars Ġin Ġ` receiver ` Ġwill Ġbe Ġsp anned Ġif Ġfound Ġinside Ġ[ string ], Ġdefault Ġis Ġtrue , Ċ Ġ* Ġwhile Ġfalse Ġmeans Ġthe Ġspan Ġwill Ġhappen Ġif Ġwhole Ġ[ string ] Ġis Ġin Ġ` receiver `, Ġsee Ġbelow Ġfor Ġmore Ġexplanation Ġisa . Ċ Ġ* ĠEx . Ġ" ab Ġac Ġab Ġac ". [ span Chars ](" ac ", Ġall Chars Ġ= Ġtrue , Ġ...) Ġthen Ġeach Ġ' a ' Ġ& Ġeach Ġ' c ' Ġin Ġreceiver Ġwill Ġbe Ġsp anned Ċ Ġ* Ġwhile Ġif Ġit Ġwas Ġfalse Ġ-> Ġthen Ġonly Ġeach Ġoccurrence Ġof Ġ" ac " Ġtogether Ġwill Ġbe Ġsp anned Ġso Ċ Ġ* Ġ' a ' Ġin Ġ" ab " Ġwon 't Ġbe Ġsp anned Ġisa . Ċ Ġ* Ċ Ġ* Ġ@ return Ġlist Ġof Ġindices Ġthat Ġgot Ġsp anned Ġisa . Ċ Ġ*/ Ċ @ Jvm Over loads Ċ fun ĠSp ann able . span Chars ( ĊĠĠĠ Ġstring : ĠString ?, ĊĠĠĠ Ġignore Case : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġall Chars : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġgenerate New Span : Ġ() Ġ-> ĠAny Ċ ): ĠList < Int > Ġ{ ĊĠĠĠ Ġif Ġ( string . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmodified String Ġ= Ġif Ġ( ignore Case ) Ġstring . toLowerCase ( Locale . getDefault ()) Ġelse Ġstring ĊĊĠĠĠ Ġif Ġ( all Chars ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmutable List Ġ= Ġmutable ListOf < Int >() ĊĊĠĠĠĠĠĠĠ ĠforEach Indexed Ġ{ Ġindex , Ġchar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodified Char Ġ= Ġif Ġ( ignore Case ) Ġchar . toLowerCase () Ġelse Ġchar ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( modified Char Ġin Ġmodified String ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ index ] Ġ= Ġgenerate New Span () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable List Ġ+= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmutable List ĊĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmutable List Ġ= Ġmutable ListOf < Int >() ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Sp ann able Ġ= Ġthis . toString () ĊĠĠĠĠĠĠĠ Ġvar ĠstartIndex Ġ= Ġcurrent Sp ann able . indexOf ( modified String , Ġignore Case Ġ= Ġignore Case ) ĊĠĠĠĠĠĠĠ Ġvar Ġtemp Counter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( startIndex Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Index Ġ= ĠstartIndex . plus ( modified String . length ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa 1 Ġ= Ġtemp Counter . plus ( startIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa 2 Ġ= Ġtemp Counter . plus ( end Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ a 1 .. a 2 ] Ġ= Ġgenerate New Span () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable List Ġ+= Ġa 1 Ġuntil Ġa 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Sp ann able Ġ= Ġif Ġ( end Index Ġ== Ġlength ) Ġreturn Ġmutable List Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Counter Ġ+= Ġend Index ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Sp ann able . substring ( end Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex Ġ= Ġcurrent Sp ann able . indexOf ( modified String , Ġignore Case Ġ= Ġignore Case ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmutable List ĊĠĠĠ Ġ} Ċ } ĊĊ