OCaml HTML5 parser/serialiser based on Python's JustHTML
1let format_text ?system_id messages = 2 let buf = Buffer.create 1024 in 3 List.iter 4 (fun msg -> 5 let loc_str = 6 match msg.Message.location with 7 | Some loc -> ( 8 let sid = 9 match loc.Message.system_id with 10 | Some s -> s 11 | None -> ( 12 match system_id with Some s -> s | None -> "input") 13 in 14 let col_info = 15 match (loc.end_line, loc.end_column) with 16 | Some el, Some ec when el = loc.line && ec > loc.column -> 17 Printf.sprintf "%d.%d-%d" loc.line loc.column ec 18 | Some el, Some ec when el > loc.line -> 19 Printf.sprintf "%d.%d-%d.%d" loc.line loc.column el ec 20 | _ -> Printf.sprintf "%d.%d" loc.line loc.column 21 in 22 Printf.sprintf "%s:%s" sid col_info) 23 | None -> ( 24 match system_id with Some s -> s | None -> "input") 25 in 26 let severity_str = Message.severity_to_string msg.Message.severity in 27 let code_str = " [" ^ msg.Message.code ^ "]" in 28 let elem_str = 29 match msg.Message.element with 30 | Some e -> " (element: " ^ e ^ ")" 31 | None -> "" 32 in 33 let attr_str = 34 match msg.Message.attribute with 35 | Some a -> " (attribute: " ^ a ^ ")" 36 | None -> "" 37 in 38 Buffer.add_string buf 39 (Printf.sprintf "%s: %s%s: %s%s%s\n" loc_str severity_str code_str 40 msg.Message.message elem_str attr_str)) 41 messages; 42 Buffer.contents buf 43 44let format_gnu ?system_id messages = 45 let buf = Buffer.create 1024 in 46 List.iter 47 (fun msg -> 48 let loc_str = 49 match msg.Message.location with 50 | Some loc -> ( 51 let sid = 52 match loc.Message.system_id with 53 | Some s -> s 54 | None -> ( 55 match system_id with Some s -> s | None -> "input") 56 in 57 Printf.sprintf "%s:%d:%d" sid loc.line loc.column) 58 | None -> ( 59 match system_id with Some s -> s ^ ":0:0" | None -> "input:0:0") 60 in 61 let severity_str = Message.severity_to_string msg.Message.severity in 62 let code_str = " [" ^ msg.Message.code ^ "]" in 63 Buffer.add_string buf 64 (Printf.sprintf "%s: %s%s: %s\n" loc_str severity_str code_str 65 msg.Message.message)) 66 messages; 67 Buffer.contents buf 68 69let message_to_json ?system_id msg = 70 let open Jsont in 71 let severity = String (Message.severity_to_string msg.Message.severity, Meta.none) in 72 let message_text = String (msg.Message.message, Meta.none) in 73 let base = [ (("type", Meta.none), severity); (("message", Meta.none), message_text) ] in 74 let with_code = 75 (("subType", Meta.none), String (msg.Message.code, Meta.none)) :: base 76 in 77 let with_location = 78 match msg.Message.location with 79 | Some loc -> 80 let line = Number (float_of_int loc.Message.line, Meta.none) in 81 let column = Number (float_of_int loc.Message.column, Meta.none) in 82 let loc_fields = 83 [ (("firstLine", Meta.none), line); (("firstColumn", Meta.none), column) ] 84 in 85 let loc_fields = 86 match loc.Message.end_line with 87 | Some el -> 88 (("lastLine", Meta.none), Number (float_of_int el, Meta.none)) :: loc_fields 89 | None -> loc_fields 90 in 91 let loc_fields = 92 match loc.Message.end_column with 93 | Some ec -> 94 (("lastColumn", Meta.none), Number (float_of_int ec, Meta.none)) 95 :: loc_fields 96 | None -> loc_fields 97 in 98 let url = 99 match loc.Message.system_id with 100 | Some s -> s 101 | None -> ( 102 match system_id with Some s -> s | None -> "input") 103 in 104 (("url", Meta.none), String (url, Meta.none)) :: loc_fields @ with_code 105 | None -> 106 let url = 107 match system_id with Some s -> s | None -> "input" 108 in 109 (("url", Meta.none), String (url, Meta.none)) :: with_code 110 in 111 let with_extract = 112 match msg.Message.extract with 113 | Some e -> (("extract", Meta.none), String (e, Meta.none)) :: with_location 114 | None -> with_location 115 in 116 Object (with_extract, Meta.none) 117 118let format_json ?system_id messages = 119 let open Jsont in 120 let msg_array = Array (List.map (message_to_json ?system_id) messages, Meta.none) in 121 let obj = Object ([ (("messages", Meta.none), msg_array) ], Meta.none) in 122 match Jsont_bytesrw.encode_string ~format:Minify json obj with 123 | Ok s -> s 124 | Error e -> failwith ("JSON encoding error: " ^ e)