Created
July 15, 2016 09:13
-
-
Save DreamVB/2de96bb1e7700ab2335e88680295ad7e to your computer and use it in GitHub Desktop.
Compress a CSS Cascading Style Sheets With C#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* CSS Packer | |
* By Ben a.k.a DreamVB | |
* e. [email protected] | |
* | |
* This code will allow you to compress your style sheets makeing them smaller and faster to load. | |
* If you use any parts of this code let me know if it has helped you. | |
* | |
* Also open to sugestions and freedback | |
*/ | |
using System; | |
using System.Text; | |
using System.IO; | |
namespace packer | |
{ | |
class csscomp | |
{ | |
public static string NextError = string.Empty; | |
private static FileInfo fi = null; | |
private static double m_compressedSize = 0; | |
private static double m_originalSize = 0; | |
private static string FontWeightToValue(string value) | |
{ | |
string temp = value.ToUpper(); | |
if (temp == "NORMAL;") | |
{ | |
return "400;"; | |
} | |
if (temp == "BOLD;") | |
{ | |
return "700;"; | |
} | |
if (temp == "LIGHTER;") | |
{ | |
return "200;"; | |
} | |
if (temp == "LIGHT;") | |
{ | |
return "300;"; | |
} | |
if (temp == "MEDIUM;") | |
{ | |
return "500;"; | |
} | |
return value; | |
} | |
public static double OriginalSize() | |
{ | |
try | |
{ | |
return m_originalSize; | |
} | |
catch | |
{ | |
return 0; | |
} | |
} | |
public static double CompressedSize() | |
{ | |
return m_compressedSize; | |
} | |
public static double Ratio() | |
{ | |
double mRatio = CompressedSize() / OriginalSize() * 100; | |
mRatio = Math.Round(mRatio * 100) / 100; | |
return mRatio; | |
} | |
public static int CompressCSS(string InputFile, string OutputFile) | |
{ | |
string sLine = string.Empty; | |
StringBuilder sb = new StringBuilder(); | |
string[] parms = { }; | |
string[] cssFont = { }; | |
int sPos = -1; | |
fi = new FileInfo(InputFile); | |
//Resize parms array | |
parms = new string[2]; | |
try | |
{ | |
//Get original size | |
m_originalSize = fi.Length; | |
//Open source file. | |
using (StreamReader sr = new StreamReader(File.OpenRead(fi.FullName))) | |
{ | |
while (!sr.EndOfStream) | |
{ | |
sPos = -1; | |
//Trim down the line. | |
sLine = sr.ReadLine().Trim(); | |
if (sLine.Length > 0) | |
{ | |
//Check for single line comments | |
if (sLine.StartsWith("//")) | |
{ | |
sLine = string.Empty; | |
} | |
if (sLine.StartsWith("/*")) | |
{ | |
sLine = string.Empty; | |
} | |
//Get position of css key and value. | |
sPos = sLine.IndexOf(":"); | |
if (sPos != -1) | |
{ | |
//Tidy the string | |
parms[0] = sLine.Substring(0, sPos).Trim(); | |
parms[1] = sLine.Substring(sPos + 1).Trim(); | |
//Compress font weaight | |
if (parms[0].ToUpper() == "FONT-WEIGHT") | |
{ | |
parms[1] = FontWeightToValue(parms[1]); | |
} | |
//Compress font | |
if (parms[0].ToUpper() == "FONT-FAMILY") | |
{ | |
cssFont = parms[1].Split(','); | |
sLine = string.Empty; | |
foreach (string s2 in cssFont) | |
{ | |
sLine = sLine + s2.Trim() + ","; | |
} | |
//Remove last , | |
if (sLine.EndsWith(",")) | |
{ | |
parms[1] = sLine.Remove(sLine.Length - 1, 1); | |
} | |
} | |
//Compress colors | |
if (parms[0].ToUpper() == "COLOR") | |
{ | |
if (parms[1].ToUpper() == "WHITE;") | |
{ | |
parms[1] = "#fff;"; | |
} | |
} | |
//Compress 0px; to just 0; | |
if ((parms[1].Length == 4) && (parms[1].ToUpper() == "0PX;")) | |
{ | |
parms[1] = "0;"; | |
} | |
if (parms[1].EndsWith(" 0;")) | |
{ | |
parms[1] = ";"; | |
} | |
//Rebuild string. | |
sLine = parms[0] + ":" + parms[1]; | |
} | |
//Commpress any spaces in string ie space { | |
if (sLine.EndsWith("{")) | |
{ | |
sLine = sLine.Substring(0, sLine.Length - 1).Trim() + "{"; | |
} | |
//Compress any spaces like eg space } | |
if (sLine.EndsWith("}")) | |
{ | |
sLine = sLine.Substring(0, sLine.Length - 1).Trim() + "}"; | |
} | |
//Replace ;} with single } | |
if (sLine.EndsWith(";}")) | |
{ | |
sLine = sLine.Remove(sLine.Length - 2, 2) + "}"; | |
} | |
//Replace space{ with single { | |
sLine = sLine.Replace(" {", "{"); | |
if (sLine.Length > 0) | |
{ | |
//Append to string builder. | |
sb.Append(sLine).Replace(";}", "}"); | |
} | |
} | |
} | |
//Close file | |
sr.Close(); | |
} | |
// | |
//Clear up | |
Array.Clear(parms, 0, parms.Length); | |
Array.Clear(cssFont, 0, cssFont.Length); | |
//Get compressed size | |
m_compressedSize = sb.Length; | |
//write to file. | |
using (StreamWriter sw = new StreamWriter(File.OpenWrite(OutputFile))) | |
{ | |
//Write data | |
sw.Write(sb.ToString()); | |
//Close file. | |
sw.Close(); | |
} | |
//Clear sb | |
sb.Clear(); | |
} | |
catch (Exception e) | |
{ | |
NextError = e.Message; | |
return 0; | |
} | |
return 1; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment