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; }
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; }
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; }
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"; }
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); }
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; }
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); }
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); }
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"; }
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); }
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); }
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; }
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)); }
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); }
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)); }
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"); }
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); }
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)); }
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); }
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); }
/// <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)); }
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); }
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); }
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; }
/// <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)); }
/// <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)); }
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); }
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; }
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; }
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; }
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); }
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; }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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; }
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; }
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; }
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"; }
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; }
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; }
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"); }
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"; }
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; }
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))); }
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"; }
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; }
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; }
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; }
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); }
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; }