|
|
- using System;
- using System.Collections.Generic;
- using System.Configuration;
- using System.IO;
- using System.Linq;
- using System.Web;
- using System.Web.Caching;
- using System.Web.Hosting;
-
- public static class Blog
- {
- static Blog()
- {
- Theme = ConfigurationManager.AppSettings.Get("blog:theme");
- Title = ConfigurationManager.AppSettings.Get("blog:name");
- Description = ConfigurationManager.AppSettings.Get("blog:description");
- PostsPerPage = int.Parse(ConfigurationManager.AppSettings.Get("blog:postsPerPage"));
- DaysToComment = int.Parse(ConfigurationManager.AppSettings.Get("blog:daysToComment"));
- Image = ConfigurationManager.AppSettings.Get("blog:image");
- ModerateComments = bool.Parse(ConfigurationManager.AppSettings.Get("blog:moderateComments"));
- }
-
- public static string Title { get; private set; }
- public static string Description { get; private set; }
- public static string Theme { get; private set; }
- public static string Image { get; private set; }
- public static int PostsPerPage { get; private set; }
- public static int DaysToComment { get; private set; }
- public static bool ModerateComments { get; private set; }
-
- public static int UniqueId
- {
- get { return FingerPrint("/web.config").GetHashCode(); }
- }
-
- public static string CurrentSlug
- {
- get { return (HttpContext.Current.Request.QueryString["slug"] ?? string.Empty).Trim().ToLowerInvariant(); }
- }
-
- public static string CurrentCategory
- {
- get { return (HttpContext.Current.Request.QueryString["category"] ?? string.Empty).Trim().ToLowerInvariant(); }
- }
-
- public static bool IsNewPost
- {
- get { return HttpContext.Current.Request.RawUrl.Trim('/') == "post/new"; }
- }
-
- public static Post CurrentPost
- {
- get
- {
- if (HttpContext.Current.Items["currentpost"] == null && !string.IsNullOrEmpty(CurrentSlug))
- {
- var post = Storage.GetAllPosts().FirstOrDefault(p => p.Slug == CurrentSlug);
-
- if (post != null && (post.IsPublished || HttpContext.Current.User.Identity.IsAuthenticated))
- HttpContext.Current.Items["currentpost"] = Storage.GetAllPosts().FirstOrDefault(p => p.Slug == CurrentSlug);
- }
-
- return HttpContext.Current.Items["currentpost"] as Post;
- }
- }
-
- public static string GetNextPage()
- {
- if (!string.IsNullOrEmpty(CurrentSlug))
- {
- var current = Storage.GetAllPosts().IndexOf(CurrentPost);
- if (current > 0)
- return Storage.GetAllPosts()[current - 1].Url.ToString();
- }
- else if (CurrentPage > 1)
- {
- return GetPagingUrl(-1);
- }
-
- return null;
- }
-
- public static string GetPrevPage()
- {
- if (!string.IsNullOrEmpty(CurrentSlug))
- {
- var current = Storage.GetAllPosts().IndexOf(CurrentPost);
- if (current > -1)
- return Storage.GetAllPosts()[current + 1].Url.ToString();
- }
- else
- {
- return GetPagingUrl(1);
- }
-
- return null;
- }
-
- public static int CurrentPage
- {
- get
- {
- int page = 0;
- if (int.TryParse(HttpContext.Current.Request.QueryString["page"], out page))
- return page;
-
- return 1;
- }
- }
-
- public static IEnumerable<Post> GetPosts(int postsPerPage = 0)
- {
- var posts = from p in Storage.GetAllPosts()
- where (p.IsPublished && p.PubDate <= DateTime.UtcNow) || HttpContext.Current.User.Identity.IsAuthenticated
- select p;
-
- string category = HttpContext.Current.Request.QueryString["category"];
-
- if (!string.IsNullOrEmpty(category))
- {
- posts = posts.Where(p => p.Categories.Any(c => string.Equals(c, category, StringComparison.OrdinalIgnoreCase)));
- }
-
- if (postsPerPage > 0)
- {
- posts = posts.Skip(postsPerPage * (CurrentPage - 1)).Take(postsPerPage);
- }
-
- return posts;
- }
-
- public static bool MatchesUniqueId(HttpContext context)
- {
- int token;
- return int.TryParse(context.Request.Form["token"], out token) && token == Blog.UniqueId;
- }
-
- public static string SaveFileToDisk(byte[] bytes, string extension)
- {
- string relative = "~/posts/files/" + Guid.NewGuid() + "." + extension.Trim('.');
- string file = HostingEnvironment.MapPath(relative);
-
- File.WriteAllBytes(file, bytes);
-
- var cruncher = new ImageCruncher.Cruncher();
- cruncher.CrunchImages(file);
-
- return VirtualPathUtility.ToAbsolute(relative);
- }
-
- public static string GetPagingUrl(int move)
- {
- string url = "/page/{0}/";
- string category = HttpContext.Current.Request.QueryString["category"];
-
- if (!string.IsNullOrEmpty(category))
- {
- url = "/category/" + HttpUtility.UrlEncode(category.ToLowerInvariant()) + "/" + url;
- }
-
- string relative = string.Format("~" + url, Blog.CurrentPage + move);
- return VirtualPathUtility.ToAbsolute(relative);
- }
-
- public static string FingerPrint(string rootRelativePath, string cdnPath = "")
- {
- if (!string.IsNullOrEmpty(cdnPath) && !HttpContext.Current.IsDebuggingEnabled)
- {
- return cdnPath;
- }
-
- if (HttpRuntime.Cache[rootRelativePath] == null)
- {
- string relative = VirtualPathUtility.ToAbsolute("~" + rootRelativePath);
- string absolute = HostingEnvironment.MapPath(relative);
-
- if (!File.Exists(absolute))
- {
- throw new FileNotFoundException("File not found", absolute);
- }
-
- DateTime date = File.GetLastWriteTime(absolute);
- int index = relative.LastIndexOf('/');
-
- string result = relative.Insert(index, "/v-" + date.Ticks);
-
- HttpRuntime.Cache.Insert(rootRelativePath, result, new CacheDependency(absolute));
- }
-
- return HttpRuntime.Cache[rootRelativePath] as string;
- }
-
- public static void SetConditionalGetHeaders(DateTime lastModified, HttpContextBase context)
- {
- HttpResponseBase response = context.Response;
- HttpRequestBase request = context.Request;
- lastModified = new DateTime(lastModified.Year, lastModified.Month, lastModified.Day, lastModified.Hour, lastModified.Minute, lastModified.Second);
-
- string incomingDate = request.Headers["If-Modified-Since"];
-
- response.Cache.SetLastModified(lastModified);
-
- DateTime testDate = DateTime.MinValue;
-
- if (DateTime.TryParse(incomingDate, out testDate) && testDate == lastModified)
- {
- response.ClearContent();
- response.StatusCode = (int)System.Net.HttpStatusCode.NotModified;
- response.SuppressContent = true;
- }
- }
- }
|