You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

212 lines
6.8 KiB

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;
}
}
}