Esempio n. 1
0
        public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownListBlockToken token, MarkdownBlockContext context)
        {
            const string ListStartString = "* ";
            var content = StringBuffer.Empty;

            if (token.Ordered)
            {
                foreach (var t in token.Tokens)
                {
                    var listItemToken = t as MarkdownListItemBlockToken;
                    if (listItemToken == null)
                    {
                        throw new Exception($"token {t.GetType()} is not MarkdownListItemBlockToken in MarkdownListBlockToken. Token raw:{t.RawMarkdown}");
                    }
                    content += ListStartString;
                    content += render.Render(t);
                }
            }
            else
            {
                for (int i = 1; i < token.Tokens.Length; ++i)
                {
                    var listItemToken = token.Tokens[i] as MarkdownListItemBlockToken;

                    if (listItemToken == null)
                    {
                        throw new Exception($"token {token.Tokens[i].GetType()} is not MarkdownListItemBlockToken in MarkdownListBlockToken. Token raw:{token.Tokens[i].RawMarkdown}");
                    }

                    content += i.ToString();
                    content += ". ";
                }
            }
            return content;
        }
Esempio n. 2
0
        public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownBlockquoteBlockToken token, MarkdownBlockContext context)
        {
            const string BlockQuoteStartString = "> ";
            const string BlockQuoteJoinString = "\n" + BlockQuoteStartString;

            var content = StringBuffer.Empty;
            foreach (var t in token.Tokens)
            {
                content += render.Render(t);
            }
            var contents = content.ToString().Split('\n');
            content = StringBuffer.Empty;
            foreach (var item in contents)
            {
                if (content == StringBuffer.Empty)
                {
                    content += BlockQuoteStartString;
                    content += item;
                }
                else
                {
                    content += BlockQuoteJoinString;
                    content += item;
                }
            }
            return content;
        }
Esempio n. 3
0
 public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownHtmlBlockToken token, MarkdownBlockContext context)
 {
     StringBuffer content = StringBuffer.Empty;
     foreach(var t in token.Content.Tokens)
     {
         content += render.Render(t);
     }
     return content;
 }
Esempio n. 4
0
 public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownBlockquoteBlockToken token, MarkdownBlockContext context)
 {
     StringBuffer content = "<blockquote>\n";
     foreach (var item in token.Tokens)
     {
         content += renderer.Render(item);
     }
     return content + "</blockquote>\n";
 }
Esempio n. 5
0
 protected virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownListItemBlockToken token)
 {
     var childContent = StringBuffer.Empty;
     foreach (var item in token.Tokens)
     {
         childContent += renderer.Render(item);
     }
     return Insert(token, ExposeTokenName(token), childContent);
 }
Esempio n. 6
0
 private StringBuffer RenderAzureIncludeToken(IMarkdownRenderer render, AzureIncludeBasicToken token, IMarkdownContext context)
 {
     StringBuffer content = StringBuffer.Empty;
     foreach(var t in token.Tokens)
     {
         content += render.Render(t);
     }
     return content;
 }
Esempio n. 7
0
 public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmXrefInlineToken token, MarkdownInlineContext context)
 {
     var childContent = StringBuffer.Empty;
     foreach (var item in token.Content)
     {
         childContent += renderer.Render(item);
     }
     return Insert(token, $"{ExposeTokenNameInDfm(token)}>{Escape(token.Href)}", childContent);
 }
Esempio n. 8
0
 public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownHtmlBlockToken token, MarkdownBlockContext context)
 {
     var childContent = StringBuffer.Empty;
     foreach (var item in token.Content.Tokens)
     {
         childContent += renderer.Render(item);
     }
     return Insert(token, ExposeTokenName(token), childContent);
 }
Esempio n. 9
0
 public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownParagraphBlockToken token, MarkdownBlockContext context)
 {
     var content = StringBuffer.Empty;
     foreach (var t in token.InlineTokens.Tokens)
     {
         content += render.Render(t);
     }
     return content + "\n\n";
 }
Esempio n. 10
0
 public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownHeadingBlockToken token, MarkdownBlockContext context)
 {
     string level = token.Depth.ToString();
     var childContent = StringBuffer.Empty;
     foreach (var item in token.Content.Tokens)
     {
         childContent += renderer.Render(item);
     }
     return Insert(token, $"{ExposeTokenName(token)}{level}", childContent);
 }
Esempio n. 11
0
        public override StringBuffer Render(IMarkdownRenderer renderer, MarkdownBlockquoteBlockToken token, MarkdownBlockContext context)
        {
            StringBuffer content = StringBuffer.Empty;
            var splitTokens = DfmBlockquoteHelper.SplitBlockquoteTokens(token.Tokens);
            foreach (var splitToken in splitTokens)
            {
                var sectionToken = splitToken.Token as DfmSectionBlockToken;
                if (sectionToken != null)
                {
                    content += Insert(sectionToken, ExposeTokenNameInDfm(sectionToken));
                    foreach (var item in splitToken.InnerTokens)
                    {
                        content += renderer.Render(item);
                    }
                    continue;
                }

                var noteToken = splitToken.Token as DfmNoteBlockToken;
                if (noteToken != null)
                {
                    var type = noteToken.NoteType.ToUpper();
                    content += Insert(noteToken, type);
                    foreach (var item in splitToken.InnerTokens)
                    {
                        content += renderer.Render(item);
                    }
                    continue;
                }

                var videoToken = splitToken.Token as DfmVideoBlockToken;
                if (videoToken != null)
                {
                    content += Insert(videoToken, $"{ExposeTokenNameInDfm(videoToken)}>{videoToken.Link}");
                    continue;
                }

                foreach (var item in splitToken.InnerTokens)
                {
                    content += renderer.Render(item);
                }
            }
            return Insert(token, ExposeTokenNameInDfm(token), content);
        }
