/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠRead ium ĠFoundation . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠBSD - style Ġlicense Ċ Ġ* Ġavailable Ġin Ġthe Ġtop - level ĠLICENSE Ġfile Ġof Ġthe Ġproject . Ċ Ġ*/ Ċ Ċ package Ġorg . read ium . r 2 . navigator . ep ub Ċ Ċ import Ġandroid . graphics . PointF Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġorg . read ium . r 2 . navigator .* Ċ import Ġorg . read ium . r 2 . navigator . ep ub . extensions . javascript For Group Ċ import Ġorg . read ium . r 2 . navigator . html . Html Decoration Templates Ċ import Ġorg . read ium . r 2 . navigator . util . create ViewModel Factory Ċ import Ġorg . read ium . r 2 . shared . publication . Link Ċ import Ġkotlin . reflect . K Class Ċ Ċ @ Opt In ( Experimental Decorator :: class ) Ċ internal Ġclass ĠE pub Navigator ViewModel ( ĊĠĠĠ Ġval Ġdecoration Templates : ĠHtml Decoration Templates Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠRun Script Command ( val Ġscript : ĠString , Ġval Ġscope : ĠScope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsealed Ġclass ĠScope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠCurrent Resource Ġ: ĠScope () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠLoaded Resources Ġ: ĠScope () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠResource ( val Ġhref : ĠString ) Ġ: ĠScope () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġclass ĠWebView ( val ĠwebView : ĠR 2 Basic WebView ) Ġ: ĠScope () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Resource Loaded ( link : ĠLink ?, ĠwebView : ĠR 2 Basic WebView ): ĠRun Script Command Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemplates Ġ= Ġdecoration Templates . toJSON (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ("\\ n ", Ġ" Ġ") ĊĠĠĠĠĠĠĠ Ġvar Ġscript Ġ= Ġ" read ium . register Decoration Templates ($ templates );\ n " ĊĊĠĠĠĠĠĠĠ Ġif Ġ( link Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( group , Ġdecor ations ) Ġin Ġdecor ations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġdecor ations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . locator . href Ġ== Ġlink . href Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠDecor ation Change . Added ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Script Ġ= Ġchanges . javascript For Group ( group , Ġdecoration Templates ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ġ+= Ġ"$ group Script \ n " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRun Script Command ( script , Ġscope Ġ= ĠRun Script Command . Scope . WebView ( web View )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSelection ĊĊĠĠĠ Ġfun Ġclear Selection (): ĠRun Script Command Ġ= ĊĠĠĠĠĠĠĠ ĠRun Script Command ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" window . getSelection (). removeAll Ranges (); ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= ĠRun Script Command . Scope . Current Resource ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠDecor ations ĊĊĠĠĠ Ġ/** ĠCurrent Ġdecor ations , Ġindexed Ġby Ġthe Ġgroup Ġname . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdecor ations : ĠMutable Map < String , ĠList < Decoration >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠDecor ation . Style > Ġsupports Decoration Style ( style : ĠK Class < T >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġdecoration Templates . styles . containsKey ( style ) ĊĊĠĠĠ Ġsuspend Ġfun Ġapply Decor ations ( decor ations : ĠList < Decoration >, Ġgroup : ĠString ): ĠList < Run Script Command > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġthis . decor ations [ group ] Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġdecor ations . toList () ĊĠĠĠĠĠĠĠ Ġthis . decor ations [ group ] Ġ= Ġtarget ĊĊĠĠĠĠĠĠĠ Ġval Ġcmds Ġ= Ġmutable ListOf < Run Script Command >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( target . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmds . add ( Run Script Command ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġupdates Ġcommand Ġare Ġusing Ġ` request AnimationFrame ()`, Ġso Ġwe Ġneed Ġit Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` clear ()` Ġas Ġwell Ġotherwise Ġwe Ġmight Ġrecreate Ġa Ġhighlight Ġafter Ġit Ġhas Ġbeen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcleared . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" request AnimationFrame ( function Ġ() Ġ{ Ġread ium . get Decor ations ('$ group '). clear (); Ġ}); ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Ġ= ĠRun Script Command . Scope . Loaded Resources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( href , Ġchanges ) Ġin Ġsource . changes By Href ( target )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscript Ġ= Ġchanges . javascript For Group ( group , Ġdecoration Templates ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmds . add ( Run Script Command ( script , Ġscope Ġ= ĠRun Script Command . Scope . Resource ( href ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcmds ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠDecor ation Ġgroup Ġlisteners , Ġindexed Ġby Ġthe Ġgroup Ġname . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdecoration Listeners : ĠMutable Map < String , ĠList < Decor able Navigator . Listener >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġfun Ġadd Decoration Listener ( group : ĠString , Ġlistener : ĠDecor able Navigator . Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlisteners Ġ= Ġdecoration Listeners [ group ] Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġdecoration Listeners [ group ] Ġ= Ġlisteners Ġ+ Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Decoration Listener ( listener : ĠDecor able Navigator . Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ(( group , Ġlisteners ) Ġin Ġdecoration Listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecoration Listeners [ group ] Ġ= Ġlisteners . filter Ġ{ Ġit Ġ!= Ġlistener Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Decoration Activated ( id : ĠDecor ation Id , Ġgroup : ĠString , Ġrect : ĠRect F , Ġpoint : ĠPoint F ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlisteners Ġ= Ġdecoration Listeners [ group ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġdecoration Ġ= Ġdecor ations [ group ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . first OrNull Ġ{ Ġit . id Ġ== Ġid Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠDecor able Navigator . On Activated Event ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecoration Ġ= Ġdecoration , Ġgroup Ġ= Ġgroup , Ġrect Ġ= Ġrect , Ġpoint Ġ= Ġpoint ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( listener Ġin Ġlisteners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( listener . on Decoration Activated ( event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Factory ( decoration Templates : ĠHtml Decoration Templates ) Ġ= Ġcreate ViewModel Factory Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠE pub Navigator ViewModel ( decoration Templates ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }