package Ġkotlin . html Ċ Ċ import Ġjava . util .* Ċ Ċ abstract Ġclass ĠHtml Element ( val Ġcontaining Element : ĠHtml Element ?, Ġval Ġcontent Style : ĠContent Style Ġ= ĠContent Style . block ) Ġ{ ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġappend To ( containing Element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend To ( element : ĠHtml Element ?) Ġ= Ġelement ?. children ?. add ( this ) ĊĊĠĠĠ Ġval Ġchildren : ĠMutable List < Html Element > Ġ= ĠArrayList < Html Element >() ĊĊĠĠĠ Ġabstract Ġfun Ġrender Element ( builder : ĠStringBuilder , Ġindent : ĠString ) ĊĊĠĠĠ Ġopen Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġrender Element ( builder , Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠRender Style Ġ{ ĊĠĠĠ Ġadaptive ĊĠĠĠ Ġexpanded ĊĠĠĠ Ġempty Ċ } Ċ Ċ enum Ġclass ĠContent Style Ġ{ ĊĠĠĠ Ġblock ĊĠĠĠ Ġtext ĊĠĠĠ Ġpropagate Ċ } Ċ Ċ private Ġfun ĠHtml Element . compute Content Style (): ĠContent Style Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( content Style ) Ġ{ ĊĠĠĠĠĠĠĠ ĠContent Style . block , ĠContent Style . text Ġ-> Ġcontent Style ĊĠĠĠĠĠĠĠ ĠContent Style . propagate Ġ-> Ġif Ġ( children . all Ġ{ Ġit . compute Content Style () Ġ== ĠContent Style . text Ġ}) ĠContent Style . text Ġelse ĠContent Style . block ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠString . html Escape (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġreplace All ("< ", Ġ"& lt ; "). replaceAll ("> ", Ġ"& gt ; "). replaceAll (" \"", Ġ"& quot ; ") Ċ } Ċ Ċ abstract Ġclass ĠHtml Tag ( containing Tag : ĠHtml Tag ?, Ġval ĠtagName : ĠString , Ġval Ġrender Style : ĠRender Style Ġ= ĠRender Style . expanded , Ġcontent Style : ĠContent Style Ġ= ĠContent Style . block ) Ġ: ĠHtml Element ( containing Tag , Ġcontent Style ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġattributes Ġ= ĠHashMap < String , ĠString >() ĊĊĠĠĠ Ġpublic Ġfun Ġbuild < T Ġ: ĠHtml Tag >( tag : ĠT , Ġcontents : ĠT . () Ġ-> ĠUnit ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġtag . contents () ĊĠĠĠĠĠĠĠ Ġreturn Ġtag ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender Element ( builder : ĠStringBuilder , Ġindent : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġchildren . size () ĊĠĠĠĠĠĠĠ Ġbuilder . append ( indent ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ== Ġ 0 Ġ&& Ġrender Style Ġ!= ĠRender Style . expanded Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("< $ tagName ${ render Attributes ()} /> ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ!= Ġ 0 Ġ&& Ġrender Style Ġ== ĠRender Style . empty Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Html Exception (" Empty Ġtag Ġhas Ġchildren ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . all Ġ{ Ġit . compute Content Style () Ġ== ĠContent Style . text Ġ} Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("< $ tagName ${ render Attributes () }> ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġchildren ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . render Element ( builder , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("</ $ tagName >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ== Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("< $ tagName ${ render Attributes ()} ></ $ tagName >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("< $ tagName ${ render Attributes () }> \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġchildren ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . render Element ( builder , Ġindent Ġ+ Ġ" Ġ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("$ indent </ $ tagName >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( indent Ġ!= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("\ n ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġrender Attributes (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( a Ġin Ġattributes . keySet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattr Ġ= Ġattributes [ a ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attr . length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append (" Ġ$ a =\" ${ attr . html Escape ()} \" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġattribute ( name : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġattributes [ name ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġget ( attribute Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġanswer Ġ= Ġattributes [ attribute Name ] ĊĠĠĠĠĠĠĠ Ġif Ġ( answer Ġ== Ġnull ) Ġthrow ĠRuntimeException (" A tr ribut e Ġ$ attribute Name Ġis Ġmissing ") ĊĠĠĠĠĠĠĠ Ġreturn Ġanswer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġset ( att Name : ĠString , Ġatt Value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġattributes [ att Name ] Ġ= Ġatt Value ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠHtml Text ( containing Tag : ĠHtml Tag ?, Ġprivate Ġval Ġtext : ĠString ) Ġ: ĠHtml Element ( containing Tag , ĠContent Style . text ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrender Element ( builder : ĠStringBuilder , Ġindent : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( indent ) ĊĠĠĠĠĠĠĠ Ġbuilder . append ( escaped Text ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( indent Ġ!= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ("\ n ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġescaped Text (): ĠString Ġ= Ġtext . html Escape () Ċ } Ċ Ċ abstract Ġclass ĠHtml Tag With Text ( containing Tag : ĠHtml Tag ?, Ġname : ĠString , Ġrender Style : ĠRender Style Ġ= ĠRender Style . expanded ) Ġ: ĠHtml Tag ( containing Tag , Ġname , Ġrender Style ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverride Ġthe Ġplus Ġoperator Ġto Ġadd Ġa Ġtext Ġelement . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠString . plus () Ġ= ĠHtml Text ( this @ Html Tag With Text , Ġthis ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠY et Ġanother Ġway Ġto Ġset Ġthe Ġtext Ġcontent Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġtext : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children . size Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchildren [ 0 ]. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHtml Text ( this @ Html Tag With Text , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠHtml Body Tag With Text ( containing Tag : ĠHtml Tag ?, Ġname : ĠString , Ġrender Style : ĠRender Style Ġ= ĠRender Style . expanded , Ġcontent Style : ĠContent Style Ġ= ĠContent Style . block ) Ġ: ĠHtml Body Tag ( containing Tag , Ġname , Ġrender Style , Ġcontent Style ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverride Ġthe Ġplus Ġoperator Ġto Ġadd Ġa Ġtext Ġelement . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠString . plus () Ġ= ĠHtml Text ( this @ Html Body Tag With Text , Ġthis ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠY et Ġanother Ġway Ġto Ġset Ġthe Ġtext Ġcontent Ġof Ġthe Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġtext : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children . size Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchildren [ 0 ]. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHtml Text ( this @ Html Body Tag With Text , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ class ĠInvalid Html Exception ( val Ġmessage : ĠString ) Ġ: ĠRuntimeException ( message ) Ġ{ Ċ Ċ } Ċ