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