// -------------------------------------------------------------------------------------------------------------------- // // Copyright (c) James South. // Licensed under the Apache License, Version 2.0. // // // The image helpers. // // -------------------------------------------------------------------------------------------------------------------- namespace ImageProcessor.Web.Helpers { using System.Linq; using System.Text; using System.Text.RegularExpressions; using ImageProcessor.Configuration; using ImageProcessor.Imaging.Formats; using ImageProcessor.Web.Configuration; using ImageProcessor.Web.Processors; /// /// The image helpers. /// public static class ImageHelpers { /// /// The regex pattern. /// public static readonly string ExtensionRegexPattern = BuildExtensionRegexPattern(); /// /// The image format regex. /// private static readonly Regex FormatRegex = new Regex(@"(\.?)(png8|" + ExtensionRegexPattern + ")", RegexOptions.IgnoreCase | RegexOptions.RightToLeft); /// /// The image format regex for matching the file format at the end of a string. /// private static readonly Regex EndFormatRegex = new Regex(@"(\.)" + ExtensionRegexPattern + "$", RegexOptions.IgnoreCase | RegexOptions.RightToLeft); /// /// Checks a given string to check whether the value contains a valid image extension. /// /// The string containing the filename to check. /// True the value contains a valid image extension, otherwise false. public static bool IsValidImageExtension(string fileName) { return EndFormatRegex.IsMatch(fileName); } /// /// Returns the correct file extension for the given string input /// /// /// The string to parse. /// /// /// The querystring containing instructions. /// /// /// The correct file extension for the given string input if it can find one; otherwise an empty string. /// public static string GetExtension(string fullPath, string queryString) { Match match = null; // First check to see if the format processor is being used and test against that. IWebGraphicsProcessor format = ImageProcessorConfiguration.Instance.GraphicsProcessors .FirstOrDefault(p => typeof(Format) == p.GetType()); if (format != null) { match = format.RegexPattern.Match(queryString); } if (match == null || !match.Success) { // Test against the path minus the querystring so any other // processors don't interere. string trimmed = fullPath; if (queryString != null) { trimmed = trimmed.Replace(queryString, string.Empty); } match = FormatRegex.Match(trimmed); } if (match.Success) { string value = match.Value; // Clip if format processor match. if (match.Value.Contains("=")) { value = value.Split('=')[1]; } // Ah the enigma that is the png file. if (value.ToLowerInvariant().EndsWith("png8")) { return "png"; } return value; } return string.Empty; } /// /// Builds a regular expression from the type, this allows extensibility. /// /// /// The to match matrix filters. /// private static string BuildExtensionRegexPattern() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("("); int counter = 0; foreach (ISupportedImageFormat imageFormat in ImageProcessorBootstrapper.Instance.SupportedImageFormats) { foreach (string fileExtension in imageFormat.FileExtensions) { if (counter == 0) { stringBuilder.Append(fileExtension.ToLowerInvariant()); } else { stringBuilder.AppendFormat("|{0}", fileExtension.ToLowerInvariant()); } } counter++; } stringBuilder.Append(")"); return stringBuilder.ToString(); } } }