Skip to content

Commit

Permalink
Improve writing of table.
Browse files Browse the repository at this point in the history
  • Loading branch information
josefpihrt committed Jul 3, 2018
1 parent 44b47f9 commit c479490
Show file tree
Hide file tree
Showing 2 changed files with 265 additions and 16 deletions.
55 changes: 39 additions & 16 deletions src/DotMarkdown/MarkdownBaseWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;

namespace DotMarkdown
Expand All @@ -15,7 +14,7 @@ internal abstract class MarkdownBaseWriter : MarkdownWriter

private int _headingLevel = -1;

private IReadOnlyList<TableColumnInfo> _tableColumns;
private List<TableColumnInfo> _tableColumns;
private int _tableColumnCount = -1;
private int _tableRowIndex = -1;
private int _tableColumnIndex = -1;
Expand Down Expand Up @@ -74,14 +73,12 @@ public override WriteState WriteState

protected char EscapingChar { get; set; } = '\\';

private TableColumnInfo CurrentColumn => _tableColumns?[_tableColumnIndex] ?? TableColumnInfo.Default;

private int ColumnCount => _tableColumns?.Count ?? _tableColumnCount;

private bool IsLastColumn => _tableColumnIndex == ColumnCount - 1;
private TableColumnInfo CurrentColumn => _tableColumns[_tableColumnIndex];

private bool IsFirstColumn => _tableColumnIndex == 0;

private bool IsLastColumn => _tableColumnIndex == _tableColumnCount - 1;

