package Ġdev . ent ao . page . tag Ċ Ċ import Ġdev . ent ao . base . escape Html Ċ import Ġdev . ent ao . core . HttpContext Ċ import Ġdev . ent ao . core . contentType Html Ċ import Ġdev . ent ao . page . attr Val Ċ import Ġdev . ent ao . page . ident Ċ import Ġjava . util . ArrayList Ċ Ċ class ĠHtml Printer ( val Ġtag : ĠTag ) Ġ{ Ċ ĉ var Ġbottom Script Ġ= Ġtag . tagName Ġ== Ġ" html " Ċ ĉ var Ġdoc Declared Ġ= Ġtag . tagName Ġ== Ġ" html " ĊĊ ĉ private Ġval Ġscript List Ġ= ĠArrayList < Tag >() ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ val Ġbuffer Ġ= ĠStringBuilder ( 4 0 9 6 ) Ċĉ ĉ writeTo ( buffer ) Ċĉ ĉ return Ġbuffer . toString () Ċ ĉ } ĊĊ ĉ fun ĠwriteTo ( buf : ĠAppend able ) Ġ{ Ċĉ ĉ if Ġ( doc Declared ) Ġ{ Ċĉĉ ĉ buf . append ln (" <! DOCTYPE ĠHTML >") Ċĉ ĉ } Ċĉ ĉ this . writeTo ( tag , Ġbuf , Ġ 0 , Ġfalse ) Ċ ĉ } ĊĊ ĉ private Ġfun Ġallow Empty Attr ( tag : ĠTag , Ġk : ĠString ): ĠBoolean Ġ{ Ċĉ ĉ if Ġ( tag . tagName Ġ== Ġ" col " Ġ&& Ġk Ġ== Ġ" width ") Ġ{ Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } Ċĉ ĉ if Ġ( tag . tagName Ġ== Ġ" option " Ġ&& Ġk Ġ== Ġ" value ") Ġ{ Ċĉĉ ĉ return Ġtrue Ċĉ ĉ } Ċĉ ĉ return Ġfalse Ċ ĉ } ĊĊ ĉ private Ġfun Ġwrite Attrs ( tag : ĠTag , Ġbuf : ĠAppend able ) Ġ{ Ċĉ ĉ for Ġ(( k , Ġv ) Ġin Ġtag . attr Map ) Ġ{ Ċĉĉ ĉ if Ġ( v . isEmpty () Ġ&& Ġ! allow Empty Attr ( tag , Ġk )) Ġ{ Ċĉĉĉ ĉ continue Ċĉĉ ĉ } Ċĉĉ ĉ buf . append (" Ġ"). append ( k ). append (" =" ). append ( attr Val ( v )) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ private Ġfun ĠwriteTo ( tag : ĠTag , Ġbuf : ĠAppend able , Ġlevel : ĠInt , Ġsingle Line : ĠBoolean ) Ġ{ Ċĉ ĉ if Ġ( tag Ġis ĠText Unsafe ) Ġ{ Ċĉĉ ĉ buf . append ( tag . text ) Ċĉĉ ĉ return Ċĉ ĉ } Ċĉ ĉ if Ġ( tag Ġis ĠText Esc aped ) Ġ{ Ċĉĉ ĉ buf . append ( tag . text . escape Html ( tag . for View )) Ċĉĉ ĉ return Ċĉ ĉ } ĊĊĉ ĉ if Ġ(! single Line ) Ġ{ Ċĉĉ ĉ buf . ident ( level ) Ċĉ ĉ } Ċĉ ĉ buf . append ("< "). append ( tag . tagName ) Ċĉ ĉ write Attrs ( tag , Ġbuf ) Ċĉ ĉ if Ġ( tag . children . isEmpty ()) Ġ{ Ċĉĉ ĉ if Ġ( tag . tagName Ġin Ġself End Tags ) Ġ{ Ċĉĉĉ ĉ buf . append (" /> ") Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ buf . append ( "></ "). append ( tag . tagName ). append ("> ") Ċĉĉ ĉ } Ċĉĉ ĉ return Ċĉ ĉ } Ċĉ ĉ buf . append ("> ") Ċĉ ĉ val Ġone Line Ġ= Ġsingle Line Ġ|| Ġtag . tagName Ġin Ġsingle Line Tags Ċĉ ĉ if Ġ(! one Line ) Ġ{ Ċĉĉ ĉ buf . append ln () Ċĉ ĉ } Ċĉ ĉ for Ġ( c Ġin Ġtag . children ) Ġ{ Ċĉĉ ĉ if Ġ( bottom Script ) Ġ{ Ċĉĉĉ ĉ if Ġ( c . tagName Ġ== Ġ" script ") Ġ{ Ċĉĉĉĉ ĉ script List Ġ+= Ġc Ċĉĉĉĉ ĉ continue Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ writeTo ( c , Ġbuf , Ġlevel Ġ+ Ġ 1 , Ġone Line ) Ċĉĉ ĉ if Ġ(! one Line ) Ġ{ Ċĉĉĉ ĉ buf . append ln () Ċĉĉ ĉ } ĊĊĉ ĉ } Ċĉ ĉ if Ġ( bottom Script ) Ġ{ Ċĉĉ ĉ if Ġ( tag . tagName Ġ== Ġ" body " Ġ|| Ġtag Ġ=== Ġthis . tag ) Ġ{ Ċĉĉĉ ĉ for Ġ( c Ġin Ġthis . script List ) Ġ{ Ċĉĉĉĉ ĉ writeTo ( c , Ġbuf , Ġ 1 , Ġc [" src "]. isEmpty ()) Ċĉĉĉĉ ĉ buf . append ln () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ script List . clear () Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ if Ġ(! one Line ) Ġ{ Ċĉĉ ĉ buf . ident ( level ) Ċĉ ĉ } Ċĉ ĉ buf . append ("</ "). append ( tag . tagName ). append ("> ") ĊĊ ĉ } ĊĊ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ val Ġself End Tags Ġ= Ġset Of (" meta ", Ġ" link ", Ġ" input ", Ġ" img ", Ġ" hr ") Ċĉ ĉ val Ġsingle Line Tags Ġ= Ġset Of (" span ", Ġ" textarea ", Ġ" label ", Ġ" button ", Ġ" title ", Ġ" td ", Ġ" th ", Ġ" input ", Ġ" option ", Ġ" a ", Ġ" h 1 ", Ġ" h 2 ", Ġ" h 3 ", Ġ" h 4 ", Ġ" h 5 ", Ġ" h 6 ") Ċ ĉ } Ċ } Ċ Ċ fun ĠHttp Context . send Html Tag ( tag : ĠTag ) Ġ{ Ċ ĉ val Ġp Ġ= ĠHtml Printer ( tag ) Ċ ĉ p . bottom Script Ġ= Ġtrue Ċ ĉ val Ġr Ġ= Ġthis . response Ċ ĉ r . contentType Html () Ċ ĉ val Ġw Ġ= Ġr . writer Ċ ĉ p . writeTo ( w ) Ċ ĉ w . flush () Ċ } ĊĊ