/* Ċ Ġ* ĠModule : Ġr 2 - streamer - kotlin Ċ Ġ* ĠDevelopers : ĠQu ent in ĠG li os ca Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 . Ġ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 . ep ub Ċ Ċ import Ġorg . read ium . r 2 . shared . publication . Link Ċ import Ġorg . read ium . r 2 . shared . parser . xml . Element Node Ċ import Ġorg . read ium . r 2 . shared . util . Href Ċ Ċ internal Ġobject ĠNavigation Document Parser Ġ{ ĊĊĠĠĠ Ġfun Ġparse ( document : ĠElement Node , ĠfilePath : ĠString ): ĠMap < String , ĠList < Link >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Prefixes Ġ= Ġdocument . get Attr Ns (" prefix ", ĠName spaces . OPS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġparse Prefixes ( it ) Ġ}. or Empty () ĊĠĠĠĠĠĠĠ Ġval Ġprefix Map Ġ= ĠCONTENT _ RESERVED _ PREFIX ES Ġ+ Ġdoc Prefixes Ġ// Ġprefix Ġelement Ġoverrides Ġreserved Ġprefixes ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġdocument . getFirst (" body ", ĠName spaces . X HTML ) Ġ?: Ġreturn Ġempty Map () ĊĠĠĠĠĠĠĠ Ġval Ġnav s Ġ= Ġbody . collect (" nav ", ĠName spaces . X HTML ). map NotNull Ġ{ Ġparse Nav Element ( it , ĠfilePath , Ġprefix Map ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnav Map Ġ= Ġnav s . flatMap Ġ{ Ġnav Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav . first . map Ġ{ Ġtype Ġ-> ĠPair ( type , Ġnav . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġreturn Ġnav Map . map Keys Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuffix Ġ= Ġit . key . remove Prefix ( Vocab ular ies . TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( suffix Ġin ĠlistOf (" toc ", Ġ" page - list ", Ġ" land marks ", Ġ" lot ", Ġ" lo i ", Ġ" lo a ", Ġ" lov ")) Ġsuffix Ġelse Ġit . key ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Nav Element ( ĊĠĠĠĠĠĠĠ Ġnav : ĠElement Node , ĊĠĠĠĠĠĠĠ ĠfilePath : ĠString , ĊĠĠĠĠĠĠĠ Ġprefix Map : ĠMap < String , ĠString > ĊĠĠĠ Ġ): ĠPair < List < String >, ĠList < Link >> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Attr Ġ= Ġnav . get Attr Ns (" type ", ĠName spaces . OPS ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġtypes Ġ= Ġparse Properties ( type Attr ). map NotNull Ġ{ Ġresolve Property ( it , Ġprefix Map , ĠDEFAULT _ VOC AB . TYPE ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlinks Ġ= Ġnav . getFirst (" ol ", ĠName spaces . X HTML )?. let Ġ{ Ġparse Ol Element ( it , ĠfilePath ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( types . isNotEmpty () Ġ&& Ġ! links . isNull OrEmpty ()) ĠPair ( types , Ġlinks ) Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Ol Element ( element : ĠElement Node , ĠfilePath : ĠString ): ĠList < Link > Ġ= ĊĠĠĠĠĠĠĠ Ġelement . get (" li ", ĠName spaces . X HTML ). map NotNull Ġ{ Ġparse Li Element ( it , ĠfilePath ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Li Element ( element : ĠElement Node , ĠfilePath : ĠString ): ĠLink ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġelement . getAll (). first OrNull () Ġ?: Ġreturn Ġnull Ġ// Ġshould Ġbe Ġ< a >, Ġ Ġ< span >, Ġor Ġ< ol > ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġif Ġ( first . name Ġ== Ġ" ol ") Ġ"" Ġelse Ġfirst . collect Text (). replace ("\\ s +". to Regex (), Ġ" Ġ"). trim () ĊĠĠĠĠĠĠĠ Ġval Ġraw Href Ġ= Ġfirst . get Attr (" href ") ĊĠĠĠĠĠĠĠ Ġval Ġhref Ġ= Ġif Ġ( first . name Ġ== Ġ" a " Ġ&& Ġ! raw Href . isNull Or Blank ()) ĠH ref ( raw Href , Ġbase Href Ġ= ĠfilePath ). string Ġelse Ġ"#" ĊĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġelement . getFirst (" ol ", ĠName spaces . X HTML )?. let Ġ{ Ġparse Ol Element ( it , ĠfilePath ) Ġ}. or Empty () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( children . isEmpty () Ġ&& Ġ( href Ġ== Ġ"#" Ġ|| Ġtitle Ġ== Ġ"")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLink ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġtitle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhref Ġ= Ġhref , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ= Ġchildren ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