Skip to content

Commit d060bb8

Browse files
committed
Optimize size with String#indexOf
1 parent 6752939 commit d060bb8

File tree

1 file changed

+45
-50
lines changed

1 file changed

+45
-50
lines changed

src/build.mjs

Lines changed: 45 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export const build = (statics) => {
4646
let quote = '';
4747
let fallbackPropValue = true;
4848
let current = [];
49-
let char, propName;
49+
let char, propName, idx;
5050

5151
const commit = field => {
5252
if (mode === MODE_TEXT) {
@@ -86,61 +86,56 @@ export const build = (statics) => {
8686
for (let j=0; j<statics[i].length; j++) {
8787
char = statics[i].charAt(j);
8888

89-
if (mode === MODE_TEXT) {
90-
if (char === '<') {
91-
// commit buffer
92-
commit();
93-
current = [current];
94-
mode = MODE_TAGNAME;
95-
continue;
96-
}
97-
}
98-
else if (quote === char) {
99-
quote = '';
100-
continue;
89+
if (mode === MODE_TEXT && char === '<') {
90+
// commit buffer
91+
commit();
92+
current = [current];
93+
mode = MODE_TAGNAME;
10194
}
102-
else if (!quote) {
103-
switch (char) {
104-
case '"':
105-
case "'":
106-
quote = char;
107-
continue;
108-
case '>':
109-
commit();
95+
else if (mode !== MODE_TEXT && (idx = '\'">=/\t\n\r '.indexOf(char)) >= 0 && char.indexOf(quote) >= 0) {
96+
if (idx < 2) {
97+
// char is a quote && (quote === char || quote is empty)
98+
quote = quote ? '' : char;
99+
}
100+
else if (idx === 2) {
101+
// char === '>'
102+
commit();
110103

111-
if (!mode) {
112-
if (current.length === 1) {
113-
current = current[0];
114-
}
115-
current[0].push(0, current, CHILD_RECURSE);
104+
if (!mode) {
105+
// encountered a slash in current tag
106+
107+
if (current.length === 1) {
108+
// no tag name or attributes before the slash
116109
current = current[0];
117110
}
118-
mode = MODE_TEXT;
119-
continue;
120-
case '=':
121-
if (mode) {
122-
mode = MODE_ATTRIBUTE;
123-
propName = buffer;
124-
buffer = fallbackPropValue = '';
125-
}
126-
continue;
127-
case '/':
128-
commit();
129-
mode = MODE_SLASH;
130-
continue;
131-
case '\t':
132-
case '\r':
133-
case '\n':
134-
case ' ':
135-
if (mode) {
136-
// <a disabled>
137-
commit();
138-
mode = MODE_WHITESPACE;
139-
}
140-
continue;
111+
current[0].push(0, current, CHILD_RECURSE);
112+
current = current[0];
113+
}
114+
mode = MODE_TEXT;
115+
}
116+
else if (idx === 3) {
117+
// char === '='
118+
if (mode) {
119+
mode = MODE_ATTRIBUTE;
120+
propName = buffer;
121+
buffer = fallbackPropValue = '';
122+
}
123+
}
124+
else if (idx === 4) {
125+
// char === '/'
126+
commit();
127+
mode = MODE_SLASH;
141128
}
129+
else if (mode) {
130+
// char is a whitespace
131+
// <a disabled>
132+
commit();
133+
mode = MODE_WHITESPACE;
134+
}
135+
}
136+
else {
137+
buffer += char;
142138
}
143-
buffer += char;
144139
}
145140
}
146141
commit();

0 commit comments

Comments
 (0)