@yuneta/gobj-js 7.26.2 → 7.26.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5400,6 +5400,68 @@ function safeSrc(url) {
5400
5400
  /***************************************************************************
5401
5401
  *
5402
5402
  ***************************************************************************/
5403
+ /***************************************************************************
5404
+ * Markup that createElement2() inserts AS HTML, said out loud.
5405
+ *
5406
+ * createElement2() reads a string that starts with '<' as markup. That
5407
+ * decision depends on the CONTENT of the string, not on who wrote it, so
5408
+ * a value from a backend or typed by a user that starts with '<' runs as
5409
+ * html. html_markup() is the explicit way to ask for markup: the string
5410
+ * is the caller's own (an icon, an svg), never data.
5411
+ *
5412
+ * ['span', {class: 'icon'}, html_markup('<i class="yi-copy"></i>')]
5413
+ *
5414
+ * With set_strings_are_text(true) a plain string is ALWAYS text and
5415
+ * html_markup() is the only way to insert markup.
5416
+ ***************************************************************************/
5417
+ var HtmlMarkup = class {
5418
+ constructor(html) {
5419
+ this.html = html;
5420
+ Object.freeze(this);
5421
+ }
5422
+ toString() {
5423
+ return this.html;
5424
+ }
5425
+ };
5426
+ function html_markup(html) {
5427
+ if (typeof html !== "string") {
5428
+ log_error(`html_markup: not a string, type ${typeof html}`);
5429
+ return new HtmlMarkup("");
5430
+ }
5431
+ return new HtmlMarkup(html);
5432
+ }
5433
+ function is_html_markup(v) {
5434
+ return v instanceof HtmlMarkup;
5435
+ }
5436
+ function markup_fragment(markup) {
5437
+ const template = document.createElement("template");
5438
+ template.innerHTML = markup.html.trim();
5439
+ return template.content;
5440
+ }
5441
+ var __strings_are_text__ = false;
5442
+ var __markup_strings_warned__ = /* @__PURE__ */ new Set();
5443
+ /***************************************************************************
5444
+ * The mode of createElement2() for a plain string that starts with '<':
5445
+ * false (default): it is markup, as it always was.
5446
+ * true: it is TEXT; markup is asked for with html_markup().
5447
+ * An app turns it on once its own code and the libraries it mounts pass
5448
+ * every deliberate markup through html_markup(). A string that starts
5449
+ * with '<' is then logged once (a deliberate one not migrated yet, or a
5450
+ * datum that used to run as html).
5451
+ ***************************************************************************/
5452
+ function set_strings_are_text(on) {
5453
+ __strings_are_text__ = !!on;
5454
+ }
5455
+ function strings_are_text() {
5456
+ return __strings_are_text__;
5457
+ }
5458
+ function warn_markup_string(content) {
5459
+ if (__markup_strings_warned__.size >= 100) return;
5460
+ const key = content.slice(0, 80);
5461
+ if (__markup_strings_warned__.has(key)) return;
5462
+ __markup_strings_warned__.add(key);
5463
+ log_warning(`createElement2: a string that starts with '<' is TEXT (set_strings_are_text): use html_markup() if it is markup: ${JSON.stringify(key)}`);
5464
+ }
5403
5465
  function createOneHtml(htmlString) {
5404
5466
  const template = document.createElement("template");
5405
5467
  template.innerHTML = htmlString.trim();
@@ -5561,6 +5623,7 @@ parent: document.body
5561
5623
  * if string begins with '<' then
5562
5624
  * it will be converted to HTMLElement
5563
5625
  * content = createOneHtml(string)
5626
+ * | html_markup(string): markup, said out loud (any mode)
5564
5627
  * ⚠️ So a string is MARKUP when it starts with '<': never
5565
5628
  * pass DATA (a value from a backend, a name a user typed)
5566
5629
  * as a bare string, or "<img src=x onerror=...>" runs.
@@ -5570,6 +5633,8 @@ parent: document.body
5570
5633
  * appended as it is and a string is always text -- but a
5571
5634
  * list whose first item is a string is read as ONE
5572
5635
  * description (the string is its tag).
5636
+ * With set_strings_are_text(true) a plain string is
5637
+ * always text, and markup only comes in html_markup().
5573
5638
  * if attrs['i18n'] is not empty then (or 'data-i18n' or 'data_i18next')
5574
5639
  * it will be overridden with the translation
5575
5640
  * content = translate(attrs['i18n']));
@@ -5612,19 +5677,24 @@ function createElement2(description, translate_fn) {
5612
5677
  el.setAttribute("data-i18n", data_i18next);
5613
5678
  }
5614
5679
  } else el.setAttribute(attr, attrs[attr]);
