Пример #1
0
 private static void StartColumn(MarkdownProcessorContext context, int index, int last, bool useEdgePipe, bool padBeforePipe, bool padAfterPipe)
 {
     if (index > 0 && padBeforePipe)
     {
         context.WriteSpace();
     }
     if (index > 0 || useEdgePipe)
     {
         context.WritePipe();
     }
     if (padAfterPipe && useEdgePipe || index > 0 && padAfterPipe)
     {
         context.WriteSpace();
     }
 }
Пример #2
0
        private static void Table(MarkdownProcessorContext context, Table table)
        {
            if (table.Headers == null || table.Headers.Count == 0)
            {
                return;
            }

            var lastHeader  = table.Headers.Count - 1;
            var useEdgePipe = context.Option.Markdown.UseEdgePipes == EdgePipeOption.Always ||
                              table.Headers.Count == 1;
            var padColumn = context.Option.Markdown.ColumnPadding == ColumnPadding.Single ||
                            context.Option.Markdown.ColumnPadding == ColumnPadding.MatchHeader;

            // Write table headers
            for (var i = 0; i < table.Headers.Count; i++)
            {
                StartColumn(context, i, lastHeader, useEdgePipe, padColumn, padColumn);

                context.Write(table.Headers[i].Label);

                if (i < lastHeader)
                {
                    var padding = 0;

                    // Pad column
                    if (table.Headers[i].Width > 0 && (table.Headers[i].Width - table.Headers[i].Label.Length) > 0)
                    {
                        padding = table.Headers[i].Width - table.Headers[i].Label.Length;
                    }
                    context.WriteSpace(padding);
                }
            }

            if (padColumn && useEdgePipe)
            {
                context.WriteSpace();
            }

            context.WriteLine(useEdgePipe ? "|" : string.Empty);

            // Write table header separator
            for (var i = 0; i < table.Headers.Count; i++)
            {
                StartColumn(context, i, lastHeader, useEdgePipe, padColumn, padColumn);

                switch (table.Headers[i].Alignment)
                {
                case Alignment.Left:
                    context.Write(":");
                    context.Write('-', table.Headers[i].Label.Length - 1);
                    break;

                case Alignment.Right:
                    context.Write('-', table.Headers[i].Label.Length - 1);
                    context.Write(":");
                    break;

                case Alignment.Center:
                    context.Write(":");
                    context.Write('-', table.Headers[i].Label.Length - 2);
                    context.Write(":");
                    break;

                default:
                    context.Write('-', table.Headers[i].Label.Length);
                    break;
                }

                if (i < lastHeader)
                {
                    var padding = 0;

                    // Pad column
                    if (table.Headers[i].Width > 0 && (table.Headers[i].Width - table.Headers[i].Label.Length) > 0)
                    {
                        padding = table.Headers[i].Width - table.Headers[i].Label.Length;
                    }

                    context.WriteSpace(padding);
                }
            }

            if (padColumn && useEdgePipe)
            {
                context.WriteSpace();
            }

            context.WriteLine(useEdgePipe ? "|" : string.Empty);

            // Write table rows
            for (var r = 0; r < table.Rows.Count; r++)
            {
                for (var c = 0; c < table.Rows[r].Length; c++)
                {
                    var text = WrapText(context, table.Rows[r][c]);

                    StartColumn(context, c, lastHeader, useEdgePipe, padBeforePipe: padColumn, padAfterPipe: padColumn && (c < lastHeader || !string.IsNullOrEmpty(text)));

                    context.Write(text);

                    if (c < lastHeader)
                    {
                        var padding = 0;

                        // Pad column using column width
                        if (table.Headers[c].Width > 0 && (table.Headers[c].Width - text.Length) > 0)
                        {
                            padding = table.Headers[c].Width - text.Length;
                        }
                        // Pad column matching header
                        else if (context.Option.Markdown.ColumnPadding == ColumnPadding.MatchHeader)
                        {
                            if ((table.Headers[c].Label.Length - text.Length) > 0)
                            {
                                padding = table.Headers[c].Label.Length - text.Length;
                            }
                        }

                        context.WriteSpace(padding);
                    }
                }

                if (padColumn && useEdgePipe)
                {
                    context.WriteSpace();
                }

                context.WriteLine(useEdgePipe ? "|" : string.Empty);
            }
            context.LineBreak();
        }