From 3ccaba310498369344a25999ee32f686675d9134 Mon Sep 17 00:00:00 2001 From: Nulo Date: Mon, 18 Jul 2022 17:13:24 -0300 Subject: [PATCH] parser: Sequencia de cerrada de ATX Heading --- parser.zig | 50 +++++++++++++++++++++++++++++++++++++++++++------- readme.md | 2 +- readme_en.md | 2 +- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/parser.zig b/parser.zig index 7edd7ea..e022e64 100644 --- a/parser.zig +++ b/parser.zig @@ -135,13 +135,14 @@ fn checkIfBlockStillMatches(line: *[]const u8, block: Block) bool { const ATXHeading = struct { spaces: u2, level: u3, + closing_sequence: usize, + closing_sequence_spaces: usize, + pub fn content(self: ATXHeading, line: []const u8) []const u8 { - if (line.len > self.spaces + self.level) { - return line[self.spaces + self.level + 1 ..]; - } else { - // If it's an empty heading without a space (example 79) - return line[self.spaces + self.level ..]; - } + // It's possible it might not have a space after the heading as it can + // be an empty heading. + const has_space: u1 = if (line.len > self.spaces + self.level) 1 else 0; + return line[self.spaces + self.level + has_space .. line.len - self.closing_sequence - self.closing_sequence_spaces]; } }; @@ -165,7 +166,42 @@ fn parseATXHeading(line: []const u8) ?ATXHeading { return null; } if (level == 0) return null; - return ATXHeading{ .level = level, .spaces = spaces }; + var heading = ATXHeading{ + .level = level, + .spaces = spaces, + .closing_sequence = 0, + .closing_sequence_spaces = 0, + }; + closing_sequence_block: { + const rest = heading.content(line); + var closing_sequence: usize = 0; + var closing_sequence_spaces: usize = 0; + if (rest.len == 0) break :closing_sequence_block; + var i: usize = rest.len - 1; + while (i >= 0) : (i -= 1) { + const char = rest[i]; + if (char == ' ') + closing_sequence_spaces += 1 + else if (char == '#') + break + else + break :closing_sequence_block; + if (i == 0) break; + } + while (i >= 0) : (i -= 1) { + const char = rest[i]; + if (char == '#') + closing_sequence += 1 + else if (char == ' ' or char == '\t') + break + else + break :closing_sequence_block; + if (i == 0) break; + } + heading.closing_sequence = closing_sequence; + heading.closing_sequence_spaces = closing_sequence_spaces; + } + return heading; } fn checkIfBlockStarts(allocator: std.mem.Allocator, line: *[]const u8) !?Block { if (std.mem.startsWith(u8, line.*, ">")) { diff --git a/readme.md b/readme.md index 97861e0..0111508 100644 --- a/readme.md +++ b/readme.md @@ -19,7 +19,7 @@ Ver [cli.zig](cli.zig) ## CommonMark -Actualmente: `123 passed, 529 failed, 0 errored, 0 skipped` +Actualmente: `127 passed, 525 failed, 0 errored, 0 skipped` Para correr los tests: diff --git a/readme_en.md b/readme_en.md index 692a343..501d8c6 100644 --- a/readme_en.md +++ b/readme_en.md @@ -17,7 +17,7 @@ See [cli.zig](cli.zig) ## CommonMark -Currently: `114 passed, 538 failed, 0 errored, 0 skipped` +Currently: `127 passed, 525 failed, 0 errored, 0 skipped` To run the tests: