@@ -29,13 +29,14 @@ const Node = Document.Node;
29
29
const ExtraIndex = Document .ExtraIndex ;
30
30
const ExtraData = Document .ExtraData ;
31
31
const StringIndex = Document .StringIndex ;
32
+ const ArrayList = std .ArrayListUnmanaged ;
32
33
33
34
nodes : Node.List = .{},
34
- extra : std . ArrayListUnmanaged (u32 ) = .empty ,
35
- scratch_extra : std . ArrayListUnmanaged (u32 ) = .empty ,
36
- string_bytes : std . ArrayListUnmanaged (u8 ) = .empty ,
37
- scratch_string : std . ArrayListUnmanaged (u8 ) = .empty ,
38
- pending_blocks : std . ArrayListUnmanaged (Block ) = .empty ,
35
+ extra : ArrayList (u32 ) = .empty ,
36
+ scratch_extra : ArrayList (u32 ) = .empty ,
37
+ string_bytes : ArrayList (u8 ) = .empty ,
38
+ scratch_string : ArrayList (u8 ) = .empty ,
39
+ pending_blocks : ArrayList (Block ) = .empty ,
39
40
allocator : Allocator ,
40
41
41
42
const Parser = @This ();
@@ -86,7 +87,8 @@ const Block = struct {
86
87
continuation_indent : usize ,
87
88
},
88
89
table : struct {
89
- column_alignments : std .BoundedArray (Node.TableCellAlignment , max_table_columns ) = .{},
90
+ column_alignments_buffer : [max_table_columns ]Node.TableCellAlignment ,
91
+ column_alignments_len : usize ,
90
92
},
91
93
heading : struct {
92
94
/// Between 1 and 6, inclusive.
@@ -354,7 +356,8 @@ const BlockStart = struct {
354
356
continuation_indent : usize ,
355
357
},
356
358
table_row : struct {
357
- cells : std .BoundedArray ([]const u8 , max_table_columns ),
359
+ cells_buffer : [max_table_columns ][]const u8 ,
360
+ cells_len : usize ,
358
361
},
359
362
heading : struct {
360
363
/// Between 1 and 6, inclusive.
@@ -422,7 +425,8 @@ fn appendBlockStart(p: *Parser, block_start: BlockStart) !void {
422
425
try p .pending_blocks .append (p .allocator , .{
423
426
.tag = .table ,
424
427
.data = .{ .table = .{
425
- .column_alignments = .{},
428
+ .column_alignments_buffer = undefined ,
429
+ .column_alignments_len = 0 ,
426
430
} },
427
431
.string_start = p .scratch_string .items .len ,
428
432
.extra_start = p .scratch_extra .items .len ,
@@ -431,15 +435,19 @@ fn appendBlockStart(p: *Parser, block_start: BlockStart) !void {
431
435
432
436
const current_row = p .scratch_extra .items .len - p .pending_blocks .getLast ().extra_start ;
433
437
if (current_row <= 1 ) {
434
- if (parseTableHeaderDelimiter (block_start .data .table_row .cells )) | alignments | {
435
- p .pending_blocks .items [p .pending_blocks .items .len - 1 ].data .table .column_alignments = alignments ;
438
+ var buffer : [max_table_columns ]Node.TableCellAlignment = undefined ;
439
+ const table_row = & block_start .data .table_row ;
440
+ if (parseTableHeaderDelimiter (table_row .cells_buffer [0.. table_row .cells_len ], & buffer )) | alignments | {
441
+ const table = & p .pending_blocks .items [p .pending_blocks .items .len - 1 ].data .table ;
442
+ @memcpy (table .column_alignments_buffer [0.. alignments .len ], alignments );
443
+ table .column_alignments_len = alignments .len ;
436
444
if (current_row == 1 ) {
437
445
// We need to go back and mark the header row and its column
438
446
// alignments.
439
447
const datas = p .nodes .items (.data );
440
448
const header_data = datas [p .scratch_extra .getLast ()];
441
449
for (p .extraChildren (header_data .container .children ), 0.. ) | header_cell , i | {
442
- const alignment = if (i < alignments .len ) alignments . buffer [i ] else .unset ;
450
+ const alignment = if (i < alignments .len ) alignments [i ] else .unset ;
443
451
const cell_data = & datas [@intFromEnum (header_cell )].table_cell ;
444
452
cell_data .info .alignment = alignment ;
445
453
cell_data .info .header = true ;
@@ -480,8 +488,10 @@ fn appendBlockStart(p: *Parser, block_start: BlockStart) !void {
480
488
// available in the BlockStart. We can immediately parse and append
481
489
// these children now.
482
490
const containing_table = p .pending_blocks .items [p .pending_blocks .items .len - 2 ];
483
- const column_alignments = containing_table .data .table .column_alignments .slice ();
484
- for (block_start .data .table_row .cells .slice (), 0.. ) | cell_content , i | {
491
+ const table = & containing_table .data .table ;
492
+ const column_alignments = table .column_alignments_buffer [0.. table .column_alignments_len ];
493
+ const table_row = & block_start .data .table_row ;
494
+ for (table_row .cells_buffer [0.. table_row .cells_len ], 0.. ) | cell_content , i | {
485
495
const cell_children = try p .parseInlines (cell_content );
486
496
const alignment = if (i < column_alignments .len ) column_alignments [i ] else .unset ;
487
497
const cell = try p .addNode (.{
@@ -523,7 +533,8 @@ fn startBlock(p: *Parser, line: []const u8) !?BlockStart {
523
533
return .{
524
534
.tag = .table_row ,
525
535
.data = .{ .table_row = .{
526
- .cells = table_row .cells ,
536
+ .cells_buffer = table_row .cells_buffer ,
537
+ .cells_len = table_row .cells_len ,
527
538
} },
528
539
.rest = "" ,
529
540
};
@@ -606,7 +617,8 @@ fn startListItem(unindented_line: []const u8) ?ListItemStart {
606
617
}
607
618
608
619
const TableRowStart = struct {
609
- cells : std .BoundedArray ([]const u8 , max_table_columns ),
620
+ cells_buffer : [max_table_columns ][]const u8 ,
621
+ cells_len : usize ,
610
622
};
611
623
612
624
fn startTableRow (unindented_line : []const u8 ) ? TableRowStart {
@@ -615,15 +627,16 @@ fn startTableRow(unindented_line: []const u8) ?TableRowStart {
615
627
mem .endsWith (u8 , unindented_line , "\\ |" ) or
616
628
! mem .endsWith (u8 , unindented_line , "|" )) return null ;
617
629
618
- var cells : std .BoundedArray ([]const u8 , max_table_columns ) = .{};
630
+ var cells_buffer : [max_table_columns ][]const u8 = undefined ;
631
+ var cells : ArrayList ([]const u8 ) = .initBuffer (& cells_buffer );
619
632
const table_row_content = unindented_line [1 .. unindented_line .len - 1 ];
620
633
var cell_start : usize = 0 ;
621
634
var i : usize = 0 ;
622
635
while (i < table_row_content .len ) : (i += 1 ) {
623
636
switch (table_row_content [i ]) {
624
637
'\\ ' = > i += 1 ,
625
638
'|' = > {
626
- cells .append (table_row_content [cell_start .. i ]) catch return null ;
639
+ cells .appendBounded (table_row_content [cell_start .. i ]) catch return null ;
627
640
cell_start = i + 1 ;
628
641
},
629
642
'`' = > {
@@ -641,20 +654,21 @@ fn startTableRow(unindented_line: []const u8) ?TableRowStart {
641
654
else = > {},
642
655
}
643
656
}
644
- cells .append (table_row_content [cell_start .. ]) catch return null ;
657
+ cells .appendBounded (table_row_content [cell_start .. ]) catch return null ;
645
658
646
- return .{ .cells = cells };
659
+ return .{ .cells_buffer = cells_buffer , . cells_len = cells . items . len };
647
660
}
648
661
649
662
fn parseTableHeaderDelimiter (
650
- row_cells : std .BoundedArray ([]const u8 , max_table_columns ),
651
- ) ? std .BoundedArray (Node .TableCellAlignment , max_table_columns ) {
652
- var alignments : std .BoundedArray (Node.TableCellAlignment , max_table_columns ) = .{};
653
- for (row_cells .slice ()) | content | {
663
+ row_cells : []const []const u8 ,
664
+ buffer : []Node.TableCellAlignment ,
665
+ ) ? []Node.TableCellAlignment {
666
+ var alignments : ArrayList (Node .TableCellAlignment ) = .initBuffer (buffer );
667
+ for (row_cells ) | content | {
654
668
const alignment = parseTableHeaderDelimiterCell (content ) orelse return null ;
655
669
alignments .appendAssumeCapacity (alignment );
656
670
}
657
- return alignments ;
671
+ return alignments . items ;
658
672
}
659
673
660
674
fn parseTableHeaderDelimiterCell (content : []const u8 ) ? Node.TableCellAlignment {
@@ -928,8 +942,8 @@ const InlineParser = struct {
928
942
parent : * Parser ,
929
943
content : []const u8 ,
930
944
pos : usize = 0 ,
931
- pending_inlines : std . ArrayListUnmanaged (PendingInline ) = .empty ,
932
- completed_inlines : std . ArrayListUnmanaged (CompletedInline ) = .empty ,
945
+ pending_inlines : ArrayList (PendingInline ) = .empty ,
946
+ completed_inlines : ArrayList (CompletedInline ) = .empty ,
933
947
934
948
const PendingInline = struct {
935
949
tag : Tag ,
0 commit comments