aboutsummaryrefslogtreecommitdiff
path: root/lib/tools/format.nom
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tools/format.nom')
-rwxr-xr-xlib/tools/format.nom45
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/tools/format.nom b/lib/tools/format.nom
new file mode 100755
index 0000000..e60d12e
--- /dev/null
+++ b/lib/tools/format.nom
@@ -0,0 +1,45 @@
+#!/usr/bin/env nomsu -V6.14
+#
+ Auto-format Nomsu code. Usage:
+ nomsu -t format [-i] file1 file2...
+
+ If the "-i" flag is used, the file will be edited in-place.
+ If the "-q" flag is used and an error occurs, the original file will be printed.
+ If no files are passed in, this will read from stdin.
+
+use "filesystem"
+use "commandline"
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+command line program with $args:
+ $filenames = $args.extras
+ if ((#$filenames) == 0):
+ say ("
+ Warning: reading from stdin (ctrl-d to abort). To avoid this message, use nomsu -t format -
+ ")
+ $filenames = ["stdin"]
+
+ for $filename in $filenames:
+ $file = (read file $filename)
+ unless $file:
+ fail "File does not exist: \$filename"
+ $leading_indent = ($file, matching "\n*([ ]*)")
+ $code = (NomsuCode from ($Source $filename 1 (size of $file)) $file)
+ try:
+ $tree = ($code parsed)
+ ..if it fails $msg:
+ if $args.q:
+ $formatted = $file
+ ..else:
+ say $msg
+
+ if ($tree and (not $formatted)):
+ $formatted =
+ "\$leading_indent\($tree as nomsu, text, with "\n" -> "\n\$leading_indent")"
+
+ if $formatted:
+ if $args.i:
+ write $formatted to file $filename
+ ..else:
+ say $formatted inline