From f8647b8b1cbd3bd2f43d9baf475860c24882cb9c Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Thu, 4 Dec 2025 15:30:44 +0100 Subject: [PATCH] axtree: better json string writer --- src/cdp/AXNode.zig | 54 +++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/cdp/AXNode.zig b/src/cdp/AXNode.zig index 69f29ac2..d4bfc80a 100644 --- a/src/cdp/AXNode.zig +++ b/src/cdp/AXNode.zig @@ -572,30 +572,7 @@ fn writeName(axnode: AXNode, w: anytype) !?AXSource { => {}, else => { if (parser.nodeTextContent(node)) |content| { - if (!std.unicode.utf8ValidateSlice(content)) { - return error.InvalidUTF8String; - } - - // replace white spaces with single space. - try w.beginWriteRaw(); - try w.writer.writeByte('\"'); - var prev_white = false; - for (content) |c| { - if (std.ascii.isWhitespace(c)) { - if (prev_white) { - continue; - } - prev_white = true; - try w.writer.writeByte(' '); - } else { - prev_white = false; - try w.writer.writeByte(c); - } - } - prev_white = false; - try w.writer.writeByte('\"'); - w.endWriteRaw(); - + try writeString(content, w); return .contents; } }, @@ -772,3 +749,32 @@ pub const Walker = struct { return parser.nodeNextSibling(n); } }; + +// write a JSON string. +// replaces all whitspaces with a single space. +fn writeString(s: []const u8, w: anytype) !void { + if (!std.unicode.utf8ValidateSlice(s)) { + return error.InvalidUTF8String; + } + + // replace white spaces with single space. + try w.beginWriteRaw(); + try w.writer.writeByte('\"'); + var cursor: usize = 0; + for (s, 0..) |c, i| { + if (std.ascii.isWhitespace(c)) { + // write string until space + if (cursor < i) { + try w.writer.writeAll(s[cursor..i]); + try w.writer.writeByte(' '); + } + cursor = i + 1; + } + } + // write the reminder string + if (cursor < s.len) { + try w.writer.writeAll(s[cursor..]); + } + try w.writer.writeByte('\"'); + w.endWriteRaw(); +}