|
|
- using System;
- using System.Globalization;
- using System.Linq;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Web;
-
- public class PostHandler : IHttpHandler
- {
- public void ProcessRequest(HttpContext context)
- {
- if (!context.User.Identity.IsAuthenticated || Blog.MatchesUniqueId(context))
- throw new HttpException(403, "No access");
-
- string mode = context.Request.QueryString["mode"];
- string id = context.Request.Form["id"];
-
- if (mode == "delete")
- {
- DeletePost(id);
- }
- else if (mode == "save")
- {
- EditPost(id, context.Request.Form["title"], context.Request.Form["content"], bool.Parse(context.Request.Form["isPublished"]), context.Request.Form["categories"].Split(','));
- }
- }
-
- private void DeletePost(string id)
- {
- Post post = Storage.GetAllPosts().FirstOrDefault(p => p.ID == id);
-
- if (post == null)
- throw new HttpException(404, "The post does not exist");
-
- Storage.Delete(post);
- }
-
- private void EditPost(string id, string title, string content, bool isPublished, string[] categories)
- {
- Post post = Storage.GetAllPosts().FirstOrDefault(p => p.ID == id);
-
- if (post != null)
- {
- post.Title = title;
- post.Content = content;
- post.Categories = categories;
- }
- else
- {
- post = new Post() { Title = title, Content = content, Slug = CreateSlug(title), Categories = categories };
- HttpContext.Current.Response.Write(post.Url);
- }
-
- SaveFilesToDisk(post);
-
- post.IsPublished = isPublished;
- Storage.Save(post);
- }
-
- private void SaveFilesToDisk(Post post)
- {
- foreach (Match match in Regex.Matches(post.Content, "(src|href)=\"(data:([^\"]+))\""))
- {
- string extension = Regex.Match(match.Value, "data:([^/]+)/([a-z]+);base64").Groups[2].Value;
-
- byte[] bytes = ConvertToBytes(match.Groups[2].Value);
- string path = Blog.SaveFileToDisk(bytes, extension);
-
- string value = string.Format("src=\"{0}\" alt=\"\" /", path);
-
- if (match.Groups[1].Value == "href")
- value = string.Format("href=\"{0}\"", path);
-
- post.Content = post.Content.Replace(match.Value, value);
- }
- }
-
- private byte[] ConvertToBytes(string base64)
- {
- int index = base64.IndexOf("base64,", StringComparison.Ordinal) + 7;
- return Convert.FromBase64String(base64.Substring(index));
- }
-
- public static string CreateSlug(string title)
- {
- title = title.ToLowerInvariant().Replace(" ", "-");
- title = RemoveDiacritics(title);
- title = Regex.Replace(title, @"([^0-9a-z-])", string.Empty);
-
- if (Storage.GetAllPosts().Any(p => string.Equals(p.Slug, title)))
- throw new HttpException(409, "Already in use");
-
- return title.ToLowerInvariant();
- }
-
- static string RemoveDiacritics(string text)
- {
- var normalizedString = text.Normalize(NormalizationForm.FormD);
- var stringBuilder = new StringBuilder();
-
- foreach (var c in normalizedString)
- {
- var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
- if (unicodeCategory != UnicodeCategory.NonSpacingMark)
- {
- stringBuilder.Append(c);
- }
- }
-
- return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
- }
-
- public bool IsReusable
- {
- get { return false; }
- }
- }
|