Scripts

CSS Minifier

Een simpele css minifier, gebaseerd op enkele regexes. Wordt op verschillende sites live gebruikt. Overigens is het absoluut af te raden om dit bij iedere CSS-hit te doen, gewoon van tevoren over je CSS halen (nadat je het hebt gebackupt!

cssmin.php
[code]<?php
/**
 * Een helperfunctie voor PHP < 5.3.0
 */
function minifyHelper($match) {
	/**
	 * Alles moet lowercase, maakt verder niet uit maar is
	 * handig bij vergelijkingen :-)
	 */
	$entries = array_map(
		'strtolower',
		explode(' ', $match[0])
	);

	switch(count($entries)) {
	case 4:
		/** 5px 5px 5px 5px => 5px 5px 5px */
		if ($entries[3] === $entries[1]) {
			// er zijn nog 3 over, doorvallen naar die case
			array_pop($entries);
		} else {
			break;
		}
		// DOORVALLEN
	case 3:
		/** 5px 5px 5px => 5px 5px */
		if ($entries[2] === $entries[0]) {
			// nu dus nog 2 over...
			array_pop($entries);
		} else {
			break;
		}
		// DOORVALLEN
	case 2:
		/** 5px 5px => 5px */
		if ($entries[1] === $entries[0]) {
			array_pop($entries);
		}
	}

	return implode(' ', $entries);
}

/**
 * CSS optimaliseren voor laag bandbreedtegebruik
 *
 * @param string $input
 * @return string
 * @author Richard van Velzen <[email protected]>
 */
function minifyCSS($input, $newlineAfterBrace = false) {
	$result = trim(preg_replace_callback(
		'~(?xi)
			(?<!\b(?: # uitzonderingen... bah
				background-position
			))
			:\K
			(?:(?:\d*\.)?\d+ (?: [a-z]{2} | %)? | auto )
			(?: \s (?:\d*\.)?\d+ (?: [a-z]{2} | %)? | auto ) {0,3}
			(?= [;}] )
		~S',
		'minifyHelper',
		preg_replace(
			array(
				'~(?x)
					\s*
					(?:
						# debug-CSS weghalen
						\Q/* REMOVE */\E
						(?:
						  [\r\n]+
						  (?! \Q/* END REMOVE */\E )
						  .*
						)+
						[\r\n]+ \Q/* END REMOVE */\E
					|
						# commentaar, natuurlijk
						/\* [^*]* \*+ (?: [^/] [^*]* \*+ )* /
					)
					\s*
				~',
				'~(?x)
					# nietrelevante whitespace
					\s+ (?! [^\'"()\r\n]* \))
				~',
				'@(?x)
					(?<=[{};:,+>~]) \s+
					| \s+ (?=[{}:,+>~;])
					| ( \( [^)]* \) | " [^"]* " | \' [^\']* \' )
					# een ; kan natuurlijk in een string voorkomen..
					| ; (?: \s*; )* (?= \s* } )
				@',
				'~#(?ix)
					# hex-kleuren, normaliseren naar kort formaat
					([a-f\d])\1
					([a-f\d])\2
					([a-f\d])\3
				~',
				'~(?x)
					# 0/0.0(px|em|etc.)? normaliseren naar 0
					(?<=[:, ]) (?:0*\.)?0
					(?i: [a-z]{2} | % )?
					(?! \w )
				~',
				'@(?xm)
					(?<= ^ | } )
					(?:
						# een selector met lege regels
						(?: ^ | \s* (?: , \s*)? )
						[>+~ ]?
						(?: [.#]? [a-z_-]+ | \*
							| \[[^]"\']*
								(?:
									(?: "[^"]*" | \'[^\']*\' )
									[^]"\']*
								)*
							]
						)++
					)++
					\s*{}\s*
				@'
			),
			array(
				// commentaar
				' ',
				// whitespace
				' ',
				// whitespace weghalen
				'$1',
				// hex-verkleining
				'#$1$2$3',
				// 0-normalisatie
				'0',
				// lege declaratie
				''
			),
			trim($input)
		)
	));

	if ($newlineAfterBrace) {
		$result = trim(str_replace('}', "}\n", $result));
	}

	return $result;
}[/code]

Reacties

0
Nog geen reacties.