summaryrefslogtreecommitdiff
path: root/tools/retab.sml
diff options
context:
space:
mode:
Diffstat (limited to 'tools/retab.sml')
-rw-r--r--tools/retab.sml98
1 files changed, 0 insertions, 98 deletions
diff --git a/tools/retab.sml b/tools/retab.sml
deleted file mode 100644
index 8e2a054e..00000000
--- a/tools/retab.sml
+++ /dev/null
@@ -1,98 +0,0 @@
-(*
- * retab (c) 2009 The Mana World development team
- * License: GPL, version 2 or later
- *
- * Compilation, e.g. (depends on SML implementation):
- * mlton retab.sml
- *
- * Example usage:
- * tools/retab < db/mob_db.txt > db/mob_db.txt.new && mv db/mob_db.txt.new db/mob_db.txt
- *
- * TODO:
- * - Commas inside {} need to be seen as just one field when tabified
- * - Commented lines should be left untabified
- *)
-
-fun width (#"\t", i) = let val m = i mod 8 in if m = 0 then 8 else m end
- | width (c, i) = 1
-
-fun encode_width (offset) (l) =
- let fun expand ([], i) = []
- | expand (c::tl, i) = let val w = width (c, i)
- in (c, i, i + w) :: expand (tl, i + w)
- end
- in expand (l, offset)
- end
-
-fun strip_blanks (#" "::tl) = strip_blanks (tl)
- | strip_blanks (#"\t"::tl) = strip_blanks (tl)
- | strip_blanks (#"\n"::tl) = strip_blanks (tl)
- | strip_blanks (#"\r"::tl) = strip_blanks (tl)
- | strip_blanks (other) = other
-
-fun clean (s) = rev (strip_blanks (rev (strip_blanks (s))))
-
-fun split_comma (#","::tl) = [#","] :: (split_comma (strip_blanks (tl)))
- | split_comma ([]) = []
- | split_comma (h::tl) = (case split_comma (tl) of
- [] => [[h]]
- | (h'::tl) => (h::h')::tl
- )
-
-fun expand (l : char list list list, offset : int) : char list list list =
- if List.all (null) (l) (* at the end of all rows *)
- then l
- else let fun splitlist ([]::tl) = let val (heads, tails) = splitlist (tl)
- in ([]::heads, []::tails)
- end
- | splitlist ((hrow::tlrow)::tl) = let val (heads, tails) = splitlist (tl)
- in (hrow::heads, tlrow::tails)
- end
- | splitlist ([]) = ([], [])
- val (heads, tails) = splitlist (l)
- val eheads = map (encode_width offset) heads
-
- fun last_offset [] = offset
- | last_offset (cell) = let val (_, _, x)::_ = rev (cell) in x end
- val desired_final_offset = foldl Int.max offset (map last_offset (eheads))
-(*
- val () = print ("start offset = " ^ Int.toString (offset) ^ "\n")
- val () = print ("FINAL OFFSET = " ^ Int.toString (desired_final_offset) ^ "\n")
-*)
- fun align (i) = ((i + 7) div 8) * 8
- val desired_final_offset = align(desired_final_offset)
-(*
- val () = print ("FINAL OFFSET (align) = " ^ Int.toString (desired_final_offset) ^ "\n")
-*)
- fun fill (offset) = if offset >= desired_final_offset
- then []
- else #"\t" :: fill (align (offset - 7) + 8)
- val fill = if List.all null tails
- then fn _ => []
- else fill
- fun tabexpand ([]) = fill (offset)
- | tabexpand (cell) = let val (_, _, finalwidth)::_ = rev (cell)
- fun strip (x, _, _) = x
- in rev (fill (finalwidth) @ rev (map strip (cell)))
- end
- val expanded_heads = map tabexpand (eheads)
- val expanded_tails = expand (tails, desired_final_offset)
- in ListPair.map op:: (expanded_heads, expanded_tails)
- end
-
-fun align_strings (s : string list) = map (implode o List.concat) (expand (map ((map clean) o split_comma o explode) s, 0))
-
-(*val test = align_strings (["foo, bar, quux", "a,b", "0,01234567890,c"])*)
-
-fun println (s) = (print (s);
- print "\n")
-
-fun read_input () =
- case TextIO.inputLine (TextIO.stdIn) of
- NONE => []
- | SOME s => s :: read_input ()
-
-fun main (_, _) = app println (align_strings (read_input ()))
-
-val () = main ("", [])
-