package Ġorg . wikipedia . edit . richt ext Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Sp anned Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroid . widget . EditText Ċ import Ġandroidx . core . widget . do After TextChanged Ċ import Ġio . reactivex . rx java 3 . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx java 3 . schedul ers . Schedulers Ċ import Ġorg . wikipedia . util . log . L Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Callable Ċ Ċ class ĠSyntax Highlight er ( private Ġvar Ġcontext : ĠContext , Ġval ĠtextBox : ĠEditText , Ġvar Ġsyntax Highlight Listener : ĠOn Syntax Highlight Listener ?) Ġ{ ĊĠĠĠ Ġconstructor ( context : ĠContext , ĠtextBox : ĠEditText ) Ġ: Ġthis ( context , ĠtextBox , Ġnull ) ĊĊĠĠĠ Ġinterface ĠOn Syntax Highlight Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsyntax Highlight Results ( span Ext ents : ĠList < Span Ext ents >) ĊĠĠĠĠĠĠĠ Ġfun Ġfind Text Matches ( span Ext ents : ĠList < Span Ext ents >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsyntax Rules Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSyntax Rule (" {{ ", Ġ" }} ", ĠSyntax Rule Style . TEMPLATE ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSyntax Rule (" [[ ", Ġ" ]] ", ĠSyntax Rule Style . INTERNAL _ LINK ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSyntax Rule ("[ ", Ġ" ]", ĠSyntax Rule Style . EXTERNAL _ LINK ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSyntax Rule ("< ", Ġ"> ", ĠSyntax Rule Style . REF ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSyntax Rule (" '' ''' ", Ġ" '' ''' ", ĠSyntax Rule Style . BOLD _ ITAL IC ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSyntax Rule (" ''' ", Ġ" ''' ", ĠSyntax Rule Style . BOLD ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSyntax Rule (" '' ", Ġ" '' ", ĠSyntax Rule Style . ITAL IC ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġvar Ġsearch Text : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġselected Match Result Position Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġhandler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠ Ġprivate Ġval Ġdis pos ables Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġa Ġtext - change Ġlistener Ġthat Ġwill Ġtrigger Ġsyntax Ġhighlighting ĊĠĠĠĠĠĠĠ Ġ// Ġwhenever Ġtext Ġis Ġmodified . ĊĠĠĠĠĠĠĠ ĠtextBox . do After TextChanged Ġ{ Ġpost Highlight Callback () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsyntax Highlight Callback : ĠRunnable Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcurrent Task : ĠSyntax Highlight Task ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsearch Task : ĠSyntax Highlight Search Matches Task ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Task ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Task Ġ= ĠSyntax Highlight Task ( textBox . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Task Ġ= ĠSyntax Highlight Search Matches Task ( textBox . text , Ġsearch Text , Ġselected Match Result Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis pos ables . add ( Observable . zip < Mutable List < Span Ext ents >, ĠList < Span Ext ents >, ĠList < Span Ext ents >>( Observable . from Callable ( current Task !! ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . from Callable ( search Task !! ), Ġ{ Ġf , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . addAll ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsyntax Highlight Listener ?. syntax Highlight Results ( result ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġprobably Ġpossible Ġto Ġmake Ġthis Ġmore Ġefficient ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRight Ġnow , Ġon Ġlonger Ġarticles , Ġthis Ġis Ġquite Ġheavy Ġon Ġthe ĠUI Ġthread . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġany Ġof Ġour Ġcustom Ġspans Ġfrom Ġthe Ġprevious Ġcycle ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Spans Ġ= ĠtextBox . text . get Spans ( 0 , ĠtextBox . text . length , ĠSpan Ext ents :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sp Ġin Ġprev Spans ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextBox . text . remove Span ( sp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfind Text List Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĠtextBox . text . set Span ( it , Ġit . start , Ġit . end , ĠSp anned . SPAN _ INCL USIVE _ INCL USIVE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . syntax Rule . span Style Ġ== ĠSyntax Rule Style . SEARCH _ MATCH ES Ġ} Ġ// Ġand Ġadd Ġour Ġnew Ġspans ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! search Text . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsyntax Highlight Listener ?. find Text Matches ( find Text List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠSystem . currentTimeMillis () Ġ- Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . d (" That Ġtook Ġ" Ġ+ Ġtime Ġ+ Ġ" ms ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĠL . e ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapply Find Text Syntax ( search Text : ĠString ?, Ġlistener : ĠOn Syntax Highlight Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . search Text Ġ= Ġsearch Text ĊĠĠĠĠĠĠĠ Ġsyntax Highlight Listener Ġ= Ġlistener ĊĠĠĠĠĠĠĠ ĠsetSelected Match Result Position ( 0 ) ĊĠĠĠĠĠĠĠ Ġpost Highlight Callback () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetSelected Match Result Position ( selected Match Result Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . selected Match Result Position Ġ= Ġselected Match Result Position ĊĠĠĠĠĠĠĠ Ġpost Highlight Callback () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost Highlight Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġqueue Ġup Ġsyntax Ġhighlighting . ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġuser Ġadds Ġmore Ġtext Ġwithin Ġ 1 / 2 Ġsecond , Ġthe Ġprevious Ġrequest ĊĠĠĠĠĠĠĠ Ġ// Ġis Ġcancelled , Ġand Ġa Ġnew Ġone Ġis Ġplaced . ĊĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( syntax Highlight Callback ) ĊĠĠĠĠĠĠĠ Ġhandler . post Delayed ( syntax Highlight Callback , Ġif Ġ( search Text . isNull OrEmpty ()) ĠDate Utils . SECOND _ IN _ M ILL IS Ġ/ Ġ 2 Ġelse Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcleanup () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( syntax Highlight Callback ) ĊĠĠĠĠĠĠĠ ĠtextBox . text . clear Spans () ĊĠĠĠĠĠĠĠ Ġdis pos ables . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠSyntax Highlight Task Ġconstructor ( private Ġval Ġtext : ĠEdit able ) Ġ: ĠCallable < Mutable List < Span Ext ents >> Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcancelled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancelled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠMutable List < Span Ext ents > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspan Stack Ġ= ĠStack < Span Ext ents >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspans To Set Ġ= Ġmutable ListOf < Span Ext ents >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġ( na Ã¯ ve ) Ġalgorithm : ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIterate Ġthrough Ġthe Ġtext Ġstring , Ġand Ġmaintain Ġa Ġstack Ġof Ġmatched Ġsyntax Ġrules . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWhen Ġthe Ġ" start " Ġand Ġ" end " Ġsymbol Ġof Ġa Ġrule Ġare Ġmatched Ġin Ġsequence , Ġcreate Ġa Ġnew ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSpan Ġto Ġbe Ġadded Ġto Ġthe ĠEditText Ġat Ġthe Ġcorresponding Ġlocation . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Span Info : ĠSpan Ext ents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġincrement Done Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( syntax Item Ġin Ġsyntax Rules ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ+ Ġsyntax Item . start Symbol . length Ġ> Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( syntax Item . is Start End Same ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpass Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġsyntax Item . start Symbol . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text [ i Ġ+ Ġj ] Ġ!= Ġsyntax Item . start Symbol [ j ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pass ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( span Stack . size Ġ> Ġ 0 Ġ&& Ġspan Stack . peek (). syntax Rule Ġ== Ġsyntax Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Span Info Ġ= Ġspan Stack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Span Info . end Ġ= Ġi Ġ+ Ġsyntax Item . start Symbol . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspans To Set . add ( new Span Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsp Ġ= Ġsyntax Item . span Style . create Span ( context , Ġi , Ġsyntax Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspan Stack . push ( sp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġsyntax Item . start Symbol . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Done Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpass Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġsyntax Item . start Symbol . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text [ i Ġ+ Ġj ] Ġ!= Ġsyntax Item . start Symbol [ j ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pass ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsp Ġ= Ġsyntax Item . span Style . create Span ( context , Ġi , Ġsyntax Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspan Stack . push ( sp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġsyntax Item . start Symbol . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Done Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskip Ġthe Ġcheck Ġof Ġend Ġsymbol Ġwhen Ġstart Ġsymbol Ġis Ġfound Ġat Ġend Ġof Ġthe Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ+ Ġsyntax Item . start Symbol . length Ġ> Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġsyntax Item . end Symbol . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text [ i Ġ+ Ġj ] Ġ!= Ġsyntax Item . end Symbol [ j ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pass ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( span Stack . size Ġ> Ġ 0 Ġ&& Ġspan Stack . peek (). syntax Rule Ġ== Ġsyntax Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Span Info Ġ= Ġspan Stack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Span Info . end Ġ= Ġi Ġ+ Ġsyntax Item . end Symbol . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspans To Set . add ( new Span Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġsyntax Item . end Symbol . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Done Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! increment Done ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġspans To Set ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠSyntax Highlight Search Matches Task Ġconstructor ( text : ĠEdit able , Ġsearch Text : ĠString ?, Ġprivate Ġval Ġselected Match Result Position : ĠInt ) Ġ: ĠCallable < List < Span Ext ents >> Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsearch Text Ġ= Ġsearch Text . or Empty (). lowercase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Ġ= Ġtext . toString (). lowercase ( Locale . getDefault ()) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠList < Span Ext ents > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspans To Set Ġ= Ġmutable ListOf < Span Ext ents >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Text . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġspans To Set ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsyntax Item Ġ= ĠSyntax Rule ("", Ġ"", ĠSyntax Rule Style . SEARCH _ MATCH ES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġposition Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmatches Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġtext . indexOf ( search Text , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Span Info Ġ= Ġif Ġ( matches Ġ== Ġselected Match Result Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSyntax Rule Style . SEARCH _ MATCH _ SELECTED . create Span ( context , Ġposition , Ġsyntax Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSyntax Rule Style . SEARCH _ MATCH ES . create Span ( context , Ġposition , Ġsyntax Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Span Info . start Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Span Info . end Ġ= Ġposition Ġ+ Ġsearch Text . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspans To Set . add ( new Span Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ+= Ġsearch Text . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatches ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( position Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġspans To Set ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