css-strip-media.js 3.25 KB
function trim(str) {
	return str.replace(/^\s+/, '').replace(/\s+$/, '');
}
function remove_media_queries(content, disable_less_than) {
	var disable_less_than = disable_less_than || 900;
	var css_output = "";
	content = content.replace(/\/\*[^*]*\*+([^/*][^*]*\*+)*\//ig , '');//remove comments

	var disable_less_than = 900;
	//first remove all comments
	var selector_regex = /((?:\s*@media\s*[^\{\}]*)?(?:\s*@(?:-(?:moz|webkit|ms|o|khtml)-)?keyframes\s*[^\{\}]*)?(?:\s*[^\{\}]*))(\{)/ig

	var lastCloseBracket = 100000000, media_wrap = false, media_selector = '', pre_media_length = 0;
	var media_ignore = false;

	var result;
	while ((result = selector_regex.exec(content)) !== null) {
	  //we optimistically suppose that no '}' character is inside CSS values such as content:"}" or url('}.jpg')

	  var index = result.index;
	  if(media_wrap && index > lastCloseBracket) {
		//we have reached end of a @media or @keyframe
		if(!media_ignore && css_output.length > pre_media_length)
			css_output = css_output.substr(0, pre_media_length) + "\n" + trim(media_selector) + " {\n" + css_output.substr(pre_media_length) + "}\n";

		media_selector = '';
		media_wrap = false;
		media_ignore = false;
	  }

	  var end = content.indexOf('}', selector_regex.lastIndex);
	  lastCloseBracket = content.indexOf('}', end + 1);

	  var selector = result[1];

	  
	  if(selector.match(/@media/i) || selector.match(/@(?:-(?:moz|webkit|ms|o|khtml)-)?keyframes/i)) {
		media_selector = selector;
		media_wrap = true;

		if( selector.match(/@media/i) && selector.match(/(min|max)\-width/i) ) {
			var min_width = 0;
			if ( (min_width = selector.match(/min\-width:\s*(\d+)/i)) ) {
				min_width = parseInt(min_width[1]);
			}
			if( !min_width || min_width < disable_less_than ) media_ignore = true;
		}

		pre_media_length = css_output.length;
	  } else {
			var selector_parts = selector.split(/\,+/);
			var valid_parts = [];
			for(var c = 0 ; c < selector_parts.length; c++) {
				var sel = trim(selector_parts[c]);
				valid_parts.push(sel);
			}
			if(valid_parts.length == 0) continue;


			var rules_text = content.substring(selector_regex.lastIndex , end);
			var rule_list = rules_text.match(/(?:([\w\*\-%]+)\s*\:\s*([^\;\}]+))/ig);
			
			if(rule_list && rule_list.length > 0) {
				var override_rules = {};
				for(var r = 0; r < rule_list.length; r++) {
					var $rules = rule_list[r].match(/(?:([\w\*\-%]+)\s*\:\s*([^\;\}]+))/i);

					var rule = $rules[1].toLowerCase();
					var value = $rules[2];

					override_rules[rule] = {type: 1, value: value};
				}
				

				var new_rules_text = '';
				for(var rule in override_rules) if(override_rules.hasOwnProperty(rule)) {
					var new_rule = override_rules[rule];
					//if(new_rule.type == 0) {
						new_rules_text += "\t"+ rule+": "+ new_rule.value +";\n";
					//}
				}
				
				
				if( !media_ignore && new_rules_text.length > 0 ) {
					css_output += trim(valid_parts.join(','))+" {\n";
					css_output += new_rules_text;
					css_output += "}\n";
				}
			}
	  }
	}

	//if there's a remaining open media query, close it
	if(media_wrap && !media_ignore)  {
		if(css_output.length > pre_media_length)
			css_output = css_output.substr(0, pre_media_length) + "\n" + trim(media_selector) + " {\n" + css_output.substr(pre_media_length) + "}\n";
	}

	return css_output;
}