Skip to content

Commit 63b9393

Browse files
committed
wip
1 parent 2c05c0b commit 63b9393

File tree

3 files changed

+11249
-52
lines changed

3 files changed

+11249
-52
lines changed

build.zig

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
const Builder = @import("std").build.Builder;
1+
const std = @import("std");
2+
const assert = std.debug.assert;
3+
const zig = std.zig;
4+
5+
pub fn build(b: *std.build.Builder) !void {
6+
try generateEntities();
27

3-
pub fn build(b: *Builder) void {
48
const mode = b.standardReleaseOptions();
59
const lib = b.addStaticLibrary("htmlentities.zig", "src/main.zig");
610
lib.setBuildMode(mode);
@@ -12,3 +16,83 @@ pub fn build(b: *Builder) void {
1216
const test_step = b.step("test", "Run library tests");
1317
test_step.dependOn(&main_tests.step);
1418
}
19+
20+
const embedded_json = @embedFile("entities.json");
21+
22+
fn generateEntities() !void {
23+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
24+
defer arena.deinit();
25+
26+
var json_parser = std.json.Parser.init(&arena.allocator, false);
27+
var tree = try json_parser.parse(embedded_json);
28+
29+
var zig_tree = try zig.parse(&arena.allocator,
30+
\\pub const ENTITIES = [_]@import("main.zig").Entity{
31+
\\ .{
32+
\\ .entity = "entity",
33+
\\ .codepoints = .{ .Single = 1 },
34+
\\ .characters = "characters",
35+
\\ },
36+
\\ .{
37+
\\ .entity = "entity",
38+
\\ .codepoints = .{ .Double = [2]u32{ 1, 2 } },
39+
\\ .characters = "characters",
40+
\\ },
41+
\\};
42+
);
43+
44+
var decls = zig_tree.root_node.decls();
45+
assert(decls.len == 1);
46+
47+
var var_decl = decls[0].castTag(.VarDecl) orelse @panic("not VarDecl");
48+
std.debug.print("init_node: {}\n", .{var_decl.getTrailer("init_node")});
49+
50+
var array_decl = var_decl.getTrailer("init_node") orelse @panic("no init_node");
51+
var array_init = array_decl.castTag(.ArrayInitializer) orelse @panic("not ArrayInitializer");
52+
53+
var list = array_init.list();
54+
assert(list.len == 2);
55+
56+
var single = list[0];
57+
var double = list[1];
58+
59+
var entities = tree.root.Object.items();
60+
61+
var new_array = try zig.ast.Node.ArrayInitializer.alloc(&arena.allocator, entities.len);
62+
new_array.* = .{
63+
.base = .{ .tag = .ArrayInitializer },
64+
.rtoken = array_init.rtoken,
65+
.list_len = entities.len,
66+
.lhs = array_init.lhs,
67+
};
68+
69+
var i: usize = 0;
70+
while (i < entities.len) : (i += 1)
71+
new_array.list()[i] = if (i % 2 == 0) single else double;
72+
73+
var_decl.setTrailer("init_node", &new_array.base);
74+
75+
var out_file = try std.fs.cwd().createFile("src/entities.zig", .{});
76+
_ = try zig.render(&arena.allocator, out_file.writer(), zig_tree);
77+
78+
// var map = std.StringHashMap(Entity).init(allocator);
79+
// for (tree.root.Object.items()) |entry, i| {
80+
// var codepoints_array = &entry.value.Object.get("codepoints").?.Array;
81+
// try map.put(entry.key, .{
82+
// .entity = try allocator.dupe(u8, entry.key),
83+
// .codepoints = switch (codepoints_array.items.len) {
84+
// 1 => .{ .Single = @intCast(u32, codepoints_array.items[0].Integer) },
85+
// 2 => .{
86+
// .Double = [_]u32{
87+
// @intCast(u32, codepoints_array.items[0].Integer),
88+
// @intCast(u32, codepoints_array.items[1].Integer),
89+
// },
90+
// },
91+
// else => unreachable,
92+
// },
93+
// .characters = try allocator.dupe(u8, entry.value.Object.get("characters").?.String),
94+
// });
95+
// }
96+
//
97+
// return map;
98+
}

0 commit comments

Comments
 (0)