#! kotlin Ċ Ċ // ĠPerform Ġmisc Ġtext Ġcleanup Ġin Ġthe Ġ. md . html Ġfiles : Ċ // Ġremove Ġtrailing Ġspaces , Ġremove Ġrepeated Ġblank Ċ // Ġlines , Ġand Ġswitch Ġfrom Ġstraight Ġquotes Ġto Ġsmart Ċ // Ġquotes Ċ Ċ import Ġjava . io . File Ċ import Ġkotlin . system . exit Process Ċ Ċ Main (). run ( args ) Ċ Ċ class ĠMain Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġmodified Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġstrip Duplicate New lines Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġsmart Quotes Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġrun ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( args . isEmpty () Ġ|| Ġargs [ 0 ] Ġ== Ġ"-- help ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Usage : Ġfix space Ġ[-- strip - duplicate - new lines ] Ġ[-- smart - quotes ] Ġ< files >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġmutable ListOf < File >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( arg Ġin Ġargs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg Ġ== Ġ"-- strip - duplicate - new lines " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrip Duplicate New lines Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg Ġ== Ġ"-- smart - quotes " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmart Quotes Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg . startsWith ("-- ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Unknown Ġoption Ġ$ arg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( arg ). canonical File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println ("$ file Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġfiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfix ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprintln (" Formatted Ġ$ modified Ġfiles ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfix ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġfile . name ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== Ġ". git " Ġ|| Ġname . endsWith (". class ") Ġ|| Ġname . endsWith (". png ") Ġ|| Ġname . endsWith (". db ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( name . endsWith (". min . js ") Ġ|| Ġname Ġ== Ġ" node _ modules ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( name . endsWith (". html ") Ġ&& Ġ! name . endsWith (". md . html ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . list Files ()?. forEach Ġ{ Ġfix ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre format ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre format ( file : ĠFile ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġfile . read Text () ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġtext . lines ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Separator ( sb )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ('\ n ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( line . strip Trailing (). replace ("\ t ", Ġ" ĠĠĠ Ġ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġformatted Ġ= Ġsb . toString () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( smart Quotes Ġ&& Ġ( file . name . endsWith (". md ") Ġ|| Ġfile . name . endsWith (". html ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . name . endsWith (". txt "))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformatted Ġ= Ġfix Quotes ( formatted ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( formatted Ġ!= Ġtext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodified ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . write Text ( formatted ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfix Quotes ( formatted : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġin Code Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġin Quote Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġcolumn Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġin Pre Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder ( formatted . length ) ĊĠĠĠĠĠĠĠ Ġvar Ġskip Line Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġlineno Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġformatted . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġformatted [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ' `' Ġ&& Ġ( column Ġ> Ġ 0 Ġ|| Ġ! formatted . startsWith (" ``` ", Ġi )) Ġ&& Ġ! in Pre ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Code Ġ= Ġ! in Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( column Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( formatted . startsWith ("< style ", Ġi ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatted . startsWith ("< meta ", Ġi ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatted . startsWith (" <!-- ĠMark deep :", Ġi )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Line Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ' `' Ġ&& Ġformatted . startsWith (" ``` ", Ġi )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Pre Ġ= Ġ! in Pre ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ'~ ' Ġ&& Ġformatted . startsWith (" ~~~ ", Ġi )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Pre Ġ= Ġ! in Pre ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! in Pre Ġ&& Ġ! in Code Ġ&& Ġ! skip Line Ġ&& Ġc Ġ== Ġ'" ') Ġ{ Ġ// Ġ|| Ġc Ġ== Ġ' âĢľ U AST âĢĿ ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Quote Ġ= Ġ! in Quote ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( in Quote ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġ'\ u 2 0 1 C ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġ'\ u 2 0 1 D ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ'\ u 2 0 1 C ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġalready Ġconverted ; Ġmake Ġsure Ġwe Ġdon 't Ġget Ġconfused Ġif Ġthere 's Ġa Ġmismatch Ġbetween ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstraight Ġquotes Ġand Ġsmart Ġquotes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Quote Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( c Ġ== Ġ'\ u 2 0 1 D ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Quote Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskip Line Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlineno ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( c ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Separator ( sb : ĠStringBuilder ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( sb . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! strip Duplicate New lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( sb . length Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsb [ sb . length Ġ- Ġ 1 ] Ġ!= Ġ'\ n ' Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb [ sb . length Ġ- Ġ 2 ] Ġ!= Ġ'\ n ' ĊĠĠĠ Ġ} Ċ } Ċ