/* Ċ Ġ* ĠThe ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġw kg c ass Ġ( https :// github . com / w kg c ass ) Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ // Ġ# ifndef ĠK OT LIN _ NATIVE Ġ{{ Ċ package Ġv preprocessor Ċ Ċ import Ġv json . CharStream . Companion . from Ċ import Ġv json . ex . Parser Exception Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . FileReader Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ // Ġ}} Ċ Ċ // Ġ# ifdef ĠCO VER AGE Ġ{{ @ lo mbok . Generated }} Ċ // Ġ# ifndef ĠK OT LIN _ NATIVE Ġ{{ Ċ object ĠFile Pre processor Ġ{ ĊĠ Ġprivate Ġval Ġextension Map : ĠMutable Map < String , ĠPre processor Options > Ġ= ĠHashMap () ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġextension Map [" kt "] Ġ= ĠPre processor Options . KT ĊĠĠĠ Ġextension Map [" java "] Ġ= ĠPre processor Options . JAVA ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class , ĠParser Exception :: class ) ĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġprocess ( rootDir : ĠString , Ġparams : ĠProcess Params ) Ġ{ ĊĠĠĠ Ġval Ġroot Dir File Ġ= ĠFile ( rootDir ) ĊĠĠĠ Ġif Ġ(! rootDir File . isDirectory ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIOException ("\ $ rootDir Ġis Ġnot Ġa Ġdirectory ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġprocess ("", Ġroot Dir File , Ġparams ) ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class , ĠParser Exception :: class ) ĊĠ Ġprivate Ġfun Ġprocess ( relative Path : ĠString , Ġdir : ĠFile , Ġparams : ĠProcess Params ) Ġ{ ĊĠĠĠ Ġval Ġls Ġ= Ġdir . list Files () Ġ?: Ġreturn ĊĠĠĠ Ġfor Ġ( f Ġin Ġls ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnext Path Ġ= Ġrelative Path Ġ+ Ġ"/" Ġ+ Ġf . name ĊĠĠĠĠĠ Ġif Ġ( f . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess ( next Path , Ġf , Ġparams ) ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( f . isFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess File ( next Path , Ġf , Ġparams ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class , ĠParser Exception :: class ) ĊĠ Ġprivate Ġfun Ġprocess File ( relative Path : ĠString , Ġfile : ĠFile , Ġparams : ĠProcess Params ) Ġ{ ĊĠĠĠ Ġvar Ġopts : ĠPre processor Options ? Ġ= Ġnull ĊĠĠĠ Ġfor Ġ(( ext , Ġo ) Ġin Ġextension Map ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( file . name . endsWith (" .$ ext ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġopts Ġ= Ġo ĊĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( opts Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! params . path Filter ( relative Path )) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġparams . current File ( relative Path ) ĊĠĠĠ Ġval Ġcontent Ġ= Ġread ( file ) ĊĠĠĠ Ġval Ġctx Ġ= ĠPre processor Context ( opts ) ĊĠĠĠ Ġparams . context Initializer ( ctx ) ĊĠĠĠ Ġval Ġpre processor Ġ= ĠPre processor ( ctx ) ĊĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠ Ġpre processor . process ( from ( content ), Ġbuilder ) ĊĠĠĠ Ġval Ġresult Ġ= Ġbuilder . toString () ĊĠĠĠ ĠFileOutputStream ( file ). use Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠ Ġoutput . write ( result . toByteArray ()) ĊĠĠĠĠĠ Ġoutput . flush () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġprivate Ġfun Ġread ( file : ĠFile ): ĠString Ġ{ ĊĠĠĠ ĠFileReader ( file ). use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠ Ġval Ġc buf Ġ= ĠChar Array ( 1 0 2 4 ) ĊĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsz Ġ= Ġreader . read ( c buf ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sz Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsb . append ( c buf , Ġ 0 , Ġsz ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// Ġ}} ĊĠ Ġ// Ġ# ifdef ĠCO VER AGE Ġ{{ @ lo mbok . Generated }} ĊĠ Ġ// Ġ# ifndef ĠK OT LIN _ NATIVE Ġ{{ ĊĠ Ġclass ĠProcess Params Ġconstructor ( ĊĠĠĠ Ġval Ġcontext Initializer : Ġ( Pre processor Context ) Ġ-> ĠUnit , ĊĠĠĠ Ġval Ġpath Filter : Ġ( String ) Ġ-> ĠBoolean , ĊĠĠĠ Ġval Ġcurrent File : Ġ( String ) Ġ-> ĠUnit ĊĠ Ġ) Ċ } Ċ // Ġ}} Ċ