@@ -49,39 +49,27 @@ pub const Writer = struct {
4949
5050 fn toJSON (self : * const Writer , node : * const Node , w : anytype ) ! void {
5151 try w .beginArray ();
52- if (try self .writeNode (node , w )) {
53- // skip children
54- try w .endArray ();
55- return ;
56- }
57-
58- // special case: if the node is the document, walk starts from body.
59- const start = blk : {
60- if (parser .nodeType (node ._node ) != .document ) {
61- break :blk node ._node ;
62- }
63-
64- const doc = parser .documentHTMLToDocument (@ptrCast (node ._node ));
65- std .debug .assert (doc .is_html );
66-
67- // find <body> tag
68- const list = try parser .documentGetElementsByTagName (doc , "body" );
69- break :blk parser .nodeListItem (list , 0 ) orelse node ._node ;
70- };
52+ try self .writeNode (node , w );
7153
7254 const walker = Walker {};
7355 var next : ? * parser.Node = null ;
7456 var skip_children = false ;
7557 while (true ) {
76- next = try walker .get_next (start , next , .{ .skip_children = skip_children }) orelse break ;
58+ next = try walker .get_next (node . _node , next , .{ .skip_children = skip_children }) orelse break ;
7759
7860 if (parser .nodeType (next .? ) != .element ) {
7961 skip_children = true ;
8062 continue ;
8163 }
8264
8365 const n = try self .registry .register (next .? );
84- skip_children = try self .writeNode (n , w );
66+ try self .writeNode (n , w );
67+
68+ const tag = try parser .elementTag (@ptrCast (next .? ));
69+ skip_children = switch (tag ) {
70+ .head = > true ,
71+ else = > false ,
72+ };
8573 }
8674
8775 try w .endArray ();
@@ -206,18 +194,22 @@ pub const Writer = struct {
206194 }
207195
208196 // write a node. returns true if children must be skipped.
209- fn writeNode (self : * const Writer , node : * const Node , w : anytype ) ! bool {
197+ fn writeNode (self : * const Writer , node : * const Node , w : anytype ) ! void {
210198 try w .beginObject ();
211199
212200 const axn = try AXNode .fromNode (node ._node );
213201 try w .objectField ("nodeId" );
214202 try w .write (node .id );
215203
204+ try w .objectField ("role" );
205+ try self .writeAXValue (.{ .type = .role , .value = .{ .string = try axn .getRole () } }, w );
206+
216207 const ignore = try axn .isIgnore ();
217208 try w .objectField ("ignored" );
218209 try w .write (ignore );
219210
220211 if (ignore ) {
212+ // Ignore reasons
221213 try w .objectField ("ignored_reasons" );
222214 try w .beginArray ();
223215 try w .beginObject ();
@@ -227,12 +219,8 @@ pub const Writer = struct {
227219 try self .writeAXValue (.{ .type = .boolean , .value = .{ .boolean = true } }, w );
228220 try w .endObject ();
229221 try w .endArray ();
230- }
231-
232- try w .objectField ("role" );
233- try self .writeAXValue (.{ .type = .role , .value = .{ .string = try axn .getRole () } }, w );
234-
235- if (! ignore ) {
222+ } else {
223+ // Name
236224 try w .objectField ("name" );
237225 try w .beginObject ();
238226 try w .objectField ("type" );
@@ -243,10 +231,17 @@ pub const Writer = struct {
243231 try self .writeAXSource (s , w );
244232 }
245233 try w .endObject ();
234+
235+ // Properties
236+ try w .objectField ("properties" );
237+ try w .beginArray ();
238+ try self .writeAXProperties (axn , w );
239+ try w .endArray ();
246240 }
247241
248242 const n = axn ._node ;
249243
244+ // Parent
250245 if (parser .nodeParentNode (n )) | p | {
251246 const parent_node = try self .registry .register (p );
252247 try w .objectField ("parentId" );
@@ -265,21 +260,17 @@ pub const Writer = struct {
265260 defer i += 1 ;
266261 const child = (parser .nodeListItem (child_nodes , @intCast (i ))) orelse break ;
267262
268- // TODO ignore some of them?
263+ // ignore non-elements
264+ if (parser .nodeType (child ) != .element ) {
265+ continue ;
266+ }
267+
269268 const child_node = try registry .register (child );
270269 try w .write (child_node .id );
271270 }
272271 try w .endArray ();
273272
274- // Properties
275- try w .objectField ("properties" );
276- try w .beginArray ();
277- try self .writeAXProperties (axn , w );
278- try w .endArray ();
279-
280273 try w .endObject ();
281-
282- return false ;
283274 }
284275};
285276
@@ -527,8 +518,8 @@ pub const AXRole = enum(u8) {
527518 .dfn = > .term ,
528519
529520 // Document Structure
530- .html = > .document ,
531- .body = > .document ,
521+ .html = > .none ,
522+ .body = > .none ,
532523
533524 // Deprecated/Obsolete Elements
534525 .marquee = > .marquee ,
@@ -697,6 +688,8 @@ fn isIgnore(self: AXNode) !bool {
697688 .datalist ,
698689 .col ,
699690 .colgroup ,
691+ .html ,
692+ .body ,
700693 = > return true ,
701694 .img = > {
702695 // Check for empty decorative images
0 commit comments