/* JSX translates XML literals like this
*
* var jsx =
some text
;
*
* into calls of "JSX driver function":
*
* __jsx__("div", {foo:"bar"}, ["some text"]);
*
* note:
* a) the call always have 3 arguments: string, object|null, array|null
* b) __jsx__ can be redefined, e.g. for https://mithril.js.org it will be just
*
* __jsx__ = m; // using mithril as JSX driver
*/
static __exception int next_web_token(JSParseState *s) {
s->allow_web_name_token = 1;
int r = next_token(s);
s->allow_web_name_token = 0;
return r;
}
static int js_parse_jsx_expr(JSParseState *s, int level)
{
int atts_count = 0;
int kids_count = 0;
// NOTE: caller already consumed '<'
if (next_web_token(s)) goto fail;
if (s->token.val != TOK_IDENT)
return js_parse_error(s, "Expecting tag name");
//tag
JSAtom tag_atom = s->token.u.ident.atom;
JSValue tag = JS_AtomToString(s->ctx,tag_atom);
// load JSX function - driver of JSX expressions:
#if 1 // load it as a global function
emit_op(s, OP_get_var);
emit_atom(s, JS_ATOM_JSX);
#else // load it as a local/scope function - do we need that?
emit_op(s, OP_scope_get_var);
emit_atom(s, JS_ATOM_JSX);
emit_u16(s, s->cur_func->scope_level);
#endif
// #0 #1 #2
// JSX(tag, atts ,kids); where
// - atts - object {...}, can be empty
// - kids - array [...], can be empty
emit_push_const(s, tag, 0);
JS_FreeValue(s->ctx, tag);
// parse attributes
JSAtom attr_name = JS_ATOM_NULL;
JSValue attr_value = JS_UNINITIALIZED;
#if defined(CONFIG_JSX_SCITER) // HTML shortcuts used by Sciter
char class_buffer[512] = {0};
#endif
if (next_web_token(s)) goto fail;
emit_op(s, OP_object);
while (s->token.val != '>') {
if (s->token.val == '/') {
next_token(s);
//json_parse_expect(s, '>');
if(s->token.val != '>')
js_parse_error(s, "expecting '>'");
goto GENERATE_KIDS;
}
#if defined(CONFIG_JSX_SCITER) // HTML shortcuts used by Sciter
if (s->token.val == '#') { //