diff --git a/400_xowa/src/gplx/core/gfobjs/Gfobj_fld.java b/400_xowa/src/gplx/core/gfobjs/Gfobj_fld.java index b85b6e8bc..63469260d 100644 --- a/400_xowa/src/gplx/core/gfobjs/Gfobj_fld.java +++ b/400_xowa/src/gplx/core/gfobjs/Gfobj_fld.java @@ -30,6 +30,7 @@ class Gfobj_fld_ { , Fld_tid__long = 4 , Fld_tid__double = 5 , Fld_tid__str = 6 + , Fld_tid__bry = 7 ; } class Gfobj_fld_str implements Gfobj_fld { @@ -39,6 +40,13 @@ class Gfobj_fld_str implements Gfobj_fld { public Object As_obj() {return val;} public String As_str() {return val;} private String val; } +class Gfobj_fld_bry implements Gfobj_fld { + public Gfobj_fld_bry(String key, byte[] val) {this.key = key; this.val = val;} + public String Key() {return key;} private final String key; + public byte Fld_tid() {return Gfobj_fld_.Fld_tid__bry;} + public Object As_obj() {return val;} + public byte[] As_bry() {return val;} private byte[] val; +} class Gfobj_fld_bool implements Gfobj_fld { public Gfobj_fld_bool(String key, boolean val) {this.key = key; this.val = val;} public String Key() {return key;} private final String key; diff --git a/400_xowa/src/gplx/core/gfobjs/Gfobj_nde.java b/400_xowa/src/gplx/core/gfobjs/Gfobj_nde.java index 75d8f108e..7d1d5650b 100644 --- a/400_xowa/src/gplx/core/gfobjs/Gfobj_nde.java +++ b/400_xowa/src/gplx/core/gfobjs/Gfobj_nde.java @@ -49,6 +49,7 @@ public class Gfobj_nde implements Gfobj_grp { public Gfobj_nde Add_int(String key, int val) {return Add_fld(new Gfobj_fld_int(key, val));} public Gfobj_nde Add_long(String key, long val) {return Add_fld(new Gfobj_fld_long(key, val));} public Gfobj_nde Add_str(String key, String val) {return Add_fld(new Gfobj_fld_str(key, val));} + public Gfobj_nde Add_bry(String key, byte[] val) {return Add_fld(new Gfobj_fld_bry(key, val));} public Gfobj_nde Add_url(String key, Io_url val) {return Add_fld(new Gfobj_fld_str(key, val.Raw()));} public Gfobj_nde Add_double(String key, double val) {return Add_fld(new Gfobj_fld_double(key, val));} public Gfobj_nde Add_nde(String key, Gfobj_nde val) {return Add_fld(new Gfobj_fld_nde(key, val));} diff --git a/400_xowa/src/gplx/core/gfobjs/Gfobj_wtr__json.java b/400_xowa/src/gplx/core/gfobjs/Gfobj_wtr__json.java index 6b743e4a7..8a9c73655 100644 --- a/400_xowa/src/gplx/core/gfobjs/Gfobj_wtr__json.java +++ b/400_xowa/src/gplx/core/gfobjs/Gfobj_wtr__json.java @@ -53,6 +53,7 @@ public class Gfobj_wtr__json { private void Write_fld(Gfobj_fld itm) { switch (itm.Fld_tid()) { case Gfobj_fld_.Fld_tid__str: wtr.Kv_str(itm.Key() , ((Gfobj_fld_str)itm).As_str()); break; + case Gfobj_fld_.Fld_tid__bry: wtr.Kv_bry(itm.Key() , ((Gfobj_fld_bry)itm).As_bry()); break; case Gfobj_fld_.Fld_tid__int: wtr.Kv_int(itm.Key() , ((Gfobj_fld_int)itm).As_int()); break; case Gfobj_fld_.Fld_tid__long: wtr.Kv_long(itm.Key() , ((Gfobj_fld_long)itm).As_long()); break; case Gfobj_fld_.Fld_tid__bool: wtr.Kv_bool(itm.Key() , ((Gfobj_fld_bool)itm).As_bool()); break; diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_grp.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_grp.java index 03234dc00..d1e801de6 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_grp.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_grp.java @@ -37,7 +37,7 @@ public class Xoedit_grp implements Xoedit_nde, Mustache_doc_itm { this.name = name; this.help = help; } - public Gfobj_nde To_nde() { + public Gfobj_nde To_nde(Bry_bfr tmp_bfr) { Gfobj_nde rv = Gfobj_nde.New(); rv.Add_int("id", id); rv.Add_str("key", key); @@ -49,7 +49,7 @@ public class Xoedit_grp implements Xoedit_nde, Mustache_doc_itm { int len = itms.length; for (int i = 0; i < len; i++) { Xoedit_itm itm = itms[i]; - list.Add(itm.To_nde()); + list.Add(itm.To_nde(tmp_bfr)); } rv.Add_ary("itms", new Gfobj_ary((Gfobj_nde[])list.To_ary_and_clear(Gfobj_nde.class))); return rv; diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_itm.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_itm.java index d19c517ab..5c0a5ff52 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_itm.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_itm.java @@ -19,10 +19,12 @@ package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gp import gplx.langs.mustaches.*; import gplx.core.gfobjs.*; import gplx.langs.jsons.*; import gplx.xowa.addons.apps.cfgs.mgrs.types.*; +import gplx.langs.htmls.*; public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm { private String gui_type; private boolean edited; - private String data_type, gui_args, dflt, lang, name, ctx, val, date; + private String data_type, gui_args, lang, name, ctx, date; + private byte[] val, dflt; // NOTE: data is always escaped b/c it is only consumed by mustache; EX: "<'" not "<'" private Xocfg_type_mgr type_mgr; public Xoedit_itm(Xocfg_type_mgr type_mgr, int id, String key, int sort) { this.type_mgr = type_mgr; @@ -35,20 +37,20 @@ public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm { public String Help() {return help;} private String help; public int Sort() {return sort;} private final int sort; - public void Load_by_meta(int scope_id, String data_type, String gui_type, String gui_args, String dflt) { + public void Load_by_meta(Bry_bfr tmp_bfr, int scope_id, String data_type, String gui_type, String gui_args, String dflt_str) { this.data_type = data_type; this.gui_type = gui_type; this.gui_args = gui_args; - this.dflt = dflt; + this.dflt = Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(dflt_str), Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N); } public void Load_by_i18n(String lang, String name, String help) { this.lang = lang; this.name = name; this.help = help; } - public void Load_by_data(String ctx, String val, String date) { + public void Load_by_data(Bry_bfr tmp_bfr, String ctx, String val_str, String date) { this.ctx = ctx; - this.val = val; + this.val = Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(val_str), Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N); this.date = date; this.edited = true; if ( String_.Has(gui_args, "read"+"only=") || String_.Has(gui_args, "disabled=") @@ -61,40 +63,38 @@ public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm { this.date = String_.Empty; this.edited = false; } - public Gfobj_nde To_nde() { + public Gfobj_nde To_nde(Bry_bfr tmp_bfr) { Gfobj_nde rv = Gfobj_nde.New(); rv.Add_int("id", id); rv.Add_str("key", key); - rv.Add_str("dflt", dflt); - rv.Add_str("dflt_text", String_.Replace(dflt, "'", "'")); + rv.Add_bry("dflt", dflt); rv.Add_str("lang", lang); rv.Add_str("name", name); rv.Add_str("help", help); rv.Add_str("ctx", ctx); - rv.Add_str("val", val); + rv.Add_bry("val", val); rv.Add_str("date", date); rv.Add_str("gui", gui_type); - Bry_bfr bfr = Bry_bfr_.New(); - To_html(bfr, type_mgr); - rv.Add_str("html", bfr.To_str_and_clear()); + To_html(tmp_bfr, type_mgr); + rv.Add_str("html", tmp_bfr.To_str_and_clear()); rv.Add_bool("edited", edited); return rv; } private void To_html(Bry_bfr bfr, Xocfg_type_mgr type_mgr) { - new Xoedit_itm_html().Build_html(bfr, type_mgr, key, name, data_type, gui_type, gui_args, val); + Xoedit_itm_html.Build_html(bfr, type_mgr, key, name, data_type, gui_type, gui_args, val); } public boolean Mustache__write(String k, Mustache_bfr bfr) { - if (String_.Eq(k, "id")) bfr.Add_int(id); - else if (String_.Eq(k, "key")) bfr.Add_str_u8(key); - else if (String_.Eq(k, "dflt")) bfr.Add_str_u8(dflt); - else if (String_.Eq(k, "lang")) bfr.Add_str_u8(lang); - else if (String_.Eq(k, "name")) bfr.Add_str_u8(name); - else if (String_.Eq(k, "help")) bfr.Add_str_u8(help); - else if (String_.Eq(k, "ctx")) bfr.Add_str_u8(ctx); - else if (String_.Eq(k, "val")) bfr.Add_str_u8(val); - else if (String_.Eq(k, "date")) bfr.Add_str_u8(date); - else if (String_.Eq(k, "gui")) bfr.Add_str_u8(gui_type); - else if (String_.Eq(k, "html")) To_html(bfr.Bfr(), type_mgr); + if (String_.Eq(k, "id")) bfr.Add_int(id); + else if (String_.Eq(k, "key")) bfr.Add_str_u8(key); + else if (String_.Eq(k, "dflt")) bfr.Add_bry(dflt); + else if (String_.Eq(k, "lang")) bfr.Add_str_u8(lang); + else if (String_.Eq(k, "name")) bfr.Add_str_u8(name); + else if (String_.Eq(k, "help")) bfr.Add_str_u8(help); + else if (String_.Eq(k, "ctx")) bfr.Add_str_u8(ctx); + else if (String_.Eq(k, "val")) bfr.Add_bry(val); + else if (String_.Eq(k, "date")) bfr.Add_str_u8(date); + else if (String_.Eq(k, "gui")) bfr.Add_str_u8(gui_type); + else if (String_.Eq(k, "html")) To_html(bfr.Bfr(), type_mgr); return true; } public Mustache_doc_itm[] Mustache__subs(String k) { diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_itm_html.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_itm_html.java index 1e9b2ed38..b67fe8bc3 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_itm_html.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_itm_html.java @@ -19,28 +19,30 @@ package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gp import gplx.xowa.addons.apps.cfgs.enums.*; import gplx.xowa.addons.apps.cfgs.mgrs.types.*; public class Xoedit_itm_html { - public void Build_html(Bry_bfr bfr, Xocfg_type_mgr type_mgr, String key, String name, String data_type, String gui_type_key, String gui_args, String val) { + public static void Build_html(Bry_bfr bfr, Xocfg_type_mgr type_mgr, String key, String name, String data_type, String gui_type_key, String gui_args, byte[] val) { // if gui_args exists, prepend space for html insertion; EX: "type='checkbox'{1}>" with "a=b" -> "type='checkbox' a='b'" x> "type='checkbox'a='b'" if (String_.Len_gt_0(gui_args)) gui_args = " " + gui_args; switch (Xoitm_gui_tid.To_uid(gui_type_key)) { case Xoitm_gui_tid.Tid__bool: - bfr.Add_str_u8_fmt("", gui_type_key, gui_args, key, String_.Eq(val, "y") ? " checked=\"checked\"" : ""); - /* - String span_args = ""; - if (String_.Has(gui_args, "disabled=\"disabled\"")) - span_args = " class=\"xocfg__bool__disabled\""; - bfr.Add_str_u8_fmt("", gui_type_key, gui_args, key, String_.Eq(val, "y") ? " checked=\"checked\"" : "", span_args); - */ + bfr.Add_str_u8_fmt + ( "" + , gui_type_key, gui_args, key, Bry_.Eq(val, Bool_.Y_bry) ? " checked=\"checked\"" : ""); break; case Xoitm_gui_tid.Tid__int: - bfr.Add_str_u8_fmt("", gui_type_key, gui_args, key, val); + bfr.Add_str_u8_fmt + ( "" + , gui_type_key, gui_args, key, val); break; case Xoitm_gui_tid.Tid__str: - bfr.Add_str_u8_fmt("", gui_type_key, gui_args, key, val); + bfr.Add_str_u8_fmt + ( "" + , gui_type_key, gui_args, key, val); break; case Xoitm_gui_tid.Tid__memo: if (String_.Len_eq_0(gui_args)) gui_args = " rows=\"4\""; - bfr.Add_str_u8_fmt("", gui_type_key, gui_args, key, String_.Replace(val, "<", "<")); + bfr.Add_str_u8_fmt + ( "" + , gui_type_key, gui_args, key, val); break; case Xoitm_gui_tid.Tid__list: // get list of kvs by type @@ -49,27 +51,32 @@ public class Xoedit_itm_html { if (String_.Len_eq_0(gui_args)) gui_args = "size=\"" + Int_.To_str(len) + "\""; // build html - bfr.Add_str_u8_fmt("\n" + , gui_type_key, gui_args, key); + String val_str = String_.new_u8(val); for (int i = 0; i < len; i++) { Keyval kv = kvs_ary[i]; String kv_key = kv.Key(); String kv_val = kv.Val_to_str_or_null(); - bfr.Add_str_u8_fmt("\n", kv_key, kv_val, String_.Eq(val, kv_key) ? " selected=\"selected\"" : ""); + bfr.Add_str_u8_fmt + ( "\n" + , kv_key, kv_val, String_.Eq(val_str, kv_key) ? " selected=\"selected\"" : ""); } bfr.Add_str_u8_fmt("\n"); break; case Xoitm_gui_tid.Tid__io_cmd: - String[] lines = Xocfg_mgr.Parse_io_cmd(val); + String[] lines = Xocfg_mgr.Parse_io_cmd(String_.new_u8(val)); bfr.Add_str_u8_fmt ( "\n" + "
\n" , gui_type_key, gui_args, key, lines[0]); bfr.Add_str_u8_fmt ( "\n" - , gui_type_key, gui_args, key, String_.Replace(lines[1], "\"", """)); + , gui_type_key, gui_args, key, lines[1]); break; case Xoitm_gui_tid.Tid__gui_binding: - String[] flds = Xoitm_gui_binding.To_gui(val); + String[] flds = Xoitm_gui_binding.To_gui(String_.new_u8(val)); bfr.Add_str_u8_fmt ( "\n" , gui_type_key, gui_args, key, flds[0]); @@ -78,7 +85,9 @@ public class Xoedit_itm_html { , gui_type_key, gui_args, key, flds[1]); break; case Xoitm_gui_tid.Tid__btn: - bfr.Add_str_u8_fmt("", gui_type_key, gui_args, key, name); + bfr.Add_str_u8_fmt + ( "" + , gui_type_key, gui_args, key, name); break; default: break; diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_root.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_root.java index 87dd0be3d..cd4d0859b 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_root.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/objs/Xoedit_root.java @@ -27,13 +27,13 @@ public class Xoedit_root implements Mustache_doc_itm { this.page_help = page_help; this.grps = grps; } - public Gfobj_nde To_nde() { + public Gfobj_nde To_nde(Bry_bfr tmp_bfr) { Gfobj_nde rv = Gfobj_nde.New(); List_adp list = List_adp_.New(); int len = grps.length; for (int i = 0; i < len; i++) { Xoedit_grp itm = grps[i]; - list.Add(itm.To_nde()); + list.Add(itm.To_nde(tmp_bfr)); } rv.Add_str("page_help", page_help); rv.Add_ary("grps", new Gfobj_ary((Gfobj_nde[])list.To_ary_and_clear(Gfobj_nde.class))); diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_loader.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_loader.java index cd15c8ac3..4e81cba94 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_loader.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_loader.java @@ -54,8 +54,9 @@ public class Xocfg_edit_loader { } // load itms and i18n - Load_itm_meta(itm_list); - Load_itm_data(itm_list, ctx); + Bry_bfr tmp_bfr = Bry_bfr_.New(); + Load_itm_meta(tmp_bfr, itm_list); + Load_itm_data(tmp_bfr, itm_list, ctx); Load_i18n(grp_list, itm_list, lang); Xoedit_nde page_nde = grp_list.Get_by_or_fail(grp_key); @@ -146,7 +147,7 @@ public class Xocfg_edit_loader { } owner.Itms_((Xoedit_itm[])itms_list.To_ary_and_clear(Xoedit_itm.class)); } - private void Load_itm_meta(Xoedit_nde_hash itm_list) { + private void Load_itm_meta(Bry_bfr tmp_bfr, Xoedit_nde_hash itm_list) { Xogui_nde_iter iter = Xogui_nde_iter.New_sql(itm_list); while (iter.Move_next()) { String sql = Db_sql_.Make_by_fmt(String_.Ary @@ -168,11 +169,11 @@ public class Xocfg_edit_loader { Xoedit_itm edit_itm = (Xoedit_itm)itm_list.Get_by_or_fail(key); String dflt = dflt_mgr.Get_or(key, rdr.Read_str("itm_dflt")); int gui_type = rdr.Read_int("itm_gui_type"); - edit_itm.Load_by_meta(rdr.Read_int("itm_scope_id"), rdr.Read_str("itm_data_type"), gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_tid.To_key(gui_type), rdr.Read_str("itm_gui_args"), dflt); + edit_itm.Load_by_meta(tmp_bfr, rdr.Read_int("itm_scope_id"), rdr.Read_str("itm_data_type"), gplx.xowa.addons.apps.cfgs.enums.Xoitm_gui_tid.To_key(gui_type), rdr.Read_str("itm_gui_args"), dflt); } } } - private void Load_itm_data(Xoedit_nde_hash itm_list, String... ctxs) { + private void Load_itm_data(Bry_bfr tmp_bfr, Xoedit_nde_hash itm_list, String... ctxs) { Xoedit_nde_hash cur_regy = new Xoedit_nde_hash().Merge(itm_list); // loop ctxs where later ctxs are more general defaults; EX: ["en.w", "en.*", "*.w", "app"] @@ -197,7 +198,7 @@ public class Xocfg_edit_loader { Db_rdr rdr = db_usr.Conn().Stmt_sql(sql).Exec_select__rls_auto(); while (rdr.Move_next()) { Xoedit_itm gui_itm = (Xoedit_itm)cur_regy.Get_by_or_fail(rdr.Read_str("itm_key")); - gui_itm.Load_by_data(rdr.Read_str("itm_ctx"), rdr.Read_str("itm_val"), rdr.Read_str("itm_date")); + gui_itm.Load_by_data(tmp_bfr, rdr.Read_str("itm_ctx"), rdr.Read_str("itm_val"), rdr.Read_str("itm_date")); cur_regy.Deleted__add(gui_itm); } } diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_svc.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_svc.java index 2e5568d9a..dd9151e24 100644 --- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_svc.java +++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_svc.java @@ -54,7 +54,7 @@ public class Xocfg_edit_svc { String key = args.Get_as_str("key"); if (edit_loader == null) edit_loader = Xocfg_edit_loader.New(app); Xoedit_root root = edit_loader.Load_root(key, ctx, "en"); + app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.load__recv", root.To_nde(Bry_bfr_.New())); app.Cfg().Set_str_app("xowa.app.cfg.recent_page", key); - app.Gui__cbk_mgr().Send_json(cbk_trg, "xo.cfg_edit.load__recv", root.To_nde()); } }