···3434(** Format output based on the requested format *)
3535let format_output format result =
3636 match format with
3737- | `Text -> Html5_checker.format_text result
3838- | `Json -> Html5_checker.format_json result
3939- | `Gnu -> Html5_checker.format_gnu result
3737+ | `Text -> Htmlrw_check.to_text result
3838+ | `Json -> Htmlrw_check.to_json result
3939+ | `Gnu -> Htmlrw_check.to_gnu result
40404141(** Run the validation *)
4242let run format errors_only exit_zero quiet verbose file =
···4646 Exit_code.io_error
4747 | Ok (reader, ic, system_id) ->
4848 (* Run validation *)
4949- let result = Html5_checker.check ~system_id reader in
4949+ let result = Htmlrw_check.check ~system_id reader in
50505151 (* Close input if it's not stdin *)
5252 if file <> "-" then close_in ic;
53535454 (* Get messages based on filtering *)
5555 let messages =
5656- if errors_only then Html5_checker.errors result
5757- else Html5_checker.messages result
5656+ if errors_only then Htmlrw_check.errors result
5757+ else Htmlrw_check.messages result
5858 in
59596060 (* Output based on mode *)
6161 if quiet then begin
6262 (* Only show counts *)
6363- let error_count = List.length (Html5_checker.errors result) in
6464- let warning_count = List.length (Html5_checker.warnings result) in
6363+ let error_count = List.length (Htmlrw_check.errors result) in
6464+ let warning_count = List.length (Htmlrw_check.warnings result) in
6565 if errors_only then
6666 Printf.printf "%d error%s\n" error_count (if error_count = 1 then "" else "s")
6767 else
···75757676 (* Show summary if verbose *)
7777 if verbose && messages <> [] then begin
7878- let error_count = List.length (Html5_checker.errors result) in
7979- let warning_count = List.length (Html5_checker.warnings result) in
7878+ let error_count = List.length (Htmlrw_check.errors result) in
7979+ let warning_count = List.length (Htmlrw_check.warnings result) in
8080 Printf.eprintf "\nSummary: %d error%s, %d warning%s\n"
8181 error_count (if error_count = 1 then "" else "s")
8282 warning_count (if warning_count = 1 then "" else "s")
···8484 end;
85858686 (* Determine exit code *)
8787- if exit_zero || not (Html5_checker.has_errors result) then
8787+ if exit_zero || not (Htmlrw_check.has_errors result) then
8888 Exit_code.ok
8989 else
9090 Exit_code.validation_errors
+5-5
test/analyze_failures.ml
···3636 close_in ic;
37373838 let reader = Bytesrw.Bytes.Reader.of_string content in
3939- let result = Html5_checker.check ~collect_parse_errors:true reader in
4040- let errors = Html5_checker.errors result in
4141- let warnings = Html5_checker.warnings result in
3939+ let result = Htmlrw_check.check ~collect_parse_errors:true reader in
4040+ let errors = Htmlrw_check.errors result in
4141+ let warnings = Htmlrw_check.warnings result in
42424343 let should_print = match mode with
4444 | "isvalid" -> outcome = Valid && (errors <> [] || warnings <> []) && !count < 60
···4949 if mode = "isvalid" then begin
5050 if errors <> [] then begin
5151 Printf.printf "ERRORS:\n";
5252- List.iter (fun e -> Printf.printf " %s\n" e.Html5_checker.Message.message) errors
5252+ List.iter (fun e -> Printf.printf " %s\n" e.Htmlrw_check.text) errors
5353 end;
5454 if warnings <> [] then begin
5555 Printf.printf "WARNINGS:\n";
5656- List.iter (fun w -> Printf.printf " %s\n" w.Html5_checker.Message.message) warnings
5656+ List.iter (fun w -> Printf.printf " %s\n" w.Htmlrw_check.text) warnings
5757 end
5858 end;
5959 print_endline content;
+5-5
test/debug_check.ml
···2727 print_node "" root;
2828 print_endline "\n=== Checking... ===";
2929 let reader2 = Bytesrw.Bytes.Reader.of_string html in
3030- let result = Html5_checker.check ~collect_parse_errors:true ~system_id:test_file reader2 in
3131- let errors = Html5_checker.errors result in
3232- let warnings = Html5_checker.warnings result in
3030+ let result = Htmlrw_check.check ~collect_parse_errors:true ~system_id:test_file reader2 in
3131+ let errors = Htmlrw_check.errors result in
3232+ let warnings = Htmlrw_check.warnings result in
3333 print_endline "=== Errors ===";
3434- List.iter (fun e -> print_endline e.Html5_checker.Message.message) errors;
3434+ List.iter (fun e -> print_endline e.Htmlrw_check.text) errors;
3535 print_endline "\n=== Warnings ===";
3636- List.iter (fun e -> print_endline e.Html5_checker.Message.message) warnings;
3636+ List.iter (fun e -> print_endline e.Htmlrw_check.text) warnings;
3737 print_endline "\n=== Expected ===";
3838 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."
+8-8
test/debug_validator.ml
···1515 Printf.printf "Input (%d bytes):\n%s\n\n" (String.length content) content;
16161717 let reader = Bytesrw.Bytes.Reader.of_string content in
1818- let result = Html5_checker.check ~collect_parse_errors:true ~system_id:path reader in
1818+ let result = Htmlrw_check.check ~collect_parse_errors:true ~system_id:path reader in
19192020- let errors = Html5_checker.errors result in
2121- let warnings = Html5_checker.warnings result in
2020+ let errors = Htmlrw_check.errors result in
2121+ let warnings = Htmlrw_check.warnings result in
22222323 Printf.printf "=== Results ===\n";
2424 Printf.printf "Errors: %d\n" (List.length errors);
2525 List.iter (fun msg ->
2626- Printf.printf " [ERROR] %s\n" msg.Html5_checker.Message.message;
2727- (match msg.Html5_checker.Message.location with
2626+ Printf.printf " [ERROR] %s\n" msg.Htmlrw_check.text;
2727+ (match msg.Htmlrw_check.location with
2828 | Some loc -> Printf.printf " at line %d, col %d\n" loc.line loc.column
2929 | None -> ())
3030 ) errors;
31313232 Printf.printf "Warnings: %d\n" (List.length warnings);
3333 List.iter (fun msg ->
3434- Printf.printf " [WARN] %s\n" msg.Html5_checker.Message.message;
3535- (match msg.Html5_checker.Message.location with
3434+ Printf.printf " [WARN] %s\n" msg.Htmlrw_check.text;
3535+ (match msg.Htmlrw_check.location with
3636 | Some loc -> Printf.printf " at line %d, col %d\n" loc.line loc.column
3737 | None -> ())
3838 ) warnings;
39394040 Printf.printf "\n=== Formatted Output ===\n";
4141- Printf.printf "%s\n" (Html5_checker.format_text result)
4141+ Printf.printf "%s\n" (Htmlrw_check.to_text result)
···2233type t = {
44 message: string;
55- error_code: Html5_checker.Error_code.t option;
55+ error_code: Htmlrw_check.Error_code.t option;
66 line: int option;
77 column: int option;
88 element: string option;
···8080 if Str.string_match re msg 0 then
8181 let child = Str.matched_group 1 msg in
8282 let parent = Str.matched_group 2 msg in
8383- Some ((`Element (`Not_allowed_as_child (`Child child, `Parent parent)) : Html5_checker.Error_code.t),
8383+ Some ((`Element (`Not_allowed_as_child (`Child child, `Parent parent)) : Htmlrw_check.Error_code.t),
8484 Some child, None)
8585 else None
8686···9090 if Str.string_match re msg 0 then
9191 let attr = Str.matched_group 1 msg in
9292 let element = Str.matched_group 2 msg in
9393- Some ((`Attr (`Not_allowed (`Attr attr, `Elem element)) : Html5_checker.Error_code.t),
9393+ Some ((`Attr (`Not_allowed (`Attr attr, `Elem element)) : Htmlrw_check.Error_code.t),
9494 Some element, Some attr)
9595 else None
9696···9999 let re = Str.regexp {|Attribute "\([^"]+\)" not allowed here|} in
100100 if Str.string_match re msg 0 then
101101 let attr = Str.matched_group 1 msg in
102102- Some ((`Attr (`Not_allowed_here (`Attr attr)) : Html5_checker.Error_code.t),
102102+ Some ((`Attr (`Not_allowed_here (`Attr attr)) : Htmlrw_check.Error_code.t),
103103 None, Some attr)
104104 else None
105105···109109 if Str.string_match re msg 0 then
110110 let element = Str.matched_group 1 msg in
111111 let attr = Str.matched_group 2 msg in
112112- Some ((`Attr (`Missing (`Elem element, `Attr attr)) : Html5_checker.Error_code.t),
112112+ Some ((`Attr (`Missing (`Elem element, `Attr attr)) : Htmlrw_check.Error_code.t),
113113 Some element, Some attr)
114114 else None
115115···119119 if Str.string_match re msg 0 then
120120 let parent = Str.matched_group 1 msg in
121121 let child = Str.matched_group 2 msg in
122122- Some ((`Element (`Missing_child (`Parent parent, `Child child)) : Html5_checker.Error_code.t),
122122+ Some ((`Element (`Missing_child (`Parent parent, `Child child)) : Htmlrw_check.Error_code.t),
123123 Some parent, None)
124124 else None
125125···128128 let re = Str.regexp {|Duplicate ID "\([^"]+\)"|} in
129129 if Str.string_match re msg 0 then
130130 let id = Str.matched_group 1 msg in
131131- Some ((`Attr (`Duplicate_id (`Id id)) : Html5_checker.Error_code.t),
131131+ Some ((`Attr (`Duplicate_id (`Id id)) : Htmlrw_check.Error_code.t),
132132 None, None)
133133 else None
134134···137137 let re = Str.regexp {|The "\([^"]+\)" element is obsolete|} in
138138 if Str.string_match re msg 0 then
139139 let element = Str.matched_group 1 msg in
140140- Some ((`Element (`Obsolete (`Elem element, `Suggestion "")) : Html5_checker.Error_code.t),
140140+ Some ((`Element (`Obsolete (`Elem element, `Suggestion "")) : Htmlrw_check.Error_code.t),
141141 Some element, None)
142142 else None
143143···147147 if Str.string_match re msg 0 then
148148 let attr = Str.matched_group 1 msg in
149149 let element = Str.matched_group 2 msg in
150150- Some ((`Element (`Obsolete_attr (`Elem element, `Attr attr, `Suggestion None)) : Html5_checker.Error_code.t),
150150+ Some ((`Element (`Obsolete_attr (`Elem element, `Attr attr, `Suggestion None)) : Htmlrw_check.Error_code.t),
151151 Some element, Some attr)
152152 else None
153153···156156 let re = Str.regexp {|Stray end tag "\([^"]+\)"|} in
157157 if Str.string_match re msg 0 then
158158 let tag = Str.matched_group 1 msg in
159159- Some ((`Tag (`Stray_end (`Tag tag)) : Html5_checker.Error_code.t),
159159+ Some ((`Tag (`Stray_end (`Tag tag)) : Htmlrw_check.Error_code.t),
160160 Some tag, None)
161161 else None
162162···165165 let re = Str.regexp {|Stray start tag "\([^"]+\)"|} in
166166 if Str.string_match re msg 0 then
167167 let tag = Str.matched_group 1 msg in
168168- Some ((`Tag (`Stray_start (`Tag tag)) : Html5_checker.Error_code.t),
168168+ Some ((`Tag (`Stray_start (`Tag tag)) : Htmlrw_check.Error_code.t),
169169 Some tag, None)
170170 else None
171171···175175 if Str.string_match re msg 0 then
176176 let role = Str.matched_group 1 msg in
177177 let reason = Str.matched_group 2 msg in
178178- Some ((`Aria (`Unnecessary_role (`Role role, `Elem "", `Reason reason)) : Html5_checker.Error_code.t),
178178+ Some ((`Aria (`Unnecessary_role (`Role role, `Elem "", `Reason reason)) : Htmlrw_check.Error_code.t),
179179 None, None)
180180 else None
181181···185185 if Str.string_match re msg 0 then
186186 let role = Str.matched_group 1 msg in
187187 let element = Str.matched_group 2 msg in
188188- Some ((`Aria (`Bad_role (`Elem element, `Role role)) : Html5_checker.Error_code.t),
188188+ Some ((`Aria (`Bad_role (`Elem element, `Role role)) : Htmlrw_check.Error_code.t),
189189 Some element, Some "role")
190190 else None
191191···196196 let attr = Str.matched_group 1 msg in
197197 let element = Str.matched_group 2 msg in
198198 let condition = Str.matched_group 3 msg in
199199- Some ((`Aria (`Must_not_specify (`Attr attr, `Elem element, `Condition condition)) : Html5_checker.Error_code.t),
199199+ Some ((`Aria (`Must_not_specify (`Attr attr, `Elem element, `Condition condition)) : Htmlrw_check.Error_code.t),
200200 Some element, Some attr)
201201 else None
202202···207207 let attr = Str.matched_group 1 msg in
208208 let element = Str.matched_group 2 msg in
209209 let condition = Str.matched_group 3 msg in
210210- Some ((`Aria (`Must_not_use (`Attr attr, `Elem element, `Condition condition)) : Html5_checker.Error_code.t),
210210+ Some ((`Aria (`Must_not_use (`Attr attr, `Elem element, `Condition condition)) : Htmlrw_check.Error_code.t),
211211 Some element, Some attr)
212212 else None
213213···225225 String.trim (String.sub msg (colon_pos + 1) (String.length msg - colon_pos - 1))
226226 with Not_found -> ""
227227 in
228228- Some ((`Attr (`Bad_value (`Elem element, `Attr attr, `Value value, `Reason reason)) : Html5_checker.Error_code.t),
228228+ Some ((`Attr (`Bad_value (`Elem element, `Attr attr, `Value value, `Reason reason)) : Htmlrw_check.Error_code.t),
229229 Some element, Some attr)
230230 else None
231231···234234 let re = Str.regexp {|End tag "\([^"]+\)" implied, but there were open elements|} in
235235 if Str.string_match re msg 0 then
236236 let tag = Str.matched_group 1 msg in
237237- Some ((`Tag (`End_implied_open (`Tag tag)) : Html5_checker.Error_code.t),
237237+ Some ((`Tag (`End_implied_open (`Tag tag)) : Htmlrw_check.Error_code.t),
238238 Some tag, None)
239239 else None
240240···243243 let re = Str.regexp {|No "\([^"]+\)" element in scope but a "\([^"]+\)" end tag seen|} in
244244 if Str.string_match re msg 0 then
245245 let tag = Str.matched_group 1 msg in
246246- Some ((`Tag (`Not_in_scope (`Tag tag)) : Html5_checker.Error_code.t),
246246+ Some ((`Tag (`Not_in_scope (`Tag tag)) : Htmlrw_check.Error_code.t),
247247 Some tag, None)
248248 else None
249249···252252 let re = Str.regexp {|Start tag "\([^"]+\)" seen in "table"|} in
253253 if Str.string_match re msg 0 then
254254 let tag = Str.matched_group 1 msg in
255255- Some ((`Tag (`Start_in_table (`Tag tag)) : Html5_checker.Error_code.t),
255255+ Some ((`Tag (`Start_in_table (`Tag tag)) : Htmlrw_check.Error_code.t),
256256 Some tag, None)
257257 else None
258258···335335336336let matches ~strictness ~expected ~actual =
337337 let expected_norm = normalize_quotes expected.message in
338338- let actual_norm = normalize_quotes actual.Html5_checker.Message.message in
338338+ let actual_norm = normalize_quotes actual.Htmlrw_check.text in
339339340340 (* Check severity match *)
341341 let severity_matches =
342342- match (expected.severity, actual.Html5_checker.Message.severity) with
342342+ match (expected.severity, actual.Htmlrw_check.severity) with
343343 | (None, _) -> true
344344- | (Some `Error, Html5_checker.Message.Error) -> true
345345- | (Some `Warning, Html5_checker.Message.Warning) -> true
346346- | (Some `Info, Html5_checker.Message.Info) -> true
344344+ | (Some `Error, Htmlrw_check.Error) -> true
345345+ | (Some `Warning, Htmlrw_check.Warning) -> true
346346+ | (Some `Info, Htmlrw_check.Info) -> true
347347 | _ -> false
348348 in
349349350350 (* Check location match *)
351351 let location_matches =
352352- match (expected.line, expected.column, actual.Html5_checker.Message.location) with
352352+ match (expected.line, expected.column, actual.Htmlrw_check.location) with
353353 | (None, None, _) -> true
354354 | (Some el, Some ec, Some loc) -> loc.line = el && loc.column = ec
355355 | (Some el, None, Some loc) -> loc.line = el
···358358359359 (* Check error code match *)
360360 let code_matches =
361361- match (expected.error_code, actual.Html5_checker.Message.error_code) with
361361+ match (expected.error_code, actual.Htmlrw_check.error_code) with
362362 | (None, _) -> true (* No expected code to match *)
363363 | (Some ec, Some ac) -> error_codes_match ec ac
364364 | (Some _, None) -> false (* Expected typed but got untyped *)
+2-2
test/expected_message.mli
···66(** Structured expected message *)
77type t = {
88 message: string; (** Full message text *)
99- error_code: Html5_checker.Error_code.t option; (** Parsed typed code *)
99+ error_code: Htmlrw_check.Error_code.t option; (** Parsed typed code *)
1010 line: int option; (** Expected line number *)
1111 column: int option; (** Expected column number *)
1212 element: string option; (** Element context *)
···60606161(** Check if actual message matches expected.
6262 Returns the quality of match achieved. *)
6363-val matches : strictness:strictness -> expected:t -> actual:Html5_checker.Message.t -> match_quality
6363+val matches : strictness:strictness -> expected:t -> actual:Htmlrw_check.message -> match_quality
64646565(** Check if match quality is acceptable given strictness *)
6666val is_acceptable : strictness:strictness -> match_quality -> bool
+47-47
test/test_html5_checker.ml
···5566(** Helper to check if a message contains a substring *)
77let message_contains msg substring =
88- String.lowercase_ascii msg.Html5_checker.Message.message
88+ String.lowercase_ascii msg.Htmlrw_check.text
99 |> fun s -> String.length s >= String.length substring &&
1010 try
1111 ignore (Str.search_forward (Str.regexp_case_fold (Str.quote substring)) s 0);
···2121<body><p>Hello world</p></body>
2222</html>|} in
2323 let reader = reader_of_string html in
2424- let result = Html5_checker.check reader in
2525- let errors = Html5_checker.errors result in
2424+ let result = Htmlrw_check.check reader in
2525+ let errors = Htmlrw_check.errors result in
2626 Printf.printf " Found %d error(s)\n" (List.length errors);
2727 if List.length errors > 0 then begin
2828 List.iter (fun msg ->
2929- Printf.printf " - %s\n" msg.Html5_checker.Message.message
2929+ Printf.printf " - %s\n" msg.Htmlrw_check.text
3030 ) errors;
3131 end else
3232 Printf.printf " OK: No errors as expected\n"
···3636 Printf.printf "\nTest 2: Missing DOCTYPE\n";
3737 let html = "<html><body>Hello</body></html>" in
3838 let reader = reader_of_string html in
3939- let result = Html5_checker.check reader in
4040- let errors = Html5_checker.errors result in
3939+ let result = Htmlrw_check.check reader in
4040+ let errors = Htmlrw_check.errors result in
4141 Printf.printf " Found %d error(s)\n" (List.length errors);
4242 if List.length errors = 0 then
4343 Printf.printf " Warning: Expected parse errors for missing DOCTYPE\n"
4444 else begin
4545 List.iter (fun msg ->
4646- Printf.printf " - %s\n" msg.Html5_checker.Message.message
4646+ Printf.printf " - %s\n" msg.Htmlrw_check.text
4747 ) errors;
4848 end
4949···5252 Printf.printf "\nTest 3: Obsolete <center> element\n";
5353 let html = "<!DOCTYPE html><html><body><center>Centered</center></body></html>" in
5454 let reader = reader_of_string html in
5555- let result = Html5_checker.check reader in
5656- let all_msgs = Html5_checker.messages result in
5555+ let result = Htmlrw_check.check reader in
5656+ let all_msgs = Htmlrw_check.messages result in
5757 Printf.printf " Found %d message(s)\n" (List.length all_msgs);
5858 let obsolete_msgs = List.filter (fun m ->
5959 message_contains m "obsolete" || message_contains m "center"
···6161 if List.length obsolete_msgs > 0 then begin
6262 Printf.printf " Found obsolete-related messages:\n";
6363 List.iter (fun msg ->
6464- Printf.printf " - %s\n" msg.Html5_checker.Message.message
6464+ Printf.printf " - %s\n" msg.Htmlrw_check.text
6565 ) obsolete_msgs;
6666 end else
6767 Printf.printf " Note: No obsolete element warnings found (checker may not be enabled)\n"
···7474 <div id="foo">Second</div>
7575 </body></html>|} in
7676 let reader = reader_of_string html in
7777- let result = Html5_checker.check reader in
7878- let all_msgs = Html5_checker.messages result in
7777+ let result = Htmlrw_check.check reader in
7878+ let all_msgs = Htmlrw_check.messages result in
7979 Printf.printf " Found %d message(s)\n" (List.length all_msgs);
8080 let id_msgs = List.filter (fun m ->
8181 message_contains m "duplicate" || message_contains m "id"
···8383 if List.length id_msgs > 0 then begin
8484 Printf.printf " Found ID-related messages:\n";
8585 List.iter (fun msg ->
8686- Printf.printf " - %s\n" msg.Html5_checker.Message.message
8686+ Printf.printf " - %s\n" msg.Htmlrw_check.text
8787 ) id_msgs;
8888 end else
8989 Printf.printf " Note: No duplicate ID errors found (checker may not be enabled)\n"
···9696 <h3>Skipped h2</h3>
9797 </body></html>|} in
9898 let reader = reader_of_string html in
9999- let result = Html5_checker.check reader in
100100- let all_msgs = Html5_checker.messages result in
9999+ let result = Htmlrw_check.check reader in
100100+ let all_msgs = Htmlrw_check.messages result in
101101 Printf.printf " Found %d message(s)\n" (List.length all_msgs);
102102 let heading_msgs = List.filter (fun m ->
103103 message_contains m "heading" || message_contains m "skip"
···105105 if List.length heading_msgs > 0 then begin
106106 Printf.printf " Found heading-related messages:\n";
107107 List.iter (fun msg ->
108108- Printf.printf " - %s\n" msg.Html5_checker.Message.message
108108+ Printf.printf " - %s\n" msg.Htmlrw_check.text
109109 ) heading_msgs;
110110 end else
111111 Printf.printf " Note: No heading structure warnings found (checker may not be enabled)\n"
···117117 <img src="test.jpg">
118118 </body></html>|} in
119119 let reader = reader_of_string html in
120120- let result = Html5_checker.check reader in
121121- let all_msgs = Html5_checker.messages result in
120120+ let result = Htmlrw_check.check reader in
121121+ let all_msgs = Htmlrw_check.messages result in
122122 Printf.printf " Found %d message(s)\n" (List.length all_msgs);
123123 let img_msgs = List.filter (fun m ->
124124 message_contains m "alt" || (message_contains m "img" && message_contains m "attribute")
···126126 if List.length img_msgs > 0 then begin
127127 Printf.printf " Found img/alt-related messages:\n";
128128 List.iter (fun msg ->
129129- Printf.printf " - %s\n" msg.Html5_checker.Message.message
129129+ Printf.printf " - %s\n" msg.Htmlrw_check.text
130130 ) img_msgs;
131131 end else
132132 Printf.printf " Note: No missing alt attribute errors found (checker may not be enabled)\n"
···138138 <a href="#">Link <a href="#">Nested</a></a>
139139 </body></html>|} in
140140 let reader = reader_of_string html in
141141- let result = Html5_checker.check reader in
142142- let all_msgs = Html5_checker.messages result in
141141+ let result = Htmlrw_check.check reader in
142142+ let all_msgs = Htmlrw_check.messages result in
143143 Printf.printf " Found %d message(s)\n" (List.length all_msgs);
144144 let nesting_msgs = List.filter (fun m ->
145145 message_contains m "nesting" || message_contains m "nested" || message_contains m "ancestor"
···147147 if List.length nesting_msgs > 0 then begin
148148 Printf.printf " Found nesting-related messages:\n";
149149 List.iter (fun msg ->
150150- Printf.printf " - %s\n" msg.Html5_checker.Message.message
150150+ Printf.printf " - %s\n" msg.Htmlrw_check.text
151151 ) nesting_msgs;
152152 end else
153153 Printf.printf " Note: No nesting errors found (checker may not be enabled)\n"
···159159 <form><form></form></form>
160160 </body></html>|} in
161161 let reader = reader_of_string html in
162162- let result = Html5_checker.check reader in
163163- let all_msgs = Html5_checker.messages result in
162162+ let result = Htmlrw_check.check reader in
163163+ let all_msgs = Htmlrw_check.messages result in
164164 Printf.printf " Found %d message(s)\n" (List.length all_msgs);
165165 let form_msgs = List.filter (fun m ->
166166 message_contains m "form"
···168168 if List.length form_msgs > 0 then begin
169169 Printf.printf " Found form-related messages:\n";
170170 List.iter (fun msg ->
171171- Printf.printf " - %s\n" msg.Html5_checker.Message.message
171171+ Printf.printf " - %s\n" msg.Htmlrw_check.text
172172 ) form_msgs;
173173 end else
174174 Printf.printf " Note: No form nesting errors found (checker may not be enabled)\n"
···178178 Printf.printf "\nTest 9: Output format testing\n";
179179 let html = {|<!DOCTYPE html><html><body><p>Test</p></body></html>|} in
180180 let reader = reader_of_string html in
181181- let result = Html5_checker.check reader in
181181+ let result = Htmlrw_check.check reader in
182182183183 Printf.printf " Testing text format:\n";
184184- let text_output = Html5_checker.format_text result in
184184+ let text_output = Htmlrw_check.to_text result in
185185 Printf.printf " Length: %d chars\n" (String.length text_output);
186186187187 Printf.printf " Testing JSON format:\n";
188188- let json_output = Html5_checker.format_json result in
188188+ let json_output = Htmlrw_check.to_json result in
189189 Printf.printf " Length: %d chars\n" (String.length json_output);
190190191191 Printf.printf " Testing GNU format:\n";
192192- let gnu_output = Html5_checker.format_gnu result in
192192+ let gnu_output = Htmlrw_check.to_gnu result in
193193 Printf.printf " Length: %d chars\n" (String.length gnu_output)
194194195195(** Test has_errors function *)
···198198199199 (* Valid document should have no errors *)
200200 let valid_html = "<!DOCTYPE html><html><body><p>Valid</p></body></html>" in
201201- let result1 = Html5_checker.check (reader_of_string valid_html) in
202202- Printf.printf " Valid document has_errors: %b\n" (Html5_checker.has_errors result1);
201201+ let result1 = Htmlrw_check.check (reader_of_string valid_html) in
202202+ Printf.printf " Valid document has_errors: %b\n" (Htmlrw_check.has_errors result1);
203203204204 (* Document with likely parse errors *)
205205 let invalid_html = "<html><body><p>Unclosed" in
206206- let result2 = Html5_checker.check (reader_of_string invalid_html) in
207207- Printf.printf " Invalid document has_errors: %b\n" (Html5_checker.has_errors result2)
206206+ let result2 = Htmlrw_check.check (reader_of_string invalid_html) in
207207+ Printf.printf " Invalid document has_errors: %b\n" (Htmlrw_check.has_errors result2)
208208209209(** Test check_dom with pre-parsed document *)
210210let test_check_dom () =
···212212 let html = "<!DOCTYPE html><html><body><p>Test</p></body></html>" in
213213 let reader = reader_of_string html in
214214 let parsed = Html5rw.parse reader in
215215- let result = Html5_checker.check_dom parsed in
216216- let all_msgs = Html5_checker.messages result in
215215+ let result = Htmlrw_check.check_parsed parsed in
216216+ let all_msgs = Htmlrw_check.messages result in
217217 Printf.printf " check_dom found %d message(s)\n" (List.length all_msgs);
218218 Printf.printf " OK: check_dom completed successfully\n"
219219···222222 Printf.printf "\nTest 12: system_id parameter\n";
223223 let html = "<!DOCTYPE html><html><body><p>Test</p></body></html>" in
224224 let reader = reader_of_string html in
225225- let result = Html5_checker.check ~system_id:"test.html" reader in
226226- match Html5_checker.system_id result with
225225+ let result = Htmlrw_check.check ~system_id:"test.html" reader in
226226+ match Htmlrw_check.system_id result with
227227 | Some id -> Printf.printf " system_id: %s\n" id
228228 | None -> Printf.printf " Warning: system_id not set\n"
229229···232232 Printf.printf "\nTest 13: collect_parse_errors flag\n";
233233 let html = "<!DOCTYPE html><html><body><p>Test</p></body></html>" in
234234235235- let result_with = Html5_checker.check ~collect_parse_errors:true (reader_of_string html) in
236236- let msgs_with = Html5_checker.messages result_with in
235235+ let result_with = Htmlrw_check.check ~collect_parse_errors:true (reader_of_string html) in
236236+ let msgs_with = Htmlrw_check.messages result_with in
237237 Printf.printf " With parse errors: %d message(s)\n" (List.length msgs_with);
238238239239- let result_without = Html5_checker.check ~collect_parse_errors:false (reader_of_string html) in
240240- let msgs_without = Html5_checker.messages result_without in
239239+ let result_without = Htmlrw_check.check ~collect_parse_errors:false (reader_of_string html) in
240240+ let msgs_without = Htmlrw_check.messages result_without in
241241 Printf.printf " Without parse errors: %d message(s)\n" (List.length msgs_without)
242242243243(** Test document accessor *)
···245245 Printf.printf "\nTest 14: document accessor\n";
246246 let html = "<!DOCTYPE html><html><body><p>Test</p></body></html>" in
247247 let reader = reader_of_string html in
248248- let result = Html5_checker.check reader in
249249- let _doc = Html5_checker.document result in
248248+ let result = Htmlrw_check.check reader in
249249+ let _doc = Htmlrw_check.document result in
250250 Printf.printf " OK: document accessor works\n"
251251252252(** Test message severity filtering *)
···254254 Printf.printf "\nTest 15: Message severity filtering\n";
255255 let html = "<!DOCTYPE html><html><body><p>Test</p></body></html>" in
256256 let reader = reader_of_string html in
257257- let result = Html5_checker.check reader in
257257+ let result = Htmlrw_check.check reader in
258258259259- let all_msgs = Html5_checker.messages result in
260260- let errors = Html5_checker.errors result in
261261- let warnings = Html5_checker.warnings result in
259259+ let all_msgs = Htmlrw_check.messages result in
260260+ let errors = Htmlrw_check.errors result in
261261+ let warnings = Htmlrw_check.warnings result in
262262263263 Printf.printf " Total messages: %d\n" (List.length all_msgs);
264264 Printf.printf " Errors: %d\n" (List.length errors);
+34-92
test/test_nesting_checker.ml
···11-(** Simple test for nesting_checker functionality *)
22-33-let () =
44- (* Create a message collector *)
55- let collector = Html5_checker.Message_collector.create () in
11+(** Test for nesting checker functionality via public API *)
6277- (* Get the nesting checker *)
88- let module C = (val Html5_checker__Nesting_checker.checker : Html5_checker__Checker.S) in
99- let state = C.create () in
33+let check_html html =
44+ let reader = Bytesrw.Bytes.Reader.of_string html in
55+ Htmlrw_check.check reader
10677+let () =
118 (* Test 1: <a> cannot contain another <a> *)
129 Printf.printf "Test 1: Checking <a href> inside <a href>\n";
1313- C.start_element state ~name:"a" ~namespace:None ~attrs:[("href", "#")] collector;
1414- C.start_element state ~name:"a" ~namespace:None ~attrs:[("href", "#")] collector;
1515-1616- let errors1 = Html5_checker.Message_collector.errors collector in
1010+ let result1 = check_html "<a href='#'><a href='#'>nested</a></a>" in
1111+ let errors1 = Htmlrw_check.errors result1 in
1712 Printf.printf " Found %d error(s)\n" (List.length errors1);
1813 List.iter (fun msg ->
1919- Printf.printf " - %s\n" msg.Html5_checker.Message.message
1414+ Printf.printf " - %s\n" msg.Htmlrw_check.text
2015 ) errors1;
21162222- C.end_element state ~name:"a" ~namespace:None collector;
2323- C.end_element state ~name:"a" ~namespace:None collector;
2424- Html5_checker.Message_collector.clear collector;
2525-2617 (* Test 2: <button> inside <a> *)
2718 Printf.printf "\nTest 2: Checking <button> inside <a href>\n";
2828- C.start_element state ~name:"a" ~namespace:None ~attrs:[("href", "#")] collector;
2929- C.start_element state ~name:"button" ~namespace:None ~attrs:[] collector;
3030-3131- let errors2 = Html5_checker.Message_collector.errors collector in
1919+ let result2 = check_html "<a href='#'><button>click</button></a>" in
2020+ let errors2 = Htmlrw_check.errors result2 in
3221 Printf.printf " Found %d error(s)\n" (List.length errors2);
3322 List.iter (fun msg ->
3434- Printf.printf " - %s\n" msg.Html5_checker.Message.message
2323+ Printf.printf " - %s\n" msg.Htmlrw_check.text
3524 ) errors2;
36253737- C.end_element state ~name:"button" ~namespace:None collector;
3838- C.end_element state ~name:"a" ~namespace:None collector;
3939- Html5_checker.Message_collector.clear collector;
4040-4126 (* Test 3: form inside form *)
4227 Printf.printf "\nTest 3: Checking <form> inside <form>\n";
4343- C.start_element state ~name:"form" ~namespace:None ~attrs:[] collector;
4444- C.start_element state ~name:"form" ~namespace:None ~attrs:[] collector;
4545-4646- let errors3 = Html5_checker.Message_collector.errors collector in
2828+ let result3 = check_html "<form><form>nested</form></form>" in
2929+ let errors3 = Htmlrw_check.errors result3 in
4730 Printf.printf " Found %d error(s)\n" (List.length errors3);
4831 List.iter (fun msg ->
4949- Printf.printf " - %s\n" msg.Html5_checker.Message.message
3232+ Printf.printf " - %s\n" msg.Htmlrw_check.text
5033 ) errors3;
51345252- C.end_element state ~name:"form" ~namespace:None collector;
5353- C.end_element state ~name:"form" ~namespace:None collector;
5454- Html5_checker.Message_collector.clear collector;
5555-5656- (* Test 4: header inside footer *)
3535+ (* Test 4: header inside footer (should be allowed) *)
5736 Printf.printf "\nTest 4: Checking <header> inside <footer>\n";
5858- C.start_element state ~name:"footer" ~namespace:None ~attrs:[] collector;
5959- C.start_element state ~name:"header" ~namespace:None ~attrs:[] collector;
6060-6161- let errors4 = Html5_checker.Message_collector.errors collector in
3737+ let result4 = check_html "<footer><header>test</header></footer>" in
3838+ let errors4 = Htmlrw_check.errors result4 in
6239 Printf.printf " Found %d error(s)\n" (List.length errors4);
6363- List.iter (fun msg ->
6464- Printf.printf " - %s\n" msg.Html5_checker.Message.message
6565- ) errors4;
6666-6767- C.end_element state ~name:"header" ~namespace:None collector;
6868- C.end_element state ~name:"footer" ~namespace:None collector;
6969- Html5_checker.Message_collector.clear collector;
4040+ if List.length errors4 > 0 then
4141+ List.iter (fun msg ->
4242+ Printf.printf " - %s\n" msg.Htmlrw_check.text
4343+ ) errors4
4444+ else
4545+ Printf.printf " OK: No errors (header inside footer is valid)\n";
70467171- (* Test 5: input (not hidden) inside button *)
4747+ (* Test 5: input inside button *)
7248 Printf.printf "\nTest 5: Checking <input type=text> inside <button>\n";
7373- C.start_element state ~name:"button" ~namespace:None ~attrs:[] collector;
7474- C.start_element state ~name:"input" ~namespace:None ~attrs:[("type", "text")] collector;
7575-7676- let errors5 = Html5_checker.Message_collector.errors collector in
4949+ let result5 = check_html "<button><input type='text'></button>" in
5050+ let errors5 = Htmlrw_check.errors result5 in
7751 Printf.printf " Found %d error(s)\n" (List.length errors5);
7852 List.iter (fun msg ->
7979- Printf.printf " - %s\n" msg.Html5_checker.Message.message
5353+ Printf.printf " - %s\n" msg.Htmlrw_check.text
8054 ) errors5;
81558282- C.end_element state ~name:"input" ~namespace:None collector;
8383- C.end_element state ~name:"button" ~namespace:None collector;
8484- Html5_checker.Message_collector.clear collector;
8585-8656 (* Test 6: valid nesting - should not error *)
8757 Printf.printf "\nTest 6: Checking valid nesting: <div> inside <div>\n";
8888- C.start_element state ~name:"div" ~namespace:None ~attrs:[] collector;
8989- C.start_element state ~name:"div" ~namespace:None ~attrs:[] collector;
9090-9191- let errors6 = Html5_checker.Message_collector.errors collector in
5858+ let result6 = check_html "<div><div>nested</div></div>" in
5959+ let errors6 = Htmlrw_check.errors result6 in
9260 Printf.printf " Found %d error(s)\n" (List.length errors6);
9361 if List.length errors6 = 0 then
9494- Printf.printf " OK: No errors as expected\n";
9595-9696- C.end_element state ~name:"div" ~namespace:None collector;
9797- C.end_element state ~name:"div" ~namespace:None collector;
9898- Html5_checker.Message_collector.clear collector;
9999-100100- (* Test 7: area without map ancestor *)
101101- Printf.printf "\nTest 7: Checking <area> without <map> ancestor\n";
102102- C.start_element state ~name:"area" ~namespace:None ~attrs:[] collector;
103103-104104- let errors7 = Html5_checker.Message_collector.errors collector in
105105- Printf.printf " Found %d error(s)\n" (List.length errors7);
106106- List.iter (fun msg ->
107107- Printf.printf " - %s\n" msg.Html5_checker.Message.message
108108- ) errors7;
109109-110110- C.end_element state ~name:"area" ~namespace:None collector;
111111- Html5_checker.Message_collector.clear collector;
112112-113113- (* Test 8: area with map ancestor (valid) *)
114114- Printf.printf "\nTest 8: Checking <area> with <map> ancestor (valid)\n";
115115- C.start_element state ~name:"map" ~namespace:None ~attrs:[] collector;
116116- C.start_element state ~name:"area" ~namespace:None ~attrs:[] collector;
117117-118118- let errors8 = Html5_checker.Message_collector.errors collector in
119119- Printf.printf " Found %d error(s)\n" (List.length errors8);
120120- if List.length errors8 = 0 then
121121- Printf.printf " OK: No errors as expected\n";
122122-123123- C.end_element state ~name:"area" ~namespace:None collector;
124124- C.end_element state ~name:"map" ~namespace:None collector;
6262+ Printf.printf " OK: No errors as expected\n"
6363+ else
6464+ List.iter (fun msg ->
6565+ Printf.printf " - %s\n" msg.Htmlrw_check.text
6666+ ) errors6;
1256712668 Printf.printf "\nAll tests completed!\n"
+3-3
test/test_nfc_debug.ml
···33 In_channel.input_all ic
44 ) in
55 let reader = Bytesrw.Bytes.Reader.of_string content in
66- let result = Html5_checker.check ~system_id:"test.html" reader in
77- let warnings = Html5_checker.warnings result in
66+ let result = Htmlrw_check.check ~system_id:"test.html" reader in
77+ let warnings = Htmlrw_check.warnings result in
88 Printf.printf "Total warnings: %d\n" (List.length warnings);
99 List.iter (fun msg ->
1010- Printf.printf "WARNING: %s\n" (Html5_checker.Message.message msg)
1010+ Printf.printf "WARNING: %s\n" msg.Htmlrw_check.text
1111 ) warnings
+6-6
test/test_roundtrip.ml
···37373838(* Count errors in validation result *)
3939let count_errors messages =
4040- List.length (List.filter (fun (m : Html5_checker.Message.t) ->
4141- m.severity = Html5_checker.Message.Error
4040+ List.length (List.filter (fun (m : Htmlrw_check.message) ->
4141+ m.severity = Htmlrw_check.Error
4242 ) messages)
43434444(* Serialize a document to HTML string *)
···6565 let original_doc = Html5rw.root original_result in
66666767 (* Validate original *)
6868- let checker_result = Html5_checker.check_dom ~system_id:path original_result in
6969- let original_messages = Html5_checker.messages checker_result in
6868+ let checker_result = Htmlrw_check.check_parsed ~system_id:path original_result in
6969+ let original_messages = Htmlrw_check.messages checker_result in
7070 let original_errors = count_errors original_messages in
7171 let original_valid = original_errors = 0 in
7272···7777 let roundtrip_result = Html5rw.parse_bytes (Bytes.of_string serialized) in
78787979 (* Validate roundtripped document *)
8080- let roundtrip_checker = Html5_checker.check_dom ~system_id:path roundtrip_result in
8181- let roundtrip_messages = Html5_checker.messages roundtrip_checker in
8080+ let roundtrip_checker = Htmlrw_check.check_parsed ~system_id:path roundtrip_result in
8181+ let roundtrip_messages = Htmlrw_check.messages roundtrip_checker in
8282 let roundtrip_errors = count_errors roundtrip_messages in
8383 let roundtrip_valid = roundtrip_errors = 0 in
8484
+7-7
test/test_validator.ml
···105105 close_in ic;
106106107107 let reader = Bytesrw.Bytes.Reader.of_string content in
108108- let result = Html5_checker.check ~collect_parse_errors:true ~system_id:test.relative_path reader in
108108+ let result = Htmlrw_check.check ~collect_parse_errors:true ~system_id:test.relative_path reader in
109109110110 (* Keep full message objects for proper matching *)
111111- let error_msgs = Html5_checker.errors result in
112112- let warning_msgs = Html5_checker.warnings result in
113113- let info_msgs = Html5_checker.infos result in
111111+ let error_msgs = Htmlrw_check.errors result in
112112+ let warning_msgs = Htmlrw_check.warnings result in
113113+ let info_msgs = Htmlrw_check.infos result in
114114115115 (* Extract text for reporting *)
116116- let errors = List.map (fun m -> m.Html5_checker.Message.message) error_msgs in
117117- let warnings = List.map (fun m -> m.Html5_checker.Message.message) warning_msgs in
118118- let infos = List.map (fun m -> m.Html5_checker.Message.message) info_msgs in
116116+ let errors = List.map (fun m -> m.Htmlrw_check.text) error_msgs in
117117+ let warnings = List.map (fun m -> m.Htmlrw_check.text) warning_msgs in
118118+ let infos = List.map (fun m -> m.Htmlrw_check.text) info_msgs in
119119 let expected_msg = Validator_messages.get messages test.relative_path in
120120121121 let (passed, match_quality, details) = match test.expected with