package Ġorg . ile as ile . k format . visitor s Ċ Ċ import Ġjava . util . Stack Ċ import Ġorg . ile as ile . k format . Build Action Ċ import Ġorg . ile as ile . k format . Format Ċ import Ġorg . ile as ile . k format . Format TextBlock Ċ import Ġorg . ile as ile . k format . Simple TextBlock Ċ import Ġorg . ile as ile . k format . k Format Ċ Ċ class ĠAn si Escape Visitor Ġ: ĠAbstract Ad ap table Visitor < String >() Ġ{ ĊĠĠĠ Ġprivate Ġval Ġformat Stack Ġ= ĠStack < Format >() ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Simple Text ( block : ĠSimple TextBlock ) Ġ= Ġblock . content ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Format Text ( block : ĠFormat TextBlock ): ĠString Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Format ( block . format ) ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Format Ġ= Ġif Ġ( format Stack . isNotEmpty ()) Ġformat Stack . peek () Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġmerged Format Ġ= Ġparent Format ?. merge ( block . format ) Ġ?: Ġblock . format ĊĊĠĠĠĠĠĠĠ Ġformat Stack . push ( merged Format ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġblock . children ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( visit Child ( child )) ĊĠĠĠĠĠĠĠ Ġformat Stack . pop () ĊĊĠĠĠĠĠĠĠ Ġappend ( Ansi Constants . RESET _ CSI ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Format Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Format ( parent Format ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStringBuilder . add Format ( format : ĠFormat ) Ġ= Ġwith ( format ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Tag If ( bold , ĠAn si Constants . BOLD _ MARK ) ĊĠĠĠĠĠĠĠ Ġadd Tag If ( italic , ĠAn si Constants . ITAL IC _ MARK ) ĊĠĠĠĠĠĠĠ Ġadd Tag If ( under lined , ĠAn si Constants . UNDER LINE _ MARK ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( color Ġ!= Ġnull ) Ġadd Tag ( color . encode Fg ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( bgColor Ġ!= Ġnull ) Ġadd Tag ( bgColor . encode Bg ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStringBuilder . add Tag ( tag : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ("${ Ansi Constants . CSI }${ tag } m ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStringBuilder . add Tag If ( cond : ĠBoolean ?, Ġtag : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cond Ġ!= Ġnull Ġ&& Ġcond ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Tag ( tag ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠAn si Constants Ġ{ ĊĠĠĠ Ġconst Ġval ĠESC Ġ= Ġ"\ u 0 0 1 b " ĊĠĠĠ Ġconst Ġval ĠC SI Ġ= Ġ"$ ESC [" ĊĠĠĠ Ġconst Ġval ĠRESET _ CSI Ġ= Ġ"${ CSI } m " ĊĊĠĠĠ Ġconst Ġval ĠB OLD _ MARK Ġ= Ġ" 1 " ĊĠĠĠ Ġconst Ġval ĠIT AL IC _ MARK Ġ= Ġ" 3 " ĊĠĠĠ Ġconst Ġval ĠUN DER LINE _ MARK Ġ= Ġ" 4 " Ċ } Ċ Ċ fun Ġbuild Ansi Formatted String ( builder : ĠBuild Action ) Ġ= ĊĠĠĠ Ġk Format ( builder ). accept ( Ansi Escape Visitor ()) Ċ