Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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))));
 }
Esempio n. 7
0
        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);
        }