Something went wrong. Try again.
Markup language that is simple to read, to write and to parse.
zig parser html language markup typst
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657const std = @import("std");const Allocator = std.mem.Allocator;const Element = @import("Element.zig");const Node = Element.Node;const Error = Element.Error;
base: Element.Void,content: ?Element = null,node: Node = .{ .ptr = undefined, .vtable = .{ .element = fromNode },},
pub const Self = @This();
pub fn init(alloc: Allocator, tag: []const u8) Error!*Self { const v = try alloc.create(Self); v.* = .{ .base = .{ .alloc = alloc, .tag = tag, .attributes = .empty, .class_list = .init(alloc), }, }; v.node.ptr = v; return v;}
pub fn element(self: *Self) Element { return Element.Wrapper(Self, render).init(self);}
fn fromNode(context: *anyopaque) Element { const self: *Self = @ptrCast(@alignCast(context)); return self.element();}
fn render(self: *Self, alloc: Allocator) Error![]const u8 { var base = self.base; const b = try base.element().render(alloc); defer alloc.free(b); var acc = try std.ArrayList(u8).initCapacity(alloc, b.len * 2); try acc.appendSlice(alloc, b);
if (self.content) |it| { const sub = try it.render(alloc); defer alloc.free(sub); try acc.appendSlice(alloc, sub); }
try acc.appendSlice(alloc, "</"); try acc.appendSlice(alloc, base.tag); try acc.append(alloc, '>'); return acc.toOwnedSlice(alloc);}