1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00
This commit is contained in:
gnosygnu
2015-05-24 22:43:55 -04:00
parent 6eec99a713
commit 51e6188c1e
1577 changed files with 11555 additions and 10080 deletions

View File

@@ -32,7 +32,7 @@ public class Arg_nde_tkn_mock extends Arg_nde_tkn { public Arg_nde_tkn_mock(bool
}
class Arg_itm_tkn_mock extends Arg_itm_tkn_base {
public Arg_itm_tkn_mock(String v) {
byte[] dat_ary = Bry_.new_utf8_(v);
byte[] dat_ary = Bry_.new_u8(v);
this.Subs_add(new Xop_bry_tkn(-1, -1, dat_ary));
this.Dat_ary_(dat_ary);
this.val = v;

View File

@@ -26,7 +26,7 @@ public class Xop_curly_bgn_lxr implements Xop_lxr {
public static Btrie_fast_mgr tmpl_bgn_trie_() { // hook sequences for adding new_line to tmpl return; "{|" "|-" ":" ";" "#" "*"; EX: "{{a}}" returns "*"; convert to "\n*"
Btrie_fast_mgr rv = Btrie_fast_mgr.cs_();
rv.Add(Xop_tblw_lxr_ws.Hook_tb, Bry_.Empty);
rv.Add(Bry_.new_ascii_("|-"), Bry_.Empty);
rv.Add(Bry_.new_a7("|-"), Bry_.Empty);
rv.Add(Byte_ascii.Colon, Bry_.Empty);
rv.Add(Byte_ascii.Semic, Bry_.Empty);
rv.Add(Byte_ascii.Hash, Bry_.Empty);

View File

@@ -131,7 +131,7 @@ public class Xop_curly_wkr implements Xop_ctx_wkr {
if (vnt_dash_adjust) {
Xop_tkn_itm text_tkn = root.Subs_get_or_null(root.Subs_len() - 2); // -2 to get tkn before newly-created tmpl / prm
if (text_tkn == null || text_tkn.Tkn_tid() != Xop_tkn_itm_.Tid_txt)
ctx.Wiki().Appe().Usr_dlg().Warn_many("", "", "token before curly_bgn was not text tkn; src=~{0}", String_.new_utf8_(src, lxr_bgn_pos, lxr_end_pos));
ctx.Wiki().Appe().Usr_dlg().Warn_many("", "", "token before curly_bgn was not text tkn; src=~{0}", String_.new_u8(src, lxr_bgn_pos, lxr_end_pos));
else
text_tkn.Src_end_(text_tkn.Src_end() + 1); // +1 to extend txt_tkn with dash be 1 to include curly; EX: "-" "{{{" -> "-{" "{{"
}

View File

@@ -30,7 +30,7 @@ public class Xop_tkn_print_tst {
@Test public void Tmpl_pf() {tst_Print("{{#expr:1}}");}
private void tst_Print(String raw) {
Xop_ctx ctx = fxt.Ctx();
byte[] raw_bry = Bry_.new_utf8_(raw);
byte[] raw_bry = Bry_.new_u8(raw);
Xot_defn_tmpl defn = fxt.run_Parse_tmpl(Bry_.Empty, raw_bry);
Xot_fmtr_prm raw_fmtr = new Xot_fmtr_prm();
defn.Root().Tmpl_fmt(ctx, raw_bry, raw_fmtr);

View File

@@ -53,7 +53,7 @@ public class Xot_defn_tmpl implements Xot_defn {
}
return bfr.To_bry_and_rls();
}
private static final byte[] Bry_onlyinclude_bgn = Bry_.new_ascii_("<onlyinclude>"), Bry_onlyinclude_end = Bry_.new_ascii_("</onlyinclude>");
private static final byte[] Bry_onlyinclude_bgn = Bry_.new_a7("<onlyinclude>"), Bry_onlyinclude_end = Bry_.new_a7("</onlyinclude>");
private static int Bry_onlyinclude_bgn_len = Bry_onlyinclude_bgn.length, Bry_onlyinclude_end_len = Bry_onlyinclude_end.length;
public void Rls() {
if (root != null) root.Clear();
@@ -64,7 +64,7 @@ public class Xot_defn_tmpl implements Xot_defn {
if (root == null) Parse_tmpl(ctx);
Xoae_page page = ctx.Cur_page();
if (!page.Tmpl_stack_add(full_name)) {
bfr.Add_str("<span class=\"error\">Template loop detected:" + String_.new_utf8_(name) + "</span>");
bfr.Add_str_a7("<span class=\"error\">Template loop detected:" + String_.new_u8(name) + "</span>");
return false;
}
boolean rv = true;

View File

@@ -32,10 +32,10 @@ class Xot_defn_trace_null implements Xot_defn_trace {
}
class Xot_defn_trace_brief implements Xot_defn_trace {
public int Count() {return hash.Count();}
public Xot_defn_trace_itm_brief GetAt(int i) {return (Xot_defn_trace_itm_brief)hash.FetchAt(i);}
public Xot_defn_trace_itm_brief GetAt(int i) {return (Xot_defn_trace_itm_brief)hash.Get_at(i);}
public void Trace_bgn(Xop_ctx ctx, byte[] src, byte[] name, Xot_invk caller, Xot_invk self, Xot_defn defn) {
int hashKey = Bry_obj_ref.CalcHashCode(name, 0, name.length);
Object o = hash.Fetch(hashKey);
Object o = hash.Get_by(hashKey);
Xot_defn_trace_itm_brief itm = null;
if (o == null) {
itm = new Xot_defn_trace_itm_brief().Name_(name);
@@ -44,13 +44,13 @@ class Xot_defn_trace_brief implements Xot_defn_trace {
else
itm = (Xot_defn_trace_itm_brief)o;
itm.Count_add();
} private OrderedHash hash = OrderedHash_.new_();
} private Ordered_hash hash = Ordered_hash_.new_();
public void Trace_end(int trg_bgn, Bry_bfr trg) {}
public void Print(byte[] src, Bry_bfr bb) {
int count = hash.Count(); if (count == 0) return;
if (bb.Len() != 0) bb.Add_byte_nl(); // only add newLine if something in bb; needed for tests
for (int i = 0; i < count; i++) {
Xot_defn_trace_itm_brief itm = (Xot_defn_trace_itm_brief)hash.FetchAt(i);
Xot_defn_trace_itm_brief itm = (Xot_defn_trace_itm_brief)hash.Get_at(i);
bb.Add_int_fixed(itm.Count(), 4).Add_byte(Byte_ascii.Space);
bb.Add(itm.Name()).Add_byte_nl();
}

View File

@@ -37,8 +37,8 @@ class Xot_defn_trace_fxt {
public void tst_(String raw, String... expd_ary) {
Xop_ctx ctx = fxt.Ctx();
ctx.Defn_trace().Clear();
byte[] src = Bry_.new_utf8_(raw);
ctx.Cur_page().Ttl_(Xoa_ttl.parse_(fxt.Wiki(), Bry_.new_ascii_("test")));
byte[] src = Bry_.new_u8(raw);
ctx.Cur_page().Ttl_(Xoa_ttl.parse_(fxt.Wiki(), Bry_.new_a7("test")));
Xop_root_tkn root = ctx.Tkn_mkr().Root(src);
fxt.Parser().Parse_page_all_clear(root, ctx, ctx.Tkn_mkr(), src);
ctx.Defn_trace().Print(src, tmp);
@@ -49,7 +49,7 @@ class Xot_defn_trace_fxt {
String[] rv = new String[ary.length];
for (int i = 0; i < rv.length; i++) {
Xot_defn_trace_itm_brief itm = ary[i];
sb.Add(String_.new_utf8_(itm.Name())).Add("|").Add(itm.Count());
sb.Add(String_.new_u8(itm.Name())).Add("|").Add(itm.Count());
rv[i] = sb.Xto_str_and_clear();
}
return rv;

View File

@@ -83,15 +83,15 @@ public class Xot_defn_trace_dbg implements Xot_defn_trace {
;
if (arg.KeyTkn_exists()) {
// byte[] key_ary = Bry_.Mid(src, arg.KeyTkn().Dat_bgn(), arg.KeyTkn().Dat_end());
String key_str = String_.new_utf8_(arg.Key_tkn().Dat_ary());
String key_str = String_.new_u8(arg.Key_tkn().Dat_ary());
int key_str_len = String_.Len(key_str);
if (key_str_len > key_max) key_max = key_str_len;
argKeys.Add(key_str + "=" + String_.new_utf8_(arg.Val_tkn().Dat_ary()));
argKeys.Add(key_str + "=" + String_.new_u8(arg.Val_tkn().Dat_ary()));
}
}
argKeys.Sort();
for (int i = 0; i < argKeys.Count(); i++) {
String s = (String)argKeys.FetchAt(i);
String s = (String)argKeys.Get_at(i);
String key = String_.GetStrBefore(s, "=");
String val = String_.GetStrAfter(s, "=");
bfr.Add_byte_repeat(Byte_ascii.Space, indent + 2).Add_str(key)
@@ -107,7 +107,7 @@ public class Xot_defn_trace_dbg implements Xot_defn_trace {
// Fmt(ctx, defn_tmpl.Src(), root, Ary_fmt_lbl , invk, true);
Fmt(ctx, defn_tmpl.Data_raw(), root, Ary_eval_lbl, invk, false);
}
} private Bry_bfr bfr = Bry_bfr.new_(128); ListAdp argKeys = ListAdp_.new_(); Xot_fmtr_prm prm_fmtr = new Xot_fmtr_prm();
} private Bry_bfr bfr = Bry_bfr.new_(128); List_adp argKeys = List_adp_.new_(); Xot_fmtr_prm prm_fmtr = new Xot_fmtr_prm();
private void Fmt(Xop_ctx ctx, byte[] src, Xop_tkn_itm root, byte[] lbl, Xot_invk caller, boolean newLineArgs) {
bfr.Add_byte_repeat(Byte_ascii.Space, indent).Add(lbl);
bfr.Add_byte_repeat(Byte_ascii.Space, indent);
@@ -134,8 +134,8 @@ public class Xot_defn_trace_dbg implements Xot_defn_trace {
public void Clear() {bfr.Clear(); indent = 0; count = 0;}
int indent = 0, count = 0;
public static final Xot_defn_trace_dbg _ = new Xot_defn_trace_dbg(); Xot_defn_trace_dbg() {}
private static final byte[] Ary_invk_lbl = Bry_.new_ascii_("*invk\n"), Ary_lnk_lbl = Bry_.new_ascii_("*lnk: "), Ary_args_lbl = Bry_.new_ascii_("*args\n")
, Ary_result_lbl = Bry_.new_ascii_("*result\n")
, Ary_eval_lbl = Bry_.new_ascii_("*eval\n")
, Ary_source_lbl = Bry_.new_ascii_("*source\n");
private static final byte[] Ary_invk_lbl = Bry_.new_a7("*invk\n"), Ary_lnk_lbl = Bry_.new_a7("*lnk: "), Ary_args_lbl = Bry_.new_a7("*args\n")
, Ary_result_lbl = Bry_.new_a7("*result\n")
, Ary_eval_lbl = Bry_.new_a7("*eval\n")
, Ary_source_lbl = Bry_.new_a7("*source\n");
}

View File

@@ -20,7 +20,7 @@ import org.junit.*;
public class Xot_examples_tst {
private Xop_fxt fxt = new Xop_fxt();
@Before public void init() {
Io_mgr._.InitEngine_mem();
Io_mgr.I.InitEngine_mem();
fxt.Reset();
}
@Test public void Arg_0() {Init_tmpl_for(); fxt.Test_parse_tmpl_str("{{For}}" , "For other uses, see [[Test page (disambiguation)]].");}

View File

@@ -30,13 +30,13 @@ public class Xot_invk_mock implements Xot_invk {
public int Frame_lifetime() {return frame_lifetime;} public void Frame_lifetime_(int v) {frame_lifetime = v;} private int frame_lifetime;
public boolean Rslt_is_redirect() {return rslt_is_redirect;} public void Rslt_is_redirect_(boolean v) {rslt_is_redirect = v;} private boolean rslt_is_redirect;
public Arg_nde_tkn Name_tkn() {return Arg_nde_tkn.Null;}
public int Args_len() {return args.Count() + idx_adj;} private OrderedHash args = OrderedHash_.new_bry_();
public Arg_nde_tkn Args_get_by_idx(int i) {return (Arg_nde_tkn)args.FetchAt(i - idx_adj);}
public int Args_len() {return args.Count() + idx_adj;} private Ordered_hash args = Ordered_hash_.new_bry_();
public Arg_nde_tkn Args_get_by_idx(int i) {return (Arg_nde_tkn)args.Get_at(i - idx_adj);}
public Arg_nde_tkn Args_eval_by_idx(byte[] src, int idx) {// DUPE:MW_ARG_RETRIEVE
int cur = 0, list_len = args.Count();
if (idx >= list_len) return null;
for (int i = 0; i < list_len; i++) { // iterate over list to find nth *non-keyd* arg; SEE:NOTE_1
Arg_nde_tkn nde = (Arg_nde_tkn)args.FetchAt(i);
Arg_nde_tkn nde = (Arg_nde_tkn)args.Get_at(i);
if (nde.KeyTkn_exists()) {
int key_int = Bry_.Xto_int_or(nde.Key_tkn().Dat_ary(), -1);
if (key_int == -1)
@@ -55,7 +55,7 @@ public class Xot_invk_mock implements Xot_invk {
}
return Args_get_by_key(src, Bry_.XtoStrBytesByInt(idx + 1, 1));
}
public Arg_nde_tkn Args_get_by_key(byte[] src, byte[] key) {return (Arg_nde_tkn)args.Fetch(key);}
public Arg_nde_tkn Args_get_by_key(byte[] src, byte[] key) {return (Arg_nde_tkn)args.Get_by(key);}
public static Xot_invk_mock new_(byte defn_tid, byte[] frame_ttl, KeyVal... args) {return new_(defn_tid, 1, frame_ttl, args);}
public static Xot_invk_mock new_(byte[] frame_ttl, KeyVal... args) {return new_(Xot_defn_.Tid_null, 1, frame_ttl, args);}
public static Xot_invk_mock test_(byte[] frame_ttl, KeyVal... args) {return new_(Xot_defn_.Tid_null, 0, frame_ttl, args);}
@@ -78,7 +78,7 @@ public class Xot_invk_mock implements Xot_invk {
}
else // regular nde
nde_tkn = new Arg_nde_tkn_mock(kv_key_str, kv.Val_to_str_or_empty()); // add regular key, val strings
rv.args.AddReplace(Bry_.new_utf8_(kv_key_str), nde_tkn);
rv.args.Add_if_dupe_use_nth(Bry_.new_u8(kv_key_str), nde_tkn);
}
return rv;
}

View File

@@ -19,9 +19,9 @@ package gplx.xowa; import gplx.*;
import gplx.core.primitives.*;
import gplx.xowa.xtns.scribunto.*;
public class Xot_invk_temp implements Xot_invk {
private ListAdp list = ListAdp_.new_();
private List_adp list = List_adp_.new_();
private Hash_adp_bry arg_key_hash;
private HashAdp arg_idx_hash; private Int_obj_ref arg_idx_ref;
private Hash_adp arg_idx_hash; private Int_obj_ref arg_idx_ref;
Xot_invk_temp() {}
public Xot_invk_temp(boolean root_frame) {this.root_frame = root_frame;}
public Xot_invk_temp(byte defn_tid, byte[] src, Arg_nde_tkn name_tkn, int src_bgn, int src_end) {
@@ -42,27 +42,27 @@ public class Xot_invk_temp implements Xot_invk {
public Arg_nde_tkn Args_eval_by_idx(byte[] src, int idx) { // NOTE: idx is base0
return arg_idx_hash == null // only true if no args, or all args are keys; EX: {{A|b=1|c=2}}
? null
: (Arg_nde_tkn)arg_idx_hash.Fetch(arg_idx_ref.Val_(idx)); // lookup int in hash; needed b/c multiple identical keys should retrieve last, not first; EX: {{A|1=a|1=b}}; PAGE:el.d:ἔχω DATE:2014-07-23
: (Arg_nde_tkn)arg_idx_hash.Get_by(arg_idx_ref.Val_(idx)); // lookup int in hash; needed b/c multiple identical keys should retrieve last, not first; EX: {{A|1=a|1=b}}; PAGE:el.d:ἔχω DATE:2014-07-23
}
public Arg_nde_tkn Args_get_by_idx(int i) {return (Arg_nde_tkn)list.FetchAt(i);}
public Arg_nde_tkn Args_get_by_idx(int i) {return (Arg_nde_tkn)list.Get_at(i);}
public Arg_nde_tkn Args_get_by_key(byte[] src, byte[] key) {
return arg_key_hash == null ? null : (Arg_nde_tkn)arg_key_hash.Get_by_bry(key);
}
public void Args_add(Arg_nde_tkn arg) {list.Add(arg);}
public void Args_add_by_key(byte[] key, Arg_nde_tkn arg) {
if (arg_key_hash == null) arg_key_hash = Hash_adp_bry.cs_(); // PERF: lazy
arg_key_hash.AddReplace(key, arg);
arg_key_hash.Add_if_dupe_use_nth(key, arg);
int key_as_int = Bry_.Xto_int_or(key, Int_.MinValue);
if (key_as_int != Int_.MinValue) // key is int; add it to arg_idx_hash; EX:{{A|1=a}} vs {{A|a}}; DATE:2014-07-23
Arg_idx_hash_add(key_as_int - ListAdp_.Base1, arg);
Arg_idx_hash_add(key_as_int - List_adp_.Base1, arg);
}
public void Args_add_by_idx(Arg_nde_tkn arg) {Arg_idx_hash_add(++args_add_by_idx, arg);} private int args_add_by_idx = -1; // NOTE: args_add_by_idx needs to be a separate variable; keeps track of args which don't have a key;
private void Arg_idx_hash_add(int int_key, Arg_nde_tkn arg) {
if (arg_idx_hash == null) {
arg_idx_hash = HashAdp_.new_();
arg_idx_hash = Hash_adp_.new_();
arg_idx_ref = Int_obj_ref.neg1_();
}
arg_idx_hash.AddReplace(Int_obj_ref.new_(int_key), arg); // AddReplace to keep latest version; needed for {{A|1=a|1=b}} DATE:2014-07-23
arg_idx_hash.Add_if_dupe_use_nth(Int_obj_ref.new_(int_key), arg); // Add_if_dupe_use_nth to keep latest version; needed for {{A|1=a|1=b}} DATE:2014-07-23
}
public static final Xot_invk_temp Page_is_caller = new Xot_invk_temp(true); // SEE NOTE_2
}

View File

@@ -234,9 +234,9 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
rv = true;
} catch (Exception e) {
if (Env_.Mode_testing())
throw Err_.err_(e, "failed to evaluate function: page={0} defn={1} src={2} err={3}", String_.new_utf8_(ctx.Cur_page().Ttl().Full_txt()), String_.new_utf8_(defn.Name()), String_.new_utf8_(src, this.Src_bgn(), this.Src_end()), Err_.Message_gplx_brief(e));
throw Err_.err_(e, "failed to evaluate function: page={0} defn={1} src={2} err={3}", String_.new_u8(ctx.Cur_page().Ttl().Full_txt()), String_.new_u8(defn.Name()), String_.new_u8(src, this.Src_bgn(), this.Src_end()), Err_.Message_gplx_brief(e));
else {
wiki.Appe().Usr_dlg().Warn_many("", "", "failed to evaluate function: page=~{0} defn=~{1} src=~{2} err=~{3}", String_.new_utf8_(ctx.Cur_page().Ttl().Full_txt()), String_.new_utf8_(defn.Name()), String_.new_utf8_(src, this.Src_bgn(), this.Src_end()), Err_.Message_gplx_brief(e));
wiki.Appe().Usr_dlg().Warn_many("", "", "failed to evaluate function: page=~{0} defn=~{1} src=~{2} err=~{3}", String_.new_u8(ctx.Cur_page().Ttl().Full_txt()), String_.new_u8(defn.Name()), String_.new_u8(src, this.Src_bgn(), this.Src_end()), Err_.Message_gplx_brief(e));
rv = false;
}
}
@@ -252,7 +252,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
try {
Bld_key(invk_tmpl, name_ary, rslt_bfr);
byte[] rslt_key = rslt_bfr.Xto_bry_and_clear();
Object o = wiki.Cache_mgr().Tmpl_result_cache().Fetch(rslt_key);
Object o = wiki.Cache_mgr().Tmpl_result_cache().Get_by(rslt_key);
Xopg_tmpl_prepend_mgr prepend_mgr = ctx.Cur_page().Tmpl_prepend_mgr().Bgn(bfr);
if (o != null) {
byte[] rslt = (byte[])o;
@@ -269,7 +269,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
if (Cache_enabled) {
byte[] rslt_val = rslt_bfr.Xto_bry_and_clear();
bfr.Add(rslt_val);
HashAdp cache = wiki.Cache_mgr().Tmpl_result_cache();
Hash_adp cache = wiki.Cache_mgr().Tmpl_result_cache();
cache.Del(rslt_key);
cache.Add(rslt_key, rslt_val);
}
@@ -281,7 +281,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
break;
}
return rv;
} private static final byte[] Ary_unknown_bgn = Bry_.new_ascii_("(? [["), Ary_unknown_end = Bry_.new_ascii_("]] ?)"), Ary_dynamic_is_blank = Bry_.new_ascii_("dynamic is blank");
} private static final byte[] Ary_unknown_bgn = Bry_.new_a7("(? [["), Ary_unknown_end = Bry_.new_a7("]] ?)"), Ary_dynamic_is_blank = Bry_.new_a7("dynamic is blank");
private boolean Popup_skip(Xop_ctx ctx, byte[] ttl, Bry_bfr bfr) {
boolean skip = false;
skip = this.Src_end() - this.Src_bgn() > ctx.Tmpl_tkn_max();

View File

@@ -210,7 +210,7 @@ public class Xot_invk_wkr_basic_tst {
@Test public void Missing_foreign() {
Xow_ns ns = fxt.Wiki().Ns_mgr().Ns_template();
byte[] old_ns = ns.Name_bry();
ns.Name_bry_(Bry_.new_ascii_("Template_foreign"));
ns.Name_bry_(Bry_.new_a7("Template_foreign"));
fxt.Test_parse_tmpl_str("{{Missing}}", "[[:Template_foreign:Missing]]");
ns.Name_bry_(old_ns);
}

View File

@@ -60,7 +60,7 @@ public class Xot_prm_tkn extends Xop_tkn_itm_base {
else { // prm is idx; EX: "{{{1}}}"
// int invk_args_len = caller.Args_len();
// if (prm_idx > invk_args_len) {Tmpl_write_missing(ctx, src, caller, bfr); return true;}
arg_nde = caller.Args_eval_by_idx(src, prm_idx - ListAdp_.Base1); // MW args are Base1; EX: {{test|a|b}}; a is {{{1}}}; b is {{{2}}}
arg_nde = caller.Args_eval_by_idx(src, prm_idx - List_adp_.Base1); // MW args are Base1; EX: {{test|a|b}}; a is {{{1}}}; b is {{{2}}}
if (arg_nde == null) {Tmpl_write_missing(ctx, src, caller, bfr); return true;} // EX: handles "{{{1}}}{{{2}}}" "{{test|a|keyd=b}}" -> "a{{{2}}}"
}
Arg_itm_tkn arg_val = arg_nde.Val_tkn();

View File

@@ -98,11 +98,11 @@ public class Xot_tmpl_wtr {
tkn.Tmpl_evaluate(ctx, src, Xot_invk_temp.Page_is_caller.Src_(src), rslt_bfr);
}
catch (Exception exc) {
Err_string = String_.new_utf8_(src, tkn.Src_bgn(), tkn.Src_end()) + "|" + ClassAdp_.NameOf_obj(exc) + "|" + Err_.Message_lang(exc);
Err_string = String_.new_u8(src, tkn.Src_bgn(), tkn.Src_end()) + "|" + ClassAdp_.NameOf_obj(exc) + "|" + Err_.Message_lang(exc);
if (Env_.Mode_testing())
throw Err_.err_(exc, Err_string);
else
ctx.App().Usr_dlg().Warn_many("", "", "failed to write tkn: page=~{0} err=~{1}", String_.new_utf8_(ctx.Cur_page().Ttl().Page_db()), Err_string);
ctx.App().Usr_dlg().Warn_many("", "", "failed to write tkn: page=~{0} err=~{1}", String_.new_u8(ctx.Cur_page().Ttl().Page_db()), Err_string);
}
break;
}