private void Push(State state, int orderedItemNumber = 0)
{
if (_state == State.Closed)
Expand Down Expand Up @@ -788,13 +785,30 @@ public override void WriteStartTable(IReadOnlyList<TableColumnInfo> columns)

private void WriteStartTable(IReadOnlyList<TableColumnInfo> columns, int columnCount)
{
if (columnCount <= 0)
throw new ArgumentOutOfRangeException(nameof(columnCount), columnCount, "Table must have at least one column.");

try
{
Push(State.Table);

WriteLine(Format.EmptyLineBeforeTable);

_tableColumns = columns;
if (_tableColumns == null)
_tableColumns = new List<TableColumnInfo>(columnCount);

if (columns != null)
{
_tableColumns.AddRange(columns);
}
else
{
for (int i = 0; i < columnCount; i++)
{
_tableColumns.Add(new TableColumnInfo(HorizontalAlignment.Left, width: 0, isWhiteSpace: true));
}
}

_tableColumnCount = columnCount;
}
catch
Expand All @@ -810,7 +824,7 @@ public override void WriteEndTable()
{
ThrowIfCannotWriteEnd(State.Table);
_tableRowIndex = -1;
_tableColumns = null;
_tableColumns.Clear();
_tableColumnCount = -1;
WriteEmptyLineIf(Format.EmptyLineAfterTable);
Pop(State.Table);
Expand Down Expand Up @@ -872,7 +886,7 @@ public override void WriteStartTableCell()
if (IsFirstColumn)
{
if (Format.TableOuterDelimiter
|| IsLastColumn
|| _tableColumnCount == 1
|| CurrentColumn.IsWhiteSpace)
{
WriteTableColumnSeparator();
Expand Down Expand Up @@ -915,26 +929,35 @@ public override void WriteEndTableCell()
{
ThrowIfCannotWriteEnd(State.TableCell);

int width = Length - _tableCellPos;

TableColumnInfo currentColumn = CurrentColumn;

if (currentColumn.Width == 0
&& width > 0)
{
_tableColumns[_tableColumnIndex] = currentColumn.WithWidth(width);
}

if (Format.TableOuterDelimiter
|| !IsLastColumn)
{
if (_tableRowIndex == 0)
{
if (Format.FormatTableHeader)
WritePadRight(Length - _tableCellPos);
WritePadRight(width);
}
else if (Format.FormatTableContent)
{
WritePadRight(Length - _tableCellPos);
WritePadRight(width);
}
}

if (_tableRowIndex == 0)
{
if (Format.TablePadding)
{
if (!CurrentColumn.IsWhiteSpace)
WriteRaw(" ");
WriteRaw(" ");
}
else if (Format.FormatTableHeader
&& CurrentColumn.Alignment != HorizontalAlignment.Left)
Expand All @@ -944,7 +967,7 @@ public override void WriteEndTableCell()
}
else if (Format.TablePadding)
{
if (Length - _tableCellPos > 0)
if (width > 0)
WriteRaw(" ");
}

Expand All @@ -966,7 +989,7 @@ public override void WriteTableHeaderSeparator()

WriteStartTableRow();

int count = ColumnCount;
int count = _tableColumnCount;

for (int i = 0; i < count; i++)
{
Expand Down
226 changes: 226 additions & 0 deletions src/Tests/MarkdownWriterTableTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
// Copyright (c) Josef Pihrt. All rights reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.Text;
using Xunit;

namespace DotMarkdown.Tests
{
public static class MarkdownWriterTableTests
{
[Fact]
public static void TestTableHeaderWithSingleCharacter()
{
using (MarkdownWriter mw = MarkdownWriter.Create(new StringBuilder()))
{
mw.WriteLine();

mw.WriteStartTable(3);

mw.WriteStartTableRow();

mw.WriteStartTableCell();
mw.WriteString(" ");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("a");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("b");
mw.WriteEndTableCell();

mw.WriteEndTableRow();

mw.WriteTableHeaderSeparator();

mw.WriteStartTableRow();

mw.WriteStartTableCell();
mw.WriteString(" ");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("c");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("d");
mw.WriteEndTableCell();

mw.WriteEndTableRow();

mw.WriteEndTable();

Assert.Equal(@"
| | a | b |
| --- | --- | --- |
| | c | d |
", mw.ToString());
}
}

[Fact]
public static void TestTableHeaderWithTwoCharacter()
{
using (MarkdownWriter mw = MarkdownWriter.Create(new StringBuilder()))
{
mw.WriteLine();

mw.WriteStartTable(3);

mw.WriteStartTableRow();

mw.WriteStartTableCell();
mw.WriteString(" ");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("aa");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("bb");
mw.WriteEndTableCell();

mw.WriteEndTableRow();

mw.WriteTableHeaderSeparator();

mw.WriteStartTableRow();

mw.WriteStartTableCell();
mw.WriteString(" ");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("c");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("d");
mw.WriteEndTableCell();

mw.WriteEndTableRow();

mw.WriteEndTable();

Assert.Equal(@"
| | aa | bb |
| --- | --- | --- |
| | c | d |
", mw.ToString());
}
}

[Fact]
public static void TestTableHeaderWithThreeCharacter()
{
using (MarkdownWriter mw = MarkdownWriter.Create(new StringBuilder()))
{
mw.WriteLine();

mw.WriteStartTable(3);

mw.WriteStartTableRow();

mw.WriteStartTableCell();
mw.WriteString(" ");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("aaa");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("bbb");
mw.WriteEndTableCell();

mw.WriteEndTableRow();

mw.WriteTableHeaderSeparator();

mw.WriteStartTableRow();

mw.WriteStartTableCell();
mw.WriteString(" ");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("c");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("d");
mw.WriteEndTableCell();

mw.WriteEndTableRow();

mw.WriteEndTable();

Assert.Equal(@"
| | aaa | bbb |
| --- | --- | --- |
| | c | d |
", mw.ToString());
}
}

[Fact]
public static void TestTableHeaderWithFourCharacter()
{
using (MarkdownWriter mw = MarkdownWriter.Create(new StringBuilder()))
{
mw.WriteLine();

mw.WriteStartTable(3);

mw.WriteStartTableRow();

mw.WriteStartTableCell();
mw.WriteString(" ");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("aaaa");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("bbbb");
mw.WriteEndTableCell();

mw.WriteEndTableRow();

mw.WriteTableHeaderSeparator();

mw.WriteStartTableRow();

mw.WriteStartTableCell();
mw.WriteString(" ");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("c");
mw.WriteEndTableCell();

mw.WriteStartTableCell();
mw.WriteString("d");
mw.WriteEndTableCell();

mw.WriteEndTableRow();

mw.WriteEndTable();

Assert.Equal(@"
| | aaaa | bbbb |
| ---- | ---- | ---- |
| | c | d |
", mw.ToString());
}
}
}
}

0 comments on commit c479490

Please sign in to comment.