Esempio n. 12
0
 public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownStrongInlineToken token, MarkdownInlineContext context)
 {
     StringBuffer content = StringBuffer.Empty;
     content += "**";
     foreach (var t in token.Content)
     {
         content += render.Render(t);
     }
     content += "**";
     return content;
 }
Esempio n. 13
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 += this.Insert("headerItem", childContent, Type.NonLeaf);
            }
            content += this.Insert("Header", headerContent, Type.NonLeaf);

            // 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 += this.Insert("RowItem", childContent, Type.NonLeaf);
                }
                bodyContent += this.Insert("Row", rowContent, Type.NonLeaf);
            }
            content += this.Insert("Body", bodyContent, Type.NonLeaf);
            return(this.Insert("Table", content, Type.NonLeaf));
        }
Esempio n. 14
0
        public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownParagraphBlockToken token, MarkdownBlockContext context)
        {
            StringBuffer result = "<p";

            result  = AppendSourceInfo(result, renderer, token);
            result += ">";
            foreach (var item in token.InlineTokens.Tokens)
            {
                result += renderer.Render(item);
            }
            result += "</p>\n";
            return(result);
        }
Esempio n. 15
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. 16
0
        public virtual StringBuffer Render(IMarkdownRenderer engine, MarkdownListBlockToken token, MarkdownBlockContext context)
        {
            var          type    = token.Ordered ? "ol" : "ul";
            StringBuffer content = "<";

            content += type;
            content += ">\n";
            foreach (var t in token.Tokens)
            {
                content += engine.Render(t);
            }
            return(content + "</" + type + ">\n");
        }
Esempio n. 17
0
        private StringBuffer RenderInlineTokens(ImmutableArray <IMarkdownToken> tokens, IMarkdownRenderer render)
        {
            var result = StringBuffer.Empty;

            if (tokens != null)
            {
                foreach (var t in tokens)
                {
                    result += render.Render(t);
                }
            }

            return(result);
        }
Esempio n. 18
0
        public override StringBuffer Render(IMarkdownRenderer render, MarkdownBlockquoteBlockToken token, MarkdownBlockContext context)
        {
            const string BlockQuoteStartString = "> ";
            const string BlockQuoteJoinString  = "\n" + BlockQuoteStartString;

            var content = StringBuffer.Empty;

            for (var index = 0; index < token.Tokens.Length; index++)
            {
                var t = token.Tokens[index];
                if (index == token.Tokens.Length - 1 && t is DfmVideoBlockToken videoToken)
                {
                    content += render.Render(t).ToString().TrimEnd();
                }
                else
                {
                    content += render.Render(t);
                }
            }
            var contents = content.ToString().Split('\n');

            content = StringBuffer.Empty;
            foreach (var item in contents)
            {
                if (content == StringBuffer.Empty)
                {
                    content += BlockQuoteStartString;
                    content += item;
                }
                else
                {
                    content += BlockQuoteJoinString;
                    content += item;
                }
            }
            return(content + "\n\n");
        }
        public async Task <ActionResult> Page(
            [FromRouteData] PageNode page,
            [FromRouteData] MenuItem menu)
        {
            var model = new PageModel();

            if (menu != null)
            {
                model.SideMenu.AddRange(GetSideMenu(menu));
            }

            model.Markup = _markdownRenderer.Render(page.Markdown);

            return(View(model));
        }
Esempio n. 20
0
        public virtual StringBuffer Render(IMarkdownRenderer render, IMarkdownToken token, IMarkdownContext context)
        {
            var content  = StringBuffer.Empty;
            var children = token.Children();

            if (children != null)
            {
                foreach (var t in children)
                {
                    content += render.Render(t);
                }
            }

            return(content);
        }
Esempio n. 21
0
        public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmDefaultBlockQuoteBlockSplitToken splitToken, IMarkdownContext context)
        {
            StringBuffer content = string.Empty;

            content += "<blockquote";
            content  = AppendSourceInfo(content, renderer, splitToken.Token);
            content += ">";
            foreach (var item in splitToken.InnerTokens)
            {
                content += renderer.Render(item);
            }
            content += "</blockquote>\n";

            return(content);
        }
Esempio n. 22
0
        /// <summary>
        /// Converts a Markdown string using a custom <see cref="IMarkdownRenderer"/>.
        /// </summary>
        /// <param name="markdown">A Markdown text.</param>
        /// <param name="renderer">The renderer to convert Markdown to.</param>
        /// <param name="pipeline">The pipeline used for the conversion.</param>
        /// <exception cref="System.ArgumentNullException">if markdown or writer variable are null</exception>
        public static object Convert(string markdown, IMarkdownRenderer renderer, MarkdownPipeline pipeline = null)
        {
            if (markdown == null)
            {
                throw new ArgumentNullException(nameof(markdown));
            }
            if (renderer == null)
            {
                throw new ArgumentNullException(nameof(renderer));
            }
            pipeline = pipeline ?? new MarkdownPipelineBuilder().Build();

            var document = Parse(markdown, pipeline);

            pipeline.Setup(renderer);
            return(renderer.Render(document));
        }
