mymarkdown

My markdown
git clone https://git.grace.moe/mymarkdown
Log | Files | Refs

commit f9a0127ec0fe3282cdf207309e4bc0686cc49de4
parent bd95922ce51c9eb723dde54821c792f7a40b9ad7
Author: gracefu <81774659+gracefuu@users.noreply.github.com>
Date:   Wed, 21 May 2025 22:33:20 +0800

Shrink code some more, remove more comptime

Diffstat:
Msrc/AstGen3.zig | 180++++++++++++++++++++++++++++++++-----------------------------------------------
1 file changed, 73 insertions(+), 107 deletions(-)

diff --git a/src/AstGen3.zig b/src/AstGen3.zig @@ -291,59 +291,34 @@ fn parseInlineColumn( parent_idx: Node.Idx, ) !void { // TODO: Inline parsing - next_paragraph: { - if (self.scanner.peek() == null) return; - const tracy_frame = tracy.trace(@src()); - defer tracy_frame.end(); - tracy_frame.setName(@tagName(.text)); - if (self.scanner.peek()) |peek| { - const alignment, const line = peek; - tracy_frame.addText(line.toUnpaddedSlice()); - try self.insertTextLine(.text, .text, parent_idx, line); - if (alignment == .misaligned) - try self.appendPointError(.inconsistent_indentation, parent_idx, line.ptr); - self.scanner.advance(); - } - while (self.scanner.peek()) |peek| { - const alignment, const line = peek; - if (line.len == line.indexOfNotSpaceOrTab()) - break :next_paragraph; - try self.insertTextLine(.space_text, .text, parent_idx, line); - if (alignment == .misaligned) - try self.appendPointError(.inconsistent_indentation, parent_idx, line.ptr); - self.scanner.advance(); - } - return; - } - next_paragraph: while (true) { - while (self.scanner.peek()) |peek| { - _, const line = peek; - if (line.len != line.indexOfNotSpaceOrTab()) break; - self.scanner.advance(); - } - if (self.scanner.peek() == null) return; + { + var peek_maybe = self.scanner.peek(); + if (peek_maybe == null) return; const tracy_frame = tracy.trace(@src()); defer tracy_frame.end(); - tracy_frame.setName(@tagName(.text)); - if (self.scanner.peek()) |peek| { - const alignment, const line = peek; - tracy_frame.addText(line.toUnpaddedSlice()); - try self.insertTextLine(.space_text, .text, parent_idx, line); - try self.appendNodeError(.unexpected_block_in_inline_context, self.lastNodeIdx()); - if (alignment == .misaligned) - try self.appendPointError(.inconsistent_indentation, parent_idx, line.ptr); - self.scanner.advance(); - } - while (self.scanner.peek()) |peek| { + tracy_frame.setName("inline"); + tracy_frame.addText(peek_maybe.?.@"1".toUnpaddedSlice()); + var text_tag: Node.Tag = .text; + var saw_empty_line = false; + while (peek_maybe) |peek| { const alignment, const line = peek; - if (line.len == line.indexOfNotSpaceOrTab()) - continue :next_paragraph; - try self.insertTextLine(.space_text, .text, parent_idx, line); + if (line.len == 0 or line.len == line.indexOfNotSpaceOrTab()) { + saw_empty_line = true; + self.scanner.advance(); + peek_maybe = self.scanner.peek(); + continue; + } if (alignment == .misaligned) - try self.appendPointError(.inconsistent_indentation, parent_idx, line.ptr); + try self.appendPointError(.inconsistent_indentation, self.nextNodeIdx(), line.ptr); + if (saw_empty_line) { + try self.appendNodeError(.unexpected_block_in_inline_context, self.nextNodeIdx()); + saw_empty_line = false; + } + try self.insertTextLine(text_tag, .text, parent_idx, line); self.scanner.advance(); + peek_maybe = self.scanner.peek(); + text_tag = .space_text; } - break; } } @@ -418,27 +393,22 @@ fn parseColumn( tracy_frame.setName(@tagName(@as(Node.Tag, @enumFromInt(m)))); break :blk .{ base_marker_len, @enumFromInt(m) }; }; - switch (list_type) { - inline .unordered_item, .ordered_item, .term_item, .task_item => |tag| { - const list_node_idx = blk: { - if (current_list) |cur| { - const cur_tag, const cur_node_idx = cur; - if (tag == cur_tag) break :blk cur_node_idx; - } - const list_node_idx = try self.appendContainerNode(parent_idx, .list, line.ptr); - current_list = .{ tag, list_node_idx }; - break :blk list_node_idx; - }; - const block_idx = try self.appendContainerNode(list_node_idx, tag, line.ptr); - _ = try self.appendLeafNode(block_idx, .marker, line.ptr, try castStrLen(marker_len, error.MarkerTooLong)); - last_elaboratable_idx = .{ block_idx, base_marker_len }; - try self.scanner.indent(.{ .skip = line_start + marker_len }); - try self.parseInlineColumn(block_idx); - self.scanner.dedent(); - break :block_idx block_idx; - }, - else => unreachable, - } + const list_node_idx = blk: { + if (current_list) |cur| { + const cur_tag, const cur_node_idx = cur; + if (list_type == cur_tag) break :blk cur_node_idx; + } + const list_node_idx = try self.appendContainerNode(parent_idx, .list, line.ptr); + current_list = .{ list_type, list_node_idx }; + break :blk list_node_idx; + }; + const block_idx = try self.appendContainerNode(list_node_idx, list_type, line.ptr); + _ = try self.appendLeafNode(block_idx, .marker, line.ptr, try castStrLen(marker_len, error.MarkerTooLong)); + last_elaboratable_idx = .{ block_idx, base_marker_len }; + try self.scanner.indent(.{ .skip = line_start + marker_len }); + try self.parseInlineColumn(block_idx); + self.scanner.dedent(); + break :block_idx block_idx; }, // Elaborations @@ -507,8 +477,39 @@ fn parseColumn( last_elaboratable_idx = null; try self.insertTextLine(.text, .text, paragraph_idx, line); self.scanner.advance(); - // Split into separate function so parseRoot / parseColumn share the same branch predictors - try self.parseRestParagraph(paragraph_idx); + + while (self.scanner.peek()) |peek2| { + const alignment2, const line2 = peek2; + const line_load4: u32 = @bitCast(line2.ptr._ptr[0..4].*); + const line_load3: u32 = line_load4 & @as(u32, @bitCast("\xff\xff\xff\x00\x00"[0..4].*)); + const line_load2: u32 = line_load4 & @as(u32, @bitCast("\xff\xff\x00\x00\x00"[0..4].*)); + + switch (line2.ptr._ptr[0]) { + // Special block chars / actually empty line + '\n', '-', '.', ':', '+', '>', '#', '@' => break, + // Empty line (only whitespace) + ' ', '\t' => if (line2.len == line2.indexOfNotSpaceOrTab()) break, + // string literals have extra chars so [0..4] doesn't give a sentinel ptr + // Thematic break + '*' => if (line_load3 == + @as(u32, @bitCast("***\x00\x00"[0..4].*)) and + (line2.len == 3 or + line2.len == 3 + line2.sliceOpen(3).indexOfNotSpaceOrTab())) break, + // Verbatim block + '=' => if (line_load2 == + @as(u32, @bitCast("==\x00\x00\x00"[0..4].*))) break, + // Math block + '$' => if (line_load3 == + @as(u32, @bitCast("$==\x00\x00"[0..4].*))) break, + else => {}, + } + + if (alignment2 == .misaligned) + try self.appendPointError(.inconsistent_indentation, self.nextNodeIdx(), line2.ptr); + try self.insertTextLine(.space_text, .text, paragraph_idx, line2); + self.scanner.advance(); + } + break :block_idx paragraph_idx; } }; @@ -519,45 +520,10 @@ fn parseColumn( } } -fn parseRestParagraph( - self: *AstGen, - paragraph_idx: Node.Idx, -) !void { - while (self.scanner.peek()) |peek2| { - _, const line2 = peek2; - const line_load4: u32 = @bitCast(line2.ptr._ptr[0..4].*); - const line_load3: u32 = line_load4 & @as(u32, @bitCast("\xff\xff\xff\x00\x00"[0..4].*)); - const line_load2: u32 = line_load4 & @as(u32, @bitCast("\xff\xff\x00\x00\x00"[0..4].*)); - - switch (line2.ptr._ptr[0]) { - // Special block chars / actually empty line - '\n', '-', '.', ':', '+', '>', '#', '@' => break, - // Empty line (only whitespace) - ' ', '\t' => if (line2.len == line2.indexOfNotSpaceOrTab()) break, - // string literals have extra chars so [0..4] doesn't give a sentinel ptr - // Thematic break - '*' => if (line_load3 == - @as(u32, @bitCast("***\x00\x00"[0..4].*)) and - (line2.len == 3 or - line2.len == 3 + line2.sliceOpen(3).indexOfNotSpaceOrTab())) break, - // Verbatim block - '=' => if (line_load2 == - @as(u32, @bitCast("==\x00\x00\x00"[0..4].*))) break, - // Math block - '$' => if (line_load3 == - @as(u32, @bitCast("$==\x00\x00"[0..4].*))) break, - else => {}, - } - - try self.insertTextLine(.space_text, .text, paragraph_idx, line2); - self.scanner.advance(); - } -} - fn insertTextLine( self: *AstGen, - comptime first_text_tag: Node.Tag, - comptime rest_text_tag: Node.Tag, + first_text_tag: Node.Tag, + rest_text_tag: Node.Tag, parent_idx: Node.Idx, line_: PaddedSlice, ) !void {