5615
- if (is_string(content)) {
5680
+ if (is_html_markup(content)) el.appendChild(markup_fragment(content));
5681
+ else if (is_string(content)) {
5616
5682
  content = content.trim();
5617
- if (content.length > 0 && content[0] === "<") el.appendChild(createOneHtml(content));
5618
- else if (translate_fn && data_i18next) {
5619
- let translated = translate_fn(data_i18next);
5620
- el.textContent = translated ? translated : content;
5621
- } else el.textContent = content;
5683
+ if (content.length > 0 && content[0] === "<" && !__strings_are_text__) el.appendChild(createOneHtml(content));
5684
+ else {
5685
+ if (content.length > 0 && content[0] === "<") warn_markup_string(content);
5686
+ if (translate_fn && data_i18next) {
5687
+ let translated = translate_fn(data_i18next);
5688
+ el.textContent = translated ? translated : content;
5689
+ } else el.textContent = content;
5690
+ }
5622
5691
  } else if (is_array(content)) {
5623
5692
  if (content.length > 0) {
5624
5693
  if (is_string(content[0])) el.appendChild(createElement2(content, translate_fn));
5625
5694
  else for (let child of content) if (Array.isArray(child)) {
5626
5695
  if (child.length > 0) el.appendChild(createElement2(child, translate_fn));
5627
5696
  } else if (child instanceof Node) el.appendChild(child);
5697
+ else if (is_html_markup(child)) el.appendChild(markup_fragment(child));
5628
5698
  else if (is_string(child)) el.appendChild(document.createTextNode(child));
5629
5699
  else if (child !== null && child !== void 0 && child !== false) log_error(`createElement2: child ignored, type ${typeof child}`);
5630
5700
  }
@@ -7814,6 +7884,6 @@ function register_c_ievent_cli() {
7814
7884
  return create_gclass(GCLASS_NAME);
7815
7885
  }
7816
7886
  //#endregion
7817
- export { GObj, SDATA, SDATAAUTHZ, SDATACM, SDATACM2, SDATADF, SDATAPM, SDATAPM0, SDATA_END, SDataDesc, YUNETA_VERSION, __yuno__, build_command_response, build_path, build_stats_response, clean_name, clear_timeout, cmp_two_simple_json, command_parser, createElement2, createOneHtml, create_json_record, create_template_record, current_timestamp, data_type_t, db_list_persistent_attrs, db_load_persistent_attrs, db_remove_persistent_attrs, db_save_persistent_attrs, debounce, delete_from_list, duplicate_objects, empty_json, empty_string, escapeHtml, event_flag_t, flat2json, flat_apply, flat_diff, flat_key_join, flat_key_split, gclass_add_ev_action, gclass_add_event_type, gclass_add_state, gclass_check_fsm, gclass_create, gclass_event_type, gclass_find_by_name, gclass_flag_t, gclass_unregister, getPositionRelativeToBody, get_function_name, get_now, gobj_bottom_gobj, gobj_change_parent, gobj_change_state, gobj_command, gobj_create, gobj_create2, gobj_create_default_service, gobj_create_pure_child, gobj_create_service, gobj_create_volatil, gobj_create_yuno, gobj_current_state, gobj_default_service, gobj_deliver_posted_events, gobj_destroy, gobj_find_child, gobj_find_gobj, gobj_find_service, gobj_find_subscribings, gobj_find_subscriptions, gobj_flag_t, gobj_full_name, gobj_gclass_name, gobj_get_gclass_trace_level, gobj_get_gclass_trace_level2, gobj_get_gclass_trace_no_level, gobj_get_global_trace_level, gobj_get_global_trace_no_level, gobj_global_trace_level, gobj_global_trace_no_level, gobj_has_attr, gobj_has_event, gobj_has_output_event, gobj_hsdata, gobj_is_destroying, gobj_is_playing, gobj_is_pure_child, gobj_is_running, gobj_is_service, gobj_is_volatil, gobj_list_persistent_attrs, gobj_list_subscriptions, gobj_load_persistent_attrs, gobj_match_children, gobj_match_children_tree, gobj_match_gobj, gobj_name, gobj_parent, gobj_pause, gobj_play, gobj_post_event, gobj_posted_events_size, gobj_publish_event, gobj_read_attr, gobj_read_attrs, gobj_read_bool_attr, gobj_read_integer_attr, gobj_read_pointer_attr, gobj_read_str_attr, gobj_remove_persistent_attrs, gobj_repr_global_trace_levels, gobj_reset_volatil_attrs, gobj_save_persistent_attrs, gobj_search_path, gobj_send_event, gobj_services, gobj_set_bottom_gobj, gobj_set_deep_trace, gobj_set_gclass_no_trace, gobj_set_gclass_trace, gobj_set_global_no_trace, gobj_set_global_no_trace2, gobj_set_global_trace, gobj_set_global_trace2, gobj_set_gobj_no_trace, gobj_set_gobj_trace, gobj_set_trace_machine_format, gobj_short_name, gobj_start, gobj_start_children, gobj_start_tree, gobj_start_up, gobj_stats, gobj_stop, gobj_stop_children, gobj_stop_tree, gobj_subscribe_event, gobj_trace_level, gobj_trace_machine_format, gobj_trace_no_level, gobj_unsubscribe_event, gobj_unsubscribe_list, gobj_walk_gobj_children, gobj_walk_gobj_children_tree, gobj_write_attr, gobj_write_attrs, gobj_write_bool_attr, gobj_write_integer_attr, gobj_write_str_attr, gobj_yuno, gobj_yuno_id, gobj_yuno_name, gobj_yuno_role, id_index_in_obj_list, index_in_list, is_array, is_boolean, is_date, is_function, is_gobj, is_metadata_key, is_null, is_number, is_object, is_private_key, is_pure_number, is_secret_name, is_string, jdb_delete, jdb_get, jdb_get_by_idx, jdb_get_topic, jdb_init, jdb_update, json2flat, json_array_append, json_array_append_new, json_array_extend, json_array_remove, json_array_size, json_deep_copy, json_is_identical, json_mask_secrets, json_object_del, json_object_get, json_object_set, json_object_set_new, json_object_size, json_object_update, json_object_update_existing, json_object_update_missing, json_size, jwt2json, jwtDecode, kw_clone_by_keys, kw_clone_by_not_keys, kw_collect, kw_delete, kw_find_json_in_list, kw_find_path, kw_flag_t, kw_get_bool, kw_get_dict, kw_get_dict_value, kw_get_int, kw_get_list, kw_get_local_storage_value, kw_get_pointer, kw_get_real, kw_get_str, kw_has_key, kw_match_simple, kw_pop, kw_remove_local_storage_value, kw_select, kw_set_dict_value, kw_set_local_storage_value, kw_set_subdict_value, kwid_collect, kwid_find_one_record, kwid_get_ids, kwid_match_id, kwid_new_dict, kwid_new_list, list2options, load_json_file, log_debug, log_error, log_info, log_warning, mask_secrets_inline, msg_iev_get_msg_type, msg_iev_get_stack, msg_iev_push_stack, msg_iev_read_key, msg_iev_set_msg_type, msg_iev_write_key, node_uuid, parseBoolean, parseSVG, refresh_language, register_c_ievent_cli, register_c_timer, register_c_yuno, safeSrc, sdata_flag_t, send_http_json_post, set_console_log_enabled, set_console_log_filter, set_log_callback, set_remote_log_functions, set_timeout, set_timeout_periodic, sprintf, stats_parser, str_in_list, strcasecmp, strcmp, strncmp, strs_in_list, strstr, template_get_field_desc, timeTracker, trace_json, trace_json_masked, trace_level_t, trace_msg, treedb_decoder_fkey, treedb_decoder_hook, treedb_encoder_fkey, treedb_get_field_desc, treedb_hook_data_size, vsprintf, walk_type_t };
7887
+ export { GObj, SDATA, SDATAAUTHZ, SDATACM, SDATACM2, SDATADF, SDATAPM, SDATAPM0, SDATA_END, SDataDesc, YUNETA_VERSION, __yuno__, build_command_response, build_path, build_stats_response, clean_name, clear_timeout, cmp_two_simple_json, command_parser, createElement2, createOneHtml, create_json_record, create_template_record, current_timestamp, data_type_t, db_list_persistent_attrs, db_load_persistent_attrs, db_remove_persistent_attrs, db_save_persistent_attrs, debounce, delete_from_list, duplicate_objects, empty_json, empty_string, escapeHtml, event_flag_t, flat2json, flat_apply, flat_diff, flat_key_join, flat_key_split, gclass_add_ev_action, gclass_add_event_type, gclass_add_state, gclass_check_fsm, gclass_create, gclass_event_type, gclass_find_by_name, gclass_flag_t, gclass_unregister, getPositionRelativeToBody, get_function_name, get_now, gobj_bottom_gobj, gobj_change_parent, gobj_change_state, gobj_command, gobj_create, gobj_create2, gobj_create_default_service, gobj_create_pure_child, gobj_create_service, gobj_create_volatil, gobj_create_yuno, gobj_current_state, gobj_default_service, gobj_deliver_posted_events, gobj_destroy, gobj_find_child, gobj_find_gobj, gobj_find_service, gobj_find_subscribings, gobj_find_subscriptions, gobj_flag_t, gobj_full_name, gobj_gclass_name, gobj_get_gclass_trace_level, gobj_get_gclass_trace_level2, gobj_get_gclass_trace_no_level, gobj_get_global_trace_level, gobj_get_global_trace_no_level, gobj_global_trace_level, gobj_global_trace_no_level, gobj_has_attr, gobj_has_event, gobj_has_output_event, gobj_hsdata, gobj_is_destroying, gobj_is_playing, gobj_is_pure_child, gobj_is_running, gobj_is_service, gobj_is_volatil, gobj_list_persistent_attrs, gobj_list_subscriptions, gobj_load_persistent_attrs, gobj_match_children, gobj_match_children_tree, gobj_match_gobj, gobj_name, gobj_parent, gobj_pause, gobj_play, gobj_post_event, gobj_posted_events_size, gobj_publish_event, gobj_read_attr, gobj_read_attrs, gobj_read_bool_attr, gobj_read_integer_attr, gobj_read_pointer_attr, gobj_read_str_attr, gobj_remove_persistent_attrs, gobj_repr_global_trace_levels, gobj_reset_volatil_attrs, gobj_save_persistent_attrs, gobj_search_path, gobj_send_event, gobj_services, gobj_set_bottom_gobj, gobj_set_deep_trace, gobj_set_gclass_no_trace, gobj_set_gclass_trace, gobj_set_global_no_trace, gobj_set_global_no_trace2, gobj_set_global_trace, gobj_set_global_trace2, gobj_set_gobj_no_trace, gobj_set_gobj_trace, gobj_set_trace_machine_format, gobj_short_name, gobj_start, gobj_start_children, gobj_start_tree, gobj_start_up, gobj_stats, gobj_stop, gobj_stop_children, gobj_stop_tree, gobj_subscribe_event, gobj_trace_level, gobj_trace_machine_format, gobj_trace_no_level, gobj_unsubscribe_event, gobj_unsubscribe_list, gobj_walk_gobj_children, gobj_walk_gobj_children_tree, gobj_write_attr, gobj_write_attrs, gobj_write_bool_attr, gobj_write_integer_attr, gobj_write_str_attr, gobj_yuno, gobj_yuno_id, gobj_yuno_name, gobj_yuno_role, html_markup, id_index_in_obj_list, index_in_list, is_array, is_boolean, is_date, is_function, is_gobj, is_html_markup, is_metadata_key, is_null, is_number, is_object, is_private_key, is_pure_number, is_secret_name, is_string, jdb_delete, jdb_get, jdb_get_by_idx, jdb_get_topic, jdb_init, jdb_update, json2flat, json_array_append, json_array_append_new, json_array_extend, json_array_remove, json_array_size, json_deep_copy, json_is_identical, json_mask_secrets, json_object_del, json_object_get, json_object_set, json_object_set_new, json_object_size, json_object_update, json_object_update_existing, json_object_update_missing, json_size, jwt2json, jwtDecode, kw_clone_by_keys, kw_clone_by_not_keys, kw_collect, kw_delete, kw_find_json_in_list, kw_find_path, kw_flag_t, kw_get_bool, kw_get_dict, kw_get_dict_value, kw_get_int, kw_get_list, kw_get_local_storage_value, kw_get_pointer, kw_get_real, kw_get_str, kw_has_key, kw_match_simple, kw_pop, kw_remove_local_storage_value, kw_select, kw_set_dict_value, kw_set_local_storage_value, kw_set_subdict_value, kwid_collect, kwid_find_one_record, kwid_get_ids, kwid_match_id, kwid_new_dict, kwid_new_list, list2options, load_json_file, log_debug, log_error, log_info, log_warning, mask_secrets_inline, msg_iev_get_msg_type, msg_iev_get_stack, msg_iev_push_stack, msg_iev_read_key, msg_iev_set_msg_type, msg_iev_write_key, node_uuid, parseBoolean, parseSVG, refresh_language, register_c_ievent_cli, register_c_timer, register_c_yuno, safeSrc, sdata_flag_t, send_http_json_post, set_console_log_enabled, set_console_log_filter, set_log_callback, set_remote_log_functions, set_strings_are_text, set_timeout, set_timeout_periodic, sprintf, stats_parser, str_in_list, strcasecmp, strcmp, strings_are_text, strncmp, strs_in_list, strstr, template_get_field_desc, timeTracker, trace_json, trace_json_masked, trace_level_t, trace_msg, treedb_decoder_fkey, treedb_decoder_hook, treedb_encoder_fkey, treedb_get_field_desc, treedb_hook_data_size, vsprintf, walk_type_t };
7818
7888
 
7819
7889
  //# sourceMappingURL=gobj-js.es.js.map