public override StringBuffer Render(IMarkdownRenderer render, MarkdownTableBlockToken token, MarkdownBlockContext context) { const int SpaceCount = 2; var rowCount = token.Cells.Length + 2; var columnCount = token.Header.Length; var maxLengths = new int[columnCount]; var matrix = new StringBuffer[rowCount, columnCount]; for (var column = 0; column < columnCount; column++) { var header = token.Header[column]; var content = RenderInlineTokens(header.Content.Tokens, render); matrix[0, column] = content; maxLengths[column] = Math.Max(1, content.GetLength()) + SpaceCount; } for (var row = 0; row < token.Cells.Length; row++) { var cell = token.Cells[row]; for (var column = 0; column < columnCount; column++) { var item = cell[column]; var content = RenderInlineTokens(item.Content.Tokens, render); matrix[row + 2, column] = content; maxLengths[column] = Math.Max(maxLengths[column], content.GetLength() + SpaceCount); } } for (var column = 0; column < columnCount; column++) { var align = token.Align[column]; switch (align) { case Align.NotSpec: matrix[1, column] = "---"; break; case Align.Left: matrix[1, column] = ":--"; break; case Align.Right: matrix[1, column] = "--:"; break; case Align.Center: matrix[1, column] = ":-:"; break; default: throw new NotSupportedException($"align:{align} doesn't support in GFM table"); } } return(BuildTable(matrix, maxLengths, rowCount, columnCount)); }
private StringBuffer BuildRowExtension(IMarkdownRenderer render, MarkdownTableBlockToken token) { var result = StringBuffer.Empty; const int SpaceCount = 4; var columnCount = token.Header.Length; //Heading result += ":::row:::" + NewLine; for (var column = 0; column < columnCount; column++) { var header = token.Header[column]; result += new string(' ', SpaceCount) + ":::column:::" + NewLine; result += AddIndentForEachLine(new string(' ', SpaceCount * 2), RenderInlineTokens(header.Content.Tokens, render)) + NewLine; result += new string(' ', SpaceCount) + ":::column-end:::" + NewLine; } result += ":::row-end:::" + NewLine; result += "* * *" + NewLine; //Body for (var row = 0; row < token.Cells.Length; row++) { var cells = token.Cells[row]; result += ":::row:::" + NewLine; for (var column = 0; column < cells.Count(); column++) { var cell = cells[column]; result += new string(' ', SpaceCount) + ":::column:::" + NewLine; result += AddIndentForEachLine(new string(' ', SpaceCount * 2), RenderInlineTokens(cell.Content.Tokens, render)) + NewLine; result += new string(' ', SpaceCount) + ":::column-end:::" + NewLine; } result += ":::row-end:::" + NewLine; if (row != token.Cells.Length - 1) { result += "* * *" + NewLine; } } var markdown = token.SourceInfo.Markdown; var newLineCount = Helper.CountEndNewLine(markdown); if (newLineCount >= 2) { return(result += NewLine); } return(result); }
public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownTableBlockToken token, MarkdownBlockContext context) { var content = StringBuffer.Empty; // Header var headerContent = StringBuffer.Empty; for (int i = 0; i < token.Header.Length; i++) { var childContent = StringBuffer.Empty; foreach (var item in token.Header[i].Content.Tokens) { childContent += renderer.Render(item); } headerContent += Insert(token.Header[i], "headerItem", childContent); } content += Insert(token.SourceInfo.LineNumber, token.SourceInfo.LineNumber, "Header", headerContent); // Body var bodyContent = StringBuffer.Empty; for (int i = 0; i < token.Cells.Length; i++) { var rowContent = StringBuffer.Empty; var row = token.Cells[i]; for (int j = 0; j < row.Length; j++) { var childContent = StringBuffer.Empty; foreach (var item in row[j].Content.Tokens) { childContent += renderer.Render(item); } rowContent += Insert(row[j], "RowItem", childContent); } bodyContent += Insert(row[0], "Row", rowContent); } content += Insert(token.Cells[0][0].SourceInfo.LineNumber, token.Cells[token.Cells.Length - 1][0].SourceInfo.LineNumber, "Body", bodyContent); return(Insert(token, ExposeTokenName(token), content)); }
private bool NeedMigrationTable(MarkdownTableBlockToken token) { var markdown = token.SourceInfo.Markdown; if (_processedBlockTokens != null && _processedBlockTokens.Count > 0) { var preToken = _processedBlockTokens.Peek(); var preTokenNewLinecount = Helper.CountEndNewLine(preToken.SourceInfo.Markdown); if (!(preToken is MarkdownNewLineBlockToken) && preTokenNewLinecount < 2) { return(true); } } var newLineCount = Helper.CountEndNewLine(markdown); if (markdown.Split('\n').Count() + token.SourceInfo.LineNumber - 1 < _totalLines && newLineCount < 2) { return(true); } return(false); }
public override StringBuffer Render(IMarkdownRenderer render, MarkdownTableBlockToken token, MarkdownBlockContext context) { if (IsTableContainCodesnippet(token)) { return(BuildRowExtension(render, token)); } var markdown = token.SourceInfo.Markdown; var newLineCount = Helper.CountEndNewLine(markdown); if (CompareMarkupResult("\n" + markdown) && newLineCount >= 2) { return("\n" + markdown); } const int SpaceCount = 2; var rowCount = token.Cells.Length + 2; var columnCount = token.Header.Length; var maxLengths = new int[columnCount]; var matrix = new StringBuffer[rowCount, columnCount]; for (var column = 0; column < columnCount; column++) { var header = token.Header[column]; var content = RenderInlineTokens(header.Content.Tokens, render, true); matrix[0, column] = content; maxLengths[column] = Math.Max(1, content.GetLength()) + SpaceCount; } for (var row = 0; row < token.Cells.Length; row++) { var cell = token.Cells[row]; for (var column = 0; column < columnCount; column++) { var item = cell[column]; var content = RenderInlineTokens(item.Content.Tokens, render, true); matrix[row + 2, column] = content; maxLengths[column] = Math.Max(maxLengths[column], content.GetLength() + SpaceCount); } } for (var column = 0; column < columnCount; column++) { var align = token.Align[column]; switch (align) { case Align.NotSpec: matrix[1, column] = "---"; break; case Align.Left: matrix[1, column] = ":--"; break; case Align.Right: matrix[1, column] = "--:"; break; case Align.Center: matrix[1, column] = ":-:"; break; default: throw new NotSupportedException($"align:{align} doesn't support in GFM table"); } } var result = BuildTable(matrix, maxLengths, rowCount, columnCount); if (_processedBlockTokens != null && _processedBlockTokens.Count > 0) { var preToken = _processedBlockTokens.Peek(); var preTokenNewLinecount = Helper.CountEndNewLine(preToken.SourceInfo.Markdown); if (preTokenNewLinecount < 2) { return('\n' + result); } } return(result); }
private bool IsTableContainCodesnippet(MarkdownTableBlockToken token) { return(token.Cells.Any(c => c.Any(item => item.Content.Tokens.Any(t => t is DfmFencesBlockToken)))); }
public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownTableBlockToken token, MarkdownBlockContext context) { var content = StringBuffer.Empty; // Header var headerContent = StringBuffer.Empty; for (int i = 0; i < token.Header.Length; i++) { var childContent = StringBuffer.Empty; foreach (var item in token.Header[i].Content.Tokens) { childContent += renderer.Render(item); } headerContent += Insert(token.Header[i], "headerItem", childContent); } content += Insert(token.SourceInfo.LineNumber, token.SourceInfo.LineNumber, "Header", headerContent); // Body var bodyContent = StringBuffer.Empty; for (int i = 0; i < token.Cells.Length; i++) { var rowContent = StringBuffer.Empty; var row = token.Cells[i]; for (int j = 0; j < row.Length; j++) { var childContent = StringBuffer.Empty; foreach (var item in row[j].Content.Tokens) { childContent += renderer.Render(item); } rowContent += Insert(row[j], "RowItem", childContent); } bodyContent += Insert(row[0], "Row", rowContent); } content += Insert(token.Cells[0][0].SourceInfo.LineNumber, token.Cells[token.Cells.Length - 1][0].SourceInfo.LineNumber, "Body", bodyContent); return Insert(token, ExposeTokenName(token), content); }