package Ġbuilder Ċ Ċ import Ġmodel .* Ċ Ċ /** Ċ Ġ* ĠD sl Ġbuilder Ġfor Ġa Ġcode Ġblock Ċ Ġ* Ċ Ġ* Ġ@ author Ġ ĠJul ian ĠKo tr ba Ċ Ġ*/ Ċ class ĠCode Sequence Builder ( var Ġtext : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstyle Set : ĠStyle Set , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġelement Class : ĠString Ġ= Ġ"") Ġ{ ĊĊĠĠĠ Ġfun Ġbuild (): ĠCode Sequence Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Sequence ( text , Ġstyle Set , Ġelement Class ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠMultiple Code Sequences Builder ( var Ġchar Sequences : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstyle Sets : ĠList < Style Set >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġelement Classes : ĠList < Pair < Int , ĠString >> Ġ= Ġempty List ()) Ġ{ ĊĊĠĠĠ Ġfun Ġbuild (): ĠList < Code Sequence > Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidate () ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Code Sequences () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate () Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidate Char Sequences () ĊĠĠĠĠĠĠĠ Ġvalidate Before And After Styles () ĊĠĠĠĠĠĠĠ Ġvalidate Element Classes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Char Sequences () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( char Sequences . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" There Ġmust Ġbe Ġat Ġleast Ġone Ġchar Sequence ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Before And After Styles () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( style Sets . size Ġ!= Ġchar Sequences . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" There Ġmust Ġbe Ġa ĠPair < text Style Before : ĠCode Sequence Style , Ġtext Style After : ĠCode Sequence Style > Ġfor Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" every Ġchar Ġsequence . ĠCurrently Ġthere Ġ${ if Ġ( style Sets . size Ġ== Ġ 1 ) Ġ" is " Ġelse Ġ" are "} Ġjust " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ style Sets . size } Ġstyle Ġ${ if Ġ( style Sets . size Ġ== Ġ 1 ) Ġ" pair " Ġelse Ġ" pairs "} ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Element Classes () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Classes . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Classes . forEach Ġ{ Ġ( index , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" An Ġindex Ġless Ġthan Ġor Ġequal Ġto Ġone Ġis Ġnot Ġallowed . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Use Ġan Ġindex Ġfrom Ġ 1 Ġto Ġ${ char Sequences . size } ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( index Ġ> Ġchar Sequences . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The Ġindex Ġ$ index Ġis Ġtoo Ġbig . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Use Ġan Ġindex Ġfrom Ġ 1 Ġto Ġ${ char Sequences . size } ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Code Sequences (): ĠList < Code Sequence > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex To Element Class Map Ġ= Ġelement Classes . toMap () ĊĠĠĠĠĠĠĠ Ġval Ġcode Sequences Ġ= Ġmutable ListOf < Code Sequence >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchar Sequences . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode Sequences . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCode Sequence ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Sequences [ i ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Sets [ i ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex To Element Class Map . getOrElse ( i Ġ+ Ġ 1 ) Ġ{ Ġ"" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcode Sequences ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCode Line Builder Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCODE _ SEQUENCE _ DEFAULT _ TEXT Ġ= Ġ" Ġ" ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCODE _ SEQUENCE _ DEFAULT _ COLOR Ġ= Ġ"# FFFFFF " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtexts Ġ= Ġmutable ListOf < Code Sequence >() ĊĊĠĠĠ Ġoperator Ġfun ĠCode Sequence . unary Plus () Ġ{ ĊĠĠĠĠĠĠĠ Ġtexts Ġ+= Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcode Sequence ( init : ĠCode Sequence Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Wrapper Builder Ġ= ĠCode Sequence Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCODE _ SEQUENCE _ DEFAULT _ TEXT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStyle Set ( Code Sequence Style ( CODE _ SEQUENCE _ DEFAULT _ COLOR ), ĠCode Sequence Style ( CODE _ SEQUENCE _ DEFAULT _ COLOR )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtext Wrapper Builder . init () ĊĠĠĠĠĠĠĠ Ġtexts Ġ+= Ġtext Wrapper Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcode Sequence (_ text : ĠString , Ġ_ style Set : ĠStyle Set , Ġ_ element Class : ĠString Ġ= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠ Ġcode Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ_ text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Set Ġ= Ġ_ style Set ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Class Ġ= Ġ_ element Class ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcode Sequence With Tabs ( tab Count : ĠInt , Ġtext : ĠString , Ġstyle Set : ĠStyle Set , Ġelement Class : ĠString Ġ= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠ Ġcode Sequence ( text . add Prefix Tabs ( tab Count ), Ġstyle Set , Ġelement Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcode Sequence With Tabs ( tab Count : ĠInt , Ġinit : ĠCode Sequence Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Wrapper Builder Ġ= ĠCode Sequence Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCODE _ SEQUENCE _ DEFAULT _ TEXT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStyle Set ( Code Sequence Style ( CODE _ SEQUENCE _ DEFAULT _ COLOR ), ĠCode Sequence Style ( CODE _ SEQUENCE _ DEFAULT _ COLOR )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtext Wrapper Builder . init () ĊĠĠĠĠĠĠĠ Ġval Ġtext Wrapper Ġ= Ġtext Wrapper Builder . build () ĊĠĠĠĠĠĠĠ Ġtexts Ġ+= Ġtext Wrapper . copy ( text Ġ= Ġtext Wrapper . text . add Prefix Tabs ( tab Count )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmultiple Code Sequences ( init : ĠMultiple Code Sequences Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Wrapper Builder Ġ= ĠMultiple Code Sequences Builder ( emptyList (), Ġempty List (), Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġtext Wrapper Builder . init () ĊĠĠĠĠĠĠĠ Ġtexts Ġ+= Ġtext Wrapper Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmultiple Code Sequences With Leading Tabs ( tab Count : ĠInt , Ġinit : ĠMultiple Code Sequences Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Wrapper Builder Ġ= ĠMultiple Code Sequences Builder ( emptyList (), Ġempty List (), Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġtext Wrapper Builder . init () ĊĊĠĠĠĠĠĠĠ Ġval Ġcopy Of Char Sequences Ġ= Ġtext Wrapper Builder . char Sequences . to Mutable List () ĊĠĠĠĠĠĠĠ Ġtext Wrapper Builder . char Sequences Ġ= Ġcopy Of Char Sequences . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ 0 ] Ġ= Ġthis [ 0 ]. add Prefix Tabs ( tab Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtexts Ġ+= Ġtext Wrapper Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild (): ĠCode Line Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Line ( this . texts ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Deprecated (" You Ġcannot Ġcreate Ġa Ġline Ġof Ġcode Ġin Ġa Ġline Ġof Ġcode .", Ġlevel Ġ= ĠDeprec ation Level . ERROR ) ĊĠĠĠ Ġfun Ġcode Line ( param : Ġ() Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCode Builder Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcode Lines Ġ= Ġmutable ListOf < Code Line >() ĊĊĠĠĠ Ġoperator Ġfun ĠCode Line . unary Plus () Ġ{ ĊĠĠĠĠĠĠĠ Ġcode Lines Ġ+= Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcode Line ( init : ĠCode Line Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Line Builder Ġ= ĠCode Line Builder () ĊĠĠĠĠĠĠĠ Ġcode Line Builder . init () ĊĠĠĠĠĠĠĠ Ġcode Lines Ġ+= Ġcode Line Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild (): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCode Block ( code Lines ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Deprecated (" You Ġare Ġalready Ġin Ġa Ġcode Ġblock .", Ġlevel Ġ= ĠDeprec ation Level . ERROR ) ĊĠĠĠ Ġfun Ġcode ( param : Ġ() Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcode Block ( init : ĠCode Builder . () Ġ-> ĠUnit ): ĠCode Block Ġ{ ĊĠĠĠ Ġval Ġcode Builder Ġ= ĠCode Builder () ĊĠĠĠ Ġcode Builder . init () ĊĠĠĠ Ġreturn Ġcode Builder . build () Ċ } Ċ Ċ fun ĠString . add Prefix Tabs ( tab Count : ĠInt ): ĠString Ġ= Ġ" ĠĠĠ Ġ". repeat ( tab Count ) Ġ+ Ġthis