css-strip-media.js
3.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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;
}