public virtual StringBuffer Render(DfmEngine engine, DfmFencesBlockToken token, MarkdownBlockContext context) { var lang = string.IsNullOrEmpty(token.Lang) ? null : $" class=\"language-{token.Lang}\""; var name = string.IsNullOrEmpty(token.Name) ? null : $" name=\"{StringHelper.HtmlEncode(token.Name)}\""; var title = string.IsNullOrEmpty(token.Title) ? null : $" title=\"{StringHelper.HtmlEncode(token.Title)}\""; if (!PathUtility.IsRelativePath(token.Path)) { string errorMessage = $"Code absolute path: {token.Path} is not supported in file {engine.Parents.Peek()}"; Logger.LogError(errorMessage); return $"<!-- {StringHelper.HtmlEncode(errorMessage)} -->"; } try { // TODO: Valid REST and REST-i script. var fencesPath = ((RelativePath)token.Path).BasedOn((RelativePath)engine.Parents.Peek()); var fencesCode = File.ReadAllText(fencesPath); return $"<pre><code{lang}{name}{title}>{StringHelper.HtmlEncode(fencesCode)}\n</code></pre>"; } catch(FileNotFoundException) { string errorMessage = $"Can not find reference {token.Path}"; Logger.LogError(errorMessage); return $"<!-- {StringHelper.HtmlEncode(errorMessage)} -->"; } }
public virtual StringBuffer Render(DfmEngine engine, DfmIncludeBlockToken token, MarkdownBlockContext context) { var href = token.Src == null ? null : $"src=\"{StringHelper.HtmlEncode(token.Src)}\""; var name = token.Name == null ? null : StringHelper.HtmlEncode(token.Name); var title = token.Title == null ? null : $"title=\"{StringHelper.HtmlEncode(token.Title)}\""; var resolved = _blockInclusionHelper.Load(token.Src, token.Raw, engine.Parents, engine.InternalMarkup); return resolved; }
public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownParagraphBlockToken token, MarkdownBlockContext context) { var childContent = StringBuffer.Empty; foreach (var item in token.InlineTokens.Tokens) { childContent += renderer.Render(item); } return Insert(token, ExposeTokenName(token), childContent); }
public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownListBlockToken token, MarkdownBlockContext context) { var type = token.Ordered ? "ol" : "ul"; var childContent = StringBuffer.Empty; foreach (var item in token.Tokens) { childContent += Render(renderer, (MarkdownListItemBlockToken) item); } return Insert(token, type, childContent); }
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 virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownCodeBlockToken token, MarkdownBlockContext context) { if (!string.IsNullOrEmpty(token.Lang)) { return Insert(token, $"{ExposeTokenName(token)}({token.Lang})>{Escape(token.Code)}"); } else { return Insert(token, $"{ExposeTokenName(token)}>{Escape(token.Code)}"); } }
public override StringBuffer Render(MarkdownEngine engine, MarkdownBlockquoteBlockToken token, MarkdownBlockContext context) { if (token.Tokens.Length > 0) { var ft = token.Tokens[0] as DfmNoteBlockToken; if (ft != null) { return $"<blockquote class=\"{ft.NoteType}\">" + RenderTokens(engine, token.Tokens.RemoveAt(0), context, true, token.Rule) + "</blockquote>"; } } return base.Render(engine, token, context); }
public virtual StringBuffer Render(IMarkdownRenderer render, DfmVideoBlockToken token, MarkdownBlockContext context) { return $"[!VIDEO {token.Link}]\n\n"; }
public virtual StringBuffer Render(MarkdownEngine engine, DfmYamlHeaderBlockToken token, MarkdownBlockContext context) { var content = token.Content == null ? string.Empty : StringHelper.HtmlEncode(token.Content); return $"<yamlheader>{content}</yamlheader>"; }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmIncludeBlockToken token, MarkdownBlockContext context) { lock (_blockInclusionHelper) { return(_blockInclusionHelper.Load(renderer, token.Src, token.SourceInfo, context, (DfmEngine)renderer.Engine)); } }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmVideoBlockToken token, MarkdownBlockContext context) { return(token.SourceInfo.Markdown); }
public virtual StringBuffer Render(MarkdownEngine engine, DfmSectionBeginBlockToken token, MarkdownBlockContext context) { return $"<div{token.Attributes}>"; }
public virtual StringBuffer Render(MarkdownEngine engine, DfmSectionBeginBlockToken token, MarkdownBlockContext context) { return($"<div{token.Attributes}>"); }
public virtual StringBuffer Render(MarkdownEngine engine, DfmYamlHeaderBlockToken token, MarkdownBlockContext context) { var content = token.Content == null ? string.Empty : StringHelper.HtmlEncode(token.Content); return($"<yamlheader>{content}</yamlheader>"); }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmIncludeBlockToken token, MarkdownBlockContext context) { var resolved = _blockInclusionHelper.Load(renderer, token.Src, token.Raw, context, ((DfmEngine)renderer.Engine).InternalMarkup); return(resolved); }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmFencesBlockToken token, MarkdownBlockContext context) { if (!PathUtility.IsRelativePath(token.Path)) { string errorMessage = $"Code absolute path: {token.Path} is not supported in file {context.GetFilePathStack().Peek()}"; Logger.LogError(errorMessage); return(DfmFencesBlockHelper.GetRenderedFencesBlockString(token, renderer.Options, errorMessage)); } try { // TODO: Valid REST and REST-i script. var fencesPath = Path.Combine(context.GetBaseFolder(), (RelativePath)context.GetFilePathStack().Peek() + (RelativePath)token.Path); var extractResult = _dfmCodeExtractor.ExtractFencesCode(token, fencesPath); return(DfmFencesBlockHelper.GetRenderedFencesBlockString(token, renderer.Options, extractResult.ErrorMessage, extractResult.FencesCodeLines)); } catch (DirectoryNotFoundException) { return(DfmFencesBlockHelper.GenerateReferenceNotFoundErrorMessage(renderer, token)); } catch (FileNotFoundException) { return(DfmFencesBlockHelper.GenerateReferenceNotFoundErrorMessage(renderer, token)); } }
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.ToUpper(); content += "\"><h5>"; content += noteToken.NoteType.ToUpper(); 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, DfmYamlHeaderBlockToken token, MarkdownBlockContext context) { if (string.IsNullOrEmpty(token.Content)) { return(StringBuffer.Empty); } StringBuffer result = "<yamlheader>"; result += StringHelper.HtmlEncode(token.Content); return(result + "</yamlheader>"); }
public virtual StringBuffer Render(IMarkdownRenderer render, AzureIncludeBlockToken token, MarkdownBlockContext context) { // Don't add \n\n here because if we render AzureIncludeBlockToken, it will always be wrappered by paragraph. Which already append \n\n return(RenderAzureIncludeToken(render, token, context)); }
public virtual StringBuffer Render(MarkdownEngine engine, DfmSectionEndBlockToken token, MarkdownBlockContext context) { return $"</div>"; }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmVideoBlockToken token, MarkdownBlockContext context) { return(Insert(token, ExposeTokenNameInDfm(token))); }
public virtual StringBuffer Render(DfmEngine engine, DfmIncludeBlockToken token, MarkdownBlockContext context) { var href = token.Src == null ? null : $"src=\"{StringHelper.HtmlEncode(token.Src)}\""; var name = token.Name == null ? null : StringHelper.HtmlEncode(token.Name); var title = token.Title == null ? null : $"title=\"{StringHelper.HtmlEncode(token.Title)}\""; var resolved = _blockInclusionHelper.Load(token.Src, token.Raw, engine.Parents, engine.InternalMarkup); return(resolved); }
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 += ">"; 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 += "\">"; 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 { content += "<blockquote>"; foreach (var item in splitToken.InnerTokens) { content += renderer.Render(item); } content += "</blockquote>\n"; } } return(content); }
public override StringBuffer Render(MarkdownEngine engine, MarkdownBlockquoteBlockToken token, MarkdownBlockContext context) { if (token.Tokens.Length > 0) { var ft = token.Tokens[0] as DfmNoteBlockToken; if (ft != null) { return($"<blockquote class=\"{ft.NoteType}\">" + RenderTokens(engine, token.Tokens.RemoveAt(0), context, true, token.Rule) + "</blockquote>"); } } return(base.Render(engine, token, context)); }
public virtual StringBuffer Render(DfmEngine engine, DfmFencesBlockToken token, MarkdownBlockContext context) { var lang = string.IsNullOrEmpty(token.Lang) ? null : $" class=\"language-{token.Lang}\""; var name = string.IsNullOrEmpty(token.Name) ? null : $" name=\"{StringHelper.HtmlEncode(token.Name)}\""; var title = string.IsNullOrEmpty(token.Title) ? null : $" title=\"{StringHelper.HtmlEncode(token.Title)}\""; if (!PathUtility.IsRelativePath(token.Path)) { string errorMessage = $"Code absolute path: {token.Path} is not supported in file {engine.Parents.Peek()}"; Logger.LogError(errorMessage); return($"<!-- {StringHelper.HtmlEncode(errorMessage)} -->"); } try { // TODO: Valid REST and REST-i script. var fencesPath = ((RelativePath)token.Path).BasedOn((RelativePath)engine.Parents.Peek()); var fencesCode = File.ReadAllText(fencesPath); return($"<pre><code{lang}{name}{title}>{StringHelper.HtmlEncode(fencesCode)}\n</code></pre>"); } catch (FileNotFoundException) { string errorMessage = $"Can not find reference {token.Path}"; Logger.LogError(errorMessage); return($"<!-- {StringHelper.HtmlEncode(errorMessage)} -->"); } }
public virtual StringBuffer Render(MarkdownEngine engine, DfmSectionEndBlockToken token, MarkdownBlockContext context) { return($"</div>"); }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmFencesBlockToken token, MarkdownBlockContext context) { return(Render(renderer, token, (IMarkdownContext)context)); }
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) { content += renderer.Render(splitToken); } return(content); }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmSectionBlockSplitToken splitToken, MarkdownBlockContext context) { StringBuffer content = string.Empty; if (!splitToken.Token.SourceInfo.Markdown.EndsWith("\n", StringComparison.Ordinal)) { 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(), code: WarningCodes.Markdown.MissingNewLineBelowSectionHeader); } 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); }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmNoteBlockToken token, MarkdownBlockContext context) { return(token.Content); }
public virtual StringBuffer Render(IMarkdownRenderer render, DfmIncludeBlockToken token, MarkdownBlockContext context) { var src = token.Src.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); return string.IsNullOrEmpty(token.Title) ? $"[!INCLUDE [{token.Name}]({src})]\n\n" : $"[!INCLUDE [{token.Name}]({src} \"{token.Title}\")]\n\n"; }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmTabGroupBlockToken token, MarkdownBlockContext context) { StringBuffer sb = @"<div class=""tabGroup"" id=""tabgroup_"; var groupId = StringHelper.Escape(token.Id); sb += groupId; sb += "\""; sb = AppendSourceInfo(sb, renderer, token); sb += ">\n"; sb = RenderTabHeaders(renderer, token, sb, groupId); sb = RenderSections(renderer, token, sb, groupId); sb += "</div>\n"; return(sb); }
public virtual StringBuffer Render(IMarkdownRenderer render, DfmYamlHeaderBlockToken token, MarkdownBlockContext context) { StringBuffer content = "---\n"; content += token.Content; content += "\n---\n"; return content; }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmYamlHeaderBlockToken token, MarkdownBlockContext context) { if (string.IsNullOrEmpty(token.Content)) { return(StringBuffer.Empty); } var startLine = token.SourceInfo.LineNumber; var endLine = token.SourceInfo.LineNumber + token.SourceInfo.ValidLineCount - 1; var sourceFile = token.SourceInfo.File; StringBuffer result = $"<yamlheader start=\"{startLine}\" end=\"{endLine}\""; if (!string.IsNullOrEmpty(sourceFile)) { sourceFile = StringHelper.HtmlEncode(sourceFile); result += $" sourceFile=\"{sourceFile}\""; } result += ">"; result += StringHelper.HtmlEncode(token.Content); return(result + "</yamlheader>"); }
public virtual StringBuffer Render(IMarkdownRenderer render, AzureVideoBlockToken token, MarkdownBlockContext context) { StringBuffer content = StringBuffer.Empty; object path; if (!context.Variables.TryGetValue("path", out path)) { path = string.Empty; content += token.SourceInfo.Markdown; return(content += "\n\n"); } if (!context.Variables.ContainsKey("azureVideoInfoMapping")) { Logger.LogWarning($"Can't fild azure video info mapping. Raw: {token.SourceInfo.Markdown}"); content = token.SourceInfo.Markdown; return(content + "\n\n"); } var azureVideoInfoMapping = (IReadOnlyDictionary <string, AzureVideoInfo>)context.Variables["azureVideoInfoMapping"]; if (azureVideoInfoMapping == null || !azureVideoInfoMapping.ContainsKey(token.VideoId)) { Logger.LogWarning($"Can't fild azure video info mapping for file {path}. Raw: {token.SourceInfo.Markdown}"); content = token.SourceInfo.Markdown; return(content + "\n\n"); } var azureVideoInfo = azureVideoInfoMapping[token.VideoId]; content += $@"<iframe width=""{azureVideoInfo.Width}"" height=""{azureVideoInfo.Height}"" src=""{azureVideoInfo.Link}"" frameborder=""0"" allowfullscreen=""true""></iframe>"; return(content + "\n\n"); }
public override StringBuffer Render(IMarkdownRenderer render, DfmVideoBlockToken token, MarkdownBlockContext context) { return($"[!VIDEO {token.Link}]"); }
public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownNewLineBlockToken token, MarkdownBlockContext context) { return Insert(token, ExposeTokenName(token)); }
public virtual StringBuffer Render(IMarkdownRenderer render, DfmNoteBlockToken token, MarkdownBlockContext context) { return $"[!{token.NoteType}]\n"; }
public virtual StringBuffer Render(IMarkdownRenderer renderer, MarkdownTextToken token, MarkdownBlockContext context) { return Insert(token, $"{ExposeTokenName(token)}>{Escape(token.Content)}"); }
public virtual StringBuffer Render(IMarkdownRenderer render, DfmSectionBlockToken token, MarkdownBlockContext context) { return string.IsNullOrEmpty(token.Attributes) ? "[!div]\n" : $"[!div {token.Attributes}]\n"; }
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 renderer, DfmTabGroupBlockToken token, MarkdownBlockContext context) { var result = StringBuffer.Empty; foreach (var item in token.Items) { result += "#### ["; foreach (var contentItem in item.Title.Content.Tokens) { result += renderer.Render(contentItem); } result += "](#tab/"; result += item.Id; if (string.IsNullOrEmpty(item.Condition)) { result += "/"; result += item.Condition; } result += ")\n"; foreach (var contentItem in item.Content.Content) { result += renderer.Render(contentItem); } } result += "* * *\n"; return result; }
public virtual StringBuffer Render(IMarkdownRenderer renderer, DfmNoteBlockToken token, MarkdownBlockContext context) { return(Insert(token, $"{ExposeTokenNameInDfm(token)}>{Escape(token.Content)}")); }