|
1 | 1 | const std = @import("std");
|
2 | 2 | const assert = std.debug.assert;
|
3 |
| -const zig = std.zig; |
4 | 3 |
|
5 | 4 | pub fn build(b: *std.Build) !void {
|
6 |
| - try generateEntities(); |
| 5 | + const genent = b.addExecutable(.{ |
| 6 | + .name = "generate_entities", |
| 7 | + .root_source_file = b.path("src/generate_entities.zig"), |
| 8 | + .target = b.host, |
| 9 | + }); |
| 10 | + const genent_step = b.addRunArtifact(genent); |
| 11 | + const genent_out = genent_step.addOutputFileArg("entities.zig"); |
7 | 12 |
|
8 | 13 | const target = b.standardTargetOptions(.{});
|
9 | 14 | const optimize = b.standardOptimizeOption(.{});
|
10 | 15 |
|
11 |
| - _ = b.addModule("htmlentities", .{ |
| 16 | + const mod = b.addModule("htmlentities", .{ |
12 | 17 | .root_source_file = b.path("src/main.zig"),
|
13 | 18 | .optimize = optimize,
|
14 | 19 | .target = target,
|
15 | 20 | });
|
| 21 | + mod.addAnonymousImport("entities", .{ .root_source_file = genent_out }); |
16 | 22 |
|
17 | 23 | const lib = b.addStaticLibrary(.{
|
18 | 24 | .name = "htmlentities.zig",
|
19 | 25 | .root_source_file = b.path("src/main.zig"),
|
20 | 26 | .optimize = optimize,
|
21 | 27 | .target = target,
|
22 | 28 | });
|
| 29 | + lib.root_module.addAnonymousImport("entities", .{ .root_source_file = genent_out }); |
23 | 30 | b.installArtifact(lib);
|
24 | 31 |
|
25 | 32 | var main_tests = b.addTest(.{
|
26 | 33 | .root_source_file = b.path("src/main.zig"),
|
27 | 34 | .optimize = optimize,
|
28 | 35 | });
|
| 36 | + main_tests.root_module.addAnonymousImport("entities", .{ .root_source_file = genent_out }); |
29 | 37 |
|
30 | 38 | const test_step = b.step("test", "Run library tests");
|
31 | 39 | test_step.dependOn(&main_tests.step);
|
32 | 40 | }
|
33 |
| - |
34 |
| -const embedded_json = @embedFile("entities.json"); |
35 |
| - |
36 |
| -fn strLessThan(_: void, lhs: []const u8, rhs: []const u8) bool { |
37 |
| - return std.mem.lessThan(u8, lhs, rhs); |
38 |
| -} |
39 |
| - |
40 |
| -fn generateEntities() !void { |
41 |
| - var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); |
42 |
| - defer arena.deinit(); |
43 |
| - |
44 |
| - const allocator = arena.allocator(); |
45 |
| - |
46 |
| - var tree = try std.json.parseFromSlice(std.json.Value, allocator, embedded_json, .{}); |
47 |
| - |
48 |
| - var buffer = std.ArrayList(u8).init(allocator); |
49 |
| - var writer = buffer.writer(); |
50 |
| - |
51 |
| - try writer.writeAll("pub const ENTITIES = [_]@import(\"main.zig\").Entity{\n"); |
52 |
| - |
53 |
| - var keys = try std.ArrayList([]const u8).initCapacity(allocator, tree.value.object.count()); |
54 |
| - var entries_it = tree.value.object.iterator(); |
55 |
| - while (entries_it.next()) |entry| { |
56 |
| - keys.appendAssumeCapacity(entry.key_ptr.*); |
57 |
| - } |
58 |
| - |
59 |
| - std.mem.sortUnstable([]const u8, keys.items, {}, strLessThan); |
60 |
| - |
61 |
| - for (keys.items) |key| { |
62 |
| - var value = tree.value.object.get(key).?.object; |
63 |
| - try std.fmt.format(writer, ".{{ .entity = \"{}\", .codepoints = ", .{zig.fmtEscapes(key)}); |
64 |
| - |
65 |
| - const codepoints_array = value.get("codepoints").?.array; |
66 |
| - if (codepoints_array.items.len == 1) { |
67 |
| - try std.fmt.format(writer, ".{{ .Single = {} }}, ", .{codepoints_array.items[0].integer}); |
68 |
| - } else { |
69 |
| - try std.fmt.format(writer, ".{{ .Double = [2]u32{{ {}, {} }} }}, ", .{ codepoints_array.items[0].integer, codepoints_array.items[1].integer }); |
70 |
| - } |
71 |
| - |
72 |
| - try std.fmt.format(writer, ".characters = \"{}\" }},\n", .{zig.fmtEscapes(value.get("characters").?.string)}); |
73 |
| - } |
74 |
| - |
75 |
| - try writer.writeAll("};\n"); |
76 |
| - |
77 |
| - try buffer.append(0); |
78 |
| - |
79 |
| - var zig_tree = try zig.Ast.parse(allocator, buffer.items[0 .. buffer.items.len - 1 :0], .zig); |
80 |
| - |
81 |
| - var out_file = try std.fs.cwd().createFile("src/entities.zig", .{}); |
82 |
| - const formatted = try zig_tree.render(allocator); |
83 |
| - try out_file.writer().writeAll(formatted); |
84 |
| - out_file.close(); |
85 |
| -} |
0 commit comments