/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 . Ċ Ġ* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof ĠXml Util . Ċ Ġ* Ċ Ġ* ĠThis Ġfile Ġis Ġlic enced Ġto Ġyou Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ċ Ġ* Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ċ Ġ* Ġwith Ġthe ĠLicense . Ġ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe Ġlicense Ġwith Ġthe Ġsource Ġdistribution . Ċ Ġ* ĠAlternatively , Ġyou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ċ Ġ* Ġsoftware Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ċ Ġ* Ġ" AS ĠIS " ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY Ċ Ġ* ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ċ Ġ* Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ġlimitations Ċ Ġ* Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġnl . adapt ivity . js . util Ċ Ċ import Ġnl . adapt ivity . xml util .* Ċ import Ġorg . w 3 c . dom .* Ċ import Ġkotlinx . dom . is Element Ċ import Ġkotlinx . dom . is Text Ċ Ċ fun ĠNode . as Element (): ĠElement ? Ġ= Ġif Ġ( is Element ) Ġthis Ġas ĠElement Ġelse Ġnull Ċ fun ĠNode . as Text (): ĠText ? Ġ= Ġif Ġ( is Text ) Ġthis Ġas ĠText Ġelse Ġnull Ċ Ċ fun ĠNode . remove Element Children () Ġ{ ĊĠĠĠ Ġval Ġtop Ġ= Ġthis ĊĠĠĠ Ġvar Ġcur Ġ= Ġtop . firstChild ĊĠĠĠ Ġwhile Ġ( cur Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġcur . next Sibling ĊĠĠĠĠĠĠĠ Ġif Ġ( cur . is Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop . removeChild ( cur ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcur Ġ= Ġn ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun ĠNamed Node Map . forEach ( body : Ġ( Attr ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbody ( item ( i ) !! ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun ĠNamed Node Map . filter ( predicate : Ġ( Attr ) Ġ-> ĠBoolean ): ĠList < Attr > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Attr >() ĊĠĠĠ ĠforEach Ġ{ Ġattr Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( predicate ( attr )) Ġresult . add ( attr ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ inline Ġfun Ġ< R > ĠNamed Node Map . map ( body : Ġ( Attr ) Ġ-> ĠR ): ĠList < R > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < R >() ĊĠĠĠ ĠforEach Ġ{ Ġattr Ġ-> ĊĠĠĠĠĠĠĠ Ġresult . add ( body ( attr )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ inline Ġfun ĠNamed Node Map . count ( predicate : Ġ( Attr ) Ġ-> ĠBoolean ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠ ĠforEach Ġ{ Ġattr Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( predicate ( attr )) Ġcount ++ ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcount Ċ } ĊĊ Ċ internal Ġfun ĠNode . my Lookup Prefix ( namespace Uri : ĠString ): ĠString ? Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġ! is ĠElement Ġ-> Ġnull ĊĠĠĠ Ġelse ĠĠĠ Ġ-> Ġattributes . filter Ġ{ ĊĠĠĠĠĠĠĠ Ġ( it . prefix Ġ== Ġ" xmlns " Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . prefix Ġ== Ġ"" Ġ&& Ġit . local Name Ġ== Ġ" xmlns ")) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value Ġ== Ġnamespace Uri ĊĠĠĠ Ġ}. first OrNull ()?. let Ġ{ Ġif Ġ( it . prefix Ġ== Ġ" xmlns ") Ġit . local Name Ġelse Ġ"" Ġ} Ġ?: Ġparent Node ?. my Lookup Prefix ( namespace Uri ) Ċ } Ċ Ċ internal Ġfun ĠNode . my Lookup Namespace URI ( prefix : ĠString ): ĠString ? Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġ! is ĠElement Ġ-> Ġnull ĊĠĠĠ Ġelse ĠĠĠ Ġ-> Ġattributes . filter Ġ{ ĊĠĠĠĠĠĠĠ Ġ( prefix Ġ== Ġ"" Ġ&& Ġit . local Name Ġ== Ġ" xmlns ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . prefix Ġ== Ġ" xmlns " Ġ&& Ġit . local Name Ġ== Ġprefix ) ĊĠĠĠ Ġ}. first OrNull ()?. value Ġ?: Ġparent Node ?. my Lookup Namespace URI ( prefix ) Ċ } Ċ Ċ /** ĠRemove Ġnamespaces Ġattributes Ġfrom Ġa Ġtree Ġthat Ġhave Ġalready Ġbeen Ġdeclared Ġby Ġa Ġparent . Ġ*/ Ċ internal Ġfun ĠNode . remove Un needed Namespaces ( known Namespaces : ĠExt ending Namespace Context Ġ= ĠExt ending Namespace Context ()) Ġ{ ĊĠĠĠ Ġif Ġ( nodeType Ġ== ĠNode . ELEMENT _ NODE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Unsafe Cast From Dynamic ") ĊĠĠĠĠĠĠĠ Ġval Ġelem : ĠElement Ġ= Ġas Dynamic () ĊĊĠĠĠĠĠĠĠ Ġval Ġto Remove Ġ= Ġmutable ListOf < Attr >() ĊĊĠĠĠĠĠĠĠ Ġelem . attributes . forEach Ġ{ Ġattr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attr . prefix Ġ== Ġ" xmlns ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġknown Uri Ġ= Ġknown Namespaces . parent . getName space URI ( attr . local Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attr . value Ġ== Ġknown Uri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Remove . add ( attr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġknown Namespaces . add Namespace ( attr . local Name , Ġattr . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( attr . prefix Ġ== Ġ"" Ġ&& Ġattr . local Name Ġ== Ġ" xmlns ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġknown Uri Ġ= Ġknown Namespaces . parent . getName space URI ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attr . value Ġ== Ġknown Uri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Remove . add ( attr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġknown Namespaces . add Namespace ("", Ġattr . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( attr Ġin Ġto Remove ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelem . removeAttribute Node ( attr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġelem . childNodes . asList ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . remove Un needed Namespaces ( known Namespaces . extend ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠExt ending Namespace Context ( val Ġparent : ĠNamespace Context Ġ= ĠSimple Namespace Context ("", Ġ"")) Ġ: ĊĠĠĠ ĠNamespace Context Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlocal Namespaces Ġ= Ġmutable ListOf < Namespace >() ĊĊĠĠĠ Ġoverride Ġfun Ġget Namespace URI ( prefix : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlocal Namespaces . first OrNull Ġ{ Ġit . prefix Ġ== Ġprefix Ġ} ?. namespace URI Ġ?: Ġparent . getName space URI ( prefix ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Prefix ( namespace URI : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlocal Namespaces . first OrNull Ġ{ Ġit . namespace URI Ġ== Ġnamespace URI Ġ} ?. prefix Ġ?: Ġparent . get Prefix ( namespace URI ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Over riding Deprecated Member ") ĊĠĠĠ Ġ@ Opt In ( Experimental Std lib Api :: class ) ĊĠĠĠ Ġoverride Ġfun Ġget Prefixes ( namespace URI : ĠString ): ĠIterator < String ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Set Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Namespaces . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . namespace URI Ġ== Ġnamespace URI Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map To ( this ) Ġ{ Ġit . prefix Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . prefixes For ( namespace URI ). forEach Ġ{ Ġadd ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}. iterator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Namespace ( prefix : ĠString , Ġnamespace URI : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocal Namespaces . add ( Xml Event . Namespace Impl ( prefix , Ġnamespace URI )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġextend () Ġ= ĠExt ending Namespace Context ( this ) Ċ }