From 728ef5b30d3a1a02822158e0143422482cda1400 Mon Sep 17 00:00:00 2001 From: Tommy Parnell Date: Thu, 14 Feb 2019 23:23:45 -0500 Subject: [PATCH] stop --- .../Factories/BlogFactory.cs | 8 +- .../Factories/HighlightFactory.cs | 15 ++++ .../Processors/JavaScriptProcessor.cs | 15 ++++ .../MarkExtension/CodeRecorder.cs | 25 ++++-- src/TerribleDev.Blog.Web/Models/IPost.cs | 2 +- src/TerribleDev.Blog.Web/Models/Post.cs | 2 +- .../Views/Home/Post.cshtml | 9 ++ .../Views/Shared/DisplayTemplates/Post.cshtml | 11 ++- .../Views/Shared/_Layout.cshtml | 2 +- .../wwwroot/css/langHi.css | 83 +++++++++++++++++++ 10 files changed, 162 insertions(+), 10 deletions(-) create mode 100644 src/TerribleDev.Blog.Web/Factories/HighlightFactory.cs create mode 100644 src/TerribleDev.Blog.Web/Factories/Processors/JavaScriptProcessor.cs create mode 100644 src/TerribleDev.Blog.Web/wwwroot/css/langHi.css diff --git a/src/TerribleDev.Blog.Web/Factories/BlogFactory.cs b/src/TerribleDev.Blog.Web/Factories/BlogFactory.cs index 9d31504..f1265ec 100644 --- a/src/TerribleDev.Blog.Web/Factories/BlogFactory.cs +++ b/src/TerribleDev.Blog.Web/Factories/BlogFactory.cs @@ -11,11 +11,13 @@ using TerribleDev.Blog.Web.MarkExtension.TerribleDev.Blog.Web.ExternalLinkParser using TerribleDev.Blog.Web.MarkExtension; using Microsoft.AspNetCore.Hosting; using System.Diagnostics; +using TerribleDev.Blog.Web.Factories; namespace TerribleDev.Blog.Web { public class BlogFactory { + private HighlightFactory highlightFactory = new HighlightFactory(); public List GetAllPosts(string domain) { // why didn't I use f# I'd have a pipe operator by now @@ -47,16 +49,19 @@ namespace TerribleDev.Blog.Web var markdownText = string.Join("", splitFile.Skip(1)); var postSettings = ParseYaml(ymlRaw); var resolvedUrl = !string.IsNullOrWhiteSpace(postSettings.permalink) ? postSettings.permalink : fileName.Split('.')[0].Replace(' ', '-').WithoutSpecialCharacters(); + var codeBlocks = new List(); List postImages = new List(); var pipeline = new MarkdownPipelineBuilder() .Use(new AbsoluteLinkConverter(resolvedUrl, domain)) .Use(new ImageRecorder(ref postImages)) .Use() .Use() + .Use(new CodeRecorder(ref codeBlocks)) .UseMediaLinks() .UseEmojiAndSmiley() .Build(); var postContent = Markdown.ToHtml(markdownText, pipeline); + var postContentHighlighted = highlightFactory.Highlight(postContent); var postContentPlain = String.Join("", Markdown.ToPlainText(markdownText, pipeline).Split("")); var summary = postContent.Split("")[0]; @@ -73,7 +78,8 @@ namespace TerribleDev.Blog.Web SummaryPlain = postSummaryPlain, SummaryPlainShort = (postContentPlain.Length <= 147 ? postContentPlain : postContentPlain.Substring(0, 146)) + "...", ContentPlain = postContentPlain, - Images = postImages.Distinct().ToList() + Images = postImages.Distinct().ToList(), + CodeBlockLangs = codeBlocks }; } } diff --git a/src/TerribleDev.Blog.Web/Factories/HighlightFactory.cs b/src/TerribleDev.Blog.Web/Factories/HighlightFactory.cs new file mode 100644 index 0000000..ee9863b --- /dev/null +++ b/src/TerribleDev.Blog.Web/Factories/HighlightFactory.cs @@ -0,0 +1,15 @@ +using System.Text.RegularExpressions; + +namespace TerribleDev.Blog.Web.Factories +{ + public class HighlightFactory + { + private Regex codeFenceLang = new Regex("(?=(.*?)(?=))", RegexOptions.Compiled | RegexOptions.Singleline); + public string Highlight(string input) + { + return codeFenceLang.Replace(input, m => { + return m.ToString(); + }); + } + } +} \ No newline at end of file diff --git a/src/TerribleDev.Blog.Web/Factories/Processors/JavaScriptProcessor.cs b/src/TerribleDev.Blog.Web/Factories/Processors/JavaScriptProcessor.cs new file mode 100644 index 0000000..5f984a5 --- /dev/null +++ b/src/TerribleDev.Blog.Web/Factories/Processors/JavaScriptProcessor.cs @@ -0,0 +1,15 @@ +using System.Text.RegularExpressions; + +namespace TerribleDev.Blog.Web.Factories.Processors +{ + public class JavaScriptProcessor + { + private Regex keywordRegex = new Regex(@"\b(in|of|if|for|while|finally|var|new|function|do|return|void|else|break|catch|instanceof|with|throw|case|default|try|this|switch|continue|typeof|delete|let|yield|const|export|super|debugger|as|async|await|static|import|from|as|)(?=[^\w])", RegexOptions.Compiled | RegexOptions.Multiline); + private Regex literalRegex = new Regex(@"\b(true|false|null|undefined|NaN|Infinity)(?=[^\w])", RegexOptions.Compiled | RegexOptions.Multiline); + private Regex[] quoteMarkRegexes = new Regex[]{ new Regex("(.*?)", RegexOptions.Compiled | RegexOptions.Multiline), new Regex(@"'(.*?)'", RegexOptions.Compiled | RegexOptions.Multiline)}; + public string Process(string input) + { + return input; + } + } +} \ No newline at end of file diff --git a/src/TerribleDev.Blog.Web/MarkExtension/CodeRecorder.cs b/src/TerribleDev.Blog.Web/MarkExtension/CodeRecorder.cs index 03029c9..a91b6dc 100644 --- a/src/TerribleDev.Blog.Web/MarkExtension/CodeRecorder.cs +++ b/src/TerribleDev.Blog.Web/MarkExtension/CodeRecorder.cs @@ -1,16 +1,20 @@ +using System; +using System.Collections.Generic; using Markdig; using Markdig.Renderers; +using Markdig.Renderers.Html; +using Markdig.Syntax; namespace TerribleDev.Blog.Web.MarkExtension { public class CodeRecorder : IMarkdownExtension { - public CodeRecorder (ref bool hasCode) + public CodeRecorder(ref List codeLanguages) { - HasCode = hasCode; + CodeLanguages = codeLanguages; } - private bool HasCode; + public List CodeLanguages { get; } public void Setup(MarkdownPipelineBuilder pipeline) { @@ -21,12 +25,23 @@ namespace TerribleDev.Blog.Web.MarkExtension var htmlRenderer = renderer as HtmlRenderer; if (htmlRenderer != null) { - var inlineRenderer = htmlRenderer.ObjectRenderers.FindExact(); + var inlineRenderer = htmlRenderer.ObjectRenderers.FindExact(); if (inlineRenderer != null) { - inlineRenderer.TryWriters.Add(TryLinkInlineRenderer); + inlineRenderer.TryWriters.Add(TryWriter); } } } + + private bool TryWriter(HtmlRenderer renderer, CodeBlock block) + { + var fencedBlock = block as FencedCodeBlock; + if(fencedBlock == null || fencedBlock.Info == null) + { + return false; + } + CodeLanguages.Add(fencedBlock.Info ?? ""); + return false; + } } } \ No newline at end of file diff --git a/src/TerribleDev.Blog.Web/Models/IPost.cs b/src/TerribleDev.Blog.Web/Models/IPost.cs index d2a8446..8a9fb48 100644 --- a/src/TerribleDev.Blog.Web/Models/IPost.cs +++ b/src/TerribleDev.Blog.Web/Models/IPost.cs @@ -19,6 +19,6 @@ namespace TerribleDev.Blog.Web.Models string SummaryPlainShort { get; set; } IList tags { get; set; } IList Images { get; set;} - bool HasCode { get; set; } + IList CodeBlockLangs { get; set; } } } diff --git a/src/TerribleDev.Blog.Web/Models/Post.cs b/src/TerribleDev.Blog.Web/Models/Post.cs index 95ef4e4..ea9794d 100644 --- a/src/TerribleDev.Blog.Web/Models/Post.cs +++ b/src/TerribleDev.Blog.Web/Models/Post.cs @@ -18,6 +18,6 @@ namespace TerribleDev.Blog.Web.Models public string SummaryPlainShort { get; set; } public IList tags { get; set; } public IList Images { get; set;} - public bool HasCode { get; set; } + public IList CodeBlockLangs { get; set; } } } diff --git a/src/TerribleDev.Blog.Web/Views/Home/Post.cshtml b/src/TerribleDev.Blog.Web/Views/Home/Post.cshtml index 7c107a3..1bfec73 100644 --- a/src/TerribleDev.Blog.Web/Views/Home/Post.cshtml +++ b/src/TerribleDev.Blog.Web/Views/Home/Post.cshtml @@ -31,4 +31,13 @@ } + @if(Model.CodeBlockLangs.Count > 0) + { + } } +@section Scripts +{ + @if(Model.CodeBlockLangs.Count > 0) + { + } +} \ No newline at end of file diff --git a/src/TerribleDev.Blog.Web/Views/Shared/DisplayTemplates/Post.cshtml b/src/TerribleDev.Blog.Web/Views/Shared/DisplayTemplates/Post.cshtml index ce30b13..1cab061 100644 --- a/src/TerribleDev.Blog.Web/Views/Shared/DisplayTemplates/Post.cshtml +++ b/src/TerribleDev.Blog.Web/Views/Shared/DisplayTemplates/Post.cshtml @@ -1,4 +1,5 @@ -@model IPost +@using Newtonsoft.Json +@model IPost

@Model.Title

@@ -15,4 +16,12 @@ } + +
+            
+                @JsonConvert.SerializeObject(Model, Formatting.Indented)
+            
+        
+
+
\ No newline at end of file diff --git a/src/TerribleDev.Blog.Web/Views/Shared/_Layout.cshtml b/src/TerribleDev.Blog.Web/Views/Shared/_Layout.cshtml index c7fff93..9fadf55 100644 --- a/src/TerribleDev.Blog.Web/Views/Shared/_Layout.cshtml +++ b/src/TerribleDev.Blog.Web/Views/Shared/_Layout.cshtml @@ -36,12 +36,12 @@ @RenderBody() - @RenderSection("Scripts", required: false) + @RenderSection("Scripts", required: false) diff --git a/src/TerribleDev.Blog.Web/wwwroot/css/langHi.css b/src/TerribleDev.Blog.Web/wwwroot/css/langHi.css new file mode 100644 index 0000000..a4a6f91 --- /dev/null +++ b/src/TerribleDev.Blog.Web/wwwroot/css/langHi.css @@ -0,0 +1,83 @@ +.hljs, +.hljs-subst { + color: #444; +} + +.hljs-comment { + color: #888888; +} + +.hljs-keyword, +.hljs-attribute, +.hljs-selector-tag, +.hljs-meta-keyword, +.hljs-doctag, +.hljs-name { + font-weight: bold; +} + + +/* User color: hue: 0 */ + +.hljs-type, +.hljs-string, +.hljs-number, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #880000; +} + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; +} + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #BC6060; +} + + +/* Language color: hue: 90; */ + +.hljs-literal { + color: #78A960; +} + +.hljs-built_in, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #397300; +} + + +/* Meta color: hue: 200 */ + +.hljs-meta { + color: #1f7199; +} + +.hljs-meta-string { + color: #4d99bf; +} + + +/* Misc effects */ + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} \ No newline at end of file