SemanticTree: use StaticStringMap for structural role check

Improves performance and readability of isStructuralRole. Also includes minor syntax cleanup in AXNode.
This commit is contained in:
Adrià Arrufat
2026-03-11 16:37:24 +09:00
parent 1866e7141e
commit 37735b1caa
2 changed files with 17 additions and 16 deletions

View File

@@ -367,21 +367,22 @@ const JsonVisitor = struct {
}; };
fn isStructuralRole(role: []const u8) bool { fn isStructuralRole(role: []const u8) bool {
// zig fmt: off const structural_roles = std.StaticStringMap(void).initComptime(.{
return std.mem.eql(u8, role, "none") or .{ "none", {} },
std.mem.eql(u8, role, "generic") or .{ "generic", {} },
std.mem.eql(u8, role, "InlineTextBox") or .{ "InlineTextBox", {} },
std.mem.eql(u8, role, "banner") or .{ "banner", {} },
std.mem.eql(u8, role, "navigation") or .{ "navigation", {} },
std.mem.eql(u8, role, "main") or .{ "main", {} },
std.mem.eql(u8, role, "list") or .{ "list", {} },
std.mem.eql(u8, role, "listitem") or .{ "listitem", {} },
std.mem.eql(u8, role, "table") or .{ "table", {} },
std.mem.eql(u8, role, "rowgroup") or .{ "rowgroup", {} },
std.mem.eql(u8, role, "row") or .{ "row", {} },
std.mem.eql(u8, role, "cell") or .{ "cell", {} },
std.mem.eql(u8, role, "region"); .{ "region", {} },
// zig fmt: on });
return structural_roles.has(role);
} }
const TextVisitor = struct { const TextVisitor = struct {

View File

@@ -767,7 +767,7 @@ pub fn getName(self: AXNode, page: *Page, allocator: std.mem.Allocator) !?[]cons
pub fn endWriteRaw(_: @This()) void {} pub fn endWriteRaw(_: @This()) void {}
}; };
const w = TextCaptureWriter{ .aw = &aw, .writer = &aw.writer }; const w: TextCaptureWriter = .{ .aw = &aw, .writer = &aw.writer };
const source = try self.writeName(w, page); const source = try self.writeName(w, page);
if (source != null) { if (source != null) {