diff --git a/100_core/src/gplx/String_bldr.java b/100_core/src/gplx/String_bldr.java index 83bb7c2b0..77c6d80e8 100644 --- a/100_core/src/gplx/String_bldr.java +++ b/100_core/src/gplx/String_bldr.java @@ -50,7 +50,7 @@ abstract class String_bldr_base implements String_bldr { public String_bldr Add_fmt_line(String format, Object... args) {Add_str_w_crlf(String_.Format(format, args)); return this;} public String_bldr Add_kv_obj(String k, Object v) { if (this.Count() != 0) this.Add(" "); - this.Add_fmt("{0}={1}", k, Object_.XtoStr_OrNullStr(v)); + this.Add_fmt("{0}={1}", k, Object_.Xto_str_strict_or_null_mark(v)); return this; } public String_bldr Add_char_pipe() {return Add("|");} diff --git a/100_core/src_000_err/gplx/Err_.java b/100_core/src_000_err/gplx/Err_.java index b6eb05394..208d49db6 100644 --- a/100_core/src_000_err/gplx/Err_.java +++ b/100_core/src_000_err/gplx/Err_.java @@ -27,7 +27,7 @@ public class Err_ { //_20110415 public static Err err_(Exception e, String fmt, Object... args) {return Err.exc_(e, String_.Format(fmt, args));} public static Err cast_(Exception ignore, Class t, Object o) { String o_str = ""; - try {o_str = Object_.XtoStr_OrNullStr(o);} + try {o_str = Object_.Xto_str_strict_or_null_mark(o);} catch (Exception e) {Err_.Noop(e); o_str = "";} return cast_manual_msg_(ignore, t, o_str); } @@ -46,7 +46,7 @@ public class Err_ { //_20110415 return Err.hdr_("type mismatch") .Add("expdType", ClassAdp_.FullNameOf_type(t)) .Add("actlType", ClassAdp_.NameOf_obj(o)) - .Add("actlObj", Object_.XtoStr_OrNullStr(o)) + .Add("actlObj", Object_.Xto_str_strict_or_null_mark(o)) ; } public static Err missing_idx_(int idx, int len) {return Err.hdr_("index is out of bounds").Add("idx", idx).Add("len", len);} diff --git a/100_core/src_000_err/gplx/Err_mgr.java b/100_core/src_000_err/gplx/Err_mgr.java index 7aa09dcd9..17ce4eb73 100644 --- a/100_core/src_000_err/gplx/Err_mgr.java +++ b/100_core/src_000_err/gplx/Err_mgr.java @@ -20,7 +20,7 @@ public class Err_mgr { Err_mgr(Gfo_msg_root msg_root) {this.msg_root = msg_root;} Gfo_msg_root msg_root; public Err not_implemented_() {return Err_.new_(Msg_not_implemented.Gen_str_none());} public Err unhandled_(Object obj) {return Err_.new_(Msg_unhandled.Gen_str_one(obj));} - public Err cast_(Exception e, Class obj_class, Object obj) {return Err_.new_(Msg_cast.Gen_str_many(ClassAdp_.NameOf_type(obj_class), Object_.XtoStr_OrNullStr(obj)));} + public Err cast_(Exception e, Class obj_class, Object obj) {return Err_.new_(Msg_cast.Gen_str_many(ClassAdp_.NameOf_type(obj_class), Object_.Xto_str_strict_or_null_mark(obj)));} public Err parse_(Class type , byte[] raw) {return Err_.new_(Msg_parse.Gen_str_many(ClassAdp_.NameOf_type(type), String_.new_utf8_len_safe_(raw, 0, 255)));} public Err parse_obj_(Object o , byte[] raw) {return Err_.new_(Msg_parse.Gen_str_many(ClassAdp_.NameOf_obj(o), String_.new_utf8_len_safe_(raw, 0, 255)));} public Err parse_(String type_name, byte[] raw) {return Err_.new_(Msg_parse.Gen_str_many(type_name, String_.new_utf8_len_safe_(raw, 0, 255)));} diff --git a/100_core/src_100_interface/gplx/SrlAble_.java b/100_core/src_100_interface/gplx/SrlAble_.java index 60afba846..cccee2a90 100644 --- a/100_core/src_100_interface/gplx/SrlAble_.java +++ b/100_core/src_100_interface/gplx/SrlAble_.java @@ -24,7 +24,7 @@ public class SrlAble_ { return sb.XtoStr(); } public static String XtoStr(Object o) { - SrlAble s = SrlAble_.as_(o); if (s == null) return Object_.XtoStr_OrNullStr(o); + SrlAble s = SrlAble_.as_(o); if (s == null) return Object_.Xto_str_strict_or_null_mark(o); GfoMsg m = GfoMsg_.new_parse_("root"); s.Srl(m); return XtoStr(m); @@ -36,7 +36,7 @@ public class SrlAble_ { for (int i = 0; i < owner.Args_count(); i++) { if (i != 0) sb.Add(" "); KeyVal kv = owner.Args_getAt(i); - sb.Add(kv.Key()).Add("=").Add("'").Add(Object_.XtoStr_OrNullStr(kv.Val())).Add("'"); + sb.Add(kv.Key()).Add("=").Add("'").Add(Object_.Xto_str_strict_or_null_mark(kv.Val())).Add("'"); } int subsCount = owner.Subs_count(); if (subsCount == 0) { diff --git a/100_core/src_110_primitive/gplx/Bool_.java b/100_core/src_110_primitive/gplx/Bool_.java index 348d59237..aa7f0c8f7 100644 --- a/100_core/src_110_primitive/gplx/Bool_.java +++ b/100_core/src_110_primitive/gplx/Bool_.java @@ -41,7 +41,8 @@ public class Bool_ implements GfoInvkAble { public static final byte N_byte = 0, Y_byte = 1, __byte = 127; public static final boolean N = false, Y = true; public static final String N_str = "n", Y_str = "y"; - public static final byte[] True_bry = Bry_.new_ascii_("true"), False_bry = Bry_.new_ascii_("false"); + public static final String True_str = "true", False_str = "false"; + public static final byte[] True_bry = Bry_.new_ascii_(True_str), False_bry = Bry_.new_ascii_(False_str); public static final byte[] Y_bry = new byte[] {Byte_ascii.Ltr_y}, N_bry = new byte[] {Byte_ascii.Ltr_n}; public static final Bool_ Gfs = new Bool_(); diff --git a/100_core/src_110_primitive/gplx/Bry_.java b/100_core/src_110_primitive/gplx/Bry_.java index 35e9e7d20..b6d0e8002 100644 --- a/100_core/src_110_primitive/gplx/Bry_.java +++ b/100_core/src_110_primitive/gplx/Bry_.java @@ -75,7 +75,7 @@ public class Bry_ { byte[][] rv = new byte[ary_len][]; for (int i = 0; i < ary_len; i++) { Object itm = ary[i]; - rv[i] = itm == null ? null : Bry_.new_utf8_(Object_.XtoStr_OrEmpty(itm)); + rv[i] = itm == null ? null : Bry_.new_utf8_(Object_.Xto_str_strict_or_empty(itm)); } return rv; } @@ -450,6 +450,19 @@ public class Bry_ { if (lhs[i] != rhs[i + rhs_bgn]) return false; return true; } + public static boolean Eq_ci_ascii(byte[] lhs, byte[] rhs, int rhs_bgn, int rhs_end) { + if (lhs == null && rhs == null) return true; + else if (lhs == null || rhs == null) return false; + int lhs_len = lhs.length; + int rhs_len = rhs_end - rhs_bgn; + if (lhs_len != rhs_len) return false; + for (int i = 0; i < lhs_len; i++) { + byte lhs_b = lhs[i]; if (lhs_b > 64 && lhs_b < 91) lhs_b += 32; // lowercase + byte rhs_b = rhs[i + rhs_bgn]; if (rhs_b > 64 && rhs_b < 91) rhs_b += 32; // lowercase + if (lhs_b != rhs_b) return false; + } + return true; + } public static byte[] XtoStrBytesByInt(int val, int padLen) {return XtoStrBytesByInt(val, null, 0, padLen);} public static byte[] XtoStrBytesByInt(int val, byte[] ary, int aryPos, int padLen) { int neg = 0; @@ -481,24 +494,24 @@ public class Bry_ { } return ary; } - public static byte X_to_byte_by_int(byte[] ary, int bgn, int end, byte or) {return (byte)X_to_int_or(ary, bgn, end, or);} - public static int X_to_int(byte[] ary) {return X_to_int_or(ary, null, 0, ary.length, -1);} - public static int X_to_int_or_fail(byte[] ary) { - int rv = X_to_int_or(ary, null, 0, ary.length, Int_.MinValue); + public static byte Xto_byte_by_int(byte[] ary, int bgn, int end, byte or) {return (byte)Xto_int_or(ary, bgn, end, or);} + public static int Xto_int(byte[] ary) {return Xto_int_or(ary, null, 0, ary.length, -1);} + public static int Xto_int_or_fail(byte[] ary) { + int rv = Xto_int_or(ary, null, 0, ary.length, Int_.MinValue); if (rv == Int_.MinValue) throw Err_.new_fmt_("could not parse to int; val={0}", String_.new_utf8_(ary)); return rv; } - public static boolean X_to_bool_by_int_or_fail(byte[] ary) { - int rv = X_to_int_or(ary, null, 0, ary.length, Int_.MinValue); + public static boolean Xto_bool_by_int_or_fail(byte[] ary) { + int rv = Xto_int_or(ary, null, 0, ary.length, Int_.MinValue); switch (rv) { case 0: return false; case 1: return true; default: throw Err_.new_fmt_("could not parse to boolean int; val={0}", String_.new_utf8_(ary)); } } - public static int X_to_int_or(byte[] ary, int or) {return X_to_int_or(ary, null, 0, ary.length, or);} - public static int X_to_int_or(byte[] ary, int bgn, int end, int or) {return X_to_int_or(ary, null, bgn, end, or);} - public static int X_to_int_or(byte[] ary, byte[] ignore_ary, int bgn, int end, int or) { + public static int Xto_int_or(byte[] ary, int or) {return Xto_int_or(ary, null, 0, ary.length, or);} + public static int Xto_int_or(byte[] ary, int bgn, int end, int or) {return Xto_int_or(ary, null, bgn, end, or);} + public static int Xto_int_or(byte[] ary, byte[] ignore_ary, int bgn, int end, int or) { if ( ary == null || end == bgn // null-len ) return or; @@ -532,7 +545,7 @@ public class Bry_ { } return rv; } - public static int X_to_int_or_trim(byte[] ary, int bgn, int end, int or) { // NOTE: same as X_to_int_or, except trims ws at bgn / end; DATE:2014-02-09 + public static int Xto_int_or_trim(byte[] ary, int bgn, int end, int or) { // NOTE: same as Xto_int_or, except trims ws at bgn / end; DATE:2014-02-09 if (end == bgn) return or; // null len int rv = 0, multiple = 1; boolean numbers_seen = false, ws_seen = false; @@ -558,7 +571,7 @@ public class Bry_ { } return rv; } - public static int X_to_int_or_lax(byte[] ary, int bgn, int end, int or) { + public static int Xto_int_or_lax(byte[] ary, int bgn, int end, int or) { if (end == bgn) return or; // null-len int end_num = end; for (int i = bgn; i < end; i++) { @@ -579,7 +592,7 @@ public class Bry_ { break; } } - return X_to_int_or(ary, bgn, end_num, or); + return Xto_int_or(ary, bgn, end_num, or); } public static float XtoFloatByPos(byte[] ary, int bgn, int end) {return Float_.parse_(String_.new_utf8_(ary, bgn, end));} public static double XtoDoubleByPosOr(byte[] ary, int bgn, int end, double or) {return Double_.parseOr_(String_.new_utf8_(ary, bgn, end), or);} @@ -655,7 +668,7 @@ public class Bry_ { int bgn = posRef.Val(); int pos = Bry_finder.Find_fwd(ary, lkp, bgn, ary.length); if (pos == Bry_.NotFound) throw Err_.new_("lkp failed").Add("lkp", (char)lkp).Add("bgn", bgn); - int rv = Bry_.X_to_int_or(ary, posRef.Val(), pos, -1); + int rv = Bry_.Xto_int_or(ary, posRef.Val(), pos, -1); posRef.Val_(pos + 1); // +1 = lkp.Len return rv; } diff --git a/100_core/src_110_primitive/gplx/Bry__tst.java b/100_core/src_110_primitive/gplx/Bry__tst.java index d84c5ecea..6df074ae8 100644 --- a/100_core/src_110_primitive/gplx/Bry__tst.java +++ b/100_core/src_110_primitive/gplx/Bry__tst.java @@ -109,7 +109,7 @@ public class Bry__tst { tst_XtoInt("", -1); } void tst_XtoInt(String val, int expd) {tst_XtoInt(val, -1, expd);} - void tst_XtoInt(String val, int or, int expd) {Tfds.Eq(expd, Bry_.X_to_int_or(Bry_.new_utf8_(val), or));} + void tst_XtoInt(String val, int or, int expd) {Tfds.Eq(expd, Bry_.Xto_int_or(Bry_.new_utf8_(val), or));} void tst_XtoIntBy4Bytes(int expd, byte... ary) {Tfds.Eq(expd, Bry_.XtoIntBy4Bytes(ary), "XtoInt"); Tfds.Eq_ary(ary, Bry_.XbyInt(expd), "XbyInt");} void tst_ReadCsvStr(String raw, String expd) {tst_ReadCsvStr(raw, Int_obj_ref.zero_() , expd);} void tst_ReadCsvStr(String raw, int bgn, String expd) {tst_ReadCsvStr(raw, Int_obj_ref.new_(bgn), expd);} @@ -141,21 +141,21 @@ public class Bry__tst { Trim_tst("a c", 1, 3, ""); Trim_tst(" ", 0, 2, ""); } void Trim_tst(String raw, int bgn, int end, String expd) {Tfds.Eq(expd, String_.new_utf8_(Bry_.Trim(Bry_.new_utf8_(raw), bgn, end)));} - @Test public void X_to_int_lax() { - tst_X_to_int_lax("12a", 12); - tst_X_to_int_lax("1", 1); - tst_X_to_int_lax("123", 123); - tst_X_to_int_lax("a", 0); - tst_X_to_int_lax("-1", -1); + @Test public void Xto_int_lax() { + tst_Xto_int_lax("12a", 12); + tst_Xto_int_lax("1", 1); + tst_Xto_int_lax("123", 123); + tst_Xto_int_lax("a", 0); + tst_Xto_int_lax("-1", -1); } - private void tst_X_to_int_lax(String val, int expd) {Tfds.Eq(expd, Bry_.X_to_int_or_lax(Bry_.new_utf8_(val), 0, String_.Len(val), 0));} - @Test public void X_to_int_or_trim() { - tst_X_to_int_trim("123 " , 123); - tst_X_to_int_trim(" 123" , 123); - tst_X_to_int_trim(" 123 " , 123); - tst_X_to_int_trim(" 1 3 " , -1); + private void tst_Xto_int_lax(String val, int expd) {Tfds.Eq(expd, Bry_.Xto_int_or_lax(Bry_.new_utf8_(val), 0, String_.Len(val), 0));} + @Test public void Xto_int_or_trim() { + tst_Xto_int_trim("123 " , 123); + tst_Xto_int_trim(" 123" , 123); + tst_Xto_int_trim(" 123 " , 123); + tst_Xto_int_trim(" 1 3 " , -1); } - private void tst_X_to_int_trim(String val, int expd) {Tfds.Eq(expd, Bry_.X_to_int_or_trim(Bry_.new_utf8_(val), 0, String_.Len(val), -1));} + private void tst_Xto_int_trim(String val, int expd) {Tfds.Eq(expd, Bry_.Xto_int_or_trim(Bry_.new_utf8_(val), 0, String_.Len(val), -1));} @Test public void Compare() { tst_Compare("abcde", 0, 1, "abcde", 0, 1, CompareAble_.Same); tst_Compare("abcde", 0, 1, "abcde", 1, 2, CompareAble_.Less); diff --git a/100_core/src_110_primitive/gplx/Bry_fmtr_eval_mgr_gfs.java b/100_core/src_110_primitive/gplx/Bry_fmtr_eval_mgr_gfs.java index 6d8cc0c9e..6246f1054 100644 --- a/100_core/src_110_primitive/gplx/Bry_fmtr_eval_mgr_gfs.java +++ b/100_core/src_110_primitive/gplx/Bry_fmtr_eval_mgr_gfs.java @@ -19,7 +19,7 @@ package gplx; public class Bry_fmtr_eval_mgr_gfs implements Bry_fmtr_eval_mgr { public boolean Enabled() {return enabled;} public void Enabled_(boolean v) {enabled = v;} private boolean enabled; public byte[] Eval(byte[] cmd) { - return enabled ? Bry_.new_utf8_(Object_.XtoStr_OrNullStr(GfsCore._.ExecText(String_.new_utf8_(cmd)))) : null; + return enabled ? Bry_.new_utf8_(Object_.Xto_str_strict_or_null_mark(GfsCore._.ExecText(String_.new_utf8_(cmd)))) : null; } public static final Bry_fmtr_eval_mgr_gfs _ = new Bry_fmtr_eval_mgr_gfs(); Bry_fmtr_eval_mgr_gfs() {} } diff --git a/100_core/src_110_primitive/gplx/Byte_.java b/100_core/src_110_primitive/gplx/Byte_.java index 8950579a0..30178c893 100644 --- a/100_core/src_110_primitive/gplx/Byte_.java +++ b/100_core/src_110_primitive/gplx/Byte_.java @@ -41,7 +41,7 @@ public class Byte_ { public static byte cast_(Object o) {try {return (Byte)o;} catch (Exception e) {throw Err_.type_mismatch_exc_(e, byte.class, o);}} public static byte parse_(String raw) {return Byte.parseByte(raw);} public static byte int_(int v) {return v > 127 ? (byte)(v - 256) : (byte)v;} // PERF?: (byte)(v & 0xff) - public static byte X_to_boolean_byte(boolean v) { + public static byte Xto_boolean_byte(boolean v) { return v ? Bool_.Y_byte : Bool_.N_byte; } public static final byte Zero = 0, MaxValue_127 = 127; diff --git a/100_core/src_110_primitive/gplx/Byte_ascii.java b/100_core/src_110_primitive/gplx/Byte_ascii.java index 7188f592a..de567314e 100644 --- a/100_core/src_110_primitive/gplx/Byte_ascii.java +++ b/100_core/src_110_primitive/gplx/Byte_ascii.java @@ -56,7 +56,7 @@ public class Byte_ascii { public static boolean Is_num(byte b) { return b > Byte_ascii.Slash && b < Byte_ascii.Colon; } - public static int X_to_digit(byte b) {return b - Byte_ascii.Num_0;} + public static int Xto_digit(byte b) {return b - Byte_ascii.Num_0;} public static byte Case_upper(byte b) { return b > 96 && b < 123 ? (byte)(b - 32) diff --git a/100_core/src_110_primitive/gplx/Double_.java b/100_core/src_110_primitive/gplx/Double_.java index 94b3b2ccf..d4758d68a 100644 --- a/100_core/src_110_primitive/gplx/Double_.java +++ b/100_core/src_110_primitive/gplx/Double_.java @@ -35,6 +35,12 @@ public class Double_ { int v_int = (int)v; return v - v_int == 0 ? Int_.XtoStr(v_int) : Double.toString(v); } + public static String Xto_str_loose(double v) { + int v_as_int = (int)v; + return v == v_as_int + ? Int_.XtoStr(v_as_int) // convert to int, and call print String to eliminate any trailing decimal places + : String.format("%g", v); // call "%g" format which should eliminate most, though not all; EX:2449.6000000000004; DATE:2014-07-14 + } public static double cast_(Object o) {try {return (Double)o;} catch(Exception e) {throw Err_.type_mismatch_exc_(e, double.class, o);}} public static double parse_(String raw) {try {return Double.parseDouble(raw);} catch(Exception e) {throw Err_.parse_type_exc_(e, double.class, raw);}} public static double parseOr_(String raw, double v) {try {return Double.parseDouble(raw);} catch(Exception e) {Err_.Noop(e); return v;}} diff --git a/100_core/src_110_primitive/gplx/Int_.java b/100_core/src_110_primitive/gplx/Int_.java index b459063b1..34b1260a4 100644 --- a/100_core/src_110_primitive/gplx/Int_.java +++ b/100_core/src_110_primitive/gplx/Int_.java @@ -151,7 +151,7 @@ public class Int_ implements GfoInvkAble { public static int parse_(String raw) {try {return Integer.parseInt(raw);} catch(Exception e) {throw Err_.parse_type_exc_(e, int.class, raw);}} public static int cast_(Object obj) {try {return (Integer)obj;} catch(Exception exc) {throw Err_.type_mismatch_exc_(exc, int.class, obj);}} public static int cast_or_(Object obj, int or) {try {return (Integer)obj;} catch(Exception e) {Err_.Noop(e); return or;}} - public static int X_by_double_(double v) {return (int)v;} + public static int Xby_double_(double v) {return (int)v;} public static String XtoStr(int v) {return new Integer(v).toString();} public static String XtoStr_fmt(int v, String fmt) {return new java.text.DecimalFormat(fmt).format(v);} public static boolean TypeMatch(Class type) {return type == int.class || type == Integer.class;} diff --git a/100_core/src_110_primitive/gplx/Int_ary_.java b/100_core/src_110_primitive/gplx/Int_ary_.java index 31bcf28fd..575802281 100644 --- a/100_core/src_110_primitive/gplx/Int_ary_.java +++ b/100_core/src_110_primitive/gplx/Int_ary_.java @@ -32,7 +32,7 @@ public class Int_ary_ { || pos_is_last ) { if (num_bgn == -1) return or; // empty itm; EX: "1,"; "1,,2" - int num = Bry_.X_to_int_or(src, num_bgn, num_end, Int_.MinValue); + int num = Bry_.Xto_int_or(src, num_bgn, num_end, Int_.MinValue); if (num == Int_.MinValue) return or; // not a number; parse failed if (rv_len == 0) { // rv not init'd rv_len = (raw_len / 2) + 1; // default rv_len to len of String / 2; + 1 to avoid fraction rounding down @@ -77,7 +77,7 @@ public class Int_ary_ { case Byte_ascii.Dash: if (pos == raw_len -1) return or; // eos; EX: "1-" if (num_bgn == -1) return or; // no rng_bgn; EX: "-2" - rng_bgn = Bry_.X_to_int_or(src, num_bgn, pos, Int_.MinValue); + rng_bgn = Bry_.Xto_int_or(src, num_bgn, pos, Int_.MinValue); if (rng_bgn == Int_.MinValue) return or; num_bgn = -1; itm_is_rng = true; diff --git a/100_core/src_110_primitive/gplx/Long_.java b/100_core/src_110_primitive/gplx/Long_.java index 2c6104a38..7c230b8e7 100644 --- a/100_core/src_110_primitive/gplx/Long_.java +++ b/100_core/src_110_primitive/gplx/Long_.java @@ -101,7 +101,7 @@ public class Long_ { public static long Int_merge(int hi, int lo) {return (long)hi << 32 | (lo & 0xFFFFFFFFL);} public static int Int_split_lo(long v) {return (int)(v);} public static int Int_split_hi(long v) {return (int)(v >> 32);} - public static long X_by_int(int v) {return (long)v;} + public static long Xby_int(int v) {return (long)v;} } /* alternate for Int_merge does not work in java public static long MergeInts(int lo, int hi) {return (uint)(hi << 32) | (lo & 0xffffffff);} diff --git a/100_core/src_110_primitive/gplx/Object_.java b/100_core/src_110_primitive/gplx/Object_.java index f4c92fc1d..11b1869a4 100644 --- a/100_core/src_110_primitive/gplx/Object_.java +++ b/100_core/src_110_primitive/gplx/Object_.java @@ -24,13 +24,9 @@ public class Object_ { else if (lhs == null || rhs == null) return false; else return lhs.equals(rhs); } - public static Object Parse(String val, String valType) { - if (String_.Eq(valType, IntClassXtn.Key_const)) return Int_.parse_(val); - else return val; - } - public static String XtoStr_OrNull(Object v) {return v == null ? null : ToString_lang(v);} - public static String XtoStr_OrNullStr(Object v) {return v == null ? String_.Null_mark : ToString_lang(v);} - public static String XtoStr_OrEmpty(Object v) {return v == null ? String_.Empty : ToString_lang(v);} + public static String Xto_str_strict_or_null(Object v) {return v == null ? null : ToString_lang(v);} + public static String Xto_str_strict_or_null_mark(Object v) {return v == null ? String_.Null_mark : ToString_lang(v);} + public static String Xto_str_strict_or_empty(Object v) {return v == null ? String_.Empty : ToString_lang(v);} static String ToString_lang(Object v) { if (v == null) return null; Class c = v.getClass(); @@ -38,4 +34,13 @@ public class Object_ { else if (ClassAdp_.Eq(c, String_.ClassOf)) return (String)v; else return v.toString(); } + public static String Xto_str_loose_or(Object v, String or) { // tries to pretty-print doubles; also standardizes true/false; DATE:2014-07-14 + if (v == null) return null; + Class c = ClassAdp_.ClassOf_obj(v); + if (ClassAdp_.Eq(c, Bry_.ClassOf)) return String_.new_utf8_((byte[])v); + else if (ClassAdp_.Eq(c, String_.ClassOf)) return (String)v; + else if (ClassAdp_.Eq(c, Bool_.ClassOf)) return Bool_.cast_(v) ? Bool_.True_str : Bool_.False_str; // always return true / false + else if (ClassAdp_.Eq(c, Double_.ClassOf)) return Double_.Xto_str_loose(Double_.cast_(v)); + else return v.toString(); + } } \ No newline at end of file diff --git a/100_core/src_110_primitive/gplx/Object__tst.java b/100_core/src_110_primitive/gplx/Object__tst.java index 9f9e91d50..e7cf8fded 100644 --- a/100_core/src_110_primitive/gplx/Object__tst.java +++ b/100_core/src_110_primitive/gplx/Object__tst.java @@ -18,10 +18,19 @@ along with this program. If not, see . package gplx; import org.junit.*; public class Object__tst { - @Test public void Eq() { - tst_Eq(null, null, true); // both null - tst_Eq(5, 5, true); // both non-null - tst_Eq(5, null, false); // rhs non-null - tst_Eq(null, 5, false); // lhs non-null - } void tst_Eq(Object lhs, Object rhs, boolean expd) {Tfds.Eq(expd, Object_.Eq(lhs, rhs));} + @Before public void init() {} private Object__fxt fxt = new Object__fxt(); + @Test public void Eq() { + fxt.Test_eq(null, null, true); // both null + fxt.Test_eq(5, 5, true); // both non-null + fxt.Test_eq(5, null, false); // rhs non-null + fxt.Test_eq(null, 5, false); // lhs non-null + } + @Test public void Xto_str_loose_or_null() { + fxt.Test_xto_str_loose_or_null(null, null); + fxt.Test_xto_str_loose_or_null(2449.6000000000004d, "2449.60"); + } +} +class Object__fxt { + public void Test_eq(Object lhs, Object rhs, boolean expd) {Tfds.Eq(expd, Object_.Eq(lhs, rhs));} + public void Test_xto_str_loose_or_null(Object v, String expd) {Tfds.Eq(expd, Object_.Xto_str_loose_or(v, null));} } diff --git a/100_core/src_110_primitive/gplx/String_.java b/100_core/src_110_primitive/gplx/String_.java index 5ee37db27..5666e73f0 100644 --- a/100_core/src_110_primitive/gplx/String_.java +++ b/100_core/src_110_primitive/gplx/String_.java @@ -283,7 +283,7 @@ public class String_ implements GfoInvkAble { for (int i = 0; i < aryLen; i++) { if (i != 0) sb.Add(separator); Object val = ary[i]; - sb.Add_obj(Object_.XtoStr_OrEmpty(val)); + sb.Add_obj(Object_.Xto_str_strict_or_empty(val)); } return sb.XtoStr(); } @@ -373,7 +373,7 @@ public class String_ implements GfoInvkAble { else if (c == bracketEnd) { int aryIdx = Int_.parse_or_(numberStr, Int_.MinValue); if (aryIdx != Int_.MinValue && Int_.Between(aryIdx, 0, aryLength - 1)) // check (a) aryIdx is num; (b) aryIdx is in bounds - aryVal = Object_.XtoStr_OrEmpty(ary[aryIdx]); + aryVal = Object_.Xto_str_strict_or_empty(ary[aryIdx]); else aryVal = String_.Concat_any(bracketBgn, numberStr, bracketEnd); // not valid, just add String sb.Add(aryVal); diff --git a/100_core/src_120_basicDataType/gplx/KeyVal.java b/100_core/src_120_basicDataType/gplx/KeyVal.java index 642b71039..e3eda8e87 100644 --- a/100_core/src_120_basicDataType/gplx/KeyVal.java +++ b/100_core/src_120_basicDataType/gplx/KeyVal.java @@ -18,14 +18,14 @@ along with this program. If not, see . package gplx; public class KeyVal implements XtoStrAble { @gplx.Internal protected KeyVal(byte key_tid, Object k, Object v) {this.key_tid = key_tid; key = k; val = v;} - public String Key() {return Object_.XtoStr_OrNull(key);} + public String Key() {return Object_.Xto_str_strict_or_null(key);} public byte Key_tid() {return key_tid;} private byte key_tid; public Object Key_as_obj() {return key;} private Object key; public KeyVal Key_(Object v) {this.key = v; return this;} public Object Val() {return val;} public KeyVal Val_(Object v) {val = v; return this;} private Object val; - public String Val_to_str_or_empty() {return Object_.XtoStr_OrEmpty(val);} - public String Val_to_str_or_null() {return Object_.XtoStr_OrNull(val);} - public byte[] Val_to_bry() {return Bry_.new_utf8_(Object_.XtoStr_OrNull(val));} + public String Val_to_str_or_empty() {return Object_.Xto_str_strict_or_empty(val);} + public String Val_to_str_or_null() {return Object_.Xto_str_strict_or_null(val);} + public byte[] Val_to_bry() {return Bry_.new_utf8_(Object_.Xto_str_strict_or_null(val));} @Override public String toString() {return XtoStr();} - public String XtoStr() {return Key() + "=" + Object_.XtoStr_OrNullStr(val);} + public String XtoStr() {return Key() + "=" + Object_.Xto_str_strict_or_null_mark(val);} } diff --git a/100_core/src_120_basicDataType/gplx/KeyVal_.java b/100_core/src_120_basicDataType/gplx/KeyVal_.java index c90f7bd4f..9a4202045 100644 --- a/100_core/src_120_basicDataType/gplx/KeyVal_.java +++ b/100_core/src_120_basicDataType/gplx/KeyVal_.java @@ -49,7 +49,7 @@ public class KeyVal_ { if (ClassAdp_.Eq_typeSafe(itm_val, KeyVal[].class)) sb.Add(Ary_x_to_str((KeyVal[])itm_val)); else - sb.Add(Object_.XtoStr_OrNullStr(itm_val)); + sb.Add(Object_.Xto_str_strict_or_null_mark(itm_val)); sb.Add_char_nl(); } return sb.XtoStr(); @@ -73,7 +73,7 @@ public class KeyVal_ { KeyVal itm = ary[i]; if (indent > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent * 2); // add indent : " " - bfr.Add_str(Object_.XtoStr_OrEmpty(itm.Key())).Add_byte_eq(); // add key + eq : "key=" + bfr.Add_str(Object_.Xto_str_strict_or_empty(itm.Key())).Add_byte_eq(); // add key + eq : "key=" Object val = itm.Val(); if (val == null) bfr.Add_str(String_.Null_mark); @@ -89,7 +89,7 @@ public class KeyVal_ { bfr.Add(val_as_bool ? Bool_.True_bry : Bool_.False_bry); // add "true" or "false"; don't call toString } else - bfr.Add_str(Object_.XtoStr_OrNullStr(val)); // call toString() + bfr.Add_str(Object_.Xto_str_strict_or_null_mark(val)); // call toString() } bfr.Add_byte_nl(); } diff --git a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java index 61d03fa79..ae622d123 100644 --- a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java +++ b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java @@ -46,7 +46,7 @@ public class TimeSpanAdp_ { switch (b) { case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4: case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9: - int unit_digit = Byte_ascii.X_to_digit(b); + int unit_digit = Byte_ascii.Xto_digit(b); unit_val = (unit_multiple == 1) ? unit_digit : unit_val + (unit_digit * unit_multiple); switch (colon_pos) { case 0: val_s = unit_val; break; diff --git a/100_core/src_120_basicDataType/gplx/Yn.java b/100_core/src_120_basicDataType/gplx/Yn.java index 92f908b23..6b00138d9 100644 --- a/100_core/src_120_basicDataType/gplx/Yn.java +++ b/100_core/src_120_basicDataType/gplx/Yn.java @@ -39,7 +39,7 @@ public class Yn { if (v_int == Bool_.__int) Err_mgr._.unhandled_(v); return v_int == Bool_.Y_int; } - public static String X_to_str(boolean v) {return v ? "y" : "n";} + public static String Xto_str(boolean v) {return v ? "y" : "n";} public static boolean store_bool_or(SrlMgr mgr, String key, boolean or) { String v = mgr.SrlStrOr(key, ""); return mgr.Type_rdr() ? parse_or_(v, or) : or; diff --git a/100_core/src_140_list/gplx/HashAdp_.java b/100_core/src_140_list/gplx/HashAdp_.java index 1271d088a..63dd30531 100644 --- a/100_core/src_140_list/gplx/HashAdp_.java +++ b/100_core/src_140_list/gplx/HashAdp_.java @@ -26,7 +26,7 @@ class HashAdp_null implements HashAdp { public int Count() {return 0;} public boolean Has(Object key) {return false;} public Object Fetch(Object key) {return null;} - public Object FetchOrFail(Object key) {throw Err_.missing_key_(Object_.XtoStr_OrNullStr(key));} + public Object FetchOrFail(Object key) {throw Err_.missing_key_(Object_.Xto_str_strict_or_null_mark(key));} public Object FetchOrNew(Object key, NewAble proto) {throw Err_.new_("could not add to null hash");} public void Add(Object key, Object val) {} public void AddKeyVal(Object val) {} diff --git a/100_core/src_140_list/gplx/ListAdp_base.java b/100_core/src_140_list/gplx/ListAdp_base.java index c382f4089..fc0cfc622 100644 --- a/100_core/src_140_list/gplx/ListAdp_base.java +++ b/100_core/src_140_list/gplx/ListAdp_base.java @@ -119,7 +119,7 @@ public abstract class ListAdp_base implements ListAdp, GfoInvkAble { for (int i = 0; i < count; i++) { if (i != 0) sb.Add_char_crlf(); Object val = list[i]; - sb.Add_obj(Object_.XtoStr_OrEmpty(val)); + sb.Add_obj(Object_.Xto_str_strict_or_empty(val)); } return sb.XtoStr(); } diff --git a/100_core/src_150_text/gplx/texts/RegxPatn_cls_like_tst.java b/100_core/src_150_text/gplx/texts/RegxPatn_cls_like_tst.java index 566b0093c..c82f0c872 100644 --- a/100_core/src_150_text/gplx/texts/RegxPatn_cls_like_tst.java +++ b/100_core/src_150_text/gplx/texts/RegxPatn_cls_like_tst.java @@ -18,13 +18,13 @@ along with this program. If not, see . package gplx.texts; import gplx.*; import org.junit.*; public class RegxPatn_cls_like_tst { - @Test public void Basic() { + @Test public void Basic() { tst_Match("abcd", "abcd", true); // basic; pass tst_Match("abcd", "zbcd", false); // basic; fail tst_Match("abcd", "abc", false); // no wildcard; must be exact match tst_Match("a cd", "a cd", true); // check space works } - @Test public void Wildcard() { + @Test public void Wildcard() { tst_Match("abcd", "a%", true); // bgn; pass tst_Match("abcd", "b%", false); // bgn; fail tst_Match("abcd", "%d", true); // end; pass @@ -34,12 +34,12 @@ public class RegxPatn_cls_like_tst { tst_Match("abcd", "%a%", true); // flank; bgn; pass tst_Match("abcd", "%d%", true); // flank; end; pass } - @Test public void Any() { + @Test public void Any() { tst_Match("abcd", "a_cd", true); // basic; pass tst_Match("abcd", "z_cd", false); // basic; fail tst_Match("abcd", "a_c", false); // fail; check no wildcard } - @Test public void CharSet() { + @Test public void CharSet() { tst_Match("abcd", "a[b]cd", true); // pass tst_Match("abcd", "a[x]cd", false); // fail tst_Match("abcd", "a[bcde]cd", true); // multiple; pass @@ -47,20 +47,20 @@ public class RegxPatn_cls_like_tst { tst_Match("abcd", "a[^z]cd", true); // not; pass tst_Match("abcd", "a[^b]cd", false); // not; fail } - @Test public void Escape() { + @Test public void Escape() { tst_Match("a%b", "a|%b", true); // escape wildcard; pass tst_Match("a%bc", "a|%b", false); // escape wildcard; fail tst_Match("a|b", "a|b", false); // escape char; fail tst_Match("a|b", "a||b", true); // escape char; pass } - @Test public void Escape_diffChar() { + @Test public void Escape_diffChar() { tst_Match("a%b", "a~%b", '~', true); // escape wildcard; pass tst_Match("a%bc", "a~%b", '~', false); // escape wildcard; fail tst_Match("a|b", "a|b", '~', true); // no escape needed tst_Match("a~b", "a~b", '~', false); // escape char; fail tst_Match("a~b", "a~~b", '~', true); // escape char; pass } - @Test public void Chars() { // Escape RegxBldr; ex: LIKE 'a{' -> a\{ + @Test public void Chars() { // Escape RegxBldr; ex: LIKE 'a{' -> a\{ tst_EscapeRegxChar(RegxBldr.Tkn_Escape); // \ tst_EscapeRegxChar(RegxBldr.Tkn_GroupBegin); // [ tst_EscapeRegxChar(RegxBldr.Tkn_GroupEnd); // ] @@ -79,8 +79,8 @@ public class RegxPatn_cls_like_tst { Tfds.Eq(expd, actl, "raw={0} regx={1} expd={2}", raw, regx, expd); } void tst_EscapeRegxChar(char regexChar) { - RegxPatn_cls_like like = RegxPatn_cls_like_.parse_(Object_.XtoStr_OrEmpty(regexChar), '|'); - Tfds.Eq(true, like.Matches(Object_.XtoStr_OrEmpty(regexChar))); + RegxPatn_cls_like like = RegxPatn_cls_like_.parse_(Object_.Xto_str_strict_or_empty(regexChar), '|'); + Tfds.Eq(true, like.Matches(Object_.Xto_str_strict_or_empty(regexChar))); Tfds.Eq(false, like.Matches("a")); // catches errors for improper escaping of wildcard } } diff --git a/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java b/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java index c63601983..e0c73d4e4 100644 --- a/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java +++ b/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java @@ -38,7 +38,7 @@ public class IoEngine_xrg_recycleFil extends IoEngine_xrg_fil_affects1_base { for (int i = 0; i < aryLen; i++) { if (i != 0) sb.Add(separator); Object val = ary.FetchAt(i); - sb.Add_obj(Object_.XtoStr_OrEmpty(val)); + sb.Add_obj(Object_.Xto_str_strict_or_empty(val)); } return sb.XtoStr(); } diff --git a/100_core/src_210_env/gplx/ProcessAdp.java b/100_core/src_210_env/gplx/ProcessAdp.java index 5bf9cfd76..6b872c0eb 100644 --- a/100_core/src_210_env/gplx/ProcessAdp.java +++ b/100_core/src_210_env/gplx/ProcessAdp.java @@ -71,9 +71,9 @@ public class ProcessAdp implements GfoInvkAble, RlsAble { default: throw Err_mgr._.unhandled_(run_mode); } } - public String[] X_to_process_bldr_args(String... args) { + public String[] Xto_process_bldr_args(String... args) { String args_str = args_fmtr.Bld_str_many(args); - return X_to_process_bldr_args_utl(exe_url, args_str); + return Xto_process_bldr_args_utl(exe_url, args_str); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_enabled)) return enabled; @@ -209,7 +209,7 @@ public class ProcessAdp implements GfoInvkAble, RlsAble { exit_code = Exit_init; rslt_out = ""; WhenBgn_run(); - pb = new ProcessBuilder(X_to_process_bldr_args_utl(exe_url, args_str)); + pb = new ProcessBuilder(Xto_process_bldr_args_utl(exe_url, args_str)); pb.redirectErrorStream(true); // NOTE: need to redirectErrorStream or rdr.readLine() will hang; see inkscape and Ostfriesland Verkehr-de.svg if (working_dir != null) pb.directory(new File(working_dir.Xto_api())); @@ -259,7 +259,7 @@ public class ProcessAdp implements GfoInvkAble, RlsAble { } private static final String GRP_KEY = "gplx.process"; public static final int Exit_pass = 0, Exit_init = -1; - public static String[] X_to_process_bldr_args_utl(Io_url exe_url, String args_str) { + public static String[] Xto_process_bldr_args_utl(Io_url exe_url, String args_str) { ListAdp list = ListAdp_.new_(); list.Add(exe_url.Xto_api()); String_bldr sb = String_bldr_.new_(); diff --git a/100_core/src_300_classXtn/gplx/ClassXtn_base.java b/100_core/src_300_classXtn/gplx/ClassXtn_base.java index 2835d4355..c070498a8 100644 --- a/100_core/src_300_classXtn/gplx/ClassXtn_base.java +++ b/100_core/src_300_classXtn/gplx/ClassXtn_base.java @@ -20,7 +20,7 @@ public abstract class ClassXtn_base { public abstract Class UnderClass(); public abstract Object ParseOrNull(String raw); @gplx.Virtual public Object XtoDb(Object obj) {return obj;} - @gplx.Virtual public String XtoUi(Object obj, String fmt) {return Object_.XtoStr_OrNullStr(obj);} + @gplx.Virtual public String XtoUi(Object obj, String fmt) {return Object_.Xto_str_strict_or_null_mark(obj);} @gplx.Virtual public boolean MatchesClass(Object obj) {if (obj == null) throw Err_.null_("obj"); return ClassAdp_.Eq_typeSafe(obj, UnderClass()); } diff --git a/100_core/src_310_gfoNde/gplx/GfoNde.java b/100_core/src_310_gfoNde/gplx/GfoNde.java index 672da927f..08f574abb 100644 --- a/100_core/src_310_gfoNde/gplx/GfoNde.java +++ b/100_core/src_310_gfoNde/gplx/GfoNde.java @@ -33,7 +33,7 @@ public class GfoNde implements GfoInvkAble { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < aryLen; i++) { String key = i >= flds.Count() ? "<< NULL " + i + " >>" : flds.FetchAt(i).Key(); - String val = i >= aryLen ? "<< NULL " + i + " >>" : Object_.XtoStr_OrNullStr(ary[i]); + String val = i >= aryLen ? "<< NULL " + i + " >>" : Object_.Xto_str_strict_or_null_mark(ary[i]); sb.Add(key).Add("=").Add(val); } return sb.XtoStr(); diff --git a/100_core/src_311_gfoObj/gplx/GfoMsg_.java b/100_core/src_311_gfoObj/gplx/GfoMsg_.java index 7752dbe9a..623785ba2 100644 --- a/100_core/src_311_gfoObj/gplx/GfoMsg_.java +++ b/100_core/src_311_gfoObj/gplx/GfoMsg_.java @@ -260,9 +260,9 @@ class XtoStrWkr_gplx implements XtoStrWkr { String rv = null; if (type == String.class) rv = String_.cast_(o); else if (Int_.TypeMatch(type)) return Int_.XtoStr(Int_.cast_(o)); - else if (Bool_.TypeMatch(type)) return Yn.X_to_str(Bool_.cast_(o)); + else if (Bool_.TypeMatch(type)) return Yn.Xto_str(Bool_.cast_(o)); else if (type == DateAdp.class) return DateAdp_.cast_(o).XtoStr_gplx(); - else rv = Object_.XtoStr_OrEmpty(o); + else rv = Object_.Xto_str_strict_or_empty(o); return String_.Replace(rv, "'", "''"); } } diff --git a/100_core/src_330_store/gplx/stores/xmls/XmlDataWtr_.java b/100_core/src_330_store/gplx/stores/xmls/XmlDataWtr_.java index 1674e8b2e..cba2ae4a3 100644 --- a/100_core/src_330_store/gplx/stores/xmls/XmlDataWtr_.java +++ b/100_core/src_330_store/gplx/stores/xmls/XmlDataWtr_.java @@ -23,7 +23,7 @@ class XmlDataWtr extends DataWtr_base implements DataWtr { public void InitWtr(String key, Object val) {} @Override public void WriteData(String name, Object val) { // if (val == null) return; - String valString = Object_.XtoStr_OrEmpty(val); + String valString = Object_.Xto_str_strict_or_empty(val); int valStringLen = String_.Len(valString); sb.Add(" ").Add(name).Add("=\""); for (int i = 0; i < valStringLen; i++) { diff --git a/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataRdr_csv_dat_tst.java b/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataRdr_csv_dat_tst.java index e733061f7..24a1681f5 100644 --- a/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataRdr_csv_dat_tst.java +++ b/100_core/src_340_dsv/gplx/stores/dsvs/DsvDataRdr_csv_dat_tst.java @@ -190,7 +190,7 @@ class DsvDataRdr_fxt { GfoNde row = tbl.Subs().FetchAt_asGfoNde(i); for (int j = 0; j < row.Flds().Count(); j++) { if (j != 0) sb.Add("~"); - sb.Add_obj(Object_.XtoStr_OrNullStr(row.ReadAt(j))); + sb.Add_obj(Object_.Xto_str_strict_or_null_mark(row.ReadAt(j))); } expdList.Add(sb.XtoStrAndClear()); } @@ -201,7 +201,7 @@ class DsvDataRdr_fxt { } for (int j = 0; j < expdRow.length; j++) { if (j != 0) sb.Add("~"); - sb.Add_obj(Object_.XtoStr_OrNullStr(expdRow[j])); + sb.Add_obj(Object_.Xto_str_strict_or_null_mark(expdRow[j])); } actlList.Add(sb.XtoStrAndClear()); } diff --git a/100_core/src_400_gfs/gplx/GfsCore.java b/100_core/src_400_gfs/gplx/GfsCore.java index a7c301314..024301078 100644 --- a/100_core/src_400_gfs/gplx/GfsCore.java +++ b/100_core/src_400_gfs/gplx/GfsCore.java @@ -119,7 +119,7 @@ class GfsCore_ { if (type == String.class) invk = String_.Gfs; else if (Int_.TypeMatch(type)) invk = Int_.Gfs; else if (Bool_.TypeMatch(type)) invk = Bool_.Gfs; - else throw Err_.new_("unknown primitive").Add("type", ClassAdp_.NameOf_type(type)).Add("obj", Object_.XtoStr_OrNullStr(rv)); + else throw Err_.new_("unknown primitive").Add("type", ClassAdp_.NameOf_type(type)).Add("obj", Object_.Xto_str_strict_or_null_mark(rv)); primitive = rv; } Object exec_rv = null; diff --git a/100_core/src_400_gfs/gplx/Gfs_Date_tst.java b/100_core/src_400_gfs/gplx/Gfs_Date_tst.java index 5ddeaa0a7..d98177f83 100644 --- a/100_core/src_400_gfs/gplx/Gfs_Date_tst.java +++ b/100_core/src_400_gfs/gplx/Gfs_Date_tst.java @@ -37,6 +37,6 @@ class GfsCoreFxt { public void tst_MsgStr(GfoMsg msg, Object expd) { GfsCtx ctx = GfsCtx.new_(); Object actl = core.ExecOne(ctx, msg); - Tfds.Eq(Object_.XtoStr_OrNullStr(expd), Object_.XtoStr_OrNullStr(actl)); + Tfds.Eq(Object_.Xto_str_strict_or_null_mark(expd), Object_.Xto_str_strict_or_null_mark(actl)); } } diff --git a/100_core/src_420_usrMsg/gplx/UsrMsg.java b/100_core/src_420_usrMsg/gplx/UsrMsg.java index d56d07362..75239eaac 100644 --- a/100_core/src_420_usrMsg/gplx/UsrMsg.java +++ b/100_core/src_420_usrMsg/gplx/UsrMsg.java @@ -37,7 +37,7 @@ public class UsrMsg { KeyVal kv = (KeyVal)args.FetchAt(i); m.Add(kv.Key(), kv.Val()); } - return Object_.XtoStr_OrNullStr(invk.Invk(GfsCtx._, 0, cmd, m)); + return Object_.Xto_str_strict_or_null_mark(invk.Invk(GfsCtx._, 0, cmd, m)); } String_bldr sb = String_bldr_.new_(); sb.Add(hdr).Add(spr); diff --git a/100_core/src_800_tst/gplx/Tfds.java b/100_core/src_800_tst/gplx/Tfds.java index 0eb8532bd..3729f81d8 100644 --- a/100_core/src_800_tst/gplx/Tfds.java +++ b/100_core/src_800_tst/gplx/Tfds.java @@ -165,13 +165,13 @@ public class Tfds { // URL:doc/gplx.tfds/Tfds.txt String_bldr sb = String_bldr_.new_(); int aryLen = Array_.Len(ary); for (int i = 0; i < aryLen; i++) - sb.Add_many("'", Object_.XtoStr_OrNullStr(ary[i]), "'", " "); + sb.Add_many("'", Object_.Xto_str_strict_or_null_mark(ary[i]), "'", " "); WriteText(sb.XtoStr() + String_.CrLf); } } class TfdsEqListItmStr_cls_default implements TfdsEqListItmStr { public String XtoStr(Object cur, Object actl) { - return Object_.XtoStr_OrNullStr(cur); + return Object_.Xto_str_strict_or_null_mark(cur); } public static final TfdsEqListItmStr_cls_default _ = new TfdsEqListItmStr_cls_default(); TfdsEqListItmStr_cls_default() {} } @@ -230,7 +230,7 @@ class TfdsMsgBldr { if (s != null) return String_.Concat("'", s, "'"); // if Object is String, put quotes around it for legibility XtoStrAble xtoStrAble = XtoStrAble_.as_(obj); if (xtoStrAble != null) return xtoStrAble.XtoStr(); - return Object_.XtoStr_OrNullStr(obj); + return Object_.Xto_str_strict_or_null_mark(obj); } String WrapMsg(String text) { return String_.Concat(String_.CrLf diff --git a/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataWtr.java b/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataWtr.java index b3e3ac31a..8c14fea1b 100644 --- a/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataWtr.java +++ b/110_gfml/src_600_rdrWtr/gplx/gfml/GfmlDataWtr.java @@ -80,7 +80,7 @@ public class GfmlDataWtr extends DataWtr_base implements DataWtr { } String XtoStr(Object obj) { if (obj == null) return "''"; - String s = Object_.XtoStr_OrEmpty(obj); + String s = Object_.Xto_str_strict_or_empty(obj); return String_.Concat("'", String_.Replace(s, "'", "''"), "'"); } GfmlTkn AddTkn_raw(String raw) {return AddTkn(raw, raw);} diff --git a/140_dbs/src_120_sql/gplx/dbs/Sql_cmd_wtr_ansi.java b/140_dbs/src_120_sql/gplx/dbs/Sql_cmd_wtr_ansi.java index d3aacd4f7..0d0f68a56 100644 --- a/140_dbs/src_120_sql/gplx/dbs/Sql_cmd_wtr_ansi.java +++ b/140_dbs/src_120_sql/gplx/dbs/Sql_cmd_wtr_ansi.java @@ -157,7 +157,7 @@ class Sql_cmd_wtr_ansi implements Sql_cmd_wtr { || valType == Integer.class || valType == Long.class || valType == Float.class || valType == Double.class ) - sb.Add(Object_.XtoStr_OrNull(val)); + sb.Add(Object_.Xto_str_strict_or_null(val)); else if (valType == DateAdp.class) XtoSqlVal_DateAdp(sb, prm, (DateAdp)val); else if (valType == DecimalAdp.class) { @@ -167,7 +167,7 @@ class Sql_cmd_wtr_ansi implements Sql_cmd_wtr { // else if (valType == System.Enum.class) // sb.Add_any(Enm_.XtoInt(val)); // save enum as 0 or 1, since (a) no db supports enum datatype; (b) names are fungible; (c) int is less space than name else { - String valString = Object_.XtoStr_OrNull(val); + String valString = Object_.Xto_str_strict_or_null(val); XtoSqlVal_Str(sb, prm, valString); } } @@ -268,7 +268,7 @@ class Sql_cmd_wtr_ansi implements Sql_cmd_wtr { sb.Add(fld.Name()); sb.Add("="); if (quote) sb.Add("'"); - sb.Add(Object_.XtoStr_OrEmpty(val)); + sb.Add(Object_.Xto_str_strict_or_empty(val)); if (quote) sb.Add("'"); } sb.Add(")"); diff --git a/140_dbs/src_130_misc/gplx/dbs/Db_cmd_mode.java b/140_dbs/src_130_misc/gplx/dbs/Db_cmd_mode.java index c1cd9eeb9..12ec101cd 100644 --- a/140_dbs/src_130_misc/gplx/dbs/Db_cmd_mode.java +++ b/140_dbs/src_130_misc/gplx/dbs/Db_cmd_mode.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs; import gplx.*; public class Db_cmd_mode { public static final byte Create = 1, Update = 2, Delete = 3, Ignore = 4; - public static byte X_to_update(byte cur) { + public static byte Xto_update(byte cur) { switch (cur) { case Create: // ignore update if item is already marked for create case Delete: // ignore update if item is already marked for delete (might want to throw error) diff --git a/140_dbs/src_300_sqlDbs/gplx/dbs/db_DataTypes_tst.java b/140_dbs/src_300_sqlDbs/gplx/dbs/db_DataTypes_tst.java index ca4adcda3..0553f6c82 100644 --- a/140_dbs/src_300_sqlDbs/gplx/dbs/db_DataTypes_tst.java +++ b/140_dbs/src_300_sqlDbs/gplx/dbs/db_DataTypes_tst.java @@ -66,7 +66,7 @@ class DataTypes_base_fxt { Tfds.Eq(rdr.ReadStr("full_name"), "John Doe"); Tfds.Eq(rdr.ReadBool("is_active"), true); Tfds.Eq_date(rdr.ReadDate("last_update"), DateAdp_.parse_gplx("2006-03-30 22:22:00.000")); - Tfds.Eq(floatStr, Object_.XtoStr_OrEmpty(rdr.ReadFloat("quantity"))); + Tfds.Eq(floatStr, Object_.Xto_str_strict_or_empty(rdr.ReadFloat("quantity"))); Tfds.Eq_decimal(rdr.ReadDecimal("amount"), DecimalAdp_.parts_(12, 345)); } public void UpdateDate_hook() { diff --git a/140_dbs/tst/gplx/dbs/GfoNdeTstr.java b/140_dbs/tst/gplx/dbs/GfoNdeTstr.java index f7ee42ddc..b63c9b6b2 100644 --- a/140_dbs/tst/gplx/dbs/GfoNdeTstr.java +++ b/140_dbs/tst/gplx/dbs/GfoNdeTstr.java @@ -20,12 +20,12 @@ public class GfoNdeTstr { public static void tst_ValsByCol(GfoNde nde, String fld, Object... expdAry) { ListAdp expd = ListAdp_.new_(); for (int i = 0; i < expdAry.length; i++) { - expd.Add(Object_.XtoStr_OrEmpty(expdAry[i])); + expd.Add(Object_.Xto_str_strict_or_empty(expdAry[i])); } ListAdp actl = ListAdp_.new_(); for (int i = 0; i < nde.Subs().Count(); i++) { GfoNde sub = nde.Subs().FetchAt_asGfoNde(i); - actl.Add(Object_.XtoStr_OrEmpty(sub.Read(fld))); + actl.Add(Object_.Xto_str_strict_or_empty(sub.Read(fld))); } Tfds.Eq_ary(expd.XtoStrAry(), actl.XtoStrAry()); } diff --git a/140_dbs/xtn/gplx/dbs/SqliteDbMain.java b/140_dbs/xtn/gplx/dbs/SqliteDbMain.java index fd1591a1b..0be7d0989 100644 --- a/140_dbs/xtn/gplx/dbs/SqliteDbMain.java +++ b/140_dbs/xtn/gplx/dbs/SqliteDbMain.java @@ -220,8 +220,8 @@ public class SqliteDbMain { byte[] orig = Bry_.new_ascii_(flds[4]); int orig_mode = orig[0] - Byte_ascii.Num_0; int comma_pos = Bry_finder.Find_fwd(orig, Byte_ascii.Comma); - int orig_w = Bry_.X_to_int_or(orig, 2, comma_pos, -1); - int orig_h = Bry_.X_to_int_or(orig, comma_pos + 1, orig.length, -1); + int orig_w = Bry_.Xto_int_or(orig, 2, comma_pos, -1); + int orig_h = Bry_.Xto_int_or(orig, comma_pos + 1, orig.length, -1); stmt.setInt(4, orig_mode); stmt.setInt(5, orig_w); stmt.setInt(6, orig_h); diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwCheckListBox_lang.java b/150_gfui/src_300_gxw/gplx/gfui/GxwCheckListBox_lang.java index 22cf9d964..23237daa2 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwCheckListBox_lang.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwCheckListBox_lang.java @@ -197,5 +197,5 @@ class CheckListItem { public Object Data() {return data;} Object data; public boolean Selected() {return selected;} public void Selected_set(boolean selected) {this.selected = selected;} protected boolean selected; public void Selected_toggle() {selected = !selected;} - public String toString() {return Object_.XtoStr_OrNullStr(data);} + public String toString() {return Object_.Xto_str_strict_or_null_mark(data);} } diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox_lang.java b/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox_lang.java index 819b450eb..33e8c1182 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox_lang.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwComboBox_lang.java @@ -57,7 +57,7 @@ public class GxwComboBox_lang extends JComboBox implements GxwComboBox, GxwElem, @Override public void setBounds(Rectangle r) {super.setBounds(r); this.validate();} @Override public void setSize(int w, int h) {super.setSize(w, h); this.validate();} @Override public void setSize(Dimension d) {super.setSize(d); this.validate();} - public String TextVal() {return Object_.XtoStr_OrEmpty(this.SelectedItm());} public void TextVal_set(String v) {this.SelectedItm_set(v);} + public String TextVal() {return Object_.Xto_str_strict_or_empty(this.SelectedItm());} public void TextVal_set(String v) {this.SelectedItm_set(v);} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { return this; } diff --git a/150_gfui/src_300_gxw/gplx/gfui/GxwListBox_lang.java b/150_gfui/src_300_gxw/gplx/gfui/GxwListBox_lang.java index 5838eab53..a795cc8d4 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/GxwListBox_lang.java +++ b/150_gfui/src_300_gxw/gplx/gfui/GxwListBox_lang.java @@ -50,7 +50,7 @@ class GxwListBox_lang extends JList implements GxwListBox { @Override public void setBounds(Rectangle r) {super.setBounds(r); this.validate();} @Override public void setSize(int w, int h) {super.setSize(w, h); this.validate();} @Override public void setSize(Dimension d) {super.setSize(d); this.validate();} - public String TextVal() {return Object_.XtoStr_OrEmpty(this.SelectedItm());} public void TextVal_set(String v) {this.SelectedItm_set(v);} + public String TextVal() {return Object_.Xto_str_strict_or_empty(this.SelectedItm());} public void TextVal_set(String v) {this.SelectedItm_set(v);} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { return this; } diff --git a/150_gfui/src_400_win/gplx/gfui/GfoConsoleWin.java b/150_gfui/src_400_win/gplx/gfui/GfoConsoleWin.java index f74552f75..42bd6fe4c 100644 --- a/150_gfui/src_400_win/gplx/gfui/GfoConsoleWin.java +++ b/150_gfui/src_400_win/gplx/gfui/GfoConsoleWin.java @@ -109,7 +109,7 @@ class GfoConsoleWinCmds implements GfoInvkAble { try {runMsg = GfsCore._.MsgParser().ParseToMsg(cmd);} catch (Exception e) {statusBox.Text_("invalid gfml " + Err_.Message_gplx(e)); return;} GfsCtx ctx = GfsCtx.new_(); Object rv = GfsCore._.ExecMany(ctx, runMsg); - resultBox.Text_(Object_.XtoStr_OrEmpty(rv)); + resultBox.Text_(Object_.Xto_str_strict_or_empty(rv)); } void Help() { statusBox.Text_(""); @@ -122,7 +122,7 @@ class GfoConsoleWinCmds implements GfoInvkAble { try { Object rv = GfsCore._.ExecOne(ctx, runMsg); if (rv != GfoInvkAble_.Rv_handled && rv != GfoInvkAble_.Rv_unhandled) { - UsrDlg_._.Note(Object_.XtoStr_OrEmpty(rv)); + UsrDlg_._.Note(Object_.Xto_str_strict_or_empty(rv)); } // Results_add(FixNewLines(ctx.Results_XtoStr())); } catch (Exception e) {statusBox.Text_("help failed " + Err_.Message_gplx(e)); return;} diff --git a/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java b/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java index 86ed7d02a..097f7c57d 100644 --- a/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java +++ b/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java @@ -68,7 +68,7 @@ public class GfuiElemBase implements GfuiElem { public GfuiElem Border_off_() {border.All_(null); return this;} public GfxStringData TextMgr() {return textMgr;} GfxStringData textMgr; public String Text() {return textMgr.Val();} - public GfuiElem Text_any_(Object obj) {return Text_(Object_.XtoStr_OrNullStr(obj));} + public GfuiElem Text_any_(Object obj) {return Text_(Object_.Xto_str_strict_or_null_mark(obj));} @gplx.Virtual public GfuiElem Text_(String v) { this.TextMgr().Text_set(v); Click_key_set_(v); diff --git a/150_gfui/src_430_box_custom/gplx/gfui/DataBndr_whenEvt_execCmd.java b/150_gfui/src_430_box_custom/gplx/gfui/DataBndr_whenEvt_execCmd.java index a0ed29d09..1533fafbb 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/DataBndr_whenEvt_execCmd.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/DataBndr_whenEvt_execCmd.java @@ -36,7 +36,7 @@ public class DataBndr_whenEvt_execCmd implements InjectAble, GfoInvkAble, GfoEvO if (ctx.Match(k, whenEvt)) { Object evtVal = m.CastObjOr(whenArg, ""); Object getVal = getInvk.Invk(GfsCtx._, 0, getCmd, GfoMsg_.new_cast_(getCmd).Add("v", evtVal)); - GfoMsg setMsg = GfoMsg_.new_cast_(setCmd).Add("v", Object_.XtoStr_OrEmpty(getVal)); + GfoMsg setMsg = GfoMsg_.new_cast_(setCmd).Add("v", Object_.Xto_str_strict_or_empty(getVal)); setInvk.Invk(GfsCtx._, 0, setCmd, setMsg); return GfoInvkAble_.Rv_handled; } diff --git a/400_xowa/.classpath b/400_xowa/.classpath index e6b20b8b1..a16e8f691 100644 --- a/400_xowa/.classpath +++ b/400_xowa/.classpath @@ -29,7 +29,6 @@ - diff --git a/400_xowa/src/gplx/core/flds/Gfo_fld_rdr.java b/400_xowa/src/gplx/core/flds/Gfo_fld_rdr.java index 551be66ca..f17c22501 100644 --- a/400_xowa/src/gplx/core/flds/Gfo_fld_rdr.java +++ b/400_xowa/src/gplx/core/flds/Gfo_fld_rdr.java @@ -30,8 +30,8 @@ public class Gfo_fld_rdr extends Gfo_fld_base { public byte[] Read_bry_simple() {Move_next_simple(); return Bry_.Mid(data, fld_bgn, fld_end);} // was Mid_by_len???; 20120915 public int Read_int_base85_lenN(int len) {fld_bgn = pos; fld_end = pos + len - 1 ; pos = pos + len + 1 ; return Base85_utl.XtoIntByAry(data, fld_bgn, fld_end);} public int Read_int_base85_len5() {fld_bgn = pos; fld_end = pos + 4 ; pos = pos + 6 ; return Base85_utl.XtoIntByAry(data, fld_bgn, fld_end);} - public int Read_int() {Move_next_simple(); return Bry_.X_to_int_or(data, fld_bgn, fld_end, -1);} - public byte Read_int_as_byte() {Move_next_simple(); return (byte)Bry_.X_to_int_or(data, fld_bgn, fld_end, -1);} + public int Read_int() {Move_next_simple(); return Bry_.Xto_int_or(data, fld_bgn, fld_end, -1);} + public byte Read_int_as_byte() {Move_next_simple(); return (byte)Bry_.Xto_int_or(data, fld_bgn, fld_end, -1);} public byte Read_byte() {Move_next_simple(); return data[fld_bgn];} public double Read_double() {Move_next_simple(); return Bry_.XtoDoubleByPos(data, fld_bgn, fld_end);} public DateAdp Read_dte() {// NOTE: fmt = yyyyMMdd HHmmss.fff diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_bin_mgr.java b/400_xowa/src/gplx/fsdb/Fsdb_db_bin_mgr.java index c2775d110..45edffdc4 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_bin_mgr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_bin_mgr.java @@ -31,7 +31,7 @@ public class Fsdb_db_bin_mgr implements RlsAble { for (int i = 0; i < itms_len; i++) itms[i].Bin_max_(v); return this; - } private long db_bin_max = Io_mgr.Len_mb * Long_.X_by_int(188); + } private long db_bin_max = Io_mgr.Len_mb * Long_.Xby_int(188); public Fsdb_db_bin_fil Get_at(int i) {return itms[i];} private Fsdb_db_bin_fil Get_cur() {return itms_len == 0 ? null : itms[itms_len - 1];} public void Txn_open() { diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_tid_.java b/400_xowa/src/gplx/fsdb/Fsdb_db_tid_.java new file mode 100644 index 000000000..7c2b037c7 --- /dev/null +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_tid_.java @@ -0,0 +1,36 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.fsdb; import gplx.*; +public class Fsdb_db_tid_ { + public static final byte Tid_cfg = 0, Tid_atr = 1, Tid_bin = 2; + public static final String Key_cfg = "cfg", Key_atr = "atr", Key_bin = "bin"; + public static byte Xto_tid(String s) { + if (String_.Eq(s, Key_cfg)) return Tid_cfg; + else if (String_.Eq(s, Key_atr)) return Tid_atr; + else if (String_.Eq(s, Key_bin)) return Tid_bin; + else throw Err_.unhandled(s); + } + public static String Xto_key(byte v) { + switch (v) { + case Tid_cfg: return Key_cfg; + case Tid_atr: return Key_atr; + case Tid_bin: return Key_bin; + default: throw Err_.unhandled(v); + } + } +} diff --git a/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java b/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java index ea425cba7..92aed2b44 100644 --- a/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java +++ b/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java @@ -41,8 +41,8 @@ public class Gfui_bnd_parser { }; private byte[] src; private int src_len; private ListAdp tkns = ListAdp_.new_(); private int mod_val = Mod_val_null; - public String X_to_norm(String src_str) {return Convert(Bool_.Y, src_str);} - public String X_to_gfui(String src_str) {return Convert(Bool_.N, src_str);} + public String Xto_norm(String src_str) {return Convert(Bool_.Y, src_str);} + public String Xto_gfui(String src_str) {return Convert(Bool_.N, src_str);} private String Convert(boolean src_is_gfui, String src_str) { this.src = Bry_.new_utf8_(src_str); this.src_len = src.length; tkns.Clear(); mod_val = Mod_val_null; diff --git a/400_xowa/src/gplx/gfui/Gfui_bnd_parser_tst.java b/400_xowa/src/gplx/gfui/Gfui_bnd_parser_tst.java index 0446184fb..9aca1417a 100644 --- a/400_xowa/src/gplx/gfui/Gfui_bnd_parser_tst.java +++ b/400_xowa/src/gplx/gfui/Gfui_bnd_parser_tst.java @@ -48,9 +48,9 @@ class Gfui_bnd_parser_fxt { parser = Gfui_bnd_parser.new_en_(); } public void Test_x_to_norm(String key, String expd) { - Tfds.Eq(expd, parser.X_to_norm(key)); + Tfds.Eq(expd, parser.Xto_norm(key)); } public void Test_x_to_gfui(String key, String expd) { - Tfds.Eq(expd, parser.X_to_gfui(key)); + Tfds.Eq(expd, parser.Xto_gfui(key)); } } diff --git a/400_xowa/src/gplx/html/Html_wtr.java b/400_xowa/src/gplx/html/Html_wtr.java index 1ec307875..120b4ec56 100644 --- a/400_xowa/src/gplx/html/Html_wtr.java +++ b/400_xowa/src/gplx/html/Html_wtr.java @@ -82,9 +82,9 @@ public class Html_wtr { bfr.Add_byte(Byte_ascii.Gt); return this; } - public byte[] X_to_bry_and_clear() {return bfr.XtoAryAndClear();} - public byte[] X_to_bry() {return bfr.XtoAry();} - public String X_to_str() {return bfr.XtoStr();} + public byte[] Xto_bry_and_clear() {return bfr.XtoAryAndClear();} + public byte[] Xto_bry() {return bfr.XtoAry();} + public String Xto_str() {return bfr.XtoStr();} public static void Write_atr(Bry_bfr bfr, byte[] key, byte[] val) {Write_atr(bfr, Byte_ascii.Quote, key, val);} public static void Write_atr(Bry_bfr bfr, byte atr_quote, byte[] key, byte[] val) { if (Bry_.Len_eq_0(val)) return; // don't write empty diff --git a/400_xowa/src/gplx/json/Json_doc_srl.java b/400_xowa/src/gplx/json/Json_doc_srl.java index b7a6bb6e3..88b5fe48a 100644 --- a/400_xowa/src/gplx/json/Json_doc_srl.java +++ b/400_xowa/src/gplx/json/Json_doc_srl.java @@ -33,7 +33,7 @@ public class Json_doc_srl { if (ClassAdp_.Is_array(t)) Write_kv_ary(comma, key, (Object[])val); else - Write_kv_str(comma, key, Object_.XtoStr_OrEmpty(val)); + Write_kv_str(comma, key, Object_.Xto_str_strict_or_empty(val)); } private void Write_kv_ary(boolean comma, byte[] key, Object[] val) { Write_key(comma, key); Write_new_line(); // '"key":\n' @@ -42,7 +42,7 @@ public class Json_doc_srl { int len = val.length; for (int i = 0; i < len; i++) { Write_itm_hdr(i != 0); // ', ' - Write_str(Bry_.new_utf8_(Object_.XtoStr_OrNull(val[i]))); + Write_str(Bry_.new_utf8_(Object_.Xto_str_strict_or_null(val[i]))); Write_new_line(); } Indent_del(); diff --git a/400_xowa/src/gplx/json/Json_itm_nde.java b/400_xowa/src/gplx/json/Json_itm_nde.java index 714e250ed..64a0bb67c 100644 --- a/400_xowa/src/gplx/json/Json_itm_nde.java +++ b/400_xowa/src/gplx/json/Json_itm_nde.java @@ -67,6 +67,6 @@ public class Json_itm_nde extends Json_itm_base implements Json_grp { Json_grp_.Print_nl(bfr); Json_grp_.Print_indent(bfr, depth); bfr.Add_byte(Byte_ascii.Curly_end).Add_byte_nl(); } - Json_itm[] subs = Json_itm_.Ary_empty; + private Json_itm[] subs = Json_itm_.Ary_empty; public static Json_itm_nde cast_(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid_nde ? null : (Json_itm_nde)v;} } diff --git a/400_xowa/src/gplx/json/Json_itm_tmp.java b/400_xowa/src/gplx/json/Json_itm_tmp.java index 99fec3778..892e09f97 100644 --- a/400_xowa/src/gplx/json/Json_itm_tmp.java +++ b/400_xowa/src/gplx/json/Json_itm_tmp.java @@ -19,7 +19,7 @@ package gplx.json; import gplx.*; public class Json_itm_tmp implements Json_itm { public Json_itm_tmp(byte tid, String data) {this.tid = tid; this.data = data;} public byte Tid() {return tid;} private byte tid; - public byte[] Data_bry() {return Bry_.new_utf8_(Object_.XtoStr_OrEmpty(data));} + public byte[] Data_bry() {return Bry_.new_utf8_(Object_.Xto_str_strict_or_empty(data));} public int Src_bgn() {return -1;} public int Src_end() {return -1;} public Object Data() {return data;} private String data; diff --git a/400_xowa/src/gplx/php/Php_itm_.java b/400_xowa/src/gplx/php/Php_itm_.java index c85bda1af..e9317b982 100644 --- a/400_xowa/src/gplx/php/Php_itm_.java +++ b/400_xowa/src/gplx/php/Php_itm_.java @@ -26,7 +26,7 @@ public class Php_itm_ { return rv; case Php_itm_.Tid_quote: byte[] bry = ((Php_itm_quote)itm).Val_obj_bry(); - rv = Bry_.X_to_int_or(bry, -1); + rv = Bry_.Xto_int_or(bry, -1); return (rv == -1) ? or : rv; default: return or; diff --git a/400_xowa/src/gplx/php/Php_srl_itm.java b/400_xowa/src/gplx/php/Php_srl_itm.java index e96e25b53..2b0a0371c 100644 --- a/400_xowa/src/gplx/php/Php_srl_itm.java +++ b/400_xowa/src/gplx/php/Php_srl_itm.java @@ -39,7 +39,7 @@ abstract class Php_srl_itm_base implements Php_srl_itm { @gplx.Virtual public void Xto_bfr(Bry_bfr bfr, int depth) { Php_srl_wtr.Indent(bfr, depth); bfr.Add(Php_srl_itm_.Names[this.Tid()]).Add_byte(Byte_ascii.Colon); - bfr.Add_str(Object_.XtoStr_OrNullStr(this.Val())).Add_byte(Byte_ascii.Semic).Add_byte_nl(); + bfr.Add_str(Object_.Xto_str_strict_or_null_mark(this.Val())).Add_byte(Byte_ascii.Semic).Add_byte_nl(); } public void Clear() {} } diff --git a/400_xowa/src/gplx/php/Php_srl_parser.java b/400_xowa/src/gplx/php/Php_srl_parser.java index d853ec1bd..357223b97 100644 --- a/400_xowa/src/gplx/php/Php_srl_parser.java +++ b/400_xowa/src/gplx/php/Php_srl_parser.java @@ -42,7 +42,7 @@ public class Php_srl_parser { val = Xto_kv_ary(ary); break; case Php_srl_itm_.Tid_function: - val = new gplx.xowa.xtns.scribunto.Scrib_lua_proc(Object_.XtoStr_OrNullStr(key), Int_.cast_(itm_val.Val())); // NOTE: in most cases, key is a STRING (name of ScribFunction); however, for gsub it is an INT (arg_idx) b/c it is passed as a parameter + val = new gplx.xowa.xtns.scribunto.Scrib_lua_proc(Object_.Xto_str_strict_or_null_mark(key), Int_.cast_(itm_val.Val())); // NOTE: in most cases, key is a STRING (name of ScribFunction); however, for gsub it is an INT (arg_idx) b/c it is passed as a parameter break; default: val = itm_val.Val(); @@ -147,7 +147,7 @@ public class Php_srl_parser { pos = bgn; pos = Chk(raw, pos + 1, Byte_ascii.Colon); int int_end = Skip_while_num(raw, raw_len, pos, true); - int int_val = Bry_.X_to_int_or(raw, pos, int_end, Int_.MinValue); + int int_val = Bry_.Xto_int_or(raw, pos, int_end, Int_.MinValue); pos = int_end; return int_val; } @@ -155,7 +155,7 @@ public class Php_srl_parser { pos = bgn; pos = Chk(raw, pos + 1, Byte_ascii.Colon); int int_end = Skip_while_num(raw, raw_len, pos, true); - int int_val = Bry_.X_to_int_or(raw, pos, int_end, Int_.MinValue); + int int_val = Bry_.Xto_int_or(raw, pos, int_end, Int_.MinValue); Php_srl_itm_int rv = factory.Int(pos, int_end, int_val); pos = int_end; return rv; diff --git a/400_xowa/src/gplx/php/Php_text_itm_parser.java b/400_xowa/src/gplx/php/Php_text_itm_parser.java index 6fd7c0165..d00f917f0 100644 --- a/400_xowa/src/gplx/php/Php_text_itm_parser.java +++ b/400_xowa/src/gplx/php/Php_text_itm_parser.java @@ -84,7 +84,7 @@ public class Php_text_itm_parser { //throw Err_mgr._.fmt_auto_(GRP_KEY, "dollar_is_last_char", String_.new_utf8_(raw)); } int int_end = Find_fwd_non_int(raw, i + 1, raw_len); // +1 to search after $ - int int_val = Bry_.X_to_int_or(raw, i + 1, int_end, -1); // +1 to search after $ + int int_val = Bry_.Xto_int_or(raw, i + 1, int_end, -1); // +1 to search after $ if (int_val == -1) { tmp_list.Add(new Php_text_itm_text(i, i + 1)); continue; diff --git a/400_xowa/src/gplx/php/Php_tkn.java b/400_xowa/src/gplx/php/Php_tkn.java index 7a70f583b..ca58fe7de 100644 --- a/400_xowa/src/gplx/php/Php_tkn.java +++ b/400_xowa/src/gplx/php/Php_tkn.java @@ -59,7 +59,7 @@ class Php_tkn_var extends Php_tkn_base { class Php_tkn_num extends Php_tkn_base { public Php_tkn_num(int src_bgn, int src_end) {this.Src_rng_(src_bgn, src_end);} @Override public byte Tkn_tid() {return Php_tkn_.Tid_num;} - public int Num_val_int(byte[] src) {return Bry_.X_to_int_or(src, this.Src_bgn(), this.Src_end(), Int_.MinValue);} + public int Num_val_int(byte[] src) {return Bry_.Xto_int_or(src, this.Src_bgn(), this.Src_end(), Int_.MinValue);} } class Php_tkn_quote extends Php_tkn_base { public Php_tkn_quote(int src_bgn, int src_end, byte quote_tid) {this.Src_rng_(src_bgn, src_end); this.quote_tid = quote_tid;} diff --git a/400_xowa/src/gplx/srls/dsvs/Dsv_fld_parser_.java b/400_xowa/src/gplx/srls/dsvs/Dsv_fld_parser_.java index 067b84797..1e814cc28 100644 --- a/400_xowa/src/gplx/srls/dsvs/Dsv_fld_parser_.java +++ b/400_xowa/src/gplx/srls/dsvs/Dsv_fld_parser_.java @@ -63,14 +63,14 @@ class Dsv_fld_parser_int implements Dsv_fld_parser { boolean pos_is_last = pos == src_len; byte b = pos_is_last ? row_dlm : src[pos]; if (b == fld_dlm) { - boolean pass = wkr.Write_int(parser, fld_idx, pos, Bry_.X_to_int_or(src, fld_bgn, pos, -1)); + boolean pass = wkr.Write_int(parser, fld_idx, pos, Bry_.Xto_int_or(src, fld_bgn, pos, -1)); if (!pass) throw Dsv_fld_parser_.err_fld_unhandled(this, wkr, fld_idx, src, fld_bgn, pos); int rv = pos + 1; // fld_dlm is always 1 byte parser.Update_by_fld(rv); return rv; } else if (b == row_dlm) { - boolean pass = wkr.Write_int(parser, fld_idx, pos, Bry_.X_to_int_or(src, fld_bgn, pos, -1)); + boolean pass = wkr.Write_int(parser, fld_idx, pos, Bry_.Xto_int_or(src, fld_bgn, pos, -1)); if (!pass) throw Dsv_fld_parser_.err_fld_unhandled(this, wkr, fld_idx, src, fld_bgn, pos); wkr.Commit_itm(parser, pos); int rv = pos + 1; // row_dlm is always 1 byte diff --git a/400_xowa/src/gplx/xowa/Xoa_app.java b/400_xowa/src/gplx/xowa/Xoa_app.java index f48ba3adc..d76562b6e 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app.java +++ b/400_xowa/src/gplx/xowa/Xoa_app.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import gplx.core.btries.*; import gplx.core.flds.*; import gplx.ios.*; import gplx.threads.*; -import gplx.xowa.apps.*; import gplx.xowa.apps.caches.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.apis.*; +import gplx.xowa.apps.*; import gplx.xowa.apps.caches.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.apis.*; import gplx.xowa.urls.encoders.*; import gplx.xowa.langs.*; import gplx.xowa.specials.*; import gplx.xowa.cfgs2.*; import gplx.xowa.wikis.*; import gplx.xowa.users.*; import gplx.xowa.gui.*; import gplx.xowa.cfgs.*; import gplx.xowa.ctgs.*; import gplx.xowa.html.tocs.*; import gplx.xowa.fmtrs.*; import gplx.xowa.html.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.amps.*; @@ -39,7 +39,7 @@ public class Xoa_app implements GfoInvkAble { gui_mgr = new Xoa_gui_mgr(this); bldr = new Xob_bldr(this); file_mgr.Init_app(this, usr_dlg); - href_parser = new Xoh_href_parser(url_converter_href, url_parser.Url_parser()); + href_parser = new Xoh_href_parser(encoder_mgr.Href(), url_parser.Url_parser()); sanitizer = new Xop_sanitizer(parser_amp_mgr, msg_log); user_mgr = new Xou_user_mgr(this, user); sys_cfg = new Xoa_sys_cfg(this); @@ -49,7 +49,7 @@ public class Xoa_app implements GfoInvkAble { gfs_mgr = new Xoa_gfs_mgr(this); xtn_mgr = new Xow_xtn_mgr().Ctor_by_app(this); hive_mgr = new Xoa_hive_mgr(this); - Io_url.Http_file_str_encoder = url_converter_fsys; + Io_url.Http_file_str_encoder = encoder_mgr.Fsys(); tcp_server.App_ctor(this); fmtr_mgr = new Xoa_fmtr_mgr(this); log_mgr = new Xop_log_mgr(this); @@ -113,7 +113,7 @@ public class Xoa_app implements GfoInvkAble { public byte Mode() {return mode;} public Xoa_app Mode_(byte v) {mode = v; return this;} private byte mode = Xoa_app_.Mode_console; public Xop_amp_mgr Parser_amp_mgr() {return parser_amp_mgr;} private Xop_amp_mgr parser_amp_mgr = new Xop_amp_mgr(); public Xoa_thread_mgr Thread_mgr() {return thread_mgr;} private Xoa_thread_mgr thread_mgr = new Xoa_thread_mgr(); - + public Url_encoder_mgr Encoder_mgr() {return encoder_mgr;} private Url_encoder_mgr encoder_mgr = new Url_encoder_mgr(); public Xoa_fsys_mgr Fsys_mgr() {return fsys_mgr;} private Xoa_fsys_mgr fsys_mgr; public Xoa_hive_mgr Hive_mgr() {return hive_mgr;} private Xoa_hive_mgr hive_mgr; @@ -129,21 +129,13 @@ public class Xoa_app implements GfoInvkAble { public Gfo_msg_log Msg_log() {return msg_log;} private Gfo_msg_log msg_log = new Gfo_msg_log(Xoa_app_.Name); public Gfo_msg_log Msg_log_null() {return msg_log_null;} private Gfo_msg_log msg_log_null = new Gfo_msg_log("null_log"); - public Url_encoder Url_converter_id() {return url_converter_id;} private Url_encoder url_converter_id = Url_encoder.new_html_id_(); - public Url_encoder Url_converter_url() {return url_converter_url;} private Url_encoder url_converter_url = Url_encoder.new_http_url_(); - public Url_encoder Url_converter_url_ttl() {return url_converter_url_ttl;} private Url_encoder url_converter_url_ttl = Url_encoder.new_http_url_ttl_(); - public Url_encoder Url_converter_href() {return url_converter_href;} private Url_encoder url_converter_href = Url_encoder.new_html_href_mw_(); - public Url_encoder Url_converter_comma() {return url_converter_comma;} private Url_encoder url_converter_comma = Url_encoder.url_comma(); - public Url_encoder Url_converter_gfs() {return url_converter_gfs;} private Url_encoder url_converter_gfs = Url_encoder.new_gfs_(); - public Url_encoder Url_converter_fsys() {return url_converter_fsys;} private Url_encoder url_converter_fsys = Url_encoder.new_fsys_lnx_(); - public Url_encoder Url_converter_fsys_safe() {return url_converter_fsys_safe;} private Url_encoder url_converter_fsys_safe = Url_encoder.new_fsys_wnt_(); public Xoh_file_main_wkr File_main_wkr() {return file_main_wkr;} private Xoh_file_main_wkr file_main_wkr = new Xoh_file_main_wkr(); public Btrie_slim_mgr Utl_trie_tblw_ws() {return utl_trie_tblw_ws;} private Btrie_slim_mgr utl_trie_tblw_ws = Xop_tblw_ws_itm.trie_(); public Bry_bfr_mkr Utl_bry_bfr_mkr() {return utl_bry_bfr_mkr;} Bry_bfr_mkr utl_bry_bfr_mkr = new Bry_bfr_mkr(); public Gfo_fld_rdr Utl_fld_rdr() {return utl_fld_rdr;} Gfo_fld_rdr utl_fld_rdr = Gfo_fld_rdr.xowa_(); public Gfo_log_bfr Log_bfr() {return log_bfr;} private Gfo_log_bfr log_bfr = new Gfo_log_bfr(); public Xoa_sys_cfg Sys_cfg() {return sys_cfg;} private Xoa_sys_cfg sys_cfg; - public Bry_fmtr Tmp_fmtr() {return tmp_fmtr;} Bry_fmtr tmp_fmtr = Bry_fmtr.new_(""); + public Bry_fmtr Tmp_fmtr() {return tmp_fmtr;} Bry_fmtr tmp_fmtr = Bry_fmtr.new_(""); public boolean Xwiki_missing(byte[] wiki_key) {return user.Wiki().Xwiki_mgr().Get_by_key(wiki_key) == null;} // NOTE: only the user_wiki has a full list of all wikis b/c it has xwiki objects; wiki_mgr does not, b/c it has heavier wiki objects which are loaded dynamically; public boolean Xwiki_exists(byte[] wiki_key) {return user.Wiki().Xwiki_mgr().Get_by_key(wiki_key) != null;} public Xoa_ctg_mgr Ctg_mgr() {return ctg_mgr;} private Xoa_ctg_mgr ctg_mgr = new Xoa_ctg_mgr(); diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index 2f76415d5..b86541535 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -23,7 +23,7 @@ public class Xoa_app_ { boot_mgr.Run(args); } public static final String Name = "xowa"; - public static final String Version = "1.7.2.1"; + public static final String Version = "1.7.3.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys; public static String User_agent = ""; @@ -120,7 +120,7 @@ class Xoa_app_boot_mgr { Io_url wiki_dir = args_mgr.Args_get("wiki_dir").Val_as_url_rel_dir_or(root_dir.GenSubDir("wiki"), root_dir.GenSubDir("wiki")); Io_url cmd_file = args_mgr.Args_get("cmd_file").Val_as_url_rel_fil_or(jar_dir, root_dir.GenSubFil("xowa.gfs")); String app_mode = args_mgr.Args_get("app_mode").Val_as_str_or("gui"); - String launch_url = args_mgr.Args_get("url").Val_as_str_or(Xoa_sys_cfg.Launch_url_dflt); + String launch_url = args_mgr.Args_get("url").Val_as_str_or(null); int server_port_recv = args_mgr.Args_get("server_port_recv").Val_as_int_or(55000); int server_port_send = args_mgr.Args_get("server_port_send").Val_as_int_or(55001); int http_server_port = args_mgr.Args_get("http_server_port").Val_as_int_or(8080); @@ -133,8 +133,9 @@ class Xoa_app_boot_mgr { app = new Xoa_app(usr_dlg, root_dir, user_dir, Xoa_app_.Op_sys); usr_dlg.Log_wtr().Queue_enabled_(false); log_wtr.Log_msg_to_session_fmt("app.init"); app.Fsys_mgr().Wiki_dir_(wiki_dir); try { - app.Sys_cfg().Lang_(System_lang()); chkpoint = "lang"; - app.Sys_cfg().Launch_url_(launch_url); chkpoint = "url"; + app.Sys_cfg().Lang_(System_lang()); + if (launch_url != null) + app.Api_root().App().Startup().Tabs().Manual_(launch_url); app.Tcp_server().Rdr_port_(server_port_recv).Wtr_port_(server_port_send); app.Http_server().Port_(http_server_port); app.Init(); chkpoint = "init_gfs"; @@ -147,7 +148,7 @@ class Xoa_app_boot_mgr { catch (Exception e) { usr_dlg.Warn_many("", "", "script file failed: ~{0} ~{1} ~{2}", chkpoint, cmd_file.Raw(), Err_.Message_gplx(e)); if (app_mode_gui) - GfuiEnv_.ShowMsg(Err_.Message_gplx_brief(e)); + GfuiEnv_.ShowMsg(Err_.Message_gplx(e)); } // launch @@ -158,7 +159,7 @@ class Xoa_app_boot_mgr { app.Http_server().Run(); else { if (cmd_text != null) - ConsoleAdp._.WriteLine_utf8(Object_.XtoStr_OrEmpty(app.Gfs_mgr().Run_str(cmd_text))); + ConsoleAdp._.WriteLine_utf8(Object_.Xto_str_strict_or_empty(app.Gfs_mgr().Run_str(cmd_text))); if (app_mode_gui) { app.Mode_(Xoa_app_.Mode_gui); app.Gui_mgr().Run(); chkpoint = "run"; diff --git a/400_xowa/src/gplx/xowa/apis/Xoapi_root.java b/400_xowa/src/gplx/xowa/apis/Xoapi_root.java index 15e8e3dc6..208a7b202 100644 --- a/400_xowa/src/gplx/xowa/apis/Xoapi_root.java +++ b/400_xowa/src/gplx/xowa/apis/Xoapi_root.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.gui.cmds.*; public class Xoapi_root implements GfoInvkAble { - public Xoa_app app; + private Xoa_app app; public Xoapi_root(Xoa_app app) {usr_api.Ctor_by_app(app);} public void Init_by_kit(Xoa_app app) { this.app = app; diff --git a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app.java b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app.java index a5a08255d..21f07cc17 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app.java @@ -17,16 +17,19 @@ along with this program. If not, see . */ package gplx.xowa.apis.xowa; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.gui.views.*; +import gplx.xowa.apis.xowa.startups.*; public class Xoapi_app implements GfoInvkAble { private Xog_win_itm win; public void Init_by_kit(Xoa_app app) { win = app.Gui_mgr().Browser_win(); } public void Exit() {win.App__exit();} + public Xoapi_startups Startup() {return startup;} private Xoapi_startups startup = new Xoapi_startups(); public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_exit)) this.Exit(); + else if (ctx.Match(k, Invk_startup)) return startup; else return GfoInvkAble_.Rv_unhandled; return this; } - private static final String Invk_exit = "exit"; + private static final String Invk_exit = "exit", Invk_startup = "startup"; } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_html.java b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_html.java index 12e1906fa..97cef9c7f 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_html.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_html.java @@ -24,10 +24,12 @@ public class Xoapi_html implements GfoInvkAble { } public Xoapi_tidy Tidy() {return tidy;} private Xoapi_tidy tidy = new Xoapi_tidy(); public Xoapi_modules Modules() {return modules;} private Xoapi_modules modules = new Xoapi_modules(); + public Xoapi_skins Skins() {return skins;} private Xoapi_skins skins = new Xoapi_skins(); public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_tidy)) return tidy; else if (ctx.Match(k, Invk_modules)) return modules; + else if (ctx.Match(k, Invk_skins)) return skins; else return GfoInvkAble_.Rv_unhandled; } - private static final String Invk_tidy = "tidy", Invk_modules = "modules"; + private static final String Invk_tidy = "tidy", Invk_modules = "modules", Invk_skins = "skins"; } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_info.java b/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_info.java index d8c2b299a..cbbaf91ad 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_info.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_info.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.apis.xowa.gui.browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.apis.xowa.gui.*; import gplx.gfui.*; import gplx.xowa.gui.views.*; -public class Xoapi_info implements GfoInvkAble { +public class Xoapi_info implements Gfo_usr_dlg_ui_opt, GfoInvkAble { public void Init_by_kit(Xoa_app app) {this.app = app;} private Xoa_app app; private Xog_win_itm Win() {return app.Gui_mgr().Browser_win();} public void Focus() {this.Win().Info_box().Focus();} @@ -26,12 +26,21 @@ public class Xoapi_info implements GfoInvkAble { Io_url session_fil = app.Log_wtr().Session_fil(); app.Fsys_mgr().App_mgr().App_view_text().Run(session_fil); } + public boolean Warn_enabled() {return warn_enabled;} private boolean warn_enabled; + public boolean Note_enabled() {return note_enabled;} private boolean note_enabled; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_focus)) this.Focus(); else if (ctx.Match(k, Invk_clear)) this.Clear(); else if (ctx.Match(k, Invk_launch)) this.Launch(); + else if (ctx.Match(k, Invk_warn_enabled)) return Yn.Xto_str(warn_enabled); + else if (ctx.Match(k, Invk_warn_enabled_)) warn_enabled = m.ReadYn("v"); + else if (ctx.Match(k, Invk_note_enabled)) return Yn.Xto_str(note_enabled); + else if (ctx.Match(k, Invk_note_enabled_)) note_enabled = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; return this; } - private static final String Invk_focus = "focus", Invk_clear = "clear", Invk_launch = "launch"; + private static final String Invk_focus = "focus", Invk_clear = "clear", Invk_launch = "launch" + , Invk_warn_enabled = "warn_enabled", Invk_warn_enabled_ = "warn_enabled_" + , Invk_note_enabled = "note_enabled", Invk_note_enabled_ = "note_enabled_" + ; } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/gui/pages/Xoapi_view.java b/400_xowa/src/gplx/xowa/apis/xowa/gui/pages/Xoapi_view.java index 3f6331185..ab7a13b44 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/gui/pages/Xoapi_view.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/gui/pages/Xoapi_view.java @@ -36,7 +36,7 @@ public class Xoapi_view implements GfoInvkAble { public void Save_as() { if (this.Active_tab_is_null()) return; Xog_tab_itm tab = win.Tab_mgr().Active_tab(); - String file_name = app.Url_converter_fsys_safe().Encode_str(String_.new_utf8_(tab.Page().Ttl().Full_url())) + ".html"; + String file_name = app.Encoder_mgr().Fsys_safe().Encode_str(String_.new_utf8_(tab.Page().Ttl().Full_url())) + ".html"; String file_url = app.Gui_mgr().Kit().New_dlg_file(Gfui_kit_.File_dlg_type_save, "Select file to save to:").Init_file_(file_name).Ask(); if (String_.Len_eq_0(file_url)) return; Io_mgr._.SaveFilStr(file_url, tab.Html_box().Text()); diff --git a/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_skins.java b/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_skins.java new file mode 100644 index 000000000..b5565538c --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/html/Xoapi_skins.java @@ -0,0 +1,35 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.apis.xowa.html; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; +import gplx.xowa.apis.xowa.html.skins.*; +public class Xoapi_skins implements GfoInvkAble { + private HashAdp hash = HashAdp_.new_(); + public Xoapi_skins() { + server.Sidebar_home_enabled_(true); + hash.Add("desktop", desktop); + hash.Add("server", server); + } + public Xoapi_skin_app_base Desktop() {return desktop;} private Xoapi_skin_app_base desktop = new Xoapi_skin_app_base(); + public Xoapi_skin_app_base Server () {return server ;} private Xoapi_skin_app_base server = new Xoapi_skin_app_base(); + private GfoInvkAble Get(String key) {return (GfoInvkAble)hash.Fetch(key);} + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_get)) return Get(m.ReadStr("v")); + return this; + } + private static final String Invk_get = "get"; +} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_collapsible.java b/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_collapsible.java index 649c7f7b3..0cbd30ae8 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_collapsible.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_collapsible.java @@ -21,7 +21,7 @@ public class Xoapi_collapsible implements GfoInvkAble { } public boolean Collapsed() {return collapsed;} private boolean collapsed; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_collapsed)) return Yn.X_to_str(collapsed); + if (ctx.Match(k, Invk_collapsed)) return Yn.Xto_str(collapsed); else if (ctx.Match(k, Invk_collapsed_)) collapsed = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; return this; diff --git a/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_navframe.java b/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_navframe.java index afcf04968..6e3e040b3 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_navframe.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_navframe.java @@ -21,7 +21,7 @@ public class Xoapi_navframe implements GfoInvkAble { } public boolean Collapsed() {return collapsed;} private boolean collapsed; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_collapsed)) return Yn.X_to_str(collapsed); + if (ctx.Match(k, Invk_collapsed)) return Yn.Xto_str(collapsed); else if (ctx.Match(k, Invk_collapsed_)) collapsed = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; return this; diff --git a/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_popups.java b/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_popups.java index 6564148d7..d9f7d21f4 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_popups.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_popups.java @@ -60,7 +60,7 @@ public class Xoapi_popups implements GfoInvkAble, GfoEvMgrOwner { wiki.Html_mgr().Module_mgr().Popup_mgr().Show_all(popup_id); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_enabled)) return Yn.X_to_str(enabled); + if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(enabled); else if (ctx.Match(k, Invk_enabled_)) enabled = m.ReadYn("v"); else if (ctx.Match(k, Invk_show_more)) Show_more(m.ReadStr("popup_id")); else if (ctx.Match(k, Invk_show_all)) Show_all (m.ReadStr("popup_id")); @@ -80,7 +80,7 @@ public class Xoapi_popups implements GfoInvkAble, GfoEvMgrOwner { else if (ctx.Match(k, Invk_win_max_h_)) {win_max_h = Set_int(m, win_max_h, Evt_win_max_h_changed);} else if (ctx.Match(k, Invk_win_show_all_max_w)) return win_show_all_max_w; else if (ctx.Match(k, Invk_win_show_all_max_w_)) {win_show_all_max_w = m.ReadInt("v");} - else if (ctx.Match(k, Invk_win_bind_focus_blur)) return Yn.X_to_str(win_bind_focus_blur); + else if (ctx.Match(k, Invk_win_bind_focus_blur)) return Yn.Xto_str(win_bind_focus_blur); else if (ctx.Match(k, Invk_win_bind_focus_blur_)) win_bind_focus_blur = m.ReadYn("v"); else if (ctx.Match(k, Invk_xnde_ignore_ids)) return String_.new_utf8_(xnde_ignore_ids); else if (ctx.Match(k, Invk_xnde_ignore_ids_)) {xnde_ignore_ids = m.ReadBry("v"); GfoEvMgr_.PubVal(this, Evt_xnde_ignore_ids_changed, xnde_ignore_ids);} @@ -184,7 +184,7 @@ public class Xoapi_popups implements GfoInvkAble, GfoEvMgrOwner { ; public static final byte[] Dflt_xnde_ignore_ids = Bry_.new_ascii_("coordinates") - , Dflt_tmpl_keeplist = Bry_.new_ascii_("en.wikipedia.org|formatnum;age_in_days;as_of;gregorian_serial_date;currentminute;currentsecond;dmca;spaced_ndash;trim;month*;convert*;worldpop*;ipa*;lang*;nowrap*;h:*;mvar;math;vgy;audio;iso_639_name;transl;translate;linktext;zh;nihongo*;japanese_name;ko-hhrm|\n") + , Dflt_tmpl_keeplist = Bry_.new_ascii_("en.wikipedia.org|formatnum;age;age_in_days;age_in_years_and_days*;nts;number_table_sorting*;as_of;gregorian_serial_date;currentminute;currentsecond;dmca;spaced_ndash;trim;month*;convert*;worldpop*;ipa*;lang*;nowrap*;h:*;mvar;math;vgy;audio;iso_639_name;transl;translate;linktext;zh;nihongo*;japanese_name;ko-hhrm|\n") , Dflt_html_fmtr_popup = Bry_.new_ascii_(String_.Concat_lines_nl_skip_last ( "
" , "
~{content}" diff --git a/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_toc.java b/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_toc.java index 155b36003..b7c42cac3 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_toc.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/html/modules/Xoapi_toc.java @@ -21,7 +21,7 @@ public class Xoapi_toc implements GfoInvkAble { } public boolean Collapsed() {return collapsed;} private boolean collapsed = false; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_collapsed)) return Yn.X_to_str(collapsed); + if (ctx.Match(k, Invk_collapsed)) return Yn.Xto_str(collapsed); else if (ctx.Match(k, Invk_collapsed_)) collapsed = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; return this; diff --git a/400_xowa/src/gplx/xowa/apis/xowa/html/skins/Xoapi_skin_app_base.java b/400_xowa/src/gplx/xowa/apis/xowa/html/skins/Xoapi_skin_app_base.java new file mode 100644 index 000000000..c975dbcc6 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/html/skins/Xoapi_skin_app_base.java @@ -0,0 +1,29 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.apis.xowa.html.skins; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.apis.xowa.html.*; +public class Xoapi_skin_app_base implements GfoInvkAble { + public void Init_by_kit(Xoa_app app) { + } + public boolean Sidebar_home_enabled() {return sidebar_home_enabled;} public void Sidebar_home_enabled_(boolean v) {sidebar_home_enabled = v;} private boolean sidebar_home_enabled; + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_sidebar_home_enabled)) return Yn.Xto_str(sidebar_home_enabled); + else if (ctx.Match(k, Invk_sidebar_home_enabled_)) sidebar_home_enabled = m.ReadYn("v"); + return this; + } + private static final String Invk_sidebar_home_enabled = "sidebar_home_enabled", Invk_sidebar_home_enabled_ = "sidebar_home_enabled_"; +} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/startup/Xoapi_startup_tabs.java b/400_xowa/src/gplx/xowa/apis/xowa/startup/Xoapi_startup_tabs.java deleted file mode 100644 index 2ebd62c86..000000000 --- a/400_xowa/src/gplx/xowa/apis/xowa/startup/Xoapi_startup_tabs.java +++ /dev/null @@ -1,78 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.apis.xowa.startup; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; -class Xoapi_startup_tabs implements GfoInvkAble { - public String[] Calc_startup_strs() { - switch (type) { - case Xoapi_startup_tabs_type_.Tid_blank: return new String[] {gplx.xowa.specials.xowa.default_tab.Default_tab_page.Ttl_full_str}; - case Xoapi_startup_tabs_type_.Tid_xowa: return new String[] {gplx.xowa.users.Xouc_pages_mgr.Page_xowa}; - case Xoapi_startup_tabs_type_.Tid_custom: return String_.SplitLines_nl(custom); - case Xoapi_startup_tabs_type_.Tid_previous: return String_.SplitLines_nl(previous); - default: throw Err_.unhandled(type); - } - } - public String Custom() {return custom;} private String custom; - public boolean Custom_is_expr() {return custom_is_expr;} private boolean custom_is_expr; - public String Previous() {return previous;} public Xoapi_startup_tabs Previous_(String v) {previous = v; return this;} private String previous = ""; - public byte Type() {return type;} private byte type = Xoapi_startup_tabs_type_.Tid_xowa; - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_type)) return Xoapi_startup_tabs_type_.X_to_key(type); - else if (ctx.Match(k, Invk_type_)) type = Xoapi_startup_tabs_type_.X_to_tid(m.ReadStr("v")); - else if (ctx.Match(k, Invk_custom)) return custom; - else if (ctx.Match(k, Invk_custom_)) custom = m.ReadStr("v"); - else if (ctx.Match(k, Invk_custom_is_expr)) return Yn.X_to_str(custom_is_expr); - else if (ctx.Match(k, Invk_custom_is_expr_)) custom_is_expr = m.ReadYn("v"); - else return GfoInvkAble_.Rv_unhandled; - return this; - } - private static final String - Invk_type = "type", Invk_type_ = "type_" - , Invk_custom = "custom", Invk_custom_ = "custom_" - , Invk_custom_is_expr = "custom_is_expr", Invk_custom_is_expr_ = "custom_is_expr_" - ; -} -class Xoapi_startup_tabs_type_ { - public static final byte Tid_blank = 0, Tid_xowa = 1, Tid_previous = 2, Tid_custom = 3; - public static final String Key_blank = "blank", Key_xowa = "xowa", Key_previous = "previous", Key_custom = "custom"; - public static String X_to_key(byte v) { - switch (v) { - case Tid_blank: return Key_blank; - case Tid_xowa: return Key_xowa; - case Tid_previous: return Key_previous; - case Tid_custom: return Key_custom; - default: throw Err_.not_implemented_(); - } - } - public static byte X_to_tid(String s) { - if (String_.Eq(s, Key_blank)) return Tid_blank; - else if (String_.Eq(s, Key_xowa)) return Tid_xowa; - else if (String_.Eq(s, Key_previous)) return Tid_previous; - else if (String_.Eq(s, Key_custom)) return Tid_custom; - else throw Err_.not_implemented_(); - } - public static KeyVal[] Options__list = KeyVal_.Ary(KeyVal_.new_(Key_blank), KeyVal_.new_(Key_xowa), KeyVal_.new_(Key_previous), KeyVal_.new_(Key_custom)); -} -/* -startup { -tabs { - type = 'previous|blank|custom|xowa_home'; - custom = 'en.wikipedia.org/wiki/{{{MONTHNAME}}} {{{DAY}}'; - custom_has_wikitext = 'n'; -} -} -*/ diff --git a/400_xowa/src/gplx/xowa/apis/xowa/startups/Xoapi_startups.java b/400_xowa/src/gplx/xowa/apis/xowa/startups/Xoapi_startups.java new file mode 100644 index 000000000..113df01ba --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/startups/Xoapi_startups.java @@ -0,0 +1,29 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.apis.xowa.startups; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; +import gplx.xowa.apis.xowa.startups.tabs.*; +public class Xoapi_startups implements GfoInvkAble { + public void Init_by_kit(Xoa_app app) { + } + public Xoapi_startup_tabs Tabs() {return tabs;} private Xoapi_startup_tabs tabs = new Xoapi_startup_tabs(); + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_tabs)) return tabs; + else return GfoInvkAble_.Rv_unhandled; + } + private static final String Invk_tabs = "tabs"; +} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/startups/tabs/Xoapi_startup_tabs.java b/400_xowa/src/gplx/xowa/apis/xowa/startups/tabs/Xoapi_startup_tabs.java new file mode 100644 index 000000000..9a6e03ced --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/startups/tabs/Xoapi_startup_tabs.java @@ -0,0 +1,54 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.apis.xowa.startups.tabs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.apis.xowa.startups.*; +public class Xoapi_startup_tabs implements GfoInvkAble { + public String Custom() {return custom;} private String custom; + public boolean Custom_is_expr() {return custom_is_expr;} private boolean custom_is_expr; + public String Previous() {return previous;} public Xoapi_startup_tabs Previous_(String v) {previous = v; return this;} private String previous = ""; + public String Manual() {return manual;} public void Manual_(String v) {manual = v;} private String manual; + public byte Type() {return type;} private byte type = Xoapi_startup_tabs_tid_.Tid_xowa; + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_type)) return Xoapi_startup_tabs_tid_.Xto_key(type); + else if (ctx.Match(k, Invk_type_)) type = Xoapi_startup_tabs_tid_.Xto_tid(m.ReadStr("v")); + else if (ctx.Match(k, Invk_type_list)) return Xoapi_startup_tabs_tid_.Options__list; + else if (ctx.Match(k, Invk_previous)) return previous; + else if (ctx.Match(k, Invk_previous_)) previous = m.ReadStr("v"); + else if (ctx.Match(k, Invk_custom)) return custom; + else if (ctx.Match(k, Invk_custom_)) custom = m.ReadStr("v"); + else if (ctx.Match(k, Invk_custom_is_expr)) return Yn.Xto_str(custom_is_expr); + else if (ctx.Match(k, Invk_custom_is_expr_)) custom_is_expr = m.ReadYn("v"); + else return GfoInvkAble_.Rv_unhandled; + return this; + } + private static final String + Invk_type = "type", Invk_type_ = "type_", Invk_type_list = "type_list" + , Invk_custom = "custom", Invk_custom_ = "custom_" + , Invk_previous = "previous", Invk_previous_ = "previous_" + , Invk_custom_is_expr = "custom_is_expr", Invk_custom_is_expr_ = "custom_is_expr_" + ; + public String[] Calc_startup_strs() { + if (manual != null) return new String[] {manual}; + switch (type) { + case Xoapi_startup_tabs_tid_.Tid_blank: return new String[] {gplx.xowa.specials.xowa.default_tab.Default_tab_page.Ttl_full_str}; + case Xoapi_startup_tabs_tid_.Tid_xowa: return new String[] {gplx.xowa.users.Xouc_pages_mgr.Page_xowa}; + case Xoapi_startup_tabs_tid_.Tid_custom: return String_.SplitLines_nl(String_.Trim(custom)); + case Xoapi_startup_tabs_tid_.Tid_previous: return String_.SplitLines_nl(String_.Trim(previous)); + default: throw Err_.unhandled(type); + } + } +} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/startups/tabs/Xoapi_startup_tabs_tid_.java b/400_xowa/src/gplx/xowa/apis/xowa/startups/tabs/Xoapi_startup_tabs_tid_.java new file mode 100644 index 000000000..6664d912e --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/startups/tabs/Xoapi_startup_tabs_tid_.java @@ -0,0 +1,39 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.apis.xowa.startups.tabs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.apis.xowa.startups.*; +public class Xoapi_startup_tabs_tid_ { + public static final byte Tid_blank = 0, Tid_xowa = 1, Tid_previous = 2, Tid_custom = 3; + public static final String Key_blank = "blank", Key_xowa = "xowa", Key_previous = "previous", Key_custom = "custom"; + public static String Xto_key(byte v) { + switch (v) { + case Tid_blank: return Key_blank; + case Tid_xowa: return Key_xowa; + case Tid_previous: return Key_previous; + case Tid_custom: return Key_custom; + default: throw Err_.not_implemented_(); + } + } + public static byte Xto_tid(String s) { + if (String_.Eq(s, Key_blank)) return Tid_blank; + else if (String_.Eq(s, Key_xowa)) return Tid_xowa; + else if (String_.Eq(s, Key_previous)) return Tid_previous; + else if (String_.Eq(s, Key_custom)) return Tid_custom; + else throw Err_.not_implemented_(); + } + public static KeyVal[] Options__list = KeyVal_.Ary(KeyVal_.new_(Key_blank), KeyVal_.new_(Key_xowa), KeyVal_.new_(Key_previous), KeyVal_.new_(Key_custom)); +} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_bookmarks.java b/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_bookmarks.java index 3972430c1..e655f6e17 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_bookmarks.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_bookmarks.java @@ -42,7 +42,7 @@ public class Xoapi_bookmarks implements GfoInvkAble { } public void Show() {win.Page__navigate_by_url_bar("home/wiki/Data:Bookmarks");} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_enabled)) return Yn.X_to_str(this.Enabled()); + if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(this.Enabled()); else if (ctx.Match(k, Invk_enabled_)) Enabled_(m.ReadYn("v")); else if (ctx.Match(k, Invk_add)) this.Add(m.ReadStrOr("v", null)); else if (ctx.Match(k, Invk_show)) this.Show(); diff --git a/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_history.java b/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_history.java index 1ee28840d..f5828f169 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_history.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_history.java @@ -26,7 +26,7 @@ public class Xoapi_history implements GfoInvkAble { public void Goto_recent() {win.Page__navigate_by_url_bar(app.User().History_mgr().Get_at_last(app));} public void Show() {win.Page__navigate_by_url_bar("home/wiki/Special:XowaPageHistory");} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_enabled)) return Yn.X_to_str(this.Enabled()); + if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(this.Enabled()); else if (ctx.Match(k, Invk_enabled_)) Enabled_(m.ReadYn("v")); else if (ctx.Match(k, Invk_goto_recent)) this.Goto_recent(); else if (ctx.Match(k, Invk_show)) this.Show(); diff --git a/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_logs.java b/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_logs.java index 39ab4cfe4..b372de4e7 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_logs.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_logs.java @@ -28,7 +28,7 @@ public class Xoapi_logs implements GfoInvkAble { Io_mgr._.DeleteFil_args(app.Log_wtr().Session_fil()).MissingFails_off().Exec(); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_enabled)) return Yn.X_to_str(this.Enabled()); + if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(this.Enabled()); else if (ctx.Match(k, Invk_enabled_)) Enabled_(m.ReadYn("v")); else return GfoInvkAble_.Rv_unhandled; return this; diff --git a/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java b/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java index 60b963660..3e73a7a28 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java @@ -99,7 +99,7 @@ public class Xoa_gfs_mgr implements GfoInvkAble, GfoInvkRootWkr { public static void Msg_parser_init() { GfsCore._.MsgParser_(gplx.gfs.Gfs_msg_bldr._); } - public static byte[] Cfg_save_escape(String v) {return Cfg_save_escape(Bry_.new_ascii_(v));} + public static byte[] Cfg_save_escape(String v) {return Cfg_save_escape(Bry_.new_utf8_(v));} public static byte[] Cfg_save_escape(byte[] v) { return Bry_finder.Find_fwd(v, Byte_ascii.Apos) == Bry_.NotFound ? v : Bry_.Replace(v, Bry_apos_1, Bry_apos_2); } static final byte[] Bry_apos_1 = Bry_.new_ascii_("'"), Bry_apos_2 = Bry_.new_ascii_("''"); diff --git a/400_xowa/src/gplx/xowa/apps/Xoa_gfs_php_mgr.java b/400_xowa/src/gplx/xowa/apps/Xoa_gfs_php_mgr.java index a82d401c9..44fa41674 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoa_gfs_php_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/Xoa_gfs_php_mgr.java @@ -74,7 +74,7 @@ public class Xoa_gfs_php_mgr { ) throw Err_.new_("invalid gfs; num_end not found={0}", String_.new_utf8_(src)); bfr.Add_byte(Byte_ascii.Dollar); - int arg_idx = Bry_.X_to_int_or(src, num_bgn, num_end, -1); + int arg_idx = Bry_.Xto_int_or(src, num_bgn, num_end, -1); if (arg_idx == -1) { throw Err_.new_("invalid int"); } @@ -103,7 +103,7 @@ public class Xoa_gfs_php_mgr { break; case Byte_ascii.Dollar: int end_pos = Php_text_itm_parser.Find_fwd_non_int(raw, i + 1, raw_len); - int int_val = Bry_.X_to_int_or(raw, i + 1, end_pos, -1); + int int_val = Bry_.Xto_int_or(raw, i + 1, end_pos, -1); bfr.Add_byte(Bry_fmtr.char_escape).Add_byte(Bry_fmtr.char_arg_bgn).Add_int_variable(int_val - 1).Add_byte(Bry_fmtr.char_arg_end); i = end_pos - 1; break; diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java index 34c9f5e6f..058f4014f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java @@ -53,6 +53,8 @@ public class Xob_cmd_mgr implements GfoInvkAble { else if (String_.Eq(cmd_key, Xob_xfer_regy_cmd.KEY_oimg)) return Add(new Xob_xfer_regy_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_xfer_regy_update_cmd.KEY_oimg)) return Add(new Xob_xfer_regy_update_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_xfer_update_cmd.KEY_oimg)) return Add(new Xob_xfer_update_cmd(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_diff_regy_exec_cmd.KEY_oimg)) return Add(new Xob_diff_regy_exec_cmd(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_diff_regy_make_cmd.KEY_oimg)) return Add(new Xob_diff_regy_make_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xof_wiki_orig_cmd.KEY_oimg)) return Add(new Xof_wiki_orig_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_download_wkr.KEY_oimg)) return Add(new Xob_download_wkr(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_page_regy_cmd.KEY_oimg)) return Add(new Xob_page_regy_cmd(bldr, wiki)); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd.java new file mode 100644 index 000000000..70b9a3018 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd.java @@ -0,0 +1,82 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +import gplx.dbs.*; import gplx.fsdb.*; import gplx.xowa.bldrs.oimgs.*; +public class Xob_diff_regy_exec_cmd extends Xob_itm_basic_base implements Xob_cmd { + private Io_url sql_dir; + public Xob_diff_regy_exec_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.diff_regy.exec"; + public void Cmd_ini(Xob_bldr bldr) {} + public void Cmd_bgn(Xob_bldr bldr) {} + public void Cmd_run() {Exec_main();} + public void Cmd_end() {} + public void Cmd_print() {} + private void Exec_main() { + if (sql_dir == null) + sql_dir = wiki.Ctx().App().Fsys_mgr().File_dir().GenSubDir_nest(wiki.Domain_str(), "tmp_sql"); + Xob_diff_regy_sql_runner runner = new Xob_diff_regy_sql_runner(); + Io_url[] urls = Io_mgr._.QueryDir_fils(sql_dir); + int urls_len = urls.length; + for (int i = 0; i < urls_len; ++i) + runner.Exec(app, urls[i]); + Xob_diff_regy_sql_runner.Get_provider(wiki, 0, Fsdb_db_tid_.Tid_atr).Exec_sql("VACUUM;"); + } + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_sql_dir_)) sql_dir = m.ReadIoUrl("v"); + else return super.Invk(ctx, ikey, k, m); + return this; + } private static final String Invk_sql_dir_ = "sql_dir_"; +} +class Xob_diff_regy_sql_runner { + public Io_url Url() {return url;} private Io_url url; + public String Wiki_domain() {return wiki_domain;} private String wiki_domain; + public int Fsdb_db_id() {return fsdb_db_id;} private int fsdb_db_id; + public byte Fsdb_db_tid() {return fsdb_db_tid;} private byte fsdb_db_tid; + public void Exec(Xoa_app app, Io_url url) { + Parse_url(url); + Run_sql(app); + } + public void Parse_url(Io_url url) { + this.url = url; + String[] parts = String_.Split(url.NameOnly(), "-"); + wiki_domain = parts[0]; + fsdb_db_id = Int_.parse_(parts[1]); + fsdb_db_tid = Fsdb_db_tid_.Xto_tid(parts[2]); + } + public void Run_sql(Xoa_app app) { + Xow_wiki wiki = app.Wiki_mgr().Get_by_key_or_null(Bry_.new_utf8_(wiki_domain)); + app.Usr_dlg().Prog_many("", "", "running sql: url=~{0}", url.Raw()); + Db_provider provider = Get_provider(wiki, fsdb_db_id, fsdb_db_tid); + provider.Exec_sql(Io_mgr._.LoadFilStr(url)); + if (fsdb_db_tid == Fsdb_db_tid_.Tid_bin) + provider.Exec_sql("VACUUM;"); + } + public static Db_provider Get_provider(Xow_wiki wiki, int fsdb_db_id, byte fsdb_db_tid) { + wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); + Fsdb_db_abc_mgr abc_mgr = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Abc_mgr_at(0); + if (fsdb_db_tid == Fsdb_db_tid_.Tid_bin) + return abc_mgr.Bin_mgr().Get_at(fsdb_db_id).Provider(); + else if (fsdb_db_tid == Fsdb_db_tid_.Tid_atr) + return abc_mgr.Atr_mgr().Get_at(0).Provider(); + else + throw Err_.unhandled(fsdb_db_tid); + } + public static String Build_url(String wiki_domain, int fsdb_db_id, String fsdb_db_type) { + return String_.Format("{0}-{1}-{2}.sql", wiki_domain, Int_.XtoStr_PadBgn(fsdb_db_id, 3), fsdb_db_type); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd_tst.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd_tst.java new file mode 100644 index 000000000..02c77f440 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd_tst.java @@ -0,0 +1,45 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +import org.junit.*; +import gplx.fsdb.*; +public class Xob_diff_regy_exec_cmd_tst { + private Xob_diff_regy_exec_cmd_fxt fxt = new Xob_diff_regy_exec_cmd_fxt(); + @Test public void Xto_commons() { + fxt.Test_build_url("enwiki", 1, "atr", "enwiki-001-atr.sql"); + fxt.Test_parse_url("/file/enwiki-001-atr.sql", "enwiki", 1, Fsdb_db_tid_.Tid_atr); + } +// @Test public void Smoke() { +// Xoa_app app = Xoa_app_fxt.app_(Io_url_.new_dir_("C:\\xowa\\"), "wnt"); +// Xow_wiki wiki = Xoa_app_fxt.wiki_tst_(app); +// Xob_diff_regy_make_cmd cmd = new Xob_diff_regy_make_cmd(app.Bldr(), wiki); +// cmd.Cmd_run(); +// } +} +class Xob_diff_regy_exec_cmd_fxt { + public void Test_build_url(String wiki_domain, int fsdb_db_id, String fsdb_db_type, String expd) { + Tfds.Eq(expd, Xob_diff_regy_sql_runner.Build_url(wiki_domain, fsdb_db_id, fsdb_db_type)); + } + public void Test_parse_url(String raw, String expd_wiki_domain, int expd_fsdb_db_id, byte expd_fsdb_db_tid) { + Xob_diff_regy_sql_runner runner = new Xob_diff_regy_sql_runner(); + runner.Parse_url(Io_url_.new_any_(raw)); + Tfds.Eq(expd_wiki_domain, runner.Wiki_domain()); + Tfds.Eq(expd_fsdb_db_id, runner.Fsdb_db_id()); + Tfds.Eq(expd_fsdb_db_tid, runner.Fsdb_db_tid()); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_make_cmd.java new file mode 100644 index 000000000..1d2b761fe --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_make_cmd.java @@ -0,0 +1,132 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +import gplx.dbs.*; import gplx.fsdb.*; import gplx.xowa.bldrs.oimgs.*; +public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cmd { + public Xob_diff_regy_make_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.diff_regy.make"; + public void Cmd_ini(Xob_bldr bldr) {} + public void Cmd_bgn(Xob_bldr bldr) {} + public void Cmd_run() {Exec_main();} + public void Cmd_end() {} + public void Cmd_print() {} + private void Exec_main() { + Db_provider make_db_provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Provider(); + this.Make_join_indexes(make_db_provider); + this.Make_diff_regy(make_db_provider); + this.Make_delete_sql(make_db_provider); + } + private void Make_join_indexes(Db_provider make_db_provider) { + Sqlite_engine_.Idx_create(make_db_provider, Xob_diff_regy_tbl.Idx_fsdb_regy__join); + Sqlite_engine_.Idx_create(make_db_provider, Xob_diff_regy_tbl.Idx_xfer_regy__join); + } + private void Make_diff_regy(Db_provider make_db_provider) { + Sqlite_engine_.Tbl_create_and_delete(make_db_provider, Xob_diff_regy_tbl.Tbl_name, Xob_diff_regy_tbl.Tbl_sql); + make_db_provider.Exec_sql(Xob_diff_regy_tbl.Make_diff_regy); + Sqlite_engine_.Idx_create(make_db_provider, Xob_diff_regy_tbl.Idx_xfer_regy__join); + } + private void Make_delete_sql(Db_provider make_db_provider) { + DataRdr rdr = make_db_provider.Exec_sql_as_rdr(Xob_diff_regy_tbl.Make_deletes); + int cur_db_id = -1, cur_count = 0; + Bry_bfr atr_bfr = Bry_bfr.new_(), bin_bfr = Bry_bfr.new_(); + Io_url sql_tmp_dir = wiki.Ctx().App().Fsys_mgr().File_dir().GenSubDir_nest(wiki.Domain_str(), "tmp_sql"); + while (rdr.MoveNextPeer()) { + byte diff_is_orig = rdr.ReadByte("diff_is_orig"); + int diff_db_id = rdr.ReadInt("diff_db_id"); + int diff_fil_id = rdr.ReadInt("diff_fil_id"); + int diff_thm_id = rdr.ReadInt("diff_thm_id"); + if (cur_db_id != diff_db_id) { + Make_delete_sql_file(atr_bfr, bin_bfr, sql_tmp_dir, cur_db_id, cur_count); + cur_db_id = diff_db_id; + cur_count = 0; + } + Make_delete_sql_item(atr_bfr, bin_bfr, diff_is_orig, diff_db_id, diff_fil_id, diff_thm_id); + ++cur_count; + } + } + private void Make_delete_sql_file(Bry_bfr atr_bfr, Bry_bfr bin_bfr, Io_url sql_tmp_dir, int cur_db_id, int cur_count) { + Make_delete_sql_file(atr_bfr, sql_tmp_dir, cur_db_id, cur_count, Fsdb_db_tid_.Tid_atr); + Make_delete_sql_file(bin_bfr, sql_tmp_dir, cur_db_id, cur_count, Fsdb_db_tid_.Tid_bin); + app.Usr_dlg().Note_many("", "", "file.diff:sql generated: db_id=~{0} count=~{1}", Int_.XtoStr_PadBgn_space(cur_db_id, 3), Int_.XtoStr_PadBgn_space(cur_count, 7)); + } + private void Make_delete_sql_file(Bry_bfr bfr, Io_url sql_dir, int db_id, int cur_count, byte db_tid) { + if (db_id != -1 && cur_count > 0) { // do not write 1st bfr + bfr.Add_str("COMMIT;\n"); + String sql_url_name = String_.Format("{0}-{1}-{2}.sql", wiki.Domain_str(), Int_.XtoStr_PadBgn(db_id, 3), Fsdb_db_tid_.Xto_key(db_tid)); + Io_url sql_url = sql_dir.GenSubFil(sql_url_name); + Io_mgr._.SaveFilBfr(sql_url, bfr); + } + bfr.Clear(); // clear bfr if cur_count == 0 + bfr.Add_str("BEGIN TRANSACTION;\n"); + } + private void Make_delete_sql_item(Bry_bfr atr_bfr, Bry_bfr bin_bfr, byte diff_is_orig, int diff_db_id, int diff_fil_id, int diff_thm_id) { + if (diff_is_orig == Byte_.Zero) { + atr_bfr.Add_str("DELETE FROM fsdb_xtn_thm WHERE thm_id = " + Int_.XtoStr(diff_thm_id) + ";\n"); + bin_bfr.Add_str("DELETE FROM fsdb_bin WHERE bin_owner_id = " + Int_.XtoStr(diff_thm_id) + ";\n"); + } + else { + atr_bfr.Add_str("UPDATE fsdb_fil SET fil_bin_db_id = -1 WHERE fil_id = " + Int_.XtoStr(diff_fil_id) + ";\n"); + bin_bfr.Add_str("DELETE FROM fsdb_bin WHERE bin_owner_id = " + Int_.XtoStr(diff_fil_id) + ";\n"); + } + } +} +class Xob_diff_regy_tbl { + public static final String Tbl_name = "diff_regy"; + public static final String Tbl_sql = String_.Concat_lines_nl + ( "CREATE TABLE diff_regy" + , "( diff_id integer NOT NULL PRIMARY KEY" + , ", diff_is_orig tinyint NOT NULL " + , ", diff_status integer NOT NULL" + , ", diff_db_id integer NOT NULL" + , ", diff_fil_id integer NOT NULL" + , ", diff_thm_id integer NOT NULL" + , ", diff_name varchar(255) NOT NULL" + , ", diff_repo tinyint NOT NULL" + , ", diff_w integer NOT NULL" + , ", diff_time double NOT NULL" + , ", diff_page integer NOT NULL" + , ", diff_size bigint NOT NULL" + , ");" + ); + public static final Db_idx_itm Idx_fsdb_regy__join = Db_idx_itm.sql_("CREATE INDEX fsdb_regy__join ON fsdb_regy (fsdb_name, fsdb_is_orig, fsdb_repo, fsdb_w, fsdb_time, fsdb_page);"); + public static final Db_idx_itm Idx_xfer_regy__join = Db_idx_itm.sql_("CREATE INDEX xfer_regy__join ON xfer_regy (lnki_ttl , file_is_orig, orig_repo, file_w, lnki_time, lnki_page);"); + public static final Db_idx_itm Idx_diff_regy__load = Db_idx_itm.sql_("CREATE INDEX diff_regy__load ON diff_regy (diff_status, diff_db_id, diff_is_orig, diff_fil_id, diff_thm_id);"); + public static final String + Make_diff_regy = String_.Concat_lines_nl + ( "INSERT INTO diff_regy " + , " (diff_id, diff_is_orig, diff_db_id, diff_fil_id, diff_thm_id, diff_name, diff_repo, diff_w, diff_time, diff_page, diff_size, diff_status)" + , "SELECT " + , " f.fsdb_id, f.fsdb_is_orig, f.fsdb_db_id, f.fsdb_fil_id, f.fsdb_thm_id, f.fsdb_name, f.fsdb_repo, f.fsdb_w, f.fsdb_time, f.fsdb_page, f.fsdb_size, CASE WHEN x.lnki_ttl IS NULL THEN 0 ELSE 1 END" + , "FROM fsdb_regy f" + , " LEFT JOIN xfer_regy x " + , " ON f.fsdb_name = x.lnki_ttl" + , " AND f.fsdb_is_orig = x.file_is_orig" + , " AND f.fsdb_repo = x.orig_repo" + , " AND f.fsdb_w = x.file_w" + , " AND f.fsdb_time = x.lnki_time" + , " AND f.fsdb_page = x.lnki_page" + , ";" + ) + , Make_deletes = String_.Concat_lines_nl + ( "SELECT diff_db_id, diff_is_orig, diff_fil_id, diff_thm_id" + , "FROM diff_regy" + , "WHERE diff_status = 0" + , "ORDER BY diff_db_id, diff_is_orig, diff_fil_id, diff_thm_id" + ) + ; +} diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java index 018a96e5d..c3db61a65 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java @@ -105,7 +105,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_log Xof_ext ext = Xof_ext_.new_by_ttl_(ttl); double lnki_thumbtime = lnki.Thumbtime(); int lnki_page = lnki.Page(); - byte[] ttl_commons = X_to_commons(wiki_ns_file_is_case_match_all, commons_wiki, ttl); + byte[] ttl_commons = Xto_commons(wiki_ns_file_is_case_match_all, commons_wiki, ttl); if ( Xof_doc_page.Null_n(lnki_page) // page set && Xof_doc_thumb.Null_n(lnki_thumbtime)) // thumbtime set usr_dlg.Warn_many("", "", "page and thumbtime both set; this may be an issue with fsdb: page=~{0} ttl=~{1}", ctx.Cur_page().Ttl().Page_db_as_str(), String_.new_utf8_(ttl)); @@ -137,7 +137,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_log if (property_wkr == null) property_wkr = bldr.App().Wiki_mgr().Wdata_mgr().Property_wkr_or_new(); return property_wkr; } - public static byte[] X_to_commons(boolean wiki_ns_file_is_case_match_all, Xow_wiki commons_wiki, byte[] ttl_bry) { + public static byte[] Xto_commons(boolean wiki_ns_file_is_case_match_all, Xow_wiki commons_wiki, byte[] ttl_bry) { if (!wiki_ns_file_is_case_match_all) return null; // return "" if wiki matches common Xoa_ttl ttl = Xoa_ttl.parse_(commons_wiki, Xow_ns_.Id_file, ttl_bry); byte[] rv = ttl.Page_db(); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr_tst.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr_tst.java index 7f1d19a1a..ff5d61f8e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr_tst.java @@ -19,27 +19,27 @@ package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xo import org.junit.*; public class Xob_lnki_temp_wkr_tst { private Xob_lnki_temp_wkr_fxt fxt = new Xob_lnki_temp_wkr_fxt(); - @Test public void X_to_commons() { - fxt.Init_X_to_commons(true); - fxt.Test_X_to_commons("a", "A"); - fxt.Test_X_to_commons("A", null); + @Test public void Xto_commons() { + fxt.Init_Xto_commons(true); + fxt.Test_Xto_commons("a", "A"); + fxt.Test_Xto_commons("A", null); - fxt.Init_X_to_commons(false); - fxt.Test_X_to_commons("a", null); - fxt.Test_X_to_commons("A", null); + fxt.Init_Xto_commons(false); + fxt.Test_Xto_commons("a", null); + fxt.Test_Xto_commons("A", null); } } class Xob_lnki_temp_wkr_fxt { private boolean wiki_ns_file_is_case_match_all; private Xow_wiki commons_wiki; - public Xob_lnki_temp_wkr_fxt Init_X_to_commons(boolean wiki_ns_file_is_case_match_all) { + public Xob_lnki_temp_wkr_fxt Init_Xto_commons(boolean wiki_ns_file_is_case_match_all) { Xoa_app app = Xoa_app_fxt.app_(); this.wiki_ns_file_is_case_match_all = wiki_ns_file_is_case_match_all; this.commons_wiki = Xoa_app_fxt.wiki_tst_(app); // commons_wiki will default to Xow_ns.Id_file of case_match_1st return this; } - public void Test_X_to_commons(String ttl, String expd) { - Tfds.Eq(expd, String_.new_utf8_(Xob_lnki_temp_wkr.X_to_commons(wiki_ns_file_is_case_match_all, commons_wiki, Bry_.new_utf8_(ttl)))); + public void Test_Xto_commons(String ttl, String expd) { + Tfds.Eq(expd, String_.new_utf8_(Xob_lnki_temp_wkr.Xto_commons(wiki_ns_file_is_case_match_all, commons_wiki, Bry_.new_utf8_(ttl)))); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java index 753242a7d..e5d8d359e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java @@ -20,7 +20,7 @@ import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.bldrs.oimgs.*; class Xob_page_regy_tbl { public static void Reset_table(Db_provider p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} public static void Create_data(Gfo_usr_dlg usr_dlg, Db_provider p, byte repo_tid, Xow_wiki wiki) { - Create_data__insert_page(usr_dlg, p, repo_tid, wiki.Db_mgr_as_sql().Fsys_mgr().Get_url(Xodb_file.Tid_core)); + Create_data__insert_page(usr_dlg, p, repo_tid, wiki.Db_mgr_as_sql().Fsys_mgr().Get_url(Xodb_file_tid_.Tid_core)); Create_data__insert_redirect(usr_dlg, p, repo_tid, wiki.Fsys_mgr().Root_dir().GenSubFil(Xodb_db_file.Name__wiki_redirect)); } public static void Delete_local(Db_provider p) { diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java index ab01c0677..cd2c526a6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java @@ -71,12 +71,14 @@ class Xob_fsdb_regy_tbl { , ", fsdb_db_id integer NOT NULL" , ", fsdb_size bigint NOT NULL" , ", fsdb_status tinyint NOT NULL" + , ", fsdb_fil_id integer NOT NULL" + , ", fsdb_thm_id integer NOT NULL" , ");" ); public static final Db_idx_itm Idx_main = Db_idx_itm.sql_("CREATE INDEX fsdb_regy__main ON fsdb_regy (fsdb_name, fsdb_is_orig, fsdb_repo, fsdb_w, fsdb_time, fsdb_page);"); public static final String Insert_fsdb_fil = String_.Concat_lines_nl - ( "INSERT INTO fsdb_regy (fsdb_name, fsdb_is_orig, fsdb_repo, fsdb_w, fsdb_time, fsdb_page, fsdb_db_id, fsdb_size, fsdb_status)" + ( "INSERT INTO fsdb_regy (fsdb_name, fsdb_is_orig, fsdb_repo, fsdb_w, fsdb_time, fsdb_page, fsdb_db_id, fsdb_size, fsdb_status, fsdb_fil_id, fsdb_thm_id)" , "SELECT f.fil_name" , ", 1" , ", CASE WHEN d.dir_name = 'commons.wikimedia.org' THEN 0 ELSE 1 END" @@ -86,13 +88,15 @@ class Xob_fsdb_regy_tbl { , ", f.fil_bin_db_id" , ", f.fil_size" , ", 0" + , ", f.fil_id" + , ", -1" , "FROM fsdb_db.fsdb_fil f" , " JOIN fsdb_db.fsdb_dir d ON f.fil_owner_id = d.dir_id" , "WHERE f.fil_bin_db_id != -1" , ";" ) , Insert_fsdb_thm = String_.Concat_lines_nl - ( "INSERT INTO fsdb_regy (fsdb_name, fsdb_is_orig, fsdb_repo, fsdb_w, fsdb_time, fsdb_page, fsdb_db_id, fsdb_size, fsdb_status)" + ( "INSERT INTO fsdb_regy (fsdb_name, fsdb_is_orig, fsdb_repo, fsdb_w, fsdb_time, fsdb_page, fsdb_db_id, fsdb_size, fsdb_status, fsdb_fil_id, fsdb_thm_id)" , "SELECT f.fil_name" , ", 0" , ", CASE WHEN d.dir_name = 'commons.wikimedia.org' THEN 0 ELSE 1 END" @@ -102,13 +106,15 @@ class Xob_fsdb_regy_tbl { , ", t.thm_bin_db_id" , ", t.thm_size" , ", 0" + , ", f.fil_id" + , ", t.thm_id" , "FROM fsdb_db.fsdb_fil f" , " JOIN fsdb_db.fsdb_xtn_thm t ON f.fil_id = t.thm_owner_id" , " JOIN fsdb_db.fsdb_dir d ON f.fil_owner_id = d.dir_id" , ";" ) , Insert_fsdb_thm_v0 = String_.Concat_lines_nl - ( "INSERT INTO fsdb_regy (fsdb_name, fsdb_is_orig, fsdb_repo, fsdb_w, fsdb_time, fsdb_page, fsdb_db_id, fsdb_size, fsdb_status)" + ( "INSERT INTO fsdb_regy (fsdb_name, fsdb_is_orig, fsdb_repo, fsdb_w, fsdb_time, fsdb_page, fsdb_db_id, fsdb_size, fsdb_status, fsdb_fil_id, fsdb_thm_id)" , "SELECT f.fil_name" , ", 0" , ", CASE WHEN d.dir_name = 'commons.wikimedia.org' THEN 0 ELSE 1 END" @@ -118,6 +124,8 @@ class Xob_fsdb_regy_tbl { , ", t.thm_bin_db_id" , ", t.thm_size" , ", 0" + , ", f.fil_id" + , ", t.thm_id" , "FROM fsdb_db.fsdb_fil f" , " JOIN fsdb_db.fsdb_xtn_thm t ON f.fil_id = t.thm_owner_id" , " JOIN fsdb_db.fsdb_dir d ON f.fil_owner_id = d.dir_id" diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java index 45174a733..0ba1b515f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java @@ -41,7 +41,7 @@ public class Xob_import_cfg { Xoa_app app = wiki.App(); if (app.Setup_mgr().Dump_mgr().Import_bz2_by_stdout()) { ProcessAdp process = app.Fsys_mgr().App_mgr().App_decompress_bz2_by_stdout(); - return Io_stream_rdr_process.new_(process.Exe_url(), src_fil_bz2, process.X_to_process_bldr_args(src_fil_bz2.Raw())); + return Io_stream_rdr_process.new_(process.Exe_url(), src_fil_bz2, process.Xto_process_bldr_args(src_fil_bz2.Raw())); } else return gplx.ios.Io_stream_rdr_.bzip2_(src_fil_bz2); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java index e1a86c926..b72cf65cb 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java @@ -77,7 +77,7 @@ public class Xob_page_sql extends Xob_itm_basic_base implements Xobd_wkr, GfoInv db_mgr.Tbl_xowa_ns().Insert(ns_mgr); // save ns db_mgr.Tbl_xowa_db().Commit_all(page_provider, db_mgr.Fsys_mgr().Ary()); // save dbs; note that dbs can be saved again later db_mgr.Tbl_xowa_cfg().Insert_str(Xodb_mgr_sql.Grp_wiki_init, "props.modified_latest", modified_latest.XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time)); - fsys_mgr.Index_create(usr_dlg, Byte_.Ary(Xodb_file.Tid_core, Xodb_file.Tid_text), Xodb_file.Indexes_page_title, Xodb_file.Indexes_page_random); + fsys_mgr.Index_create(usr_dlg, Byte_.Ary(Xodb_file_tid_.Tid_core, Xodb_file_tid_.Tid_text), Index_page_title, Index_page_random); } @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_txn_commit_interval_)) txn_commit_interval = m.ReadInt("v"); @@ -85,6 +85,10 @@ public class Xob_page_sql extends Xob_itm_basic_base implements Xobd_wkr, GfoInv } private static final String Invk_txn_commit_interval_ = "txn_commit_interval_"; public void Wkr_ini(Xob_bldr bldr) {} public void Wkr_print() {} + private static final Db_idx_itm + Index_page_title = Db_idx_itm.sql_("CREATE UNIQUE INDEX IF NOT EXISTS page__title ON page (page_namespace, page_title, page_id, page_len, page_is_redirect);") // PERF:page_id for general queries; PERF: page_len for search_suggest; PREF:page_is_redirect for oimg + , Index_page_random = Db_idx_itm.sql_("CREATE UNIQUE INDEX IF NOT EXISTS page__name_random ON page (page_namespace, page_random_int);") + ; } class Xob_text_stmts_mgr { public Xob_text_stmts_mgr(Xodb_mgr_sql db_mgr, Xodb_fsys_mgr fsys_mgr) {this.db_mgr = db_mgr; this.fsys_mgr = fsys_mgr;} private Xodb_mgr_sql db_mgr; Xodb_fsys_mgr fsys_mgr; @@ -116,12 +120,12 @@ class Xob_text_stmts_mgr { Xodb_file File_get(int file_idx, int text_len) { if (file_idx == Xow_ns.Bldr_file_idx_heap) { file_idx = fsys_mgr.Tid_text_idx(); - Xodb_file file = fsys_mgr.Get_or_make(Xodb_file.Tid_text, file_idx); + Xodb_file file = fsys_mgr.Get_or_make(Xodb_file_tid_.Tid_text, file_idx); long file_len = file.File_len(); long file_max = fsys_mgr.Tid_text_max(); if (file_max != Xodb_fsys_mgr.Heap_max_infinite && (file_len + text_len > file_max)) { // file is "full" file.Provider().Txn_mgr().Txn_end_all(); // close txn - file = fsys_mgr.Make(Xodb_file.Tid_text); + file = fsys_mgr.Make(Xodb_file_tid_.Tid_text); file_idx = file.Id(); fsys_mgr.Tid_text_idx_(file_idx); } @@ -129,7 +133,7 @@ class Xob_text_stmts_mgr { return file; } else - return fsys_mgr.Get_or_make(Xodb_file.Tid_text, file_idx); + return fsys_mgr.Get_or_make(Xodb_file_tid_.Tid_text, file_idx); } private void Add(Db_stmt stmt, int stmt_idx) { int new_len = stmt_idx + 1; diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java index c9b2cc8f9..b35a09ffe 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java @@ -30,12 +30,12 @@ public class Xob_search_sql_cmd extends Xob_itm_basic_base implements Xob_cmd { if (!Env_.Mode_testing()) wiki.Init_assert(); Xodb_fsys_mgr db_fs = wiki.Db_mgr_as_sql().Fsys_mgr(); usr_dlg.Log_many("", "", "search_title.cmd: getting core db"); - Xodb_file page_db = db_fs.Get_tid_root(Xodb_file.Tid_core); + Xodb_file page_db = db_fs.Get_tid_root(Xodb_file_tid_.Tid_core); usr_dlg.Log_many("", "", "search_title.cmd: getting existing searchdb"); - Xodb_file search_db = db_fs.Get_tid_root(Xodb_file.Tid_search); + Xodb_file search_db = db_fs.Get_tid_root(Xodb_file_tid_.Tid_search); if (search_db == null) { usr_dlg.Log_many("", "", "search_title.cmd: making new searchdb"); - search_db = db_fs.Make(Xodb_file.Tid_search); + search_db = db_fs.Make(Xodb_file_tid_.Tid_search); } DataRdr page_rdr = DataRdr_.Null; Db_provider search_provider = search_db.Provider(); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java index 796718a07..904ecb9f8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java @@ -25,9 +25,9 @@ public class Xob_search_sql_wkr extends Xob_search_base implements Io_make_cmd { public void Sort_bgn() { db_mgr = wiki.Db_mgr_as_sql(); boolean created = false; - Xodb_file search_db = db_mgr.Fsys_mgr().Get_tid_root(Xodb_file.Tid_search); + Xodb_file search_db = db_mgr.Fsys_mgr().Get_tid_root(Xodb_file_tid_.Tid_search); if (search_db == null) { - search_db = db_mgr.Fsys_mgr().Make(Xodb_file.Tid_search); + search_db = db_mgr.Fsys_mgr().Make(Xodb_file_tid_.Tid_search); created = true; } provider = search_db.Provider(); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_calc_stats.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_calc_stats.java index 950f7cea3..767d52488 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_calc_stats.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_calc_stats.java @@ -60,7 +60,7 @@ public class Xobc_core_calc_stats extends Xob_itm_basic_base implements Xob_cmd for (int i = 0; i < len; i++) { if (i != 0) bfr.Add_byte(Byte_ascii.Comma).Add_byte(Byte_ascii.Space); Object val = vals[i]; - bfr.Add_str(Object_.XtoStr_OrNullStr(val)); + bfr.Add_str(Object_.Xto_str_strict_or_null_mark(val)); } bfr.Add_byte(Byte_ascii.Paren_end); } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java index 237f0af9d..f8690cf7b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java @@ -25,7 +25,7 @@ public abstract class Xob_categorylinks_base extends Xob_sql_dump_base implement parser.Fld_cmd_(this).Flds_req_(Fld_cl_from, Fld_cl_to, Fld_cl_timestamp, Fld_cl_collation, Fld_cl_sortkey, Fld_cl_type); } static final byte[] Fld_cl_from = Bry_.new_ascii_("cl_from"), Fld_cl_to = Bry_.new_ascii_("cl_to"), Fld_cl_timestamp = Bry_.new_ascii_("cl_timestamp"), Fld_cl_collation = Bry_.new_ascii_("cl_collation"), Fld_cl_sortkey = Bry_.new_ascii_("cl_sortkey"), Fld_cl_type = Bry_.new_ascii_("cl_type"); public void Exec(byte[] src, byte[] fld_key, int fld_idx, int fld_bgn, int fld_end, Bry_bfr file_bfr, Sql_file_parser_data data) { - if (Bry_.Eq(fld_key, Fld_cl_from)) cur_id = Bry_.X_to_int_or(src, fld_bgn, fld_end, -1); + if (Bry_.Eq(fld_key, Fld_cl_from)) cur_id = Bry_.Xto_int_or(src, fld_bgn, fld_end, -1); else if (Bry_.Eq(fld_key, Fld_cl_to)) cur_ctg = Bry_.Mid(src, fld_bgn, fld_end); else if (Bry_.Eq(fld_key, Fld_cl_collation)) cur_collation_is_uca = Bry_.HasAtBgn(src, Collation_uca, fld_bgn, fld_end); else if (Bry_.Eq(fld_key, Fld_cl_timestamp)) { diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java index e70002d05..d45213770 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java @@ -26,11 +26,11 @@ public class Xob_categorylinks_sql_make implements Io_make_cmd { name_id_rdr = New_registry_rdr(wiki, usr_dlg); cur_cat_file_max = wiki.App().Setup_mgr().Dump_mgr().Db_categorylinks_max(); - db_mgr.Delete_by_tid(Xodb_file.Tid_category); + db_mgr.Delete_by_tid(Xodb_file_tid_.Tid_category); Xodb_fsys_mgr fsys_mgr = db_mgr.Fsys_mgr(); - Xodb_file category_file = fsys_mgr.Get_tid_root(Xodb_file.Tid_core); + Xodb_file category_file = fsys_mgr.Get_tid_root(Xodb_file_tid_.Tid_core); if (cur_cat_file_max > 0) { - category_file = fsys_mgr.Make(Xodb_file.Tid_category); + category_file = fsys_mgr.Make(Xodb_file_tid_.Tid_category); fsys_mgr.Init_by_tid_category(category_file); } @@ -70,7 +70,7 @@ public class Xob_categorylinks_sql_make implements Io_make_cmd { db_mgr.Category_version_update(false); cat_provider.Txn_mgr().Txn_end_all(); ctg_stmt.Rls(); - fsys_mgr.Index_create(usr_dlg, Byte_.Ary(Xodb_file.Tid_core, Xodb_file.Tid_category), Xodb_file.Indexes_categorylinks_from, Xodb_file.Indexes_categorylinks_main); + fsys_mgr.Index_create(usr_dlg, Byte_.Ary(Xodb_file_tid_.Tid_core, Xodb_file_tid_.Tid_category), Index_categorylinks_from, Index_categorylinks_main); name_id_rdr.Rls(); if (String_.Eq(sql_parser.Src_fil().NameAndExt(), Xob_ctg_v1_sql_make.Url_sql)) // delete temp xowa_categorylinks.sql file created by cat_v1 Io_mgr._.DeleteFil(sql_parser.Src_fil()); @@ -79,7 +79,7 @@ public class Xob_categorylinks_sql_make implements Io_make_cmd { if (cur_cat_ttl != Bry_.Empty && cur_cat_id != -1) db_mgr.Tbl_category().Insert(ctg_stmt, cur_cat_id, cur_cat_counts[Xoa_ctg_mgr.Tid_page], cur_cat_counts[Xoa_ctg_mgr.Tid_subc], cur_cat_counts[Xoa_ctg_mgr.Tid_file], Xoa_ctg_mgr.Hidden_n, cur_cat_file_idx); if (new_ctg_ttl == Ttl_last) return Cur_cat_id_null; // last ttl; called by this.End(); exit early else will fail in Cur_cat_id_find() - if (cur_cat_file_max > 0 && cur_cat_file_size > cur_cat_file_max) {File_close(); File_open(db_mgr.Fsys_mgr().Make(Xodb_file.Tid_category));} + if (cur_cat_file_max > 0 && cur_cat_file_size > cur_cat_file_max) {File_close(); File_open(db_mgr.Fsys_mgr().Make(Xodb_file_tid_.Tid_category));} cur_cat_id = Cur_cat_id_find(new_ctg_ttl); for (int i = 0; i < Xoa_ctg_mgr.Tid__max; i++) cur_cat_counts[i] = 0; @@ -130,6 +130,10 @@ public class Xob_categorylinks_sql_make implements Io_make_cmd { return new Io_line_rdr(usr_dlg, urls).Key_gen_(Io_line_rdr_key_gen_.first_pipe); } Io_line_rdr name_id_rdr; private static final byte[] Ttl_last = null, Ttl_first = Bry_.Empty; + private static final Db_idx_itm + Index_categorylinks_main = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS categorylinks__cl_main ON categorylinks (cl_to_id, cl_type_id, cl_sortkey, cl_from);") + , Index_categorylinks_from = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS categorylinks__cl_from ON categorylinks (cl_from);") + ; } /* NOTE_1: categorylinks row size: 34 + 20 + 12 + (ctg_sortkey.length * 2) diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java index 44c605b2b..3f96618cb 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java @@ -115,8 +115,8 @@ class Db_tst_qry { for (int i = 0; i < len; i++) { Db_tst_val expd_val = expd_vals[i]; String expd_key = expd_val.Key(); - String expd_str = Object_.XtoStr_OrEmpty(expd_val.Val()); - String actl_str = Object_.XtoStr_OrEmpty(rdr.Read(expd_key)); + String expd_str = Object_.Xto_str_strict_or_empty(expd_val.Val()); + String actl_str = Object_.Xto_str_strict_or_empty(rdr.Read(expd_key)); boolean eq = String_.Eq(expd_str, actl_str); // NOTE: always compare strings, not objs; problems with comparing byte to int bfr.Add_str_pad_space_end(expd_key, pad_max); bfr.Add_str_pad_space_bgn(expd_str, pad_max); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_base.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_base.java index 401dea28d..521f9390e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_base.java @@ -29,7 +29,7 @@ public abstract class Xoctg_hiddencat_parser_base extends Xob_sql_dump_base impl } public void Exec(byte[] src, byte[] fld_key, int fld_idx, int fld_bgn, int fld_end, Bry_bfr file_bfr, Sql_file_parser_data data) { switch (fld_idx) { - case Fld_id: cur_id = Bry_.X_to_int_or(src, fld_bgn, fld_end, -1); break; + case Fld_id: cur_id = Bry_.Xto_int_or(src, fld_bgn, fld_end, -1); break; case Fld_key: cur_is_hiddencat = Bry_.Eq(Key_hiddencat, src, fld_bgn, fld_end); break; case Fld_val: if (!cur_is_hiddencat) {data.Cancel_row_y_(); return;} diff --git a/400_xowa/src/gplx/xowa/bldrs/langs/Xob_lang_json_parser.java b/400_xowa/src/gplx/xowa/bldrs/langs/Xob_lang_json_parser.java new file mode 100644 index 000000000..65194491e --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/langs/Xob_lang_json_parser.java @@ -0,0 +1,52 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.bldrs.langs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +import gplx.json.*; import gplx.gfs.*; +public class Xob_lang_json_parser { + private Json_parser json_parser = new Json_parser(); + private Gfs_bldr gfs_bldr = new Gfs_bldr(); + private Xol_csv_parser csv_parser = Xol_csv_parser._; + public Xob_lang_json_parser() {} + public byte[] Parse(byte[] raw) { + Json_doc jdoc = json_parser.Parse(raw); + Json_itm_nde jnde = jdoc.Root(); + gfs_bldr.Add_proc_init_many("this", "messages", "load_text").Add_paren_bgn().Add_nl(); + gfs_bldr.Add_quote_xtn_bgn(); + int subs_len = jnde.Subs_len(); + Bry_bfr bfr = gfs_bldr.Bfr(); + for (int i = 0; i < subs_len; ++i) + Parse_sub(bfr, raw, jnde.Subs_get_at(i)); + gfs_bldr.Add_quote_xtn_end().Add_paren_end().Add_term_nl(); + return gfs_bldr.Xto_bry(); + } + private void Parse_sub(Bry_bfr bfr, byte[] raw, Json_itm itm) { + switch (itm.Tid()) { + case Json_itm_.Tid_kv: + Json_itm_kv kv = (Json_itm_kv)itm; + if (kv.Key().Data_eq(Name_metadata)) return; // ignore @metadata node + byte[] key_bry = kv.Key().Data_bry(); + byte[] val_bry = kv.Val().Data_bry(); + csv_parser.Save(bfr, key_bry); // key + bfr.Add_byte_pipe(); // | + csv_parser.Save(bfr, val_bry); // val + bfr.Add_byte_nl(); // \n + break; + } + } + private static final byte[] Name_metadata = Bry_.new_ascii_("@metadata"); +} diff --git a/400_xowa/src/gplx/xowa/bldrs/langs/Xob_lang_json_parser_tst.java b/400_xowa/src/gplx/xowa/bldrs/langs/Xob_lang_json_parser_tst.java new file mode 100644 index 000000000..e68d26d7c --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/langs/Xob_lang_json_parser_tst.java @@ -0,0 +1,50 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.bldrs.langs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +import org.junit.*; +import gplx.intl.*; +public class Xob_lang_json_parser_tst { + @Before public void init() {fxt.Clear();} private Xob_lang_json_parser_fxt fxt = new Xob_lang_json_parser_fxt(); + @Test public void Core_keywords() { + fxt.Test_parse(String_.Concat_lines_nl_skip_last + ( "{" + , " \"@metadata\": {" + , " \"authors\": []" + , " }," + , "\"key_1\": \"val_1\"," + , "\"key_2\": \"val_2\"," + , "}" + ), String_.Concat_lines_nl_skip_last + ( "this.messages.load_text(" + , "<:['" + , "key_1|val_1" + , "key_2|val_2" + , "']:>" + , ");" + )); + } +} +class Xob_lang_json_parser_fxt { + private Xob_lang_json_parser parser = new Xob_lang_json_parser(); + public void Clear() { + } + public void Test_parse(String raw, String expd) { + byte[] actl = parser.Parse(Bry_.new_utf8_(raw)); + Tfds.Eq_str_lines(expd, String_.new_utf8_(actl)); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/langs/Xobc_utl_make_lang_kwds.java b/400_xowa/src/gplx/xowa/bldrs/langs/Xobc_utl_make_lang_kwds.java index 29c3558aa..429eecbf5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/langs/Xobc_utl_make_lang_kwds.java +++ b/400_xowa/src/gplx/xowa/bldrs/langs/Xobc_utl_make_lang_kwds.java @@ -57,7 +57,7 @@ public class Xobc_utl_make_lang_kwds implements GfoInvkAble, Xol_lang_transform tmp.Clear(); if (kwd_grp == null) { kwd_grp = lang.Kwd_mgr().Get_or_new(kwd_id); - kwd_grp.Srl_load(false, Bry_.Ary_empty); // ASSUME: kwd explicitly added, but does not exist in language; default to !case_match + kwd_grp.Srl_load(Bool_.N, Bry_.Ary_empty); // ASSUME: kwd explicitly added, but does not exist in language; default to !case_match } for (Xol_kwd_itm itm : kwd_grp.Itms()) diff --git a/400_xowa/src/gplx/xowa/bldrs/langs/Xol_mw_lang_parser.java b/400_xowa/src/gplx/xowa/bldrs/langs/Xol_mw_lang_parser.java index b81241ba0..b691dbbb9 100644 --- a/400_xowa/src/gplx/xowa/bldrs/langs/Xol_mw_lang_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/langs/Xol_mw_lang_parser.java @@ -43,7 +43,7 @@ public class Xol_mw_lang_parser { if (lang.Fallback_bry() != null) // NOTE: fallback will often be null; EX: en bldr.Add_proc_cont_one(Xol_lang.Invk_fallback_load).Add_parens_str(lang.Fallback_bry()).Add_nl(); if (!lang.Dir_ltr()) // NOTE: only save dir_ltr if false; EX: en - bldr.Add_proc_cont_one(Xol_lang.Invk_dir_rtl_).Add_parens_str(Yn.X_to_str(!lang.Dir_ltr())).Add_nl(); + bldr.Add_proc_cont_one(Xol_lang.Invk_dir_rtl_).Add_parens_str(Yn.Xto_str(!lang.Dir_ltr())).Add_nl(); Xol_lang_srl.Save_ns_grps(bldr, lang.Ns_names(), Xol_lang.Invk_ns_names); Xol_lang_srl.Save_ns_grps(bldr, lang.Ns_aliases(), Xol_lang.Invk_ns_aliases); Xol_lang_srl.Save_specials(bldr, lang.Specials_mgr()); diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java index d797eb5d8..2fc2d39b7 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java @@ -41,7 +41,7 @@ class Xob_dump_src_ttl implements Xob_parse_all_db { if (len == 1) return new Xodb_file[] {file_ary[0]}; // single file: return core; note that there are no Tid = Text for (int i = 0; i < len; i++) { Xodb_file file = file_ary[i]; - if (file.Tid() == Xodb_file.Tid_text) + if (file.Tid() == Xodb_file_tid_.Tid_text) text_files_list.Add(file); } return (Xodb_file[])text_files_list.XtoAryAndClear(Xodb_file.class); @@ -54,7 +54,7 @@ class Xob_dump_src_id { public Xob_dump_src_id Init(Xow_wiki wiki, byte redirect, int size_max) { this.db_mgr = wiki.Db_mgr_as_sql(); this.redirect = redirect; this.size_max = size_max; - page_db_url = db_mgr.Fsys_mgr().Get_tid_root(Xodb_file.Tid_core).Url().Raw(); + page_db_url = db_mgr.Fsys_mgr().Get_tid_root(Xodb_file_tid_.Tid_core).Url().Raw(); return this; } public void Get_pages(ListAdp list, int text_db_idx, int cur_ns, int prv_id) { diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java index 8ced383c3..a42419107 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java +++ b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java @@ -27,12 +27,12 @@ public class Xob_text_db_prep extends Xob_itm_basic_base implements Xob_cmd { } public void Cmd_run() { Xodb_fsys_mgr db_fsys_mgr = wiki.Db_mgr_as_sql().Fsys_mgr(); - String page_db_url = db_fsys_mgr.Get_tid_root(Xodb_file.Tid_core).Url().Raw(); + String page_db_url = db_fsys_mgr.Get_tid_root(Xodb_file_tid_.Tid_core).Url().Raw(); db_files = db_fsys_mgr.Ary(); int len = db_files.length; for (int i = 0; i < len; i++) { Xodb_file db_file = db_files[i]; - if (db_file.Tid() == Xodb_file.Tid_text) + if (db_file.Tid() == Xodb_file_tid_.Tid_text) Prep_db(page_db_url, db_file); } } @@ -40,7 +40,7 @@ public class Xob_text_db_prep extends Xob_itm_basic_base implements Xob_cmd { int len = db_files.length; for (int i = 0; i < len; i++) { Xodb_file db_file = db_files[i]; - if (db_file.Tid() == Xodb_file.Tid_text) + if (db_file.Tid() == Xodb_file_tid_.Tid_text) db_file.Rls(); } db_files = null; diff --git a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java index fbe8b73a7..58fb32702 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java @@ -71,13 +71,13 @@ class Xoi_wiki_props_fxt { public void Test_parse(String xml, Xoi_wiki_props_wiki expd) { Xoi_wiki_props_wiki actl = new Xoi_wiki_props_wiki(); api.Parse(actl, xml); - Tfds.Eq_str_lines(X_to_str(expd), X_to_str(actl)); + Tfds.Eq_str_lines(Xto_str(expd), Xto_str(actl)); } public void Test_build(Xoi_wiki_props_wiki wiki, String expd) { api.Build_cfg(bfr, wiki); Tfds.Eq_str_lines(expd, bfr.XtoStrAndClear()); } - private String X_to_str(Xoi_wiki_props_wiki v) { + private String Xto_str(Xoi_wiki_props_wiki v) { int len = v.Alias_ary().length; bfr.Add_str("aliases").Add_byte_nl(); for (int i = 0; i < len; i++) { diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java b/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java index d1fa45141..174919b38 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java @@ -50,10 +50,10 @@ public class Xob_wiki_image_sql extends Xob_itm_dump_base implements Xob_cmd, Gf public void Exec(byte[] src, byte[] fld_key, int fld_idx, int fld_bgn, int fld_end, Bry_bfr file_bfr, Sql_file_parser_data data) { switch (fld_idx) { case Fld_img_name: cur_ttl = Bry_.Mid(src, fld_bgn, fld_end); break; - case Fld_img_size: cur_size = Bry_.X_to_int_or(src, fld_bgn, fld_end, -1); break; - case Fld_img_width: cur_width = Bry_.X_to_int_or(src, fld_bgn, fld_end, -1); break; - case Fld_img_height: cur_height = Bry_.X_to_int_or(src, fld_bgn, fld_end, -1); break; - case Fld_img_bits: cur_bits = Bry_.X_to_int_or(src, fld_bgn, fld_end, -1); break; + case Fld_img_size: cur_size = Bry_.Xto_int_or(src, fld_bgn, fld_end, -1); break; + case Fld_img_width: cur_width = Bry_.Xto_int_or(src, fld_bgn, fld_end, -1); break; + case Fld_img_height: cur_height = Bry_.Xto_int_or(src, fld_bgn, fld_end, -1); break; + case Fld_img_bits: cur_bits = Bry_.Xto_int_or(src, fld_bgn, fld_end, -1); break; case Fld_img_media_type: cur_media_type = Bry_.Mid(src, fld_bgn, fld_end); break; case Fld_img_minor_mime: cur_minor_mime = Bry_.Mid(src, fld_bgn, fld_end); cur_ext_id = Calc_ext_id(show_issues ? app.Usr_dlg() : Gfo_usr_dlg_.Null, cur_ttl, cur_media_type, cur_minor_mime, cur_width, cur_height); diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_wiki_redirect_cmd.java b/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_wiki_redirect_cmd.java index 927752ee1..4caeafc1a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_wiki_redirect_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_wiki_redirect_cmd.java @@ -33,7 +33,7 @@ public class Xob_wiki_redirect_cmd extends Xob_dump_mgr_base { this.db_mgr = wiki.Db_mgr_as_sql(); Xoa_app app = bldr.App(); redirect_mgr = wiki.Redirect_mgr(); - encoder = app.Url_converter_url_ttl(); + encoder = app.Encoder_mgr().Url_ttl(); // app.Usr_dlg().Prog_none("", "", "dropping index: page__title"); // db_mgr.Fsys_mgr().Core_provider().Exec_sql("DROP INDEX IF EXISTS page__title"); // Sqlite_engine_.Idx_create(app.Usr_dlg(), db_mgr.Fsys_mgr().Core_provider(), "page", Idx_page_title); @@ -57,7 +57,7 @@ public class Xob_wiki_redirect_cmd extends Xob_dump_mgr_base { @Override public void Exec_end_hook() { provider.Txn_mgr().Txn_end_all(); tbl_redirect.Create_indexes(usr_dlg, provider); - tbl_redirect.Update_redirects(provider, db_mgr.Fsys_mgr().Get_url(Xodb_file.Tid_core), 4); + tbl_redirect.Update_redirects(provider, db_mgr.Fsys_mgr().Get_url(Xodb_file_tid_.Tid_core), 4); } // private static final Db_idx_itm Idx_page_title = Db_idx_itm.sql_("CREATE UNIQUE INDEX IF NOT EXISTS page__title ON page (page_namespace, page_title, page_id, page_len, page_is_redirect, page_file_idx);"); // PERF:page_id for general queries; PERF: page_len for search_suggest } diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java index f794157e6..c2a50b84e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java @@ -59,7 +59,7 @@ public class Xob_xml_parser { case Xob_xml_parser_.Id_id_bgn: if (page_id_needed) data_bgn = pos; break; // only flag if first ; note that 1st always belongs to ; case Xob_xml_parser_.Id_id_end: if (page_id_needed) { - int page_id = Bry_.X_to_int_or(src, data_bgn, hook_bgn, -1); if (page_id == -1) usr_dlg.Warn_many(GRP_KEY, "page_id_invalid", "page_id_is_invalid: ~{0}", String_.new_utf8_(src, data_bgn, hook_bgn)); + int page_id = Bry_.Xto_int_or(src, data_bgn, hook_bgn, -1); if (page_id == -1) usr_dlg.Warn_many(GRP_KEY, "page_id_invalid", "page_id_is_invalid: ~{0}", String_.new_utf8_(src, data_bgn, hook_bgn)); rv.Id_(page_id); page_id_needed = false; // turn off for other tags (; ) } diff --git a/400_xowa/src/gplx/xowa/cfgs/Xoa_cfg_mgr_tst.java b/400_xowa/src/gplx/xowa/cfgs/Xoa_cfg_mgr_tst.java index f437ce6ce..3a227759d 100644 --- a/400_xowa/src/gplx/xowa/cfgs/Xoa_cfg_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/cfgs/Xoa_cfg_mgr_tst.java @@ -69,7 +69,7 @@ class Xoa_cfg_mgr_fxt { Test_cfg_get(wiki, prop_key, expd_val); } private void Test_cfg_get(GfoInvkAble invk, String prop, String expd) { - Tfds.Eq(expd, Object_.XtoStr_OrNullStr(app.Cfg_mgr().Eval_get(invk, prop))); + Tfds.Eq(expd, Object_.Xto_str_strict_or_null_mark(app.Cfg_mgr().Eval_get(invk, prop))); } public void Test_cfg_itm(String wiki, String prop, boolean expd_customized, boolean expd_dirty) { Test_cfg_itm(Bry_.new_ascii_(wiki), Bry_.new_ascii_(prop), expd_customized, expd_dirty); diff --git a/400_xowa/src/gplx/xowa/cfgs/gui/Xocfg_html.java b/400_xowa/src/gplx/xowa/cfgs/gui/Xocfg_html.java index eb4e6a046..0d98ea99c 100644 --- a/400_xowa/src/gplx/xowa/cfgs/gui/Xocfg_html.java +++ b/400_xowa/src/gplx/xowa/cfgs/gui/Xocfg_html.java @@ -24,7 +24,7 @@ public class Xocfg_html implements GfoInvkAble { public boolean Link_hover_full() {return link_hover_full;} public Xocfg_html Link_hover_full_(boolean v) {link_hover_full = v; return this;} private boolean link_hover_full; public boolean Content_editable() {return content_editable;} public Xocfg_html Content_editable_(boolean v) {content_editable = v; return this;} private boolean content_editable; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_content_editable)) return Yn.X_to_str(content_editable); + if (ctx.Match(k, Invk_content_editable)) return Yn.Xto_str(content_editable); else if (ctx.Match(k, Invk_content_editable_)) content_editable = m.ReadYn_toggle("v", content_editable); else if (ctx.Match(k, Invk_link_hover_full_)) link_hover_full = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; diff --git a/400_xowa/src/gplx/xowa/cfgs/gui/Xocfg_win.java b/400_xowa/src/gplx/xowa/cfgs/gui/Xocfg_win.java index 50164079f..84ee0c337 100644 --- a/400_xowa/src/gplx/xowa/cfgs/gui/Xocfg_win.java +++ b/400_xowa/src/gplx/xowa/cfgs/gui/Xocfg_win.java @@ -16,20 +16,16 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.cfgs.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.cfgs.*; -public class Xocfg_win implements Gfo_usr_dlg_ui_opt, GfoInvkAble { +public class Xocfg_win implements GfoInvkAble { public Xocfg_win(Xoa_app app) {} - public boolean Warn_enabled() {return warn_enabled;} private boolean warn_enabled = true; - public boolean Note_enabled() {return note_enabled;} private boolean note_enabled = true; public Xol_font_info Font() {return font;} private Xol_font_info font = new Xol_font_info("Arial", 8, gplx.gfui.FontStyleAdp_.Plain); public Bry_fmtr Search_box_fmtr() {return search_box_fmtr;} private Bry_fmtr search_box_fmtr = Bry_fmtr.new_("Special:Allpages?from=", "search"); public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_warn_enabled_)) warn_enabled = m.ReadYn("v"); - else if (ctx.Match(k, Invk_note_enabled_)) note_enabled = m.ReadYn("v"); - else if (ctx.Match(k, Invk_font)) return font; + if (ctx.Match(k, Invk_font)) return font; else if (ctx.Match(k, Invk_search_box_fmt_)) search_box_fmtr.Fmt_(m.ReadBry("v")); else return GfoInvkAble_.Rv_unhandled; return this; } - private static final String Invk_warn_enabled_ = "warn_enabled_", Invk_note_enabled_ = "note_enabled_", Invk_search_box_fmt_ = "search_box_fmt_", Invk_font = "font"; + private static final String Invk_search_box_fmt_ = "search_box_fmt_", Invk_font = "font"; public static final float Font_size_default = 8; } diff --git a/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_itm.java b/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_itm.java index f14e028e3..b70373549 100644 --- a/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_itm.java +++ b/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_itm.java @@ -33,12 +33,12 @@ public class Xocfg_bnd_itm implements GfoInvkAble { else if (ctx.Match(k, Invk_cmd_ctg_sort)) return cmd.Ctg().Tid(); else if (ctx.Match(k, Invk_bnd_key)) return bnd.Key(); else if (ctx.Match(k, Invk_bnd_uid)) return bnd.Uid(); - else if (ctx.Match(k, Invk_bnd_sys)) return Yn.X_to_str(bnd.Sys()); + else if (ctx.Match(k, Invk_bnd_sys)) return Yn.Xto_str(bnd.Sys()); else if (ctx.Match(k, Invk_bnd_cmd)) return bnd.Cmd(); else if (ctx.Match(k, Invk_bnd_cmd_)) bnd.Cmd_(m.ReadStr("v")); - else if (ctx.Match(k, Invk_bnd_box)) return Xog_bnd_box_.X_to_gui_str(bnd.Box()); + else if (ctx.Match(k, Invk_bnd_box)) return Xog_bnd_box_.Xto_gui_str(bnd.Box()); else if (ctx.Match(k, Invk_bnd_box_idx)) return bnd.Box(); - else if (ctx.Match(k, Invk_bnd_ipt)) return mgr.Bnd_mgr().Bnd_parser().X_to_norm(bnd.Ipt().Key()); + else if (ctx.Match(k, Invk_bnd_ipt)) return mgr.Bnd_mgr().Bnd_parser().Xto_norm(bnd.Ipt().Key()); else return GfoInvkAble_.Rv_unhandled; return this; } diff --git a/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_itm_srl.java b/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_itm_srl.java index 078796f59..75b567d68 100644 --- a/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_itm_srl.java +++ b/400_xowa/src/gplx/xowa/cfgs2/Xocfg_bnd_itm_srl.java @@ -29,7 +29,7 @@ public class Xocfg_bnd_itm_srl implements GfoInvkAble { public IptArg Ipt() {return ipt;} private IptArg ipt; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_src_)) Src_(app, this, m.ReadStr("v")); - else if (ctx.Match(k, Invk_box_)) box = Xog_bnd_box_.X_to_sys_int(m.ReadStr("v")); + else if (ctx.Match(k, Invk_box_)) box = Xog_bnd_box_.Xto_sys_int(m.ReadStr("v")); else if (ctx.Match(k, Invk_ipt_)) ipt = IptArg_.parse_(m.ReadStr("v")); else return GfoInvkAble_.Rv_unhandled; return this; @@ -37,7 +37,7 @@ public class Xocfg_bnd_itm_srl implements GfoInvkAble { private static final String Invk_src_ = "src_", Invk_box_ = "box_", Invk_ipt_ = "ipt_"; public static String Src(Xoa_app app, int box, IptArg ipt) { // box_('browser').ipt_('mod.c+key.q'); Gfs_wtr wtr = app.Gfs_mgr().Wtr(); - wtr.Add_set_eq(Key_box, Bry_.new_ascii_(Xog_bnd_box_.X_to_sys_str(box))); + wtr.Add_set_eq(Key_box, Bry_.new_ascii_(Xog_bnd_box_.Xto_sys_str(box))); wtr.Add_set_eq(Key_ipt, Bry_.new_ascii_(ipt.Key())); return wtr.Bfr().XtoStrAndClear(); } private static final byte[] Key_box = Bry_.new_ascii_("box"), Key_ipt = Bry_.new_ascii_("ipt"); diff --git a/400_xowa/src/gplx/xowa/cfgs2/Xocfg_tab_btn_mgr.java b/400_xowa/src/gplx/xowa/cfgs2/Xocfg_tab_btn_mgr.java index d796732be..1d24fea4a 100644 --- a/400_xowa/src/gplx/xowa/cfgs2/Xocfg_tab_btn_mgr.java +++ b/400_xowa/src/gplx/xowa/cfgs2/Xocfg_tab_btn_mgr.java @@ -31,21 +31,21 @@ public class Xocfg_tab_btn_mgr implements GfoInvkAble, GfoEvMgrOwner { public int Text_max_chars() {return text_max_chars;} public Xocfg_tab_btn_mgr Text_max_chars_(int v) {text_max_chars = v; return this;} private int text_max_chars = 40; public boolean Hide_if_one() {return hide_if_one;} public Xocfg_tab_btn_mgr Hide_if_one_(boolean v) {hide_if_one = v; return this;} private boolean hide_if_one; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_place_on_top)) return Yn.X_to_str(place_on_top); + if (ctx.Match(k, Invk_place_on_top)) return Yn.Xto_str(place_on_top); else if (ctx.Match(k, Invk_place_on_top_)) {place_on_top = m.ReadYn("v"); GfoEvMgr_.PubVal(this, Evt_place_on_top_changed, place_on_top);} - else if (ctx.Match(k, Invk_curved)) return Yn.X_to_str(curved); + else if (ctx.Match(k, Invk_curved)) return Yn.Xto_str(curved); else if (ctx.Match(k, Invk_curved_)) {curved = m.ReadYn("v"); GfoEvMgr_.PubVal(this, Evt_curved_changed, curved);} else if (ctx.Match(k, Invk_height)) return height; else if (ctx.Match(k, Invk_height_)) {height = m.ReadInt("v"); GfoEvMgr_.PubVal(this, Evt_height_changed, height);} - else if (ctx.Match(k, Invk_close_visible)) return Yn.X_to_str(close_visible); + else if (ctx.Match(k, Invk_close_visible)) return Yn.Xto_str(close_visible); else if (ctx.Match(k, Invk_close_visible_)) {close_visible = m.ReadYn("v"); GfoEvMgr_.PubVal(this, Evt_close_visible_changed, close_visible);} - else if (ctx.Match(k, Invk_unselected_close_visible)) return Yn.X_to_str(unselected_close_visible); + else if (ctx.Match(k, Invk_unselected_close_visible)) return Yn.Xto_str(unselected_close_visible); else if (ctx.Match(k, Invk_unselected_close_visible_)) {unselected_close_visible = m.ReadYn("v"); GfoEvMgr_.PubVal(this, Evt_unselected_close_visible_changed, unselected_close_visible);} else if (ctx.Match(k, Invk_text_min_chars)) return text_min_chars; else if (ctx.Match(k, Invk_text_min_chars_)) {text_min_chars = m.ReadInt("v"); GfoEvMgr_.PubVal(this, Evt_text_min_chars_changed, text_min_chars);} else if (ctx.Match(k, Invk_text_max_chars)) return text_max_chars; else if (ctx.Match(k, Invk_text_max_chars_)) {text_max_chars = m.ReadInt("v"); GfoEvMgr_.PubVal(this, Evt_text_max_chars_changed, text_max_chars);} - else if (ctx.Match(k, Invk_hide_if_one)) return Yn.X_to_str(hide_if_one); + else if (ctx.Match(k, Invk_hide_if_one)) return Yn.Xto_str(hide_if_one); else if (ctx.Match(k, Invk_hide_if_one_)) {hide_if_one = m.ReadYn("v"); GfoEvMgr_.PubVal(this, Evt_hide_if_one_changed, hide_if_one);} else return GfoInvkAble_.Rv_unhandled; return this; diff --git a/400_xowa/src/gplx/xowa/cfgs2/Xocfg_tab_new_mgr.java b/400_xowa/src/gplx/xowa/cfgs2/Xocfg_tab_new_mgr.java index 96895b6f5..5c581fb56 100644 --- a/400_xowa/src/gplx/xowa/cfgs2/Xocfg_tab_new_mgr.java +++ b/400_xowa/src/gplx/xowa/cfgs2/Xocfg_tab_new_mgr.java @@ -19,8 +19,8 @@ package gplx.xowa.cfgs2; import gplx.*; import gplx.xowa.*; public class Xocfg_tab_new_mgr implements GfoInvkAble { public byte Insert_pos() {return insert_pos;} private byte insert_pos = Xocfg_new_tab_pos.Tid_cur_nxt; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_insert_pos)) return Xocfg_new_tab_pos.X_to_str(insert_pos); - else if (ctx.Match(k, Invk_insert_pos_)) insert_pos = Xocfg_new_tab_pos.X_to_tid(m.ReadStr("v")); + if (ctx.Match(k, Invk_insert_pos)) return Xocfg_new_tab_pos.Xto_str(insert_pos); + else if (ctx.Match(k, Invk_insert_pos_)) insert_pos = Xocfg_new_tab_pos.Xto_tid(m.ReadStr("v")); else if (ctx.Match(k, Invk_insert_pos_list)) return Xocfg_new_tab_pos.Options__all; else return GfoInvkAble_.Rv_unhandled; return this; @@ -30,14 +30,14 @@ public class Xocfg_tab_new_mgr implements GfoInvkAble { class Xocfg_new_tab_pos { public static final byte Tid_all_bgn = 0, Tid_all_end = 1, Tid_cur_prv = 2, Tid_cur_nxt = 3; public static final String Key_all_bgn = "first", Key_all_end = "last", Key_cur_prv = "before", Key_cur_nxt = "after"; - public static byte X_to_tid(String v) { + public static byte Xto_tid(String v) { if (String_.Eq(v, Key_all_bgn)) return Tid_all_bgn; else if (String_.Eq(v, Key_all_end)) return Tid_all_end; else if (String_.Eq(v, Key_cur_prv)) return Tid_all_end; else if (String_.Eq(v, Key_cur_nxt)) return Tid_all_end; else throw Err_.unhandled(v); } - public static String X_to_str(byte v) { + public static String Xto_str(byte v) { switch (v) { case Tid_all_bgn: return Key_all_bgn; case Tid_all_end: return Key_all_end; diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoa_ctg_mgr.java b/400_xowa/src/gplx/xowa/ctgs/Xoa_ctg_mgr.java index 18ab225f1..b14bfa620 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoa_ctg_mgr.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoa_ctg_mgr.java @@ -35,7 +35,7 @@ public class Xoa_ctg_mgr implements GfoInvkAble { if (ctx.Match(k, Invk_missing_ctg_cls)) return Missing_ctg_cls_tid_print(missing_ctg_cls_tid); else if (ctx.Match(k, Invk_missing_ctg_cls_)) missing_ctg_cls_tid = Missing_ctg_cls_tid_parse(m.ReadStr("v")); else if (ctx.Match(k, Invk_missing_ctg_cls_list)) return Options_missing_ctg_cls_list; - else if (ctx.Match(k, Invk_pagecats_grouping_enabled)) return Yn.X_to_str(pagecats_grouping_enabled); + else if (ctx.Match(k, Invk_pagecats_grouping_enabled)) return Yn.Xto_str(pagecats_grouping_enabled); else if (ctx.Match(k, Invk_pagecats_grouping_enabled_)) pagecats_grouping_enabled = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; return this; diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_grp.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_grp.java index 6ac0fe644..f0e7f36ac 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_grp.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_grp.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.ctgs; import gplx.*; import gplx.xowa.*; +import gplx.xowa.langs.msgs.*; public class Xoctg_pagelist_grp implements Bry_fmtr_arg { public void Init_app(Xoa_app app, boolean type_is_normal, Bry_fmtr fmtr_grp, Bry_fmtr fmtr_itm) { this.type_is_normal = type_is_normal; @@ -24,7 +25,7 @@ public class Xoctg_pagelist_grp implements Bry_fmtr_arg { } private Bry_fmtr fmtr_grp; public void Init_by_wiki(Xow_wiki wiki) { lbl_ctg_text = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_ctg_tbl_hdr); - lbl_ctg_help = Pf_msg_mgr.Get_msg_val(wiki, wiki.Lang(), Key_pagecategorieslink, Bry_.Ary_empty); + lbl_ctg_help = Xol_msg_mgr_.Get_msg_val(wiki, wiki.Lang(), Key_pagecategorieslink, Bry_.Ary_empty); lbl_hidden = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_ctg_tbl_hidden); itms.Init_wiki(wiki); } private byte[] lbl_ctg_help, lbl_ctg_text, lbl_hidden; private static final byte[] Key_pagecategorieslink = Bry_.new_ascii_("pagecategorieslink"); diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_file.java b/400_xowa/src/gplx/xowa/dbs/Xodb_file.java index 1310a746c..0a3b44ec6 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_file.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_file.java @@ -19,18 +19,18 @@ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; import gplx.dbs.*; public class Xodb_file { public Xodb_file(int id, byte tid) {this.id = id; this.tid = tid;} - public byte Cmd_mode() {return cmd_mode;} public Xodb_file Cmd_mode_(byte v) {cmd_mode = v; return this;} private byte cmd_mode; - public int Id() {return id;} private int id; - public byte Tid() {return tid;} private byte tid; - public Io_url Url() {return url;} public Xodb_file Url_(Io_url v) {url = v; return this;} private Io_url url; - public String Url_rel() {return url_rel;} public Xodb_file Url_rel_(String v) {this.url_rel = v; return this;} private String url_rel; - public Db_connect Connect() {return connect;} public Xodb_file Connect_(Db_connect v) {connect = v; return this;} Db_connect connect; - public long File_len() {return file_len;} public void File_len_add(int v) {file_len += v;} long file_len; - public long File_max() {return file_max;} public Xodb_file File_max_(long v) {file_max = v; return this;} long file_max; + public int Id() {return id;} private int id; + public byte Tid() {return tid;} private byte tid; + public Io_url Url() {return url;} public Xodb_file Url_(Io_url v) {url = v; return this;} private Io_url url; + public String Url_rel() {return url_rel;} public Xodb_file Url_rel_(String v) {url_rel = v; return this;} private String url_rel; + public long File_len() {return file_len;} public Xodb_file File_len_add(int v) {file_len += v; return this;} private long file_len; + public long File_max() {return file_max;} public Xodb_file File_max_(long v) {file_max = v; return this;} private long file_max; + public byte Cmd_mode() {return cmd_mode;} public Xodb_file Cmd_mode_(byte v) {cmd_mode = v; return this;} private byte cmd_mode; + public Db_connect Connect() {return connect;} public Xodb_file Connect_(Db_connect v) {connect = v; return this;} private Db_connect connect; public Db_provider Provider() { if (provider == null) provider = Db_provider_pool._.FetchOrNew(connect); return provider; - } Db_provider provider; + } private Db_provider provider; public void Provider_(Db_provider p) {provider = p;} public void Rls() { if (provider == null) return; @@ -39,37 +39,7 @@ public class Xodb_file { provider.Rls(); } finally {provider = null;} } - public static final byte Tid_core = 1, Tid_text = 2, Tid_category = 3, Tid_search = 4, Tid_wikidata = 5, Tid_temp = 6; - public static String Tid_to_name(byte v) { - switch (v) { - case Tid_core: return "core"; - case Tid_text: return "text"; - case Tid_category: return "category"; - case Tid_wikidata: return "wikidata"; - case Tid_temp: return "temp"; - case Tid_search: return "search"; - default: throw Err_.unhandled(v); - } - } + public static Xodb_file load_(int id, byte tid, String url) {return new Xodb_file(id, tid).Url_rel_(url).Cmd_mode_(Db_cmd_mode.Ignore);} public static Xodb_file make_(int id, byte tid, String url) {return new Xodb_file(id, tid).Url_rel_(url).Cmd_mode_(Db_cmd_mode.Create);} - public void Index_create(Gfo_usr_dlg usr_dlg, Db_idx_itm[] idxs) { - int len = idxs.length; - provider.Txn_mgr().Txn_end_all(); // commit any pending transactions - for (int i = 0; i < len; i++) { - provider.Txn_mgr().Txn_bgn_if_none(); - String index = idxs[i].Xto_sql(); - usr_dlg.Prog_many("", "", "creating index: ~{0} ~{1}", id, index); - provider.Exec_sql(index); - provider.Txn_mgr().Txn_end_all(); - } - } - public static final Db_idx_itm - Indexes_page_title = Db_idx_itm.sql_("CREATE UNIQUE INDEX IF NOT EXISTS page__title ON page (page_namespace, page_title, page_id, page_len, page_is_redirect);") // PERF:page_id for general queries; PERF: page_len for search_suggest; PREF:page_is_redirect for oimg - , Indexes_page_random = Db_idx_itm.sql_("CREATE UNIQUE INDEX IF NOT EXISTS page__name_random ON page (page_namespace, page_random_int);") - , Indexes_categorylinks_main = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS categorylinks__cl_main ON categorylinks (cl_to_id, cl_type_id, cl_sortkey, cl_from);") - , Indexes_categorylinks_from = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS categorylinks__cl_from ON categorylinks (cl_from);") - , Indexes_wikidata_qids = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_qids__src ON wdata_qids (wq_src_wiki, wq_src_ns, wq_src_ttl);") - , Indexes_wikidata_pids = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_pids__src ON wdata_pids (wp_src_lang, wp_src_ttl);") - ; } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_file_tid_.java b/400_xowa/src/gplx/xowa/dbs/Xodb_file_tid_.java new file mode 100644 index 000000000..5262cbb2b --- /dev/null +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_file_tid_.java @@ -0,0 +1,33 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; +public class Xodb_file_tid_ { + public static final byte Tid_core = 1, Tid_text = 2, Tid_category = 3, Tid_search = 4, Tid_wikidata = 5, Tid_temp = 6; + public static final String Key_core = "core", Key_text = "text", Key_category = "category", Key_wikidata = "wikidata", Key_temp = "temp", Key_search = "search"; + public static String Xto_key(byte v) { + switch (v) { + case Tid_core: return Key_core; + case Tid_text: return Key_text; + case Tid_category: return Key_category; + case Tid_wikidata: return Key_wikidata; + case Tid_temp: return Key_temp; + case Tid_search: return Key_search; + default: throw Err_.unhandled(v); + } + } +} diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_fsys_mgr.java b/400_xowa/src/gplx/xowa/dbs/Xodb_fsys_mgr.java index 8de0af3b8..1890daecb 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_fsys_mgr.java @@ -24,10 +24,10 @@ public class Xodb_fsys_mgr { this.trg_name = trg_name; return this; } private Io_url src_dir; private String trg_name; - public Db_provider Core_provider() {return core_provider;} Db_provider core_provider; - public Db_provider Page_provider() {return page_provider;} Db_provider page_provider; - public Db_provider Category_provider() {return category_provider;} Db_provider category_provider; - public Db_provider Wdata_provider() {return wikidata_provider;} Db_provider wikidata_provider; + public Db_provider Core_provider() {return core_provider;} private Db_provider core_provider; + public Db_provider Page_provider() {return page_provider;} private Db_provider page_provider; + public Db_provider Category_provider() {return category_provider;} private Db_provider category_provider; + public Db_provider Wdata_provider() {return wikidata_provider;} private Db_provider wikidata_provider; public Io_url Trg_dir() {return trg_dir;} private Io_url trg_dir; public int Tid_text_idx() {return tid_text_idx;} public Xodb_fsys_mgr Tid_text_idx_(int v) {tid_text_idx = v; return this;} private int tid_text_idx = File_id_core; public long Tid_text_max() {return tid_text_max;} long tid_text_max = Heap_max_infinite; @@ -41,18 +41,18 @@ public class Xodb_fsys_mgr { Io_url url = trg_dir.GenSubFil(file.Url_rel()); // relative name only file.Connect_(Db_connect_.sqlite_(url)).Url_(url); switch (file.Tid()) { - case Xodb_file.Tid_core : file.Provider_(p); Init_by_tid_core(file); break; - case Xodb_file.Tid_category : if (category_provider_core_null) {Init_by_tid_category(file); category_provider_core_null = false;}break; - case Xodb_file.Tid_wikidata : Init_by_tid_wikidata(file); break; - case Xodb_file.Tid_text : Init_by_tid_text(file); break; + case Xodb_file_tid_.Tid_core : file.Provider_(p); Init_by_tid_core(file); break; + case Xodb_file_tid_.Tid_category : if (category_provider_core_null) {Init_by_tid_category(file); category_provider_core_null = false;}break; + case Xodb_file_tid_.Tid_wikidata : Init_by_tid_wikidata(file); break; + case Xodb_file_tid_.Tid_text : Init_by_tid_text(file); break; } } } public void Init_make(Xow_ns_mgr ns_mgr, String ns_map_str, long text_max) { - Init_by_tid_core(Make(Xodb_file.Tid_core)); + Init_by_tid_core(Make(Xodb_file_tid_.Tid_core)); Init_by_ns_map(ns_mgr, Xodb_ns_map_mgr.Parse(Bry_.new_ascii_(ns_map_str))); if (text_max > 0) - Init_by_tid_text(Init_make_file(Xodb_file.Tid_text, text_max)); + Init_by_tid_text(Init_make_file(Xodb_file_tid_.Tid_text, text_max)); } public Xodb_file Init_make_file(byte tid, long max) { if (max == Max_core_db) return files_ary[File_id_core]; @@ -68,7 +68,7 @@ public class Xodb_fsys_mgr { Xodb_ns_map_itm itm = ns_map_itms[i]; int[] ns_ids = itm.Ns_ids(); int ns_ids_len = ns_ids.length; - Xodb_file file = Make(Xodb_file.Tid_text); + Xodb_file file = Make(Xodb_file_tid_.Tid_text); for (int j = 0; j < ns_ids_len; j++) { int ns_id = ns_ids[j]; Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id); if (ns == null) continue; // some dumps may not have ns; for example, pre-2013 dumps won't have Module (828) @@ -97,7 +97,7 @@ public class Xodb_fsys_mgr { for (int i = 0; i < files_ary_len; i++) { Xodb_file file = files_ary[i]; if (Byte_.In(file.Tid(), tids)) - file.Index_create(usr_dlg, idxs); + Xodb_fsdb_mgr_.Index_create(usr_dlg, file, idxs); } } public void Overwrite(int file_idx) {Create_sqlite3(src_dir, trg_dir, trg_name, file_idx);} @@ -105,13 +105,13 @@ public class Xodb_fsys_mgr { Io_url url = trg_dir.GenSubFil(name + ".sqlite3"); if (!Io_mgr._.ExistsFil(url)) Io_mgr._.CopyFil(src_dir.GenSubFil("xowa.sqlite3"), url, true); - return Xodb_file.make_(-1, Xodb_file.Tid_temp, url.NameAndExt()).Connect_(Db_connect_.sqlite_(url)); + return Xodb_file.make_(-1, Xodb_file_tid_.Tid_temp, url.NameAndExt()).Connect_(Db_connect_.sqlite_(url)); } public Xodb_file Make(byte file_tid) { int file_idx = files_ary_len; Io_url url = Create_sqlite3(src_dir, trg_dir, trg_name, file_idx); Xodb_file rv = Xodb_file.make_(file_idx, file_tid, url.NameAndExt()).Connect_(Db_connect_.sqlite_(url)); - gplx.xowa.dbs.tbls.Xodb_xowa_cfg_tbl.Insert_str(rv.Provider(), "db.meta", "type_name", Xodb_file.Tid_to_name(file_tid)); + gplx.xowa.dbs.tbls.Xodb_xowa_cfg_tbl.Insert_str(rv.Provider(), "db.meta", "type_name", Xodb_file_tid_.Xto_key(file_tid)); files_ary = (Xodb_file[])Array_.Resize(files_ary, files_ary_len + 1); files_ary[files_ary_len] = rv; ++files_ary_len; @@ -130,3 +130,17 @@ public class Xodb_fsys_mgr { public static final int Heap_max_infinite = 0; public static final long Max_core_db = -1; } +class Xodb_fsdb_mgr_ { + public static void Index_create(Gfo_usr_dlg usr_dlg, Xodb_file file, Db_idx_itm[] idxs) { + Db_provider provider = file.Provider(); + provider.Txn_mgr().Txn_end_all(); // commit any pending transactions + int len = idxs.length; + for (int i = 0; i < len; i++) { + provider.Txn_mgr().Txn_bgn_if_none(); + String index = idxs[i].Xto_sql(); + usr_dlg.Prog_many("", "", "creating index: ~{0} ~{1}", file.Id(), index); + provider.Exec_sql(index); + provider.Txn_mgr().Txn_end_all(); + } + } +} diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java index aa13bb312..85e9102b0 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java @@ -112,7 +112,7 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { private Db_provider search_provider = null; private void Search_version_init() { if (search_provider == null) { - Xodb_file search_file = db_mgr.Fsys_mgr().Get_tid_root(Xodb_file.Tid_search); + Xodb_file search_file = db_mgr.Fsys_mgr().Get_tid_root(Xodb_file_tid_.Tid_search); if (search_file == null) { search_provider = Db_provider_.Null; search_version = gplx.xowa.specials.search.Xosrh_core.Version_1; @@ -128,7 +128,7 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { if (search_version == gplx.xowa.specials.search.Xosrh_core.Version_1) db_mgr.Tbl_page().Select_by_search(cancelable, rv, search, results_max); else { - Xodb_search_title_word_tbl.Select_by_word(cancelable, rv, search, results_max, db_mgr.Fsys_mgr().Get_tid_root(Xodb_file.Tid_search).Provider()); + Xodb_search_title_word_tbl.Select_by_word(cancelable, rv, search, results_max, db_mgr.Fsys_mgr().Get_tid_root(Xodb_file_tid_.Tid_search).Provider()); db_mgr.Tbl_page().Select_by_id_list(cancelable, true, rv); } } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java index 6aec50742..9ca49ff31 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java @@ -481,7 +481,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { if (pids_root == null) pids_root = wiki.App().Wiki_mgr().Wdata_mgr().Wdata_wiki().Fsys_mgr().Site_dir().GenSubDir_nest("data", "pid"); Xob_xdat_itm pid_itm = Load_xdat_itm_by_dir(pids_root.GenSubDir(String_.new_utf8_(lang_key)), pid_name); if (pid_itm == null) return gplx.xowa.xtns.wdatas.Wdata_wiki_mgr.Pid_null; - return Bry_.X_to_int_or(pid_itm.Src(), pid_itm.Itm_bgn() + pid_name.length + 1 + 1, pid_itm.Itm_end(), gplx.xowa.xtns.wdatas.Wdata_wiki_mgr.Pid_null); // extract pid; note that all itms have format of "ttl|pid"; +1=skip pipe; +1 skip p + return Bry_.Xto_int_or(pid_itm.Src(), pid_itm.Itm_bgn() + pid_name.length + 1 + 1, pid_itm.Itm_end(), gplx.xowa.xtns.wdatas.Wdata_wiki_mgr.Pid_null); // extract pid; note that all itms have format of "ttl|pid"; +1=skip pipe; +1 skip p } Io_url pids_root; public int Load_ctg_count(byte[] ttl) {return wiki.Db_mgr().Category_version() == Xoa_ctg_mgr.Version_1 ? Load_ctg_count_v1(ttl) : Load_ctg_count_v2(ttl);} int Load_ctg_count_v1(byte[] ttl) { diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java index 403256232..7146ced62 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java @@ -52,7 +52,7 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble { public DateAdp Dump_date_query() { DateAdp rv = wiki.Props().Modified_latest(); if (rv != null) return rv; - Io_url url = fsys_mgr.Get_url(Xodb_file.Tid_core); + Io_url url = fsys_mgr.Get_url(Xodb_file_tid_.Tid_core); return Io_mgr._.QueryFil(url).ModifiedTime(); } public void Init_make(String ns_map) { diff --git a/400_xowa/src/gplx/xowa/dbs/hdumps/Hdump_page_row.java b/400_xowa/src/gplx/xowa/dbs/hdumps/Hdump_page_row.java new file mode 100644 index 000000000..74d79b48b --- /dev/null +++ b/400_xowa/src/gplx/xowa/dbs/hdumps/Hdump_page_row.java @@ -0,0 +1,32 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.dbs.hdumps; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; +import gplx.ios.*; +public class Hdump_page_row { + public int Id() {return id;} private int id; + public byte[] Html() {return html;} private byte[] html; + public int Frags_len() {return frags_len;} private int frags_len; + public int Make_id() {return make_id;} private int make_id; + public Hdump_page_row Ctor(int id, byte[] html, int frags_len, int make_id) { + this.id = id; + this.html = html; + this.frags_len = frags_len; + this.make_id = make_id; + return this; + } +} diff --git a/400_xowa/src/gplx/xowa/dbs/hdumps/Hdump_page_tbl.java b/400_xowa/src/gplx/xowa/dbs/hdumps/Hdump_page_tbl.java new file mode 100644 index 000000000..9369b052b --- /dev/null +++ b/400_xowa/src/gplx/xowa/dbs/hdumps/Hdump_page_tbl.java @@ -0,0 +1,86 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.dbs.hdumps; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; +import gplx.dbs.*; import gplx.ios.*; +public class Hdump_page_tbl { + private Db_stmt stmt_select, stmt_insert, stmt_update; + private Io_stream_zip_mgr zip_mgr; private byte zip_tid; + public void Ctor(Io_stream_zip_mgr zip_mgr, byte zip_tid) {this.zip_mgr = zip_mgr; this.zip_tid = zip_tid;} + @gplx.Virtual public void Insert(Db_provider provider, int page_id, byte[] html, int frags_len, int make_id) { + if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(provider, Tbl_name, Flds_all); + try { + html = zip_mgr.Zip(zip_tid, html); + stmt_insert.Val_int_(page_id).Val_bry_(html).Val_int_(frags_len).Val_int_(make_id).Exec_insert(); + } finally {stmt_insert.Rls();} + } + @gplx.Virtual public void Update(Db_provider provider, int page_id, byte[] html, int frags_len, int make_id) { + if (stmt_update == null) stmt_update = Db_stmt_.new_update_(provider, Tbl_name, Flds_all); + try { + html = zip_mgr.Zip(zip_tid, html); + stmt_update.Val_int_(page_id).Val_bry_(html).Val_int_(frags_len).Val_int_(make_id).Exec_update(); + } finally {stmt_update.Rls();} + } + @gplx.Virtual public void Select(Db_provider provider, Hdump_page_row rv, int page_id) { + if (stmt_select == null) stmt_select = Db_stmt_.new_select_(provider, Tbl_name, String_.Ary(Fld_page_id), Flds_all); + try { + DataRdr rdr = stmt_select.Exec_select(); + rv.Ctor + ( rdr.ReadInt(Fld_page_id) + , zip_mgr.Unzip(zip_tid, rdr.ReadBry(Fld_page_text)) + , rdr.ReadInt(Fld_frags_len) + , rdr.ReadInt(Fld_make_id) + ); + rdr.Rls(); + } finally {stmt_select.Rls();} + } + @gplx.Virtual public void Delete_all(Db_provider provider) { + Db_qry_.delete_tbl_(Tbl_name).Exec_qry(provider); + } + public void Rls() { + stmt_select = stmt_insert = stmt_update = null; + zip_mgr = null; + } + public static final String Tbl_name = "html_page" + , Fld_page_id = "page_id", Fld_page_text = "page_text", Fld_frags_len = "frags_len", Fld_make_id= "make_id"; + private static final String[] Flds_all = new String[] {Fld_page_id, Fld_page_text, Fld_frags_len, Fld_make_id}; + public static final String Tbl_sql = String_.Concat_lines_nl + ( "CREATE TABLE IF NOT EXISTS html_page" + , "( page_id integer NOT NULL PRIMARY KEY" + , ", page_text mediumblob NOT NULL" + , ", frags_len integer NOT NULL" + , ", make_id integer NOT NULL" + , ");" + ); +} +class Hdump_page_tbl_mem extends Hdump_page_tbl { private OrderedHash hash = OrderedHash_.new_(); + @Override public void Insert(Db_provider provider, int page_id, byte[] html, int frags_len, int make_id) { + Hdump_page_row row = new Hdump_page_row().Ctor(page_id, html, frags_len, make_id); + hash.Add(page_id, row); + } + @Override public void Update(Db_provider provider, int page_id, byte[] html, int frags_len, int make_id) { + Hdump_page_row row = (Hdump_page_row)hash.Fetch(page_id); + row.Ctor(page_id, html, frags_len, make_id); + } + @Override public void Select(Db_provider provider, Hdump_page_row rv, int page_id) { + Hdump_page_row row = (Hdump_page_row)hash.Fetch(page_id); + rv.Ctor(row.Id(), row.Html(), row.Frags_len(), row.Make_id()); + } + @Override public void Delete_all(Db_provider provider) { + hash.Clear(); + } +} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java index babbde509..8fc6893d1 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; import gplx.ios.*; public class Xodb_text_tbl { - public Xodb_text_tbl(Xodb_mgr_sql db_mgr) {this.db_mgr = db_mgr; zip_mgr = db_mgr.Wiki().App().Zip_mgr();} private Xodb_mgr_sql db_mgr; Io_stream_zip_mgr zip_mgr; + public Xodb_text_tbl(Xodb_mgr_sql db_mgr) {this.db_mgr = db_mgr; zip_mgr = db_mgr.Wiki().App().Zip_mgr();} private Xodb_mgr_sql db_mgr; private Io_stream_zip_mgr zip_mgr; public void Delete_all(Db_provider provider) {provider.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} public Db_stmt Insert_stmt(Db_provider prov) {return Db_stmt_.new_insert_(prov, Tbl_name, Fld_page_id, Fld_old_text);} public void Insert(Db_stmt stmt, int page_id, byte[] text, byte storage_type) { diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java index 57add94df..da964a96c 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java @@ -30,7 +30,7 @@ public class Xodb_wdata_pids_tbl { String pid_str = (String)stmt.Val_str_by_bry_(src_lang).Val_str_by_bry_(src_ttl).Exec_select_val(); if (pid_str == null) return Wdata_wiki_mgr.Pid_null; // occurs when pid exists, but does not have entry for language; see hu.w:Marco Polo argali; DATE: 2014-02-01 byte[] pid_bry = Bry_.new_utf8_(pid_str); - return pid_bry == null ? Wdata_wiki_mgr.Pid_null : Bry_.X_to_int_or(pid_bry, 1, pid_bry.length, Wdata_wiki_mgr.Pid_null); + return pid_bry == null ? Wdata_wiki_mgr.Pid_null : Bry_.Xto_int_or(pid_bry, 1, pid_bry.length, Wdata_wiki_mgr.Pid_null); } finally {stmt.Rls();} } public static final String Tbl_name = "wdata_pids", Fld_wp_src_lang = "wp_src_lang", Fld_wp_src_ttl = "wp_src_ttl", Fld_wp_trg_ttl = "wp_trg_ttl"; diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java index 269b9b79c..7c9c053f6 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java @@ -27,7 +27,7 @@ public class Xodb_wdata_qids_tbl { Db_stmt stmt = Db_stmt_.Null; try { stmt = Db_stmt_.new_select_(p, Tbl_name, String_.Ary(Fld_wq_src_wiki, Fld_wq_src_ns, Fld_wq_src_ttl), Fld_wq_trg_ttl); - String rv = (String)stmt.Val_str_by_bry_(src_wiki).Val_int_(Bry_.X_to_int(src_ns)).Val_str_by_bry_(src_ttl).Exec_select_val(); + String rv = (String)stmt.Val_str_by_bry_(src_wiki).Val_int_(Bry_.Xto_int(src_ns)).Val_str_by_bry_(src_ttl).Exec_select_val(); return rv == null ? null : Bry_.new_utf8_(rv); } finally {stmt.Rls();} } diff --git a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java index 990be61c3..f17509fb6 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java @@ -166,7 +166,7 @@ public class Xof_xfer_itm implements Xof_file_itm { html_view_src = Trg_html(Xof_repo_itm.Mode_thumb, this.File_w()); thumb = meta_itm.Thumbs_get_img(html_w, 0); if (thumb == null) { // exact thumb not found - if (html_w == meta_itm.Orig_w() // html_w matches orig_w; occurs when thumb,upright requested, but upright size is larger than orig; EX.WP:St. Petersburg + if (html_w == meta_itm.Orig_w() // html_w matches orig_w; occurs when thumb,upright requested, but upright size is larger than orig; PAGE:en.w:St. Petersburg && !lnki_ext.Id_needs_convert() // but ext cannot be something that needs conversion; EX: 120,90 svg may match thumb of 120,90, but .png still needs to be generated && meta_itm.Orig_exists() == Xof_meta_itm.Exists_y ) { diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java index 3efe48e6d..500ce5181 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java @@ -89,6 +89,8 @@ public class Xof_fsdb_itm { Html_size_calc(img_size, exec_tid); Xof_repo_itm repo = repo_mgr.Repos_get_by_wiki(orig_wiki).Trg(); byte[] name_bry = Bry_.Len_eq_0(orig_redirect) ? lnki_ttl : orig_redirect; + if (!lnki_ext.Id_is_media() && lnki_thumbtime != Xof_doc_thumb.Null) // file is not media, but has thumbtime; this check can't be moved to Lnki_thumbtime_() b/c it needs ext + lnki_thumbtime = Xof_doc_thumb.Null; // set thumbtime to null; needed else url will reference thumbtime; PAGE:en.w:Moon; EX:[[File:Lunar libration with phase Oct 2007 450px.gif|thumbtime=0:02]]; DATE:2014-07-20 html_url = url_bldr.Set_trg_file_(lnki_type_as_mode, repo, name_bry, lnki_md5, lnki_ext, html_w, lnki_thumbtime, lnki_page).Xto_url(); html_orig_url = url_bldr.Set_trg_file_(Xof_repo_itm.Mode_orig, repo, name_bry, lnki_md5, lnki_ext, Xof_img_size.Size_null_deprecated, Xof_doc_thumb.Null, Xof_doc_page.Null).Xto_url(); } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_sql.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_sql.java index c0c1f05f4..74a284b43 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_sql.java @@ -57,19 +57,21 @@ public class Xof_fsdb_mgr_sql implements Xof_fsdb_mgr, GfoInvkAble { } public boolean Init_by_wiki(Xow_wiki wiki) { if (init) return false; - this.wiki = wiki; - usr_dlg = wiki.App().Usr_dlg(); - mnt_mgr.Usr_dlg_(usr_dlg); - init = true; - Xow_repo_mgr repo_mgr = wiki.File_mgr().Repo_mgr(); - Init_by_wiki(wiki, wiki.App().Fsys_mgr().File_dir().GenSubDir(wiki.Domain_str()), wiki.App().Fsys_mgr().File_dir(), repo_mgr); - Xof_qry_wkr_xowa_reg qry_xowa = new Xof_qry_wkr_xowa_reg(img_regy_provider); + try { + this.wiki = wiki; + usr_dlg = wiki.App().Usr_dlg(); + mnt_mgr.Usr_dlg_(usr_dlg); + init = true; + Xow_repo_mgr repo_mgr = wiki.File_mgr().Repo_mgr(); + Init_by_wiki(wiki, wiki.App().Fsys_mgr().File_dir().GenSubDir(wiki.Domain_str()), wiki.App().Fsys_mgr().File_dir(), repo_mgr); + Xof_qry_wkr_xowa_reg qry_xowa = new Xof_qry_wkr_xowa_reg(img_regy_provider); // Xof_qry_wkr_xowa qry_xowa = new Xof_qry_wkr_xowa(new Xof_wiki_finder(wiki.App().Wiki_mgr().Get_by_key_or_make(Xow_wiki_.Domain_commons_bry), wiki), new gplx.xowa.files.qrys.Xof_img_meta_wkr_xowa()); - Xof_qry_wkr_wmf_api qry_wmf_api = new Xof_qry_wkr_wmf_api(wiki, new Xof_img_wkr_api_size_base_wmf()); - qry_mgr.Add_many(qry_xowa, qry_wmf_api); - wiki.Rls_list().Add(this); - bin_mgr.Resizer_(wiki.App().File_mgr().Img_mgr().Wkr_resize_img()); - return true; + Xof_qry_wkr_wmf_api qry_wmf_api = new Xof_qry_wkr_wmf_api(wiki, new Xof_img_wkr_api_size_base_wmf()); + qry_mgr.Add_many(qry_xowa, qry_wmf_api); + wiki.Rls_list().Add(this); + bin_mgr.Resizer_(wiki.App().File_mgr().Img_mgr().Wkr_resize_img()); + return true; + } catch (Exception exc) {throw Err_.new_fmt_("failed to initialize fsdb_mgr: wiki=~{0) err=~{1}", wiki.Domain_str(), Err_.Message_gplx_brief(exc));} } public void Init_by_wiki(Xow_wiki wiki, Io_url db_dir, Io_url app_file_dir, Xow_repo_mgr repo_mgr) { this.app_file_dir = app_file_dir; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_itm.java b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_itm.java index 0021f31d9..82a07fb0b 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_itm.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_itm.java @@ -29,12 +29,12 @@ public class Cache_fil_itm implements CompareAble { public long Fil_size() {return fil_size;} private long fil_size; public void Fil_size_(long v) { this.fil_size = v; - cmd_mode = Db_cmd_mode.X_to_update(cmd_mode); + cmd_mode = Db_cmd_mode.Xto_update(cmd_mode); } public long Cache_time() {return cache_time;} private long cache_time; public void Cache_time_now_() { this.cache_time = DateAdp_.Now().XtoUtc().Timestamp_unix(); - cmd_mode = Db_cmd_mode.X_to_update(cmd_mode); + cmd_mode = Db_cmd_mode.Xto_update(cmd_mode); } public byte Cmd_mode() {return cmd_mode;} public Cache_fil_itm Cmd_mode_(byte v) {cmd_mode = v; return this;} private byte cmd_mode; public void Cmd_mode_delete_() { diff --git a/400_xowa/src/gplx/xowa/fmtrs/Xoa_fmtr_itm.java b/400_xowa/src/gplx/xowa/fmtrs/Xoa_fmtr_itm.java index 433f8e65d..22c225cbd 100644 --- a/400_xowa/src/gplx/xowa/fmtrs/Xoa_fmtr_itm.java +++ b/400_xowa/src/gplx/xowa/fmtrs/Xoa_fmtr_itm.java @@ -60,6 +60,6 @@ class Bfmtr_eval_invk implements Bry_fmtr_eval_mgr { public boolean Enabled() {return enabled;} public void Enabled_(boolean v) {enabled = v;} private boolean enabled = true; public byte[] Eval(byte[] cmd) { Object rslt = app.Gfs_mgr().Run_str_for(invk, String_.new_utf8_(cmd)); - return Bry_.new_utf8_(Object_.XtoStr_OrNullStr(rslt)); + return Bry_.new_utf8_(Object_.Xto_str_strict_or_null_mark(rslt)); } } diff --git a/400_xowa/src/gplx/xowa/gui/Xog_html_mgr.java b/400_xowa/src/gplx/xowa/gui/Xog_html_mgr.java index 2887bd23f..d62fefff3 100644 --- a/400_xowa/src/gplx/xowa/gui/Xog_html_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/Xog_html_mgr.java @@ -28,7 +28,7 @@ public class Xog_html_mgr implements GfoInvkAble { public String Auto_focus_id() {return auto_focus_id;} private String auto_focus_id = ""; public byte[] Css_xtn() {return css_xtn;} public void Css_xtn_(byte[] v) {css_xtn = v;} private byte[] css_xtn = Bry_.Empty; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_javascript_enabled)) return Yn.X_to_str(javascript_enabled); + if (ctx.Match(k, Invk_javascript_enabled)) return Yn.Xto_str(javascript_enabled); else if (ctx.Match(k, Invk_javascript_enabled_)) Javascript_enabled_(m.ReadYn("v")); else if (ctx.Match(k, Invk_auto_focus_id_)) auto_focus_id = m.ReadStr("v"); else if (ctx.Match(k, Invk_css_xtn)) return css_xtn; diff --git a/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_box_.java b/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_box_.java index afdc6ddd7..0802654d9 100644 --- a/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_box_.java +++ b/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_box_.java @@ -35,15 +35,15 @@ public class Xog_bnd_box_ { return ary; } private static Xog_bnd_box[] ary; private static void ary_init(Xog_bnd_box[] ary, int tid, String key) {ary[tid] = new Xog_bnd_box(tid, key);} - public static int[] X_to_sys_int_ary(String s) { + public static int[] Xto_sys_int_ary(String s) { String[] ary = String_.Split(s, "|"); int len = ary.length; int[] rv = new int[len]; for (int i = 0; i < len; i++) - rv[i] = X_to_sys_int(ary[i]); + rv[i] = Xto_sys_int(ary[i]); return rv; } - public static int X_to_sys_int(String s) { + public static int Xto_sys_int(String s) { if (String_.Eq(s, Key_browser)) return Tid_browser; else if (String_.Eq(s, Key_browser_url)) return Tid_browser_url; else if (String_.Eq(s, Key_browser_search)) return Tid_browser_search; @@ -53,7 +53,7 @@ public class Xog_bnd_box_ { else if (String_.Eq(s, Key_browser_info)) return Tid_browser_info; else throw Err_.unhandled(s); } - public static String X_to_sys_str(int v) { + public static String Xto_sys_str(int v) { switch (v) { case Tid_browser: return Key_browser; case Tid_browser_url: return Key_browser_url; @@ -65,7 +65,7 @@ public class Xog_bnd_box_ { default: throw Err_.unhandled(v); } } - public static String X_to_gui_str(int v) { + public static String Xto_gui_str(int v) { switch (v) { case Tid_browser: return Gui_browser; case Tid_browser_url: return Gui_browser_url; @@ -77,7 +77,7 @@ public class Xog_bnd_box_ { default: throw Err_.unhandled(v); } } - public static int X_by_gui_str(String s) { + public static int Xby_gui_str(String s) { if (String_.Eq(s, Gui_browser)) return Tid_browser; else if (String_.Eq(s, Gui_browser_url)) return Tid_browser_url; else if (String_.Eq(s, Gui_browser_search)) return Tid_browser_search; diff --git a/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_mgr_srl.java b/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_mgr_srl.java index 1c18a27f6..b063cf783 100644 --- a/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_mgr_srl.java +++ b/400_xowa/src/gplx/xowa/gui/bnds/Xog_bnd_mgr_srl.java @@ -55,8 +55,8 @@ public class Xog_bnd_mgr_srl extends Dsv_wkr_base { if (uids == null) Init(); Xog_bnd_itm bnd = (Xog_bnd_itm)uids.Fetch(Int_obj_val.new_(uid)); - int box = Xog_bnd_box_.X_by_gui_str(String_.new_utf8_(box_bry)); - IptArg ipt = IptArg_.parse_or_none_(bnd_parser.X_to_gfui(String_.new_utf8_(ipt_bry))); + int box = Xog_bnd_box_.Xby_gui_str(String_.new_utf8_(box_bry)); + IptArg ipt = IptArg_.parse_or_none_(bnd_parser.Xto_gfui(String_.new_utf8_(ipt_bry))); bnd_mgr.Del(bnd, ipt); Xog_bnd_mgr_srl.Update_cfg(app, bnd, box, ipt); uid = -1; box_bry = ipt_bry = null; diff --git a/400_xowa/src/gplx/xowa/gui/cmds/Xog_cmd_mgr.java b/400_xowa/src/gplx/xowa/gui/cmds/Xog_cmd_mgr.java index a5d0f0c05..f9c4c2723 100644 --- a/400_xowa/src/gplx/xowa/gui/cmds/Xog_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/cmds/Xog_cmd_mgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.gui.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; -import gplx.xowa.apis.xowa.*; +import gplx.xowa.apis.xowa.*; import gplx.xowa.langs.msgs.*; public class Xog_cmd_mgr { public void Init_by_kit(Xoa_app app) { invk_mgr.Ctor(app, this); @@ -30,7 +30,7 @@ public class Xog_cmd_mgr { Xol_lang lang = app.User().Lang(); for (int i = 0; i < len; i++) { Xog_cmd_ctg itm = ary[i]; - itm.Name_(Pf_msg_mgr.Get_msg_val_gui_or_null(lang, Xog_cmd_itm_.Msg_pre_ctg, itm.Key_bry(), Xog_cmd_itm_.Msg_suf_name)); + itm.Name_(Xol_msg_mgr_.Get_msg_val_gui_or_null(lang, Xog_cmd_itm_.Msg_pre_ctg, itm.Key_bry(), Xog_cmd_itm_.Msg_suf_name)); } } private void Load_cmd_msgs(Xoa_app app) { @@ -38,8 +38,8 @@ public class Xog_cmd_mgr { Xol_lang lang = app.User().Lang(); for (int i = 0; i < len; i++) { Xog_cmd_itm itm = this.Get_at(i); - itm.Name_(Pf_msg_mgr.Get_msg_val_gui_or_null(lang, Xog_cmd_itm_.Msg_pre_api, itm.Key_bry(), Xog_cmd_itm_.Msg_suf_name)); - itm.Tip_(Pf_msg_mgr.Get_msg_val_gui_or_null(lang, Xog_cmd_itm_.Msg_pre_api, itm.Key_bry(), Xog_cmd_itm_.Msg_suf_tip)); + itm.Name_(Xol_msg_mgr_.Get_msg_val_gui_or_null(lang, Xog_cmd_itm_.Msg_pre_api, itm.Key_bry(), Xog_cmd_itm_.Msg_suf_name)); + itm.Tip_(Xol_msg_mgr_.Get_msg_val_gui_or_null(lang, Xog_cmd_itm_.Msg_pre_api, itm.Key_bry(), Xog_cmd_itm_.Msg_suf_tip)); } } public int Len() {return Xog_cmd_itm_.Regy_len();} diff --git a/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_grp.java b/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_grp.java index aed960c63..2935087a8 100644 --- a/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_grp.java +++ b/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_grp.java @@ -100,7 +100,7 @@ public class Xog_mnu_grp extends Xog_mnu_base { } @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_build)) this.Build(); - else if (ctx.Match(k, Invk_enabled)) return Yn.X_to_str(enabled); + else if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(enabled); else if (ctx.Match(k, Invk_enabled_)) this.Enabled_(m.ReadYn("v")); else if (ctx.Match(k, Invk_source)) return source; else if (ctx.Match(k, Invk_source_)) this.Source_(app.Gfs_mgr(), m.ReadStr("v")); diff --git a/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_itm.java b/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_itm.java index 31fcde2a9..6095ac03b 100644 --- a/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_itm.java +++ b/400_xowa/src/gplx/xowa/gui/menus/dom/Xog_mnu_itm.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.gui.menus.dom; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; import gplx.xowa.gui.menus.*; -import gplx.gfui.*; import gplx.xowa.gui.cmds.*; +import gplx.gfui.*; import gplx.xowa.gui.cmds.*; import gplx.xowa.langs.msgs.*; public class Xog_mnu_itm extends Xog_mnu_base { private Xoa_gui_mgr gui_mgr; public Xog_mnu_itm(Xoa_gui_mgr gui_mgr, String key) { @@ -45,9 +45,9 @@ public class Xog_mnu_itm extends Xog_mnu_base { return this; } public void Init_by_lang(Xol_lang lang) { - this.name = Pf_msg_mgr.Get_msg_val_gui_or(lang, Xog_cmd_itm_.Msg_pre_api, key_bry, Xog_cmd_itm_.Msg_suf_name, name); // NOTE: custom cmds must use Get_val_or, not Get_val_or_null; DATE:2014-05-30 - this.shortcut = Pf_msg_mgr.Get_msg_val_gui_or(lang, Xog_cmd_itm_.Msg_pre_api, key_bry, Xog_cmd_itm_.Msg_suf_letter, shortcut); - this.img_nest = Img_nest_of(Pf_msg_mgr.Get_msg_val_gui_or(lang, Xog_cmd_itm_.Msg_pre_api, key_bry, Xog_cmd_itm_.Msg_suf_image, "")); + this.name = Xol_msg_mgr_.Get_msg_val_gui_or(lang, Xog_cmd_itm_.Msg_pre_api, key_bry, Xog_cmd_itm_.Msg_suf_name, name); // NOTE: custom cmds must use Get_val_or, not Get_val_or_null; DATE:2014-05-30 + this.shortcut = Xol_msg_mgr_.Get_msg_val_gui_or(lang, Xog_cmd_itm_.Msg_pre_api, key_bry, Xog_cmd_itm_.Msg_suf_letter, shortcut); + this.img_nest = Img_nest_of(Xol_msg_mgr_.Get_msg_val_gui_or(lang, Xog_cmd_itm_.Msg_pre_api, key_bry, Xog_cmd_itm_.Msg_suf_image, "")); this.gui_text = Gui_text_calc(name, shortcut); } public void Init_by_custom(String name, String shortcut, String img_nest_str) { diff --git a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java index 60ae4d966..85ded1cb5 100644 --- a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java +++ b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java @@ -67,15 +67,15 @@ public class Xog_url_wkr { return Rslt_handled; } private Xoa_url Exec_url_file(Xoa_app app, Xoa_page page, Xog_win_itm win, byte[] href_bry) { // EX: file:///xowa/A.png - href_bry = app.Url_converter_url().Decode(href_bry); + href_bry = app.Encoder_mgr().Url().Decode(href_bry); Io_url href_url = Io_url_.http_any_(String_.new_utf8_(href_bry), Op_sys.Cur().Tid_is_wnt()); gplx.gfui.Gfui_html html_box = win.Active_html_box(); String xowa_ttl = page.Wiki().Gui_mgr().Cfg_browser().Content_editable() ? html_box.Html_active_atr_get_str(gplx.xowa.html.Xoh_html_tag.Nde_xowa_title_str, null) - : Xoh_dom_.Title_by_href(app.Url_converter_comma(), app.Utl_bry_bfr_mkr().Get_b512().Mkr_rls(), href_bry, Bry_.new_utf8_(html_box.Html_doc_html())); + : Xoh_dom_.Title_by_href(app.Encoder_mgr().Comma(), app.Utl_bry_bfr_mkr().Get_b512().Mkr_rls(), href_bry, Bry_.new_utf8_(html_box.Html_doc_html())); if (!Io_mgr._.ExistsFil(href_url)) { Xof_xfer_itm xfer_itm = new Xof_xfer_itm(); - byte[] title = app.Url_converter_url().Decode(Bry_.new_utf8_(xowa_ttl)); + byte[] title = app.Encoder_mgr().Url().Decode(Bry_.new_utf8_(xowa_ttl)); xfer_itm.Atrs_by_lnki(Xop_lnki_type.Id_none, -1, -1, -1, Xof_doc_thumb.Null, Xof_doc_page.Null).Atrs_by_ttl(title, Bry_.Empty); page.Wiki().File_mgr().Find_meta(xfer_itm); page.File_queue().Clear(); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java index 117d30350..bcca8fc9e 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java @@ -143,7 +143,7 @@ public class Xog_html_itm implements GfoInvkAble, GfoEvObj { private boolean Scroll_page_by_id(String id) { return (id == null) ? false - : html_box.Html_elem_scroll_into_view(app.Url_converter_id().Encode_str(id)); + : html_box.Html_elem_scroll_into_view(app.Encoder_mgr().Id().Encode_str(id)); } public void Js_enabled_(boolean v) { html_box.Html_js_enabled_(v); @@ -197,7 +197,7 @@ class Xog_html_itm__href_extractor { ; public static String Html_extract_text(String site, String page, String text_str) { byte[] text_bry = Bry_.new_utf8_(text_str); - int text_tid = Byte_ascii.X_to_digit(text_bry[0]); + int text_tid = Byte_ascii.Xto_digit(text_bry[0]); int text_len = text_bry.length; switch (text_tid) { case Text_tid_none: return ""; diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java b/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java index 710554f7a..9f8c2edc3 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java @@ -37,7 +37,7 @@ public class Xog_html_js_cbk implements GfoInvkAble { String[] rv = new String[len + 1]; rv[0] = Invk_xowa_exec_test_as_array; for (int i = 0; i < len; i++) - rv[i + 1] = Object_.XtoStr_OrEmpty(m.ReadValAt(i)); + rv[i + 1] = Object_.Xto_str_strict_or_empty(m.ReadValAt(i)); return rv; } private String Parse_to_html(GfoMsg m) { @@ -75,7 +75,7 @@ public class Xog_html_js_cbk implements GfoInvkAble { } private String Popups_get_html(GfoMsg m) { try { - int popups_id = Int_.X_by_double_(Double_.cast_(m.Args_getAt(0).Val())); + int popups_id = Int_.Xby_double_(Double_.cast_(m.Args_getAt(0).Val())); byte[] href_bry = m.Args_getAt(1).Val_to_bry(); return html_itm.Owner_tab().Page().Wiki().Html_mgr().Module_mgr().Popup_mgr().Show_init(href_bry, popups_id); } catch (Exception e) {Err_.Noop(e); return null;} @@ -164,7 +164,7 @@ public class Xog_html_js_cbk implements GfoInvkAble { rv = app.Gfs_mgr().Run_str(m.Args_getAt(0).Val_to_str_or_empty()); } catch (Exception e) {Err_.Noop(e); return null;} - return Object_.XtoStr_OrEmpty(rv); + return Object_.Xto_str_strict_or_empty(rv); } private static final byte[] Wikidata_get_label_xowa_ui_lang = Bry_.new_ascii_("xowa_ui_lang"), Wikidata_get_label_xowa_title = Bry_.new_ascii_("xowa_title"); public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java b/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java new file mode 100644 index 000000000..93d59fd08 --- /dev/null +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java @@ -0,0 +1,106 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; +class Xog_launcher_tabs { + public void Launch(Xog_win_itm win) { + Xoa_app app = win.App(); Gfo_log_bfr log_bfr = app.Log_bfr(); + log_bfr.Add("app.launch.page.bgn"); + Io_fil_marker fil_marker = new Io_fil_marker().Usr_dlg_(app.Usr_dlg()).Url_(app.User().Fsys_mgr().App_temp_dir().GenSubFil_nest("session", "launch.tabs.marker")); + boolean tabs_restored = false; + Xow_wiki home_wiki = app.User().Wiki(); + if (fil_marker.Bgn()) + tabs_restored = Restore_tabs(app, home_wiki, win, fil_marker); + if (!tabs_restored) + Restore_tab_failover(app, home_wiki, win); + // tab.Html_itm().Html_box().Focus(); // focus the html_box so wheel scroll works; DATE:2013-02-08 + app.Gui_wtr().Prog_none("", "", ""); + log_bfr.Add("app.launch.page.end"); + app.Gui_wtr().Log_wtr().Log_msg_to_session_direct(log_bfr.Xto_str()); + } + private boolean Restore_tabs(Xoa_app app, Xow_wiki home_wiki, Xog_win_itm win, Io_fil_marker fil_marker) { + Xog_tab_itm tab = win.Active_tab(); + String[] launch_urls = app.Api_root().App().Startup().Tabs().Calc_startup_strs(); + try { + int launch_urls_len = launch_urls.length; + for (int i = 0; i < launch_urls_len; ++i) { + String launch_url = launch_urls[i]; + tab = i == 0 ? win.Active_tab() : win.Tab_mgr().Tabs_new_init(); + Launch_tab(tab, win, home_wiki, launch_url); + } + fil_marker.End(); + return true; + } + catch (Exception e) { + app.Usr_dlg().Warn_many("", "", "failed to launch urls: urls=~{0} err=~{1}", String_.AryXtoStr(launch_urls), Err_.Message_gplx(e)); + Restore_tab_failover(app, home_wiki, win); + return false; + } + } + private void Restore_tab_failover(Xoa_app app, Xow_wiki home_wiki, Xog_win_itm win) { + Launch_tab(win.Active_tab(), win, home_wiki, gplx.xowa.users.Xouc_pages_mgr.Page_xowa); + } + private void Launch_tab(Xog_tab_itm tab, Xog_win_itm win, Xow_wiki home_wiki, String launch_str) { + Xoa_page launch_page = Launch_page(win, home_wiki, launch_str); + if (launch_page.Missing()) return; + Xog_tab_itm_read_mgr.Show_page(tab, launch_page, false); + tab.History_mgr().Add(launch_page); + } + private Xoa_page Launch_page(Xog_win_itm win, Xow_wiki home_wiki, String launch_str) { + Xoa_url launch_url = Xoa_url_parser.Parse_from_url_bar(win.App(), home_wiki, launch_str); + Xow_wiki launch_wiki = launch_url.Wiki(); + Xoa_ttl launch_ttl = Xoa_ttl.parse_(launch_wiki, launch_url.Page_bry()); + Xoa_page rv = launch_wiki.GetPageByTtl(launch_url, launch_ttl).Url_(launch_url); // FUTURE: .Url_() should not be called (needed for anchor); EX: en.wikipedia.org/Earth#Biosphere + win.Active_page_(rv); // set to blank page + return rv; + } + public static final Xog_launcher_tabs _ = new Xog_launcher_tabs(); Xog_launcher_tabs() {} +} +class Io_fil_marker { + private Io_url url; + private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; + public Io_fil_marker Usr_dlg_(Gfo_usr_dlg v) {this.usr_dlg = v; return this;} + public Io_fil_marker Url_(Io_url url) {this.url = url; return this;} + public boolean Bgn() { + boolean rv = false; + synchronized (this) { + try { + rv = !Io_mgr._.ExistsFil(url); // exists = fail; !exists = pass; + if (rv) // pass: file does not exist; + Io_mgr._.SaveFilStr(url, ""); // create + else // file exists from previous run + Io_mgr._.DeleteFil(url); // delete + } + catch (Exception exc) { // something unexpected happened + usr_dlg.Warn_many("", "", "marker.bgn failed: url=~{0} err=~{1}", url.Raw(), Err_.Message_gplx(exc)); + Io_mgr._.DeleteFil(url); // try to delete it again + } + } + return rv; + } + public void End() { + synchronized (this) { + try { + Io_mgr._.DeleteFil(url); // delete + } + catch (Exception exc) { + usr_dlg.Warn_many("", "", "marker.end failed: url=~{0} err=~{1}", url.Raw(), Err_.Message_gplx(exc)); + Io_mgr._.DeleteFil(url); // try to delete it again + } + } + } +} diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java index e208ec33c..d49faee59 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java @@ -199,9 +199,11 @@ public class Xog_tab_itm implements GfoInvkAble { catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.cmds: page=~{0} err=~{1}", page_ttl_str, Err_.Message_gplx_brief(e));} } try { - Xop_lnki_logger_redlinks_wkr redlinks_wkr = new Xop_lnki_logger_redlinks_wkr(win_itm, page); - ThreadAdp_.invk_(redlinks_wkr, gplx.xowa.parsers.lnkis.redlinks.Xop_lnki_logger_redlinks_wkr.Invk_run).Start(); - usr_dlg.Prog_none("", "imgs.done", ""); + if (page.Tab() != null) { // needed b/c Preview has page.Tab of null which causes null_ref error in redlinks + Xop_lnki_logger_redlinks_wkr redlinks_wkr = new Xop_lnki_logger_redlinks_wkr(win_itm, page); + ThreadAdp_.invk_(redlinks_wkr, gplx.xowa.parsers.lnkis.redlinks.Xop_lnki_logger_redlinks_wkr.Invk_run).Start(); + usr_dlg.Prog_none("", "imgs.done", ""); + } } catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.redlinks: page=~{0} err=~{1}", page_ttl_str, Err_.Message_gplx_brief(e));} try {app.File_mgr().Cache_mgr().Compress_check();} catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.cache: page=~{0} err=~{1}", page_ttl_str, Err_.Message_gplx_brief(e));} diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java index 13f32bd77..998f4e633 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java @@ -84,28 +84,6 @@ public class Xog_tab_itm_read_mgr { win.Win_box().Text_(err_msg); } public static void Launch(Xog_win_itm win) { - Xoa_app app = win.App(); - Gfo_log_bfr log_bfr = app.Log_bfr(); - log_bfr.Add("app.launch.page.bgn"); - Xow_wiki home_wiki = app.User().Wiki(); - Xoa_page launch_page = Xog_tab_itm_read_mgr.Launch_page(win, home_wiki, app.Sys_cfg().Launch_url()); - if (launch_page.Missing()) - launch_page = Xog_tab_itm_read_mgr.Launch_page(win, home_wiki, Xoa_sys_cfg.Launch_url_dflt); - log_bfr.Add("app.launch.page.show"); - Xog_tab_itm tab = win.Active_tab(); - Xog_tab_itm_read_mgr.Show_page(tab, launch_page, false); - tab.History_mgr().Add(launch_page); - tab.Html_itm().Html_box().Focus(); //this.Html_box().Html_doc_body_focus(); // focus the html_box so wheel scroll works; DATE:2013-02-08 - app.Gui_wtr().Prog_none("", "", ""); - log_bfr.Add("app.launch.page.end"); - app.Gui_wtr().Log_wtr().Log_msg_to_session_direct(log_bfr.Xto_str()); - } - private static Xoa_page Launch_page(Xog_win_itm win, Xow_wiki home_wiki, String launch_str) { - Xoa_url launch_url = Xoa_url_parser.Parse_url(win.App(), home_wiki, launch_str); - Xow_wiki launch_wiki = launch_url.Wiki(); - Xoa_ttl launch_ttl = Xoa_ttl.parse_(launch_wiki, launch_url.Page_bry()); - Xoa_page rv = launch_wiki.GetPageByTtl(launch_url, launch_ttl).Url_(launch_url); // FUTURE: .Url_() should not be called (needed for anchor); EX: en.wikipedia.org/Earth#Biosphere - win.Active_page_(rv); // set to blank page - return rv; + Xog_launcher_tabs._.Launch(win); } } diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java index c3213c280..4c92509ad 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_mgr.java @@ -70,9 +70,7 @@ public class Xog_tab_mgr implements GfoEvObj { } } public int Tabs_len() {return tab_regy.Count();} - public void Tabs_new_init() { - this.Tabs_new(true, true); - } + public Xog_tab_itm Tabs_new_init() {return this.Tabs_new(true, true);} public Xog_tab_itm Tabs_get_at(int i) {return (Xog_tab_itm)tab_regy.FetchAt(i);} public Xog_tab_itm Tabs_new_dflt() {return Tabs_new_dflt(false);} public Xog_tab_itm Tabs_new_dflt(boolean focus) {return Tabs_new_dflt(false, focus);} diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java index 28fbd18c0..c261e8803 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java @@ -301,6 +301,6 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { if ( !Env_.Mode_testing() && app.Mode() == Xoa_app_.Mode_gui) // only run for gui; do not run for tcp/http server; DATE:2014-05-03 - app.Usr_dlg().Ui_wkr_(new Gfo_usr_dlg_ui_swt(kit, prog_box, info_box, info_box, app.Gui_mgr().Win_cfg())); + app.Usr_dlg().Ui_wkr_(new Gfo_usr_dlg_ui_swt(kit, prog_box, info_box, info_box, app.Api_root().Gui().Browser().Info())); } } diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm__prog_href_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm__prog_href_mgr.java index 153a6053c..390999563 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm__prog_href_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm__prog_href_mgr.java @@ -22,7 +22,7 @@ public class Xog_win_itm__prog_href_mgr { private static Bry_bfr tmp_bfr = Bry_bfr.reset_(512); public static void Print(Xog_win_itm win) { // PURPOSE: print href in prog box when in content editable mode String href = win.Active_html_box().Html_active_atr_get_str(Gfui_html.Atr_href, "");// get selected href from html_box - href = win.App().Url_converter_href().Decode_str(href); // remove url encodings + href = win.App().Encoder_mgr().Href().Decode_str(href); // remove url encodings if (!String_.Eq(href, win.Prog_box().Text())) win.Usr_dlg().Prog_direct(href); } diff --git a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java index cbef60eed..2157b0ad4 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java @@ -161,17 +161,19 @@ public class Xoh_html_wtr { else { // xowa or regular; EX: http://a.org if (proto_is_xowa) { bfr.Add(Xoh_consts.A_bgn).Add(Xop_lnke_wkr.Bry_xowa_protocol); - ctx.App().Url_converter_gfs().Encode(bfr, src, lnke_bgn, lnke_end); + ctx.App().Encoder_mgr().Gfs().Encode(bfr, src, lnke_bgn, lnke_end); bfr.Add(Xoh_consts.A_bgn_lnke_0_xowa); } else // regular; add href bfr.Add(Xoh_consts.A_bgn).Add_mid(src, lnke_bgn, lnke_end).Add(Xoh_consts.A_bgn_lnke_0); } } - else { - bfr.Add(Xoh_consts.A_bgn).Add(Xoh_href_parser.Href_site_bry).Add(lnke_xwiki_wiki).Add(Xoh_href_parser.Href_wiki_bry).Add(lnke.Lnke_xwiki_page()); + else { // xwiki + Url_encoder href_encoder = ctx.App().Encoder_mgr().Href_quotes(); + bfr.Add(Xoh_consts.A_bgn).Add(Xoh_href_parser.Href_site_bry).Add(lnke_xwiki_wiki).Add(Xoh_href_parser.Href_wiki_bry) + .Add(href_encoder.Encode(lnke.Lnke_xwiki_page())); // NOTE: must encode page; EX:%22%3D -> '">' which will end attribute; PAGE:en.w:List_of_Category_A_listed_buildings_in_West_Lothian DATE:2014-07-15 if (lnke.Lnke_xwiki_qargs() != null) - Xoa_url_arg_hash.Concat_bfr(bfr, lnke.Lnke_xwiki_qargs()); + Xoa_url_arg_hash.Concat_bfr(bfr, href_encoder, lnke.Lnke_xwiki_qargs()); // NOTE: must encode args bfr.Add(Xoh_consts.__end_quote); } } @@ -279,7 +281,7 @@ public class Xoh_html_wtr { } } public void Space(Xop_ctx ctx, Xoh_html_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_tkn_grp grp, int sub_idx, Xop_space_tkn space) { - bfr.Add_byte_repeat(Byte_ascii.Space, space.Src_end_grp(grp, sub_idx) - space.Src_bgn_grp(grp, sub_idx)); // NOTE: lnki.caption will convert \n to \s; see Xop_nl_lxr; EX.WP: Schwarzschild radius + bfr.Add_byte_repeat(Byte_ascii.Space, space.Src_end_grp(grp, sub_idx) - space.Src_bgn_grp(grp, sub_idx)); // NOTE: lnki.caption will convert \n to \s; see Xop_nl_lxr; PAGE:en.w:Schwarzschild radius } @gplx.Virtual public void Para(Xop_ctx ctx, Xoh_html_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_para_tkn para) { if (para.Nl_bgn() && bfr.Len() > 0) { @@ -447,6 +449,7 @@ public class Xoh_html_wtr { case Xop_xnde_tag_.Tid_listing_sleep: case Xop_xnde_tag_.Tid_xowa_cmd: case Xop_xnde_tag_.Tid_rss: + case Xop_xnde_tag_.Tid_quiz: case Xop_xnde_tag_.Tid_math: case Xop_xnde_tag_.Tid_xowa_html: Xox_xnde xtn = xnde.Xnde_xtn(); @@ -562,7 +565,7 @@ public class Xoh_html_wtr { bfr.Add_byte(quote_byte); } private static void Xnde_atr_write_id(Bry_bfr bfr, Xoa_app app, byte[] bry, int bgn, int end) { - app.Url_converter_id().Encode(bfr, bry, bgn, end); + app.Encoder_mgr().Id().Encode(bfr, bry, bgn, end); } private void Xnde_subs(Xop_ctx ctx, Xoh_html_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) { int subs_len = xnde.Subs_len(); diff --git a/400_xowa/src/gplx/xowa/html/Xoh_imgs_mgr.java b/400_xowa/src/gplx/xowa/html/Xoh_imgs_mgr.java index 75b77a3c4..71757c0b3 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_imgs_mgr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_imgs_mgr.java @@ -23,9 +23,9 @@ public class Xoh_imgs_mgr implements GfoInvkAble { public Bool_obj_ref Alt_defaults_to_caption() {return alt_defaults_to_caption;} Bool_obj_ref alt_defaults_to_caption = Bool_obj_ref.y_(); public void Copy_cfg(Xoh_imgs_mgr copy) {this.alt_in_caption = copy.alt_in_caption;} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_alt_in_caption)) return Yn.X_to_str(alt_in_caption.Val()); + if (ctx.Match(k, Invk_alt_in_caption)) return Yn.Xto_str(alt_in_caption.Val()); else if (ctx.Match(k, Invk_alt_in_caption_)) alt_in_caption = Modify(wiki_is_default, alt_in_caption, m.ReadYn("v")); - else if (ctx.Match(k, Invk_alt_defaults_to_caption)) return Yn.X_to_str(alt_defaults_to_caption.Val()); + else if (ctx.Match(k, Invk_alt_defaults_to_caption)) return Yn.Xto_str(alt_defaults_to_caption.Val()); else if (ctx.Match(k, Invk_alt_defaults_to_caption_)) alt_defaults_to_caption = Modify(wiki_is_default, alt_defaults_to_caption, m.ReadYn("v")); else return GfoInvkAble_.Rv_unhandled; return this; diff --git a/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr.java index 2a79441fb..c00b59619 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr.java @@ -167,7 +167,7 @@ public class Xoh_lnki_file_wtr { // if (lnki_img_type == Xop_lnki_type.Id_none) bfr.Add(Bry_div_float_none).Add_byte_nl(); switch (lnki.Align_h()) { case Xop_lnki_align_h.Left: bfr.Add(Bry_div_float_left).Add_byte_nl(); break; - case Xop_lnki_align_h.Right: bfr.Add(Bry_div_float_right).Add_byte_nl(); break; + case Xop_lnki_align_h.Right: bfr.Add(Bry_div_float_right).Add_byte_nl(); break; case Xop_lnki_align_h.None: bfr.Add(Bry_div_float_none).Add_byte_nl(); break; } Arg_nde_tkn lnki_link_tkn = lnki.Link_tkn(); @@ -178,6 +178,7 @@ public class Xoh_lnki_file_wtr { byte[] link_ref = link_tkn.Dat_to_bry(src); byte[] link_ref_new = tmp_link_parser.Parse(tmp_bfr, tmp_url, wiki, link_ref, lnki_href); link_ref = link_ref_new == null ? lnki_href: link_ref_new; // if parse fails, then assign to lnki_href; EX:link={{{1}}} + link_ref = ctx.App().Encoder_mgr().Href_quotes().Encode(link_ref); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16 lnki_ttl = Bry_.Coalesce(lnki_ttl, tmp_link_parser.Html_xowa_ttl()); html_mgr.Lnki_full_image().Bld_bfr_many(bfr, elem_id, link_ref, html_view_src, xfer_itm.Html_w(), xfer_itm.Html_h(), lnki_alt_text, lnki_ttl, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, Img_cls(lnki)); } diff --git a/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr_media_tst.java b/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr_media_tst.java index bfa5b38fc..a38afa160 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr_media_tst.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr_media_tst.java @@ -20,7 +20,7 @@ import org.junit.*; public class Xoh_lnki_file_wtr_media_tst { private Xop_fxt fxt = new Xop_fxt(); @Before public void init() {fxt.Reset();} - @Test public void Lnki_caption_nested_media() { // EX.WP:Beethoven; + @Test public void Lnki_caption_nested_media() { // PAGE:en.w:Beethoven; fxt.Test_parse_page_wiki_str("[[File:A.png|thumb|b [[Media:A.ogg]] c]]", String_.Concat_lines_nl_skip_last ( "
" , "
" diff --git a/400_xowa/src/gplx/xowa/html/Xoh_lnki_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_lnki_wtr.java index a913cb558..fef09a4c4 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_lnki_wtr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_lnki_wtr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html; import gplx.*; import gplx.xowa.*; -import gplx.xowa.files.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.users.history.*; +import gplx.xowa.files.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.users.history.*; import gplx.xowa.xtns.pfuncs.ttls.*; public class Xoh_lnki_wtr { private Xoa_app app; private Xow_wiki wiki; private Xoa_page page; private Xop_ctx ctx; private Xoh_html_wtr_cfg cfg; @@ -54,7 +54,7 @@ public class Xoh_lnki_wtr { redlinks_mgr.Lnki_add(lnki); boolean stage_is_alt = hctx.Mode_is_alt(); switch (lnki.Ns_id()) { - case Xow_ns_.Id_media: if (!stage_is_alt) file_wtr.Write_or_queue(bfr, page, ctx, hctx, src, lnki); return; // NOTE: literal ":" has no effect; EX.WP:Beethoven and [[:Media:De-Ludwig_van_Beethoven.ogg|listen]] + case Xow_ns_.Id_media: if (!stage_is_alt) file_wtr.Write_or_queue(bfr, page, ctx, hctx, src, lnki); return; // NOTE: literal ":" has no effect; PAGE:en.w:Beethoven and [[:Media:De-Ludwig_van_Beethoven.ogg|listen]] case Xow_ns_.Id_file: if (!literal_link && !stage_is_alt) {file_wtr.Write_or_queue(bfr, page, ctx, hctx, src, lnki); return;} break; case Xow_ns_.Id_category: if (!literal_link) {page.Html_data().Ctgs_add(lnki.Ttl()); return;} break; } @@ -75,8 +75,8 @@ public class Xoh_lnki_wtr { private void Write_plain(Bry_bfr bfr, Xoh_html_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xoa_ttl lnki_ttl, Xop_lnki_caption_wtr caption_wkr) { byte[] ttl_bry = lnki.Ttl_ary(); if (Bry_.Len_eq_0(ttl_bry)) ttl_bry = lnki_ttl.Full_txt_raw(); // NOTE: handles ttls like [[fr:]] and [[:fr;]] which have an empty Page_txt, but a valued Full_txt_raw - if (Bry_.Eq(lnki_ttl.Full_txt(), page.Ttl().Full_txt())) { // lnki is same as pagename; bold; SEE: Month widget on day pages will bold current day; EX.WP: January 1 - if (lnki_ttl.Anch_bgn() == -1 && Bry_.Eq(lnki_ttl.Wik_txt(), page.Ttl().Wik_txt())) { // only bold if lnki is not pointing to anchor on same page; EX.WP: Comet; [[Comet#Physical characteristics|ion tail]] + if (Bry_.Eq(lnki_ttl.Full_txt(), page.Ttl().Full_txt())) { // lnki is same as pagename; bold; SEE: Month widget on day pages will bold current day; PAGE:en.w:January 1 + if (lnki_ttl.Anch_bgn() == -1 && Bry_.Eq(lnki_ttl.Wik_txt(), page.Ttl().Wik_txt())) { // only bold if lnki is not pointing to anchor on same page; PAGE:en.w:Comet; [[Comet#Physical characteristics|ion tail]] bfr.Add(Xoh_consts.B_bgn); Write_caption(bfr, ctx, hctx, src, lnki, ttl_bry, true, caption_wkr); bfr.Add(Xoh_consts.B_end); @@ -130,17 +130,17 @@ public class Xoh_lnki_wtr { } } private static boolean Write_caption_for_rel2abs(Bry_bfr bfr, Xop_lnki_tkn lnki) { - int subpage_tid = lnki.Subpage_tid(); if (subpage_tid == Pf_xtn_rel2abs.Id_null) return false; // not a subpage + int subpage_tid = lnki.Subpage_tid(); if (subpage_tid == Pfunc_rel2abs.Id_null) return false; // not a subpage boolean subpage_slash_at_end = lnki.Subpage_slash_at_end(); byte[] leaf_txt = lnki.Ttl().Leaf_txt_wo_qarg(); switch (subpage_tid) { - case Pf_xtn_rel2abs.Id_slash: + case Pfunc_rel2abs.Id_slash: if (subpage_slash_at_end) // "/" at end; only add text; EX: [[/A/]] -> A bfr.Add(leaf_txt); else // "/" absent; add slash to bgn; EX: [[/A]] -> /A bfr.Add_byte(Byte_ascii.Slash).Add(leaf_txt); return true; - case Pf_xtn_rel2abs.Id_dot_dot_slash: + case Pfunc_rel2abs.Id_dot_dot_slash: if (subpage_slash_at_end) // "/" at end; only add text; EX: [[../A/]] -> A bfr.Add(leaf_txt); else // "/" absent; add page; EX: [[../A]] -> Page/A diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_mgr.java b/400_xowa/src/gplx/xowa/html/Xoh_page_mgr.java index 7bced870c..e26b33302 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_page_mgr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_page_mgr.java @@ -42,7 +42,7 @@ public class Xoh_page_mgr implements GfoInvkAble { else if (ctx.Match(k, Invk_font_size_)) {font_size = m.ReadFloat("v"); this.Font_css_bry_update();} else if (ctx.Match(k, Invk_font_css_fmt)) return String_.new_utf8_(font_css_fmtr.Fmt()); else if (ctx.Match(k, Invk_font_css_fmt_)) Font_css_fmtr_(m.ReadBry("v")); - else if (ctx.Match(k, Invk_font_enabled)) return Yn.X_to_str(font_enabled); + else if (ctx.Match(k, Invk_font_enabled)) return Yn.Xto_str(font_enabled); else if (ctx.Match(k, Invk_font_enabled_)) font_enabled = m.ReadYn("v"); else if (ctx.Match(k, Invk_content_code_fmt)) return String_.new_utf8_(content_code_fmtr.Fmt()); else if (ctx.Match(k, Invk_content_code_fmt_)) content_code_fmtr.Fmt_(m.ReadBry("v")); diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java index b159cda8a..9619e26cd 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_mgr.java @@ -47,8 +47,8 @@ public class Xoh_page_wtr_mgr implements GfoInvkAble { } public boolean Html_capable() {return html_capable;} public Xoh_page_wtr_mgr Html_capable_(boolean v) {html_capable = v; return this;} private boolean html_capable; public Bry_fmtr Page_read_fmtr() {return page_read_fmtr;} - public byte[] Css_common_bry() {return css_common_bry;} public Xoh_page_wtr_mgr Css_common_bry_(Io_url v) {css_common_bry = app.Url_converter_fsys().Encode_http(v); return this;} private byte[] css_common_bry; - public byte[] Css_wiki_bry() {return css_wiki_bry;} public Xoh_page_wtr_mgr Css_wiki_bry_(Io_url v) {css_wiki_bry = app.Url_converter_fsys().Encode_http(v); return this;} private byte[] css_wiki_bry; + public byte[] Css_common_bry() {return css_common_bry;} public Xoh_page_wtr_mgr Css_common_bry_(Io_url v) {css_common_bry = app.Encoder_mgr().Fsys().Encode_http(v); return this;} private byte[] css_common_bry; + public byte[] Css_wiki_bry() {return css_wiki_bry;} public Xoh_page_wtr_mgr Css_wiki_bry_(Io_url v) {css_wiki_bry = app.Encoder_mgr().Fsys().Encode_http(v); return this;} private byte[] css_wiki_bry; private Bry_fmtr page_read_fmtr = Bry_fmtr.new_("" , "page_id", "page_name", "page_title", "page_content_sub", "page_data", "page_langs", "page_modified_on_msg", "page_lang_ltr" , "html_css_common_path", "html_css_wiki_path", "html_content_editable" @@ -128,5 +128,5 @@ NOTE_1:xowa_anchor_button . text-align:center; forces img to be in center General notes: -. contentSub div is needed; EX.WP: Battle of Spotsylvania Court House +. contentSub div is needed; PAGE:en.w:Battle of Spotsylvania Court House */ diff --git a/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java b/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java index 97d84e6b5..ff1925c1a 100644 --- a/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java +++ b/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java @@ -25,10 +25,10 @@ public class Xow_html_mgr implements GfoInvkAble { Xoa_app app = wiki.App(); page_wtr_mgr = new Xoh_page_wtr_mgr(app, app.Gui_mgr().Kit().Tid() != gplx.gfui.Gfui_kit_.Swing_tid); // reverse logic to handle swt,drd but not mem Io_url file_dir = app.User().Fsys_mgr().App_img_dir().GenSubDir_nest("file"); - img_media_play_btn = app.Url_converter_fsys().Encode_http(file_dir.GenSubFil("play.png")); - img_media_info_btn = app.Url_converter_fsys().Encode_http(file_dir.GenSubFil("info.png")); - img_thumb_magnify = app.Url_converter_fsys().Encode_http(file_dir.GenSubFil("magnify-clip.png")); - img_xowa_protocol = app.Url_converter_fsys().Encode_http(app.User().Fsys_mgr().App_img_dir().GenSubFil_nest("xowa", "protocol.png")); + img_media_play_btn = app.Encoder_mgr().Fsys().Encode_http(file_dir.GenSubFil("play.png")); + img_media_info_btn = app.Encoder_mgr().Fsys().Encode_http(file_dir.GenSubFil("info.png")); + img_thumb_magnify = app.Encoder_mgr().Fsys().Encode_http(file_dir.GenSubFil("magnify-clip.png")); + img_xowa_protocol = app.Encoder_mgr().Fsys().Encode_http(app.User().Fsys_mgr().App_img_dir().GenSubFil_nest("xowa", "protocol.png")); portal_mgr = new Xow_portal_mgr(wiki); imgs_mgr = new Xoh_imgs_mgr(this); module_mgr = new Xow_module_mgr(wiki); @@ -36,6 +36,7 @@ public class Xow_html_mgr implements GfoInvkAble { public void Init_by_wiki(Xow_wiki wiki) { html_wtr.Init_by_wiki(wiki); module_mgr.Init_by_wiki(wiki); + portal_mgr.Init_by_wiki(wiki); } public void Init_by_lang(Xol_lang lang) { portal_mgr.Init_by_lang(lang); diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_html_mkr.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_html_mkr.java index 53a81de02..67a462e3f 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_html_mkr.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_html_mkr.java @@ -33,7 +33,7 @@ public class Xow_popup_html_mkr { if (output_js_clean) app.Html_mgr().Js_cleaner().Clean_bfr(wiki, page.Ttl(), wrdx_bfr, 0); if (output_tidy) app.Html_mgr().Tidy_mgr().Run_tidy_html(page, wrdx_bfr); byte[] hdom_bry = wrdx_bfr.XtoAryAndClear(); - String page_url = wrdx_bfr.Add(page.Wiki().Domain_bry()).Add(Xoa_consts.Url_wiki_intermediary).Add(app.Url_converter_href() + String page_url = wrdx_bfr.Add(page.Wiki().Domain_bry()).Add(Xoa_consts.Url_wiki_intermediary).Add(app.Encoder_mgr().Href() .Encode(page.Ttl().Full_db())) // NOTE: was page.Url().Raw(), but that doesn't work for Special:Search; PAGE:en.w:Earth and "Quotations"; DATE:2014-06-29 .XtoStrAndClear() ; diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser.java index 3cbed43c5..0fd3f8bd9 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser.java @@ -91,7 +91,7 @@ public class Xow_popup_parser { && tmpl_read_len_cur < tmpl_len // only reparse if tmpl_read_len_cur is < entire page; needed for pages which have dangling items; EX:"a" ) { new_tmpl_bgn = tmpl_bgn; - tmpl_read_len_cur += cfg.Tmpl_read_len(); + tmpl_read_len_cur = Xow_popup_parser_.Calc_read_len(wtxt_ctx, tmpl_read_len_cur, cfg.Tmpl_read_len(), tmpl_src, tmpl_bgn, tmpl_end); wtxt_ctx.Clear(); } else { @@ -99,6 +99,7 @@ public class Xow_popup_parser { tmpl_read_len_cur = cfg.Tmpl_read_len(); } tmpl_bgn = new_tmpl_bgn; + data.Tmpl_loop_count_add(); if ( tmpl_bgn == tmpl_len // end of template || tmpl_bgn > data.Tmpl_max() // too much read; stop and give whatever's available ) @@ -198,3 +199,36 @@ public class Xow_popup_parser { return Xot_tmpl_wtr._.Write_all(tmpl_ctx, tmpl_root, src); } } +class Xow_popup_parser_ { + public static int Calc_read_len(Xop_ctx ctx, int tmpl_read_cur, int tmpl_read_len, byte[] src, int bgn, int end) {// DATE:2014-07-19 + int rv_default = tmpl_read_cur + tmpl_read_len; + Xop_tkn_itm tkn = Get_expensive_dangling_tkn(ctx); + if (tkn == null) return rv_default; // no expensive tkns found; return rv_default; EX: headers are not considered expensive + int tkn_end = Calc_tkn_end(tkn, src, end); + if (tkn_end == Bry_.NotFound) return rv_default; // no end found; return rv_default; might want to return src.length at future date + return tkn_end - bgn; + } + private static Xop_tkn_itm Get_expensive_dangling_tkn(Xop_ctx ctx) { + int stack_len = ctx.Stack_len(); + if (stack_len == 0) return null; // no dangling tkns; just add tmpl_read_len; shouldn't happen, but keep prior behavior + for (int i = 0; i < stack_len; ++i) { + Xop_tkn_itm tkn = ctx.Stack_get(i); + switch (tkn.Tkn_tid()) { + case Xop_tkn_itm_.Tid_tblw_tb: + return tkn; + } + } + return null; + } + private static int Calc_tkn_end(Xop_tkn_itm tkn, byte[] src, int pos) { + byte[] end_bry = null; + switch (tkn.Tkn_tid()) { + case Xop_tkn_itm_.Tid_tblw_tb: // "{|" can be expensive; PAGE:en.w:List_of_countries_and_dependencies_by_area; DATE:2014-07-19 + end_bry = Xop_tblw_lxr.Hook_te; + break; + } + if (end_bry == null) return Bry_.NotFound; // no end defined for tkn; return null which should revert to dflt + int end_pos = Bry_finder.Find_fwd(src, end_bry, pos); + return end_pos == Bry_finder.Not_found ? Bry_finder.Not_found : end_pos + end_bry.length; + } +} diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_data.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_data.java index 2c2b1a87e..12b6e4d07 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_data.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_data.java @@ -25,10 +25,12 @@ public class Xow_popup_parser_data { public int Words_found() {return words_found;} private int words_found; public Bry_bfr Wrdx_bfr() {return wrdx_bfr;} private Bry_bfr wrdx_bfr = Bry_bfr.reset_(255); public Xow_popup_word[] Words_found_ary() {return (Xow_popup_word[])words_found_list.XtoAryAndClear(Xow_popup_word.class);} private ListAdp words_found_list = ListAdp_.new_(); + public int Tmpl_loop_count() {return tmpl_loop_count;} private int tmpl_loop_count; + public void Tmpl_loop_count_add() {++tmpl_loop_count;} private Xow_popup_itm popup_itm; public boolean Html_restricted() {return html_restricted;} private boolean html_restricted; public void Init(Xow_popup_cfg cfg, Xow_popup_itm popup_itm, int tmpl_len) { - words_found = 0; + words_found = tmpl_loop_count= 0; words_found_list.Clear(); wrdx_bfr.Clear(); diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_tst.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_tst.java index ef715e800..dddb66efd 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_tst.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_tst.java @@ -411,6 +411,23 @@ public class Xow_popup_parser_tst { fxt.Test_Assert_at_end("a\n\n\n" , "a\n"); // remove til one fxt.Test_Assert_at_end("" , ""); // empty check } + @Test public void Skip_to_end__tblw() { // PURPOSE: skip to end of tblw; PAGE:en.w:List_of_countries_and_dependencies_by_area; DATE:2014-07-19 + fxt.Init_tmpl_read_len_(4).Test_parse + ( String_.Concat_lines_nl_skip_last + ( "a" + , "{|" + , "|-" + , "|b" + , "|c" + , "|d" + , "|}" + ) + , String_.Concat_lines_nl_skip_last + ( "

a" + , "

" + )); + fxt.Expd_tmpl_loop_count(2); + } } class Xop_popup_parser_fxt { private Xow_popup_parser parser; private Xow_wiki wiki; @@ -446,6 +463,7 @@ class Xop_popup_parser_fxt { public Xop_popup_parser_fxt Init_tmpl_tkn_max_(int v) {parser.Tmpl_tkn_max_(v); return this;} public Xop_popup_parser_fxt Init_fmtr_next_sect_(String v) {parser.Html_mkr().Fmtr_next_sect().Fmt_(v); return this;} public Xop_popup_parser_fxt Init_page(String ttl, String txt) {Xop_fxt.Init_page_create_static(wiki, ttl, txt); return this;} + public Xop_popup_parser_fxt Expd_tmpl_loop_count(int expd) {Tfds.Eq(expd, parser.Data().Tmpl_loop_count()); return this;} public Xop_popup_parser_fxt Test_ns_allowed(String raw, int... expd) { Int_obj_ref[] ids = Xow_popup_mgr.Ns_allowed_parse(wiki, Bry_.new_utf8_(raw)); Tfds.Eq_ary(expd, Int_obj_ref.Ary_xto_int_ary(ids)); diff --git a/400_xowa/src/gplx/xowa/html/portal/Xoa_available_wikis_mgr.java b/400_xowa/src/gplx/xowa/html/portal/Xoa_available_wikis_mgr.java index d59e430b8..05d602063 100644 --- a/400_xowa/src/gplx/xowa/html/portal/Xoa_available_wikis_mgr.java +++ b/400_xowa/src/gplx/xowa/html/portal/Xoa_available_wikis_mgr.java @@ -42,7 +42,7 @@ public class Xoa_available_wikis_mgr implements GfoInvkAble { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_itms_as_html)) return this.Itms_as_html(); else if (ctx.Match(k, Invk_itms_refresh)) Itms_refresh(); - else if (ctx.Match(k, Invk_visible)) return Yn.X_to_str(visible); + else if (ctx.Match(k, Invk_visible)) return Yn.Xto_str(visible); else if (ctx.Match(k, Invk_visible_)) visible = m.ReadYn("v"); else if (ctx.Match(k, Invk_visible_toggle)) {visible = !visible; app.Gui_mgr().Browser_win().Active_html_box().Html_js_eval_proc("xowa-portal-wikis-visible-toggle", Bool_.XtoStr_lower(visible));} else if (ctx.Match(k, Invk_itms_as_html_fmtr_)) itms_as_html_fmtr.Fmt_(m.ReadBry("v")); diff --git a/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java b/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java index f29edfb2f..0af5acc0e 100644 --- a/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java +++ b/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.html.portal; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.wikis.*; import gplx.xowa.gui.*; import gplx.xowa.html.sidebar.*; +import gplx.xowa.apis.xowa.html.*; import gplx.xowa.apis.xowa.html.skins.*; public class Xow_portal_mgr implements GfoInvkAble { public Xow_portal_mgr(Xow_wiki wiki) { this.wiki = wiki; @@ -26,6 +27,12 @@ public class Xow_portal_mgr implements GfoInvkAble { public void Init_by_lang(Xol_lang lang) { lang_is_rtl = !lang.Dir_ltr(); } + private Xoapi_skin_app_base api_skin; + public void Init_by_wiki(Xow_wiki wiki) { + Xoa_app app = wiki.App(); + Xoapi_skins skins = app.Api_root().Html().Skins(); + api_skin = app.Mode() == Xoa_app_.Mode_gui ? skins.Desktop() : skins.Server(); + } public Xowh_sidebar_mgr Sidebar_mgr() {return sidebar_mgr;} private Xowh_sidebar_mgr sidebar_mgr; public Bry_fmtr Div_home_fmtr() {return div_home_fmtr;} Bry_fmtr div_home_fmtr = Bry_fmtr.new_(""); public Xow_portal_mgr Init_assert() {if (init_needed) Init(); return this;} @@ -40,7 +47,7 @@ public class Xow_portal_mgr implements GfoInvkAble { byte[] wiki_user_name = wiki.User().Name(); div_personal_bry = Init_fmtr(tmp_bfr, eval_mgr, div_personal_fmtr, Bry_.Add(Xoh_href_parser.Href_wiki_bry, wiki.Ns_mgr().Ids_get_or_null(Xow_ns_.Id_user).Name_db_w_colon(), wiki_user_name), wiki_user_name, Ns_cls_by_id(wiki.Ns_mgr(), Xow_ns_.Id_user), Bry_.Add(Xoh_href_parser.Href_wiki_bry, wiki.Ns_mgr().Ids_get_or_null(Xow_ns_.Id_user_talk).Name_db_w_colon(), wiki_user_name), Ns_cls_by_id(wiki.Ns_mgr(), Xow_ns_.Id_user_talk)); byte[] main_page_href_bry = tmp_bfr.Add(Xoh_href_parser.Href_site_bry).Add(wiki.Domain_bry()).Add(Xoh_href_parser.Href_wiki_bry).XtoAryAndClear(); // NOTE: build /site/en.wikipedia.org/wiki/ href; no Main_Page, as that will be inserted by Xoh_href_parser - div_logo_bry = Init_fmtr(tmp_bfr, eval_mgr, div_logo_fmtr, main_page_href_bry, wiki.App().Url_converter_fsys().Encode_http(wiki.App().User().Fsys_mgr().Wiki_root_dir().GenSubFil_nest(wiki.Domain_str(), "html", "logo.png"))); + div_logo_bry = Init_fmtr(tmp_bfr, eval_mgr, div_logo_fmtr, main_page_href_bry, wiki.App().Encoder_mgr().Fsys().Encode_http(wiki.App().User().Fsys_mgr().Wiki_root_dir().GenSubFil_nest(wiki.Domain_str(), "html", "logo.png"))); div_home_bry = Init_fmtr(tmp_bfr, eval_mgr, div_home_fmtr); div_wikis_fmtr.Eval_mgr_(eval_mgr); tmp_bfr.Mkr_rls(); @@ -85,7 +92,7 @@ public class Xow_portal_mgr implements GfoInvkAble { return tmp_bfr.Mkr_rls().XtoAryAndClear(); } public static final byte[] Cls_selected_y = Bry_.new_ascii_("selected"), Cls_new = Bry_.new_ascii_("new"), Cls_display_none = Bry_.new_ascii_("xowa_display_none"); public byte[] Div_logo_bry() {return div_logo_bry;} private byte[] div_logo_bry = Bry_.Empty; - public byte[] Div_home_bry() {return div_home_bry;} private byte[] div_home_bry = Bry_.Empty; + public byte[] Div_home_bry() {return api_skin != null && api_skin.Sidebar_home_enabled() ? div_home_bry : Bry_.Empty;} private byte[] div_home_bry = Bry_.Empty; public byte[] Div_wikis_bry(Bry_bfr_mkr bfr_mkr) { Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); div_wikis_fmtr.Bld_bfr_many(tmp_bfr); diff --git a/400_xowa/src/gplx/xowa/html/sidebar/Xowh_sidebar_mgr.java b/400_xowa/src/gplx/xowa/html/sidebar/Xowh_sidebar_mgr.java index 59c1407a9..ffbec0559 100644 --- a/400_xowa/src/gplx/xowa/html/sidebar/Xowh_sidebar_mgr.java +++ b/400_xowa/src/gplx/xowa/html/sidebar/Xowh_sidebar_mgr.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html.sidebar; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +import gplx.xowa.langs.msgs.*; public class Xowh_sidebar_mgr implements GfoInvkAble { public Xowh_sidebar_mgr(Xow_wiki wiki) {this.wiki = wiki;} private Xow_wiki wiki; public int Grps_len() {return grps.Count();} ListAdp grps = ListAdp_.new_(); @@ -24,7 +25,7 @@ public class Xowh_sidebar_mgr implements GfoInvkAble { public void Init() { try { Bry_bfr bfr = wiki.Utl_bry_bfr_mkr().Get_b512(); - Xol_msg_itm sidebar_msg = Pf_msg_mgr.Get_msg_itm(bfr, wiki, wiki.Lang(), CONST_sidebar_ttl); + Xol_msg_itm sidebar_msg = Xol_msg_mgr_.Get_msg_itm(bfr, wiki, wiki.Lang(), CONST_sidebar_ttl); if ( sidebar_msg.Src() == Xol_msg_itm.Src_missing || ( sidebar_msg.Src() == Xol_msg_itm.Src_lang && wiki.Domain_tid() == gplx.xowa.wikis.Xow_wiki_domain_.Tid_home @@ -52,7 +53,7 @@ public class Xowh_sidebar_mgr implements GfoInvkAble { public void Parse(Bry_bfr bfr, Bry_bfr comment_bfr, byte[] src) { byte[][] lines = Bry_.Split(src, Byte_ascii.NewLine); int lines_len = lines.length; - Xoa_app app = wiki.App(); Url_encoder id_encoder = app.Url_converter_id(); + Xoa_app app = wiki.App(); Url_encoder id_encoder = app.Encoder_mgr().Id(); Xowh_sidebar_itm cur_grp = null; Xop_link_parser link_parser = new Xop_link_parser(); for (int i = 0; i < lines_len; i++) { diff --git a/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_mgr.java b/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_mgr.java index daf18c46c..87bcb99a9 100644 --- a/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_mgr.java +++ b/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_mgr.java @@ -43,11 +43,11 @@ public class Xoh_tidy_mgr implements GfoInvkAble { Tidy_unwrap(bfr); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_enabled)) return Yn.X_to_str(enabled); + if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(enabled); else if (ctx.Match(k, Invk_enabled_)) enabled = m.ReadYn("v"); else if (ctx.Match(k, Invk_enabled_toggle)) enabled = !enabled; - else if (ctx.Match(k, Invk_engine_type)) return Xoh_tidy_wkr_.X_to_key(wkr.Tid()); - else if (ctx.Match(k, Invk_engine_type_)) Wkr_tid_(Xoh_tidy_wkr_.X_to_tid(m.ReadStr("v"))); + else if (ctx.Match(k, Invk_engine_type)) return Xoh_tidy_wkr_.Xto_key(wkr.Tid()); + else if (ctx.Match(k, Invk_engine_type_)) Wkr_tid_(Xoh_tidy_wkr_.Xto_tid(m.ReadStr("v"))); else if (ctx.Match(k, Invk_engine_type_list)) return Xoh_tidy_wkr_.Options__list; else if (ctx.Match(k, Invk_lib)) return wkr_tidy; else return GfoInvkAble_.Rv_unhandled; diff --git a/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_wkr_.java b/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_wkr_.java index 528dc03ad..47357b969 100644 --- a/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_wkr_.java +++ b/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_wkr_.java @@ -20,7 +20,7 @@ public class Xoh_tidy_wkr_ { public static final byte Tid_null = 0, Tid_tidy = 1, Tid_jtidy = 2; public static final String Key_null = "null", Key_tidy = "tidy", Key_jtidy = "jtidy"; public static final Xoh_tidy_wkr Wkr_null = new Xoh_tidy_wkr_null(); - public static String X_to_key(byte v) { + public static String Xto_key(byte v) { switch (v) { case Tid_null: return Key_null; case Tid_tidy: return Key_tidy; @@ -28,7 +28,7 @@ public class Xoh_tidy_wkr_ { default: throw Err_.not_implemented_(); } } - public static byte X_to_tid(String s) { + public static byte Xto_tid(String s) { if (String_.Eq(s, Key_tidy)) return Tid_tidy; else if (String_.Eq(s, Key_jtidy)) return Tid_jtidy; else if (String_.Eq(s, Key_null)) return Tid_null; diff --git a/400_xowa/src/gplx/xowa/html/tocs/Xow_hdr_mgr.java b/400_xowa/src/gplx/xowa/html/tocs/Xow_hdr_mgr.java index 35645f460..5f4b23e31 100644 --- a/400_xowa/src/gplx/xowa/html/tocs/Xow_hdr_mgr.java +++ b/400_xowa/src/gplx/xowa/html/tocs/Xow_hdr_mgr.java @@ -61,7 +61,7 @@ public class Xow_hdr_mgr { Xoa_app app = wiki.App(); Bry_bfr raw_bfr = app.Utl_bry_bfr_mkr().Get_b128(), enc_bfr = app.Utl_bry_bfr_mkr().Get_b128(); Id_bld_recurse(raw_bfr, src, hdr); - Url_encoder encoder = wiki.App().Url_converter_id(); + Url_encoder encoder = wiki.App().Encoder_mgr().Id(); encoder.Encode(enc_bfr, raw_bfr.Bfr(), 0, raw_bfr.Len()); byte[] hdrs_id = enc_bfr.XtoAry(); Object o = hdrs_hash.Fetch(hdrs_ref.Val_(hdrs_id)); diff --git a/400_xowa/src/gplx/xowa/langs/durations/Xol_duration_itm_.java b/400_xowa/src/gplx/xowa/langs/durations/Xol_duration_itm_.java index 3e8362e01..a137ac368 100644 --- a/400_xowa/src/gplx/xowa/langs/durations/Xol_duration_itm_.java +++ b/400_xowa/src/gplx/xowa/langs/durations/Xol_duration_itm_.java @@ -56,7 +56,7 @@ public class Xol_duration_itm_ { , Itm_minutes , Itm_seconds }; - public static Xol_duration_itm[] X_to_itm_ary(KeyVal[] kv_ary) { + public static Xol_duration_itm[] Xto_itm_ary(KeyVal[] kv_ary) { if (kv_ary == null) return Xol_duration_itm_.Ary_default; ListAdp rv = ListAdp_.new_(); int len = kv_ary.length; diff --git a/400_xowa/src/gplx/xowa/langs/durations/Xol_interval_itm.java b/400_xowa/src/gplx/xowa/langs/durations/Xol_interval_itm.java index 0adea255e..18ed6b9ab 100644 --- a/400_xowa/src/gplx/xowa/langs/durations/Xol_interval_itm.java +++ b/400_xowa/src/gplx/xowa/langs/durations/Xol_interval_itm.java @@ -20,7 +20,7 @@ public class Xol_interval_itm { public Xol_interval_itm(Xol_duration_itm duration_itm, long val) {this.duration_itm = duration_itm; this.val = val;} public Xol_duration_itm Duration_itm() {return duration_itm;} private Xol_duration_itm duration_itm; public long Val() {return val;} private long val; - public static KeyVal[] X_to_kv_ary(Xol_interval_itm[] ary) { + public static KeyVal[] Xto_kv_ary(Xol_interval_itm[] ary) { int len = ary.length; KeyVal[] rv = new KeyVal[len]; for (int i = 0; i < len; i++) { diff --git a/400_xowa/src_530_pf_str/gplx/xowa/Pf_msg_mgr.java b/400_xowa/src/gplx/xowa/langs/msgs/Xol_msg_mgr_.java similarity index 96% rename from 400_xowa/src_530_pf_str/gplx/xowa/Pf_msg_mgr.java rename to 400_xowa/src/gplx/xowa/langs/msgs/Xol_msg_mgr_.java index e26d214fe..13b0ddc07 100644 --- a/400_xowa/src_530_pf_str/gplx/xowa/Pf_msg_mgr.java +++ b/400_xowa/src/gplx/xowa/langs/msgs/Xol_msg_mgr_.java @@ -15,9 +15,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; -import gplx.php.*; import gplx.xowa.langs.*; -public class Pf_msg_mgr { +package gplx.xowa.langs.msgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; +import gplx.php.*; +public class Xol_msg_mgr_ { // public static String Get_msg_val_gui_or_null(Xol_lang lang, byte[] pre, byte[] key, byte[] suf) { // String rv = Get_msg_val_gui_or_null(lang, pre, key, suf); // return rv == null ? "<" + String_.new_utf8_(Bry_.Add(pre, key, suf)) + ">" : rv; diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag.java index 43a8e894f..e5185af0c 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_flag.java @@ -39,7 +39,7 @@ class Xop_vnt_flag_ { , Tid_name = 10 // EX: -{N|zh-hans:A;zh-hant:B}- -> "" , Tid_lang = 11 // EX: -{zh-hant|B}- -> "B" ; - public static String X_to_name(byte tid) { + public static String Xto_name(byte tid) { switch (tid) { case Tid_unknown: return "unknown"; case Tid_show : return "show"; diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_lxr_tst.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_lxr_tst.java index aaca37298..ca9ad0459 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_lxr_tst.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_lxr_tst.java @@ -128,7 +128,7 @@ class Xop_vnt_lxr_fxt { if (itm_tid == Xop_vnt_flag_.Tid_lang) Vnt_flag_lang_to_bfr(bfr, itm); else - bfr.Add_str(Xop_vnt_flag_.X_to_name(itm_tid)).Add_byte(Byte_ascii.Semic); + bfr.Add_str(Xop_vnt_flag_.Xto_name(itm_tid)).Add_byte(Byte_ascii.Semic); } return bfr.XtoStrAndClear(); } diff --git a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr.java b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr.java index ddf0db6b1..5d7aac4bb 100644 --- a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_mgr.java @@ -94,7 +94,7 @@ public class Xop_amp_mgr { else if (b >= 65 && b <= 70) cur = b - 55; else if (b >= 97 && b <= 102) cur = b - 87; else if((b >= 71 && b <= 90) - || (b >= 91 && b <= 122)) continue; // NOTE: wiki discards letters G-Z; EX.WP:Miscellaneous_Symbols "{{Unicode|&#xx26D0;}}"; NOTE 2nd x is discarded + || (b >= 91 && b <= 122)) continue; // NOTE: wiki discards letters G-Z; PAGE:en.w:Miscellaneous_Symbols "{{Unicode|&#xx26D0;}}"; NOTE 2nd x is discarded else return false; } else { diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java index d9b140020..f40738c2b 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java @@ -67,7 +67,7 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr { Xop_tkn_itm link_tkn = root.Subs_get(i); tkn_idx = i; switch (link_tkn.Tkn_tid()) { -// case Xop_tkn_itm_.Tid_txt: return cur_pos; // REMOVED:2012-11-12: was causing [[http://a.org a]] [[http://b.org b]] to fail; EX.WP:Template:Infobox_country +// case Xop_tkn_itm_.Tid_txt: return cur_pos; // REMOVED:2012-11-12: was causing [[http://a.org a]] [[http://b.org b]] to fail; PAGE:en.w:Template:Infobox_country case Xop_tkn_itm_.Tid_space: case Xop_tkn_itm_.Tid_tab: break; } } diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_brack_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_brack_tst.java index d6ea0e6c3..b6f336ca7 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_brack_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_brack_tst.java @@ -60,4 +60,35 @@ public class Xop_lnke_wkr_brack_tst { ( "b C d" )); } + @Test public void Encode_xwiki() { // PURPOSE: href title and args should always be encoded; PAGE:en.w:List_of_Category_A_listed_buildings_in_West_Lothian DATE:2014-07-15 + fxt.App().User().Wiki().Xwiki_mgr().Add_full(Bry_.new_utf8_("commons.wikimedia.org"), Bry_.new_utf8_("commons.wikimedia.org")); + fxt.Test_parse_page_wiki_str // encode page + ( "[http://commons.wikimedia.org/%22%3E_A B]" + , "B" // '%22%3E' not '">' + ); + fxt.Test_parse_page_wiki_str // encode args + ( "[http://commons.wikimedia.org/A?b=%22%3E_C D]" + , "D" // '%22%3E' not '">' + ); + } + @Test public void Encode_basic() { // PURPOSE: counterpart to Encode_xwiki; DATE:2014-07-15 + fxt.Test_parse_page_wiki_str // encode page + ( "[http://a.org/%22%3E_A B]" + , "B" // '%22%3E' not '">' + ); + fxt.Test_parse_page_wiki_str // encode args + ( "[http://a.org/A?b=%22%3E_C D]" + , "D" // '%22%3E' not '">' + ); + } + @Test public void Encode_relative() { // PURPOSE: counterpart to Encode_xwiki; DATE:2014-07-15 + fxt.Test_parse_page_wiki_str // encode page + ( "[//a.org/%22%3E_A B]" + , "B" // '%22%3E' not '">' + ); + fxt.Test_parse_page_wiki_str // encode args + ( "[//a.org/A?b=%22%3E_C D]" + , "D" // '%22%3E' not '">' + ); + } } diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_text_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_text_tst.java index cdb8bc464..336060a3d 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_text_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_text_tst.java @@ -58,7 +58,7 @@ public class Xop_lnke_wkr_text_tst { , "" )); } - @Test public void Defect_reverse_caption_link() { // PURPOSE: bad lnke formatting (caption before link); ] should show up at end, but only [ shows up; EX.WP: Paul Philippoteaux; [caption http://www.americanheritage.com] + @Test public void Defect_reverse_caption_link() { // PURPOSE: bad lnke formatting (caption before link); ] should show up at end, but only [ shows up; PAGE:en.w:Paul Philippoteaux; [caption http://www.americanheritage.com] fxt.Test_parse_page_wiki_str("[caption irc://a]", "[caption irc://a]"); } @Test public void Lnki() { // PURPOSE: trailing lnki should not get absorbed into lnke; DATE:2014-07-11 diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_uncommon_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_uncommon_tst.java index e7cbd6f9d..7d5e8078a 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_uncommon_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_uncommon_tst.java @@ -39,7 +39,7 @@ public class Xop_lnke_wkr_uncommon_tst { , fxt.tkn_txt_(14, 15) ); } - @Test public void Defect_2nd_consecutive_lnke() { // PURPOSE: bad code that was causing lnkes to show up; EX.WP:Template:Infobox_country; + @Test public void Defect_2nd_consecutive_lnke() { // PURPOSE: bad code that was causing lnkes to show up; PAGE:en.w:Template:Infobox_country; fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last ( "[[http://a.org a]] [[http://b.org b]]" ), String_.Concat_lines_nl_skip_last diff --git a/400_xowa/src/gplx/xowa/servers/http/File_retrieve_mode.java b/400_xowa/src/gplx/xowa/servers/http/File_retrieve_mode.java index 1fdd2a190..fcd374bca 100644 --- a/400_xowa/src/gplx/xowa/servers/http/File_retrieve_mode.java +++ b/400_xowa/src/gplx/xowa/servers/http/File_retrieve_mode.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.servers.http; import gplx.*; import gplx.xowa.*; import gplx.xowa.servers.*; class File_retrieve_mode { - public static String X_to_str(byte v) { + public static String Xto_str(byte v) { switch (v) { case Mode_skip: return "skip"; case Mode_wait: return "wait"; @@ -25,7 +25,7 @@ class File_retrieve_mode { default: throw Err_.not_implemented_(); } } - public static byte X_to_byte(String s) { + public static byte Xto_byte(String s) { if (String_.Eq(s, "skip")) return Mode_skip; else if (String_.Eq(s, "wait")) return Mode_wait; else if (String_.Eq(s, "async_server")) return Mode_async_server; diff --git a/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java b/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java index 03677f9d9..09cbb1f6c 100644 --- a/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java +++ b/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java @@ -132,10 +132,10 @@ public class Http_server_mgr implements GfoInvkAble { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_port)) return port; else if (ctx.Match(k, Invk_port_)) Port_(m.ReadInt("v")); - else if (ctx.Match(k, Invk_running)) return Yn.X_to_str(running); + else if (ctx.Match(k, Invk_running)) return Yn.Xto_str(running); else if (ctx.Match(k, Invk_running_)) Running_(m.ReadYn("v")); - else if (ctx.Match(k, Invk_retrieve_mode)) return File_retrieve_mode.X_to_str(retrieve_mode); - else if (ctx.Match(k, Invk_retrieve_mode_)) retrieve_mode = File_retrieve_mode.X_to_byte(m.ReadStr("v")); + else if (ctx.Match(k, Invk_retrieve_mode)) return File_retrieve_mode.Xto_str(retrieve_mode); + else if (ctx.Match(k, Invk_retrieve_mode_)) retrieve_mode = File_retrieve_mode.Xto_byte(m.ReadStr("v")); else if (ctx.Match(k, Invk_retrieve_mode_list)) return File_retrieve_mode.Options__list; else return GfoInvkAble_.Rv_unhandled; return this; diff --git a/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_msg_rdr.java b/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_msg_rdr.java index 3cbf01c30..0eb9fdb76 100644 --- a/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_msg_rdr.java +++ b/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_msg_rdr.java @@ -27,8 +27,8 @@ public class Xosrv_msg_rdr { else return Xosrv_msg.fail_("header is invalid; hdr:{0}", String_.new_utf8_(header_bry, 0, bytes_read)); } byte version = header_bry[0]; if (version != Byte_ascii.Num_0) return Xosrv_msg.fail_("version must be 0; version:{0}", Byte_.XtoStr(version)); - int body_len = Bry_.X_to_int_or(header_bry, 2, 12, -1); if (body_len == -1) return Xosrv_msg.fail_("body_len is not number; body_len:{0}", String_.new_utf8_(header_bry, 2, 23)); - int cksum = Bry_.X_to_int_or(header_bry, 13, 23, -1); if (cksum == -1) return Xosrv_msg.fail_("checksum is not number; cksum:{0}", String_.new_utf8_(header_bry, 13, 23)); + int body_len = Bry_.Xto_int_or(header_bry, 2, 12, -1); if (body_len == -1) return Xosrv_msg.fail_("body_len is not number; body_len:{0}", String_.new_utf8_(header_bry, 2, 23)); + int cksum = Bry_.Xto_int_or(header_bry, 13, 23, -1); if (cksum == -1) return Xosrv_msg.fail_("checksum is not number; cksum:{0}", String_.new_utf8_(header_bry, 13, 23)); if (!Chk_bytes(header_bry, Byte_ascii.Pipe, 1, 12, 23)) return Xosrv_msg.fail_("message should be delimited by pipes at 1, 12 and 23; message:{0}", String_.new_utf8_(header_bry, 0, 24)); if (cksum != (body_len * 2) + 1) return Xosrv_msg.fail_("checksum failed; body_len:{0} chksum:{1}", body_len, cksum); byte[] body_bry = body_len > default_body_bry_len ? new byte[body_len] : default_body_bry; diff --git a/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_server.java b/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_server.java index c0c27291a..c74ac33bf 100644 --- a/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_server.java +++ b/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_server.java @@ -65,7 +65,7 @@ public class Xosrv_server implements GfoInvkAble { } private String Exec_cmd(String msg_text) { Object rv_obj = app.Gfs_mgr().Run_str(msg_text); - String rv = ClassAdp_.Eq_typeSafe(rv_obj, String_.ClassOf) ? (String)rv_obj : Object_.XtoStr_OrNull(rv_obj); + String rv = ClassAdp_.Eq_typeSafe(rv_obj, String_.ClassOf) ? (String)rv_obj : Object_.Xto_str_strict_or_null(rv_obj); return rv; } public String Exec_js(byte[] sender, byte[] msg_text) { @@ -76,7 +76,7 @@ public class Xosrv_server implements GfoInvkAble { // xowa_exec_args = (Object[])Array_.Resize(xowa_exec_args, xowa_exec_args.length + 1); // xowa_exec_args[xowa_exec_args.length - 1] = sender; Object rv_obj = gplx.gfui.Gfui_html.Js_args_exec(app.Gui_mgr().Browser_win().Active_html_itm().Js_cbk(), xowa_exec_args); - trace.Val_("json_write: " + Object_.XtoStr_OrNullStr(rv_obj)); + trace.Val_("json_write: " + Object_.Xto_str_strict_or_null_mark(rv_obj)); return json_wtr.Write_root(Bry_xowa_js_result, rv_obj).Bld_as_str(); } catch (Exception e) {throw Err_.err_(e, "exec_js error: {0} {1} {2}", trace, msg_text, Err_.Message_gplx(e));} } private Xosrv_xowa_exec_parser xowa_exec_parser = new Xosrv_xowa_exec_parser(); private Json_doc_srl json_wtr = new Json_doc_srl(); private static final byte[] Bry_xowa_js_result = Bry_.new_ascii_("xowa_js_result"); diff --git a/400_xowa/src/gplx/xowa/setup/maints/Wmf_dump_list_parser_tst.java b/400_xowa/src/gplx/xowa/setup/maints/Wmf_dump_list_parser_tst.java index a3d039df0..27949a8e3 100644 --- a/400_xowa/src/gplx/xowa/setup/maints/Wmf_dump_list_parser_tst.java +++ b/400_xowa/src/gplx/xowa/setup/maints/Wmf_dump_list_parser_tst.java @@ -62,7 +62,7 @@ public class Wmf_dump_list_parser_tst { // if (Bry_finder.Find_fwd(domain_bry, Bry_.new_ascii_("wikimania")) != Bry_.NotFound) continue; // if (excluded_domains.Has(domain_bry)) continue; // Xow_wiki_domain domain_itm = Xow_wiki_domain_.parse_by_domain(domain_bry); -// byte[] tid_name = X_to_display_name(Xow_wiki_domain_.Key_by_tid(domain_itm.Tid())); +// byte[] tid_name = Xto_display_name(Xow_wiki_domain_.Key_by_tid(domain_itm.Tid())); // sql_bfr // .Add_byte(Byte_ascii.Paren_bgn) // .Add_int_variable(counter++) @@ -94,7 +94,7 @@ public class Wmf_dump_list_parser_tst { // Io_mgr._.SaveFilBfr(temp, sql_bfr); //// Io_mgr._.AppendFilBfr(temp, bld_bfr); // } -// private static byte[] X_to_display_name(byte[] v) { +// private static byte[] Xto_display_name(byte[] v) { // if (Bry_.Eq(v, Xow_wiki_domain_.Key_wikimediafoundation_bry)) return Bry_.new_ascii_("Wikimedia Foundation"); // else if (Bry_.Eq(v, Xow_wiki_domain_.Key_species_bry)) return Bry_.new_ascii_("Wikispecies"); // else if (Bry_.Eq(v, Xow_wiki_domain_.Key_mediawiki_bry)) return Bry_.new_ascii_("MediaWiki"); diff --git a/400_xowa/src/gplx/xowa/setup/maints/Xow_maint_mgr.java b/400_xowa/src/gplx/xowa/setup/maints/Xow_maint_mgr.java index 31b74173f..a284a7938 100644 --- a/400_xowa/src/gplx/xowa/setup/maints/Xow_maint_mgr.java +++ b/400_xowa/src/gplx/xowa/setup/maints/Xow_maint_mgr.java @@ -39,13 +39,13 @@ public class Xow_maint_mgr implements GfoInvkAble { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_wmf_dump_date)) return DateAdp_.Xto_str_fmt_or(Wmf_dump_date(), "yyyy-MM-dd", ""); else if (ctx.Match(k, Invk_wmf_dump_date_)) Wmf_dump_date_(m.ReadDate("v")); - else if (ctx.Match(k, Invk_wmf_dump_done)) return Yn.X_to_str(wmf_dump_done); + else if (ctx.Match(k, Invk_wmf_dump_done)) return Yn.Xto_str(wmf_dump_done); else if (ctx.Match(k, Invk_wmf_dump_done_)) wmf_dump_done = m.ReadYn("v"); else if (ctx.Match(k, Invk_wmf_dump_status)) return String_.new_utf8_(wmf_dump_status); else if (ctx.Match(k, Invk_wmf_dump_status_)) wmf_dump_status = m.ReadBry("v"); else if (ctx.Match(k, Invk_wiki_dump_date)) return DateAdp_.Xto_str_fmt_or(Wiki_dump_date(), "yyyy-MM-dd", ""); else if (ctx.Match(k, Invk_wiki_dump_date_)) wiki_dump_date = m.ReadDate("v"); - else if (ctx.Match(k, Invk_wiki_update_needed)) return Yn.X_to_str(Wiki_update_needed()); + else if (ctx.Match(k, Invk_wiki_update_needed)) return Yn.Xto_str(Wiki_update_needed()); else if (ctx.Match(k, Invk_wiki_dump_date_)) wiki_dump_date = m.ReadDate("v"); else return GfoInvkAble_.Rv_unhandled; return this; diff --git a/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages.java b/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages.java index cf313ba05..9c9b4898b 100644 --- a/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages.java +++ b/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages.java @@ -85,7 +85,7 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page init_ns = wiki.Ns_mgr().Ns_main(); arg_hash.Load(url); byte[] from_val = Get_from(arg_hash, wiki, url, ttl); if (from_val == null) return false; - from_val = wiki.App().Url_converter_id().Decode(from_val); + from_val = wiki.App().Encoder_mgr().Id().Decode(from_val); int ns_val = arg_hash.Get_val_int_or(Bry_arg_ns, init_ns.Id()); init_ns = wiki.Ns_mgr().Ids_get_or_null(ns_val); boolean hide_redirects_val = arg_hash.Get_val_int_or(Bry_arg_hideredirects, 0) == 1; for (int i = 0; i < itms_per_page; i++) @@ -130,7 +130,7 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page Bry_bfr tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_b512().Mkr_rls(); byte[] lbl_text = msg_itm.Fmt(tmp_bfr, ttl.Full_txt()); byte[] args__rest = arg_hash.Concat(tmp_bfr, Bry_arg_ns, Bry_arg_hideredirects); - byte[] arg_from = wiki.App().Url_converter_id().Encode(ttl.Page_txt_wo_qargs()); + byte[] arg_from = wiki.App().Encoder_mgr().Id().Encode(ttl.Page_txt_wo_qargs()); return html_list_end.Bld_bry_many(bfr, arg_from, args__rest, lbl_text); } public static Xoa_ttl ttl_(Xow_wiki wiki, Xow_ns ns, Xodb_page itm) { diff --git a/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java b/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java index 66463e4dd..842710163 100644 --- a/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java +++ b/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java @@ -154,9 +154,9 @@ class Move_url_args { switch (((Byte_obj_val)tid_obj).Val()) { case Key_submitted: submitted = true; break; // wpMove will only be in query_args if move button is pressed case Key_src_ttl: src_ttl = val_bry; break; - case Key_trg_ns: trg_ns = Bry_.X_to_int_or_fail(val_bry); break; + case Key_trg_ns: trg_ns = Bry_.Xto_int_or_fail(val_bry); break; case Key_trg_ttl: trg_ttl = val_bry; break; - case Key_create_redirect: create_redirect = Bry_.X_to_bool_by_int_or_fail(val_bry); break; + case Key_create_redirect: create_redirect = Bry_.Xto_bool_by_int_or_fail(val_bry); break; } } } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java index eb0ef92ae..329f52d83 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java @@ -96,7 +96,7 @@ public class Xog_search_suggest_mgr implements GfoInvkAble { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_search_async)) Search_async(); else if (ctx.Match(k, Invk_notify)) Notify(); - else if (ctx.Match(k, Invk_enabled)) return Yn.X_to_str(enabled); + else if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(enabled); else if (ctx.Match(k, Invk_enabled_)) enabled = m.ReadYn("v"); else if (ctx.Match(k, Invk_results_max)) return results_max; else if (ctx.Match(k, Invk_results_max_)) results_max = m.ReadInt("v"); @@ -107,9 +107,9 @@ public class Xog_search_suggest_mgr implements GfoInvkAble { else if (ctx.Match(k, Invk_all_pages_extend_)) all_pages_extend = m.ReadInt("v"); else if (ctx.Match(k, Invk_all_pages_min)) return all_pages_min; else if (ctx.Match(k, Invk_all_pages_min_)) all_pages_min = m.ReadInt("v"); - else if (ctx.Match(k, Invk_auto_wildcard)) return Yn.X_to_str(auto_wildcard); + else if (ctx.Match(k, Invk_auto_wildcard)) return Yn.Xto_str(auto_wildcard); else if (ctx.Match(k, Invk_auto_wildcard_)) auto_wildcard = m.ReadYn("v"); - else if (ctx.Match(k, Invk_log_enabled)) return Yn.X_to_str(log_enabled); + else if (ctx.Match(k, Invk_log_enabled)) return Yn.Xto_str(log_enabled); else if (ctx.Match(k, Invk_log_enabled_)) log_enabled = m.ReadYn("v"); else if (ctx.Match(k, Invk_args_default)) return args_default_str; else if (ctx.Match(k, Invk_args_default_)) Args_default_str_(m.ReadStr("v")); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java index 4e854f213..729e76d51 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java @@ -107,7 +107,7 @@ class Xosrh_args_mgr { if (tid != null) { switch (((Byte_obj_val)tid).Val()) { case Arg_search: search_bry = Bry_.Replace(arg.Val_bry(), Byte_ascii.Plus, Byte_ascii.Space); break; - case Arg_page_idx: page_idx = Bry_.X_to_int_or(arg.Val_bry(), 0); break; + case Arg_page_idx: page_idx = Bry_.Xto_int_or(arg.Val_bry(), 0); break; case Arg_sort: sort_tid = Xosrh_rslt_itm_sorter.parse_(String_.new_ascii_(arg.Val_bry())); break; default: break; } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_ns_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_ns_mgr.java index 725f3b712..d1003be6b 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_ns_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_ns_mgr.java @@ -45,13 +45,13 @@ public class Xosrh_ns_mgr { ns_all = true; } public void Add_by_parse(byte[] key, byte[] val) { - int ns_enabled = Bry_.X_to_int(val); + int ns_enabled = Bry_.Xto_int(val); if (ns_enabled == 1) { // make sure set to 1; EX: ignore &ns0=0 int key_len = key.length; if (key_len == 3 && key[2] == Byte_ascii.Asterisk) // translate ns* as ns_all ns_all = true; else { - int ns_id = Bry_.X_to_int_or(key, 2, key_len, -1); + int ns_id = Bry_.Xto_int_or(key, 2, key_len, -1); if (ns_id != -1) { // ignore invalid ints; EX: &nsabc=1; Add_by_id(ns_id); ns_main = ns_all = false; diff --git a/400_xowa/src/gplx/xowa/urls/encoders/Url_encoder_mgr.java b/400_xowa/src/gplx/xowa/urls/encoders/Url_encoder_mgr.java new file mode 100644 index 000000000..bd43529b3 --- /dev/null +++ b/400_xowa/src/gplx/xowa/urls/encoders/Url_encoder_mgr.java @@ -0,0 +1,29 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.urls.encoders; import gplx.*; import gplx.xowa.*; import gplx.xowa.urls.*; +public class Url_encoder_mgr { + public Url_encoder Id() {return id;} private Url_encoder id = Url_encoder.new_html_id_(); + public Url_encoder Url() {return url;} private Url_encoder url = Url_encoder.new_http_url_(); + public Url_encoder Url_ttl() {return url_ttl;} private Url_encoder url_ttl = Url_encoder.new_http_url_ttl_(); + public Url_encoder Href() {return href;} private Url_encoder href = Url_encoder.new_html_href_mw_(); + public Url_encoder Href_quotes() {return href_quotes;} private Url_encoder href_quotes = Url_encoder.new_html_href_quotes_(); + public Url_encoder Comma() {return comma;} private Url_encoder comma = Url_encoder.url_comma(); + public Url_encoder Gfs() {return gfs;} private Url_encoder gfs = Url_encoder.new_gfs_(); + public Url_encoder Fsys() {return fsys;} private Url_encoder fsys = Url_encoder.new_fsys_lnx_(); + public Url_encoder Fsys_safe() {return fsys_safe;} private Url_encoder fsys_safe = Url_encoder.new_fsys_wnt_(); +} diff --git a/400_xowa/src/gplx/xowa/users/Xou_log_mgr.java b/400_xowa/src/gplx/xowa/users/Xou_log_mgr.java index 08d7da167..d07b66d60 100644 --- a/400_xowa/src/gplx/xowa/users/Xou_log_mgr.java +++ b/400_xowa/src/gplx/xowa/users/Xou_log_mgr.java @@ -19,7 +19,7 @@ package gplx.xowa.users; import gplx.*; import gplx.xowa.*; public class Xou_log_mgr implements GfoInvkAble { public boolean Log_redlinks() {return log_redlinks;} private boolean log_redlinks; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_log_redlinks)) return Yn.X_to_str(log_redlinks); + if (ctx.Match(k, Invk_log_redlinks)) return Yn.Xto_str(log_redlinks); else if (ctx.Match(k, Invk_log_redlinks_)) log_redlinks = m.ReadYn("v"); return this; } diff --git a/400_xowa/src/gplx/xowa/users/Xou_security_mgr.java b/400_xowa/src/gplx/xowa/users/Xou_security_mgr.java index 2d573039f..b4c3bc1cd 100644 --- a/400_xowa/src/gplx/xowa/users/Xou_security_mgr.java +++ b/400_xowa/src/gplx/xowa/users/Xou_security_mgr.java @@ -21,7 +21,7 @@ public class Xou_security_mgr implements GfoInvkAble { public boolean Web_access_enabled() {return app.Api_root().Net().Enabled();} public void Web_access_enabled_(boolean v) {app.Api_root().Net().Enabled_(v);} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_web_access_enabled)) return Yn.X_to_str(this.Web_access_enabled()); + if (ctx.Match(k, Invk_web_access_enabled)) return Yn.Xto_str(this.Web_access_enabled()); else if (ctx.Match(k, Invk_web_access_enabled_)) Web_access_enabled_(m.ReadYn("v")); return this; } diff --git a/400_xowa/src/gplx/xowa/users/Xouc_window_mgr.java b/400_xowa/src/gplx/xowa/users/Xouc_window_mgr.java index 476ae1266..14cbb99b5 100644 --- a/400_xowa/src/gplx/xowa/users/Xouc_window_mgr.java +++ b/400_xowa/src/gplx/xowa/users/Xouc_window_mgr.java @@ -30,7 +30,7 @@ public class Xouc_window_mgr implements GfoInvkAble { else if (ctx.Match(k, Invk_mode_list)) return Options_mode_list; else if (ctx.Match(k, Invk_rect)) return rect; else if (ctx.Match(k, Invk_rect_)) rect = Rect_ref.parse_(m.ReadStr("v")); - else if (ctx.Match(k, Invk_safe_mode)) return Yn.X_to_str(safe_mode); + else if (ctx.Match(k, Invk_safe_mode)) return Yn.Xto_str(safe_mode); else if (ctx.Match(k, Invk_safe_mode_)) safe_mode = m.ReadYn("v"); else if (ctx.Match(k, Invk_previous_adj)) return previous_adj; else if (ctx.Match(k, Invk_previous_adj_)) previous_adj = Rect_ref.parse_(m.ReadStr("v")); diff --git a/400_xowa/src/gplx/xowa/users/Xous_window_mgr.java b/400_xowa/src/gplx/xowa/users/Xous_window_mgr.java index 6045b0ef8..19b093925 100644 --- a/400_xowa/src/gplx/xowa/users/Xous_window_mgr.java +++ b/400_xowa/src/gplx/xowa/users/Xous_window_mgr.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.users; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.views.*; +import gplx.xowa.apis.xowa.startups.tabs.*; public class Xous_window_mgr implements GfoInvkAble { public Xous_window_mgr(Xou_user user) { this.user = user; @@ -27,16 +28,30 @@ public class Xous_window_mgr implements GfoInvkAble { public void Save_window(gplx.gfui.GfuiWin win) { gplx.xowa.cfgs.Xoa_cfg_mgr cfg_mgr = user.App().Cfg_mgr(); if (user.Cfg_mgr().Startup_mgr().Window_mgr().Mode_tid() == Xouc_window_mgr.Mode_tid_previous) { - cfg_mgr.Set_by_app("app.user.session.window.maximized" , Yn.X_to_str(win.Maximized())); + cfg_mgr.Set_by_app("app.user.session.window.maximized" , Yn.Xto_str(win.Maximized())); cfg_mgr.Set_by_app("app.user.session.window.rect" , win.Rect().Xto_str()); } - cfg_mgr.Set_by_app("app.gui.html.portal.wikis.visible" , Yn.X_to_str(user.App().Gui_mgr().Html_mgr().Portal_mgr().Wikis().Visible())); + Xoapi_startup_tabs startup_tabs = user.App().Api_root().App().Startup().Tabs(); + if (startup_tabs.Type() == Xoapi_startup_tabs_tid_.Tid_previous) { + cfg_mgr.Set_by_app("xowa.api.app.startup.tabs.previous" , Calc_previous_tabs(user.App().Gui_mgr().Browser_win().Tab_mgr())); + } + cfg_mgr.Set_by_app("app.gui.html.portal.wikis.visible" , Yn.Xto_str(user.App().Gui_mgr().Html_mgr().Portal_mgr().Wikis().Visible())); cfg_mgr.Db_save_txt(); } + private String Calc_previous_tabs(Xog_tab_mgr tab_mgr) { + Bry_bfr bfr = Bry_bfr.new_(); + int len = tab_mgr.Tabs_len(); + for (int i = 0; i < len; ++i) { + if (i != 0) bfr.Add_byte_nl(); + Xog_tab_itm tab = tab_mgr.Tabs_get_at(i); + bfr.Add_str(tab.Page().Url().Xto_full_str_safe()); + } + return bfr.XtoStrAndClear(); + } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_rect)) return rect; else if (ctx.Match(k, Invk_rect_)) rect = Rect_ref.parse_(m.ReadStr("v")); - else if (ctx.Match(k, Invk_maximized)) return Yn.X_to_str(maximized); + else if (ctx.Match(k, Invk_maximized)) return Yn.Xto_str(maximized); else if (ctx.Match(k, Invk_maximized_)) maximized = m.ReadYn("v"); return this; } public static final String Invk_rect = "rect", Invk_rect_ = "rect_", Invk_maximized = "maximized", Invk_maximized_ = "maximized_"; diff --git a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr.java b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr.java index ee0a59430..4203756de 100644 --- a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr.java +++ b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr.java @@ -102,7 +102,7 @@ public class Xou_history_mgr implements GfoInvkAble {// app.user.history return current_itms; } int current_itms_max = 512, current_itms_reset = 256; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { -// if (ctx.Match(k, Invk_enabled)) return Yn.X_to_str(enabled); +// if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(enabled); // else if (ctx.Match(k, Invk_enabled_)) enabled = m.ReadBool("v"); if (ctx.Match(k, Invk_html_grp)) return String_.new_utf8_(html_mgr.Html_grp().Fmt()); else if (ctx.Match(k, Invk_html_grp_)) html_mgr.Html_grp().Fmt_(m.ReadBry("v")); diff --git a/400_xowa/src/gplx/xowa/users/prefs/Prefs_html_wtr.java b/400_xowa/src/gplx/xowa/users/prefs/Prefs_html_wtr.java index 62d00c111..59a57bdda 100644 --- a/400_xowa/src/gplx/xowa/users/prefs/Prefs_html_wtr.java +++ b/400_xowa/src/gplx/xowa/users/prefs/Prefs_html_wtr.java @@ -40,7 +40,7 @@ class Prefs_html_wtr { private void Write_textarea(Bry_bfr bfr, Html_nde hnde, int prop_idx, Object prop_val) { Write__id(bfr, prop_idx); // " id='xowa_prop_123'" Write__nde_end(bfr); // ">" - bfr.Add(Html_utl.Escape_html_as_bry(Bry_.new_utf8_(Object_.XtoStr_OrEmpty(prop_val)))); + bfr.Add(Html_utl.Escape_html_as_bry(Bry_.new_utf8_(Object_.Xto_str_strict_or_empty(prop_val)))); // "abcde" } private void Write_checkbox(Bry_bfr bfr, Html_nde hnde, int prop_idx, Object prop_val) { @@ -61,7 +61,7 @@ class Prefs_html_wtr { bfr.Add(Nde_stub_option_bgn); // "
earlier; EX:w:Atlanta_Olympics; DATE:2014-03-18 diff --git a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_double_pipe_tst.java b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__double_pipe_tst.java similarity index 96% rename from 400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_double_pipe_tst.java rename to 400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__double_pipe_tst.java index 6afc9d9ed..c91afe054 100644 --- a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_double_pipe_tst.java +++ b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__double_pipe_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import org.junit.*; -public class Xop_tblw_wkr_double_pipe_tst { +public class Xop_tblw_wkr__double_pipe_tst { @Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private Xop_fxt fxt = new Xop_fxt(); @After public void term() {fxt.Init_para_n_();} @Test public void No_tblw() { // PURPOSE: if || has no tblw, treat as lnki; none; DATE:2014-05-06 diff --git a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__errs_tst.java b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__errs_tst.java new file mode 100644 index 000000000..266dc19e2 --- /dev/null +++ b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__errs_tst.java @@ -0,0 +1,94 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa; import gplx.*; +import org.junit.*; +public class Xop_tblw_wkr__errs_tst { + private Xop_fxt fxt = new Xop_fxt(); + @Test public void Err_row_empty() { + fxt.Test_parse_page_wiki("{|\n|-\n|-\n|a\n|}" + , fxt.tkn_tblw_tb_(0, 14).Subs_ + ( fxt.tkn_tblw_tr_(2, 5) + , fxt.tkn_tblw_tr_(5, 11).Subs_ + ( fxt.tkn_tblw_td_(8, 11).Subs_(fxt.tkn_txt_(10, 11), fxt.tkn_para_blank_(12)) + )) + ); + } + @Test public void Err_row_trailing() { + fxt.Test_parse_page_wiki("{|\n|-\n|a\n|-\n|}" + , fxt.tkn_tblw_tb_(0, 14).Subs_ + ( fxt.tkn_tblw_tr_(2, 8).Subs_ + ( fxt.tkn_tblw_td_(5, 8).Subs_(fxt.tkn_txt_(7, 8), fxt.tkn_para_blank_(9)) + )) + ); + } + @Test public void Err_caption_after_tr() { + fxt.Test_parse_page_wiki("{|\n|-\n|+a\n|}" + , fxt.tkn_tblw_tb_(0, 12).Caption_count_(1).Subs_ + ( fxt.tkn_tblw_tr_(2, 5) + , fxt.tkn_tblw_tc_(5, 9).Subs_(fxt.tkn_txt_(8, 9), fxt.tkn_para_blank_(10))) + ); + } + @Test public void Err_caption_after_td() { + fxt.Init_log_(Xop_tblw_log.Caption_after_td).Test_parse_page_wiki("{|\n|-\n|a\n|+b\n|}" + , fxt.tkn_tblw_tb_(0, 15).Caption_count_(1).Subs_ + ( fxt.tkn_tblw_tr_(2, 8).Subs_ + ( fxt.tkn_tblw_td_(5, 8).Subs_(fxt.tkn_txt_(7, 8))) + , fxt.tkn_tblw_tc_(8, 12).Subs_(fxt.tkn_txt_(11, 12), fxt.tkn_para_blank_(13))) + ); + } + @Test public void Err_caption_after_tc() { + fxt.Init_log_(Xop_tblw_log.Caption_after_tc).Test_parse_page_wiki("{|\n|+a\n|+b\n|}" + , fxt.tkn_tblw_tb_(0, 13).Caption_count_(2).Subs_ + ( fxt.tkn_tblw_tc_(2, 6).Subs_(fxt.tkn_txt_( 5, 6)) + , fxt.tkn_tblw_tc_(6, 10).Subs_(fxt.tkn_txt_( 9, 10), fxt.tkn_para_blank_(11))) + ); + } + @Test public void Err_row_auto_opened() { + fxt.Test_parse_page_wiki("{|\n|a\n|}" + , fxt.tkn_tblw_tb_(0, 8).Subs_ + ( fxt.tkn_tblw_tr_(2, 5).Subs_ + ( fxt.tkn_tblw_td_(2, 5).Subs_(fxt.tkn_txt_(4, 5), fxt.tkn_para_blank_(6)) + ))); + } + @Test public void Err_caption_auto_closed() { + fxt.Test_parse_page_wiki("{|\n|+a\n|b\n|}" + , fxt.tkn_tblw_tb_(0, 12).Caption_count_(1).Subs_ + ( fxt.tkn_tblw_tc_(2, 6).Subs_(fxt.tkn_txt_(5, 6)) + , fxt.tkn_tblw_tr_(6, 9).Subs_ + ( fxt.tkn_tblw_td_(6, 9).Subs_(fxt.tkn_txt_(8, 9),fxt.tkn_para_blank_(10)) + ))); + } + @Test public void Err_Atrs_dumped_into_text() { // PURPOSE: [[Prawn]] and {{Taxobox}} was dumping text + fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last + ( "{|" + , "|-" + , "|-id='a'" + , "|b" + , "|}" + ) , String_.Concat_lines_nl_skip_last + ( "" + , " " + , " " + , " " + , "
b" + , "
" + , "" + ) + ); + } +} \ No newline at end of file diff --git a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_nested_tst.java b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__nested_tst.java similarity index 95% rename from 400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_nested_tst.java rename to 400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__nested_tst.java index 77d32d374..3e78ec136 100644 --- a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_nested_tst.java +++ b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__nested_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import org.junit.*; -public class Xop_tblw_wkr_nested_tst { +public class Xop_tblw_wkr__nested_tst { private Xop_fxt fxt = new Xop_fxt(); @Test public void Basic() { fxt.Test_parse_page_wiki(String_.Concat_lines_nl_skip_last diff --git a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_para_tst.java b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__para_tst.java similarity index 94% rename from 400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_para_tst.java rename to 400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__para_tst.java index c94cc25b9..ec02789f2 100644 --- a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_para_tst.java +++ b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__para_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import org.junit.*; -public class Xop_tblw_wkr_para_tst { +public class Xop_tblw_wkr__para_tst { @Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private Xop_fxt fxt = new Xop_fxt(); @After public void term() {fxt.Init_para_n_();} @Test public void Para() { // PURPOSE: para causing strange breaks; SEE:[[John F. Kennedy]] and "two Supreme Court appointments" @@ -90,7 +90,7 @@ public class Xop_tblw_wkr_para_tst { ) ); } - @Test public void Ws_leading() { // EX.WP: AGPLv3 + @Test public void Ws_leading() { // PAGE:en.w:AGPLv3 fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last ( "{|" , " !a" diff --git a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_tblx_tst.java b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__tblx_tst.java similarity index 95% rename from 400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_tblx_tst.java rename to 400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__tblx_tst.java index c6a2bfcca..4d80c8254 100644 --- a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_tblx_tst.java +++ b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__tblx_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import org.junit.*; -public class Xop_tblw_wkr_tblx_tst { +public class Xop_tblw_wkr__tblx_tst { @Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private Xop_fxt fxt = new Xop_fxt(); @After public void term() {fxt.Init_para_n_();} @Test public void Ignore_td() { // PURPOSE: do not parse pipe as td if in ; EX:ru.w:Сочи; DATE:2014-02-22 diff --git a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_uncommon_tst.java b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__uncommon_tst.java similarity index 95% rename from 400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_uncommon_tst.java rename to 400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__uncommon_tst.java index 35f282e62..d1500e1ed 100644 --- a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr_uncommon_tst.java +++ b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__uncommon_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import org.junit.*; -public class Xop_tblw_wkr_uncommon_tst { +public class Xop_tblw_wkr__uncommon_tst { @Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private Xop_fxt fxt = new Xop_fxt(); @After public void term() {fxt.Init_para_n_();} @Test public void Tr_pops_entire_stack() { // PURPOSE: in strange cases, tr will pop entire stack; EX:en.w:Turks_in_Denmark; DATE:2014-03-02 diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xatr_itm.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xatr_itm.java index 0c3b2402d..79f73628b 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xatr_itm.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xatr_itm.java @@ -36,7 +36,7 @@ public class Xop_xatr_itm { public byte Quote_byte() {return quote_byte;} private byte quote_byte; public byte[] Val_as_bry(byte[] src) {if (val_bry == null) val_bry = Bry_.Mid(src, val_bgn, val_end); return val_bry;} // NOTE: val_bry is cached public byte[] Val_as_bry__blank_to_null(byte[] src) {byte[] rv = Val_as_bry(src); return Bry_.Len_eq_0(rv) ? null : rv;} - public int Val_as_int_or(byte[] src, int or) {return val_bry == null ? Bry_.X_to_int_or_lax(src, val_bgn, val_end, or) : Bry_.X_to_int_or(val_bry, or);} + public int Val_as_int_or(byte[] src, int or) {return val_bry == null ? Bry_.Xto_int_or_lax(src, val_bgn, val_end, or) : Bry_.Xto_int_or(val_bry, or);} public boolean Val_as_bool_by_int(byte[] src) {return Val_as_int_or(src, 0) == 1;} public boolean Val_as_bool(byte[] src) {return Bry_.Eq(Bry_.Lower_ascii(Val_as_bry(src)), Bool_.True_bry);} public static Xop_xatr_itm[] Xatr_parse(Xoa_app app, Xop_xnde_atr_parser parser, Hash_adp_bry hash, Xow_wiki wiki, byte[] src, Xop_xnde_tkn xnde) { diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag.java index af3d502da..fab38af57 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag.java @@ -56,4 +56,26 @@ public class Xop_xnde_tag { public boolean Xtn_auto_close() {return xtn_auto_close;} public Xop_xnde_tag Xtn_auto_close_() {xtn_auto_close = true; return this;} private boolean xtn_auto_close; public boolean Ignore_empty() {return ignore_empty;} public Xop_xnde_tag Ignore_empty_() {ignore_empty = true; return this;} private boolean ignore_empty; public boolean Xtn_skips_template_args() {return xtn_skips_template_args;} public Xop_xnde_tag Xtn_skips_template_args_() {xtn_skips_template_args = true; return this;} private boolean xtn_skips_template_args; + public OrderedHash Langs() {return langs;} private OrderedHash langs; private Int_obj_ref langs_key; + public Xop_xnde_tag Langs_(int lang_code, String name) { + if (langs == null) { + langs = OrderedHash_.new_(); + langs_key = Int_obj_ref.neg1_(); + } + Xop_xnde_tag_lang lang_tag = new Xop_xnde_tag_lang(lang_code, name); + langs.Add(lang_tag.Lang_code(), lang_tag); + return this; + } + public Xop_xnde_tag_lang Langs_get(gplx.xowa.langs.cases.Xol_case_mgr case_mgr, int cur_lang, byte[] src, int bgn, int end) { + if (langs == null) return Xop_xnde_tag_lang._; // no langs defined; always return true; EX: + if (Bry_.Eq(name_bry, src, bgn, end)) return Xop_xnde_tag_lang._; // canonical name (name_bry) is valid in all langs; EX:
and cur_lang=de + synchronized (langs) { + langs_key.Val_(cur_lang); + } + Xop_xnde_tag_lang lang = (Xop_xnde_tag_lang)langs.Fetch(langs_key); + if (lang == null) return null; // cur tag is a lang tag, but no tag for this lang; EX: "" and cur_lang=de + return Bry_.Eq_ci_ascii(lang.Name_bry(), src, bgn, end) + ? lang + : null; + } } diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java index e49a192ba..4a36dfb05 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java @@ -133,8 +133,9 @@ public class Xop_xnde_tag_ { , Tid_xowa_html = 108 , Tid_xowa_tag_bgn = 109 , Tid_xowa_tag_end = 110 +, Tid_quiz = 111 ; - public static final int _MaxLen = 111; + public static final int _MaxLen = 112; public static final Xop_xnde_tag[] Ary = new Xop_xnde_tag[_MaxLen]; private static Xop_xnde_tag new_(int id, String name) { Xop_xnde_tag rv = new Xop_xnde_tag(id, name); @@ -217,7 +218,7 @@ public class Xop_xnde_tag_ { , Tag_hiero = new_(Tid_hiero, "hiero").Xtn_() , Tag_inputBox = new_(Tid_inputBox, "inputBox").Xtn_() , Tag_pages = new_(Tid_pages, "pages").Xtn_() -, Tag_section = new_(Tid_section, "section").Xtn_() +, Tag_section = new_(Tid_section, "section").Xtn_().Langs_(Xol_lang_itm_.Id_de, "Abschnitt").Langs_(Xol_lang_itm_.Id_he, "קטע").Langs_(Xol_lang_itm_.Id_pt, "trecho") // DATE:2014-07-18 , Tag_pagequality = new_(Tid_pagequality, "pagequality").Xtn_() , Tag_pagelist = new_(Tid_pagelist, "pagelist").Xtn_() , Tag_categoryList = new_(Tid_categoryList, "categoryList").Xtn_() @@ -253,5 +254,6 @@ public class Xop_xnde_tag_ { , Tag_xowa_html = new_(Tid_xowa_html, "xowa_html").Xtn_() , Tag_xowa_tag_bgn = new_(Tid_xowa_tag_bgn, "xtag_bgn").Xtn_() , Tag_xowa_tag_end = new_(Tid_xowa_tag_end, "xtag_end").Xtn_() +, Tag_quiz = new_(Tid_quiz, "quiz").Xtn_() ; } diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_lang.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_lang.java new file mode 100644 index 000000000..f65c43b56 --- /dev/null +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_lang.java @@ -0,0 +1,31 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa; import gplx.*; +public class Xop_xnde_tag_lang { + public Xop_xnde_tag_lang(int lang_code_int, String name_str) { + lang_code = Int_obj_ref.new_(lang_code_int); + this.name_str = name_str; + this.name_bry = Bry_.new_utf8_(name_str); + this.xtnEndTag_tmp = Bry_.Add(Xop_xnde_tag_.XtnEndTag_bgn, name_bry); + } + public Int_obj_ref Lang_code() {return lang_code;} private Int_obj_ref lang_code; + public String Name_str() {return name_str;} private String name_str; + public byte[] Name_bry() {return name_bry;} private byte[] name_bry; + public byte[] XtnEndTag_tmp() {return xtnEndTag_tmp;} private byte[] xtnEndTag_tmp; + public static final Xop_xnde_tag_lang _ = new Xop_xnde_tag_lang(-1, String_.Empty); +} diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_regy.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_regy.java index e3b9466c6..316e78d1c 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_regy.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_regy.java @@ -21,18 +21,18 @@ public class Xop_xnde_tag_regy { public Btrie_slim_mgr XndeNames(int i) { if (nild) {Init(); nild = false;} switch (i) { - case Xop_parser_.Parse_tid_tmpl: return tagRegy_tmpl; - case Xop_parser_.Parse_tid_page_tmpl: return tagRegy_wiki_tmpl; - case Xop_parser_.Parse_tid_page_wiki: return tagRegy_wiki_main; - default: return tagRegy_wiki_tmpl; //throw Err_.unhandled(i); + case Xop_parser_.Parse_tid_tmpl: return tag_regy_tmpl; + case Xop_parser_.Parse_tid_page_tmpl: return tag_regy_wiki_tmpl; + case Xop_parser_.Parse_tid_page_wiki: return tag_regy_wiki_main; + default: return tag_regy_wiki_tmpl; //throw Err_.unhandled(i); } } boolean nild = true; public void Init() { - Init_reg(tagRegy_tmpl , FilterXtns(Xop_xnde_tag_.Ary, Xop_xnde_tag_.Tag_includeonly, Xop_xnde_tag_.Tag_noinclude, Xop_xnde_tag_.Tag_onlyinclude, Xop_xnde_tag_.Tag_nowiki)); - Init_reg(tagRegy_wiki_tmpl , FilterXtns(Xop_xnde_tag_.Ary, Xop_xnde_tag_.Tag_includeonly, Xop_xnde_tag_.Tag_noinclude, Xop_xnde_tag_.Tag_onlyinclude, Xop_xnde_tag_.Tag_nowiki)); - Init_reg(tagRegy_wiki_main , Xop_xnde_tag_.Ary); + Init_reg(tag_regy_tmpl , FilterXtns(Xop_xnde_tag_.Ary, Xop_xnde_tag_.Tag_includeonly, Xop_xnde_tag_.Tag_noinclude, Xop_xnde_tag_.Tag_onlyinclude, Xop_xnde_tag_.Tag_nowiki)); + Init_reg(tag_regy_wiki_tmpl , FilterXtns(Xop_xnde_tag_.Ary, Xop_xnde_tag_.Tag_includeonly, Xop_xnde_tag_.Tag_noinclude, Xop_xnde_tag_.Tag_onlyinclude, Xop_xnde_tag_.Tag_nowiki)); + Init_reg(tag_regy_wiki_main , Xop_xnde_tag_.Ary); } - Xop_xnde_tag[] FilterXtns(Xop_xnde_tag[] ary, Xop_xnde_tag... more) { + private Xop_xnde_tag[] FilterXtns(Xop_xnde_tag[] ary, Xop_xnde_tag... more) { ListAdp rv = ListAdp_.new_(); for (Xop_xnde_tag itm : ary) if (itm.Xtn()) rv.Add(itm); @@ -40,13 +40,22 @@ public class Xop_xnde_tag_regy { rv.Add(itm); return (Xop_xnde_tag[])rv.XtoAry(Xop_xnde_tag.class); } - private void Init_reg(Btrie_slim_mgr tagRegy, Xop_xnde_tag... ary) { - for (Xop_xnde_tag tag : ary) - tagRegy.Add_obj(tag.Name_bry(), tag); + private void Init_reg(Btrie_slim_mgr tag_regy, Xop_xnde_tag... ary) { + for (Xop_xnde_tag tag : ary) { + tag_regy.Add_obj(tag.Name_bry(), tag); + OrderedHash langs = tag.Langs(); + if (langs != null) { // tag has langs; EX:
; DATE:2014-07-18 + int langs_len = langs.Count(); + for (int i = 0; i < langs_len; ++i) { // register each lang's tag; EX:"", "" + Xop_xnde_tag_lang lang = (Xop_xnde_tag_lang)langs.FetchAt(i); + tag_regy.Add_obj(lang.Name_bry(), tag); + } + } + } } private Btrie_slim_mgr - tagRegy_wiki_main = Btrie_slim_mgr.ci_ascii_() // NOTE:ci.ascii:MW_const.en; listed XML node names are en - , tagRegy_wiki_tmpl = Btrie_slim_mgr.ci_ascii_() - , tagRegy_tmpl = Btrie_slim_mgr.ci_ascii_() + tag_regy_wiki_main = Btrie_slim_mgr.ci_utf_8_() // NOTE:ci.utf8; he.s and
alias DATE:2014-07-18 + , tag_regy_wiki_tmpl = Btrie_slim_mgr.ci_utf_8_() + , tag_regy_tmpl = Btrie_slim_mgr.ci_utf_8_() ; } diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java index f4a57192d..b23fc03ad 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java @@ -63,6 +63,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { Btrie_slim_mgr tag_trie = ctx.App().Xnde_tag_regy().XndeNames(ctx.Xnde_names_tid()); Object tag_obj = tag_trie.Match_bgn_w_byte(cur_byt, src, cur_pos, src_len); // NOTE:tag_obj can be null in wiki_tmpl mode; EX: "= src_len) return ctx.Lxr_make_txt_(atrs_bgn_pos); // truncated tag; EX: "a (which is valid wikitext; NOTE: must happen after + if (ctx_cur_tid_is_tblw_atr_owner) + Xop_tblw_wkr.Atrs_close(ctx, src, root, Bool_.Y); // < found inside tblw; close off tblw attributes; EX: |- id='abcd'
(which is valid wikitext; NOTE: must happen after if (tag_is_closing) return Make_xtag_end(ctx, tkn_mkr, root, src, src_len, bgn_pos, gt_pos, tag); else - return Make_xtag_bgn(ctx, tkn_mkr, root, src, src_len, bgn_pos, gt_pos, tag, atrs_bgn_pos, src[tag_end_pos], force_xtn_for_nowiki, pre2_hack); + return Make_xtag_bgn(ctx, tkn_mkr, root, src, src_len, bgn_pos, gt_pos, name_bgn, name_end, tag, atrs_bgn_pos, src[tag_end_pos], force_xtn_for_nowiki, pre2_hack); } private static Xop_tkn_itm Make_bry_tkn(Xop_tkn_mkr tkn_mkr, byte[] src, int bgn_pos, int cur_pos) { int len = cur_pos - bgn_pos; @@ -269,7 +271,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { return end_rhs; } private boolean pre2_pending = false; - private int Make_xtag_bgn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int gtPos, Xop_xnde_tag tag, int tag_end_pos, byte tag_end_byte, boolean force_xtn_for_nowiki, boolean pre2_hack) { + private int Make_xtag_bgn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int gtPos, int name_bgn, int name_end, Xop_xnde_tag tag, int tag_end_pos, byte tag_end_byte, boolean force_xtn_for_nowiki, boolean pre2_hack) { boolean inline = false; int open_tag_end = gtPos + Launcher_app_mgr.Adj_next_char, atrs_bgn = -1, atrs_end = -1; // calc (a) inline; (b) atrs @@ -304,7 +306,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { || (force_xtn_for_nowiki && !inline) ) ) { - return Make_xnde_xtn(ctx, tkn_mkr, root, src, src_len, tag, bgn_pos, gtPos + 1, atrs_bgn, atrs_end, atrs, inline, pre2_hack); // find end tag and do not parse anything inbetween + return Make_xnde_xtn(ctx, tkn_mkr, root, src, src_len, tag, bgn_pos, gtPos + 1, name_bgn, name_end, atrs_bgn, atrs_end, atrs, inline, pre2_hack); // find end tag and do not parse anything inbetween } if (tag.Restricted()) { Xoa_page page = ctx.Cur_page(); @@ -564,7 +566,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { } } private int Find_xtn_end_tag(Xop_ctx ctx, byte[] src, int src_len, int open_end, byte[] close_bry, int tag_bgn) { - int tag_id = Bry_.X_to_int_or(src, tag_bgn, tag_bgn + 10, -1); + int tag_id = Bry_.Xto_int_or(src, tag_bgn, tag_bgn + 10, -1); if (tag_id == -1) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not extract int: page=~{0}", ctx.Cur_page().Url().Xto_full_str_safe()); return Bry_finder.Not_found;} Bry_bfr tmp = ctx.Wiki().Utl_bry_bfr_mkr().Get_b128(); tmp.Add(Pf_tag.Xtag_end_lhs).Add_int_pad_bgn(Byte_ascii.Num_0, 10, tag_id).Add(Pf_tag.Xtag_rhs); @@ -575,7 +577,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { if (rv == Bry_finder.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find <: page=~{0}", ctx.Cur_page().Url().Xto_full_str_safe()); return Bry_finder.Not_found;} return rv; } - private int Make_xnde_xtn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, Xop_xnde_tag tag, int open_bgn, int open_end, int atrs_bgn, int atrs_end, Xop_xatr_itm[] atrs, boolean inline, boolean pre2_hack) { + private int Make_xnde_xtn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, Xop_xnde_tag tag, int open_bgn, int open_end, int name_bgn, int name_end, int atrs_bgn, int atrs_end, Xop_xatr_itm[] atrs, boolean inline, boolean pre2_hack) { // NOTE: find end_tag that exactly matches bgnTag; must be case sensitive; int xnde_end = open_end; Xop_xnde_tkn xnde = null; @@ -585,6 +587,13 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { } else { byte[] close_bry = tag.XtnEndTag_tmp(); // get tmp bry (so as not to new) + if (tag.Langs() != null) { // cur tag has langs; EX:
; DATE:2014-07-18 + Xop_xnde_tag_lang tag_lang = tag.Langs_get(ctx.Lang().Case_mgr(), ctx.Cur_page().Lang().Lang_id(), src, name_bgn, name_end); + if (tag_lang == null) // tag does not match lang; EX: and lang=de; + return ctx.Lxr_make_txt_(open_end); + if (tag_lang != Xop_xnde_tag_lang._) // tag matches; note Xop_xnde_tag_lang._ is a wildcard match; EX:
+ close_bry = tag_lang.XtnEndTag_tmp(); + } int src_offset = open_bgn - 1; // open bgn to start at <; -2 to ignore b", String_.Concat_lines_nl_skip_last ( "

a<?b" diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__err_misc_tst.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__err_misc_tst.java index 794c20342..94870a8cb 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__err_misc_tst.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__err_misc_tst.java @@ -40,7 +40,7 @@ public class Xop_xnde_wkr__err_misc_tst { )); fxt.Init_para_n_(); } - @Test public void Div_should_not_pop_past_td() { // PURPOSE: extra should not close

that is outside of
a; EX.WP:Rome and Ankara + @Test public void Div_should_not_pop_past_td() { // PURPOSE: extra should not close
that is outside of
; PAGE:en.w:Rome and Ankara fxt.Init_para_y_(); fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last ( "" @@ -112,7 +112,7 @@ public class Xop_xnde_wkr__err_misc_tst { )); fxt.Init_para_n_(); } - @Test public void Xnde_pops() { // PURPOSE: somehow xnde pops upper nde; EX.WP: Greek government debt crisis; "History of government debt" + @Test public void Xnde_pops() { // PURPOSE: somehow xnde pops upper nde; PAGE:en.w:Greek government debt crisis; "History of government debt" fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last ( "" , "{|" diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__include_uncommon_tst.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__include_uncommon_tst.java index 0ab3244bb..0906a9ef3 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__include_uncommon_tst.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__include_uncommon_tst.java @@ -20,10 +20,10 @@ import org.junit.*; public class Xop_xnde_wkr__include_uncommon_tst { private Xop_fxt fxt = new Xop_fxt(); @Before public void init() {fxt.Reset();} - @Test public void Ex_Tmpl_io_oi() { // PURPOSE: not parsing internals; EX.WP: [[Template:MONTHNAME]] + @Test public void Ex_Tmpl_io_oi() { // PURPOSE: not parsing internals; PAGE:en.w:[[Template:MONTHNAME]] fxt.Test_parse_tmpl_str_test("{{#if:{{{1}}}|a|b}}c", "{{test|1}}", "a"); } - @Test public void Ex_Tmpl_io_subst() { // PURPOSE: and @gplx.Internal protected subst; EX.WP: [[Template:Dubious]] + @Test public void Ex_Tmpl_io_subst() { // PURPOSE: and @gplx.Internal protected subst; PAGE:en.w:[[Template:Dubious]] fxt.Init_defn_clear(); fxt.Init_defn_add("mwo_print", "{{{1}}}"); fxt.Init_defn_add("substcheck", "SUBST"); @@ -43,7 +43,7 @@ public class Xop_xnde_wkr__include_uncommon_tst { , "SUBST\n"); fxt.Init_defn_clear(); } - @Test public void Ex_Tmpl_noinclude_prm_1() { // PURPOSE: should not process @gplx.Internal protected tkns; EX.WP: [[Template:See]] + @Test public void Ex_Tmpl_noinclude_prm_1() { // PURPOSE: should not process @gplx.Internal protected tkns; PAGE:en.w:[[Template:See]] fxt.Init_defn_clear(); fxt.Init_defn_add("mwo_print", "{{{1}}}{{{2}}}"); fxt.Test_parse_tmpl_str_test @@ -98,7 +98,7 @@ public class Xop_xnde_wkr__include_uncommon_tst { , "abcde" ); } - @Test public void Defect_onlyinclude_inside_template() { // PURPOSE: was eating up next template; EX.WP:Wikipedia:Featured_articles + @Test public void Defect_onlyinclude_inside_template() { // PURPOSE: was eating up next template; PAGE:en.w:Wikipedia:Featured_articles fxt.Test_parse_page_all_str ( "{{formatnum: 1}} {{formatnum:2}}" , "1 2" @@ -154,7 +154,7 @@ public class Xop_xnde_wkr__include_uncommon_tst { // } // @Test public void Wiki_includeonly_ignore() {fxt.Test_parse_wiki_text("[[abc]]", "[[ac]]");} // FUTURE: ttl parses by idx, and ignores includeonly: WHEN: upon encountering; may need to redo in other parsers? - @Test public void Defect_noinclude_inside_main() { // PURPOSE: inside main was not returning content; EX.WP:Wikipedia:Featured_articles + @Test public void Defect_noinclude_inside_main() { // PURPOSE: inside main was not returning content; PAGE:en.w:Wikipedia:Featured_articles fxt.Init_defn_clear(); fxt.Init_defn_add("Test_tmpl", "{{:Test_page}}"); fxt.Data_create("Test_page", "a{{#expr:1}}c"); diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java index abc9d5538..c02ed4b47 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java @@ -38,14 +38,14 @@ public class Xop_xnde_wkr__nowiki_tst { )); fxt.Init_para_n_(); } - @Test public void H2() { // EX.WP:HTML + @Test public void H2() { // PAGE:en.w:HTML fxt.Test_parse_page_all_str ( "a

b

c" , String_.Concat_lines_nl_skip_last ( "a<h1>b<h6>c" )); } - @Test public void Lnke() { // EX.WP: Doomsday argument; [0, 1] + @Test public void Lnke() { // PAGE:en.w:Doomsday argument; [0, 1] fxt.Test_parse_page_wiki_str("a [0, 1] b", "a [0, 1] b"); // NOTE: not "0" + Byte_.XtoStr(160) + "1"; depend on browser to translate   } @Test public void Xatrs_val_text() { diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__tblx_tst.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__tblx_tst.java index 507a44d59..5cf4b6e61 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__tblx_tst.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__tblx_tst.java @@ -31,7 +31,7 @@ public class Xop_xnde_wkr__tblx_tst { , fxt.tkn_txt_ (35, 36) ); } - @Test public void Ws_bgn() { // PURPOSE: some templates return leading ws; EX.WP:UK + @Test public void Ws_bgn() { // PURPOSE: some templates return leading ws; PAGE:en.w:UK fxt.Init_para_y_(); fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last ( "
" diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__text_block_tst.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__text_block_tst.java index 996cc2cba..6b4c32bd8 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__text_block_tst.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__text_block_tst.java @@ -45,10 +45,10 @@ public class Xop_xnde_wkr__text_block_tst { )); fxt.Init_para_n_(); } - @Test public void Code_dangling() { // EX.WP: HTML; <i> and <center> tags. There are + @Test public void Code_dangling() { // PAGE:en.w:HTML; <i> and <center> tags. There are fxt.Test_parse_page_wiki_str("abc", "abc"); } - @Test public void Code_do_not_escape() { // PURPOSE: was mistakenly marked as escape, causing inner tags to be rendered incorrectly; EX.WP:UTF8 + @Test public void Code_do_not_escape() { // PURPOSE: was mistakenly marked as escape, causing inner tags to be rendered incorrectly; PAGE:en.w:UTF8 fxt.Test_parse_page_all_str ( "0100100" , "0100100" @@ -61,7 +61,7 @@ public class Xop_xnde_wkr__text_block_tst { fxt.Test_parse_page_all_str("
a	b
" , "
a	b
"); // known ncr/hex fxt.Test_parse_page_all_str("
a'b
" , "
a'b
"); // known name; embed fxt.Test_parse_page_all_str("
a&apox;b
" , "
a&apox;b
"); // unknown name; escape - fxt.Test_parse_page_all_str("
&\"<>
" , "
&"<>
"); // no ncr or name; escape; needed for
; EX.WP: Alt attribute + fxt.Test_parse_page_all_str("
&\"<>
" , "
&"<>
"); // no ncr or name; escape; needed for
; PAGE:en.w:Alt attribute } @Test public void Pre_and_space() {// PURPOSE: make sure pre does not careate

around it; also, make sure " a" is preserved; DATE:2014-02-20 fxt.Init_para_y_(); diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__xatrs_tst.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__xatrs_tst.java index 661d8bd7c..7eaffd8ee 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__xatrs_tst.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__xatrs_tst.java @@ -45,7 +45,7 @@ public class Xop_xnde_wkr__xatrs_tst { fxt.Test_parse_page_wiki_str("", ""); // NOTE: do not call parse_page_all_str which will call Page.Clear and reset Restricted fxt.Page().Html_data().Restricted_y_(); } -// @Test public void Unclosed() { // PURPOSE: unclosed atr should be treated as key, which should be ignored; EX.WP:Palace of Versailles +// @Test public void Unclosed() { // PURPOSE: unclosed atr should be treated as key, which should be ignored; PAGE:en.w:Palace of Versailles // fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last // ( "a" // id="1� -> key named 'id="1�' which fails whitelist keys // , "" diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_wkr.java b/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_wkr.java index 4c8493ec5..a5372335c 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_wkr.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xop_curly_wkr.java @@ -67,7 +67,7 @@ public class Xop_curly_wkr implements Xop_ctx_wkr { int curly_end_dash = lxr_end_pos; if (curly_end_dash < src_len && src[curly_end_dash] == Byte_ascii.Dash) { // "-" exists after curlies; EX: "}}-" if (bgn_tkn_len > 2 && end_tkn_len > 2) { // more than 3 curlies at bgn / end with flanking dashes; EX: "-{{{ }}}-"; NOTE: 3 is needed b/c 2 will never be reduced; EX: "-{{" will always be "-" and "{{", not "-{" and "{" - int numeric_val = Bry_.X_to_int_or(src, bgn_tkn.Src_end(), lxr_bgn_pos, -1); + int numeric_val = Bry_.Xto_int_or(src, bgn_tkn.Src_end(), lxr_bgn_pos, -1); if ( numeric_val != -1 // do not apply if numeric val; EX:"-{{{0}}}-" vs "-{{{#expr:0}}}-" sr.w:Template:Link_FA && bgn_tkn_len == 3 && end_tkn_len == 3 // exactly 3 tokens; assume param token; "-{{{" -> "-" + "{{{" x> -> "-{" + "{{"; if unbalanced (3,4 or 4,3) fall into code below ) { diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xop_subst_tst.java b/400_xowa/src_500_tmpl/gplx/xowa/Xop_subst_tst.java index d48f085ff..b25975a79 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xop_subst_tst.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xop_subst_tst.java @@ -37,7 +37,7 @@ public class Xop_subst_tst { @Test public void Tmpl_txt_subst_pf() {fxt.Test_parse_tmpl_str_test("{{subst:#expr:0}}" , "{{test}}" , "0");} @Test public void Tmpl_txt_safesubst_prm() {fxt.Test_parse_tmpl_str_test("{{{{{|safesubst:}}}#if:{{{1|}}}{{{{{|safesubst:}}}!}}c1|c2}}" , "{{test}}" , "c2");} @Test public void Exc_tmpl_prm_safesubst_ns() {fxt.Test_parse_tmpl_str_test("{{{{{|safesubst}}}:NAMESPACE}}" , "{{test}}" , "");} - @Test public void Unreferenced() { // PURPOSE: if subst, but in tmpl stage, do not actually subst; EX.WP:Unreferenced; DATE:2013-01-31 + @Test public void Unreferenced() { // PURPOSE: if subst, but in tmpl stage, do not actually subst; PAGE:en.w:Unreferenced; DATE:2013-01-31 fxt.Init_defn_clear(); fxt.Init_defn_add("substcheck", "SUBST"); fxt.Init_defn_add("ifsubst", String_.Concat_lines_nl diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl_.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl_.java index 465b44395..5ceaf080e 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl_.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl_.java @@ -47,7 +47,7 @@ public class Xot_defn_tmpl_ { for (int i = 0; i < subs_len; i++) orig.Subs_get(i).Tmpl_evaluate(ctx, src, caller, arg_bfr); Arg_itm_tkn rv = tkn_mkr.ArgItm(-1, -1); // NOTE: was -1, 0; DATE:2013-04-10 - byte[] rv_ary = orig_arg.KeyTkn_exists() && val_tkn ? arg_bfr.XtoAryAndClearAndTrim() : arg_bfr.XtoAryAndClear(); // // NOTE: must trim if key_exists; DUPE:TRIM_IF_KEY; EX.WP:Coord in Chernobyl disaster, Sahara + byte[] rv_ary = orig_arg.KeyTkn_exists() && val_tkn ? arg_bfr.XtoAryAndClearAndTrim() : arg_bfr.XtoAryAndClear(); // // NOTE: must trim if key_exists; DUPE:TRIM_IF_KEY; PAGE:en.w:Coord in Chernobyl disaster, Sahara rv.Dat_ary_(rv_ary); return rv; } diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_examples_tst.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_examples_tst.java index 3b8254301..441870368 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_examples_tst.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_examples_tst.java @@ -36,7 +36,7 @@ public class Xot_examples_tst { @Test public void About() { Init_tmpl_about(); fxt.Test_parse_tmpl_str("{{About|abc}}", "This article is about abc. For other uses, see [[Test page (disambiguation)]]."); } - @Test public void About_2() { // EX.WP: {{About|the NASA space mission||Messenger (disambiguation)}} + @Test public void About_2() { // PAGE:en.w:{{About|the NASA space mission||Messenger (disambiguation)}} Init_tmpl_about(); fxt.Test_parse_tmpl_str("{{About|a||b{{!}}c}}", "This article is about a. For other uses, see [[b|c]]."); } @Test public void OtherUses() { diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_mock.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_mock.java index 6b4ef659b..b8c951390 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_mock.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_mock.java @@ -36,7 +36,7 @@ public class Xot_invk_mock implements Xot_invk { 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); if (nde.KeyTkn_exists()) { - int key_int = Bry_.X_to_int_or(nde.Key_tkn().Dat_ary(), -1); + int key_int = Bry_.Xto_int_or(nde.Key_tkn().Dat_ary(), -1); if (key_int == -1) continue; else { // key is numeric @@ -55,7 +55,8 @@ public class Xot_invk_mock implements Xot_invk { } public Arg_nde_tkn Args_get_by_key(byte[] src, byte[] key) {return (Arg_nde_tkn)args.Fetch(key);} public static Xot_invk_mock new_(byte defn_tid, KeyVal... args) {return new_(defn_tid, 1, args);} - public static Xot_invk_mock new_(KeyVal... args) {return new_(Xot_defn_.Tid_null, 1, args);} + public static Xot_invk_mock new_(KeyVal... args) {return new_(Xot_defn_.Tid_null, 1, args);} + public static Xot_invk_mock test_(KeyVal... args) {return new_(Xot_defn_.Tid_null, 0, args);} // public static Xot_invk_mock new_(byte defn_tid, int idx_adj, params KeyVal[] args) { // Xot_invk_mock rv = new Xot_invk_mock(defn_tid, idx_adj); // int len = args.length; diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_temp.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_temp.java index 6bc83bfa9..b99c11137 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_temp.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_temp.java @@ -16,14 +16,15 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; +import gplx.xowa.xtns.scribunto.*; public class Xot_invk_temp implements Xot_invk { + 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) { this.defn_tid = defn_tid; this.src = src; this.name_tkn = name_tkn; this.src_bgn = src_bgn; this.src_end = src_end; } public byte[] Src() {return src;} private byte[] src; public Xot_invk_temp Src_(byte[] src) {this.src = src; return this;} public byte Defn_tid() {return defn_tid;} private byte defn_tid = Xot_defn_.Tid_null; - public Xot_invk_temp(boolean root_frame) {this.root_frame = root_frame;} public boolean Root_frame() {return root_frame;} private boolean root_frame; public Arg_nde_tkn Name_tkn() {return name_tkn;} Arg_nde_tkn name_tkn; public byte[] Frame_ttl() {return frame_ttl;} public void Frame_ttl_(byte[] v) {frame_ttl = v;} private byte[] frame_ttl = Bry_.Empty; // NOTE: set frame_ttl to non-null value; PAGE:en.w:Constantine_the_Great {{Christianity}}; DATE:2014-06-26 @@ -38,7 +39,7 @@ public class Xot_invk_temp implements Xot_invk { 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)list.FetchAt(i); if (nde.KeyTkn_exists()) { - int key_int = Bry_.X_to_int_or(nde.Key_tkn().Dat_ary(), -1); + int key_int = Bry_.Xto_int_or(nde.Key_tkn().Dat_ary(), -1); if (key_int == -1) continue; else { // key is numeric @@ -65,7 +66,7 @@ public class Xot_invk_temp implements Xot_invk { hash.Del(key_ref); hash.Add(key_ref, arg); } HashAdp hash = HashAdp_.new_(); - public static final Xot_invk_temp PageIsCaller = new Xot_invk_temp(true); // SEE NOTE_2 + public static final Xot_invk_temp Page_is_caller = new Xot_invk_temp(true); // SEE NOTE_2 Xot_invk_temp() {} } /* @@ -83,6 +84,6 @@ WIKI: "a {{mwo_concat|{{{1}}}|b}} c" TEXT: "a {{{1}}}b c" Note that in order to resolve mwo_concat we need to pass in an Xot_invk -This Xot_invk is the "PageIsCaller" ref +This Xot_invk is the "Page_is_caller" ref Note this has no parameters and is always empty */ diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java index 21d64f316..669b559e8 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa; import gplx.*; import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.langs.cnvs.*; -import gplx.xowa.wikis.caches.*; import gplx.xowa.xtns.scribunto.*; +import gplx.xowa.wikis.caches.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.pfuncs.ttls.*; public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk { public boolean Root_frame() {return false;} public Arg_nde_tkn Name_tkn() {return name_tkn;} public Xot_invk_tkn Name_tkn_(Arg_nde_tkn v) {name_tkn = v; return this;} Arg_nde_tkn name_tkn = Arg_nde_tkn.Null; @@ -179,7 +179,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk { } defn = wiki.Cache_mgr().Defn_cache().Get_by_key(name_ary); if (defn == null) { - if (name_ary_len != 0 ) { // name_ary_len != 0 for direct template inclusions; EX.WP:Human evolution and {{:Human evolution/Species chart}}; && ctx.Tmpl_whitelist().Has(name_ary) + if (name_ary_len != 0 ) { // name_ary_len != 0 for direct template inclusions; PAGE:en.w:Human evolution and {{:Human evolution/Species chart}}; && ctx.Tmpl_whitelist().Has(name_ary) Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.Add(wiki.Ns_mgr().Ns_template().Name_db_w_colon(), name_ary)); if (ttl == null) { // ttl is not valid; just output orig; REF.MW:Parser.php|braceSubstitution|if ( !$found ) $text = $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args ); byte[] missing_ttl @@ -225,9 +225,9 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk { ignore_hash.Add_str_obj("Clarify{{subst", String_.Empty); } if (ignore_hash.Get_by_bry(name_ary) == null) { - if (Pf_xtn_rel2abs.Rel2abs_ttl(name_ary, name_bgn, name_ary_len)) {// rel_path; EX: {{/../Peer page}}; DATE:2013-03-27 + if (Pfunc_rel2abs.Rel2abs_ttl(name_ary, name_bgn, name_ary_len)) {// rel_path; EX: {{/../Peer page}}; DATE:2013-03-27 Bry_bfr tmp_bfr = ctx.App().Utl_bry_bfr_mkr().Get_b512(); - name_ary = Pf_xtn_rel2abs.Rel2abs(tmp_bfr, Bry_.Mid(name_ary, name_bgn, name_ary_len), ctx.Cur_page().Ttl().Raw()); + name_ary = Pfunc_rel2abs.Rel2abs(tmp_bfr, Bry_.Mid(name_ary, name_bgn, name_ary_len), ctx.Cur_page().Ttl().Raw()); tmp_bfr.Mkr_rls(); return SubEval(ctx, wiki, bfr, name_ary, caller, src); } diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr.java index c1aef57f3..3d6b93fae 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr.java @@ -71,7 +71,7 @@ public class Xot_invk_wkr implements Xop_ctx_wkr, Xop_arg_wkr { case Xot_defn_.Tid_safesubst: int subst_bgn = finder.Subst_bgn(), subst_end = finder.Subst_end(); invk.Tmpl_subst_props_(finder_typeId, subst_bgn, subst_end); - if ((ctx.Parse_tid() == Xop_parser_.Parse_tid_tmpl && finder_typeId == Xot_defn_.Tid_subst) // NOTE: if subst, but in tmpl stage, do not actually subst; EX.WP:Unreferenced; DATE:2013-01-31 + if ((ctx.Parse_tid() == Xop_parser_.Parse_tid_tmpl && finder_typeId == Xot_defn_.Tid_subst) // NOTE: if subst, but in tmpl stage, do not actually subst; PAGE:en.w:Unreferenced; DATE:2013-01-31 || ctx.Cur_page().Ttl().Ns().Id_tmpl()) { // also, if on tmpl page, never evaluate (questionable, but seems to be needed) } else diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_basic_tst.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_basic_tst.java index 380712860..f6da37c2f 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_basic_tst.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_basic_tst.java @@ -243,7 +243,7 @@ public class Xot_invk_wkr_basic_tst { fxt.Test_parse_tmpl_str("{{test_1| a }}", "a"); fxt.Init_defn_clear(); } - @Test public void Ws_trimmed_key_2() { // PURPOSE: trim prm; note that 1 is key not idx; EX.WP:Coord in Chernobyl disaster, Sahara + @Test public void Ws_trimmed_key_2() { // PURPOSE: trim prm; note that 1 is key not idx; PAGE:en.w:Coord in Chernobyl disaster, Sahara fxt.Init_defn_clear(); fxt.Init_defn_add("test_1", "{{test_2|1={{{1}}}}}"); fxt.Init_defn_add("test_2", "{{{1}}}"); @@ -265,7 +265,7 @@ public class Xot_invk_wkr_basic_tst { fxt.Test_parse_tmpl_str("{{test_1|a}}", "a"); fxt.Init_defn_clear(); } - @Test public void Keyd_arg_is_trimmed() { // PURPOSE: trim entire arg only, not individual prm; EX.WP: William Shakespeare; {{Relatebardtree}} + @Test public void Keyd_arg_is_trimmed() { // PURPOSE: trim entire arg only, not individual prm; PAGE:en.w:William Shakespeare; {{Relatebardtree}} fxt.Init_defn_clear(); fxt.Init_defn_add("test_1", "{{test_2|1={{{{{{1}}}}}}}}"); fxt.Init_defn_add("test_2", "{{{1}}}"); @@ -278,7 +278,7 @@ public class Xot_invk_wkr_basic_tst { fxt.Test_parse_tmpl_str("{{test_1| }}", "(? [[dynamic is blank]] ?)"); fxt.Init_defn_clear(); } - @Test public void Xnde_xtn_ref_not_arg() { // PURPOSE: }}; arg1 is a not "b"; EX.WP: WWI + @Test public void Xnde_xtn_ref_not_arg() { // PURPOSE: }}; arg1 is a not "b"; PAGE:en.w:WWI fxt.Init_defn_clear(); fxt.Init_defn_add("test_1", "{{{1}}}"); fxt.Test_parse_page_tmpl_str("{{test_1|a}}", "a"); @@ -426,5 +426,5 @@ Template:Test with text of "#a" a) "a{{test}}" would return "a\n#a" b/c of rule for auto-adding \n b) bug was that "{{test}}" would return "#a" b/c "#a" was at bos which would expand to list later however, needs to be "\n#a" b/c appended to other strings wherein bos would be irrelevant. -Actual situation was very complicated. EX.WP:Rome +Actual situation was very complicated. PAGE:en.w:Rome */ diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_prepend_nl_tst.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_prepend_nl_tst.java index 0d6145616..574c54f09 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_prepend_nl_tst.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_wkr_prepend_nl_tst.java @@ -48,10 +48,10 @@ public class Xot_invk_wkr_prepend_nl_tst { )); fxt.Init_defn_clear(); } - @Test public void Pfunc() {// PURPOSE: if {| : ; # *, auto add new_line; parser_function variant; EX.WP:Soviet Union; Infobox former country + @Test public void Pfunc() {// PURPOSE: if {| : ; # *, auto add new_line; parser_function variant; PAGE:en.w:Soviet Union; Infobox former country fxt.Test_parse_tmpl_str_test("" , "z {{#if:true|#a|n}}" , "z \n#a"); } - @Test public void Bos() { // PURPOSE: function should expand "*a" to "\n*a" even if "*a" is bos; SEE:NOTE_1 EX.WP: Rome and Panoramas; + @Test public void Bos() { // PURPOSE: function should expand "*a" to "\n*a" even if "*a" is bos; SEE:NOTE_1 PAGE:en.w:Rome and Panoramas; fxt.Test_parse_page_tmpl_str("{{#if:x|*a}}", "\n*a"); } @Test public void Tmpl_arg() { // PURPOSE: tmpl arg should auto-create? diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_prm_tkn.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_prm_tkn.java index 8ad97e818..affdb2c2a 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_prm_tkn.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_prm_tkn.java @@ -34,7 +34,7 @@ public class Xot_prm_tkn extends Xop_tkn_itm_base { if (find_tkn_static) { // subs_are_static, so extract idx/key; EX: {{{a b}}} will have 3 subs which are all static; {{{a{{{1}}}b}}} will be dynamic int find_tkn_bgn = find_tkn.Dat_bgn(), find_tkn_end = find_tkn.Dat_end(); if (find_tkn_end - find_tkn_bgn > 0) { // NOTE: handles empty find_tkns; EX: {{{|safesubst:}}} - prm_idx = Bry_.X_to_int_or(src, find_tkn_bgn, find_tkn_end, -1); // parse as number first; note that bgn,end should not include ws; EX: " 1 " will fail + prm_idx = Bry_.Xto_int_or(src, find_tkn_bgn, find_tkn_end, -1); // parse as number first; note that bgn,end should not include ws; EX: " 1 " will fail if (prm_idx == -1) prm_key = Bry_.Mid(src, find_tkn_bgn, find_tkn_end);// not a number; parse as key } } @@ -47,9 +47,9 @@ public class Xot_prm_tkn extends Xop_tkn_itm_base { Bry_bfr find_bfr = Bry_bfr.new_(); for (int i = 0; i < subs_len; i++) find_tkn.Subs_get(i).Tmpl_evaluate(ctx, src, caller, find_bfr); - prm_idx = Bry_.X_to_int_or_trim(find_bfr.Bfr(), 0, find_bfr.Len(), -1); // parse as number first; NOTE: trim needed to transform "{{{ 1 }}}" to "1"; it.w:Portale:Giochi_da_tavolo; DATE:2014-02-09 + prm_idx = Bry_.Xto_int_or_trim(find_bfr.Bfr(), 0, find_bfr.Len(), -1); // parse as number first; NOTE: trim needed to transform "{{{ 1 }}}" to "1"; it.w:Portale:Giochi_da_tavolo; DATE:2014-02-09 if (prm_idx == -1) - prm_key = find_bfr.XtoAryAndClearAndTrim(); // not a number; parse as key; NOTE: must trim; EX.WP: William Shakespeare; {{Relatebardtree}} + prm_key = find_bfr.XtoAryAndClearAndTrim(); // not a number; parse as key; NOTE: must trim; PAGE:en.w:William Shakespeare; {{Relatebardtree}} } Arg_nde_tkn arg_nde = null; if (prm_idx == -1) { // prm is key; EX: "{{{key1}}}" diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_tmpl_wtr.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_tmpl_wtr.java index 32df28a82..8c36feadc 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_tmpl_wtr.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_tmpl_wtr.java @@ -53,7 +53,7 @@ public class Xot_tmpl_wtr { // NOTE: originally "if (ctx.Parse_tid() == Xop_parser_.Parse_tid_page_tmpl) {" but if not needed; Xot_tmpl_wtr should not be called for tmpls and should not make it to page_wiki Bry_bfr tmp_bfr = Bry_bfr.new_(); ctx.Only_include_evaluate_(true); - xnde.Tmpl_evaluate(ctx, src, Xot_invk_temp.PageIsCaller, tmp_bfr); + xnde.Tmpl_evaluate(ctx, src, Xot_invk_temp.Page_is_caller, tmp_bfr); ctx.Only_include_evaluate_(false); rslt_bfr.Add_bfr_and_preserve(tmp_bfr); break; @@ -85,7 +85,7 @@ public class Xot_tmpl_wtr { rslt_bfr.Add_mid(src, tkn.Src_bgn(), tkn.Src_end()); break; // write src from bgn/end case Xop_tkn_itm_.Tid_ignore: break; // hide comments and <*include*> ndes case Xop_tkn_itm_.Tid_tmpl_prm: - tkn.Tmpl_evaluate(ctx, src, Xot_invk_temp.PageIsCaller.Src_(src), rslt_bfr); + tkn.Tmpl_evaluate(ctx, src, Xot_invk_temp.Page_is_caller.Src_(src), rslt_bfr); break; case Xop_tkn_itm_.Tid_tvar: gplx.xowa.xtns.translates.Xop_tvar_tkn tvar_tkn = (gplx.xowa.xtns.translates.Xop_tvar_tkn)tkn; @@ -93,7 +93,7 @@ public class Xot_tmpl_wtr { break; case Xop_tkn_itm_.Tid_tmpl_invk: try { - tkn.Tmpl_evaluate(ctx, src, Xot_invk_temp.PageIsCaller.Src_(src), rslt_bfr); + 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); diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_func_.java b/400_xowa/src_510_pf_core/gplx/xowa/Pf_func_.java index a28aa2699..63cd23596 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_func_.java +++ b/400_xowa/src_510_pf_core/gplx/xowa/Pf_func_.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.xtns.pfuncs.times.*; import gplx.xowa.xtns.pfuncs.numbers.*; +import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.xtns.pfuncs.times.*; import gplx.xowa.xtns.pfuncs.numbers.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.xtns.pfuncs.langs.*; import gplx.xowa.xtns.pfuncs.strings.*; public class Pf_func_ { public static byte[] Eval_arg_or_empty(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, int self_args_len, int i) {return Eval_arg_or(ctx, src, caller, self, self_args_len, i, Bry_.Empty);} public static final byte Name_dlm = Byte_ascii.Colon; @@ -295,30 +295,30 @@ public class Pf_func_ { case Xol_kwd_grp_.Id_noeditsection: return Pf_page_noeditsection._; case Xol_kwd_grp_.Id_site_pagesincategory: return Pf_site_pagesincategory._; - case Xol_kwd_grp_.Id_url_ns: return new Pf_url_ns(false); - case Xol_kwd_grp_.Id_url_nse: return new Pf_url_ns(true); - case Xol_kwd_grp_.Id_url_urlencode: return new Pf_url_urlencode(); - case Xol_kwd_grp_.Id_str_lc: return new Pf_str_case(Xol_lang.Tid_lower, false); - case Xol_kwd_grp_.Id_str_lcfirst: return new Pf_str_case(Xol_lang.Tid_lower, true); - case Xol_kwd_grp_.Id_str_uc: return new Pf_str_case(Xol_lang.Tid_upper, false); - case Xol_kwd_grp_.Id_str_ucfirst: return new Pf_str_case(Xol_lang.Tid_upper, true); - case Xol_kwd_grp_.Id_str_padleft: return new Pf_str_pad(Xol_kwd_grp_.Id_str_padleft, false); - case Xol_kwd_grp_.Id_str_padright: return new Pf_str_pad(Xol_kwd_grp_.Id_str_padright, true); + case Xol_kwd_grp_.Id_url_ns: return new Pfunc_ns(false); + case Xol_kwd_grp_.Id_url_nse: return new Pfunc_ns(true); + case Xol_kwd_grp_.Id_url_urlencode: return new Pfunc_urlencode(); + case Xol_kwd_grp_.Id_str_lc: return new Pfunc_case(Xol_lang.Tid_lower, false); + case Xol_kwd_grp_.Id_str_lcfirst: return new Pfunc_case(Xol_lang.Tid_lower, true); + case Xol_kwd_grp_.Id_str_uc: return new Pfunc_case(Xol_lang.Tid_upper, false); + case Xol_kwd_grp_.Id_str_ucfirst: return new Pfunc_case(Xol_lang.Tid_upper, true); + case Xol_kwd_grp_.Id_str_padleft: return new Pfunc_pad(Xol_kwd_grp_.Id_str_padleft, false); + case Xol_kwd_grp_.Id_str_padright: return new Pfunc_pad(Xol_kwd_grp_.Id_str_padright, true); case Xol_kwd_grp_.Id_str_formatnum: return new Pf_formatnum(); case Xol_kwd_grp_.Id_str_formatdate: return new Pft_func_formatdate(); - case Xol_kwd_grp_.Id_url_localurl: return new Pf_url_urlfunc(Xol_kwd_grp_.Id_url_localurl, Pf_url_urlfunc.Tid_local, false); - case Xol_kwd_grp_.Id_url_localurle: return new Pf_url_urlfunc(Xol_kwd_grp_.Id_url_localurle, Pf_url_urlfunc.Tid_local, true); - case Xol_kwd_grp_.Id_url_fullurl: return new Pf_url_urlfunc(Xol_kwd_grp_.Id_url_fullurl, Pf_url_urlfunc.Tid_full, false); - case Xol_kwd_grp_.Id_url_fullurle: return new Pf_url_urlfunc(Xol_kwd_grp_.Id_url_fullurle, Pf_url_urlfunc.Tid_full, true); - case Xol_kwd_grp_.Id_url_canonicalurl: return new Pf_url_urlfunc(Xol_kwd_grp_.Id_url_canonicalurl, Pf_url_urlfunc.Tid_canonical, false); - case Xol_kwd_grp_.Id_url_canonicalurle: return new Pf_url_urlfunc(Xol_kwd_grp_.Id_url_canonicalurle, Pf_url_urlfunc.Tid_canonical, false); - case Xol_kwd_grp_.Id_url_filepath: return new Pf_url_filepath(); - case Xol_kwd_grp_.Id_url_anchorencode: return new Pf_url_anchorencode(); + case Xol_kwd_grp_.Id_url_localurl: return new Pfunc_urlfunc(Xol_kwd_grp_.Id_url_localurl, Pfunc_urlfunc.Tid_local, false); + case Xol_kwd_grp_.Id_url_localurle: return new Pfunc_urlfunc(Xol_kwd_grp_.Id_url_localurle, Pfunc_urlfunc.Tid_local, true); + case Xol_kwd_grp_.Id_url_fullurl: return new Pfunc_urlfunc(Xol_kwd_grp_.Id_url_fullurl, Pfunc_urlfunc.Tid_full, false); + case Xol_kwd_grp_.Id_url_fullurle: return new Pfunc_urlfunc(Xol_kwd_grp_.Id_url_fullurle, Pfunc_urlfunc.Tid_full, true); + case Xol_kwd_grp_.Id_url_canonicalurl: return new Pfunc_urlfunc(Xol_kwd_grp_.Id_url_canonicalurl, Pfunc_urlfunc.Tid_canonical, false); + case Xol_kwd_grp_.Id_url_canonicalurle: return new Pfunc_urlfunc(Xol_kwd_grp_.Id_url_canonicalurle, Pfunc_urlfunc.Tid_canonical, false); + case Xol_kwd_grp_.Id_url_filepath: return new Pfunc_filepath(); + case Xol_kwd_grp_.Id_url_anchorencode: return new Pfunc_anchorencode(); - case Xol_kwd_grp_.Id_i18n_plural: return new Pf_intl_plural(); - case Xol_kwd_grp_.Id_i18n_language: return new Pf_intl_language(); - case Xol_kwd_grp_.Id_i18n_int: return new Pf_intl_int(); - case Xol_kwd_grp_.Id_i18n_grammar: return new Pf_intl_grammar(); + case Xol_kwd_grp_.Id_i18n_plural: return new Pfunc_plural(); + case Xol_kwd_grp_.Id_i18n_language: return new Pfunc_language(); + case Xol_kwd_grp_.Id_i18n_int: return new Pfunc_int(); + case Xol_kwd_grp_.Id_i18n_grammar: return new Pfunc_grammar(); case Xol_kwd_grp_.Id_misc_tag: return new Pf_tag(); case Xol_kwd_grp_.Id_xtn_expr: return new gplx.xowa.xtns.pfuncs.exprs.Pfunc_expr(); @@ -327,11 +327,11 @@ public class Pf_func_ { case Xol_kwd_grp_.Id_xtn_iferror: return new Pfunc_iferror(); case Xol_kwd_grp_.Id_xtn_ifexpr: return new Pfunc_ifexpr(); case Xol_kwd_grp_.Id_xtn_ifexist: return new Pfunc_ifexist(); - case Xol_kwd_grp_.Id_xtn_rel2abs: return new Pf_xtn_rel2abs(); + case Xol_kwd_grp_.Id_xtn_rel2abs: return new Pfunc_rel2abs(); case Xol_kwd_grp_.Id_xtn_switch: return new Pfunc_switch(); case Xol_kwd_grp_.Id_xtn_time: return Pft_func_time._Utc; case Xol_kwd_grp_.Id_xtn_timel: return Pft_func_time._Lcl; - case Xol_kwd_grp_.Id_xtn_titleparts: return new Pf_xtn_titleparts(); + case Xol_kwd_grp_.Id_xtn_titleparts: return new Pfunc_titleparts(); case Xol_kwd_grp_.Id_subst: case Xol_kwd_grp_.Id_safesubst: diff --git a/400_xowa/src_530_pf_str/gplx/xowa/Pf_tag.java b/400_xowa/src_510_pf_core/gplx/xowa/Pf_tag.java similarity index 97% rename from 400_xowa/src_530_pf_str/gplx/xowa/Pf_tag.java rename to 400_xowa/src_510_pf_core/gplx/xowa/Pf_tag.java index 10f7c0b91..d73de80e0 100644 --- a/400_xowa/src_530_pf_str/gplx/xowa/Pf_tag.java +++ b/400_xowa/src_510_pf_core/gplx/xowa/Pf_tag.java @@ -92,6 +92,7 @@ class Pf_tag_kv_bldr { } } private static void ParseKeyVal(byte[] src, Pf_tag_kv_bldr kv_bldr) { + kv_bldr.Clear(); // do not forget to clear; DATE:2014-07-20 int itm_bgn = -1, itm_end = -1, src_len = src.length; boolean mode_is_key = true; for (int i = 0; i < src_len; i++) { diff --git a/400_xowa/src_530_pf_str/gplx/xowa/Pf_tag_tst.java b/400_xowa/src_510_pf_core/gplx/xowa/Pf_tag_tst.java similarity index 100% rename from 400_xowa/src_530_pf_str/gplx/xowa/Pf_tag_tst.java rename to 400_xowa/src_510_pf_core/gplx/xowa/Pf_tag_tst.java diff --git a/400_xowa/src_530_pf_str/gplx/xowa/Pf_str_pad_tst.java b/400_xowa/src_530_pf_str/gplx/xowa/Pf_str_pad_tst.java deleted file mode 100644 index 5b224c0b8..000000000 --- a/400_xowa/src_530_pf_str/gplx/xowa/Pf_str_pad_tst.java +++ /dev/null @@ -1,36 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa; import gplx.*; -import org.junit.*; -public class Pf_str_pad_tst { - private Xop_fxt fxt = new Xop_fxt(); - @Before public void init() {fxt.Reset();} - @Test public void L_len_3() {fxt.Test_parse_tmpl_str_test("{{padleft: a|4|0}}" , "{{test}}" , "000a");} - @Test public void L_str_ab() {fxt.Test_parse_tmpl_str_test("{{padleft: a|4|01}}" , "{{test}}" , "010a");} - @Test public void L_len_neg1() {fxt.Test_parse_tmpl_str_test("{{padleft: a|-1|01}}" , "{{test}}" , "a");} - @Test public void L_val_null() {fxt.Test_parse_tmpl_str_test("{{padleft: |4|0}}" , "{{test}}" , "0000");} - @Test public void L_word_3() {fxt.Test_parse_tmpl_str_test("{{padleft: abc|4}}" , "{{test}}" , "0abc");} - @Test public void L_exc_len_bad1() {fxt.Test_parse_tmpl_str_test("{{padleft:a|bad|01}}" , "{{test}}" , "a");} - @Test public void L_exc_pad_ws() {fxt.Test_parse_tmpl_str_test("{{padleft:a|4|\n \t}}" , "{{test}}" , "a");} - @Test public void R_len_3() {fxt.Test_parse_tmpl_str_test("{{padright:a|4|0}}" , "{{test}}" , "a000");} - @Test public void R_str_ab() {fxt.Test_parse_tmpl_str_test("{{padright:a|4|01}}" , "{{test}}" , "a010");} - @Test public void R_str_intl() {fxt.Test_parse_tmpl_str_test("{{padright:|6|devanā}}" , "{{test}}" , "devanā");} -} -/* -{{padleft: a|4|0}} -*/ \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index b9bf4685e..000000000 --- a/README.md +++ /dev/null @@ -1,23 +0,0 @@ -## xowa: the xowa offline wiki application - -### Summary -XOWA is an application for reading Wikipedia and other wikis offline. - -### Environment -The xowa_source was built with Eclipse Indigo on Windows. For simplicity's sake, the remainder of these instructions will target Windows machines. There are no OS dependencies, so the same instructions apply to other OS's, except the paths will need to be updated. - -There are no explicit dependencies on Eclipse, so the source code should be usable in other Java IDEs. - -## Instructions -* Download '''xowa_app_windows_*''' from https://sourceforge.net/projects/xowa/files/ and unzip to the proper directory. The following will be required: - * All files under C:\xowa\user\anonymous\ - * The main cfg file: C:\xowa\xowa.gfs - * The swt.jar at C:\xowa\bin\wnt\swt\swt.jar -* Download the xowa repo -* Unzip it to C:\xowa\dev\. You will have a folder called C:\xowa\dev\400_xowa\ as well as many others. -* Move the swt.jar from C:\xowa\bin\wnt\swt\swt.jar to C:\xowa\dev\150_gfui\lib\swt\swt.jar -* Launch Eclipse. Choose a workbench folder of C:\xowa\dev -* Select all four projects. Do File -> Refresh. -* Right-click on 400_xowa in the Package Explorer. Select Debug As -> Java Application. Select Xowa_main. XOWA should launch. -* Right-click on 400_xowa in the Package Explorer. Select Debug As -> JUnit Test. All tests should pass. - diff --git a/license.txt b/license.txt deleted file mode 100644 index ac7daeeb4..000000000 --- a/license.txt +++ /dev/null @@ -1,624 +0,0 @@ -/*************************************************************************** - XOWA: the XOWA Offline Wiki Application - Copyright (C) 2012 gnosygnu@gmail.com -****************************************************************************/ - - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.002.sqlite3 b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.002.sqlite3 index 6a5219a3a..76428128a 100644 Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.002.sqlite3 and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.002.sqlite3 differ