package Ġkotlinx . html . generate čĊč Ċ import Ġk doc č Ċ import Ġkotlinx . html . generate . human ize .* č Ċ import Ġjava . util .* čĊč Ċ fun ĠAppend able . tag Class ( tag Ġ: ĠTag Info , Ġexclude Attributes Ġ: ĠSet < String >) Ġ{ čĊĠĠĠ Ġval Ġparent Attribute If aces Ġ= Ġtag . attribute Groups . map Ġ{ it . name . capitalize () Ġ+ Ġ" Facade "} čĊĠĠĠ Ġval Ġparent Element If aces Ġ= Ġtag . tag Group Names . map Ġ{ Ġit . human ize (). capitalize () Ġ} čĊĠĠĠ Ġval Ġall Parent If aces Ġ= Ġparent Attribute If aces Ġ+ Ġparent Element If aces čĊĠĠĠ Ġval Ġbetter Parent If aces Ġ= Ġhuman ize Join ( all Parent If aces ) čĊčĊĠĠĠ Ġval Ġnamespace Ġ= ĠtagName spaces [ tag . name . toLowerCase ()] čĊĠĠĠ Ġval Ġcustom izable Namespace Ġ= Ġtag . name . toLowerCase () Ġin Ġtags With Custom izable Namespace čĊčĊĠĠĠ Ġval Ġparameters Ġ= Ġmutable ListOf ( čĊĠĠĠĠĠĠĠ ĠVar (" initial Attributes ", Ġ" Map < String , ĠString >", Ġfalse , Ġfalse , Ġtrue ), čĊĠĠĠĠĠĠĠ ĠVar (" consumer ", Ġ" Tag Consumer <* >", Ġfalse , Ġtrue ) čĊĠĠĠ Ġ) čĊĠĠĠ Ġval Ġsuper Constructor Arguments Ġ= Ġmutable ListOf < String >( čĊĠĠĠĠĠĠĠ Ġtag . name . quote (), čĊĠĠĠĠĠĠĠ Ġ" consumer ", čĊĠĠĠĠĠĠĠ Ġ" initial Attributes ", čĊĠĠĠĠĠĠĠ Ġnamespace ?. quote (). toString (), čĊĠĠĠĠĠĠĠ Ġ( tag . name Ġin Ġinline Tags ). toString (), čĊĠĠĠĠĠĠĠ Ġ( tag . name Ġin Ġempty Tags ). toString () čĊĠĠĠ Ġ) čĊčĊĠĠĠ Ġif Ġ( custom izable Namespace ) Ġ{ čĊĠĠĠĠĠĠĠ Ġparameters . add ( Var (" namespace ", Ġ" String ?", Ġfalse , Ġfalse , Ġtrue , Ġnamespace ?. quote () Ġ?: Ġ" null ")) čĊĠĠĠĠĠĠĠ Ġsuper Constructor Arguments [ 3 ] Ġ= Ġ" namespace " čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġappend ln ("@ Suppress (\" unused \") ") čĊĠĠĠ Ġclazz ( Clazz ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġtag . className , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariables Ġ= Ġparameters , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġparents Ġ= ĠlistOf ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild String Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call (" HTML Tag ", Ġsuper Constructor Arguments ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġwhen Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Parent If aces . isNotEmpty () Ġ-> ĠlistOf ( better Parent If aces ). map Ġ{ Ġre names [ it ] Ġ?: Ġit Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty List < String >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, čĊĠĠĠĠĠĠĠĠĠĠĠ ĠisOpen Ġ= Ġtrue čĊĠĠĠ Ġ)) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġlower Case d Names Ġ= Ġtag . attributes . map Ġ{ it . name . toLowerCase ()}. toSet () čĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġtag . attributes . filter Ġ{ it . name Ġ! in Ġexclude Attributes } čĊčĊĠĠĠĠĠĠĠ Ġattributes . filter Ġ{! is Attribute Excluded ( it . name ) Ġ}. forEach Ġ{ Ġattribute Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attribute . name [ 0 ]. is LowerCase () Ġ|| Ġattribute . name . toLowerCase () Ġ! in Ġlower Case d Names ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute Property ( attribute ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġfun Ġcontent less Tag De precation () Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln ("@ Deprecated (\" This Ġtag Ġmost Ġlikely Ġdoesn 't Ġsupport Ġtext Ġcontent Ġor Ġrequires Ġunsafe Ġcontent Ġ( try Ġunsafe Ġ{} \") ") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( tag . name . toLowerCase () Ġin Ġcontent less Tags ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent less Tag De precation () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction (" unary Plus ", Ġmodifiers Ġ= ĠlistOf (" override ", Ġ" operator "), Ġreceiver Ġ= Ġ" Entities ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent ( 2 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("@ Suppress (\" DE PREC ATION \") Ġ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call (" entity ", ĠlistOf (" this ")) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent less Tag De precation () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction (" unary Plus ", Ġmodifiers Ġ= ĠlistOf (" override ", Ġ" operator "), Ġreceiver Ġ= Ġ" String ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent ( 2 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("@ Suppress (\" DE PREC ATION \") Ġ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call (" text ", ĠlistOf (" this ")) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent less Tag De precation () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction (" text ", Ġarguments Ġ= ĠlistOf ( Var (" s ", Ġ" String ")), Ġmodifiers Ġ= ĠlistOf (" override ")) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent ( 2 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Dot (" super < HTML Tag >") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call (" text ", ĠlistOf (" s ")) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent less Tag De precation () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction (" text ", Ġarguments Ġ= ĠlistOf ( Var (" n ", Ġ" Number ")), Ġmodifiers Ġ= ĠlistOf (" override ")) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent ( 2 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Dot (" super < HTML Tag >") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call (" text ", ĠlistOf (" n ")) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent less Tag De precation () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction (" entity ", Ġarguments Ġ= ĠlistOf ( Var (" e ", Ġ" Entities ")), Ġmodifiers Ġ= ĠlistOf (" override ")) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent ( 2 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Dot (" super < HTML Tag >") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call (" entity ", ĠlistOf (" e ")) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindent () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġempty Line () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġtag . direct Children . map Ġ{ Repository . tags [ it ] }. filter NotNull (). filter Ignored (). forEach Ġ{ Ġchildren Ġ-> čĊĠĠĠĠĠĠĠ Ġhtml Tag Builders ( tag . className , Ġchildren ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġif Ġ( parentElement If aces . size Ġ> Ġ 1 ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġcommon s Ġ= Ġtag . tag Group Names . map Ġ{ Repository . tag Groups [ it ]?. tags ?. toSet ()}. filter NotNull (). reduce Ġ{ Ġa , Ġb Ġ-> Ġa . intersect ( b ) Ġ} čĊĠĠĠĠĠĠĠ Ġif Ġ( commons . isNotEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Element If aces . forEach Ġ{ Ġgroup Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable ( Var ( name Ġ= Ġ" as " Ġ+ Ġgroup , Ġtype Ġ= Ġgroup ), Ġreceiver Ġ= Ġtag . className ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ln () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefine Is (" this ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Line () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġempty Line () č Ċ } čĊč Ċ internal Ġfun ĠAppend able . tag Attribute Var ( attribute : ĠAttribute Info , Ġreceiver : ĠString ?, Ġindent : ĠInt Ġ= Ġ 1 ): ĠAttribute Request Ġ{ čĊĠĠĠ Ġval Ġoptions Ġ= ĠLinkedList < Const <* >>() čĊčĊĠĠĠ Ġif Ġ( attribute . type Ġ== ĠAttribute Type . ENUM ) Ġ{ čĊĠĠĠĠĠĠĠ Ġoptions . add ( Reference Const ( attribute . enum TypeName . de capitalize () Ġ+ Ġ" Values ")) čĊĠĠĠ Ġ} Ġelse Ġif Ġ( attribute . type Ġ== ĠAttribute Type . BOOLEAN Ġ&& Ġattribute . true False . isNotEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠ Ġoptions . addAll ( attribute . true False . map (:: String Const )) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġval Ġattribute Request Ġ= ĠAttribute Request ( attribute . type , Ġif Ġ( attribute . type Ġ== ĠAttribute Type . ENUM ) Ġattribute . enum TypeName Ġelse Ġ"", Ġoptions ) čĊĠĠĠ ĠRepository . attribute Delegate Requests . add ( attribute Request ) čĊčĊĠĠĠ Ġindent ( indent ) čĊĠĠĠ Ġvariable ( Var ( attribute . fieldName , Ġattribute . typeName , Ġtrue ), Ġreceiver Ġ= Ġreceiver Ġ?: Ġ"") čĊĠĠĠ Ġreturn Ġattribute Request č Ċ } čĊč Ċ fun Ġprobe Type ( html ClassName Ġ: ĠString ) Ġ: ĠBoolean Ġ= Ġhtml ClassName Ġin Ġknown Tag Classes čĊč Ċ private Ġfun Ġtag Candidates ( tag Ġ: ĠTag Info ) Ġ= Ġ( listOf ( tag . member Name ) Ġ+ Ġtag Replacement s . map Ġ{ Ġtag . member Name . replace ( it . first . to Regex (), Ġit . second ) Ġ}). flatMap Ġ{ ĠlistOf ( it . capitalize (), Ġit . toUpperCase ()) Ġ}. distinct () čĊč Ċ fun Ġget Tag Result Class ( tag : ĠTag Info ) Ġ= čĊĠĠĠĠĠĠĠ Ġtag Candidates ( tag ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ" HTML ${ it } Element " Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġprobe Type ( it ) Ġ} Ġ?: Ġ" HTMLElement " čĊč Ċ fun Ġcontent Argument Value ( tag Ġ: ĠTag Info , Ġblock Or Content Ġ: ĠBoolean ) Ġ= Ġwhen Ġ{ čĊĠĠĠ Ġtag . name . toLowerCase () Ġin Ġempty Tags Ġ-> Ġ" block " čĊĠĠĠ Ġblock Or Content Ġ-> Ġ" block " čĊĠĠĠ Ġelse Ġ-> Ġ"{ + content }" č Ċ } čĊč Ċ fun ĠAppend able . consumer Builder JS ( tag Ġ: ĠTag Info , Ġblock Or Content Ġ: ĠBoolean ) Ġ{ čĊĠĠĠ Ġval Ġresult Type Ġ= Ġget Tag Result Class ( tag ) čĊčĊĠĠĠ Ġval Ġconstructor Args Ġ= Ġmutable ListOf < String >( čĊĠĠĠĠĠĠĠ Ġbuild Suggest ed Attributes Argument ( tag ), čĊĠĠĠĠĠĠĠ Ġ" this " čĊĠĠĠ Ġ) čĊčĊĠĠĠ Ġif Ġ( tag . name . toLowerCase () Ġin Ġtags With Custom izable Namespace ) Ġ{ čĊĠĠĠĠĠĠĠ Ġconstructor Args . add (" namespace ") čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġtag K doc ( tag ) čĊĠĠĠ Ġhtml Dsl Marker () čĊĠĠĠ Ġappend (" public Ġ") čĊĠĠĠ Ġfunction ( tag . member Name , Ġtag Builder Function Arguments ( tag , Ġblock Or Content ), Ġresult Type , Ġreceiver Ġ= Ġ" Tag Consumer < HTMLElement >") čĊĠĠĠ Ġdefine Is ( build String Ġ{ čĊĠĠĠĠĠĠĠ Ġfunction Call ( tag . className , Ġconstructor Args ) čĊĠĠĠĠĠĠĠ Ġappend (".") čĊĠĠĠĠĠĠĠ Ġfunction Call (" visit And Finalize ", ĠlistOf ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" this ", čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Argument Value ( tag , Ġblock Or Content ) čĊĠĠĠĠĠĠĠ Ġ)) čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( result Type Ġ!= Ġ" HTMLElement ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Ġas Ġ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( result Type ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ}) č Ċ } čĊč Ċ fun ĠAppend able . consumer Builder Shared ( tag Ġ: ĠTag Info , Ġblock Or Content Ġ: ĠBoolean ) Ġ{ čĊĠĠĠ Ġval Ġconstructor Args Ġ= Ġmutable ListOf < String >( čĊĠĠĠĠĠĠĠ Ġbuild Suggest ed Attributes Argument ( tag ), čĊĠĠĠĠĠĠĠ Ġ" this " čĊĠĠĠ Ġ) čĊčĊĠĠĠ Ġif Ġ( tag . name . toLowerCase () Ġin Ġtags With Custom izable Namespace ) Ġ{ čĊĠĠĠĠĠĠĠ Ġconstructor Args . add (" namespace ") čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġtag K doc ( tag ) čĊĠĠĠ Ġhtml Dsl Marker () čĊĠĠĠ Ġfunction ( tag . member Name , Ġtag Builder Function Arguments ( tag , Ġblock Or Content ), Ġ" T ", ĠlistOf (" T ", Ġ" C Ġ: ĠTag Consumer < T > "), Ġ" C ") čĊĠĠĠ Ġdefine Is ( build String Ġ{ čĊĠĠĠĠĠĠĠ Ġfunction Call ( tag . className , Ġconstructor Args ) čĊĠĠĠĠĠĠĠ Ġappend (".") čĊĠĠĠĠĠĠĠ Ġfunction Call (" visit And Finalize ", ĠlistOf ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" this ", čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Argument Value ( tag , Ġblock Or Content ) čĊĠĠĠĠĠĠĠ Ġ)) čĊĠĠĠ Ġ}) č Ċ } čĊč Ċ fun ĠAppend able . html Tag Builder Method ( receiver Ġ: ĠString , Ġtag Ġ: ĠTag Info , Ġblock Or Content Ġ: ĠBoolean ) Ġ{ čĊĠĠĠ Ġval Ġarguments Ġ= Ġtag Builder Function Arguments ( tag , Ġblock Or Content ) čĊčĊĠĠĠ Ġval Ġconstructor Args Ġ= Ġmutable ListOf < String >( čĊĠĠĠĠĠĠĠ Ġbuild Suggest ed Attributes Argument ( tag ), čĊĠĠĠĠĠĠĠ Ġ" consumer " čĊĠĠĠ Ġ) čĊčĊĠĠĠ Ġif Ġ( tag . name . toLowerCase () Ġin Ġtags With Custom izable Namespace ) Ġ{ čĊĠĠĠĠĠĠĠ Ġconstructor Args . add (" namespace ") čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġtag K doc ( tag ) čĊĠĠĠ Ġhtml Dsl Marker () čĊĠĠĠ Ġfunction ( tag . member Name , Ġarguments , Ġ" Unit ", Ġreceiver Ġ= Ġreceiver ) čĊĠĠĠ Ġdefine Is ( build String Ġ{ čĊĠĠĠĠĠĠĠ Ġfunction Call ( tag . className , Ġconstructor Args ) čĊĠĠĠĠĠĠĠ Ġappend (".") čĊĠĠĠĠĠĠĠ Ġfunction Call (" visit ", ĠlistOf ( content Argument Value ( tag , Ġblock Or Content ))) čĊĠĠĠ Ġ}) č Ċ } čĊč Ċ fun ĠAppend able . html Tag Enum Builder Method ( receiver Ġ: ĠString , Ġtag Ġ: ĠTag Info , Ġblock Or Content Ġ: ĠBoolean , Ġenum Attribute Ġ: ĠAttribute Info , Ġindent Ġ: ĠInt ) Ġ{ čĊĠĠĠ Ġrequire ( enum Attribute . enum Values . isNotEmpty ()) čĊčĊĠĠĠ Ġval Ġarguments Ġ= Ġtag Builder Function Arguments ( tag , Ġblock Or Content ). filter Ġ{ it . name Ġ!= Ġenum Attribute . fieldName } čĊčĊĠĠĠ Ġenum Attribute . enum Values . forEach Ġ{ Ġenum Value Ġ-> čĊĠĠĠĠĠĠĠ Ġval Ġdeprecation Ġ= Ġfind Enum De precation ( enum Attribute , Ġenum Value ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġconstructor Args Ġ= Ġmutable ListOf < String >( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Suggest ed Attributes Argument ( tag , Ġmap Of ( enum Attribute . fieldName Ġto Ġenum Attribute . typeName Ġ+ Ġ"." Ġ+ Ġenum Value . fieldName Ġ+ Ġ". real Value ")), čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" consumer " čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġif Ġ( tag . name . toLowerCase () Ġin Ġtags With Custom izable Namespace ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Args . add (" namespace ") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( deprecation Ġ!= Ġnull ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġindent ( indent ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuppress (" DE PREC ATION ") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġindent ( indent ) čĊĠĠĠĠĠĠĠ Ġhtml Dsl Marker () čĊĠĠĠĠĠĠĠ Ġfunction ( enum Value . fieldName Ġ+ Ġtag . member Name . capitalize (), Ġarguments , Ġ" Unit ", Ġreceiver Ġ= Ġreceiver ) čĊĠĠĠĠĠĠĠ Ġdefine Is ( build String Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call ( tag . className , Ġconstructor Args ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (".") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Call (" visit ", ĠlistOf ( content Argument Value ( tag , Ġblock Or Content ))) čĊĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠ Ġ} č Ċ } čĊč Ċ fun ĠAppend able . indent ( stops Ġ: ĠInt Ġ= Ġ 1 ) Ġ{ čĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġstops ) Ġ{ čĊĠĠĠĠĠĠĠ Ġappend (" ĠĠĠ Ġ") čĊĠĠĠ Ġ} č Ċ } čĊč Ċ private Ġfun Ġbuild Suggest ed Attributes Argument ( tag : ĠTag Info , Ġpredefined Values Ġ: ĠMap < String , ĠString > Ġ= Ġempty Map ()) Ġ: ĠString Ġ= čĊĠĠĠ Ġtag . merge Attributes (). filter Ġ{ it . name Ġin Ġtag . suggest ed Attributes }. map Ġ{ Ġattribute Ġ-> čĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġattribute . fieldName čĊčĊĠĠĠĠĠĠĠ Ġval Ġencoded Ġ= Ġif Ġ( name Ġin Ġpredefined Values ) Ġpredefined Values [ name ] Ġelse Ġwhen Ġ( attribute . type ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttribute Type . STRING Ġ-> Ġname čĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttribute Type . BOOLEAN Ġ-> Ġ"$ name ?. boolean Encode ()" čĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttribute Type . ENUM Ġ-> Ġ"$ name ?. enum Encode ()" čĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttribute Type . TICK ER Ġ-> Ġ"$ name ?. ticker Encode (${ attribute . name . quote () })" čĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttribute Type . STRING _ SET Ġ-> Ġname čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ"${ attribute . name . quote ()}, Ġ$ encoded " čĊĠĠĠ Ġ}. let Ġ{ Ġattribute Args Ġ-> čĊĠĠĠĠĠĠĠ Ġwhen Ġ( attribute Args . size ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ" empty Map " čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġattribute Args . join ToString (",", Ġ" attributes Map Of (", Ġ") ") čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊč Ċ private Ġfun Ġtag Builder Function Arguments ( tag : ĠTag Info , Ġblock Or Content Ġ: ĠBoolean ) Ġ: ĠArrayList < Var > Ġ{ čĊĠĠĠ Ġval Ġarguments Ġ= ĠArrayList < Var >() čĊĠĠĠ Ġval Ġcustom izable Namespace Ġ= Ġtag . name . toLowerCase () Ġin Ġtags With Custom izable Namespace čĊĠĠĠ Ġval Ġdefault Namespace : ĠString Ġ= ĠtagName spaces [ tag . name . toLowerCase ()] ?. quote (). toString () čĊčĊĠĠĠ Ġtag . merge Attributes (). filter Ġ{ it . name Ġin Ġtag . suggest ed Attributes }. forEach Ġ{ Ġattribute Ġ-> čĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġwhen Ġ( attribute . type ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttribute Type . STRING _ SET Ġ-> Ġ" String " čĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġattribute . typeName čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġarguments . add ( Var ( attribute . fieldName , Ġtype Ġ+ Ġ" ?", ĠdefaultValue Ġ= Ġ" null ")) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġadd Namespace Parameter () Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( custom izable Namespace ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ( Var (" namespace ", Ġ" String ?", Ġfalse , Ġfalse , Ġtrue , Ġdefault Namespace )) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġadd Block Parameter () Ġ{ čĊĠĠĠĠĠĠĠ Ġarguments . add ( Var (" block ", Ġ"${ tag . className }. () Ġ-> ĠUnit ", ĠdefaultValue Ġ= Ġ"{} ")) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġadd Content Parameter () Ġ{ čĊĠĠĠĠĠĠĠ Ġarguments . add ( Var (" content ", Ġ" String ", ĠdefaultValue Ġ= Ġ"\" \"" )) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġwhen Ġ{ čĊĠĠĠĠĠĠĠ Ġtag . name . toLowerCase () Ġin Ġempty Tags Ġ|| Ġblock Or Content Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Namespace Parameter () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Block Parameter () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Content Parameter () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Namespace Parameter () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġreturn Ġarguments č Ċ } čĊč Ċ private Ġfun ĠAppend able . html Dsl Marker () Ġ{ čĊĠĠĠ Ġappend ln ("@ Html Tag Marker ") č Ċ } čĊč Ċ private Ġfun ĠAppend able . tag K doc ( tag : ĠTag Info ) Ġ{ čĊĠĠĠ Ġval Ġk doc Ġ= Ġtag . k doc Ġ?: Ġreturn čĊĠĠĠ Ġappend ln (" /** ") čĊĠĠĠ Ġappend ln (" Ġ* Ġ${ k doc . description }") čĊĠĠĠ Ġappend ln (" Ġ*/ ") č Ċ } čĊč Ċ private Ġval Ġinline Tags Ġ= Ġ""" a č Ċ abbr č Ċ ac ronym č Ċ area č Ċ b č Ċ base č Ċ base font č Ċ b di č Ċ b do č Ċ bg sound č Ċ big č Ċ br č Ċ button č Ċ cite č Ċ code č Ċ command č Ċ data č Ċ datal ist č Ċ device č Ċ dfn č Ċ em č Ċ embed č Ċ font č Ċ i č Ċ iframe č Ċ img č Ċ input č Ċ kbd č Ċ key gen č Ċ label č Ċ legend č Ċ map č Ċ mark č Ċ menu item č Ċ meter č Ċ object č Ċ opt group č Ċ option č Ċ output č Ċ param č Ċ progress č Ċ q č Ċ rp č Ċ rt č Ċ ruby č Ċ samp č Ċ select č Ċ small č Ċ source č Ċ span č Ċ strong č Ċ sub č Ċ summary č Ċ sup č Ċ textarea č Ċ time č Ċ track č Ċ tt č Ċ u č Ċ var č Ċ w br """. lines (). toSet () čĊ