let () = let test_file = "validator/tests/html/attributes/lang/missing-lang-attribute-haswarn.html" in let ic = open_in test_file in let html = really_input_string ic (in_channel_length ic) in close_in ic; let reader = Bytesrw.Bytes.Reader.of_string html in let doc = Html5rw.parse ~collect_errors:true reader in let root = Html5rw.root doc in print_endline "=== DOM Structure (with namespaces) ==="; let rec print_node indent (node : Html5rw.Dom.node) = let open Html5rw.Dom in match node.name with | "#text" -> () | "#document" | "#document-fragment" -> Printf.printf "%s%s\n" indent node.name; List.iter (print_node (indent ^ " ")) node.children | "!doctype" -> () | "#comment" -> () | _ -> let ns = match node.namespace with Some ns -> ns | None -> "none" in Printf.printf "%s<%s ns=%s>\n" indent node.name ns; List.iter (fun (k, v) -> if k = "foo" then Printf.printf "%s @%s=%s\n" indent k v ) node.attrs; List.iter (print_node (indent ^ " ")) node.children in print_node "" root; print_endline "\n=== Checking... ==="; let reader2 = Bytesrw.Bytes.Reader.of_string html in let result = Html5_checker.check ~collect_parse_errors:true ~system_id:test_file reader2 in let errors = Html5_checker.errors result in let warnings = Html5_checker.warnings result in print_endline "=== Errors ==="; List.iter (fun e -> print_endline e.Html5_checker.Message.message) errors; print_endline "\n=== Warnings ==="; List.iter (fun e -> print_endline e.Html5_checker.Message.message) warnings; print_endline "\n=== Expected ==="; print_endline "Consider adding a \xe2\x80\x9clang\xe2\x80\x9d attribute to the \xe2\x80\x9chtml\xe2\x80\x9d start tag to declare the language of this document."