forked from getify/JSON.minify
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathminify.json.js
More file actions
120 lines (116 loc) · 4.67 KB
/
minify.json.js
File metadata and controls
120 lines (116 loc) · 4.67 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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
(function(global){
if (typeof global.JSON == "undefined" || !global.JSON) {
global.JSON = {};
}
var PARSER_STATE = {
WHITESPACE: 0,
NON_WHITESPACE: 1,
SINGLE_SLASH: 2,
SINGLE_SLASH_AFTER_WHITESPACE: 3,
MULTI_LINE_COMMENT: 4,
MULTI_LINE_COMMENT_STAR : 5,
SINGLE_LINE_COMMENT:6,
IN_STRING : 7,
ESCAPE_CHAR_IN_STRING: 8
}
global.JSON.minify = function(json) {
var state = PARSER_STATE.WHITESPACE,
index,
length = json.length,
char,
copyStart = 0,
minified = "";
for(index = 0; index < length; index++) {
char = json[index];
switch(state) {
case PARSER_STATE.WHITESPACE:
if(char !== ' ' && char !== '\n' && char !== '\r' && char !== '\t') {
copyStart = index;
if(char === '/') {
state = PARSER_STATE.SINGLE_SLASH_AFTER_WHITESPACE;
} else if(char === '"'|| char === '\'') {
state = PARSER_STATE.IN_STRING;
} else {
state = PARSER_STATE.NON_WHITESPACE;
}
}
break;
case PARSER_STATE.NON_WHITESPACE:
if(char !== ' ' && char !== '\n' && char !== '\r' && char !== '\t') {
if(char === '/') {
state = PARSER_STATE.SINGLE_SLASH;
} else if(char === '"'|| char === '\'') {
state = PARSER_STATE.IN_STRING;
} else {
state = PARSER_STATE.NON_WHITESPACE;
}
} else {
minified += json.substr(copyStart, index - copyStart);
state = PARSER_STATE.WHITESPACE;
}
break;
case PARSER_STATE.SINGLE_SLASH:
if(char === '*') {
minified += json.substr(copyStart, index - copyStart - 1);
state = PARSER_STATE.MULTI_LINE_COMMENT;
} else if (char === '/') {
minified += json.substr(copyStart, index - copyStart - 1);
state = PARSER_STATE.SINGLE_LINE_COMMENT;
} else if(char === '"'|| char === '\'') {
state = PARSER_STATE.IN_STRING;
} else if(char !== ' ' && char !== '\n' && char !== '\r' && char !== '\t') {
state = PARSER_STATE.NON_WHITESPACE;
} else {
minified += json.substr(copyStart, index - copyStart);
state = PARSER_STATE.WHITESPACE;
}
break;
case PARSER_STATE.SINGLE_SLASH_AFTER_WHITESPACE:
if(char === '*') {
state = PARSER_STATE.MULTI_LINE_COMMENT;
} else if (char === '/') {
state = PARSER_STATE.SINGLE_LINE_COMMENT;
} else if(char === '"'|| char === '\'') {
state = PARSER_STATE.IN_STRING;
} else if(char !== ' ' && char !== '\n' && char !== '\r' && char !== '\t') {
state = PARSER_STATE.NON_WHITESPACE;
} else {
minified += json.substr(copyStart, index - copyStart);
state = PARSER_STATE.WHITESPACE;
}
break;
case PARSER_STATE.MULTI_LINE_COMMENT:
if(char === '*') {
state = PARSER_STATE.MULTI_LINE_COMMENT_STAR;
}
break;
case PARSER_STATE.MULTI_LINE_COMMENT_STAR:
if(char === '/') {
state = PARSER_STATE.WHITESPACE;
} else {
state = PARSER_STATE.MULTI_LINE_COMMENT;
}
break;
case PARSER_STATE.SINGLE_LINE_COMMENT:
if(char === '\n' || char === '\r') {
state = PARSER_STATE.WHITESPACE;
}
break;
case PARSER_STATE.IN_STRING:
if(char === '"' || char === '\'') {
state = PARSER_STATE.NON_WHITESPACE;
} else if(char === '\\') {
state = PARSER_STATE.ESCAPE_CHAR_IN_STRING;
}
break;
case PARSER_STATE.ESCAPE_CHAR_IN_STRING:
state = PARSER_STATE.IN_STRING;
break;
}
}
if(state === PARSER_STATE.NON_WHITESPACE) {
minified += json.substr(copyStart);
}
return minified;
};
})(this);