simple css minify

2007-10-03 @ 22:19#

updated: 2007-12-05

i've posted an update for cssminify to improve whitespace handling.

updated: 2007-10-24

i've posted my server-side script (conflate.ashx) that combines multiple CSS documents into a single result - all 'on the fly.'

i've been using CSSTidy recently and really like it. however, i ran into a problem with it this week while using the YUI Grids CSS files. CSSTidy removes several CSS hacks from the YUI files rendering them useless. first, boo for hacks. second, boo for CSSTidy not allowing me to adjust.

so i whipped up a simple CSS minify routine for my own use. this does not do the cool tidy work that CSSTidy does, but at least it plays well with the YUI stuff. this simple command-line routine lets me supply an input file and (optionally) an output filename and single-line comment. i get about 30% reduction just by removing comments and un-needed whitespace. not too bad.

btw - please excuse the VBScript[g]. i was in a hurry!

' ***************************************************
' cssminify.vbs		
' 2007-10-03 (mca)
' remove comments and whitespace from CSS files
' no tidying up here, just minifying
' usage:
'    cssminify infile.css [outfile.css] ["comment"]
' ***************************************************

' vars
Dim fso,f,cmt,rex,data,re_cmt,re_ws,ifile,ofile
re_cmt = "/\*[\s\S]*?\*/"
re_ws = "[\r\n\t]*"

' get input file
If WScript.Arguments.Count=0 Then
	WScript.Echo "Missing Input File"
	WScript.Quit
Else
	ifile = WScript.Arguments.Item(0)
End If

' get output file (or set default)
If WScript.Arguments.Count>1 Then
	ofile = WScript.Arguments.Item(1)
Else
	ofile = "min-" & WScript.Arguments.Item(0)
End If

' get comment line
If WScript.Arguments.Count=3 Then
	cmt = "/* " & WScript.Arguments.Item(2) & " */"
Else
	cmt = ""
End If

' set file object
Set fso = CreateObject("Scripting.FileSystemObject")

' read data in
Set f = fso.OpenTextFile(ifile,1,False)	
	data = f.ReadAll()
	f.Close
Set f = Nothing

' do regexp work
Set rex = new RegExp
	rex.MultiLine = True
	rex.Global = True
	rex.Pattern = re_cmt
	data = rex.Replace(data,"")
	rex.Pattern = re_ws
	data = rex.Replace(data,"")
Set rex = Nothing

' write data out
Set f = fso.CreateTextFile(ofile,1,False)
	f.WriteLine("/* cssminify @ " & Now() & " */")
	If cmt<>"" Then f.WriteLine(cmt)
	f.Write(data)
	f.Close
Set f = Nothing

' all done
WScript.Quit

code