Esempio n. 23
0
        public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownLinkInlineToken token, IMarkdownContext context)
        {
            var content = StringBuffer.Empty;

            if (token.Content != null)
            {
                foreach (var t in token.Content)
                {
                    content += render.Render(t);
                }
            }

            content += token.Href.NormalizeLink(_filePath, _baseDir);
            content += Constants.Separator;

            return(content);
        }
Esempio n. 24
0
        public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownHeadingBlockToken token, MarkdownBlockContext context)
        {
            StringBuffer content = StringBuffer.Empty;

            for (int i = 0; i < token.Depth; ++i)
            {
                content += "#";
            }
            content += " ";

            foreach (var t in token.Content.Tokens)
            {
                content += render.Render(t);
            }
            content += "\n";
            return(content);
        }
Esempio n. 25
0
        public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmXrefInlineToken token, MarkdownInlineContext context)
        {
            StringBuffer result = "<xref";
            result = AppendAttribute(result, "href", token.Href);
            result = AppendAttribute(result, "title", token.Title);
            result = AppendAttribute(result, "data-throw-if-not-resolved", token.ThrowIfNotResolved.ToString());
            result = AppendAttribute(result, "data-raw-source", token.SourceInfo.Markdown);
            result = AppendSourceInfo(result, renderer, token);
            result += ">";

            foreach (var item in token.Content)
            {
                result += renderer.Render(item);
            }

            result += "</xref>";
            return result;
        }
Esempio n. 26
0
        /// <summary>
        /// Converts a Markdown string using a custom <see cref="IMarkdownRenderer"/>.
        /// </summary>
        /// <param name="markdown">A Markdown text.</param>
        /// <param name="renderer">The renderer to convert Markdown to.</param>
        /// <param name="pipeline">The pipeline used for the conversion.</param>
        /// <param name="context">A parser context used for the parsing.</param>
        /// <exception cref="System.ArgumentNullException">if markdown or writer variable are null</exception>
        public static object Convert(string markdown, IMarkdownRenderer renderer, MarkdownPipeline pipeline = null, MarkdownParserContext context = null)
        {
            if (markdown == null)
            {
                ThrowHelper.ArgumentNullException_markdown();
            }
            if (renderer == null)
            {
                ThrowHelper.ArgumentNullException(nameof(renderer));
            }
            pipeline ??= new MarkdownPipelineBuilder().Build();

            pipeline = CheckForSelfPipeline(pipeline, markdown);
            var document = Parse(markdown, pipeline, context);

            pipeline.Setup(renderer);
            return(renderer.Render(document));
        }
Esempio n. 27
0
        /// <summary>
        /// Converts a Markdown string using a custom <see cref="IMarkdownRenderer"/>.
        /// </summary>
        /// <param name="markdown">A Markdown text.</param>
        /// <param name="renderer">The renderer to convert Markdown to.</param>
        /// <param name="pipeline">The pipeline used for the conversion.</param>
        /// <param name="context">A parser context used for the parsing.</param>
        /// <exception cref="ArgumentNullException">if markdown or writer variable are null</exception>
        public static object Convert(string markdown, IMarkdownRenderer renderer, MarkdownPipeline?pipeline = null, MarkdownParserContext?context = null)
        {
            if (markdown is null)
            {
                ThrowHelper.ArgumentNullException_markdown();
            }
            if (renderer is null)
            {
                ThrowHelper.ArgumentNullException(nameof(renderer));
            }

            pipeline = GetPipeline(pipeline, markdown);

            var document = MarkdownParser.Parse(markdown, pipeline, context);

            pipeline.Setup(renderer);
            return(renderer.Render(document));
        }
Esempio n. 28
0
        public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmXrefInlineToken token, MarkdownInlineContext context)
        {
            StringBuffer result = "<xref";

            result = AppendAttribute(result, "href", token.Href);
            result = AppendAttribute(result, "title", token.Title);
            result = AppendAttribute(result, "data-throw-if-not-resolved", token.ThrowIfNotResolved.ToString());
            result = AppendAttribute(result, "data-raw", token.SourceInfo.Markdown);

            result += ">";
            foreach (var item in token.Content)
            {
                result += renderer.Render(item);
            }

            result += "</xref>";
            return(result);
        }
Esempio n. 29
0
 public virtual StringBuffer Render(IMarkdownRenderer engine, MarkdownHeadingBlockToken token, MarkdownBlockContext context)
 {
     string level = token.Depth.ToString();
     var result = (StringBuffer)"<h"
         + level
         + " id=\""
         + engine.Options.HeaderPrefix
         + token.Id
         + "\">";
     foreach (var item in token.Content.Tokens)
     {
         result += engine.Render(item);
     }
     result += "</h";
     result += level;
     result += ">\n";
     return result;
 }
Esempio n. 30
0
 public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownLinkInlineToken token, MarkdownInlineContext context)
 {
     StringBuffer content = StringBuffer.Empty;
     content += "[";
     foreach(var t in token.Content)
     {
         content += render.Render(t);
     }
     content += "](";
     content += StringHelper.Unescape(token.Href);
     if (!string.IsNullOrEmpty(token.Title))
     {
         content += " \"";
         content += StringHelper.Unescape(token.Title);
         content += "\"";
     }
     content += ")";
     return content;
 }
