package Ġgenerator Ċ Ċ import Ġokhttp 3 . Http Url . Companion . to Http Url OrNull Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Standard Copy Option Ċ import Ġjava . util . Locale Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġmeant Ġto Ġbe Ġused Ġin Ġplace Ġof Ġa Ġfactory Ġextension , Ġspecifically Ġfor Ġwhat Ġwould Ġbe Ġa Ġmulti - source Ġextension . Ċ Ġ* ĠA Ġmulti - lang Ġ( but Ġnot Ġmulti - source ) Ġextension Ġshould Ġstill Ġbe Ġmade Ġas Ġa Ġfactory Ġextension . Ċ Ġ* ĠUse Ġa Ġgenerator Ġfor Ġinitial Ġsetup Ġof Ġa Ġtheme Ġsource Ġor Ġwhen Ġall Ġof Ġthe Ġin her itors Ġneed Ġa Ġversion Ġbump . Ċ Ġ* ĠSource Ġlist Ġ( val Ġsources ) Ġshould Ġbe Ġkept Ġup Ġto Ġdate . Ċ Ġ*/ Ċ interface ĠTheme Source Generator Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġclass Ġthat Ġthe Ġsources Ġinherit Ġfrom . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtheme Class : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġpackage Ġthat Ġcontains Ġtheme Class . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġtheme Pkg : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBase Ġtheme Ġversion , Ġstarts Ġwith Ġ 1 Ġand Ġshould Ġbe Ġincreased Ġwhen Ġbased Ġtheme Ġclass Ġchanges ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbase Version Code : ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġlist Ġof Ġsources Ġto Ġbe Ġcreated Ġor Ġupdated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsources : ĠList < Theme Source Data > ĊĊĠĠĠ Ġfun Ġcreate All () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Dir Ġ= ĠSystem . getProperty (" user . dir ") !! ĊĠĠĠĠĠĠĠ Ġsources . forEach Ġ{ Ġcreate Gradle Project ( it , Ġtheme Pkg , Ġtheme Class , Ġbase Version Code , Ġuser Dir ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġpkg Name Suffix ( source : ĠTheme Source Data , Ġseparator : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( source Ġis ĠTheme Source Data . Single Lang ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( source . lang . substring Before ("- "), Ġsource . pkg Name ). join ToString ( separator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" all ", Ġsource . pkg Name ). join ToString ( separator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtheme Suffix ( theme Pkg : ĠString , Ġseparator : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf (" eu ", Ġ" kan ade ", Ġ" t ach iy omi ", Ġ" multis rc ", Ġtheme Pkg ). join ToString ( separator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġwrite Gradle ( gradle : ĠFile , Ġsource : ĠTheme Source Data , Ġtheme Pkg : ĠString , Ġbase Version Code : ĠInt , Ġdefault Additional Gradle Path : ĠString , Ġadditional Gradle Override Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠFile . read Text OrEmpty String (): ĠString Ġ= Ġif Ġ( exists ()) Ġread Text ( Charsets . UTF _ 8 ) Ġelse Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Additional Gradle Text Ġ= ĠFile ( default Additional Gradle Path ). read Text OrEmpty String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional Gradle Override Text Ġ= ĠFile ( additional Gradle Override Path ). read Text OrEmpty String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplaceholders Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SOURCE HOST " Ġto Ġsource . baseUrl . to Http Url OrNull ()?. host , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SOURCES CHE ME " Ġto Ġsource . baseUrl . to Http Url OrNull ()?. scheme ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). filter Ġ{ Ġit . value Ġ!= Ġnull Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġgradle . write Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHIS ĠFILE ĠIS ĠAUTO - GENERATED ; ĠDO ĠNOT ĠEDIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġplugin : Ġ' com . android . application ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġplugin : Ġ' kotlin - android ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġplugin : Ġ' kotlin x - serialization ' ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġext Name Ġ= Ġ'${ source . name }' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpkg Name Suffix Ġ= Ġ'${ pkg Name Suffix ( source , Ġ". ") }' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġext Class Ġ= Ġ'. ${ source . className }' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġext Factory Ġ= Ġ'$ theme Pkg ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġext Version Code Ġ= Ġ${ base Version Code Ġ+ Ġsource . override Version Code Ġ+ Ġmultis rc Library Version } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ if Ġ( source . is N sf w ) Ġ" is N sf w Ġ= Ġtrue \ n " Ġelse Ġ"" } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ default Additional Gradle Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ$ additional Gradle Override Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Ġfrom : Ġ"${ '$ '} rootDir / common . gradle " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest Place holders Ġ+= Ġ[ Ċ ${ placeholders . map Ġ{ Ġ"${ " Ġ". repeat ( 2 8 )} ${ it . key }: Ġ\" ${ it . value }\ "" }. join ToString (", \ n ")} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġwrite Android Manifest ( android Manifest File : ĠFile , Ġmanifest Overrides Path : ĠString , Ġdefault Android Manifest Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġandroid Manifest Override Ġ= ĠFile ( manifest Overrides Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Android Manifest Ġ= ĠFile ( default Android Manifest Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( android Manifest Override . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Manifest Override . copy To ( android Manifest File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( default Android Manifest . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Android Manifest . copy To ( android Manifest File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Manifest File . write Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ<? xml Ġversion =" 1 . 0 " Ġencoding =" utf - 8 "?> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ<!-- ĠTHIS ĠFILE ĠIS ĠAUTO - GENERATED ; ĠDO ĠNOT ĠEDIT Ġ--> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< manifest Ġpackage =" eu . kan ade . t ach iy omi . extension " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Gradle Project ( source : ĠTheme Source Data , Ġtheme Pkg : ĠString , Ġtheme Class : ĠString , Ġbase Version Code : ĠInt , Ġuser Dir : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuser Dir Ġ= Ġt ach iy omi - extensions Ġproject Ġroot Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject RootPath Ġ= Ġ"$ user Dir / generated - src /${ pkg Name Suffix ( source , Ġ"/") }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Src Path Ġ= Ġ"$ project RootPath / src / eu / kan ade / t ach iy omi / extension /${ pkg Name Suffix ( source , Ġ"/") }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoverrides Path Ġ= Ġ"$ user Dir / multis rc / overrides /$ theme Pkg /${ source . pkg Name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Res Path Ġ= Ġ"$ user Dir / multis rc / overrides /$ theme Pkg / default / res " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Android Manifest Path Ġ= Ġ"$ user Dir / multis rc / overrides /$ theme Pkg / default / Android Manifest . xml " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Additional Gradle Path Ġ= Ġ"$ user Dir / multis rc / overrides /$ theme Pkg / default / additional . gradle " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Override Path Ġ= Ġ"$ overrides Path / res " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Override Path Ġ= Ġ"$ overrides Path / src " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanifest Override Path Ġ= Ġ"$ overrides Path / Android Manifest . xml " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional Gradle Override Path Ġ= Ġ"$ overrides Path / additional . gradle " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Gradle File Ġ= ĠFile ("$ project RootPath / build . gradle ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Android Manifest File Ġ= ĠFile ("$ project RootPath / Android Manifest . xml ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( project RootPath ). let Ġ{ Ġproject Root File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Generating Ġ$ source ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Root File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġeverything Ġfrom Ġpast Ġruns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclean Directory ( project Root File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Gradle ( project Gradle File , Ġsource , Ġtheme Pkg , Ġbase Version Code , Ġdefault Additional Gradle Path , Ġadditional Gradle Override Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Android Manifest ( project Android Manifest File , Ġmanifest Override Path , Ġdefault Android Manifest Path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Source Classes ( project Src Path , Ġsrc Override Path , Ġsource , Ġtheme Pkg , Ġtheme Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Theme Classes ( user Dir , Ġtheme Pkg , Ġproject RootPath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Theme Read mes ( user Dir , Ġtheme Pkg , Ġoverrides Path , Ġproject RootPath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Res Files ( res Override Path , Ġdefault Res Path , Ġsource , Ġproject RootPath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcopy Theme Read mes ( user Dir : ĠString , Ġtheme Pkg : ĠString , Ġoverrides Path : ĠString , Ġproject RootPath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Path Ġ= Ġ"$ user Dir / multis rc / src / main / java /${ theme Suffix ( theme Pkg , Ġ"/") }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestination Path Ġ= Ġ"$ project RootPath " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( destination Path ). mkdir s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( source Path , Ġoverrides Path ). forEach Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . list () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġit . endsWith (" README . md ") Ġ|| Ġit . endsWith (" CHANGELOG . md ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ("$ path /$ it "). to Path (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ("$ destination Path /$ it "). to Path (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStandard Copy Option . REPLACE _ EXIST ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcopy Theme Classes ( user Dir : ĠString , Ġtheme Pkg : ĠString , Ġproject RootPath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Src Path Ġ= Ġ"$ user Dir / multis rc / src / main / java /${ theme Suffix ( theme Pkg , Ġ"/") }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Dest Path Ġ= Ġ"$ project RootPath / src /${ theme Suffix ( theme Pkg , Ġ"/") }" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( theme Dest Path ). mkdir s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( theme Src Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . list () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġit . endsWith (". kt ") Ġ&& Ġ! it . endsWith (" Generator . kt ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . forEach Ġ{ ĠFiles . copy ( File ("$ theme Src Path /$ it "). to Path (), ĠFile ("$ theme Dest Path /$ it "). to Path (), ĠStandard Copy Option . REPLACE _ EXIST ING ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcopy Res Files ( res Override Path : ĠString , Ġdefault Res Path : ĠString , Ġsource : ĠTheme Source Data , Ġproject RootPath : ĠString ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġres Ġoverride Ġexists Ġif Ġnot Ġcopy Ġdefault Ġres ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Override Ġ= ĠFile ( res Override Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( res Override . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres Override . copy Re cursively ( File ("$ project RootPath / res ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( default Res Path ). let Ġ{ Ġdefault Res File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( default Res File . exists ()) Ġdefault Res File . copy Re cursively ( File ("$ project RootPath / res ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġwrite Source Classes ( project Src Path : ĠString , Ġsrc Override Path : ĠString , Ġsource : ĠTheme Source Data , Ġtheme Pkg : ĠString , Ġtheme Class : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Src File Ġ= ĠFile ( project Src Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Src File . mkdir s () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Override File Ġ= ĠFile ( src Override Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Override File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Override File . copy Re cursively ( project Src File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Source Class ( project Src File , Ġsource , Ġtheme Pkg , Ġtheme Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġwrite Source Class ( class Path : ĠFile , Ġsource : ĠTheme Source Data , Ġtheme Pkg : ĠString , Ġtheme Class : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfactory Class Text () Ġ= Ġwhen Ġ( source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTheme Source Data . Single Lang Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" class Ġ${ source . className } Ġ: Ġ$ theme Class ("${ source . source Name }", Ġ"${ source . baseUrl }", Ġ"${ source . lang }") """ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTheme Source Data . Multi Lang Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Classes Ġ= Ġsource . langs . map Ġ{ Ġlang Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" $ theme Class ("${ source . source Name }", Ġ"${ source . baseUrl }", Ġ"$ lang ") """ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Ġ${ source . className } Ġ: ĠSource Factory Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Sources () Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ source Classes . join ToString (", \ n ")} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ("$ class Path /${ source . className }. kt "). write Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" /* Ġk tl int - disable Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHIS ĠFILE ĠIS ĠAUTO - GENERATED ; ĠDO ĠNOT ĠEDIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġeu . kan ade . t ach iy omi . extension .${ pkg Name Suffix ( source , Ġ". ")} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Ġeu . kan ade . t ach iy omi . multis rc .$ theme Pkg .$ theme Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ if Ġ( source Ġis ĠTheme Source Data . Multi Lang ) Ġ" import Ġeu . kan ade . t ach iy omi . source . Source Factory " Ġelse Ġ"" } ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ factory Class Text ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġclean Directory ( dir : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir . list Files ()?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclean Directory ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠTheme Source Data Ġ{ ĊĠĠĠ Ġabstract Ġval Ġname : ĠString ĊĠĠĠ Ġabstract Ġval ĠbaseUrl : ĠString ĊĠĠĠ Ġabstract Ġval Ġis N sf w : ĠBoolean ĊĠĠĠ Ġabstract Ġval ĠclassName : ĠString ĊĠĠĠ Ġabstract Ġval Ġpkg Name : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverride Ġit Ġif Ġfor Ġsome Ġreason Ġthe Ġname Ġattribute Ġinside Ġthe Ġsource Ġclass ĊĠĠĠĠ Ġ* Ġshould Ġbe Ġdifferent Ġfrom Ġthe Ġextension Ġname . ĠUseful Ġin Ġcases Ġwhere Ġthe ĊĠĠĠĠ Ġ* Ġextension Ġname Ġshould Ġbe Ġrom an ized Ġand Ġthe Ġsource Ġname Ġshould Ġbe Ġthe Ġone ĊĠĠĠĠ Ġ* Ġin Ġthe Ġsource Ġlanguage . ĠDefaults Ġto Ġthe Ġextension Ġname Ġif Ġnot Ġspecified . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġval Ġsource Name : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġoverride Version Code Ġdefaults Ġto Ġ 0 , Ġif Ġa Ġsource Ġchanges Ġtheir Ġsource Ġoverride Ġcode Ġor ĊĠĠĠĠ Ġ* Ġa Ġprevious Ġexisting Ġsource Ġsudden ly Ġneeds Ġsource Ġcode Ġoverrides , Ġoverride Version Code ĊĠĠĠĠ Ġ* Ġshould Ġbe Ġincreased . ĊĠĠĠĠ Ġ* ĠWhen Ġa Ġnew Ġsource Ġis Ġadded Ġwith Ġoverrides , Ġoverride Version Code Ġshould Ġstill Ġbe Ġset Ġto Ġ 0 ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : Ġsource Ġcode Ġoverrides Ġare Ġlocated Ġin Ġ" multis rc / overrides / src /< theme Name >/< source Name >" ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġval Ġoverride Version Code : ĠInt ĊĊĠĠĠ Ġdata Ġclass ĠSingle Lang ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠbaseUrl : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġlang : ĠString , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis N sf w : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠclassName : ĠString Ġ= Ġname . replace (" Ġ", Ġ""), ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġpkg Name : ĠString Ġ= ĠclassName . toLowerCase ( Locale . EN GL ISH ), ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġsource Name : ĠString Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġoverride Version Code : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġ) Ġ: ĠTheme Source Data () ĊĊĠĠĠ Ġdata Ġclass ĠMulti Lang ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠbaseUrl : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġlang s : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis N sf w : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġoverride Ġval ĠclassName : ĠString Ġ= Ġname . replace (" Ġ", Ġ"") Ġ+ Ġ" Factory ", ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġpkg Name : ĠString Ġ= ĠclassName . substring Before (" Factory "). toLowerCase ( Locale . EN GL ISH ), ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġsource Name : ĠString Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġoverride Version Code : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġ) Ġ: ĠTheme Source Data () Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġvariable Ġshould Ġbe Ġincreased Ġwhen Ġthe Ġmultis rc Ġlibrary Ġchanges Ġin Ġa Ġway Ġthat Ġpromp ts Ġglobal Ġextension Ġupgrade Ċ Ġ*/ Ċ const Ġval Ġmultis rc Library Version Ġ= Ġ 0 Ċ