private static string ColorizeCode(string html) { var colorizer = new CodeColorizer(); var sb = new StringBuilder(); var pos = html.IndexOf("<pre><code>", StringComparison.Ordinal); if (pos > -1) { var lastPos = 0; sb.Append(html.Substring(0, pos)); while (pos > -1) { lastPos = html.IndexOf("</code></pre>", pos, StringComparison.Ordinal); var snippet = html.Substring(pos + 11, lastPos - pos - 11); var colorizedSnippet = colorizer.Colorize(snippet, Languages.CSharp); sb.Append(colorizedSnippet); pos = html.IndexOf("<pre><code>", lastPos, StringComparison.Ordinal); } sb.Append(html.Substring(lastPos + 13)); html = sb.ToString(); } return(html); }
protected virtual string FormatAndColorize(string value, ILanguage language = null) { var output = new StringBuilder(); foreach (var line in value.Split(new[] { "\n" }, StringSplitOptions.None).Where(s => !s.StartsWith(CodeBlockMarker))) { if (language == null) { output.Append(new string(' ', 4)); } if (line == "\n") { output.AppendLine(); } else { output.AppendLine(line); } } return(language != null ? _syntaxHighlighter.Colorize(output.ToString().Trim(), language) : output.ToString()); }
private string ApplySyntaxHighlighting(string languageMoniker, string firstLine, string code, bool useDefault) { var languageTypeAdapter = new LanguageTypeAdapter(); var language = languageTypeAdapter.Parse(languageMoniker, firstLine); if (language == null) { //handle unrecognised language formats, e.g. when using mermaid diagrams if (useDefault) { language = FakeIt(); } else { return(code); } } var codeBuilder = new StringBuilder(); var codeWriter = new StringWriter(codeBuilder); var styleSheet = _customCss ?? StyleSheets.Default; var colourizer = new CodeColorizer(); colourizer.Colorize(code, language, Formatters.Default, styleSheet, codeWriter); return(codeBuilder.ToString()); }
private void SaveColorizedStep(string file) { var content = File.ReadAllText(file); var html = file + ".htm"; var css = (StyleSheets.Default as DefaultStyleSheet).GetCssFile();; using (var w = File.CreateText(html)) { w.WriteLine(@"<!DOCTYPE html> <html lang=""en""> <head> <meta charset = ""utf-8""> <title>" + Path.GetFileNameWithoutExtension(file) + @"</title> <style>" + css + @" .step .number { color: red; } .type { color: blue; } </style> </head> <body>"); var cc = new CodeColorizer(); cc.Colorize(content, Languages.Step, new HtmlClassFormatter(), StyleSheets.Default, w); w.WriteLine(@"</body></html>"); w.Close(); } }
private void ShowCode(string code, NetLanguage language) { mLastCode = code; var colorizer = new CodeColorizer(); switch (language) { case NetLanguage.CSharp: browserCode.DocumentText = GetDefaultCss() + colorizer.Colorize(code, Languages.CSharp); break; case NetLanguage.VbNet: browserCode.DocumentText = GetDefaultCss() + colorizer.Colorize(code, Languages.VbDotNet); break; default: throw new ArgumentOutOfRangeException("language"); } }
protected string ColorizeFile(ExampleFile file) { var fileLower = file.Filename.ToLower(); if (fileLower.EndsWith(".cs")) { return(mColorizer.Colorize(file.Contents, Languages.CSharp)); } if (fileLower.EndsWith(".vb")) { return(mColorizer.Colorize(file.Contents, Languages.VbDotNet)); } if (fileLower.EndsWith(".xml")) { return(mColorizer.Colorize(file.Contents, Languages.Xml)); } if (fileLower.EndsWith(".htm") || fileLower.EndsWith(".html")) { return(mColorizer.Colorize(file.Contents, Languages.Html)); } if (fileLower.EndsWith(".css")) { return(mColorizer.Colorize(file.Contents, Languages.Css)); } if (fileLower.EndsWith(".sql")) { return(mColorizer.Colorize(file.Contents, Languages.Sql)); } return("<pre>" + file.Contents + "</pre>"); }
private string SyntaxHighlight(string input, string lang) { var language = LookupLanguage(lang); if (language != null) { return(_codeColorizer.Colorize(input, language)); } else { return("<pre>" + HttpUtility.HtmlEncode(input) + "</pre>"); } }
private static void Test_ColorCode() { var cc = new CodeColorizer(); var vbnet = cc.Colorize(@"Module Module1 Sub Main() Console.WriteLine(""Hallo Welt!"") End Sub End Module", Languages.VbDotNet); var html = cc.Colorize(@"", Languages.Html); var aspNet = cc.Colorize(@"", Languages.AspxCs); var css = cc.Colorize(@"", Languages.Css); var js = cc.Colorize(@"", Languages.Php); }
private static string ApplySyntaxHighlighting(string languageMoniker, string firstLine, string code) { var languageTypeAdapter = new LanguageTypeAdapter(); var language = languageTypeAdapter.Parse(languageMoniker, firstLine); var codeBuilder = new StringBuilder(); var codeWriter = new StringWriter(codeBuilder); var styleSheet = StyleSheets.Default; var colourizer = new CodeColorizer(); if (language != null) { colourizer.Colorize(code, language, Formatters.Default, styleSheet, codeWriter); } else { codeBuilder.Append(string.Format("<pre>{0}</pre>", code)); } return(codeBuilder.ToString()); }
private static string TransformCodeBlocks(string content) { var reader = new StringReader(content); var writer = new StringWriter(); var code = new StringWriter(); var line = reader.ReadLine(); var lang = ""; var inCodeBlock = false; while (line != null) { if (!line.StartsWith("```")) { if (inCodeBlock) { code.WriteLine(line); } else { writer.WriteLine(line); } line = reader.ReadLine(); continue; } if (!inCodeBlock) { lang = line.Trim('`', ' '); inCodeBlock = true; } else { var codeContent = code.ToString(); if (lang.Equals("cs", StringComparison.InvariantCultureIgnoreCase) || lang.Equals("c#", StringComparison.InvariantCultureIgnoreCase)) { cc.Colorize(codeContent, Languages.CSharp, new HtmlClassFormatter(), StyleSheets.Default, writer); } else if (lang.Equals("js", StringComparison.InvariantCultureIgnoreCase)) { cc.Colorize(codeContent, Languages.JavaScript, new HtmlClassFormatter(), StyleSheets.Default, writer); } else if (lang.Equals("step", StringComparison.InvariantCultureIgnoreCase)) { cc.Colorize(codeContent, Languages.Step, new HtmlClassFormatter(), StyleSheets.Default, writer); } else if (lang.Equals("xml", StringComparison.InvariantCultureIgnoreCase)) { cc.Colorize(codeContent, Languages.Xml, new HtmlClassFormatter(), StyleSheets.Default, writer); } else if (lang.Equals("html", StringComparison.InvariantCultureIgnoreCase)) { cc.Colorize(codeContent, Languages.Html, new HtmlClassFormatter(), StyleSheets.Default, writer); } else { codeContent = $"<pre><code>{codeContent}</code></pre>"; writer.Write(codeContent); } //clear code = new StringWriter(); inCodeBlock = false; lang = ""; } line = reader.ReadLine(); } return(writer.ToString()); }
/// <summary> /// Renders a given Markdown string, converting it into HTML for display in a WebBrowser. /// If given a list of embedded Images, it will write the images to the temp directory /// first in order to guarantee that the images are there when the HTML is displayed. /// </summary> /// <param name="inputText">The original Markdown text.</param> /// <param name="imageFolder">The folder that will contain the temporary images.</param> /// <param name="images">A list of embedded images from the database.</param> /// <returns></returns> public static string Render(string inputText, string imageFolder, IEnumerable <Image> images = null) { var md = new Markdown() { ExtraMode = true }; var color = new CodeColorizer(); var imageList = images as IList <Image> ?? images?.ToList(); if (images != null && imageList.Any()) { Directory.CreateDirectory(imageFolder); foreach (var img in imageList) { var filePath = Path.Combine(imageFolder, img.FileName); File.WriteAllBytes(filePath, img.ImageData); } } #region Decode embedded images var defaultImageLocation = imageFolder.Replace(@"\", "/"); var outputString = Regex.Replace(inputText, @"(?<=\()(dbfile:\/\/\/)(?=.*?\))", new Uri(defaultImageLocation).AbsoluteUri); #endregion outputString = md.Transform(outputString); // Remove "finalized" HTML values, since we're not done processing yet. outputString = Deconvert(outputString); #region Colorize code blocks var n = 1; var startIndex = outputString.IndexOfNth(CodeBlockStart, n); while (startIndex != -1) { var endIndex = outputString.IndexOfNth(CodeBlockEnd, n); var chunk1 = outputString.Substring(0, startIndex); var chunk2 = String.Empty; var codeText = outputString.SubstringByIndex(startIndex + CodeBlockStart.Length, endIndex - 1); ILanguage codeLanguage = null; string codeLangStr = null; if (codeText.StartsWith(LangDefinitionText)) { codeLangStr = codeText.Substring(0, codeText.IndexOf("\n")); codeLanguage = ParseCodeLanguage(codeLangStr.Trim()); } if (codeLanguage != null) { codeText = codeText.Replace(codeLangStr, String.Empty); //The Colorize method adds an extra newline, so remove it codeText = codeText.Trim(); chunk2 = color.Colorize(codeText, codeLanguage); } var chunk3 = (chunk2 == String.Empty) ? outputString.Substring(startIndex) : outputString.Substring(endIndex + CodeBlockEnd.Length); outputString = chunk1 + chunk2 + chunk3; startIndex = outputString.IndexOfNth(CodeBlockStart, ++n); } #endregion // Set the title of this HTML page to be a random name to "disable" caching, // otherwise embedded images will not always load the most recent version. // Also set the styles for tables so they have borders outputString = "<head>" + "<title>" + Guid.NewGuid() + "</title>" + "<style>" + "table, th, td { border:1px solid black; border-collapse: collapse; } " + "th, td { padding-right: 5px; padding-left: 5px; }" + "</style>" + "</head>" + outputString; return(outputString); }
private string Colorize(string original) { return(Colorizer.Colorize(original, Languages.Sql)); }