Esempio n. 31
0
 public override StringBuffer Render(IMarkdownRenderer renderer, MarkdownBlockquoteBlockToken token, MarkdownBlockContext context)
 {
     StringBuffer content = string.Empty;
     var splitTokens = DfmRendererHelper.SplitBlockquoteTokens(token.Tokens);
     foreach (var splitToken in splitTokens)
     {
         if (splitToken.Token is DfmSectionBlockToken)
         {
             content += "<div";
             content += ((DfmSectionBlockToken)splitToken.Token).Attributes;
             content += ">";
             foreach (var item in splitToken.InnerTokens)
             {
                 content += renderer.Render(item);
             }
             content += "</div>\n";
         }
         else if (splitToken.Token is DfmNoteBlockToken)
         {
             var noteToken = (DfmNoteBlockToken)splitToken.Token;
             content += "<div class=\"";
             content += noteToken.NoteType;
             content += "\"><h5>";
             content += noteToken.NoteType;
             content += "</h5>";
             foreach (var item in splitToken.InnerTokens)
             {
                 content += renderer.Render(item);
             }
             content += "</div>\n";
         }
         else
         {
             content += "<blockquote>";
             foreach (var item in splitToken.InnerTokens)
             {
                 content += renderer.Render(item);
             }
             content += "</blockquote>\n";
         }
     }
     return content;
 }
Esempio n. 32
0
        public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownHeadingBlockToken token, MarkdownBlockContext context)
        {
            string level  = token.Depth.ToString();
            var    result = (StringBuffer)"<h"
                            + level
                            + " id=\""
                            + renderer.Options.HeaderPrefix
                            + token.Id
                            + "\">";

            foreach (var item in token.Content.Tokens)
            {
                result += renderer.Render(item);
            }
            result += "</h";
            result += level;
            result += ">\n";
            return(result);
        }
Esempio n. 33
0
 private StringBuffer RenderLinkNormalLink(IMarkdownRenderer render, MarkdownLinkInlineToken token, MarkdownInlineContext context)
 {
     StringBuffer content = StringBuffer.Empty;
     content += "[";
     foreach (var t in token.Content)
     {
         content += render.Render(t);
     }
     content += "](";
     content += Regexes.Helper.MarkdownUnescape.Replace(token.Href, m => "\\" + m.Value);
     if (!string.IsNullOrEmpty(token.Title))
     {
         content += " \"";
         content += Regexes.Helper.MarkdownUnescape.Replace(token.Title, m => "\\" + m.Value);
         content += "\"";
     }
     content += ")";
     return content;
 }
Esempio n. 34
0
        public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmSectionBlockSplitToken splitToken, MarkdownBlockContext context)
        {
            StringBuffer content = string.Empty;

            if (!splitToken.Token.SourceInfo.Markdown.EndsWith("\n"))
            {
                Logger.LogWarning("The content part of [!div] syntax is suggested to start in a new line.", file: splitToken.Token.SourceInfo.File, line: splitToken.Token.SourceInfo.LineNumber.ToString());
            }
            content += "<div";
            content += ((DfmSectionBlockToken)splitToken.Token).Attributes;
            content  = AppendSourceInfo(content, renderer, splitToken.Token);
            content += ">";
            foreach (var item in splitToken.InnerTokens)
            {
                content += renderer.Render(item);
            }
            content += "</div>\n";

            return(content);
        }
Esempio n. 35
0
        private StringBuffer RenderLinkNormalLink(IMarkdownRenderer render, MarkdownLinkInlineToken token, MarkdownInlineContext context)
        {
            StringBuffer content = StringBuffer.Empty;

            content += "[";
            foreach (var t in token.Content)
            {
                content += render.Render(t);
            }
            content += "](";
            content += Regexes.Helper.MarkdownUnescape.Replace(token.Href, m => "\\" + m.Value);
            if (!string.IsNullOrEmpty(token.Title))
            {
                content += " \"";
                content += Regexes.Helper.MarkdownUnescape.Replace(token.Title, m => "\\" + m.Value);
                content += "\"";
            }
            content += ")";
            return(content);
        }
Esempio n. 36
0
        public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownLinkInlineToken token, MarkdownInlineContext context)
        {
            StringBuffer content = StringBuffer.Empty;

            content += "[";
            foreach (var t in token.Content)
            {
                content += render.Render(t);
            }
            content += "](";
            content += StringHelper.Unescape(token.Href);
            if (!string.IsNullOrEmpty(token.Title))
            {
                content += " \"";
                content += StringHelper.Unescape(token.Title);
                content += "\"";
            }
            content += ")";
            return(content);
        }
