the delete-ening

This commit is contained in:
tparnell
2019-01-30 09:27:28 -05:00
parent ab9c9fdc90
commit b7486dcc85
9 changed files with 9 additions and 183 deletions

View File

@@ -1,23 +0,0 @@
using Microsoft.SyndicationFeed;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using TerribleDev.Blog.Web.Models;
namespace TerribleDev.Blog.Web
{
public static class IPostExtensions
{
public static SyndicationItem ToSyndicationItem(this IPost x)
{
return new SyndicationItem()
{
Title = x.Title,
Description = x.Content.ToString(),
Id = $"https://blog.terribledev.io/{x.Url}",
Published = x.PublishDate
};
}
}
}

View File

@@ -1,7 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

View File

@@ -1,73 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.IO;
using TerribleDev.Blog.Web.Models;
using YamlDotNet.Serialization;
using Microsoft.AspNetCore.Html;
using Markdig;
using TerribleDev.Blog.MarkdownPlugins;
namespace TerribleDev.Blog.Web
{
public class BlogFactory
{
public List<IPost> GetAllPosts()
{
// why didn't I use f# I'd have a pipe operator by now
var posts = GetPosts();
var postsAsText = posts.Select(GetFileText);
return Task.WhenAll(postsAsText).Result.AsParallel().Select(b => ParsePost(b.text, b.fileInfo.Name)).ToList();
}
private static async Task<(string text, FileInfo fileInfo)> GetFileText(string filePath)
{
var fileInfo = new FileInfo(filePath);
var text = await File.ReadAllTextAsync(fileInfo.FullName);
return (text, fileInfo);
}
public IEnumerable<string> GetPosts() => Directory.EnumerateFiles(Path.Combine(Directory.GetCurrentDirectory(), "Posts"), "*.md", SearchOption.TopDirectoryOnly);
public PostSettings ParseYaml(string ymlText)
{
var serializer = new DeserializerBuilder().Build();
return serializer.Deserialize<PostSettings>(ymlText);
}
public IPost ParsePost(string postText, string fileName)
{
var splitFile = postText.Split("---");
var ymlRaw = splitFile[0];
var markdownText = string.Join("", splitFile.Skip(1));
List<string> postImages = new List<string>();
var pipeline = new MarkdownPipelineBuilder()
.Use<TargetLinkExtension>()
.Use<ImageRecorder>(new ImageRecorder(postImages))
.UseMediaLinks()
.UseEmojiAndSmiley()
.Build();
var postContent = Markdown.ToHtml(markdownText, pipeline);
var postContentPlain = String.Join("", Markdown.ToPlainText(markdownText, pipeline).Split("<!-- more -->"));
var postSettings = ParseYaml(ymlRaw);
var resolvedUrl = !string.IsNullOrWhiteSpace(postSettings.permalink) ? postSettings.permalink : fileName.Split('.')[0].Replace(' ', '-').WithoutSpecialCharacters();
var summary = postContent.Split("<!-- more -->")[0];
var postSummaryPlain = postContentPlain.Split("<!-- more -->")[0];
return new Post()
{
PublishDate = postSettings.date.ToUniversalTime(),
tags = postSettings.tags?.Select(a => a.Replace(' ', '-').WithoutSpecialCharacters().ToLower()).ToList() ?? new List<string>(),
Title = postSettings.title,
Url = resolvedUrl,
Content = new HtmlString(postContent),
Summary = new HtmlString(summary),
SummaryPlain = postSummaryPlain,
SummaryPlainShort = (postContentPlain.Length <= 147 ? postContentPlain : postContentPlain.Substring(0, 146)) + "...",
ContentPlain = postContentPlain,
Images = postImages.Distinct().Select(a => a.StartsWith('/') ? a : $"/{resolvedUrl}/{a}").ToList()
};
}
}
}

View File

@@ -1,14 +0,0 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using TerribleDev.Blog.Web.Models;
namespace TerribleDev.Blog.Web
{
public interface IBlogFactory
{
Task<IEnumerable<IPost>> GetAllPosts();
IEnumerable<string> GetPosts();
IPost ParsePost(string postText, string fileName);
IPostSettings ParseYaml(string ymlText);
}
}

View File

@@ -1,23 +0,0 @@
using Microsoft.AspNetCore.Html;
using YamlDotNet.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace TerribleDev.Blog.Web.Models
{
public interface IPost
{
string Url { get; set; }
string Title { get; set; }
HtmlString Summary { get; set; }
DateTime PublishDate { get; set; }
HtmlString Content { get; set; }
string ContentPlain { get; set; }
string SummaryPlain { get; set; }
string SummaryPlainShort { get; set; }
IList<string> tags { get; set; }
IList<string> Images { get; set;}
}
}

View File

@@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
namespace TerribleDev.Blog.Web.Models
{
public interface IPostSettings
{
string id { get; set; }
List<string> tags { get; set; }
string title { get; set; }
string permalink { get; set; }
string thumbnailImage { get; set; }
DateTimeOffset date { get; set; }
DateTimeOffset updated { get; set; }
}
}

View File

@@ -1,22 +0,0 @@
using Microsoft.AspNetCore.Html;
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace TerribleDev.Blog.Web.Models
{
[DebuggerDisplay("{Title}")]
public class Post : IPost
{
public string Url { get; set; }
public string Title { get; set; }
public DateTime PublishDate { get; set; }
public HtmlString Content { get; set; }
public HtmlString Summary { get; set; }
public string ContentPlain { get; set; }
public string SummaryPlain { get; set; }
public string SummaryPlainShort { get; set; }
public IList<string> tags { get; set; }
public IList<string> Images { get; set;}
}
}

View File

@@ -40,4 +40,8 @@
<ProjectReference Include="..\..\TerribleDev.Blog.MarkdownPlugins\TerribleDev.Blog.MarkdownPlugins.csproj" />
<ProjectReference Include="..\TerribleDev.Blog.Core\TerribleDev.Blog.Core.fsproj" />
</ItemGroup>
<ItemGroup>
<Compile Remove="Factories\BlogFactory.cs" />
<Compile Remove="Extensions\IPostExtensions.cs" />
</ItemGroup>
</Project>

View File

@@ -1,13 +1,13 @@
@model Dictionary<string, List<IPost>>
@model Dictionary<string, List<TerribleDev.Blog.Core.Models.Post>>
@{
ViewData["Title"] = "all-tags";
}
<h2>All Tags</h2>
<cache>
@foreach (var tag in Model.Keys)
{
<a href="/tag/@tag/" class="btn block">@tag</a>
}
@foreach (var tag in Model.Keys)
{
<a href="/tag/@tag/" class="btn block">@tag</a>
}
</cache>
@section Head {
<partial name="StockMeta" />