/* Ċ Ġ* ĠModule : Ġr 2 - shared - kotlin Ċ Ġ* ĠDevelopers : ĠM ick a Ã« l ĠMenu Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 . ĠRead ium ĠFoundation . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġa ĠBSD - style Ġlicense Ġwhich Ġis Ġdetailed Ġin Ġthe Ċ Ġ* ĠLICENSE Ġfile Ġpresent Ġin Ġthe Ġproject Ġrepository Ġwhere Ġthis Ġsource Ġcode Ġis Ġmaintained . Ċ Ġ*/ Ċ Ċ package Ġorg . read ium . r 2 . streamer . parser . read ium Ċ Ċ import Ġorg . read ium . r 2 . shared . Pdf Support Ċ import Ġorg . read ium . r 2 . shared . fetcher . Fetcher Ċ import Ġorg . read ium . r 2 . shared . util . medi atype . MediaType Ċ import Ġorg . read ium . r 2 . shared . publication . Link Ċ import Ġorg . read ium . r 2 . shared . publication . Locator Ċ import Ġorg . read ium . r 2 . shared . publication . Publication Ċ import Ġorg . read ium . r 2 . shared . publication . services . Positions Service Ċ import Ġorg . read ium . r 2 . shared . util . pdf . Pdf Document Factory Ċ import Ġorg . read ium . r 2 . shared . util . pdf . Pdf Document Ċ import Ġtim ber . log . Tim ber Ċ Ċ /** Ċ Ġ* ĠCreates Ġthe Ġ[ positions ] Ġfor Ġan ĠL CP Ġprotected ĠPDF Ġ[ Publication ] Ġfrom Ġits Ġ[ reading Order ] Ġand Ċ Ġ* Ġ[ fetcher ]. Ċ Ġ*/ Ċ @ Opt In ( Pdf Support :: class ) Ċ internal Ġclass ĠL cp df Positions Service ( ĊĠĠĠ Ġprivate Ġval Ġpdf Factory : ĠPdf Document Factory , ĊĠĠĠ Ġprivate Ġval Ġreading Order : ĠList < Link >, ĊĠĠĠ Ġprivate Ġval Ġfetch er : ĠFetch er Ċ ) Ġ: ĠPosition s Service Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġposition sBy Reading Order (): ĠList < List < Locator >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! ::_ positions . isInitialized ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ positions Ġ= Ġcompute Positions () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ_ positions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġ_ positions : ĠList < List < Locator >> ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcompute Positions (): ĠList < List < Locator >> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCalculates Ġthe Ġpage Ġcount Ġof Ġeach Ġresource Ġfrom Ġthe Ġreading Ġorder . ĊĠĠĠĠĠĠĠ Ġval Ġresources : ĠList < Pair < Int , ĠLink >> Ġ= Ġreading Order . map Ġ{ Ġlink Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Count Ġ= Ġopen Pdf At ( link )?. page Count Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( page Count , Ġlink ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtotal Page Count Ġ= Ġresources . sum By Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( total Page Count Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġlast Position Of Previous Resource Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġresources . map Ġ{ Ġ( page Count , Ġlink ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpositions Ġ= Ġcreate Positions Of ( link , Ġpage Count Ġ= Ġpage Count , Ġtotal Page Count Ġ= Ġtotal Page Count , ĠstartPosition Ġ= Ġlast Position Of Previous Resource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Position Of Previous Resource Ġ+= Ġpage Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositions ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Positions Of ( link : ĠLink , Ġpage Count : ĠInt , Ġtotal Page Count : ĠInt , ĠstartPosition : ĠInt ): ĠList < Locator > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( page Count Ġ<= Ġ 0 Ġ|| Ġtotal Page Count Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠFIXME : ĠUse Ġthe Ġ[ table Of Contents ] Ġto Ġgenerate Ġthe Ġtitles ĊĠĠĠĠĠĠĠ Ġreturn Ġ( 1 .. page Count ). map Ġ{ Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress ion Ġ= Ġ( position Ġ- Ġ 1 ) Ġ/ Ġpage Count . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Progress ion Ġ= Ġ( start Position Ġ+ Ġposition Ġ- Ġ 1 ) Ġ/ Ġtotal Page Count . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoc ator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhref Ġ= Ġlink . href , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġlink . type Ġ?: ĠMediaType . PDF . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocations Ġ= ĠLoc ator . Locations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragments Ġ= ĠlistOf (" page =$ position "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress ion Ġ= Ġprogress ion , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Progress ion Ġ= Ġtotal Progress ion , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= ĠstartPosition Ġ+ Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġopen Pdf At ( link : ĠLink ): ĠPdf Document ? Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpdf Factory . open ( fetcher . get ( link ), Ġpassword Ġ= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( pdf Factory : ĠPdf Document Factory ): Ġ( Publication . Service . Context ) Ġ-> ĠL cp df Positions Service Ġ= Ġ{ Ġservice Context Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL cp df Positions Service ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpdf Factory Ġ= Ġpdf Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreading Order Ġ= Ġservice Context . manifest . reading Order , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch er Ġ= Ġservice Context . fetcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