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 ();
2
7
3
- pub fn build (b : * Builder ) void {
4
8
const mode = b .standardReleaseOptions ();
5
9
const lib = b .addStaticLibrary ("htmlentities.zig" , "src/main.zig" );
6
10
lib .setBuildMode (mode );
@@ -12,3 +16,83 @@ pub fn build(b: *Builder) void {
12
16
const test_step = b .step ("test" , "Run library tests" );
13
17
test_step .dependOn (& main_tests .step );
14
18
}
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