Files
sml-projects/imperative-shell/converter.sml

77 lines
2.2 KiB
Standard ML

structure Converter =
struct
fun loadIO (io, str) =
case TextIO.inputLine io of
SOME line => loadIO (io, str ^ line)
| NONE => str
fun convertFile fullPath =
let
val io = TextIO.openIn fullPath
val text = loadIO (io, "")
val () = TextIO.closeIn io
in
case Parser.parse text of
SOME (canvasWidth, canvasHeight, tree) =>
let
val maxSide = Int.max (canvasWidth, canvasHeight)
val squares = LayerTree.flatten (maxSide, tree)
val exportString =
CollisionTree.toExportString (squares, canvasWidth, canvasHeight)
val pathWithoutExtension = String.substring
(fullPath, 0, String.size fullPath - 4)
val outputFilePath = pathWithoutExtension ^ ".sml"
val io = TextIO.openOut outputFilePath
val () = TextIO.output (io, exportString)
in
TextIO.closeOut io
end
| NONE => (* we have an error, but ignore *) ()
end
fun endsWithDsc str =
if String.size str >= 4 then
let
val size = String.size str
val expectedExtension = String.substring (str, size - 4, 4)
in
expectedExtension = ".dsc"
end
else
false
fun loop (dir, rootPath) =
case OS.FileSys.readDir dir of
SOME path =>
let
val folderPath = String.concat [rootPath, "/", path]
val () =
if OS.FileSys.isDir folderPath then
(* handle recursive directory *)
let val newDir = OS.FileSys.openDir folderPath
in loop (newDir, folderPath)
end
else if OS.FileSys.isLink folderPath then
(* ignore *)
()
else if endsWithDsc path then
(* is a file ending with .dsc extension *)
convertFile folderPath
else
(* is a file but doesn't end with .dsc, so ignore *)
()
in
loop (dir, rootPath)
end
| NONE => OS.FileSys.closeDir dir
fun main () =
let
val path = OS.FileSys.getDir ()
val dir = OS.FileSys.openDir path
in
loop (dir, path)
end
end