Skip to content

Commit 314d351

Browse files
authored
Merge pull request #1 from developit/htmmini-size-reduc
[mini] inline build to save a few more bytes
2 parents 73b183e + 2f38ad1 commit 314d351

File tree

3 files changed

+121
-123
lines changed

3 files changed

+121
-123
lines changed

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
"extends": "developit",
2323
"rules": {
2424
"prefer-const": 0,
25-
"no-fallthrough": 0
25+
"no-fallthrough": 0,
26+
"prefer-rest-params": 0,
27+
"func-style": 0
2628
}
2729
},
2830
"jest": {

src/build.mjs

Lines changed: 0 additions & 116 deletions
This file was deleted.

src/index.mjs

Lines changed: 118 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,121 @@
1111
* limitations under the License.
1212
*/
1313

14-
import { build } from './build.mjs';
15-
16-
export default function html() {
17-
// eslint-disable-next-line prefer-rest-params
18-
return build(this, arguments);
19-
}
14+
const MODE_SLASH = 0;
15+
const MODE_TEXT = 1;
16+
const MODE_WHITESPACE = 2;
17+
const MODE_TAGNAME = 3;
18+
const MODE_ATTRIBUTE = 4;
19+
20+
const htm = function(statics) {
21+
const root = [];
22+
const stack = [];
23+
let mode = MODE_TEXT;
24+
let buffer = '';
25+
let quote = '';
26+
let args = root;
27+
let char, propName;
28+
29+
const commit = () => {
30+
if (mode === MODE_TEXT && (buffer = buffer.replace(/^\s*\n\s*|\s*\n\s*$/g, ''))) {
31+
args.push(buffer);
32+
}
33+
else if (mode === MODE_TAGNAME && buffer) {
34+
args[0] = buffer;
35+
mode = MODE_WHITESPACE;
36+
}
37+
else if (mode === MODE_WHITESPACE && buffer) {
38+
(args[1] = args[1] || {})[buffer] = true;
39+
}
40+
else if (mode === MODE_ATTRIBUTE && propName) {
41+
(args[1] = args[1] || {})[propName] = buffer;
42+
propName = '';
43+
}
44+
buffer = '';
45+
};
46+
47+
for (let i=0; i<statics.length; i++) {
48+
if (i) {
49+
if (mode === MODE_TEXT) {
50+
commit();
51+
args.push(arguments[i]);
52+
}
53+
else if (mode === MODE_TAGNAME) {
54+
args[0] = arguments[i];
55+
mode = MODE_WHITESPACE;
56+
}
57+
else if (mode === MODE_WHITESPACE && buffer === '...') {
58+
args[1] = Object.assign(args[1] || {}, arguments[i]);
59+
}
60+
else if (mode === MODE_ATTRIBUTE && propName) {
61+
(args[1] = args[1] || {})[propName] = arguments[i];
62+
propName = '';
63+
}
64+
buffer = '';
65+
}
66+
67+
for (let j=0; j<arguments[0][i].length; j++) {
68+
char = arguments[0][i][j];
69+
70+
if (mode === MODE_TEXT) {
71+
if (char === '<') {
72+
// commit buffer
73+
commit();
74+
stack.push(args);
75+
args = ['', null];
76+
buffer = '';
77+
mode = MODE_TAGNAME;
78+
}
79+
else {
80+
buffer += char;
81+
}
82+
}
83+
else if (quote) {
84+
if (char === quote) {
85+
quote = '';
86+
}
87+
else {
88+
buffer += char;
89+
}
90+
}
91+
else if (char === '"' || char === "'") {
92+
quote = char;
93+
}
94+
else if (char === '>') {
95+
commit();
96+
mode = MODE_TEXT;
97+
}
98+
else if (!mode) {
99+
// Ignore everything until the tag ends
100+
}
101+
else if (char === '=') {
102+
mode = MODE_ATTRIBUTE;
103+
propName = buffer;
104+
buffer = '';
105+
}
106+
else if (char === '/') {
107+
commit();
108+
if (mode === MODE_TAGNAME) {
109+
// no tag name before the slash
110+
args = stack.pop();
111+
}
112+
// eslint-disable-next-line prefer-spread
113+
mode = this.apply(null, args); // Use 'mode' as a temporary variable
114+
(args = stack.pop()).push(mode);
115+
mode = MODE_SLASH;
116+
}
117+
else if (char === ' ' || char === '\t' || char === '\n' || char === '\r') {
118+
// <a disabled>
119+
commit();
120+
mode = MODE_WHITESPACE;
121+
}
122+
else {
123+
buffer += char;
124+
}
125+
}
126+
}
127+
commit();
128+
return root.length < 2 ? root[0] : root;
129+
};
130+
131+
export default htm;

0 commit comments

Comments
 (0)