@@ -481,9 +481,10 @@ public bool PostProcess(InlineProcessor state, Inline? root, Inline? lastChild,
481481 return false ;
482482 }
483483
484- private static bool ParseHeaderString ( Inline ? inline , out TableColumnAlign ? align )
484+ private static bool ParseHeaderString ( Inline ? inline , out TableColumnAlign ? align , out int delimiterCount )
485485 {
486486 align = 0 ;
487+ delimiterCount = 0 ;
487488 var literal = inline as LiteralInline ;
488489 if ( literal is null )
489490 {
@@ -492,7 +493,7 @@ private static bool ParseHeaderString(Inline? inline, out TableColumnAlign? alig
492493
493494 // Work on a copy of the slice
494495 var line = literal . Content ;
495- if ( TableHelper . ParseColumnHeader ( ref line , '-' , out align ) )
496+ if ( TableHelper . ParseColumnHeader ( ref line , '-' , out align , out delimiterCount ) )
496497 {
497498 if ( line . CurrentChar != '\0 ' )
498499 {
@@ -507,7 +508,8 @@ private static bool ParseHeaderString(Inline? inline, out TableColumnAlign? alig
507508 private List < TableColumnDefinition > ? FindHeaderRow ( List < Inline > delimiters )
508509 {
509510 bool isValidRow = false ;
510- List < TableColumnDefinition > ? aligns = null ;
511+ int totalDelimiterCount = 0 ;
512+ List < TableColumnDefinition > ? columnDefinitions = null ;
511513 for ( int i = 0 ; i < delimiters . Count ; i ++ )
512514 {
513515 if ( ! IsLine ( delimiters [ i ] ) )
@@ -529,18 +531,19 @@ private static bool ParseHeaderString(Inline? inline, out TableColumnAlign? alig
529531
530532 // Check the left side of a `|` delimiter
531533 TableColumnAlign ? align = null ;
534+ int delimiterCount = 0 ;
532535 if ( delimiter . PreviousSibling != null &&
533536 ! ( delimiter . PreviousSibling is LiteralInline li && li . Content . IsEmptyOrWhitespace ( ) ) && // ignore parsed whitespace
534- ! ParseHeaderString ( delimiter . PreviousSibling , out align ) )
537+ ! ParseHeaderString ( delimiter . PreviousSibling , out align , out delimiterCount ) )
535538 {
536539 break ;
537540 }
538541
539542 // Create aligns until we may have a header row
540543
541- aligns ??= new List < TableColumnDefinition > ( ) ;
542-
543- aligns . Add ( new TableColumnDefinition ( ) { Alignment = align } ) ;
544+ columnDefinitions ??= new List < TableColumnDefinition > ( ) ;
545+ totalDelimiterCount += delimiterCount ;
546+ columnDefinitions . Add ( new TableColumnDefinition ( ) { Alignment = align , Width = delimiterCount } ) ;
544547
545548 // If this is the last delimiter, we need to check the right side of the `|` delimiter
546549 if ( nextDelimiter is null )
@@ -556,13 +559,13 @@ private static bool ParseHeaderString(Inline? inline, out TableColumnAlign? alig
556559 break ;
557560 }
558561
559- if ( ! ParseHeaderString ( nextSibling , out align ) )
562+ if ( ! ParseHeaderString ( nextSibling , out align , out delimiterCount ) )
560563 {
561564 break ;
562565 }
563-
566+ totalDelimiterCount += delimiterCount ;
564567 isValidRow = true ;
565- aligns . Add ( new TableColumnDefinition ( ) { Alignment = align } ) ;
568+ columnDefinitions . Add ( new TableColumnDefinition ( ) { Alignment = align , Width = delimiterCount } ) ;
566569 break ;
567570 }
568571
@@ -576,7 +579,27 @@ private static bool ParseHeaderString(Inline? inline, out TableColumnAlign? alig
576579 break ;
577580 }
578581
579- return isValidRow ? aligns : null ;
582+ // calculate the width of the columns in percent based on the delimiter count
583+ if ( ! isValidRow || columnDefinitions == null )
584+ {
585+ return null ;
586+ }
587+
588+ if ( Options . InferColumnWidthsFromSeparator )
589+ {
590+ foreach ( var columnDefinition in columnDefinitions )
591+ {
592+ columnDefinition . Width = ( columnDefinition . Width * 100 ) / totalDelimiterCount ;
593+ }
594+ }
595+ else
596+ {
597+ foreach ( var columnDefinition in columnDefinitions )
598+ {
599+ columnDefinition . Width = 0 ;
600+ }
601+ }
602+ return columnDefinitions ;
580603 }
581604
582605 private static bool IsLine ( Inline inline )
0 commit comments