Esempio n. 37
0
 private static StringBuffer RenderTabHeaders(IMarkdownRenderer renderer, DfmTabGroupBlockToken token, StringBuffer sb, string groupId)
 {
     sb += "<ul role=\"tablist\">\n";
     for (int i = 0; i < token.Items.Length; i++)
     {
         var item = token.Items[i];
         sb += "<li role=\"presentation\"";
         if (!item.Visible)
         {
             sb += " aria-hidden=\"true\" hidden=\"hidden\"";
         }
         sb += ">\n";
         sb += @"<a href=""#tabpanel_";
         sb  = AppendGroupId(sb, groupId, item);
         sb += @""" role=""tab"" aria-controls=""tabpanel_";
         sb  = AppendGroupId(sb, groupId, item);
         sb += @""" data-tab=""";
         sb += item.Id;
         if (!string.IsNullOrEmpty(item.Condition))
         {
             sb += @""" data-condition=""";
             sb += item.Condition;
         }
         if (i == token.ActiveTabIndex)
         {
             sb += "\" tabindex=\"0\" aria-selected=\"true\"";
         }
         else
         {
             sb += "\" tabindex=\"-1\"";
         }
         sb  = AppendSourceInfo(sb, renderer, item.Title);
         sb += ">";
         sb += renderer.Render(item.Title);
         sb += "</a>\n";
         sb += "</li>\n";
     }
     sb += "</ul>\n";
     return(sb);
 }
Esempio n. 38
0
        public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownLinkInlineToken token, MarkdownInlineContext context)
        {
            if (renderer.Options.Sanitize)
            {
                string prot = null;

                try
                {
                    prot = Regex.Replace(StringHelper.DecodeURIComponent(token.Href), @"[^\w:]", string.Empty).ToLower();
                }
                catch (Exception)
                {
                    return(string.Empty);
                }

                if (prot.IndexOf("javascript:") == 0 || prot.IndexOf("vbscript:") == 0)
                {
                    return(string.Empty);
                }
            }

            var result = (StringBuffer)"<a href=\"" + StringHelper.Escape(token.Href) + "\"";

            if (!string.IsNullOrEmpty(token.Title))
            {
                result = result + " title=\"" + StringHelper.Escape(token.Title) + "\"";
            }
            result  = AppendAttribute(result, "data-raw-source", token.SourceInfo.Markdown);
            result  = AppendSourceInfo(result, renderer, token);
            result += ">";

            foreach (var item in token.Content)
            {
                result += renderer.Render(item);
            }

            result += "</a>";
            return(result);
        }
Esempio n. 39
0
        private StringBuffer RenderRefLink(IMarkdownRenderer render, IMarkdownToken token, MarkdownInlineContext context)
        {
            StringBuffer content = StringBuffer.Empty;

            if (token is MarkdownImageInlineToken)
            {
                var realToken = token as MarkdownImageInlineToken;
                content += "![";
                if (render.Options.LegacyMode)
                {
                    content += StringHelper.LegacyEscapeMarkdown(realToken.Text);
                }
                else
                {
                    content += StringHelper.EscapeMarkdown(realToken.Text);
                }
                content += "][";
                content += realToken.RefId;
                content += "]";
            }
            else if (token is MarkdownLinkInlineToken)
            {
                var realToken = token as MarkdownLinkInlineToken;
                content += "[";
                foreach (var t in realToken.Content)
                {
                    content += render.Render(t);
                }
                content += "][";
                content += realToken.RefId;
                content += "]";
            }
            else
            {
                throw new NotSupportedException("Reference link token should be either link token or image token");
            }

            return(content);
        }
        protected StringBuffer Render(IMarkdownRenderer render, MarkdownListItemBlockToken token, string indent, bool last = false)
        {
            var content = StringBuffer.Empty;

            if (token.Tokens.Length > 0)
            {
                var tokenRenderContent = StringBuffer.Empty;
                foreach (var t in token.Tokens)
                {
                    tokenRenderContent += render.Render(t);
                }

                var lines = tokenRenderContent.ToString().Split('\n');

                for (var index = 0; index < lines.Count(); index++)
                {
                    if (last && index == lines.Count() - 1 && string.Equals(lines[index].Trim(), string.Empty))
                    {
                        continue;
                    }

                    if (!string.Equals(lines[index].Trim(), string.Empty) && index > 0)
                    {
                        content += indent;
                    }

                    content += lines[index];

                    if (last && index == lines.Count() - 1)
                    {
                        continue;
                    }
                    content += "\n";
                }
            }
            return(content);
        }
Esempio n. 41
0
        public virtual StringBuffer Render(IMarkdownRenderer engine, MarkdownLinkInlineToken token, MarkdownInlineContext context)
        {
            if (engine.Options.Sanitize)
            {
                string prot = null;

                try
                {
                    prot = Regex.Replace(StringHelper.DecodeURIComponent(StringHelper.Unescape(token.Href)), @"[^\w:]", string.Empty).ToLower();
                }
                catch (Exception)
                {
                    return(string.Empty);
                }

                if (prot.IndexOf("javascript:") == 0 || prot.IndexOf("vbscript:") == 0)
                {
                    return(string.Empty);
                }
            }

            var result = (StringBuffer)"<a href=\"" + token.Href + "\"";

            if (!string.IsNullOrEmpty(token.Title))
            {
                result = result + " title=\"" + token.Title + "\"";
            }
            result += ">";

            foreach (var item in token.Content)
            {
                result += engine.Render(item);
            }

            result += "</a>";
            return(result);
        }
Esempio n. 42
0
        public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmNoteBlockSplitToken splitToken, IMarkdownContext context)
        {
            StringBuffer content = string.Empty;

            if (!splitToken.Token.SourceInfo.Markdown.EndsWith("\n"))
            {
                Logger.LogWarning(
                    "The content part of NOTE/WARNING/CAUTION/IMPORTANT/NEXT syntax is suggested to start in a new line.",
                    file: splitToken.Token.SourceInfo.File,
                    line: splitToken.Token.SourceInfo.LineNumber.ToString(),
                    code: WarningCodes.Markdown.MissingNewLineBelowSectionHeader);
            }
            var noteToken = (DfmNoteBlockToken)splitToken.Token;

            content += "<div class=\"";
            content += noteToken.NoteType.ToUpper();
            content += "\"";
            content  = AppendSourceInfo(content, renderer, splitToken.Token);
            content += ">";
            if (Tokens != null && Tokens.TryGetValue(noteToken.NoteType.ToLower(), out string heading))
            {
                content += heading;
            }
            else
            {
                content += "<h5>";
                content += noteToken.NoteType.ToUpper();
                content += "</h5>";
            }
            foreach (var item in splitToken.InnerTokens)
            {
                content += renderer.Render(item);
            }
            content += "</div>\n";
            return(content);
        }
Esempio n. 43
0
        protected virtual StringBuffer Render(IMarkdownRenderer render, MarkdownListItemBlockToken token, string indent)
        {
            var content = StringBuffer.Empty;

            if (token.Tokens.Length > 0)
            {
                var tokenRenderContent = StringBuffer.Empty;
                foreach (var t in token.Tokens)
                {
                    tokenRenderContent += render.Render(t);
                }

                var lines = tokenRenderContent.ToString().TrimEnd('\n').Split('\n');
                content += lines[0];
                content += "\n";
                foreach (var line in lines.Skip(1))
                {
                    content += indent;
                    content += line;
                    content += "\n";
                }
            }
            return(content);
        }
Esempio n. 44
0
 public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownListItemBlockToken token, MarkdownBlockContext context)
 {
     // TODO: Add corresponding white space before the result
     var content = StringBuffer.Empty;
     foreach (var t in token.Tokens)
     {
         content += render.Render(t);
     }
     return content;
 }
Esempio n. 45
0
        protected virtual StringBuffer Render(IMarkdownRenderer render, MarkdownListItemBlockToken token, string indent)
        {
            var content = StringBuffer.Empty;
            if (token.Tokens.Length > 0)
            {
                var tokenRenderContent = StringBuffer.Empty;
                foreach (var t in token.Tokens)
                {
                    tokenRenderContent += render.Render(t);
                }

                var lines = tokenRenderContent.ToString().TrimEnd('\n').Split('\n');
                content += lines[0];
                content += "\n";
                foreach (var line in lines.Skip(1))
                {
                    content += indent;
                    content += line;
                    content += "\n";
                }
            }
            return content;
        }
Esempio n. 46
0
        private StringBuffer RenderNumberLink(IMarkdownRenderer render, IMarkdownToken token, MarkdownInlineContext context)
        {
            StringBuffer content = StringBuffer.Empty;
            if(token is MarkdownImageInlineToken)
            {
                var realToken = token as MarkdownImageInlineToken;
                content += "![";
                content += realToken.Text;
                content += "]";
            }
            else if(token is MarkdownLinkInlineToken)
            {
                var realToken = token as MarkdownLinkInlineToken;
                content += "[";
                foreach (var t in realToken.Content)
                {
                    content += render.Render(t);
                }
                content += "]";
            }
            else
            {
                throw new NotSupportedException("Number link token should be either link token or image token");
            }

            return content;
        }
Esempio n. 47
0
 public virtual StringBuffer Render(IMarkdownRenderer engine, MarkdownTableBlockToken token, MarkdownBlockContext context)
 {
     StringBuffer result = "<table>\n<thead>\n";
     // header
     result += "<tr>\n";
     var cell = StringBuffer.Empty;
     for (int i = 0; i < token.Header.Length; i++)
     {
         if (i < token.Align.Length && token.Align[i] != Align.NotSpec)
         {
             result += "<th style=\"text-align:";
             result += token.Align[i].ToString().ToLower();
             result += "\">";
         }
         else
         {
             result += "<th>";
         }
         foreach (var item in token.Header[i].Tokens)
         {
             result += engine.Render(item);
         }
         result += "</th>\n";
     }
     result += "</tr>\n";
     result += "</thead>\n";
     result += "<tbody>\n";
     // body
     for (int i = 0; i < token.Cells.Length; i++)
     {
         var row = token.Cells[i];
         result += "<tr>\n";
         for (int j = 0; j < row.Length; j++)
         {
             if (j < token.Align.Length && token.Align[j] != Align.NotSpec)
             {
                 result += "<td style=\"text-align:";
                 result += token.Align[j].ToString().ToLower();
                 result += "\">";
             }
             else
             {
                 result += "<td>";
             }
             foreach (var item in row[j].Tokens)
             {
                 result += engine.Render(item);
             }
             result += "</td>\n";
         }
         result += "</tr>\n";
     }
     return result + "</tbody>\n" + "</table>\n";
 }
Esempio n. 48
0
 public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownNonParagraphBlockToken token, MarkdownBlockContext context)
 {
     var result = StringBuffer.Empty;
     foreach (var item in token.Content.Tokens)
     {
         result += renderer.Render(item);
     }
     return result;
 }
Esempio n. 49
0
        public virtual StringBuffer Render(IMarkdownRenderer engine, MarkdownLinkInlineToken token, MarkdownInlineContext context)
        {
            if (engine.Options.Sanitize)
            {
                string prot = null;

                try
                {
                    prot = Regex.Replace(StringHelper.DecodeURIComponent(StringHelper.Unescape(token.Href)), @"[^\w:]", string.Empty).ToLower();
                }
                catch (Exception)
                {
                    return string.Empty;
                }

                if (prot.IndexOf("javascript:") == 0 || prot.IndexOf("vbscript:") == 0)
                {
                    return string.Empty;
                }
            }

            var result = (StringBuffer)"<a href=\"" + token.Href + "\"";
            if (!string.IsNullOrEmpty(token.Title))
            {
                result = result + " title=\"" + token.Title + "\"";
            }
            result += ">";

            foreach (var item in token.Content)
            {
                result += engine.Render(item);
            }

            result += "</a>";
            return result;
        }
Esempio n. 50
0
        public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownTableBlockToken token, MarkdownBlockContext context)
        {
            var content = StringBuffer.Empty;

            // Generate header line
            content += "|";
            foreach (var header in token.Header)
            {
                content += " ";
                foreach (var t in header.Tokens)
                {
                    content += render.Render(t);
                }
                content += " |";
            }
            content += "\n";

            // Generate align line
            content += "|";
            foreach (var align in token.Align)
            {
                switch (align)
                {
                case Align.NotSpec:
                    content += " --- ";
                    break;

                case Align.Left:
                    content += ":--- ";
                    break;

                case Align.Right:
                    content += " ---:";
                    break;

                case Align.Center:
                    content += ":---:";
                    break;

                default:
                    throw new NotSupportedException($"align:{align} doesn't support in GFM table");
                }
                content += "|";
            }
            content += "\n";

            // Generate content lines
            foreach (var row in token.Cells)
            {
                content += "| ";
                foreach (var column in row)
                {
                    foreach (var t in column.Tokens)
                    {
                        content += render.Render(t);
                    }
                    content += " |";
                }
                content += "\n";
            }

            return(content += "\n");
        }
Esempio n. 51
0
        public virtual StringBuffer Render(IMarkdownRenderer render, MarkdownTableBlockToken token, MarkdownBlockContext context)
        {
            var content = StringBuffer.Empty;

            // Generate header line
            content += "|";
            foreach (var header in token.Header)
            {
                content += " ";
                foreach (var t in header.Content.Tokens)
                {
                    content += render.Render(t);
                }
                content += " |";
            }
            content += "\n";

            // Generate align line
            content += "|";
            foreach (var align in token.Align)
            {
                switch (align)
                {
                    case Align.NotSpec:
                        content += " --- ";
                        break;
                    case Align.Left:
                        content += ":--- ";
                        break;
                    case Align.Right:
                        content += " ---:";
                        break;
                    case Align.Center:
                        content += ":---:";
                        break;
                    default:
                        throw new NotSupportedException($"align:{align} doesn't support in GFM table");
                }
                content += "|";
            }
            content += "\n";

            // Generate content lines
            foreach (var row in token.Cells)
            {
                content += "| ";
                foreach (var column in row)
                {
                    foreach (var t in column.Content.Tokens)
                    {
                        content += render.Render(t);
                    }
                    content += " |";
                }
                content += "\n";
            }

            return content += "\n";
        }
Esempio n. 52
0
 public virtual StringBuffer Render(IMarkdownRenderer engine, MarkdownParagraphBlockToken token, MarkdownBlockContext context)
 {
     StringBuffer result = "<p>";
     foreach (var item in token.InlineTokens.Tokens)
     {
         result += engine.Render(item);
     }
     result += "</p>\n";
     return result;
 }
Esempio n. 53
0
        async Task <IActionResult> MarkdownView(IMarkdownRenderer renderer, ContentPath path, Option <string> markdown)
        {
            var result = await renderer.Render(markdown.ValueOr("empty"));

            return(View("Index", new ContentModel(path, result.Title.ValueOr(path.GetDisplayName("Home")), result.Body)));
        }
Esempio n. 54
0
 public virtual StringBuffer Render(IMarkdownRenderer engine, MarkdownListBlockToken token, MarkdownBlockContext context)
 {
     var type = token.Ordered ? "ol" : "ul";
     StringBuffer content = "<";
     content += type;
     content += ">\n";
     foreach (var t in token.Tokens)
     {
         content += engine.Render(t);
     }
     return content + "</" + type + ">\n";
 }
Esempio n. 55
0
 public override StringBuffer Render(IMarkdownRenderer renderer, MarkdownBlockquoteBlockToken token, MarkdownBlockContext context)
 {
     StringBuffer content = string.Empty;
     var splitTokens = DfmBlockquoteHelper.SplitBlockquoteTokens(token.Tokens);
     foreach (var splitToken in splitTokens)
     {
         if (splitToken.Token is DfmSectionBlockToken)
         {
             if (!splitToken.Token.SourceInfo.Markdown.EndsWith("\n"))
             {
                 Logger.LogWarning("The content part of [!div] syntax is suggested to start in a new line.", file: splitToken.Token.SourceInfo.File, line: splitToken.Token.SourceInfo.LineNumber.ToString());
             }
             content += "<div";
             content += ((DfmSectionBlockToken)splitToken.Token).Attributes;
             content = AppendSourceInfo(content, renderer, splitToken.Token);
             content += ">";
             foreach (var item in splitToken.InnerTokens)
             {
                 content += renderer.Render(item);
             }
             content += "</div>\n";
         }
         else if (splitToken.Token is DfmNoteBlockToken)
         {
             if (!splitToken.Token.SourceInfo.Markdown.EndsWith("\n"))
             {
                 Logger.LogWarning("The content part of NOTE/WARNING/CAUTION/IMPORTANT syntax is suggested to start in a new line.", file: splitToken.Token.SourceInfo.File, line: splitToken.Token.SourceInfo.LineNumber.ToString());
             }
             var noteToken = (DfmNoteBlockToken)splitToken.Token;
             content += "<div class=\"";
             content += noteToken.NoteType.ToUpper();
             content += "\"";
             content = AppendSourceInfo(content, renderer, splitToken.Token);
             content += ">";
             string heading;
             if (Tokens != null && Tokens.TryGetValue(noteToken.NoteType.ToLower(), out heading))
             {
                 content += heading;
             }
             else
             {
                 content += "<h5>";
                 content += noteToken.NoteType.ToUpper();
                 content += "</h5>";
             }
             foreach (var item in splitToken.InnerTokens)
             {
                 content += renderer.Render(item);
             }
             content += "</div>\n";
         }
         else if (splitToken.Token is DfmVideoBlockToken)
         {
             var videoToken = splitToken.Token as DfmVideoBlockToken;
             content += "<div class=\"embeddedvideo\"><iframe src=\"";
             content += videoToken.Link;
             content += "\" frameborder=\"0\" allowfullscreen=\"true\"";
             content = AppendSourceInfo(content, renderer, splitToken.Token);
             content += "></iframe></div>\n";
             continue;
         }
         else
         {
             content += "<blockquote";
             content = AppendSourceInfo(content, renderer, splitToken.Token);
             content += ">";
             foreach (var item in splitToken.InnerTokens)
             {
                 content += renderer.Render(item);
             }
             content += "</blockquote>\n";
         }
     }
     return content;
 }
Esempio n. 56
0
 protected StringBuffer RenderTokens(IMarkdownRenderer engine, ImmutableArray<IMarkdownToken> tokens, MarkdownBlockContext context, bool wrapParagraph = false, IMarkdownRule rule = null)
 {
     var content = StringBuffer.Empty;
     var textContent = StringBuffer.Empty;
     foreach (var t in tokens)
     {
         var text = t as MarkdownTextToken;
         if (text != null)
         {
             if (textContent != StringBuffer.Empty)
             {
                 textContent += "\n";
             }
             textContent += text.Content;
             continue;
         }
         if (!wrapParagraph && t is MarkdownNewLineBlockToken)
         {
             continue;
         }
         if (textContent != StringBuffer.Empty)
         {
             content += RenderTextInTokens(engine, context, wrapParagraph, rule, textContent, t.RawMarkdown);
             textContent = StringBuffer.Empty;
         }
         content += engine.Render(t);
     }
     if (textContent != StringBuffer.Empty)
     {
         content += RenderTextInTokens(engine, context, wrapParagraph, rule, textContent, textContent);
     }
     return content;
 }
Esempio n. 57
0
 public virtual StringBuffer Render(IMarkdownRenderer engine, GfmDelInlineToken token, MarkdownInlineContext context)
 {
     var result = (StringBuffer)"<del>";
     foreach (var item in token.Content)
     {
         result += engine.Render(item);
     }
     result += "</del>";
     return result;
 }
Esempio n. 58
0
        public override StringBuffer Render(IMarkdownRenderer renderer, MarkdownBlockquoteBlockToken token, MarkdownBlockContext context)
        {
            StringBuffer content     = string.Empty;
            var          splitTokens = DfmBlockquoteHelper.SplitBlockquoteTokens(token.Tokens);

            foreach (var splitToken in splitTokens)
            {
                if (splitToken.Token is DfmSectionBlockToken)
                {
                    if (!splitToken.Token.SourceInfo.Markdown.EndsWith("\n"))
                    {
                        Logger.LogWarning("The content part of [!div] syntax is suggested to start in a new line.", file: splitToken.Token.SourceInfo.File, line: splitToken.Token.SourceInfo.LineNumber.ToString());
                    }
                    content += "<div";
                    content += ((DfmSectionBlockToken)splitToken.Token).Attributes;
                    content  = AppendSourceInfo(content, renderer, splitToken.Token);
                    content += ">";
                    foreach (var item in splitToken.InnerTokens)
                    {
                        content += renderer.Render(item);
                    }
                    content += "</div>\n";
                }
                else if (splitToken.Token is DfmNoteBlockToken)
                {
                    if (!splitToken.Token.SourceInfo.Markdown.EndsWith("\n"))
                    {
                        Logger.LogWarning("The content part of NOTE/WARNING/CAUTION/IMPORTANT syntax is suggested to start in a new line.", file: splitToken.Token.SourceInfo.File, line: splitToken.Token.SourceInfo.LineNumber.ToString());
                    }
                    var noteToken = (DfmNoteBlockToken)splitToken.Token;
                    content += "<div class=\"";
                    content += noteToken.NoteType.ToUpper();
                    content += "\"";
                    content  = AppendSourceInfo(content, renderer, splitToken.Token);
                    content += ">";
                    string heading;
                    if (Tokens != null && Tokens.TryGetValue(noteToken.NoteType.ToLower(), out heading))
                    {
                        content += heading;
                    }
                    else
                    {
                        content += "<h5>";
                        content += noteToken.NoteType.ToUpper();
                        content += "</h5>";
                    }
                    foreach (var item in splitToken.InnerTokens)
                    {
                        content += renderer.Render(item);
                    }
                    content += "</div>\n";
                }
                else if (splitToken.Token is DfmVideoBlockToken)
                {
                    var videoToken = splitToken.Token as DfmVideoBlockToken;
                    content += "<div class=\"embeddedvideo\"><iframe src=\"";
                    content += videoToken.Link;
                    content += "\" frameborder=\"0\" allowfullscreen=\"true\"";
                    content  = AppendSourceInfo(content, renderer, splitToken.Token);
                    content += "></iframe></div>\n";
                    continue;
                }
                else
                {
                    content += "<blockquote";
                    content  = AppendSourceInfo(content, renderer, splitToken.Token);
                    content += ">";
                    foreach (var item in splitToken.InnerTokens)
                    {
                        content += renderer.Render(item);
                    }
                    content += "</blockquote>\n";
                }
            }
            return(content);
        }
Esempio n. 59
0
 public virtual StringBuffer Render(IMarkdownRenderer engine, MarkdownHtmlBlockToken token, MarkdownBlockContext context)
 {
     var result = StringBuffer.Empty;
     foreach (var item in token.Content.Tokens)
     {
         result += engine.Render(item);
     }
     return result;
 }