From 9a5848cfe1ce7930025ad52794a22c9e05e13702 Mon Sep 17 00:00:00 2001 From: Taddeus Kroes <taddeuskroes@gmail.com> Date: Mon, 21 Jul 2014 13:18:22 +0200 Subject: [PATCH] Rewrote main function, added some command-line arguments --- main.ml | 92 +++++++++++++++++++++++++++++++++++++++----------------- types.ml | 6 ---- util.ml | 17 +++++------ 3 files changed, 73 insertions(+), 42 deletions(-) diff --git a/main.ml b/main.ml index 6bca2df..79350fd 100644 --- a/main.ml +++ b/main.ml @@ -1,12 +1,22 @@ open Lexing open Types +type args = { + mutable infiles : string list; + mutable outfile : string option; + mutable verbose : int; + mutable echo : bool; + mutable keep_comments : bool; +} + (* Parse command-line arguments *) let parse_args () = let args = { infiles = []; outfile = None; verbose = 1; + echo = false; + keep_comments = false; } in let args_spec = [ ("<file> ...", Arg.Rest (fun _ -> ()), @@ -18,6 +28,12 @@ let parse_args () = ("-v", Arg.Int (fun i -> args.verbose <- i), "<num> Set verbosity (0: nothing, 1: errors (default), \ 2: compression rate, 3: debug)"); + + ("--echo", Arg.Unit (fun _ -> args.echo <- true), + " Don't minify, just pretty-print the parsed CSS"); + + ("--keep-comments", Arg.Unit (fun _ -> args.keep_comments <- true), + "\n Preserve top-level comments"); ] in let usage = @@ -27,35 +43,57 @@ let parse_args () = Arg.parse args_spec (fun f -> args.infiles <- args.infiles @ [f]) usage; args -(* Main function, returns exit status - * Command-line arguments are stored in lobals.args *) +let parse_files = function + | [] -> + let input = Util.input_buffered stdin 512 in + (input, Parse.parse_input "<stdin>" input) + | files -> + let rec loop = function + | [] -> [] + | filename :: tl -> + let input = Util.input_all (open_in filename) in + let stylesheet = Parse.parse_input filename input in + (input, stylesheet) :: loop tl + in + let inputs, stylesheets = List.split (loop files) in + (String.concat "" inputs, List.concat stylesheets) + +let handle_args args = + let input, stylesheet = parse_files args.infiles in + + let write_output = + match args.outfile with + | None -> print_endline + | Some name -> + fun css -> let f = open_out name in output_string f css; close_out f + in + + match args with + | {echo = true} -> + write_output (Stringify.string_of_stylesheet stylesheet) + | _ -> + let output = Stringify.minify_stylesheet stylesheet in + write_output output; + if args.verbose >= 2 then begin + let il = String.length input in + let ol = String.length output in + Printf.fprintf stderr "compression: %d -> %d bytes (%d%% of original)\n" + il ol (int_of_float (float_of_int ol /. float_of_int il *. 100.)) + end + +(* Main function, returns exit status *) let main () = let args = parse_args () in - try - let stylesheet = - match args.infiles with - | [] -> - let input = Util.input_buffered stdin 512 in - Parse.parse_input "<stdin>" input - | files -> - let rec loop = function - | [] -> [] - | filename :: tl -> - let input = Util.input_all (open_in filename) in - let stylesheet = Parse.parse_input filename input in - stylesheet @ loop tl - in - loop files - in - print_endline (Stringify.string_of_stylesheet stylesheet); - print_endline "\n"; - print_endline (Stringify.minify_stylesheet stylesheet); - exit 0 - with - | LocError (loc, msg) -> - Util.prerr_loc_msg args loc ("Error: " ^ msg); - | Failure err -> - prerr_endline ("Error: " ^ err); + begin + try + handle_args args; + exit 0 + with + | LocError (loc, msg) -> + Util.prerr_loc_msg (args.verbose >= 1) loc ("Error: " ^ msg); + | Failure err -> + prerr_endline ("Error: " ^ err); + end; exit 1 let _ = main () diff --git a/types.ml b/types.ml index cd35ff5..094c217 100644 --- a/types.ml +++ b/types.ml @@ -53,12 +53,6 @@ type statement = type stylesheet = statement list -type args = { - mutable infiles : string list; - mutable outfile : string option; - mutable verbose : int; -} - type loc = string * int * int * int * int exception SyntaxError of string diff --git a/util.ml b/util.ml index b56d3ed..6453b5d 100644 --- a/util.ml +++ b/util.ml @@ -36,7 +36,8 @@ let count_tabs str upto = let rec count n = function | 0 -> n | i -> count (if String.get str (i - 1) = '\t' then n + 1 else n) (i - 1) - in count 0 upto + in + count 0 upto let rec repeat s n = if n < 1 then "" else s ^ (repeat s (n - 1)) @@ -48,7 +49,7 @@ let prerr_loc (fname, ystart, yend, xstart, xend) = let file = open_in fname in (* skip lines until the first matched line *) - for i = 1 to ystart - 1 do let _ = input_line file in () done; + for i = 1 to ystart - 1 do ignore (input_line file) done; (* for each line in `loc`, print the source line with an underline *) for l = ystart to yend do @@ -63,11 +64,10 @@ let prerr_loc (fname, ystart, yend, xstart, xend) = for i = left to right do prerr_char '^' done; prerr_endline ""; end - done; - () + done -let prerr_loc_msg args loc msg = - if args.verbose >= 1 then begin +let prerr_loc_msg verbose loc msg = + if verbose then begin let (fname, ystart, yend, xstart, xend) = loc in if loc != noloc then begin let line_s = if yend != ystart @@ -82,8 +82,7 @@ let prerr_loc_msg args loc msg = end; eprintf "%s\n" msg; - if args.verbose >= 1 && loc != noloc then + if verbose && loc != noloc then try prerr_loc loc with Sys_error _ -> () - end; - () + end -- GitLab