using dashing.net.App_Start; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Linq; using System.Text; using System.Web; using System.Web.Optimization; namespace dashing.net.Infrastructure { public static class DashingStyles { public static IHtmlString Render(string renderName) { StringBuilder sb = new StringBuilder(); BundleResolver resolver = new BundleResolver(BundleTable.Bundles); List cont = new List(); cont.Add("~/Assets/stylesheets/font-awesome.css"); cont.Add("~/Assets/stylesheets/jquery.gridster.css"); string widgetPath = string.Format("{0}/Widgets", HttpRuntime.AppDomainAppPath); cont.AddRange(ScssToCss(HttpRuntime.AppDomainAppPath, Directory.GetFiles(widgetPath, "*.scss", SearchOption.AllDirectories))); cont.AddRange(ScssToCss(HttpRuntime.AppDomainAppPath, new string[] { string.Format("{0}/Assets/stylesheets/application.scss", HttpRuntime.AppDomainAppPath) })); foreach (string s in cont) { sb.AppendLine(string.Format(@"", s.TrimStart(new char[] { '~' }).Replace(HttpRuntime.AppDomainAppPath, ""))); } HtmlString result = new HtmlString(sb.ToString()); return result; } internal static string[] ScssToCss(string basePath, string[] scssFiles) { List result = new List(); foreach (string scssFile in scssFiles) { FileInfo fi = new FileInfo(scssFile); string fileBaseName = scssFile.Substring(0, scssFile.Length - fi.Extension.Length); string cssFileName = string.Format("{0}.{1}", fileBaseName, "css"); bool doUpdate = (File.Exists(cssFileName) == false); if (doUpdate == false) { FileInfo cssFi = new FileInfo(cssFileName); if (fi.LastWriteTime > cssFi.LastWriteTime) { doUpdate = true; } } if (doUpdate) { ParseCss(scssFile, cssFileName); } result.Add(cssFileName.Substring(basePath.Length).Replace('\\','/')); } return result.ToArray(); } internal static void ParseCss(string sourceFile, string destinationFile) { try { string data = File.ReadAllText(sourceFile); StringBuilder sb = new StringBuilder(); StringDictionary dictionary = new StringDictionary(); List prefixes = new List(); int semiColonCounter = 0; foreach (string d in data.Split(new char[] { '\r', '\n' })) { string writeResult = d; if (writeResult.Trim().StartsWith("$")) { string key = writeResult.Substring(0, writeResult.IndexOf(':')).Trim(); string val = writeResult.Substring(writeResult.IndexOf(':')).Trim().TrimEnd(new char[] { ';' }); if (val.Length > 0) val = val.Substring(1); dictionary.Add(key, val); writeResult = ""; } else if (writeResult.Trim().StartsWith("//")) { writeResult = ""; } else { foreach (string k in dictionary.Keys) { writeResult = writeResult.Replace(k, dictionary[k]); } if (writeResult.Trim().EndsWith("{")) { semiColonCounter++; prefixes.Add(writeResult.Trim().TrimEnd(new char[] { ' ', '{' })); string preFix = ""; foreach (string s in prefixes) { preFix += s + " "; } writeResult = string.Format("{0}{1}{{", semiColonCounter > 1 ? "}\r\n" : "", preFix.Trim()); semiColonCounter -= (semiColonCounter > 1 ? 1 : 0); } else if (writeResult.Trim().Equals("}") && writeResult.Contains("{") == false) { if (prefixes.Count > 0) { prefixes.RemoveAt(prefixes.Count - 1); } if (semiColonCounter > 1) { semiColonCounter--; } else { writeResult = ""; } } } if (string.IsNullOrEmpty(writeResult) == false) { sb.AppendLine(writeResult); } } while (semiColonCounter > 0) { sb.AppendLine("}"); semiColonCounter--; } File.WriteAllText(destinationFile, sb.ToString()); } catch(Exception x) { HttpContext.Current.Response.Write(x.ToString()); } } } }