]> gitweb.ps.run Git - chirp/blobdiff - src/main.zig
update reencode
[chirp] / src / main.zig
index cc3321686b188a3498ffdf7bc9f639e357753f5a..9411261cd4c4f1abe2f012bcb411decee04ee42c 100644 (file)
@@ -111,28 +111,19 @@ fn reencode(comptime T: type, text: []const u8) !T {
         const c = text[idx];
         if (c == '+') {
             try result.append(' ');
-        } else if (c == '%') {
-            // special case of &#...
-            // assume only &#, no &#x
-            if (idx + 6 < text.len and std.mem.eql(u8, text[idx .. idx + 6], "%26%23")) {
-                const num_start = idx + 6;
-                var num_end = num_start;
-                while (num_end < text.len and std.ascii.isDigit(text[num_end])) {
-                    num_end += 1;
-                }
+        } else if (c == '%' and idx + 2 < text.len) {
+            const allow = &[_]u8{ 0x26, 0x23, 0x3b, 0x0a };
 
-                if (num_end + 2 < text.len and
-                    text[num_end] == '%' and
-                    text[num_end + 1] == '3' and
-                    std.ascii.toLower(text[num_end + 2]) == 'b')
-                {
-                    try std.fmt.format(result.writer(), "&#{s};", .{text[num_start..num_end]});
-                    idx = num_end + 2;
-                    continue;
-                }
+            const escaped_value = std.fmt.parseUnsigned(u8, text[idx + 1 .. idx + 3], 16) catch continue;
+
+            if (escaped_value == 0x0d) {
+                try std.fmt.format(result.writer(), "<br />", .{});
+            } else if (std.mem.indexOfScalar(u8, allow, escaped_value) != null) {
+                try std.fmt.format(result.writer(), "{c}", .{escaped_value});
+            } else {
+                try std.fmt.format(result.writer(), "&#x{x};", .{escaped_value});
             }
 
-            try std.fmt.format(result.writer(), "&#x{s};", .{text[idx + 1 .. idx + 3]});
             idx += 2;
         } else {
             try result.append(c);