(** Tailwind CLI integration for CSS processing *) open Unix type config = { input_css: string; (** Path to input CSS file with Tailwind directives *) output_css: string; (** Path to output CSS file *) content: string list; (** List of content paths to scan for classes *) minify: bool; (** Whether to minify the output *) } let default_config = { input_css = "input.css"; output_css = "output.css"; content = ["*.html"; "*.ml"]; minify = true; } (** Check if Tailwind CLI is available *) let check_tailwind_cli () = try let ic = open_process_in "npx @tailwindcss/cli --help 2>/dev/null" in let _ = input_line ic in let status = close_process_in ic in status = WEXITED 0 with _ -> false (** Generate Tailwind CSS from input file *) let process_css config = if not (check_tailwind_cli ()) then failwith "Tailwind CLI not found. Install with: npm install -D @tailwindcss/cli" else let content_args = String.concat " " (List.map (fun p -> Printf.sprintf "--content '%s'" p) config.content) in let minify_flag = if config.minify then "--minify" else "" in let cmd = Printf.sprintf "npx @tailwindcss/cli -i %s -o %s %s %s 2>&1" config.input_css config.output_css content_args minify_flag in let ic = open_process_in cmd in let rec read_output acc = try let line = input_line ic in read_output (line :: acc) with End_of_file -> List.rev acc in let output = read_output [] in let status = close_process_in ic in match status with | WEXITED 0 -> Ok output | WEXITED n -> Error (Printf.sprintf "Tailwind CLI exited with code %d:\n%s" n (String.concat "\n" output)) | _ -> Error "Tailwind CLI terminated abnormally" (** Process CSS for a specific HTML file *) let process_for_html ~input_css ~html_file ~output_css ?(minify=true) () = let config = { input_css; output_css; content = [html_file]; minify; } in process_css config (** Write HTML to file and process CSS *) let write_and_process ~html_content ~html_file ~input_css ~output_css () = (* Write HTML to file *) let oc = open_out html_file in output_string oc html_content; close_out oc; (* Process CSS *) match process_for_html ~input_css ~html_file ~output_css () with | Ok _ -> Printf.eprintf "✅ Generated %s and %s\n" html_file output_css; Ok () | Error msg -> Printf.eprintf "❌ CSS processing failed: %s\n" msg; Error msg