From b610aa1c0cc02c54f4252756d25dcfa4c399fae9 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Wed, 15 Oct 2025 17:33:33 +0800 Subject: [PATCH] Encode UTF8 non breakingspace (194, 160) as   - same as chrome --- src/browser/dump.zig | 15 ++++++++++++--- src/tests/dom/element.html | 13 +++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/browser/dump.zig b/src/browser/dump.zig index dab2d14d..ccbffed0 100644 --- a/src/browser/dump.zig +++ b/src/browser/dump.zig @@ -236,10 +236,10 @@ fn isVoid(elem: *parser.Element) !bool { }; } -fn writeEscapedTextNode(writer: anytype, value: []const u8) !void { +fn writeEscapedTextNode(writer: *std.Io.Writer, value: []const u8) !void { var v = value; while (v.len > 0) { - const index = std.mem.indexOfAnyPos(u8, v, 0, &.{ '&', '<', '>' }) orelse { + const index = std.mem.indexOfAnyPos(u8, v, 0, &.{ '&', '<', '>', 194 }) orelse { return writer.writeAll(v); }; try writer.writeAll(v[0..index]); @@ -247,13 +247,22 @@ fn writeEscapedTextNode(writer: anytype, value: []const u8) !void { '&' => try writer.writeAll("&"), '<' => try writer.writeAll("<"), '>' => try writer.writeAll(">"), + 194 => { + // non breaking space + if (v.len > index + 1 and v[index + 1] == 160) { + try writer.writeAll(" "); + v = v[index + 2 ..]; + continue; + } + try writer.writeByte(194); + }, else => unreachable, } v = v[index + 1 ..]; } } -fn writeEscapedAttributeValue(writer: anytype, value: []const u8) !void { +fn writeEscapedAttributeValue(writer: *std.Io.Writer, value: []const u8) !void { var v = value; while (v.len > 0) { const index = std.mem.indexOfAnyPos(u8, v, 0, &.{ '&', '<', '>', '"' }) orelse { diff --git a/src/tests/dom/element.html b/src/tests/dom/element.html index 4364ee87..d5794fa2 100644 --- a/src/tests/dom/element.html +++ b/src/tests/dom/element.html @@ -326,3 +326,16 @@ testing.expectEqual("after begin", newElement.innerText); testing.expectEqual("afterbegin", newElement.className); + +