package Ġua . val d _ zx . simp lex ml . k sp . xml Ċ Ċ import Ġua . val d _ zx . simp lex ml . k sp . xml . utils . Esc aping . un escape Html Ċ Ċ @ Dsl Marker Ċ annotation Ġclass ĠTag Marker Ċ Ċ private Ġconst Ġval ĠTAB Ġ= Ġ" ĠĠĠ Ġ" Ċ Ċ data Ġclass ĠAttribute ( val Ġname : ĠString , Ġval Ġvalue : ĠString ) Ċ Ċ @ Tag Marker Ċ interface ĠTag Ġ{ ĊĠĠĠ Ġval Ġname : ĠString ĊĠĠĠ Ġval Ġattributes : ĠMutable List < Attribute > ĊĊĠĠĠ Ġfun Ġattr ( name : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġattributes . add ( Attribute ( name . clean (), Ġvalue . un escape Html ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender ( margin : ĠInt Ġ= Ġ 0 ): ĠString ĊĊĠĠĠ Ġfun Ġrender Start Te g ( is Closed : ĠBoolean Ġ= Ġfalse ) Ġ= ĠStringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ("< $ name ") ĊĠĠĠĠĠĠĠ Ġattributes . forEach Ġ{ Ġappend (" Ġ${ it . name } =\" ${ it . value }\" ") Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Closed ) Ġappend (" /> ") Ġelse Ġappend ("> ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠTag F ather ( ĊĠĠĠ Ġoverride Ġvar Ġname : ĠString , ĊĠĠĠ Ġoverride Ġval Ġattributes : ĠMutable List < Attribute > Ġ= Ġmutable ListOf (), ĊĠĠĠ Ġval Ġtags : ĠMutable List < Tag > Ġ= Ġmutable ListOf (), ĊĠĠĠ Ġprivate Ġvar Ġvalue : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġpretty : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠTag Ġ{ ĊĠĠĠ Ġfun Ġtag ( name : ĠString , Ġblock : ĠTag F ather . () Ġ-> ĠUnit Ġ= Ġ{}) Ġ= ĊĠĠĠĠĠĠĠ Ġtags . add ( Tag F ather ( name . clean (), Ġpretty Ġ= Ġpretty ). apply ( block )) ĊĊĠĠĠ Ġfun Ġtag ( name : ĠString , Ġvalue : ĠString , Ġblock : ĠTag Value . () Ġ-> ĠUnit Ġ= Ġ{}) Ġ= ĊĠĠĠĠĠĠĠ Ġtags . add ( Tag Value ( name . clean (), Ġvalue . un escape Html (), Ġpretty Ġ= Ġpretty ). apply ( block )) ĊĊĠĠĠ Ġfun Ġtext ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender ( margin : ĠInt ): ĠString Ġ= ĠStringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Closed Ġ= Ġtags . isEmpty () Ġ&& Ġvalue Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( pretty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tags . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( TAB . repeat ( margin ) Ġ+ Ġrender Start Te g ( is Closed )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Line ( TAB . repeat ( margin ) Ġ+ Ġrender Start Te g ( is Closed )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( render Start Te g ( is Closed )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( tags . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pretty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags . forEach Ġ{ Ġappend Line ( it . render ( margin Ġ+ Ġ 1 )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( TAB . repeat ( margin ) Ġ+ Ġ"</ $ name >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags . forEach Ġ{ Ġappend ( it . render ( margin Ġ+ Ġ 1 )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("</ $ name >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tags . isNotEmpty ()) Ġthrow ĠIllegalStateException (" text () Ġor Ġtag () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("</ $ name >") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. toString () Ċ } Ċ Ċ data Ġclass ĠTag Value ( ĊĠĠĠ Ġoverride Ġvar Ġname : ĠString , ĊĠĠĠ Ġval Ġvalue : ĠString , ĊĠĠĠ Ġoverride Ġval Ġattributes : ĠMutable List < Attribute > Ġ= Ġmutable ListOf (), ĊĠĠĠ Ġval Ġpretty : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠTag Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrender ( margin : ĠInt ) Ġ= ĠStringBuilder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( pretty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( TAB . repeat ( margin ) Ġ+ Ġrender Start Te g ( value . isBlank ())) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( render Start Te g ( value . isBlank ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("</ $ name >") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. toString () Ċ } Ċ Ċ fun Ġtag ( name : ĠString , Ġpretty : ĠBoolean Ġ= Ġfalse , Ġblock : ĠTag F ather . () Ġ-> ĠUnit ) Ġ= ĊĠĠĠ ĠTag F ather ( name . clean (), Ġpretty Ġ= Ġpretty ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} Ċ Ċ private Ġfun ĠString . clean () Ġ= Ġreplace ( Regex ("[ \\\\ ! \" # \$ % & ' ()* +, / ;< => ? @ \\ [ \\ ]^ ` { |} ~ Ġ] "), Ġ"") ĊĠĠĠ Ġ. replace ( Regex ("^ ([ -. ])+ "), Ġ"")