From 9b47b7ee8b80bf427116b4d2cf42e6f3c9d8be62 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Sat, 18 Apr 2026 19:25:54 +0200 Subject: feat(ast): parse title --- src/parser.zig | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) (limited to 'src/parser.zig') diff --git a/src/parser.zig b/src/parser.zig index e5a9ea2..5f8c676 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -1,15 +1,15 @@ const std = @import("std"); +const Allocator = std.mem.Allocator; const Lexed = @import("lexer/Lexed.zig"); const Lexer = @import("lexer/Lexer.zig"); const Element = @import("dom/Element.zig"); -const Allocator = std.mem.Allocator; const paragraph = @import("paragraph.zig"); +const title = @import("title.zig"); pub const Error = error{ InvalidSequence, - UnclosedModifier, FeatureNotSupported, -} || Lexer.Error; +} || Lexer.Error || paragraph.Error; pub fn parse(parent: Allocator, content: []const u8) Error![]const u8 { var arena = std.heap.ArenaAllocator.init(parent); @@ -20,10 +20,16 @@ pub fn parse(parent: Allocator, content: []const u8) Error![]const u8 { var l = try Lexer.init(content); while (l.nextKind()) |it| { - switch (it) { - .literal, .bold, .italic, .code => try elements.append(alloc, try paragraph.parseParagraph(alloc, &l)), + try elements.append(alloc, switch (it) { + .literal, .bold, .italic, .code => try paragraph.parse(alloc, &l), + .title => try title.parse(alloc, &l), + .weak_delimiter, .strong_delimiter => { + var v = (try l.next(alloc)).?; + v.deinit(); + continue; + }, else => return Error.FeatureNotSupported, - } + }); } var res = try std.ArrayList(u8).initCapacity(parent, elements.items.len); @@ -60,3 +66,20 @@ test "parse paragraphs" { \\in new paragraph , "

hello world

foo bar in new paragraph

"); } + +test "parse title" { + var arena = std.heap.DebugAllocator(.{}).init; + defer if (arena.deinit() == .leak) std.debug.print("leaking!\n", .{}); + const alloc = arena.allocator(); + + try doTest(alloc, "# hey", "

hey

"); + try doTest(alloc, "## hey", "

hey

"); + try doTest(alloc, "### hey", "

hey

"); + + try doTest(alloc, + \\# title + \\hello world ;3 + \\## subtitle + \\hehe + , "

title

hello world ;3

subtitle

hehe

"); +} -- cgit v1.2.3