/* Ċ Ġ* ĠModule : Ġr 2 - streamer - kotlin Ċ Ġ* ĠDevelopers : ĠA fer d ita ĠM uri qi , ĠCl Ã©ment ĠBa um ann Ċ Ġ* Ċ Ġ* Ġ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 . Link Ċ import Ġorg . read ium . r 2 . shared . parser . xml . Node Ċ import Ġorg . read ium . r 2 . shared . parser . xml . Xml Parser Ċ import Ġorg . read ium . r 2 . streamer . parser . normalize Ċ import Ġorg . w 3 c . dom . NodeList Ċ import Ġjava . io . InputStream Ċ import Ġjavax . xml . XML Constants Ċ import Ġjavax . xml . namespace . Namespace Context Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ import Ġjavax . xml . xpath . XPath Constants Ċ import Ġjavax . xml . xpath . XPath Factory Ċ Ċ class ĠNavigation Document Parser Ġ{ ĊĊĠĠĠ Ġvar Ġnavigation Document Path : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġfun Ġtable Of Content ( xml : ĠByteArray ) Ġ: ĠMutable List < Link > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtable Of Contents Ġ= Ġmutable ListOf < Link >() ĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġxml . inputStream () ĊĊĠĠĠĠĠĠĠ Ġval Ġxpath Ġ= Ġ"/ xhtml : html / xhtml : body / xhtml : nav [@ ep ub : type =' toc '] // xhtml : a " Ġ+ Ġ"| / xhtml : html / xhtml : body / xhtml : nav [@ ep ub : type =' toc '] // xhtml : span " ĊĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= Ġevaluate Xpath ( xpath , Ġdocument ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnodes . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnodes . item ( i ). attributes . getName d Item (" href ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink Ġ= ĠLink () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlink . href Ġ= Ġnormalize ( navigation Document Path , Ġit . node Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlink . title Ġ= Ġnodes . item ( i ). textContent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable Of Contents . add ( link ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtable Of Contents ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpage List ( document : ĠXml Parser ) Ġ= Ġnode Array ( document , Ġ" page - list ") ĊĠĠĠ Ġfun Ġland marks ( document : ĠXml Parser ) Ġ= Ġnode Array ( document , Ġ" land marks ") ĊĠĠĠ Ġfun ĠlistOf Ill ustr ations ( document : ĠXml Parser ) Ġ= Ġnode Array ( document , Ġ" lo i ") ĊĠĠĠ Ġfun ĠlistOf Tables ( document : ĠXml Parser ) Ġ= Ġnode Array ( document , Ġ" lot ") ĊĠĠĠ Ġfun ĠlistOf Audio files ( document : ĠXml Parser ) Ġ= Ġnode Array ( document , Ġ" lo a ") ĊĠĠĠ Ġfun ĠlistOf Videos ( document : ĠXml Parser ) Ġ= Ġnode Array ( document , Ġ" lov ") ĊĊĠĠĠ Ġprivate Ġfun Ġnode Array ( document : ĠXml Parser , Ġnav Type : ĠString ): ĠList < Link > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbody Ġ= Ġdocument . root (). getFirst (" body ") ĊĠĠĠĠĠĠĠ Ġbody ?. getFirst (" section ") ?. let Ġ{ Ġbody Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnav Point Ġ= Ġbody ?. get (" nav ") ?. first OrNull Ġ{ Ġit . attributes [" ep ub : type "] Ġ== Ġnav Type Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġol Element Ġ= Ġnav Point ?. getFirst (" ol ") Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġreturn Ġnode Ol ( ol Element ). children ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnode Ol ( element : ĠNode ): ĠLink Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Ol Node Ġ= ĠLink () ĊĠĠĠĠĠĠĠ Ġval Ġli Elements Ġ= Ġelement . get (" li ") Ġ?: Ġreturn Ġnew Ol Node ĊĠĠĠĠĠĠĠ Ġfor Ġ( li Ġin Ġli Elements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspan Text Ġ= Ġli . getFirst (" span ") ?. name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( span Text Ġ!= Ġnull Ġ&& Ġspan Text . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġli . getFirst (" ol ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ol Node . children . add ( node Ol ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Li Node Ġ= Ġnode Li ( li ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ol Node . children . add ( child Li Node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Ol Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnode Li ( element : ĠNode ): ĠLink Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Li Node Ġ= ĠLink () ĊĠĠĠĠĠĠĠ Ġval Ġa Node Ġ= Ġelement . getFirst (" a ") !! ĊĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġ( a Node . getFirst (" span ")) ?. text Ġ?: Ġa Node . text Ġ?: Ġa Node . name ĊĠĠĠĠĠĠĠ Ġnew Li Node . href Ġ= Ġnormalize ( navigation Document Path , Ġa Node . attributes [" href "]) ĊĠĠĠĠĠĠĠ Ġnew Li Node . title Ġ= Ġtitle ĊĠĠĠĠĠĠĠ Ġelement . getFirst (" ol ") ?. let Ġ{ Ġnew Li Node . children . add ( node Ol ( it )) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Li Node ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġevaluate Xpath ( expression : ĠString , Ġdoc : ĠInputStream ): ĠNode List Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdb Factory Ġ= ĠDocument BuilderFactory . newInstance () ĊĠĠĠĠĠĠĠ Ġdb Factory . is Namespace Aware Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġdoc Builder Ġ Ġ= Ġdb Factory . new Document Builder () ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġdoc Builder . parse ( doc ) ĊĊĠĠĠĠĠĠĠ Ġval Ġx Path Ġ= ĠXPath Factory . newInstance (). new XPath () ĊĠĠĠĠĠĠĠ Ġx Path . namespace Context Ġ= ĠName Space Resolver () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġx Path . evaluate ( expression , Ġdocument , ĠXPath Constants . NODE SET ) Ġas ĠNode List ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠName Space Resolver Ġ: ĠNamespace Context Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Namespace URI ( p 0 : ĠString ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( p 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġthrow ĠIllegalArgumentException (" No Ġprefix Ġprovided !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ep ub " Ġ-> Ġ" http :// www . id pf . org / 2 0 0 7 / ops " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" xhtml " Ġ-> Ġ" http :// www . w 3 . org / 1 9 9 9 / xhtml " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠXML Constants . DEFAULT _ NS _ PREFIX ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Prefix ( p 0 : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Prefixes ( p 0 : ĠString ?): ĠMutable Iterator < Any ?> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } ĊĊ